ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjU2ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbXBhcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMWU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5jb21wYXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpmYWNlLnRleHQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5pZGU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTczNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNUdWUgTm92IDMwIDE1OjUxOjQ3IENFVCAyMDA0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA0NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLmNvbXBhcmUuamFyID0gY29tcGFyZS8KLWJpbi5pbmNsdWRlcyA9IGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2J1aWxkbm90ZXNfY29tcGFyZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2J1aWxkbm90ZXNfY29tcGFyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBhYTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9idWlsZG5vdGVzX2NvbXBhcmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luTlQ7IFUpIFtOZXRzY2FwZV0iPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPHRpdGxlPkVjbGlwc2UgUGxhdGZvcm0gUmVsZWFzZSBOb3RlcyAtIERlc2t0b3A8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+IAotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQ29tcGFyZTwvaDE+Ci0KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggMjJuZCAyMDA1Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzQzNCI+ODc0MzQ8L2E+OiBhZGQgYSBsaW5rIGluIFN5bmNocm9uaXplL0NvbXBhcmUgdG8gQ29tcGFyZS9QYXRjaDxicj4KLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDh0aCAyMDA1Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQ4NyI+ODQ0ODc8L2E+OiBQYXRjaCB0byBwdXQgbWVudSBwYXRoIGNvbnRyaWJ1dGlvbnMgb24gUmVzb3VyY2VNYXBwaW5nczxicj4KLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgMTF0aCAyMDA1Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTg1MyI+ODE4NTM8L2E+OiBxdW90ZSBwcm9ibGVtcyBpbiBwcm9wZXJ0eSBmaWxlcyAoY29tcGFyZSk8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDR0aCAyMDA1Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDM4NyI+ODAzODc8L2E+OiBOUEUgb3BlbmluZyBjb21wYXJlIGVkaXRvcjxicj4KLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDd0aCAyMDA0Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotRWxpbWluYXRlZCBhbGwgY29tcGlsZXIgd2FybmluZ3M8YnI+Ci1SZW1vdmVkIGRlcGVuZGVuY3kgb24gY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkKLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IE5vdmVtYmVyIDMwdGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk0MTQiPjc5NDE0PC9hPjogc3RhdGVzIHdpdGggc2FtZSB0aW1lIHN0YW1wcyBtYXkgYXBwZWFyIGluIHRoZSB3cm9uZyBvcmRlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk1NjYiPjc5NTY2PC9hPjogTlBFIHdoZW4gY2xvc2luZyBKVW5pdCBjb21wYXJlIHZpZXc8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAyM3JkIDIwMDQKLQotPGgyPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ3Nzg2Ij40Nzc4NjwvYT46IFBvc3NpYmxlIGxlYWsgaW4gVGV4dE1lcmdlVmlld2VyPGJyPgotQWRkZWQgdHJhbnNsYXRhYmxlIGF0dHJpYnV0ZSB0byBleHRlbnNpb24gcG9pbnQgc2NoZW1hcy4KLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IE5vdmVtYmVyIDE2dGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4Njc5Ij43ODY3OTwvYT46IFByZWZzIEZpbHRlcmVkIE1lbWJlcnMgZmllbGQgZG9lcyBub3QgcmVzdG9yZSBkZWZhdWx0czxicj4KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciA5dGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLSAocGFydGlhbCBmaXg7IGF3YWl0cyBmaXggaW4gamR0LnVpKToKLSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NTk5Ij43NzU5OTwvYT46IFs1LjBdIFN0cnVjdHVyZSBjb21wYXJpbmcgb2YgZW51bXMgZG9lcyBub3Qgd29yazxicj4KLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IE5vdmVtYmVyIDFzdCAyMDA0Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTk4MSI+NjU5ODE8L2E+OiBlbXB0eSBjb21wYXJlIHZpZXdlciBoYXMgbm8gZm9jdXM8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBTZXB0ZW1iZXIgMjF0aCAyMDA0Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDQ1MCI+NzQ0NTA8L2E+OiBBYnN0cmFjdFVJUGx1Z2luLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMgbm8gbG9uZ2VyIGNhbGxlZD88YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgQXVndXN0IDI0dGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLUVsaW1pbmF0ZWQgY29tcGlsZXIgd2FybmluZ3MKLQotCi08aDE+PGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdWx5IDI3dGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLVVwZGF0ZWQgdmVyc2lvbiBudW1iZXIgaW4gcGx1Z2luLnhtbCBhbmQgZXhwb3J0IHNjcmlwdCB0byAzLjEKLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0J1ZmZlcmVkQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9CdWZmZXJlZENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwMWMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0J1ZmZlcmVkQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIGZvciBhIGJ1ZmZlcmVkIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5jcmVhdGVTdHJlYW08L2NvZGU+IG1ldGhvZAotICogdG8gY29ubmVjdCB0aGUgYnVmZmVyZWQgY29udGVudCB3aXRoIGEgc3RyZWFtYWJsZSBzb3VyY2UgKGUuZy4sIGEgZmlsZSkuCi0gKiA8cD4KLSAqIEFzIGxvbmcgYXMgdGhlIGNvbnRlbnRzIG9mIDxjb2RlPkJ1ZmZlcmVkQ29udGVudDwvY29kZT4gaXMgb25seSByZXRyaWV2ZWQgYXMgYW4gaW5wdXQgc3RyZWFtCi0gKiAoYnkgbWVhbnMgb2YgPGNvZGU+Z2V0Q29udGVudHM8L2NvZGU+KSBhbmQgdGhlIDxjb2RlPkJ1ZmZlcmVkQ29udGVudDwvY29kZT4gaXMgbm90IG1vZGlmaWVkICh3aXRoCi0gKiA8Y29kZT5zZXRDb250ZW50PC9jb2RlPikgbm8gYnVmZmVyaW5nIHRha2VzIHBsYWNlLgotICogQnVmZmVyaW5nIHN0YXJ0cyB3aGVuIGVpdGhlciBtZXRob2QgPGNvZGU+Z2V0Q29udGVudDwvY29kZT4gb3IgPGNvZGU+c2V0Q29udGVudDwvY29kZT4gaXMgY2FsbGVkLgotICogCi0gKiBAc2VlIElDb250ZW50Q2hhbmdlTm90aWZpZXIKLSAqIEBzZWUgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnVmZmVyZWRDb250ZW50IGltcGxlbWVudHMgSUNvbnRlbnRDaGFuZ2VOb3RpZmllciwgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciB7Ci0JCi0JYnl0ZVtdIGZDb250ZW50OwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lckxpc3Q7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1ZmZlcmVkIHN0cmVhbSBjb250ZW50IGFjY2Vzc29yLgotCSAqLwotCXByb3RlY3RlZCBCdWZmZXJlZENvbnRlbnQoKSB7Ci0JCS8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0JfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogc2VlIElTdHJlYW1Db250ZW50QWNjZXNzb3IuZ2V0Q29udGVudHMKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmQ29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmQ29udGVudCk7Ci0JCXJldHVybiBjcmVhdGVTdHJlYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RyZWFtIGZvciByZWFkaW5nIHRoZSBjb250ZW50cy4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBjb250ZW50IGlzIHJlYWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJbnB1dFN0cmVhbSBjcmVhdGVTdHJlYW0oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50cy4gUmVnaXN0ZXJlZCBjb250ZW50IGNoYW5nZSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkLgotCSAqCi0JICogQHBhcmFtIGNvbnRlbnRzIHRoZSBuZXcgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBjb250ZW50cykgewotCQlmQ29udGVudD0gY29udGVudHM7Ci0JCWZpcmVDb250ZW50Q2hhbmdlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBhcyBhbiBhcnJheSBvZiBieXRlcy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIGFzIGFuIGFycmF5IG9mIGJ5dGVzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgdGhlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJaWYgKGZDb250ZW50ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaXM9IGNyZWF0ZVN0cmVhbSgpOwotCQkJCWZDb250ZW50PSBVdGlsaXRpZXMucmVhZEJ5dGVzKGlzKTsKLQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50OwotCX0KLQotCS8qKgotCSAqIERpc2NhcmRzIHRoZSBidWZmZXJlZCBjb250ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2NhcmRCdWZmZXIoKSB7Ci0JCWZDb250ZW50PSBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogc2VlIElDb250ZW50Q2hhbmdlTm90aWZpZXIuYWRkQ2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb250ZW50Q2hhbmdlTGlzdGVuZXIoSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVyTGlzdCA9PSBudWxsKQotCQkJZkxpc3RlbmVyTGlzdD0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlmTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBzZWUgSUNvbnRlbnRDaGFuZ2VOb3RpZmllci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihJQ29udGVudENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJMaXN0ICE9IG51bGwpIHsKLQkJCWZMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWlmIChmTGlzdGVuZXJMaXN0LmlzRW1wdHkoKSkKLQkJCQlmTGlzdGVuZXJMaXN0PSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCByZWdpc3RlcmVkIDxjb2RlPklDb250ZW50Q2hhbmdlTGlzdGVuZXI8L2NvZGU+cyBvZiBhIGNvbnRlbnQgY2hhbmdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVDb250ZW50Q2hhbmdlZCgpIHsKLQkJaWYgKGZMaXN0ZW5lckxpc3QgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKLQkJCQkoKElDb250ZW50Q2hhbmdlTGlzdGVuZXIpbGlzdGVuZXJzW2ldKS5jb250ZW50Q2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY4OWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcGFyZUNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdAotICogY29udHJvbHMgdmFyaW91cyBVSSBhc3BlY3RzIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2VycyBsaWtlCi0gKiB0aXRsZSBsYWJlbHMgYW5kIGltYWdlcywgb3Igd2hldGhlciBhIHNpZGUgb2YgYSBtZXJnZSB2aWV3ZXIgaXMgZWRpdGFibGUuCi0gKiBJbiBhZGRpdGlvbiB0byB0aGVzZSBmaXhlZCBwcm9wZXJ0aWVzIDxjb2RlPklDb21wYXJlQ29uZmlndXJhdGlvbjwvY29kZT4gcHJvdmlkZXMKLSAqIEFQSSBmb3IgYW4gb3BlbiBlbmRlZCBzZXQgb2YgcHJvcGVydGllcy4gRGlmZmVyZW50IHZpZXdlcnMgd2hpY2ggc2hhcmUgdGhlIHNhbWUKLSAqIGNvbmZpZ3VyYXRpb24gY2FuIGNvbW11bmljYXRlIHZpYSB0aGlzIG1lY2hhbmlzbS4gRS5nLiBpZiBhIGNvbXBhcmUgZWRpdG9yCi0gKiBoYXMgYSBidXR0b24gZm9yIGNvbnRyb2xsaW5nIHdoZXRoZXIgY29tcGFyZSB2aWV3ZXJzIGlnbm9yZSB3aGl0ZSBzcGFjZSwKLSAqIHRoZSBidXR0b24gd291bGQgdHJpZ2dlciBhIGNoYW5nZSBvZiB0aGUgYm9vbGVhbiA8Y29kZT5JR05PUkVfV0hJVEVTUEFDRTwvY29kZT4gcHJvcGVydHkKLSAqIGFuZCBhbGwgaW50ZXJlc3RlZCB2aWV3ZXJzIHdvdWxkIHJlY2VpdmUgbm90aWZpY2F0aW9uLgotICogPHA+Ci0gKiBTdWl0YWJsZSBkZWZhdWx0IGxhYmVscyBhcmUgcHJvdmlkZWQgKHdpdGhvdXQgaW1hZ2VzKTsgYm90aCB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMKLSAqIGFyZSBlZGl0YWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgdXNlIHRoaXMgY2xhc3MgYXMgaXMsIG9yIHN1YmNsYXNzIHRvIGFkZCBuZXcgc3RhdGUgYW5kIGJlaGF2aW9yLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZUNvbmZpZ3VyYXRpb24gewotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgaWdub3JlIHdoaXRlc3BhY2UgcHJvcGVydHkgKHZhbHVlIDxjb2RlPiJJR05PUkVfV0hJVEVTUEFDRSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfV0hJVEVTUEFDRT0gIklHTk9SRV9XSElURVNQQUNFIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgdGhlIHNob3cgcHNldWRvIGNvbmZsaWN0cyBwcm9wZXJ0eSAodmFsdWUgPGNvZGU+IlNIT1dfUFNFVURPX0NPTkZMSUNUUyI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1BTRVVET19DT05GTElDVFM9ICJTSE9XX1BTRVVET19DT05GTElDVFMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgdXNlIG91dGxpbmUgdmlldyBwcm9wZXJ0eSAodmFsdWUgPGNvZGU+IlVTRV9PVVRMSU5FX1ZJRVciPC9jb2RlPikuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9PVVRMSU5FX1ZJRVc9ICJVU0VfT1VUTElORV9WSUVXIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEg9IDIyOwotCQotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvcltdIGZnSW1hZ2VzPSBuZXcgSW1hZ2VEZXNjcmlwdG9yWzE2XTsKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZmdEdW1teT0gbmV3IE9iamVjdCgpOwotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgZmdNYXA9IG5ldyBIYXNoTWFwKDIwKTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGZMZWZ0SXNMb2NhbD0gdHJ1ZTsKLQotCXN0YXRpYyB7Ci0JCWlmIChmTGVmdElzTG9jYWwpIHsKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLkFERElUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvZGVsX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5MRUZUICsgRGlmZmVyZW5jZXIuQURESVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9yX2luYWRkX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5SSUdIVCArIERpZmZlcmVuY2VyLkFERElUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvcl9vdXRhZGRfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuREVMRVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9hZGRfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLkxFRlQgKyBEaWZmZXJlbmNlci5ERUxFVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L3JfaW5kZWxfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLlJJR0hUICsgRGlmZmVyZW5jZXIuREVMRVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9yX291dGRlbF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5MRUZUICsgRGlmZmVyZW5jZXIuQ0hBTkdFXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvcl9pbmNoZ19vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuUklHSFQgKyBEaWZmZXJlbmNlci5DSEFOR0VdPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9yX291dGNoZ19vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuQURESVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9hZGRfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLkxFRlQgKyBEaWZmZXJlbmNlci5BRERJVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2luYWRkX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5SSUdIVCArIERpZmZlcmVuY2VyLkFERElUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvb3V0YWRkX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLkRFTEVUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvZGVsX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5MRUZUICsgRGlmZmVyZW5jZXIuREVMRVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9pbmRlbF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuUklHSFQgKyBEaWZmZXJlbmNlci5ERUxFVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L291dGRlbF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5MRUZUICsgRGlmZmVyZW5jZXIuQ0hBTkdFXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvaW5jaGdfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLlJJR0hUICsgRGlmZmVyZW5jZXIuQ0hBTkdFXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvb3V0Y2hnX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5DT05GTElDVElORyArIERpZmZlcmVuY2VyLkFERElUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvY29uZmFkZF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5DT05GTElDVElORyArIERpZmZlcmVuY2VyLkRFTEVUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvY29uZmRlbF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5DT05GTElDVElORyArIERpZmZlcmVuY2VyLkNIQU5HRV09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2NvbmZjaGdfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZTsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9wZXJ0aWVzPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgYm9vbGVhbiBmTGVmdEVkaXRhYmxlPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmUmlnaHRFZGl0YWJsZT0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBmQW5jZXN0b3JMYWJlbDsKLQlwcml2YXRlIFN0cmluZyBmTGVmdExhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZSaWdodExhYmVsOwotCXByaXZhdGUgSW1hZ2UgZkFuY2VzdG9ySW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmUmlnaHRJbWFnZTsKLQlwcml2YXRlIEltYWdlIGZMZWZ0SW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZVtdIGZJbWFnZXM9IG5ldyBJbWFnZVsxNl07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb25maWd1cmF0aW9uIHdpdGggZWRpdGFibGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMsCi0JICogc3VpdGFibGUgZGVmYXVsdCBsYWJlbHMsIGFuZCBubyBpbWFnZXMuCi0JICogVGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUgaXMgdXNlZCB0byBjb25uZWN0IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIHdpdGggdGhlIENvbXBhcmUgcHJlZmVyZW5jZSBwYWdlIHByb3BlcnRpZXMgPGNvZGU+Q29tcGFyZVByZWZlcmVuY2VQYWdlLklOSVRJQUxMWV9TSE9XX0FOQ0VTVE9SX1BBTkU8L2NvZGU+LAotCSAqIGFuZCA8Y29kZT5Db21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV0hJVEVTUEFDRTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSB3aGljaCB0aGlzIGNvbmZpZ3VyYXRpb24gaG9sZHMgb250by4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIENvbXBhcmVDb25maWd1cmF0aW9uKElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlKSB7Ci0JCQotCQlzZXRQcm9wZXJ0eSgiTEVGVF9JU19MT0NBTCIsIG5ldyBCb29sZWFuKGZMZWZ0SXNMb2NhbCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmUHJlZmVyZW5jZVN0b3JlPSBwcmVmU3RvcmU7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gYj0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5JTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FKTsKLQkJCXNldFByb3BlcnR5KENvbXBhcmVQcmVmZXJlbmNlUGFnZS5JTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FLCBuZXcgQm9vbGVhbihiKSk7Ci0JCQkKLQkJCWI9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuSUdOT1JFX1dISVRFU1BBQ0UpOwotCQkJc2V0UHJvcGVydHkoQ29tcGFyZUNvbmZpZ3VyYXRpb24uSUdOT1JFX1dISVRFU1BBQ0UsIG5ldyBCb29sZWFuKGIpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb25maWd1cmF0aW9uIHdpdGggZWRpdGFibGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMsCi0JICogc3VpdGFibGUgZGVmYXVsdCBsYWJlbHMsIGFuZCBubyBpbWFnZXMuCi0JICogVGhpcyBjb25maWd1cmF0aW9uIHVzZXMgdGhlIHByZWZlcmVuY2Ugc3RvcmUgb2YgdGhlIENvbXBhcmUgcGx1Z2luCi0JICogKDxjb2RlPkNvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ29tcGFyZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXRoaXMoQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcmVuY2Ugc3RvcmUgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHNob3dpbmcgdGhlIHNwZWNpZmllZCBjaGFuZ2Uga2luZC4KLQkgKiBUaGUgZGlmZmVyZW50IGtpbmQgb2YgY2hhbmdlcyBhcmUgZGVmaW5lZCBpbiB0aGUgPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+LgotCSAqIE5ld2x5IGNyZWF0ZWQgaW1hZ2VzIGFyZSByZW1lbWJlcmVkIGJ5IHRoaXMgY2xhc3MgYW5kCi0JICogZGlzcG9zZWQgd2hlbiB0aGUgPGNvZGU+ZGlzcG9zZTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKgotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIGNoYW5nZSBhcyBkZWZpbmVkIGluIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGFuIG1vZGlmaWNhdGlvbiBvZiB0aGUgYmFzZSBpbWFnZSByZWZsZWN0aW5nIHRoZSBraW5kIG9mIGNoYW5nZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuRGlmZmVyZW5jZXIKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKGludCBraW5kKSB7Ci0JCUltYWdlIGltYWdlPSBmSW1hZ2VzW2tpbmQgJiAxNV07Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQ9IGZnSW1hZ2VzW2tpbmQgJiAxNV07Ci0JCQlpZiAoaWQgIT0gbnVsbCkJCQkJCi0JCQkJaW1hZ2U9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQlmSW1hZ2VzW2tpbmQgJiAxNV09IGltYWdlOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBzaG93aW5nIHRoZSBzcGVjaWZpZWQgY2hhbmdlIGtpbmQgYXBwbGllZCB0byBhCi0JICogZ2l2ZW4gYmFzZSBpbWFnZS4gVGhlIGRpZmZlcmVudCBraW5kIG9mIGNoYW5nZXMgYXJlIGRlZmluZWQgaW4gdGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPi4KLQkgKiBUeXBpY2FsbHkgYW4gaW1wbGVtZW50YXRpb24gd291bGQgYnVpbGQgYSBjb21wb3NpdGUgaW1hZ2UgCi0JICogZnJvbSB0aGUgZ2l2ZW4gYmFzZSBpbWFnZSBhbmQgYW4gaW1hZ2UgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Uga2luZC4KLQkgKiBOZXdseSBjcmVhdGVkIGltYWdlcyBhcmUgcmVtZW1iZXJlZCBieSB0aGlzIGNsYXNzIGFuZAotCSAqIGRpc3Bvc2VkIHdoZW4gdGhlIDxjb2RlPmRpc3Bvc2U8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCi0JICoKLQkgKiBAcGFyYW0gYmFzZSB0aGUgaW1hZ2Ugd2hpY2ggaXMgbW9kaWZpZWQgdG8gcmVmbGVjdCB0aGUga2luZCBvZiBjaGFuZ2UKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBjaGFuZ2UgYXMgZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4uCi0JICogQHJldHVybiBhbiBtb2RpZmljYXRpb24gb2YgdGhlIGJhc2UgaW1hZ2UgcmVmbGVjdGluZyB0aGUga2luZCBvZiBjaGFuZ2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKEltYWdlIGJhc2UsIGludCBraW5kKSB7Ci0KLQkJT2JqZWN0IGtleT0gYmFzZTsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJa2V5PSBmZ0R1bW15OwotCi0JCWtpbmQgJj0gMTU7Ci0KLQkJSW1hZ2VbXSBhPSAoSW1hZ2VbXSkgZmdNYXAuZ2V0KGtleSk7Ci0JCWlmIChhID09IG51bGwpIHsKLQkJCWE9IG5ldyBJbWFnZVsxNl07Ci0JCQlmZ01hcC5wdXQoa2V5LCBhKTsKLQkJfQotCQlJbWFnZSBiPSBhW2tpbmRdOwotCQlpZiAoYiA9PSBudWxsKSB7Ci0JCQliPSBuZXcgRGlmZkltYWdlKGJhc2UsIGZnSW1hZ2VzW2tpbmRdLCBXSURUSCwgIWZMZWZ0SXNMb2NhbCkuY3JlYXRlSW1hZ2UoKTsKLQkJCUNvbXBhcmVVSS5kaXNwb3NlT25TaHV0ZG93bihiKTsKLQkJCWFba2luZF09IGI7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhpcyBjb21wYXJlIGNvbmZpZ3VyYXRpb24uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIHRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gaXMgbm8gbG9uZ2VyIHVzZWQuCi0JICogQW4gaW1wbGVtZW50YXRpb24gbXVzdCBkaXNwb3NlIG9mIGFsbCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZJbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZJbWFnZXMubGVuZ3RoOyBpKyspewotCQkJCUltYWdlIGltYWdlPSBmSW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlmSW1hZ2VzPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpcmVzIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gdG8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICoKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIG9sZFZhbHVlIHRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgcHJvcGVydHkncyBuZXcgdmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50PSBudWxsOwotCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGw9IChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCQlldmVudD0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJCWwucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbiBqYXZhZG9jKQotCSAqIHNlZSBJUHJvcGVydHlDaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24gamF2YWRvYykKLQkgKiBzZWUgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIElmIHRoZSBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBvbGQgYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPgotCSAqIGlzIHNlbnQgdG8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQKLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJT2JqZWN0IG9sZFZhbHVlPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJZlByb3BlcnRpZXMucHV0KGtleSwgbmV3VmFsdWUpOwotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCB8fCAhb2xkVmFsdWUuZXF1YWxzKG5ld1ZhbHVlKSkKLQkJCWZpcmVDaGFuZ2Uoa2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gc3VjaCBwcm9wZXJ0eSBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JfQotCi0JLy8tLS0tIGFuY2VzdG9yCi0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwgdG8gdXNlIGZvciB0aGUgYW5jZXN0b3Igb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqCi0JICogQHBhcmFtIGxhYmVsIHRoZSBuZXcgbGFiZWwgZm9yIHRoZSBhbmNlc3RvciBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbmNlc3RvckxhYmVsKFN0cmluZyBsYWJlbCkgewotCQlmQW5jZXN0b3JMYWJlbD0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBhbmNlc3RvciBzaWRlIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2Vycy4KLQkgKiBUaGlzIGxhYmVsIGlzIHR5cGljYWxseSBzaG93biBpbiB0aGUgdGl0bGUgb2YgdGhlIGFuY2VzdG9yIGFyZWEgaW4gYSBjb21wYXJlIHZpZXdlci4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBpbnB1dCBvYmplY3Qgb2YgYSBjb21wYXJlL21lcmdlIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgYW5jZXN0b3Igc2lkZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QW5jZXN0b3JMYWJlbChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZkFuY2VzdG9yTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIHRvIHVzZSBmb3IgdGhlIGFuY2VzdG9yIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2Vycy4KLQkgKiBUaGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBkaXNwb3NlIHRoZSBvbGQgaW1hZ2UuCi0JICoKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIG5ldyBpbWFnZSBmb3IgdGhlIGFuY2VzdG9yIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFuY2VzdG9ySW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJZkFuY2VzdG9ySW1hZ2U9IGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgYW5jZXN0b3Igc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhpcyBpbWFnZSBpcyB0eXBpY2FsbHkgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSBhbmNlc3RvciBhcmVhIGluIGEgY29tcGFyZSB2aWV3ZXIuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgaW5wdXQgb2JqZWN0IG9mIGEgY29tcGFyZS9tZXJnZSB2aWV3ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8JCi0JcHVibGljIEltYWdlIGdldEFuY2VzdG9ySW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZBbmNlc3RvckltYWdlOwotCX0KLQotCS8vLS0tLSBsZWZ0IHNpZGUKLQkKLQkvKioKLQkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBsZWZ0IHNpZGUgb2YgYSBtZXJnZSB2aWV3ZXIgaXMgZWRpdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gZWRpdGFibGUgaWYgdGhlIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+IGxlZnQgc2lkZSBpcyBlZGl0YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWZMZWZ0RWRpdGFibGU9IGVkaXRhYmxlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIGEgbWVyZ2Ugdmlld2VyIGlzIGVkaXRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxlZnQgaGFuZCBzaWRlIGlzIGVkaXRhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZWZ0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBmTGVmdEVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsIHRvIHVzZSBmb3IgdGhlIGxlZnQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICoKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIG5ldyBsYWJlbCBmb3IgdGhlIGxlZnQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCWZMZWZ0TGFiZWw9IGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2Vycy4KLQkgKiBUaGlzIGxhYmVsIGlzIHR5cGljYWxseSBzaG93biBpbiB0aGUgdGl0bGUgb2YgdGhlIGxlZnQgc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGlucHV0IG9iamVjdCBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSBsZWZ0IGhhbmQgc2lkZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGVmdExhYmVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmTGVmdExhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIHRvIHVzZSBmb3IgdGhlIGxlZnQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGRpc3Bvc2UgdGhlIG9sZCBpbWFnZS4KLQkgKgotCSAqIEBwYXJhbSBpbWFnZSB0aGUgbmV3IGltYWdlIGZvciB0aGUgbGVmdCBzaWRlIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlmTGVmdEltYWdlPSBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2Vycy4KLQkgKiBUaGlzIGltYWdlIGlzIHR5cGljYWxseSBzaG93biBpbiB0aGUgdGl0bGUgb2YgdGhlIGxlZnQgc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGlucHV0IG9iamVjdCBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSBsZWZ0IGhhbmQgc2lkZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwkKLQlwdWJsaWMgSW1hZ2UgZ2V0TGVmdEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmTGVmdEltYWdlOwotCX0KLQkKLQkvLy0tLS0gcmlnaHQgc2lkZQotCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciB0aGUgcmlnaHQgc2lkZSBvZiBhIG1lcmdlIHZpZXdlciBpcyBlZGl0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBlZGl0YWJsZSBpZiB0aGUgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gcmlnaHQgc2lkZSBpcyBlZGl0YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpZ2h0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlmUmlnaHRFZGl0YWJsZT0gZWRpdGFibGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgbWVyZ2Ugdmlld2VyIGlzIGVkaXRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyBlZGl0YWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmlnaHRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZSaWdodEVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsIHRvIHVzZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqCi0JICogQHBhcmFtIGxhYmVsIHRoZSBuZXcgbGFiZWwgZm9yIHRoZSByaWdodCBzaWRlIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpZ2h0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCWZSaWdodExhYmVsPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhpcyBsYWJlbCBpcyB0eXBpY2FsbHkgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSByaWdodCBzaWRlIG9mIGEgY29tcGFyZSB2aWV3ZXIuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgaW5wdXQgb2JqZWN0IG9mIGEgY29tcGFyZS9tZXJnZSB2aWV3ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmlnaHRMYWJlbChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZlJpZ2h0TGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gdXNlIGZvciB0aGUgcmlnaHQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGRpc3Bvc2UgdGhlIG9sZCBpbWFnZS4KLQkgKgotCSAqIEBwYXJhbSBpbWFnZSB0aGUgbmV3IGltYWdlIGZvciB0aGUgcmlnaHQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWZSaWdodEltYWdlPSBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhpcyBpbWFnZSBpcyB0eXBpY2FsbHkgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSByaWdodCBzaWRlIG9mIGEgY29tcGFyZSB2aWV3ZXIuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgaW5wdXQgb2JqZWN0IG9mIGEgY29tcGFyZS9tZXJnZSB2aWV3ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRSaWdodEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmUmlnaHRJbWFnZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2IyY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7IAotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci0KLQotLyoqCi0gKiBBIGNvbXBhcmUgb3BlcmF0aW9uIHdoaWNoIGNhbiBwcmVzZW50IGl0cyByZXN1bHRzIGluIGEgc3BlY2lhbCBlZGl0b3IuCi0gKiBSdW5uaW5nIHRoZSBjb21wYXJlIG9wZXJhdGlvbiBhbmQgcHJlc2VudGF0aW5nIHRoZSByZXN1bHRzIGluIGEgY29tcGFyZSBlZGl0b3IKLSAqIGFyZSBjb21iaW5lZCBpbiBvbmUgY2xhc3MgYmVjYXVzZSBpdCBhbGxvd3MgYSBjbGllbnQgdG8ga2VlcCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGFsbCBpbiBvbmUgcGxhY2Ugd2hpbGUgc2VwYXJhdGluZyBpdCBmcm9tIHRoZSBpbm5hcmRzIG9mIGEgc3BlY2lmaWMgVUkgaW1wbGVtZW50YXRpb24gb2YgY29tcGFyZS9tZXJnZS4KLSAqIDxwPiAKLSAqIEEgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0PC9jb2RlPiBkZWZpbmVzIG1ldGhvZHMgZm9yIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugc3RlcHM6Ci0gKiA8VUw+Ci0gKiA8TEk+cnVubmluZyBhIGxlbmd0aHkgY29tcGFyZSBvcGVyYXRpb24gdW5kZXIgcHJvZ3Jlc3MgbW9uaXRvciBjb250cm9sLAotICogPExJPmNyZWF0aW5nIGEgVUkgZm9yIGRpc3BsYXlpbmcgdGhlIG1vZGVsIGFuZCBpbml0aWFsaXppbmcgdGhlIHNvbWUgd2lkZ2V0cyB3aXRoIHRoZSBjb21wYXJlIHJlc3VsdCwKLSAqIDxMST50cmFja2luZyB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIG1vZGVsIGluIGNhc2Ugb2YgbWVyZ2UsCi0gKiA8TEk+c2F2aW5nIHRoZSBtb2RlbC4KLSAqIDwvVUw+Ci0gKiBUaGUgQ29tcGFyZSBwbHVnLWluJ3MgPGNvZGU+b3BlbkNvbXBhcmVFZGl0b3I8L2NvZGU+IG1ldGhvZCB0YWtlcyBhbiA8Y29kZT5JQ29tcGFyZUVkaXRvcklucHV0PC9jb2RlPgotICogYW5kIHN0YXJ0cyBzZXF1ZW5jaW5nIHRocm91Z2ggdGhlIGFib3ZlIHN0ZXBzLiBJZiB0aGUgY29tcGFyZSByZXN1bHQgaXMgbm90IGVtcHR5IGEgbmV3IGNvbXBhcmUgZWRpdG9yCi0gKiBpcyBvcGVuZWQgYW5kIHRha2VzIG92ZXIgdGhlIHNlcXVlbmNlIHVudGlsIGV2ZW50dWFsbHkgY2xvc2VkLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+cHJlcGFyZUlucHV0PC9jb2RlPiBtZXRob2Qgc2hvdWxkIGNvbnRhaW4gdGhlCi0gKiBjb2RlIG9mIHRoZSBjb21wYXJlIG9wZXJhdGlvbi4gSXQgaXMgZXhlY3V0ZWQgdW5kZXIgY29udHJvbCBvZiBhIHByb2dyZXNzIG1vbml0b3IKLSAqIGFuZCBjYW4gYmUgY2FuY2VsZWQuIElmIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgaXMgbm90IGVtcHR5LCB0aGF0IGlzIGlmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcwotICogdGhhdCBuZWVkcyB0byBiZSBwcmVzZW50ZWQsIHRoZSA8Y29kZT5JQ29tcGFyZUVkaXRvcklucHV0PC9jb2RlPiBzaG91bGQgaG9sZCBvbnRvIHRoZW0gYW5kIHJldHVybiB0aGVtIHdpdGgKLSAqIHRoZSA8Y29kZT5nZXRDb21wYXJlUmVzdWx0PC9jb2RlPiBtZXRob2QuCi0gKiBJZiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSA8Y29kZT5nZXRDb21wYXJlUmVzdWx0PC9jb2RlPiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGEgY29tcGFyZSBlZGl0b3IgaXMgb3BlbmVkIG9uIHRoZSA8Y29kZT5JQ29tcGFyZUVkaXRvcklucHV0PC9jb2RlPiB3aXRoIHRpdGxlIGFuZCB0aXRsZSBpbWFnZSBpbml0aWFsaXplZCBieSB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiB0aGUgPGNvZGU+SUNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4uCi0gKiA8cD4KLSAqIENyZWF0aW9uIG9mIHRoZSBlZGl0b3IncyBTV1QgY29udHJvbHMgaXMgZGVsZWdhdGVkIHRvIHRoZSA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4gbWV0aG9kLgotICogSGVyZSB0aGUgU1dUIGNvbnRyb2xzIG11c3QgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24uCi0gKiA8cD4KLSAqIElmIG1lcmdpbmcgaXMgYWxsb3dlZCwgdGhlIG1vZGlmaWNhdGlvbiBzdGF0ZSBvZiB0aGUgY29tcGFyZWQgY29uc3RpdHVlbnRzIG11c3QgYmUgdHJhY2tlZCBhbmQgdGhlIGRpcnR5Ci0gKiBzdGF0ZSByZXR1cm5lZCBmcm9tIG1ldGhvZCA8Y29kZT5pc1NhdmVOZWVkZWQ8L2NvZGU+LiBUaGUgdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gdHJpZ2dlcnMgYSBzdWJzZXF1ZW50IGNhbGwKLSAqIHRvIDxjb2RlPnNhdmU8L2NvZGU+IHdoZXJlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMgY2FuIGJlIHNhdmVkLgotICogPHA+Ci0gKiBUaGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRoZSBzZXR1cCBvZiB0aGUgY29tcGFyZS9tZXJnZSBVSS4KLSAqIFRoZSBVSSB1c2VzIGEgc2ltcGxlIGJyb3dzZXIgbWV0YXBob3IgdG8gcHJlc2VudCBjb21wYXJlIHJlc3VsdHMuCi0gKiBUaGUgdG9wIGhhbGYgb2YgdGhlIGxheW91dCBzaG93cyB0aGUgc3RydWN0dXJhbCBjb21wYXJlIHJlc3VsdHMgKGUuZy4gYWRkZWQsIGRlbGV0ZWQsIGFuZCBjaGFuZ2VkIGZpbGVzKSwKLSAqIHRoZSBib3R0b20gaGFsZiB0aGUgY29udGVudCBjb21wYXJlIHJlc3VsdHMgKGUuZy4gdGV4dHVhbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBmaWxlcykuCi0gKiBBIHNlbGVjdGlvbiBpbiB0aGUgdG9wIHBhbmUgaXMgZmVkIHRvIHRoZSBib3R0b20gcGFuZS4gSWYgYSBjb250ZW50IHZpZXdlciBpcyByZWdpc3RlcmVkCi0gKiBmb3IgdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGVkIG9iamVjdCwgdGhpcyB2aWV3ZXIgaXMgaW5zdGFsbGVkIGluIHRoZSBwYW5lLgotICogSW4gYWRkaXRpb24gaWYgYSBzdHJ1Y3R1cmUgdmlld2VyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBzZWxlY3Rpb24gdHlwZSB0aGUgdG9wIHBhbmUKLSAqIGlzIHNwbGl0IGhvcml6b250YWxseSB0byBtYWtlIHJvb20gZm9yIGFub3RoZXIgcGFuZSBhbmQgdGhlIHN0cnVjdHVyZSB2aWV3ZXIgaXMgaW5zdGFsbGVkCi0gKiBpbiBpdC4gV2hlbiBjb21wYXJpbmcgSmF2YSBmaWxlcyB0aGlzIHNlY29uZCBzdHJ1Y3R1cmUgdmlld2VyIHdvdWxkIHNob3cgdGhlIHN0cnVjdHVyYWwKLSAqIGRpZmZlcmVuY2VzIHdpdGhpbiBhIEphdmEgZmlsZSwgZS5nLiBhZGRlZCwgZGVsZXRlZCBvciBjaGFuZ2VkIG1ldGhvZHMgYW5kIGZpZWxkcy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBwcm92aWRlIGN1c3RvbSBzZXR1cHMsIGUuZy4gZm9yIGEgQ2F0Y2h1cC9SZWxlYXNlIG9wZXJhdGlvbgotICogYnkgcGFzc2luZyBhIHN1YmNsYXNzIG9mIDxjb2RlPkNvbXBhcmVDb25maWd1cmF0aW9uPC9jb2RlPiBhbmQgYnkgaW1wbGVtZW50aW5nIHRoZSA8Y29kZT5wcmVwYXJlSW5wdXQ8L2NvZGU+IG1ldGhvZC4KLSAqIElmIGEgc3ViY2xhc3MgY2Fubm90IHVzZSB0aGUgPGNvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+IHdoaWNoIGlzIGluc3RhbGxlZCBieSBkZWZhdWx0IGluIHRoZQotICogdG9wIGxlZnQgcGFuZSwgbWV0aG9kIDxjb2RlPmNyZWF0ZURpZmZWaWV3ZXI8L2NvZGU+IGNhbiBiZSBvdmVycmlkZGVuLgotICogCi0gKiBAc2VlIENvbXBhcmVVSQotICogQHNlZSBDb21wYXJlRWRpdG9ySW5wdXQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBhcmVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRz0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgImRpcnR5IiBwcm9wZXJ0eSAodmFsdWUgPGNvZGU+IkRJUlRZX1NUQVRFIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUlRZX1NUQVRFPSAiRElSVFlfU1RBVEUiOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFX0VESVRPUl9JTUFHRV9OQU1FPSAiZXZpZXcxNi9jb21wYXJlX3ZpZXcuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEltYWdlIGZnVGl0bGVJbWFnZTsKLQkKLQlwcml2YXRlIFNwbGl0dGVyIGZDb21wb3NpdGU7Ci0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmU3RydWN0dXJlSW5wdXRQYW5lOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZlN0cnVjdHVyZVBhbmUxOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZlN0cnVjdHVyZVBhbmUyOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZkNvbnRlbnRJbnB1dFBhbmU7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmRm9jdXNQYW5lOwotCXByaXZhdGUgU3RyaW5nIGZNZXNzYWdlOwotCXByaXZhdGUgT2JqZWN0IGZJbnB1dDsKLQlwcml2YXRlIFN0cmluZyBmVGl0bGU7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVyTGlzdD0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgQ29tcGFyZU5hdmlnYXRvciBmTmF2aWdhdG9yOwotCXByaXZhdGUgYm9vbGVhbiBmRGlydHk9IGZhbHNlOwotCXByaXZhdGUgQXJyYXlMaXN0IGZEaXJ0eVZpZXdlcnM9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZEaXJ0eVN0YXRlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElnbm9yZVdoaXRlU3BhY2VBY3Rpb24gZklnbm9yZVdoaXRlc3BhY2U7Ci0JcHJpdmF0ZSBTaG93UHNldWRvQ29uZmxpY3RzIGZTaG93UHNldWRvQ29uZmxpY3RzOwotCQotCWJvb2xlYW4gZlN0cnVjdHVyZUNvbXBhcmVPblNpbmdsZUNsaWNrPSB0cnVlOwotCWJvb2xlYW4gZlVzZU91dGxpbmVWaWV3PSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+IHdoaWNoIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuCi0JICogY29tcGFyZSBjb25maWd1cmF0aW9uLgotCSAqIFRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gaXMgcGFzc2VkIHRvIHN1YnNlcXVlbnRseSBjcmVhdGVkIHZpZXdlcnMuCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uIAotCSAqLwotCXB1YmxpYyBDb21wYXJlRWRpdG9ySW5wdXQoQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb249IGNvbmZpZ3VyYXRpb247Ci0JCUFzc2VydC5pc05vdE51bGwoY29uZmlndXJhdGlvbik7Ci0JCQotCQlPYmplY3Qgb2JqZWN0PSBmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoQ29tcGFyZUNvbmZpZ3VyYXRpb24uVVNFX09VVExJTkVfVklFVyk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJZlVzZU91dGxpbmVWaWV3PSAoKEJvb2xlYW4pIG9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBDb21wYXJlVUkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJZklnbm9yZVdoaXRlc3BhY2U9IG5ldyBJZ25vcmVXaGl0ZVNwYWNlQWN0aW9uKGJ1bmRsZSwgY29uZmlndXJhdGlvbik7Ci0JCWZTaG93UHNldWRvQ29uZmxpY3RzPSBuZXcgU2hvd1BzZXVkb0NvbmZsaWN0cyhidW5kbGUsIGNvbmZpZ3VyYXRpb24pOwotCi0JCWZEaXJ0eVN0YXRlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWU9IGUuZ2V0UHJvcGVydHkoKTsKLQkJCQlpZiAoQ29tcGFyZUVkaXRvcklucHV0LkRJUlRZX1NUQVRFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJCWJvb2xlYW4gY2hhbmdlZD0gZmFsc2U7Ci0JCQkJCU9iamVjdCBuZXdWYWx1ZT0gZS5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJCQkJY2hhbmdlZD0gKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJc2V0RGlydHkoZS5nZXRTb3VyY2UoKSwgY2hhbmdlZCk7Ci0JCQkJfQkJCQotCQkJfQotCQl9OwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHM9IGNvbmZpZ3VyYXRpb24uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChwcyAhPSBudWxsKQotCQkJZlN0cnVjdHVyZUNvbXBhcmVPblNpbmdsZUNsaWNrPSBwcy5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5PUEVOX1NUUlVDVFVSRV9DT01QQVJFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHN0cnVjdHVyZUNvbXBhcmVPblNpbmdsZUNsaWNrKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZUNvbXBhcmVPblNpbmdsZUNsaWNrOwotCX0KLQkJCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJQWRhcHRhYmxlLmdldEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUNvbXBhcmVOYXZpZ2F0b3IuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpIHx8IENvbXBhcmVOYXZpZ2F0b3IuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlpZiAoZk5hdmlnYXRvciA9PSBudWxsKQotCQkJCWZOYXZpZ2F0b3I9IG5ldyBDb21wYXJlTmF2aWdhdG9yKAotCQkJCQluZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmVbXSB7Ci0JCQkJCQlmU3RydWN0dXJlSW5wdXRQYW5lLAotCQkJCQkJZlN0cnVjdHVyZVBhbmUxLAotCQkJCQkJZlN0cnVjdHVyZVBhbmUyLAotCQkJCQkJZkNvbnRlbnRJbnB1dFBhbmUKLQkJCQkJfQotCQkJCSk7Ci0JCQlyZXR1cm4gZk5hdmlnYXRvcjsKLQkJfQotCQlpZiAoSUZpbGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCSAgICBJUHJvZ3Jlc3NNb25pdG9yIHBtPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJLy8gZmx1c2ggY2hhbmdlcyBpbiBhbnkgZGlydHkgdmlld2VyCi0JCQl0cnkgewotCSAgICAgICAgICAgIGZsdXNoVmlld2VyKGZTdHJ1Y3R1cmVJbnB1dFBhbmUsIHBtKTsKLQkgICAgICAgICAgICBmbHVzaFZpZXdlcihmU3RydWN0dXJlUGFuZTEsIHBtKTsKLQkgICAgICAgICAgICBmbHVzaFZpZXdlcihmU3RydWN0dXJlUGFuZTIsIHBtKTsKLQkgICAgICAgICAgICBmbHVzaFZpZXdlcihmQ29udGVudElucHV0UGFuZSwgcG0pOwotCSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICAgICAgQ29tcGFyZVVJUGx1Z2luLmxvZyhlKTsKLQkgICAgICAgIH0KLQkJICAgIElGaWxlW10gZmlsZXM9IChJRmlsZVtdKSBnZXRBZGFwdGVyKElGaWxlW10uY2xhc3MpOwotCQkgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkKLQkJICAgICAgICByZXR1cm4gZmlsZXNbMF07CS8vIGNhbiBvbmx5IHJldHVybiBvbmU6IGxpbWl0YXRpb24gb24gSURFLnNhdmVBbGxFZGl0b3JzOyBzZWUgIzY0NjE3Ci0JCSAgICByZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdG9ySW5wdXQuZ2V0SW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElFZGl0b3JJbnB1dC5nZXRUb29sVGlwVGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBnZXRUaXRsZSgpOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElFZGl0b3JJbnB1dC5nZXROYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0VGl0bGUoKTsKLQl9Ci0JCQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHNpbmNlIHRoaXMgZWRpdG9yIGNhbm5vdCBiZSBwZXJzaXN0ZWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGJlY2F1c2UgdGhpcyBlZGl0b3IgY2Fubm90IGJlIHBlcnNpc3RlZAotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHRoYXQgdGhpcyBpbnB1dAotCSAqIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSAiRmlsZSBNb3N0IFJlY2VudGx5IFVzZWQiIG1lbnUuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEZJWE1FIQotIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWZNZXNzYWdlPSBtZXNzYWdlOwotCX0KLQkKLQkvKgotCSAqIEZJWE1FIQotIAkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZTsKLQl9Ci0JCQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgd2hpY2ggd2lsbCBiZSB1c2VkIGluIHRoZSBjb21wYXJlIGVkaXRvcidzIHRpdGxlIGJhci4KLQkgKiBJdCBjYW4gYmUgc2V0IHdpdGggPGNvZGU+c2V0VGl0bGU8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiB0aGUgdGl0bGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlpZiAoZlRpdGxlID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZUVkaXRvcklucHV0LmRlZmF1bHRUaXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmVGl0bGU7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRpdGxlIHdoaWNoIHdpbGwgYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbXBhcmUgcmVzdWx0LgotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZWRpdG9yIGlzIG9wZW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhlIENvbXBhcmVFZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJZlRpdGxlPSB0aXRsZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSB1c2VkIGluIHRoZSBjb21wYXJlIGVkaXRvcidzIHRpdGxlIGJhci4KLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBpbWFnZSB3aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBjb21wYXJlIHJlc3VsdC4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBnZW5lcmljIGNvbXBhcmUgaWNvbi4KLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRpdGxlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIEltYWdlIGdldFRpdGxlSW1hZ2UoKSB7Ci0JCWlmIChmZ1RpdGxlSW1hZ2UgPT0gbnVsbCkgewotCQkJZmdUaXRsZUltYWdlPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKENPTVBBUkVfRURJVE9SX0lNQUdFX05BTUUpLmNyZWF0ZUltYWdlKCk7Ci0JCQlDb21wYXJlVUkuZGlzcG9zZU9uU2h1dGRvd24oZmdUaXRsZUltYWdlKTsKLQkJfQotCQlyZXR1cm4gZmdUaXRsZUltYWdlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIHZpZXdlcnMgd2l0aGluIHRoZSBjb21wYXJlIGVkaXRvci4KLQkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIHdoaWNoIHdhcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotCSAqCi0JICogQHJldHVybiB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENvbXBhcmVDb25maWd1cmF0aW9uIGdldENvbXBhcmVDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZHMgc3RhbmRhcmQgYWN0aW9ucyB0byB0aGUgZ2l2ZW4gPGNvZGU+VG9vbEJhck1hbmFnZXI8L2NvZGU+LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGFkZCB0aGVpciBvd24gYWN0aW9ucy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIgdGhlIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPiB0byB3aGljaCB0byBjb250cmlidXRlCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQkKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChmSWdub3JlV2hpdGVzcGFjZSk7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChmU2hvd1BzZXVkb0NvbmZsaWN0cyk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIGNvbXBhcmUgb3BlcmF0aW9uIGFuZCBzdG9yZXMgdGhlIGNvbXBhcmUgcmVzdWx0LgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUKLQkgKiAgIHJlcXVlc3RzIGZvciBjYW5jZWxhdGlvbgotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+cHJlcGFyZUlucHV0PC9jb2RlPiBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLQkgKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLQkgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0JICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0JICogIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWZJbnB1dD0gcHJlcGFyZUlucHV0KG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIGNvbXBhcmUgb3BlcmF0aW9uIGFuZCByZXR1cm5zIHRoZSBjb21wYXJlIHJlc3VsdC4KLQkgKiBJZiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBubyBkaWZmZXJlbmNlcyB3ZXJlIGZvdW5kIGFuZCBubyBjb21wYXJlIGVkaXRvciBuZWVkcyB0byBiZSBvcGVuZWQuCi0JICogUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQgYWNrbm93bGVkZ2VkIAotCSAqIGJ5IHRocm93aW5nIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGluIGEgbW9kYWwgY29udGV4dCB0aHJlYWQgd2hpY2ggZG9lc24ndCBoYXZlIGEgRGlzcGxheSBhc3NpZ25lZC4KLQkgKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkbid0IHRoZXJlZm9yZSBhbGxvY2F0ZWQgYW55IFNXVCByZXNvdXJjZXMgaW4gdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUKLQkgKiAgIHJlcXVlc3RzIGZvciBjYW5jZWxhdGlvbgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBkaWZmZXJlbmNlcwotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+cHJlcGFyZUlucHV0PC9jb2RlPiBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLQkgKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLQkgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0JICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0JICogIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgcHJlcGFyZUlucHV0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBhcmUgcmVzdWx0IGNvbXB1dGVkIGJ5IHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIHRoZQotCSAqIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogZGlmZmVyZW5jZXMgd2VyZSBmb3VuZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgcmVzdWx0IHByZXBhcmVkIGluIG1ldGhvZCA8Y29kZT5wcmVwYXJlSW5wdXQ8L2NvZGU+Ci0JICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3ZXJlIG5vIGRpZmZlcmVuY2VzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb21wYXJlUmVzdWx0KCkgewotCQlyZXR1cm4gZklucHV0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIFNXVCBjb250cm9scyB0aGF0IGFyZSB1c2VkIHRvIGRpc3BsYXkgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24uCi0JICogQ3JlYXRlcyB0aGUgU1dUIENvbnRyb2xzIGFuZCBzZXRzIHVwIHRoZSB3aXJpbmcgYmV0d2VlbiB0aGUgaW5kaXZpZHVhbCBwYW5lcy4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYWxsIGZvdXIgcGFuZXMgYnV0IG1ha2VzIG9ubHkgdGhlIG5lY2Vzc2FyeSBvbmVzIHZpc2libGUuCi0JICogRmluYWxseSBpdCBmZWVkcyB0aGUgY29tcGFyZSByZXN1bHQgaW50byB0aGUgdG9wIGxlZnQgc3RydWN0dXJlIHZpZXdlcgotCSAqIGFuZCB0aGUgY29udGVudCB2aWV3ZXIuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhleSBuZWVkIHRvIGNoYW5nZSB0aGUgbGF5b3V0IG9yIHdpcmluZyBiZXR3ZWVuIHBhbmVzLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wgdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgbXVzdCBiZSBjcmVhdGVkCi0JICogQHJldHVybiB0aGUgU1dUIGNvbnRyb2wgaGllcmFyY2h5IGZvciB0aGUgY29tcGFyZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJZkNvbXBvc2l0ZT0gbmV3IFNwbGl0dGVyKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJZkNvbXBvc2l0ZS5zZXREYXRhKHRoaXMpOwotCQkJCQotCQlDb250cm9sIG91dGxpbmU9IG51bGw7Ci0JCWlmICghZlVzZU91dGxpbmVWaWV3KQotCQkJb3V0bGluZT0gY3JlYXRlT3V0bGluZUNvbnRlbnRzKGZDb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJCQkJCi0JCWZDb250ZW50SW5wdXRQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoZkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKSB7Ci0JCQlwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpIHsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCQlyZXR1cm4gZmluZENvbnRlbnRWaWV3ZXIob2xkVmlld2VyLCAoSUNvbXBhcmVJbnB1dClpbnB1dCwgdGhpcyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCWlmIChmRm9jdXNQYW5lID09IG51bGwpCi0JCQlmRm9jdXNQYW5lPSBmQ29udGVudElucHV0UGFuZTsKLQkJaWYgKG91dGxpbmUgIT0gbnVsbCkKLQkJCWZDb21wb3NpdGUuc2V0VmlzaWJsZShvdXRsaW5lLCBmYWxzZSk7Ci0JCWZDb21wb3NpdGUuc2V0VmlzaWJsZShmQ29udGVudElucHV0UGFuZSwgdHJ1ZSk7Ci0JCQotCQlpZiAoZlN0cnVjdHVyZUlucHV0UGFuZSAhPSBudWxsKQotCQkJZkNvbXBvc2l0ZS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDMwLCA3MCB9KTsKLQkJCi0JCWZDb21wb3NpdGUubGF5b3V0KCk7Ci0KLQkJaWYgKGZTdHJ1Y3R1cmVJbnB1dFBhbmUgIT0gbnVsbCAmJiBmSW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlmU3RydWN0dXJlSW5wdXRQYW5lLnNldElucHV0KGZJbnB1dCk7Ci0JCQlJU2VsZWN0aW9uIHNlbD0gZlN0cnVjdHVyZUlucHV0UGFuZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWwgPT0gbnVsbCB8fCBzZWwuaXNFbXB0eSgpKQotCQkJCWZlZWQxKHNlbCk7CS8vIHdlIG9ubHkgZmVlZCBkb3duc3RyZWFtIHZpZXdlcnMgaWYgdGhlIHRvcCBsZWZ0IHBhbmUgaXMgZW1wdHkKLQkJfQotCQkKLQkJZkNvbXBvc2l0ZS5zZXREYXRhKCJOYXYiLCAvLyROT04tTkxTLTEkCi0JCQluZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmVbXSB7Ci0JCQkJZlN0cnVjdHVyZUlucHV0UGFuZSwKLQkJCQlmU3RydWN0dXJlUGFuZTEsCi0JCQkJZlN0cnVjdHVyZVBhbmUyLAotCQkJCWZDb250ZW50SW5wdXRQYW5lCi0JCQl9Ci0JCSk7Ci0JCi0JCXJldHVybiBmQ29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbCB1bmRlciB3aGljaCB0aGUgY29udHJvbCBtdXN0IGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gZGlyZWN0aW9uIHRoZSBsYXlvdXQgZGlyZWN0aW9uIG9mIHRoZSBjb250ZW50cywgZWl0aGVyIDwvY29kZT5TV1QuSE9SSVpPTlRBTDxjb2RlPiBvciA8L2NvZGU+U1dULlZFUlRJQ0FMPGNvZGU+IAotCSAqIEByZXR1cm4gdGhlIFNXVCBjb250cm9sIGhpZXJhcmNoeSBmb3IgdGhlIG91dGxpbmUgcGFydCBvZiB0aGUgY29tcGFyZSBlZGl0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlT3V0bGluZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBkaXJlY3Rpb24pIHsKLQkJZmluYWwgU3BsaXR0ZXIgaD0gbmV3IFNwbGl0dGVyKHBhcmVudCwgZGlyZWN0aW9uKTsKLQotCQlmU3RydWN0dXJlSW5wdXRQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoaCwgU1dULkJPUkRFUiB8IFNXVC5GTEFULCB0cnVlKSB7Ci0JCQlwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpIHsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWZmTm9kZSkgewotCQkJCQlEaWZmTm9kZSBkbj0gKERpZmZOb2RlKSBpbnB1dDsKLQkJCQkJaWYgKGRuLmhhc0NoaWxkcmVuKCkpCi0JCQkJCQlyZXR1cm4gY3JlYXRlRGlmZlZpZXdlcih0aGlzKTsKLQkJCQl9Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkJcmV0dXJuIGZpbmRTdHJ1Y3R1cmVWaWV3ZXIob2xkVmlld2VyLCAoSUNvbXBhcmVJbnB1dClpbnB1dCwgdGhpcyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCWZGb2N1c1BhbmU9IGZTdHJ1Y3R1cmVJbnB1dFBhbmU7Ci0JCQotCQlmU3RydWN0dXJlUGFuZTE9IG5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZShoLCBTV1QuQk9SREVSIHwgU1dULkZMQVQsIHRydWUpIHsKLQkJCXByb3RlY3RlZCBWaWV3ZXIgZ2V0Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIE9iamVjdCBpbnB1dCkgewotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCXJldHVybiBmaW5kU3RydWN0dXJlVmlld2VyKG9sZFZpZXdlciwgKElDb21wYXJlSW5wdXQpaW5wdXQsIHRoaXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQloLnNldFZpc2libGUoZlN0cnVjdHVyZVBhbmUxLCBmYWxzZSk7Ci0JCQotCQlmU3RydWN0dXJlUGFuZTI9IG5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZShoLCBTV1QuQk9SREVSIHwgU1dULkZMQVQsIHRydWUpIHsKLQkJCXByb3RlY3RlZCBWaWV3ZXIgZ2V0Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIE9iamVjdCBpbnB1dCkgewotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCXJldHVybiBmaW5kU3RydWN0dXJlVmlld2VyKG9sZFZpZXdlciwgKElDb21wYXJlSW5wdXQpaW5wdXQsIHRoaXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQloLnNldFZpc2libGUoZlN0cnVjdHVyZVBhbmUyLCBmYWxzZSk7Ci0JCQotCQkvLyBzZXR1cCB0aGUgd2lyaW5nIGZvciB0b3AgbGVmdCBwYW5lCi0JCWZTdHJ1Y3R1cmVJbnB1dFBhbmUuYWRkT3Blbkxpc3RlbmVyKAotCQkJbmV3IElPcGVuTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgb2UpIHsKLQkJCQkJZmVlZDEob2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZlN0cnVjdHVyZUlucHV0UGFuZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJCUlTZWxlY3Rpb24gcz0gZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHMgPT0gbnVsbCB8fCBzLmlzRW1wdHkoKSkKLQkJCQkJCWZlZWQxKHMpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZlN0cnVjdHVyZUlucHV0UGFuZS5hZGREb3VibGVDbGlja0xpc3RlbmVyKAotCQkJbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmVlZERlZmF1bHQxKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlmU3RydWN0dXJlUGFuZTEuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCQlmZWVkMihlLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0KLQkJZlN0cnVjdHVyZVBhbmUyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQkJZmVlZDMoZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkpOwkJCi0KLQkJaWYgKGZVc2VPdXRsaW5lVmlldykgewotCQkJaWYgKGZJbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCQlmU3RydWN0dXJlSW5wdXRQYW5lLnNldElucHV0KGZJbnB1dCk7Ci0JCQkJSVNlbGVjdGlvbiBzZWw9IGZTdHJ1Y3R1cmVJbnB1dFBhbmUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5pc0VtcHR5KCkpCi0JCQkJCWZlZWQxKHNlbCk7CS8vIHdlIG9ubHkgZmVlZCBkb3duc3RyZWFtIHZpZXdlcnMgaWYgdGhlIHRvcCBsZWZ0IHBhbmUgaXMgZW1wdHkKLQkJCX0KLQkJCQotCQkJZkNvbXBvc2l0ZS5zZXREYXRhKCJOYXYiLCAvLyROT04tTkxTLTEkCi0JCQkJbmV3IENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lW10gewotCQkJCQlmU3RydWN0dXJlSW5wdXRQYW5lLAotCQkJCQlmU3RydWN0dXJlUGFuZTEsCi0JCQkJCWZTdHJ1Y3R1cmVQYW5lMiwKLQkJCQkJZkNvbnRlbnRJbnB1dFBhbmUKLQkJCQl9Ci0JCQkpOwotCQl9Ci0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZlZWQxKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZDb21wb3NpdGUuZ2V0RGlzcGxheSgpLAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCU9iamVjdCBpbnB1dD0gZlN0cnVjdHVyZUlucHV0UGFuZS5nZXRJbnB1dCgpOwotCQkJCQkJZkNvbnRlbnRJbnB1dFBhbmUuc2V0SW5wdXQoaW5wdXQpOwotCQkJCQkJZlN0cnVjdHVyZVBhbmUyLnNldElucHV0KG51bGwpOyAvLyBjbGVhciBkb3duc3RyZWFtIHBhbmUKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMS5zZXRJbnB1dChudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU9iamVjdCBpbnB1dD0gZ2V0RWxlbWVudChzZWxlY3Rpb24pOwotCQkJCQkJZkNvbnRlbnRJbnB1dFBhbmUuc2V0SW5wdXQoaW5wdXQpOwotCQkJCQkJaWYgKHN0cnVjdHVyZUNvbXBhcmVPblNpbmdsZUNsaWNrKCkpCi0JCQkJCQkJZlN0cnVjdHVyZVBhbmUxLnNldElucHV0KGlucHV0KTsKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMi5zZXRJbnB1dChudWxsKTsgLy8gY2xlYXIgZG93bnN0cmVhbSBwYW5lCi0JCQkJCQlpZiAoZlN0cnVjdHVyZVBhbmUxLmdldElucHV0KCkgIT0gaW5wdXQpCi0JCQkJCQkJZlN0cnVjdHVyZVBhbmUxLnNldElucHV0KG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmVlZERlZmF1bHQxKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZDb21wb3NpdGUuZ2V0RGlzcGxheSgpLAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCQkJZlN0cnVjdHVyZVBhbmUxLnNldElucHV0KGdldEVsZW1lbnQoc2VsZWN0aW9uKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmVlZDIoZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkNvbXBvc2l0ZS5nZXREaXNwbGF5KCksCi0JCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJT2JqZWN0IGlucHV0PSBmU3RydWN0dXJlUGFuZTEuZ2V0SW5wdXQoKTsKLQkJCQkJCWZDb250ZW50SW5wdXRQYW5lLnNldElucHV0KGlucHV0KTsKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMi5zZXRJbnB1dChudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU9iamVjdCBpbnB1dD0gZ2V0RWxlbWVudChzZWxlY3Rpb24pOwotCQkJCQkJZkNvbnRlbnRJbnB1dFBhbmUuc2V0SW5wdXQoaW5wdXQpOwotCQkJCQkJZlN0cnVjdHVyZVBhbmUyLnNldElucHV0KGlucHV0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZlZWQzKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZDb21wb3NpdGUuZ2V0RGlzcGxheSgpLAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJCQlmQ29udGVudElucHV0UGFuZS5zZXRJbnB1dChmU3RydWN0dXJlUGFuZTIuZ2V0SW5wdXQoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZDb250ZW50SW5wdXRQYW5lLnNldElucHV0KGdldEVsZW1lbnQoc2VsZWN0aW9uKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGlmIHRoZSBzZWxlY3Rpb24gCi0JICogaXMgYSA8Y29kZT5JU3RydWN0dXJlZFNlbGVjdGlvbjwvY29kZT4gd2l0aCBleGFjdGx5IG9uZSBlbGVtZW50LiBSZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgc2VsZWN0aW9uCi0JICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2VsZWN0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRFbGVtZW50KElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3M9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHNzLnNpemUoKSA9PSAxKQotCQkJCXJldHVybiBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQXNrcyB0aGlzIGlucHV0IHRvIHRha2UgZm9jdXMgd2l0aGluIGl0cyBjb250YWluZXIgKGVkaXRvcikuCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QgYnV0IHRoZXkgbWF5Ci0JICogb3ZlcnJpZGUgaWYgdGhleSBpbXBsZW1lbnQgYSBkaWZmZXJlbnQgbGF5b3V0IHdpdGggZGlmZmVyZW50IHZpc3VhbAotCSAqIGNvbXBvbmVudHMuIENsaWVudHMgYXJlIGZyZWUgdG8gY2FsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChmRm9jdXNQYW5lICE9IG51bGwpIHsKLQkJCVZpZXdlciB2PSBmRm9jdXNQYW5lLmdldFZpZXdlcigpOwotCQkJaWYgKHYgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgYz0gdi5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGMgIT0gbnVsbCkKLQkJCQkJYy5zZXRGb2N1cygpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZDb21wb3NpdGUgIT0gbnVsbCkKLQkJCWZDb21wb3NpdGUuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgZGlmZmVyZW5jZXMgdmlld2VyIGZvciB0aGUgdG9wIGxlZnQgcGFuZS4KLQkgKiBJdCBpcyBjYWxsZWQgZnJvbSA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4gYW5kIHJldHVybnMgYSA8Y29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4uCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhleSBuZWVkIGEgZGlmZmVyZW50IHZpZXdlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgcGFyZW50IGNvbnRyb2wgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoZSB2aWV3ZXIncyBTV1QgY29udHJvbHMKLQkgKiBAcmV0dXJuIGEgY29tcGFyZSB2aWV3ZXIgZm9yIHRoZSB0b3AgbGVmdCBwYW5lCi0JICovCi0JcHVibGljIFZpZXdlciBjcmVhdGVEaWZmVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBEaWZmVHJlZVZpZXdlcihwYXJlbnQsIGZDb21wYXJlQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50cyB0aGUgZHluYW1pYyB2aWV3ZXIgc3dpdGNoaW5nIGZvciBzdHJ1Y3R1cmUgdmlld2Vycy4KLQkgKiBUaGUgbWV0aG9kIG11c3QgcmV0dXJuIGEgY29tcGFyZSB2aWV3ZXIgYmFzZWQgb24gdGhlIG9sZCAob3IgY3VycmVudCkgdmlld2VyCi0JICogYW5kIGEgbmV3IGlucHV0IG9iamVjdC4gSWYgdGhlIG9sZCB2aWV3ZXIgaXMgc3VpdGFibGUgZm9yIHNob3dpbmcgdGhlIG5ldyBpbnB1dCB0aGUgb2xkIHZpZXdlcgotCSAqIGNhbiBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlIGEgbmV3IHZpZXdlciBtdXN0IGJlIGNyZWF0ZWQgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBjYW4gYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBubyB2aWV3ZXIgY291bGQgYmUgZm91bmQuCi0JICogPHA+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkcyB0aGUgcmVxdWVzdCB0byA8Y29kZT5Db21wYXJlVUkuZmluZFN0cnVjdHVyZVZpZXdlcjwvY29kZT4uCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gaW1wbGVtZW50IGEgZGlmZmVyZW50IHN0cmF0ZWd5LgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb2xkVmlld2VyIGEgbmV3IHZpZXdlciBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhpcyBvbGQgdmlld2VyIGNhbm5vdCBzaG93IHRoZSBnaXZlbiBpbnB1dAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IGZvciB3aGljaCB0byBmaW5kIGEgc3RydWN0dXJlIHZpZXdlcgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29tcG9zaXRlIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGlzIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIGEgY29tcGFyZSB2aWV3ZXIgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHRoZSBnaXZlbiBpbnB1dCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGZpbmRTdHJ1Y3R1cmVWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgSUNvbXBhcmVJbnB1dCBpbnB1dCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gQ29tcGFyZVVJLmZpbmRTdHJ1Y3R1cmVWaWV3ZXIob2xkVmlld2VyLCBpbnB1dCwgcGFyZW50LCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudHMgdGhlIGR5bmFtaWMgdmlld2VyIHN3aXRjaGluZyBmb3IgY29udGVudCB2aWV3ZXJzLgotCSAqIFRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSBjb21wYXJlIHZpZXdlciBiYXNlZCBvbiB0aGUgb2xkIChvciBjdXJyZW50KSB2aWV3ZXIKLQkgKiBhbmQgYSBuZXcgaW5wdXQgb2JqZWN0LiBJZiB0aGUgb2xkIHZpZXdlciBpcyBzdWl0YWJsZSBmb3Igc2hvd2luZyB0aGUgbmV3IGlucHV0IHRoZSBvbGQgdmlld2VyCi0JICogY2FuIGJlIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgdmlld2VyIG11c3QgYmUgY3JlYXRlZCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGNhbiBiZSByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IG5vIHZpZXdlciBjb3VsZCBiZSBmb3VuZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGZvcndhcmRzIHRoZSByZXF1ZXN0IHRvIDxjb2RlPkNvbXBhcmVVSS5maW5kQ29udGVudFZpZXdlcjwvY29kZT4uCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gaW1wbGVtZW50IGEgZGlmZmVyZW50IHN0cmF0ZWd5LgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb2xkVmlld2VyIGEgbmV3IHZpZXdlciBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhpcyBvbGQgdmlld2VyIGNhbm5vdCBzaG93IHRoZSBnaXZlbiBpbnB1dAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IGZvciB3aGljaCB0byBmaW5kIGEgc3RydWN0dXJlIHZpZXdlcgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29tcG9zaXRlIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGlzIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIGEgY29tcGFyZSB2aWV3ZXIgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHRoZSBnaXZlbiBpbnB1dCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGZpbmRDb250ZW50Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIElDb21wYXJlSW5wdXQgaW5wdXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlWaWV3ZXIgbmV3Vmlld2VyPSBDb21wYXJlVUkuZmluZENvbnRlbnRWaWV3ZXIob2xkVmlld2VyLCBpbnB1dCwgcGFyZW50LCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24pOwotCQkKLQkJYm9vbGVhbiBpc05ld1ZpZXdlcj0gbmV3Vmlld2VyICE9IG9sZFZpZXdlcjsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBhcmVFZGl0b3JJbnB1dC5maW5kQ29udGVudFZpZXdlcjogIiArIGlzTmV3Vmlld2VyKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGlzTmV3Vmlld2VyICYmIG5ld1ZpZXdlciBpbnN0YW5jZW9mIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyKSB7Ci0JCQlmaW5hbCBJUHJvcGVydHlDaGFuZ2VOb3RpZmllciBkc3A9IChJUHJvcGVydHlDaGFuZ2VOb3RpZmllcikgbmV3Vmlld2VyOwotCQkJZHNwLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkRpcnR5U3RhdGVMaXN0ZW5lcik7Ci0JCQkKLQkJCUNvbnRyb2wgYz0gbmV3Vmlld2VyLmdldENvbnRyb2woKTsKLQkJCWMuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJCQlkc3AucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmRGlydHlTdGF0ZUxpc3RlbmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdWaWV3ZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcy4KLQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5ESVJUWV9TVEFURTwvY29kZT4gcHJvcGVydHkgb2YgdGhpcyBpbnB1dCBvYmplY3QuCi0JIAotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnB1dCBoYXMgdW5zYXZlZCBjaGFuZ2VzLAotCSAqIHRoYXQgaXMgaWYgPGNvZGU+c2V0RGlydHkodHJ1ZSk8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZC4KLQkgKiBTdWJjbGFzc2VzIGRvbid0IGhhdmUgdG8gb3ZlcnJpZGUgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgPGRvY2U+c2V0RGlydHk8L2NvZGU+Ci0JICogaXMgc3VmZmljaWVudC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCQlyZXR1cm4gZkRpcnR5IHx8IGZEaXJ0eVZpZXdlcnMuc2l6ZSgpID4gMDsKLQl9Ci0JCQotCS8qKgotCSAqIFNldHMgdGhlIGRpcnR5IHN0YXRlIG9mIHRoaXMgaW5wdXQgdG8gdGhlIGdpdmVuCi0JICogdmFsdWUgYW5kIHNlbmRzIG91dCBhIDxjb2RlPlByb3BlcnR5Q2hhbmdlRXZlbnQ8L2NvZGU+IGlmIHRoZSBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBvbGQgdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gZGlydHkgdGhlIGRpcnR5IHN0YXRlIGZvciB0aGlzIGNvbXBhcmUgaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGRpcnR5KSB7Ci0KLQkJYm9vbGVhbiBjb25maXJtU2F2ZT0gdHJ1ZTsKLQkJT2JqZWN0IG89IGZDb21wYXJlQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShDb21wYXJlRWRpdG9yLkNPTkZJUk1fU0FWRV9QUk9QRVJUWSk7Ci0JCWlmIChvIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCWNvbmZpcm1TYXZlPSAoKEJvb2xlYW4pbykuYm9vbGVhblZhbHVlKCk7Ci0KLQkJaWYgKCFjb25maXJtU2F2ZSkgewotCQkJZkRpcnR5PSBkaXJ0eTsKLQkJCWlmICghZkRpcnR5KQotCQkJCWZEaXJ0eVZpZXdlcnMuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RGlydHkoT2JqZWN0IHNvdXJjZSwgYm9vbGVhbiBkaXJ0eSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHNvdXJjZSk7Ci0JCWJvb2xlYW4gb2xkRGlydHk9IGZEaXJ0eVZpZXdlcnMuc2l6ZSgpID4gMDsKLQkJaWYgKGRpcnR5KQotCQkJZkRpcnR5Vmlld2Vycy5hZGQoc291cmNlKTsKLQkJZWxzZQotCQkJZkRpcnR5Vmlld2Vycy5yZW1vdmUoc291cmNlKTsKLQkJYm9vbGVhbiBuZXdEaXJ0eT0gZkRpcnR5IHx8IGZEaXJ0eVZpZXdlcnMuc2l6ZSgpID4gMDsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInNldERpcnR5KCIrc291cmNlKyIsICIrZGlydHkrIik6ICIgKyBuZXdEaXJ0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWlmIChvbGREaXJ0eSAhPSBuZXdEaXJ0eSkKLQkJCVV0aWxpdGllcy5maXJlUHJvcGVydHlDaGFuZ2UoZkxpc3RlbmVyTGlzdCwgdGhpcywgRElSVFlfU1RBVEUsIG5ldyBCb29sZWFuKG9sZERpcnR5KSwgbmV3IEJvb2xlYW4obmV3RGlydHkpKTsKLQl9CQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJZkxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJZkxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcy4KLQkgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdG8gc2F2ZSBhbnkgY2hhbmdlcy4KLQkgKgotCSAqIEBwYXJhbSBwbSBhbiA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPiB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzYXZlIG1heSB1c2UgdG8gc2hvdyBwcm9ncmVzcwotCSAqIEBkZXByZWNhdGVkIE92ZXJyaWRlIG1ldGhvZCBzYXZlQ2hhbmdlcyBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCS8qKgotCSAqIFNhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcy4KLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdG8gc2F2ZSBhbnkgY2hhbmdlcy4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHRyaWVzIHRvIGZsdXNoIGNoYW5nZXMgaW4gYWxsIHZpZXdlcnMgYnkKLQkgKiBjYWxsaW5nIDxjb2RlPklTYXZhYmxlLnNhdmU8L2NvZGU+IG9uIHRoZW0uCi0JICoKLQkgKiBAcGFyYW0gcG0gYW4gPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4gdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc2F2ZSBtYXkgdXNlIHRvIHNob3cgcHJvZ3Jlc3MKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNoYW5nZXMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy8gZmx1c2ggY2hhbmdlcyBpbiBhbnkgZGlydHkgdmlld2VyCi0JCWZsdXNoVmlld2VyKGZTdHJ1Y3R1cmVJbnB1dFBhbmUsIHBtKTsKLQkJZmx1c2hWaWV3ZXIoZlN0cnVjdHVyZVBhbmUxLCBwbSk7Ci0JCWZsdXNoVmlld2VyKGZTdHJ1Y3R1cmVQYW5lMiwgcG0pOwotCQlmbHVzaFZpZXdlcihmQ29udGVudElucHV0UGFuZSwgcG0pOwotCi0JCXNhdmUocG0pOwotCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmbHVzaFZpZXdlcihDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBwYW5lLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYW5lICE9IG51bGwpIHsKLQkJCVZpZXdlciB2PSBwYW5lLmdldFZpZXdlcigpOwotCQkJaWYgKHYgaW5zdGFuY2VvZiBJU2F2YWJsZSkKLQkJCQkoKElTYXZhYmxlKXYpLnNhdmUocG0pOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVVSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0ZTk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklSZXVzYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSUNvbXBhcmVJbnB1dDsKLQotCi0vKioKLSAqIFRoZSBjbGFzcyA8Y29kZT5Db21wYXJlVUk8L2NvZGU+IGRlZmluZXMgdGhlIGVudHJ5IHBvaW50IHRvIGluaXRpYXRlIGEgY29uZmlndXJhYmxlCi0gKiBjb21wYXJlIG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgcmVzb3VyY2VzLiBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJlCi0gKiBpcyBvcGVuZWQgaW50byBhIGNvbXBhcmUgZWRpdG9yIHdoZXJlIHRoZSBkZXRhaWxzIGNhbiBiZSBicm93c2VkIGFuZAotICogZWRpdGVkIGluIGR5bmFtaWNhbGx5IHNlbGVjdGVkIHN0cnVjdHVyZSBhbmQgY29udGVudCB2aWV3ZXJzLgotICogPHA+Ci0gKiBUaGUgQ29tcGFyZSBVSSBwcm92aWRlcyBhIHJlZ2lzdHJ5IGZvciBjb250ZW50IGFuZCBzdHJ1Y3R1cmUgY29tcGFyZSB2aWV3ZXJzLAotICogd2hpY2ggaXMgaW5pdGlhbGl6ZWQgZnJvbSBleHRlbnNpb25zIGNvbnRyaWJ1dGVkIHRvIGV4dGVuc2lvbiBwb2ludHMKLSAqIGRlY2xhcmVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbXBhcmVVSSB7Ci0JCi0JLyoqCi0JICogQ29tcGFyZSBQbHVnLWluIElEICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuY29tcGFyZSI8L2NvZGU+KS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEPSAib3JnLmVjbGlwc2UuY29tcGFyZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhlIENvbXBhcmUgUHJlZmVyZW5jZSBQYWdlCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVQcmVmZXJlbmNlUGFnZSI8L2NvZGU+KS4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9QQUdFX0lEPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlUHJlZmVyZW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZGlzYWJsZWQgaWNvbiBvZiB0aGUgJ05leHQnIHRvb2wgYmFyIGJ1dHRvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19EVE9PTF9ORVhUPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXBhcmVVSVBsdWdpbi5EVE9PTF9ORVhUKTsKLQkvKioKLQkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbm9ybWFsIGljb24gb2YgdGhlICdOZXh0JyB0b29sIGJhciBidXR0b24uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ1RPT0xfTkVYVD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihDb21wYXJlVUlQbHVnaW4uQ1RPT0xfTkVYVCk7Ci0JLyoqCi0JICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIHJvbGwtb3ZlciBpY29uIG9mIHRoZSAnTmV4dCcgdG9vbCBiYXIgYnV0dG9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VUT09MX05FWFQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcGFyZVVJUGx1Z2luLkVUT09MX05FWFQpOwotCQotCS8qKgotCSAqIEltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBkaXNhYmxlZCBpY29uIG9mIHRoZSAnUHJldmlvdXMnIHRvb2wgYmFyIGJ1dHRvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19EVE9PTF9QUkVWPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXBhcmVVSVBsdWdpbi5EVE9PTF9QUkVWKTsKLQkvKioKLQkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbm9ybWFsIGljb24gb2YgdGhlICdQcmV2aW91cycgdG9vbCBiYXIgYnV0dG9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NUT09MX1BSRVY9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcGFyZVVJUGx1Z2luLkNUT09MX1BSRVYpOwotCS8qKgotCSAqIEltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSByb2xsLW92ZXIgaWNvbiBvZiB0aGUgJ1ByZXZpb3VzJyB0b29sIGJhciBidXR0b24uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVRPT0xfUFJFVj0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihDb21wYXJlVUlQbHVnaW4uRVRPT0xfUFJFVik7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSB0aXRsZSBwcm9wZXJ0eSBvZiBhIGNvbXBhcmUgdmlld2VyLgotIAkgKiBJZiBhIHByb3BlcnR5IHdpdGggdGhpcyBuYW1lIGlzIHNldAotIAkgKiBvbiB0aGUgdG9wIGxldmVsIFNXVCBjb250cm9sIG9mIGEgdmlld2VyLCBpdCBpcyB1c2VkIGFzIGEgdGl0bGUgaW4gdGhlIHBhbmUncwotIAkgKiB0aXRsZSBiYXIuCi0gCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVfVklFV0VSX1RJVExFPSAib3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlVUkuQ29tcGFyZVZpZXdlclRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgQ29tcGFyZVVJKCkgewotCQkvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFic3RyYWN0VUlQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHBsdWctaW4ncyByZXNvdXJjZSBidW5kbGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tcGFyaXNvbiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGlucHV0IGFuZCBvcGVucyBhCi0JICogY29tcGFyZSBlZGl0b3Igb24gdGhlIHJlc3VsdCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSB3b3JrYmVuY2ggcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb24gd2hpY2ggdG8gb3BlbiB0aGUgY29tcGFyZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkNvbXBhcmVFZGl0b3IoQ29tcGFyZUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCW9wZW5Db21wYXJlRWRpdG9yT25QYWdlKGlucHV0LCBudWxsKTsKLQl9Ci0JCQkKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tcGFyaXNvbiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGlucHV0IGFuZCBvcGVucyBhCi0JICogY29tcGFyZSBlZGl0b3Igb24gdGhlIHJlc3VsdCBpbiB0aGUgZ2l2ZW4gd29ya2JlbmNoIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9uIHdoaWNoIHRvIG9wZW4gdGhlIGNvbXBhcmUgZWRpdG9yCi0JICogQHBhcmFtIHBhZ2UgdGhlIHdvcmtiZW5jaCBwYWdlIGluIHdoaWNoIHRvIG9wZW4gdGhlIGNvbXBhcmUgZWRpdG9yCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQ29tcGFyZUVkaXRvck9uUGFnZShDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJQ29tcGFyZVVJUGx1Z2luIHBsdWdpbj0gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKQotCQkJcGx1Z2luLm9wZW5Db21wYXJlRWRpdG9yKGlucHV0LCBwYWdlLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBhbmQKLQkgKiBzaG93cyB0aGUgcmVzdWx0IGluIHRoZSBnaXZlbiBlZGl0b3IuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9uIHdoaWNoIHRvIG9wZW4gdGhlIGNvbXBhcmUgZWRpdG9yCi0JICogQHBhcmFtIGVkaXRvciB0aGUgY29tcGFyZSBlZGl0b3IgdG8gcmV1c2Ugb3IgbnVsbCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXVzZUNvbXBhcmVFZGl0b3IoQ29tcGFyZUVkaXRvcklucHV0IGlucHV0LCBJUmV1c2FibGVFZGl0b3IgZWRpdG9yKSB7Ci0JCUNvbXBhcmVVSVBsdWdpbiBwbHVnaW49IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkKLQkJCXBsdWdpbi5vcGVuQ29tcGFyZUVkaXRvcihpbnB1dCwgbnVsbCwgZWRpdG9yKTsKLQl9Ci0JCQkKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tcGFyaXNvbiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGlucHV0IGFuZCBvcGVucyBhCi0JICogbW9kYWwgY29tcGFyZSBkaWFsb2cgb24gdGhlIHJlc3VsdC4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb24gd2hpY2ggdG8gb3BlbiB0aGUgY29tcGFyZSBkaWFsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkNvbXBhcmVEaWFsb2coQ29tcGFyZUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUNvbXBhcmVVSVBsdWdpbiBwbHVnaW49IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkKLQkJCXBsdWdpbi5vcGVuQ29tcGFyZURpYWxvZyhpbnB1dCk7Ci0JfQotCQkJCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0eXBlLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckltYWdlRGVzY3JpcHRvcihTdHJpbmcgdHlwZSwgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJQ29tcGFyZVVJUGx1Z2luLnJlZ2lzdGVySW1hZ2VEZXNjcmlwdG9yKHR5cGUsIGRlc2NyaXB0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhcmVkIGltYWdlIGZvciB0aGUgZ2l2ZW4gdHlwZSwgb3IgYSBnZW5lcmljIGltYWdlIGlmIG5vbmUKLQkgKiBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBJbWFnZXMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGlzcG9zZWQKLQkgKiBvZiB3aGVuIHRoaXMgcGx1Zy1pbiBzaHV0cyBkb3duLiBDYWxsZXJzIG11c3Qgbm90IGRpc3Bvc2Ugb2YgdGhlc2UKLQkgKiBpbWFnZXMgdGhlbXNlbHZlcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gdGhlIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlKHR5cGUpOwotCX0KLQkJCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBpbWFnZSBmb3IgYmVpbmcgZGlzcG9zZWQgd2hlbiB0aGlzIHBsdWctaW4gaXMgc2h1dGRvd24uCi0JICoKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIHJlZ2lzdGVyIGZvciBkaXNwb3NhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlT25TaHV0ZG93bihJbWFnZSBpbWFnZSkgewotCQlDb21wYXJlVUlQbHVnaW4uZGlzcG9zZU9uU2h1dGRvd24oaW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhcmVkIGltYWdlIGZvciB0aGUgZ2l2ZW4gYWRhcHRhYmxlLgotCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHF1ZXJpZXMgdGhlIGdpdmVuIGFkYXB0YWJsZQotCSAqIGZvciBpdHMgPGNvZGU+SVdvcmtiZW5jaEFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPiwgd2hpY2ggaXQKLQkgKiB1c2VzIHRvIGNyZWF0ZSBhbiBpbWFnZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgb25lLgotCSAqIDxwPgotCSAqIE5vdGU6IEltYWdlcyByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNwb3NlZAotCSAqIG9mIHdoZW4gdGhpcyBwbHVnLWluIHNodXRzIGRvd24uIENhbGxlcnMgbXVzdCBub3QgZGlzcG9zZSBvZiB0aGVzZQotCSAqIGltYWdlcyB0aGVtc2VsdmVzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGFibGUgdGhlIGFkYXB0YWJsZSBmb3Igd2hpY2ggdG8gZmluZCBhbiBpbWFnZQotCSAqIEByZXR1cm4gYW4gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgYWRhcHRhYmxlKSB7Ci0JCXJldHVybiBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2UoYWRhcHRhYmxlKTsKLQl9Ci0JCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdHJlYW0gbWVyZ2VyIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLgotCSAqIElmIG5vIHN0cmVhbSBtZXJnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGZvciB3aGljaCB0byBmaW5kIGEgc3RyZWFtIG1lcmdlcgotCSAqIEByZXR1cm4gYSBzdHJlYW0gbWVyZ2VyIGZvciB0aGUgZ2l2ZW4gdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiAgIHN0cmVhbSBtZXJnZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cmVhbU1lcmdlciBjcmVhdGVTdHJlYW1NZXJnZXIoSUNvbnRlbnRUeXBlIHR5cGUpIHsKLQkgICAgcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuY3JlYXRlU3RyZWFtTWVyZ2VyKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdHJlYW0gbWVyZ2VyIGZvciB0aGUgZ2l2ZW4gZmlsZSBleHRlbnNpb24uCi0JICogSWYgbm8gc3RyZWFtIG1lcmdlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmlsZSBleHRlbnNpb24gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cmVhbSBtZXJnZXIKLQkgKiBAcmV0dXJuIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICBzdHJlYW0gbWVyZ2VyIGhhcyBiZWVuIHJlZ2lzdGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJlYW1NZXJnZXIgY3JlYXRlU3RyZWFtTWVyZ2VyKFN0cmluZyB0eXBlKSB7Ci0JICAgIHJldHVybiBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmNyZWF0ZVN0cmVhbU1lcmdlcih0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RydWN0dXJlIGNvbXBhcmUgdmlld2VyIGJhc2VkIG9uIGFuIG9sZCB2aWV3ZXIgYW5kIGFuIGlucHV0IG9iamVjdC4KLQkgKiBJZiB0aGUgb2xkIHZpZXdlciBpcyBzdWl0YWJsZSBmb3Igc2hvd2luZyB0aGUgaW5wdXQsIHRoZSBvbGQgdmlld2VyCi0JICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGlucHV0J3MgdHlwZSBpcyB1c2VkIHRvIGZpbmQgYSB2aWV3ZXIgZGVzY3JpcHRvciBpbiB0aGUgcmVnaXN0cnkKLQkgKiB3aGljaCBpbiB0dXJuIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0dXJlIGNvbXBhcmUgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIElmIG5vIHZpZXdlciBkZXNjcmlwdG9yIGNhbiBiZSBmb3VuZCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBvbGRWaWV3ZXIgYSBuZXcgdmlld2VyIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGlzIG9sZCB2aWV3ZXIgY2Fubm90IHNob3cgdGhlIGdpdmVuIGlucHV0Ci0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3QgZm9yIHdoaWNoIHRvIGZpbmQgYSBzdHJ1Y3R1cmUgdmlld2VyCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb21wb3NpdGUgdW5kZXIgd2hpY2ggdGhlIG5ldyB2aWV3ZXIgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgY29uZmlndXJhdGlvbiB3aGljaCBpcyBwYXNzZWQgdG8gYSBuZXdseSBjcmVhdGVkIHZpZXdlcgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgdmlld2VyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBWaWV3ZXIgZmluZFN0cnVjdHVyZVZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBJQ29tcGFyZUlucHV0IGlucHV0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJCUNvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotCQlyZXR1cm4gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5maW5kU3RydWN0dXJlVmlld2VyKG9sZFZpZXdlciwgaW5wdXQsIHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBjb250ZW50IGNvbXBhcmUgdmlld2VyIGJhc2VkIG9uIGFuIG9sZCB2aWV3ZXIgYW5kIGFuIGlucHV0IG9iamVjdC4KLQkgKiBJZiB0aGUgb2xkIHZpZXdlciBpcyBzdWl0YWJsZSBmb3Igc2hvd2luZyB0aGUgaW5wdXQgdGhlIG9sZCB2aWV3ZXIKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBpbnB1dCdzIHR5cGUgaXMgdXNlZCB0byBmaW5kIGEgdmlld2VyIGRlc2NyaXB0b3IgaW4gdGhlIHJlZ2lzdHJ5Ci0JICogd2hpY2ggaW4gdHVybiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGNvbnRlbnQgY29tcGFyZSB2aWV3ZXIgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogSWYgbm8gdmlld2VyIGRlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIG9sZFZpZXdlciBhIG5ldyB2aWV3ZXIgaXMgb25seSBjcmVhdGVkIGlmIHRoaXMgb2xkIHZpZXdlciBjYW5ub3Qgc2hvdyB0aGUgZ2l2ZW4gaW5wdXQKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBmb3Igd2hpY2ggdG8gZmluZCBhIGNvbnRlbnQgdmlld2VyCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb21wb3NpdGUgdW5kZXIgd2hpY2ggdGhlIG5ldyB2aWV3ZXIgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgY29uZmlndXJhdGlvbiB3aGljaCBpcyBwYXNzZWQgdG8gYSBuZXdseSBjcmVhdGVkIHZpZXdlcgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgdmlld2VyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBWaWV3ZXIgZmluZENvbnRlbnRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgSUNvbXBhcmVJbnB1dCBpbnB1dCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCUNvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZmluZENvbnRlbnRWaWV3ZXIob2xkVmlld2VyLCBpbnB1dCwgcGFyZW50LCBjb25maWd1cmF0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbnRlbnQgY29tcGFyZSB2aWV3ZXIgYmFzZWQgb24gYW4gb2xkIHZpZXdlciBhbmQgYW4gaW5wdXQKLQkgKiBvYmplY3QuIElmIHRoZSBvbGQgdmlld2VyIGlzIHN1aXRhYmxlIGZvciBzaG93aW5nIHRoZSBpbnB1dCB0aGUgb2xkCi0JICogdmlld2VyIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGlucHV0J3MgdHlwZSBpcyB1c2VkIHRvIGZpbmQgYSB2aWV3ZXIKLQkgKiBkZXNjcmlwdG9yIGluIHRoZSByZWdpc3RyeSB3aGljaCBpbiB0dXJuIGlzIHVzZWQgdG8gY3JlYXRlIGEgY29udGVudAotCSAqIGNvbXBhcmUgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLiBJbiBvcmRlciB0byBkZXRlcm1pbmUKLQkgKiB0aGUgaW5wdXQncyB0eXBlLCB0aGUgaW5wdXQgbXVzdCBlaXRoZXIgaW1wbGVtZW50IElTdHJlYW1Db250ZW50QWNjZXNzb3IKLQkgKiBhbmQgSVR5cGVkRWxlbWVudCBvciBJQ29tcGFyZUlucHV0LiBJZiBubyB2aWV3ZXIgZGVzY3JpcHRvciBjYW4gYmUgZm91bmQKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBvbGRWaWV3ZXIgYSBuZXcgdmlld2VyIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGlzIG9sZCB2aWV3ZXIgY2Fubm90IHNob3cgdGhlIGdpdmVuIGlucHV0Ci0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3QgZm9yIHdoaWNoIHRvIGZpbmQgYSBjb250ZW50IHZpZXdlci4gTXVzdAotCSAqIGltcGxlbWVudCBlaXRoZXIgPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4gYW5kPGNvZGU+Ci0JICogSVR5cGVkRWxlbWVudDwvY29kZT4gb3IgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4uCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb21wb3NpdGUgdW5kZXIgd2hpY2ggdGhlIG5ldyB2aWV3ZXIgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgY29uZmlndXJhdGlvbiB3aGljaCBpcyBwYXNzZWQgdG8gYSBuZXdseSBjcmVhdGVkIHZpZXdlcgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgdmlld2VyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBWaWV3ZXIgZmluZENvbnRlbnRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkKLQkJcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZmluZENvbnRlbnRWaWV3ZXIob2xkVmlld2VyLCBpbnB1dCwgcGFyZW50LCBjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFsaWFzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIDxjb2RlPmZpbmRTdHJ1Y3R1cmVWaWV3ZXI8L2NvZGU+Ci0JICogdHJlYXQgYWxpYXMgYXMgYSBzeW5vbnltIGZvciB0eXBlIGFuZCByZXR1cm4gdGhlIHNhbWUgdmlld2VyLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZSBuYW1lIGZvciB3aGljaCBhIHZpZXdlciBoYXMgYmVlbiByZWdpc3RlcmVkCi0JICogQHBhcmFtIGFsaWFzIGEgdHlwZSBuYW1lIHdoaWNoIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3lub255bSBvZiB0eXBlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcyhTdHJpbmcgdHlwZSwgU3RyaW5nIGFsaWFzKSB7Ci0JCUNvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuYWRkU3RydWN0dXJlVmlld2VyQWxpYXModHlwZSwgYWxpYXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIGFsaWFzZXMgZm9yIHRoZSBnaXZlbiB0eXBlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhZmZlY3QKLQkgKiB0aGUgaW5pdGlhbCBiaW5kaW5nIGJldHdlZW4gdHlwZSBhbmQgdmlld2VyLiBJZiBubyBhbGlhc2VzIGV4aXN0IGZvciB0aGUKLQkgKiBnaXZlbiB0eXBlIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiAKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBuYW1lIGZvciB3aGljaCBhbGwgc3lub255bWVzIGFyZSByZW1vdmVkLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3RydWN0dXJlVmlld2VyQWxpYXNlcyhTdHJpbmcgdHlwZSkgewotCQlDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZUFsbFN0cnVjdHVyZVZpZXdlckFsaWFzZXModHlwZSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVWaWV3ZXJQYW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVWaWV3ZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOWE0OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlVmlld2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBhcmVWaWV3ZXJQYW5lPC9jb2RlPiBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGluc3RhbGxzIGEKLSAqIDxjb2RlPkNMYWJlbDwvY29kZT4gYW5kIGEgPGNvZGU+VG9vbGJhcjwvY29kZT4gaW4gYSA8Y29kZT5WaWV3Rm9ybTwvY29kZT4uCi0gKiA8UD4KLSAqIERvdWJsZSBjbGlja2luZyBvbnRvIHRoZSA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4ncyB0aXRsZSBiYXIgbWF4aW1pemVzCi0gKiB0aGUgPGNvZGU+Q29tcGFyZVZpZXdlclBhbmU8L2NvZGU+IHRvIHRoZSBzaXplIG9mIGFuIGVuY2xvc2luZyA8Y29kZT5TcGxpdHRlcjwvY29kZT4KLSAqIChpZiB0aGVyZSBpcyBvbmUpLgotICogSWYgbW9yZSA8Y29kZT5TcGxpdHRlcnM8L2NvZGU+IGFyZSBuZXN0ZWQgbWF4aW1pemluZyB3YWxrcyB1cCBhbmQKLSAqIG1heGltaXplcyB0byB0aGUgb3V0ZXJtb3N0IDxjb2RlPlNwbGl0dGVyPC9jb2RlPi4KLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZVZpZXdlclBhbmUgZXh0ZW5kcyBWaWV3Rm9ybSB7Ci0JCi0JcHJpdmF0ZSBUb29sQmFyTWFuYWdlciBmVG9vbEJhck1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotCSAqIGFuZCBhIHN0eWxlIHZhbHVlIGRlc2NyaWJpbmcgaXRzIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBjb250YWluZXIgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0JICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB3aWRnZXQgdG8gY29uc3RydWN0Ci0JICoKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFyZW50IGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLQkgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotCSAqIDwvdWw+Ci0JICovCQkKLQlwdWJsaWMgQ29tcGFyZVZpZXdlclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGNvbnRhaW5lciwgc3R5bGUpOwotCQkKLQkJbWFyZ2luV2lkdGg9IDA7Ci0JCW1hcmdpbkhlaWdodD0gMDsKLQkJCi0JCUNMYWJlbCBsYWJlbD0gbmV3IENMYWJlbCh0aGlzLCBTV1QuTk9ORSkgewotCQkJcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVNpemUod0hpbnQsIE1hdGgubWF4KDI0LCBoSGludCksIGNoYW5nZWQpOwotCQkJfQotCQl9OwotCQlzZXRUb3BMZWZ0KGxhYmVsKTsKLQkJCi0JCU1vdXNlQWRhcHRlciBtbD0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkJQ29udHJvbCBjb250ZW50PSBnZXRDb250ZW50KCk7Ci0JCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBjb250ZW50LmdldEJvdW5kcygpLmNvbnRhaW5zKGUueCwgZS55KSkKLQkJCQkJcmV0dXJuOwotCQkJCUNvbnRyb2wgcGFyZW50PSBnZXRQYXJlbnQoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU3BsaXR0ZXIpCi0JCQkJCSgoU3BsaXR0ZXIpcGFyZW50KS5zZXRNYXhpbWl6ZWRDb250cm9sKENvbXBhcmVWaWV3ZXJQYW5lLnRoaXMpOwotCQkJfQotCQl9OwkKLQkJCQkKLQkJYWRkTW91c2VMaXN0ZW5lcihtbCk7Ci0JCWxhYmVsLmFkZE1vdXNlTGlzdGVuZXIobWwpOwotCQkKLQkJYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmIChmVG9vbEJhck1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlmVG9vbEJhck1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWZUb29sQmFyTWFuYWdlcj0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHBhbmUncyB0aXRsZSB0ZXh0LgotCSAqIFRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBjbGVhcnMgaXQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsIHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgcGFuZSBvciBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbGFiZWwpIHsKLQkJQ0xhYmVsIGNsPSAoQ0xhYmVsKSBnZXRUb3BMZWZ0KCk7Ci0JCWlmIChjbCAhPSBudWxsKQotCQkJY2wuc2V0VGV4dChsYWJlbCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBwYW5lJ3MgdGl0bGUgSW1hZ2UuCi0JICogVGhlIHZhbHVlIDxjb2RlPm51bGw8L2NvZGU+IGNsZWFycyBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgcGFuZSBvciBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJQ0xhYmVsIGNsPSAoQ0xhYmVsKSBnZXRUb3BMZWZ0KCk7Ci0JCWlmIChjbCAhPSBudWxsKQotCQkJY2wuc2V0SW1hZ2UoaW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgPGNvZGU+VG9vbEJhck1hbmFnZXI8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXJlbnQgaXMgYQotCSAqIDxjb2RlPkNvbXBhcmVWaWV3ZXJQYW5lPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+VG9vbEJhck1hbmFnZXI8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXJlbnQgaXMgYSA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4gb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBUb29sQmFyTWFuYWdlciBnZXRUb29sQmFyTWFuYWdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb21wYXJlVmlld2VyUGFuZSkgewotCQkJQ29tcGFyZVZpZXdlclBhbmUgcGFuZT0gKENvbXBhcmVWaWV3ZXJQYW5lKSBwYXJlbnQ7Ci0JCQlyZXR1cm4gcGFuZS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0b29sIGl0ZW1zIGluIHRoZSA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4ncyBjb250cm9sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclRvb2xCYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUb29sQmFyTWFuYWdlciB0Ym09IGdldFRvb2xCYXJNYW5hZ2VyKHBhcmVudCk7Ci0JCWlmICh0Ym0gIT0gbnVsbCkgewotCQkJdGJtLnJlbW92ZUFsbCgpOwotCQkJdGJtLnVwZGF0ZSh0cnVlKTsKLQkJfQotCX0KLQkKLQkvLy0tLS0gcHJpdmF0ZSBzdHVmZgotCQotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbEJhck1hbmFnZXIoKSB7Ci0JCWlmIChmVG9vbEJhck1hbmFnZXIgPT0gbnVsbCkgewotCQkJVG9vbEJhciB0Yj0gbmV3IFRvb2xCYXIodGhpcywgU1dULkZMQVQpOwotCQkJc2V0VG9wQ2VudGVyKHRiKTsKLQkJCWZUb29sQmFyTWFuYWdlcj0gbmV3IFRvb2xCYXJNYW5hZ2VyKHRiKTsKLQkJfQotCQlyZXR1cm4gZlRvb2xCYXJNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlOGQxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklDb21wYXJlSW5wdXQ7Ci0KLQotLyoqCi0gKiBBIGN1c3RvbSA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4gdGhhdCBzdXBwb3J0cyBkeW5hbWljIHZpZXdlciBzd2l0Y2hpbmcuCi0gKiAKLSAqIDxwPgotICogQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGUgdmlld2VyIHN3aXRjaGluZyBzdHJhdGVneSBieSBpbXBsZW1lbnRpbmcKLSAqIHRoZSA8Y29kZT5nZXRWaWV3ZXIoVmlld2VyLCBPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiA8cD4KLSAqIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgbmFtZSA8Y29kZT5Db21wYXJlVUkuQ09NUEFSRV9WSUVXRVJfVElUTEU8L2NvZGU+IGlzIHNldAotICogb24gdGhlIHRvcCBsZXZlbCBTV1QgY29udHJvbCBvZiBhIHZpZXdlciwgaXQgaXMgdXNlZCBhcyBhIHRpdGxlIGluIHRoZSA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4ncwotICogdGl0bGUgYmFyLgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBleHRlbmRzIENvbXBhcmVWaWV3ZXJQYW5lCi0JCQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElEb3VibGVDbGlja0xpc3RlbmVyIHsKLQkKLQlwcml2YXRlIFZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgT2JqZWN0IGZJbnB1dDsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmU2VsZWN0aW9uTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkRvdWJsZUNsaWNrTGlzdGVuZXI9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmT3Blbkxpc3RlbmVyPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb250cm9sVmlzaWJpbGl0eT0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRpdGxlOwotCXByaXZhdGUgU3RyaW5nIGZUaXRsZUFyZ3VtZW50OwotCQotCXByaXZhdGUgSU9wZW5MaXN0ZW5lciBmT3BlbkhhbmRsZXI9IG5ldyBJT3Blbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKE9wZW5FdmVudCBldmVudCkgewotCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmT3Blbkxpc3RlbmVyLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKLQkJCQkoKElPcGVuTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkub3BlbihldmVudCk7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5Db21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZTwvY29kZT4gYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50IGFuZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBTV1Qgc3R5bGUgYml0cy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgYSB3aWRnZXQgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotCSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2Ygd2lkZ2V0IHRvIGNvbnN0cnVjdAotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLQkgKiA8L3VsPgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLQkgKiA8L3VsPgotCSAqLwkJCi0JcHVibGljIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzKHBhcmVudCwgc3R5bGUsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkNvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lPC9jb2RlPiBhcyBhIGNoaWxkIG9mIHRoZSBnaXZlbiBwYXJlbnQgYW5kIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIFNXVCBzdHlsZSBiaXRzLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0JICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB3aWRnZXQgdG8gY29uc3RydWN0Ci0JICogQHBhcmFtIHZpc2liaWxpdHkgdGhlIGluaXRpYWwgdmlzaWJpbGl0eSBvZiB0aGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUKLQkgKgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLQkgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0JICogPC91bD4KLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0JICogPC91bD4KLQkgKi8JCQotCXB1YmxpYyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGJvb2xlYW4gdmlzaWJpbGl0eSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlmQ29udHJvbFZpc2liaWxpdHk9IHZpc2liaWxpdHk7Ci0JCQotCQlzZXRWaWV3ZXIobmV3IE51bGxWaWV3ZXIodGhpcykpOwotCQkKLQkJYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCQlpZiAoZlZpZXdlciAhPSBudWxsKQotCQkJCQkJZlZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUudGhpcyk7Ci0JCQkJCWlmIChmVmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCQkJU3RydWN0dXJlZFZpZXdlciBzdj0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQkJCQlzdi5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lLnRoaXMpOwotCQkJCQkJc3YucmVtb3ZlT3Blbkxpc3RlbmVyKGZPcGVuSGFuZGxlcik7Ci0JCQkJCX0KLQkJCQkJZlZpZXdlcj0gbnVsbDsKLQkJCQkJZklucHV0PSBudWxsOwotCQkJCQlmU2VsZWN0aW9uTGlzdGVuZXJzPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIGZWaWV3ZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRWaWV3ZXIoVmlld2VyIG5ld1ZpZXdlcikgewotCQkKLQkJaWYgKG5ld1ZpZXdlciA9PSBmVmlld2VyKQotCQkJcmV0dXJuOwotCQkJCQotCQlib29sZWFuIG9sZEVtcHR5PSBpc0VtcHR5KCk7Ci0KLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCkgewotCQkJCi0JCQlmVmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCQkgCi0JCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHN2PSAoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcjsKLQkJCQlzdi5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQkJCXN2LnJlbW92ZU9wZW5MaXN0ZW5lcihmT3BlbkhhbmRsZXIpOwotCQkJfQotCi0JCQlDb250cm9sIGNvbnRlbnQ9IGdldENvbnRlbnQoKTsKLQkJCXNldENvbnRlbnQobnVsbCk7Ci0JCQkKLQkJCWZWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQkJCQkJCQotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiAhY29udGVudC5pc0Rpc3Bvc2VkKCkpCi0JCQkJY29udGVudC5kaXNwb3NlKCk7Ci0KLQkJfSBlbHNlCi0JCQlvbGRFbXB0eT0gZmFsc2U7CQkJCi0JCXNldENvbnRlbnQobnVsbCk7Ci0KLQkJZlZpZXdlcj0gbmV3Vmlld2VyOwotCi0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCS8vIHdlIGhhdmUgdG8gcmVtZW1iZXIgYW5kIHJlc3RvcmUgdGhlIG9sZCB2aXNpYmlsaXR5IG9mIHRoZSBDdXN0b21QYW5lCi0JCQkvLyBzaW5jZSBzZXRDb250ZW50IGNoYW5nZXMgdGhlIHZpc2liaWxpdHkKLQkJCWJvb2xlYW4gb2xkPSBnZXRWaXNpYmxlKCk7Ci0JCQlzZXRDb250ZW50KGZWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJCXNldFZpc2libGUob2xkKTsJLy8gcmVzdG9yZSBvbGQgdmlzaWJpbGl0eQotCi0JCQlib29sZWFuIG5ld0VtcHR5PSBpc0VtcHR5KCk7Ci0KLQkJCWZWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHN2PSAoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcjsKLQkJCQlzdi5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQkJCXN2LmFkZE9wZW5MaXN0ZW5lcihmT3BlbkhhbmRsZXIpOwotCQkJfQotCQkJCi0JCQlpZiAob2xkRW1wdHkgIT0gbmV3RW1wdHkpIHsJLy8gcmVsYXlvdXQgbXkgY29udGFpbmVyCi0JCQkJQ29tcG9zaXRlIHBhcmVudD0gZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNwbGl0dGVyKQotCQkJCQkoKFNwbGl0dGVyKXBhcmVudCkuc2V0VmlzaWJsZSh0aGlzLCBmQ29udHJvbFZpc2liaWxpdHkgPyAhbmV3RW1wdHkgOiB0cnVlKTsKLQkJCX0KLQkJCQkKLQkJCWxheW91dCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIHRpdGxlIGFyZ3VtZW50IHRoYXQgaGFzIGJlZW4gc2V0IHdpdGggPGNvZGU+c2V0VGl0ZWxBcmd1bWVudDwvY29kZT4KLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25hbCB0aXRsZSBhcmd1bWVudCBoYXMgYmVlbiBzZXQuCi0JICogPHA+Ci0JICogTm90ZTogdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHRpb25hbCB0aXRsZSBhcmd1bWVudCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGVBcmd1bWVudCgpIHsKLQkJcmV0dXJuIGZUaXRsZUFyZ3VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbm8gdmlld2VyIGlzIGluc3RhbGxlZCBvciBpZiB0aGUgY3VycmVudCB2aWV3ZXIKLQkgKiBpcyBhIDxjb2RlPk51bGxWaWV3ZXI8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbm8gdmlld2VyIGlzIGluc3RhbGxlZCBvciBpZiB0aGUgY3VycmVudCB2aWV3ZXIgaXMgYSA8Y29kZT5OdWxsVmlld2VyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmVmlld2VyID09IG51bGwgfHwgZlZpZXdlciBpbnN0YW5jZW9mIE51bGxWaWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCkgewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLmFkZChsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsKSB7Ci0JCWZTZWxlY3Rpb25MaXN0ZW5lcnMucmVtb3ZlKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbCkgewotCQlmRG91YmxlQ2xpY2tMaXN0ZW5lci5hZGQobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBsKSB7Ci0JCWZEb3VibGVDbGlja0xpc3RlbmVyLnJlbW92ZShsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRPcGVuTGlzdGVuZXIoSU9wZW5MaXN0ZW5lciBsKSB7Ci0JCWZPcGVuTGlzdGVuZXIuYWRkKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU9wZW5MaXN0ZW5lcihJT3Blbkxpc3RlbmVyIGwpIHsKLQkJZk9wZW5MaXN0ZW5lci5yZW1vdmUobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZEb3VibGVDbGlja0xpc3RlbmVyLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQotCQkJKChJRG91YmxlQ2xpY2tMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5kb3VibGVDbGljayhldmVudCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoZlZpZXdlciAhPSBudWxsKQotCQkJcmV0dXJuIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHMpIHsKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCkKLQkJCSBmVmlld2VyLnNldFNlbGVjdGlvbihzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldikgewotCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZTZWxlY3Rpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspCi0JCQkoKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkuc2VsZWN0aW9uQ2hhbmdlZChldik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb2N1czIoKSB7Ci0JCS8vIGRvIHdlIGhhdmUgZm9jdXM/Ci0JCURpc3BsYXkgZGlzcGxheT0gZ2V0RGlzcGxheSgpOwotCQlpZiAoZGlzcGxheSAhPSBudWxsKQotCQkJZm9yIChDb250cm9sIGZvY3VzPSBkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOyBmb2N1cyAhPSBudWxsOyBmb2N1cz0gZm9jdXMuZ2V0UGFyZW50KCkpCi0JCQkJaWYgKGZvY3VzID09IHRoaXMpCi0JCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhpcyBwYW5lLiAKLQkgKiBGb3IgdGhpcyBpbnB1dCBvYmplY3QgYSBzdWl0YWJsZSB2aWV3ZXIgaXMgZGV0ZXJtaW5lZCBieSBjYWxsaW5nIHRoZSBhYnN0cmFjdAotCSAqIG1ldGhvZCA8Y29kZT5nZXRWaWV3ZXIoVmlld2VyLCBPYmplY3QpPC9jb2RlPi4KLQkgKiBJZiB0aGUgcmV0dXJuZWQgdmlld2VyIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUsIHRoZSBvbGQgdmlld2VyCi0JICogaXMgZGlzcG9zZWQgYW5kIHRoZSBuZXcgb25lIGluc3RhbGxlZC4gVGhlbiB0aGUgaW5wdXQgb2JqZWN0IGlzIGZlZAotCSAqIGludG8gdGhlIG5ld2x5IGluc3RhbGxlZCB2aWV3ZXIgYnkgY2FsbGluZyBpdHMgPGNvZGU+c2V0SW5wdXQoT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotCSAqIElmIG5ldyBhbmQgb2xkIHZpZXdlciBkb24ndCBkaWZmZXIgbm8gbmV3IHZpZXdlciBpcyBpbnN0YWxsZWQgYnV0IGp1c3QKLQkgKiA8Y29kZT5zZXRJbnB1dChPYmplY3QpPC9jb2RlPiBpcyBjYWxsZWQuCi0JICogSWYgdGhlIGlucHV0IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBwYW5lIGlzIGNsZWFyZWQsCi0JICogdGhhdCBpcyB0aGUgY3VycmVudCB2aWV3ZXIgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGlucHV0IHRoZSBuZXcgaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovIAotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCi0JCWlmIChmSW5wdXQgPT0gaW5wdXQpCi0JCQlyZXR1cm47Ci0JCQkKLQkJYm9vbGVhbiBoYWRGb2N1cz0gaGFzRm9jdXMyKCk7Ci0JCQotCQlmSW5wdXQ9IGlucHV0OwotCi0JCS8vIHZpZXdlciBzd2l0Y2hpbmcKLQkJVmlld2VyIG5ld1ZpZXdlcj0gbnVsbDsKLQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQluZXdWaWV3ZXI9IGdldFZpZXdlcihmVmlld2VyLCBpbnB1dCk7Ci0KLQkJaWYgKG5ld1ZpZXdlciA9PSBudWxsKSB7Ci0JCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIE51bGxWaWV3ZXIpCi0JCQkJcmV0dXJuOwotCQkJbmV3Vmlld2VyPSBuZXcgTnVsbFZpZXdlcih0aGlzKTsKLQkJfQotCQkKLQkJc2V0Vmlld2VyKG5ld1ZpZXdlcik7Ci0KLQkJLy8gc2V0IGlucHV0Ci0JCWZWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCi0JCUltYWdlIGltYWdlPSBudWxsOwotCQlpZiAoIShmVmlld2VyIGluc3RhbmNlb2YgTnVsbFZpZXdlcikgJiYgaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJaW1hZ2U9ICgoSUNvbXBhcmVJbnB1dClpbnB1dCkuZ2V0SW1hZ2UoKTsKLQkJc2V0SW1hZ2UoaW1hZ2UpOwotCQkKLQkJU3RyaW5nIHRpdGxlPSBudWxsOwkKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCkgewotCQkJQ29udHJvbCBjPSBmVmlld2VyLmdldENvbnRyb2woKTsKLQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlPYmplY3QgZGF0YT0gYy5nZXREYXRhKENvbXBhcmVVSS5DT01QQVJFX1ZJRVdFUl9USVRMRSk7Ci0JCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJCXRpdGxlPSAoU3RyaW5nKSBkYXRhOwotCQkJCWlmIChoYWRGb2N1cykKLQkJCQkJYy5zZXRGb2N1cygpOwotCQkJfQkKLQkJfQotCQkJCi0JCWZUaXRsZT0gdGl0bGU7Ci0JCXVwZGF0ZVRpdGxlKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgYW4gYWRkaXRpb25hbCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgZm9yIHRoZSBwYW5lJ3MgdGl0bGUuCi0JICogTm90ZTogdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiAgCi0JICogQHBhcmFtIGFyZ3VtZW50IGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGUgcGFuZSdzIHRpdGxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGVBcmd1bWVudChTdHJpbmcgYXJndW1lbnQpIHsKLQkJZlRpdGxlQXJndW1lbnQ9IGFyZ3VtZW50OwotCQl1cGRhdGVUaXRsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZSgpIHsKLQkJaWYgKGZUaXRsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZlRpdGxlQXJndW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmb3JtYXQ9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lLlRpdGxlZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdD0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10geyBmVGl0bGUsIGZUaXRsZUFyZ3VtZW50IH0gKTsKLQkJCQlzZXRUZXh0KHQpOwotCQkJfSBlbHNlCi0JCQkJc2V0VGV4dChmVGl0bGUpOwkJCQotCQl9IGVsc2UgewotCQkJc2V0VGV4dCgiIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgaW5wdXQgb2YgdGhpcyBwYW5lIG9yIG51bGwgaWYgdGhlIHBhbmUgaGFzIG5vIGlucHV0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB0aGF0IGlzIHRoZSBpbnB1dCB0byB0aGlzIHBhbmUgb3IgbnVsbCBpZiB0aGUgcGFuZSBoYXMgbm8gaW5wdXQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGZJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmlld2VyIHdoaWNoIGlzIGFibGUgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gaW5wdXQuCi0JICogSWYgbm8gdmlld2VyIGNhbiBiZSBmb3VuZCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogVGhlIGFkZGl0aW9uYWwgYXJndW1lbnQgb2xkVmlld2VyIHJlcHJlc2VudHMgdGhlIHZpZXdlciBjdXJyZW50bHkgaW5zdGFsbGVkCi0JICogaW4gdGhlIHBhbmUgKG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHZpZXdlciBpcyBpbnN0YWxsZWQpLgotCSAqIEl0IGNhbiBiZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGlmIHRoZSBjdXJyZW50IHZpZXdlciBjYW4gZGVhbCB3aXRoIHRoZQotCSAqIGlucHV0IChhbmQgbm8gbmV3IHZpZXdlciBtdXN0IGJlIGNyZWF0ZWQpLgotCSAqCi0JICogQHBhcmFtIG9sZFZpZXdlciB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2aWV3ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBmb3Igd2hpY2ggYSB2aWV3ZXIgbXVzdCBiZSBkZXRlcm1pbmVkIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhIHZpZXdlciBmb3IgdGhlIGdpdmVuIGlucHV0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB2aWV3ZXIgY2FuIGJlIGRldGVybWluZWQKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9FZGl0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0VkaXRpb25TZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMjA2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0VkaXRpb25TZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuKjsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHdoZXJlIG9uZSBpbnB1dCBlbGVtZW50IGNhbiBiZSBjb21wYXJlZCBhZ2FpbnN0Ci0gKiBhIGxpc3Qgb2YgaGlzdG9yaWMgdmFyaWFudHMgKGVkaXRpb25zKSBvZiB0aGUgc2FtZSBpbnB1dCBlbGVtZW50LgotICogVGhlIGRpYWxvZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgZnVuY3Rpb25zIGxpa2UgIkNvbXBhcmUvUmVwbGFjZSB3aXRoIFZlcnNpb24iIG9yCi0gKiAiQ29tcGFyZS9SZXBsYWNlIGZyb20gTG9jYWwgSGlzdG9yeSIgb24gd29ya3NwYWNlIHJlc291cmNlcy4KLSAqIDxwPgotICogSW4gYWRkaXRpb24gaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhIHN1YnNlY3Rpb24gb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAqIChlLmcuIGEgbWV0aG9kIGluIGEgSmF2YSBzb3VyY2UgZmlsZSkgYnkgbWVhbnMgb2YgYSAicGF0aCIuCi0gKiBJbiB0aGlzIGNhc2UgdGhlIGRpYWxvZyBjb21wYXJlcyBvbmx5IHRoZSBzdWJzZWN0aW9uIChhcyBzcGVjaWZpZWQgYnkgdGhlIHBhdGgpCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHN1YnNlY3Rpb24gaW4gdGhlIGxpc3Qgb2YgZWRpdGlvbnMuCi0gKiBPbmx5IHRob3NlIGVkaXRpb25zIGFyZSBzaG93biB3aGVyZSB0aGUgc3Vic2VjdGlvbiBkaWZmZXJzIGZyb20gdGhlIHNhbWUgc3Vic2VjdGlvbiBpbgotICogYW5vdGhlciBlZGl0aW9uIHRoZXJlYnkgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mIHByZXNlbnRlZCB2YXJpYW50cy4KLSAqIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgIlJlcGxhY2UgZnJvbSBMb2NhbCBIaXN0b3J5IgotICogZm9yIHRoZSBKYXZhIGxhbmd1YWdlLgotICogPHA+Ci0gKiBTdWJzZWN0aW9ucyBvZiBhbiBpbnB1dCBlbGVtZW50IGFyZSBkZXRlcm1pbmVkIGJ5IGZpcnN0IGZpbmRpbmcgYW4KLSAqIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPiBmb3IgdGhlIGlucHV0J3MgdHlwZS4KLSAqIFRoZW4gdGhlIG1ldGhvZCA8Y29kZT5sb2NhdGU8L2NvZGU+IGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgc3Vic2VjdGlvbi4KLSAqIDxwPgotICogRWFjaCBlZGl0aW9uICh2YXJpYW50IGluIHRoZSBsaXN0IG9mIHZhcmlhbnRzKSBtdXN0IGltcGxlbWVudCB0aGUgPGNvZGU+SU1vZGlmaWNhdGlvbkRhdGU8L2NvZGU+IGludGVyZmFjZQotICogc28gdGhhdCB0aGUgZGlhbG9nIGNhbiBzb3J0IHRoZSBlZGl0aW9ucyBhbmQgcHJlc2VudCB0aGVtIGluIGEgdHJlZSBzdHJ1Y3R1cmUgd2hlcmUgZXZlcnkKLSAqIG5vZGUgY29ycmVzcG9uZHMgb25lIGRheS4KLSAqIDxwPgotICogVGhlIGZ1bmN0aW9uYWxpdHkgaXMgc3VyZmFjZWQgaW4gYSBzaW5nbGUgZnVuY3Rpb24gPGNvZGU+c2VsZWN0RWRpdGlvbjwvY29kZT4uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3M7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICoKLSAqIEBzZWUgSU1vZGlmaWNhdGlvbkRhdGUKLSAqIEBzZWUgSVR5cGVkRWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGlvblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFJlc2l6YWJsZURpYWxvZyB7Ci0JCQotCS8qKgotCSAqIEFuIGl0ZW0gaW4gYW4gdW5kZXJseWluZyBlZGl0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhaXIgewotCQkKLQkJcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZFZGl0aW9uOwotCQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZkl0ZW07Ci0JCXByaXZhdGUgU3RyaW5nIGZDb250ZW50OwotCQlwcml2YXRlIElTdHJ1Y3R1cmVDcmVhdG9yIGZTdHJ1Y3R1cmVDcmVhdG9yOwotCQlwcml2YXRlIGJvb2xlYW4gZkhhc0Vycm9yPSBmYWxzZTsKLQkJCQkKLQkJUGFpcihJU3RydWN0dXJlQ3JlYXRvciBzdHJ1Y3R1cmVDcmVhdG9yLCBJVHlwZWRFbGVtZW50IGVkaXRpb24sIElUeXBlZEVsZW1lbnQgaXRlbSkgewotCQkJZlN0cnVjdHVyZUNyZWF0b3I9IHN0cnVjdHVyZUNyZWF0b3I7Ci0JCQlmRWRpdGlvbj0gZWRpdGlvbjsKLQkJCWZJdGVtPSBpdGVtOwotCQl9Ci0JCQotCQlQYWlyKElTdHJ1Y3R1cmVDcmVhdG9yIHN0cnVjdHVyZUNyZWF0b3IsIElUeXBlZEVsZW1lbnQgZWRpdGlvbikgewotCQkJdGhpcyhzdHJ1Y3R1cmVDcmVhdG9yLCBlZGl0aW9uLCBlZGl0aW9uKTsKLQkJfQotCQkKLQkJSVR5cGVkRWxlbWVudCBnZXRFZGl0aW9uKCkgewotCQkJcmV0dXJuIGZFZGl0aW9uOwotCQl9Ci0KLQkJSVR5cGVkRWxlbWVudCBnZXRJdGVtKCkgewotCQkJcmV0dXJuIGZJdGVtOwotCQl9Ci0JCQotCQkvKgotCQkgKiBUaGUgY29udGVudCBpcyBsYXppbHkgbG9hZGVkCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50KCkgewotCQkJaWYgKGZDb250ZW50ID09IG51bGwpIHsKLQkJCQlpZiAoZlN0cnVjdHVyZUNyZWF0b3IgIT0gbnVsbCkKLQkJCQkJZkNvbnRlbnQ9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldENvbnRlbnRzKGZJdGVtLCBmYWxzZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChmSXRlbSBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCQkJCUlTdHJlYW1Db250ZW50QWNjZXNzb3Igc2NhPSAoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgZkl0ZW07Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZDb250ZW50PSBVdGlsaXRpZXMucmVhZFN0cmluZyhzY2EpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJCS8vIE5lZWRXb3JrCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZDb250ZW50ID09IG51bGwpCi0JCQkJCWZDb250ZW50PSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZDb250ZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCQlpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlci5nZXRDbGFzcygpID09IGdldENsYXNzKCkpIHsKLQkJCQlpZiAoZ2V0Q29udGVudCgpLmVxdWFscygoKFBhaXIpb3RoZXIpLmdldENvbnRlbnQoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcik7Ci0JCX0KLQl9Ci0JCi0JLy8gQ29uZmlndXJhdGlvbiBvcHRpb25zCi0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZkFycmF5TGlzdD0gbmV3IEFycmF5TGlzdCgpOwotCS8qKiB1c2UgYSBzaWRlLWJ5LXNpZGUgY29tcGFyZSB2aWV3ZXIgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkNvbXBhcmU9IHRydWU7Ci0JLyoqIHNob3cgdGFyZ2V0IG9uIHJpZ2h0IGhhbmQgc2lkZSAqLwotCXByaXZhdGUgYm9vbGVhbiBmVGFyZ2V0SXNSaWdodD0gZmFsc2U7Ci0JLyoqIGhpZGUgZW50cmllcyB3aGljaCBoYXZlIGlkZW50aWNhbCBjb250ZW50ICovCi0JcHJpdmF0ZSBib29sZWFuIGZIaWRlSWRlbnRpY2FsPSB0cnVlOwotCS8qKiBhZGQgbW9kZSBpZiB0cnVlLCBvdGhlcndpc2UgcmVwbGFjZSBtb2RlICovCi0JcHJpdmF0ZSBib29sZWFuIGZBZGRNb2RlPSBmYWxzZTsKLQkvKiogY29tcGFyZSBtb2RlIGlmIHRydWUsIG90aGVyd2lzZSByZXBsYWNlL2FkZCBtb2RlICovCi0JcHJpdmF0ZSBib29sZWFuIGZDb21wYXJlTW9kZT0gZmFsc2U7Ci0JLyoqIHBlcmZvcm0gc3RydWN0dXJlIGNvbXBhcmUgb24gZWRpdGlvbnMgKi8KLQlwcml2YXRlIGJvb2xlYW4gZlN0cnVjdHVyZUNvbXBhcmU9IGZhbHNlOwotCS8qKiBhbGxvdyBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uICovCi0JcHJpdmF0ZSBib29sZWFuIGZNdWx0aVNlbGVjdD0gZmFsc2U7Ci0JCi0JLyoqCi0JICogTWFwcyBmcm9tIG1lbWJlcnMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBlZGl0aW9ucy4KLQkgKiBIYXMgb25seSBhIHNpbmdsZSBlbnRyeSBpZiBkaWFsb2cgaXMgdXNlZCBpbiAiUmVwbGFjZSIgKGFuZCBub3QgIkFkZCIpIG1vZGUuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZNZW1iZXJFZGl0aW9uczsKLQkvKioKLQkgKiBNYXBzIGZyb20gbWVtYmVycyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHNlbGVjdGVkIGVkaXRpb24uCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZNZW1iZXJTZWxlY3Rpb247Ci0JLyoqIFRoZSBlZGl0aW9ucyBvZiB0aGUgY3VycmVudCBzZWxlY3RlZCBtZW1iZXIgKi8KLQlwcml2YXRlIExpc3QgZkN1cnJlbnRFZGl0aW9uczsKLQlwcml2YXRlIFRocmVhZCBmVGhyZWFkOwotCXByaXZhdGUgUGFpciBmVGFyZ2V0UGFpcjsKLQkvKiogVGhlIHNlbGVjdGVkIGVkaXRpb24gaW4gdGhlIGVkaXRpb24gdmlld2VyICovCi0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZTZWxlY3RlZEl0ZW07Ci0JcHJpdmF0ZSBTdHJpbmcgZlRpdGxlQXJnOwotCXByaXZhdGUgSW1hZ2UgZlRpdGxlSW1hZ2U7Ci0JCi0JLy8gU1dUIGNvbnRyb2xzCi0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmQ29udGVudFBhbmU7Ci0JcHJpdmF0ZSBCdXR0b24gZkNvbW1pdEJ1dHRvbjsKLQlwcml2YXRlIFRhYmxlIGZNZW1iZXJUYWJsZTsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJQYW5lIGZNZW1iZXJQYW5lOwotCXByaXZhdGUgVHJlZSBmRWRpdGlvblRyZWU7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyUGFuZSBmRWRpdGlvblBhbmU7Ci0JcHJpdmF0ZSBJbWFnZSBmRGF0ZUltYWdlOwotCXByaXZhdGUgSW1hZ2UgZlRpbWVJbWFnZTsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZTdHJ1Y3R1cmVkQ29tcGFyZVBhbmU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtb2RhbCwgcmVzaXphYmxlIGRpYWxvZy4KLQkgKiBWYXJpb3VzIHRpdGxlcywgaWNvbnMsIGFuZCBsYWJlbHMgYXJlIGNvbmZpZ3VyZWQgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlLgotCSAqIFRoZSBmb2xsb3dpbmcgcmVzb3VyY2Uga2V5cyBhcmUgdXNlZDoKLQkgKiA8cHJlPgotCSAqCWtleSAgICAgICAgIHR5cGUgICAgICAgICAgZGVzY3JpcHRpb24KLQkgKgl0aXRsZSAgICAgICBTdHJpbmcgICAgICAgIGRpYWxvZyB0aXRsZQotCSAqCXdpZHRoICAgICAgIEludGVnZXIgICAgICAgaW5pdGlhbCB3aWR0aCBvZiBkaWFsb2cKLQkgKgloZWlnaHQgICAgICBJbnRlZ2VyICAgICAgIGluaXRpYWwgaGVpZ2h0IG9mIGRpYWxvZwotCSAqCXRyZWVUaXRsZUZvcm1hdCAgIE1lc3NhZ2VGb3JtYXQgcGFuZSB0aXRsZSBmb3IgZWRpdGlvbiB0cmVlOyBhcmcgMCBpcyB0aGUgdGFyZ2V0Ci0JICoJZGF0ZUljb24gICAgU3RyaW5nICAgICAgICBpY29uIGZvciBub2RlIGluIGVkaXRpb24gdHJlZTsgcGF0aCByZWxhdGl2ZSB0byBwbHVnaW4KLQkgKgl0aW1lSWNvbiAgICBTdHJpbmcgICAgICAgIGljb24gZm9yIGxlYWYgaW4gZWRpdGlvbiB0cmVlOyBwYXRoIHJlbGF0aXZlIHRvIHBsdWdpbgotCSAqCXRvZGF5Rm9ybWF0IE1lc3NhZ2VGb3JtYXQgZm9ybWF0IHN0cmluZyBpZiBkYXRlIGlzIHRvZGF5cyBkYXRlOyBhcmcgMCBpcyBkYXRlCi0JICoJeWVzdGVyZGF5Rm9ybWF0IE1lc3NhZ2VGb3JtYXQgZm9ybWF0IHN0cmluZyBpZiBkYXRlIGlzIHllc3RlcmRheXMgZGF0ZTsgYXJnIDAgaXMgZGF0ZQotCSAqCWRheUZvcm1hdCAgIE1lc3NhZ2VGb3JtYXQgZm9ybWF0IHN0cmluZyBpZiBkYXRlIGlzIGFueSBvdGhlciBkYXRlOyBhcmcgMCBpcyBkYXRlCi0JICoJZWRpdGlvbkxhYmVsIFN0cmluZyAgICAgICBsYWJlbCBmb3IgZWRpdGlvbnMgc2lkZSBvZiBjb21wYXJlIHZpZXdlcjsgYXJnIDAgaXMgdGhlIGRhdGUKLQkgKgl0YXJnZXRMYWJlbCAgU3RyaW5nICAgICAgIGxhYmVsIGZvciB0YXJnZXQgc2lkZSBvZiBjb21wYXJlIHZpZXdlciAKLQkgKiAgYnV0dG9uTGFiZWwgIFN0cmluZyAgICAgICBsYWJlbCBmb3IgT0sgYnV0dG9uOyBkZWZhdWx0IGlzIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwKLQkgKiA8L3ByZT4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgaWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZSBuZXcgZGlhbG9nIHN0YXlzIG9uIHRvcCBvZiB0aGlzIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBidW5kbGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+IHRvIGNvbmZpZ3VyZSB0aGUgZGlhbG9nCi0JICovCi0JcHVibGljIEVkaXRpb25TZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUpIHsKLQkJc3VwZXIocGFyZW50LCBidW5kbGUpOwotCX0KLQkKLQlwcml2YXRlIENvbXBhcmVDb25maWd1cmF0aW9uIGdldENvbXBhcmVDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gbmV3IENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0TGVmdEVkaXRhYmxlKGZhbHNlKTsKLQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRSaWdodEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCX0KLQkJCi0JLyoqCi0JICogU2V0cyBhbiBhZGRpdGlvbmFsIGFuZCBvcHRpb25hbCBhcmd1bWVudCBmb3IgdGhlIGVkaXRpb24gcGFuZSdzIHRpdGxlLgotCSAqICAKLQkgKiBAcGFyYW0gdGl0bGVBcmd1bWVudCBhbiBvcHRpb25hbCBhcmd1bWVudCBmb3IgdGhlIGVkaXRpb24gcGFuZSdzIHRpdGxlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRpb25UaXRsZUFyZ3VtZW50KFN0cmluZyB0aXRsZUFyZ3VtZW50KSB7Ci0JCWZUaXRsZUFyZz0gdGl0bGVBcmd1bWVudDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyBhbiBvcHRpb25hbCBpbWFnZSBmb3IgdGhlIGVkaXRpb24gcGFuZSdzIHRpdGxlLgotCSAqICAKLQkgKiBAcGFyYW0gdGl0bGVJbWFnZSBhbiBvcHRpb25hbCBpbWFnZSBmb3IgdGhlIGVkaXRpb24gcGFuZSdzIHRpdGxlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRpb25UaXRsZUltYWdlKEltYWdlIHRpdGxlSW1hZ2UpIHsKLQkJZlRpdGxlSW1hZ2U9IHRpdGxlSW1hZ2U7Ci0JfQotCQotCS8qKgotCSAqIFNlbGVjdCB0aGUgcHJldmlvdXMgZWRpdGlvbiAocHJlc2VudGluZyBhIFVJKS4KLQkgKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIGlucHV0IG9iamVjdCBhZ2FpbnN0IHdoaWNoIHRoZSBlZGl0aW9ucyBhcmUgY29tcGFyZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGlucHV0RWRpdGlvbnMgdGhlIGxpc3Qgb2YgZWRpdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT5zKQotCSAqIEBwYXJhbSBwcGF0aCBJZiA8Y29kZT5udWxsPC9jb2RlPiBkaWFsb2cgc2hvd3MgZnVsbCBpbnB1dDsgaWYgbm9uIDxjb2RlPm51bGw8L2NvZGU+IGl0IGV4dHJhY3RzIGEgc3Vic2VjdGlvbgotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgc2VsZWN0ZWQgZWRpdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBlcnJvciBvY2N1cnJlZC4KLQkgKiBUaGUgcmV0dXJuZWQgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gaXMgb25lIG9mIHRoZSBvcmlnaW5hbCBlZGl0aW9ucwotCSAqIGlmIDxjb2RlPnBhdGg8L2NvZGU+IHdhcyA8Y29kZT5udWxsPC9jb2RlPjsgb3RoZXJ3aXNlCi0JICogaXQgaXMgYW4gPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gcmV0dXJuZWQgZnJvbSA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvci5sb2NhdGUocGF0aCwgaXRlbSk8L2NvZGU+Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IHNlbGVjdFByZXZpb3VzRWRpdGlvbihmaW5hbCBJVHlwZWRFbGVtZW50IHRhcmdldCwgSVR5cGVkRWxlbWVudFtdIGlucHV0RWRpdGlvbnMsIE9iamVjdCBwcGF0aCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHRhcmdldCk7Ci0JCWZUYXJnZXRQYWlyPSBuZXcgUGFpcihudWxsLCB0YXJnZXQpOwotCQkKLQkJLy8gc29ydCBpbnB1dCBlZGl0aW9ucwotCQlmaW5hbCBpbnQgY291bnQ9IGlucHV0RWRpdGlvbnMubGVuZ3RoOwotCQlmaW5hbCBJTW9kaWZpY2F0aW9uRGF0ZVtdIGVkaXRpb25zPSBuZXcgSU1vZGlmaWNhdGlvbkRhdGVbY291bnRdOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCWVkaXRpb25zW2ldPSAoSU1vZGlmaWNhdGlvbkRhdGUpIGlucHV0RWRpdGlvbnNbaV07Ci0JCWlmIChjb3VudCA+IDEpCi0JCQlpbnRlcm5hbFNvcnQoZWRpdGlvbnMpOwotCQkJCi0JCS8vIGZpbmQgU3RydWN0dXJlQ3JlYXRvciBpZiBwcGF0aCBpcyBub3QgbnVsbAotCQlJU3RydWN0dXJlQ3JlYXRvciBzdHJ1Y3R1cmVDcmVhdG9yPSBudWxsOwotCQlpZiAocHBhdGggIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGU9IHRhcmdldC5nZXRUeXBlKCk7Ci0JCQlTdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvciBzY2Q9IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RydWN0dXJlQ3JlYXRvcih0eXBlKTsKLQkJCWlmIChzY2QgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVDcmVhdG9yPSBzY2QuY3JlYXRlU3RydWN0dXJlQ3JlYXRvcigpOwotCQl9Ci0KLQkJaWYgKGZBZGRNb2RlKSB7Ci0JCQkvLyBkb2VzIG5vdCB3b3JrIGluIGFkZCBtb2RlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkJCi0JCWlmIChzdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwpIHsKLQkJCVBhaXIgcGFpcj0gY3JlYXRlUGFpcihzdHJ1Y3R1cmVDcmVhdG9yLCBwcGF0aCwgdGFyZ2V0KTsKLQkJCWlmIChwYWlyICE9IG51bGwpCi0JCQkJZlRhcmdldFBhaXI9IHBhaXI7Ci0JCQllbHNlCi0JCQkJcHBhdGg9IG51bGw7CS8vIGNvdWxkbid0IGV4dHJhY3QgaXRlbSBiZWNhdXNlIG9mIGVycm9yCi0JCX0KLQkJCQkJCi0JCS8vIGZyb20gZnJvbnQgKG5ld2VzdCkgdG8gYmFjayAob2xkZXN0KQotCQlmb3IgKGludCBpPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQotCQkJSVR5cGVkRWxlbWVudCBlZGl0aW9uPSAoSVR5cGVkRWxlbWVudCkgZWRpdGlvbnNbaV07Ci0JCQlQYWlyIHBhaXI9IG51bGw7Ci0JCQkKLQkJCWlmIChzdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwgJiYgcHBhdGggIT0gbnVsbCkgewotCQkJCS8vIGV4dHJhY3Qgc3ViIGVsZW1lbnQgZnJvbSBlZGl0aW9uCi0JCQkJcGFpcj0gY3JlYXRlUGFpcihzdHJ1Y3R1cmVDcmVhdG9yLCBwcGF0aCwgZWRpdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXBhaXI9IG5ldyBQYWlyKG51bGwsIGVkaXRpb24pOwotCQkJfQotCQkJCi0JCQlpZiAocGFpciAhPSBudWxsICYmIHBhaXIuZkhhc0Vycm9yKQotCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJaWYgKHBhaXIgIT0gbnVsbCAmJiAhZlRhcmdldFBhaXIuZXF1YWxzKHBhaXIpKSB7Ci0JCQkJcmV0dXJuIHBhaXIuZkl0ZW07Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG5vdGhpbmcgZm91bmQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFByZXNlbnRzIHRoaXMgbW9kYWwgZGlhbG9nIHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgZGVzY3JpYmVkIGluIHRoZSBjbGFzcyBjb21tZW50IGFib3ZlLgotCSAqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgaW5wdXQgb2JqZWN0IGFnYWluc3Qgd2hpY2ggdGhlIGVkaXRpb25zIGFyZSBjb21wYXJlZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaW5wdXRFZGl0aW9ucyB0aGUgbGlzdCBvZiBlZGl0aW9ucyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPnMpCi0JICogQHBhcmFtIHBwYXRoIElmIDxjb2RlPm51bGw8L2NvZGU+IGRpYWxvZyBzaG93cyBmdWxsIGlucHV0OyBpZiBub24gPGNvZGU+bnVsbDwvY29kZT4gaXQgZXh0cmFjdHMgYSBzdWJzZWN0aW9uCi0JICogQHJldHVybiByZXR1cm5zIHRoZSBzZWxlY3RlZCBlZGl0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGRpYWxvZyB3YXMgY2FuY2VsbGVkLgotCSAqIFRoZSByZXR1cm5lZCA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPiBpcyBvbmUgb2YgdGhlIG9yaWdpbmFsIGVkaXRpb25zCi0JICogaWYgPGNvZGU+cGF0aDwvY29kZT4gd2FzIDxjb2RlPm51bGw8L2NvZGU+OyBvdGhlcndpc2UKLQkgKiBpdCBpcyBhbiA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPiByZXR1cm5lZCBmcm9tIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yLmxvY2F0ZShwYXRoLCBpdGVtKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCBzZWxlY3RFZGl0aW9uKGZpbmFsIElUeXBlZEVsZW1lbnQgdGFyZ2V0LCBJVHlwZWRFbGVtZW50W10gaW5wdXRFZGl0aW9ucywgT2JqZWN0IHBwYXRoKSB7Ci0JCQotCQlBc3NlcnQuaXNOb3ROdWxsKHRhcmdldCk7Ci0JCWZUYXJnZXRQYWlyPSBuZXcgUGFpcihudWxsLCB0YXJnZXQpOwotCQkKLQkJLy8gc29ydCBpbnB1dCBlZGl0aW9ucwotCQlmaW5hbCBpbnQgY291bnQ9IGlucHV0RWRpdGlvbnMubGVuZ3RoOwotCQlmaW5hbCBJTW9kaWZpY2F0aW9uRGF0ZVtdIGVkaXRpb25zPSBuZXcgSU1vZGlmaWNhdGlvbkRhdGVbY291bnRdOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCWVkaXRpb25zW2ldPSAoSU1vZGlmaWNhdGlvbkRhdGUpIGlucHV0RWRpdGlvbnNbaV07Ci0JCWlmIChjb3VudCA+IDEpCi0JCQlpbnRlcm5hbFNvcnQoZWRpdGlvbnMpOwotCQkJCi0JCS8vIGZpbmQgU3RydWN0dXJlQ3JlYXRvciBpZiBwcGF0aCBpcyBub3QgbnVsbAotCQlJU3RydWN0dXJlQ3JlYXRvciBzdHJ1Y3R1cmVDcmVhdG9yPSBudWxsOwotCQlpZiAocHBhdGggIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGU9IHRhcmdldC5nZXRUeXBlKCk7Ci0JCQlTdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvciBzY2Q9IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RydWN0dXJlQ3JlYXRvcih0eXBlKTsKLQkJCWlmIChzY2QgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVDcmVhdG9yPSBzY2QuY3JlYXRlU3RydWN0dXJlQ3JlYXRvcigpOwotCQl9Ci0KLQkJaWYgKCFmQWRkTW9kZSkgewotCQkJLy8gcmVwbGFjZSBtb2RlCi0JCQkKLQkJCWlmIChzdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwpIHsKLQkJCQlQYWlyIHBhaXI9IGNyZWF0ZVBhaXIoc3RydWN0dXJlQ3JlYXRvciwgcHBhdGgsIHRhcmdldCk7Ci0JCQkJaWYgKHBhaXIgIT0gbnVsbCkKLQkJCQkJZlRhcmdldFBhaXI9IHBhaXI7Ci0JCQkJZWxzZQotCQkJCQlwcGF0aD0gbnVsbDsJLy8gY291bGRuJ3QgZXh0cmFjdCBpdGVtIGJlY2F1c2Ugb2YgZXJyb3IKLQkJCX0KLQkJCQotCQkJLy8gc2V0IHRoZSBsZWZ0IGFuZCByaWdodCBsYWJlbHMgZm9yIHRoZSBjb21wYXJlIHZpZXdlcgotCQkJU3RyaW5nIHRhcmdldExhYmVsPSBnZXRUYXJnZXRMYWJlbCh0YXJnZXQsIGZUYXJnZXRQYWlyLmdldEl0ZW0oKSk7Ci0JCQlpZiAoZlRhcmdldElzUmlnaHQpCi0JCQkJZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKS5zZXRSaWdodExhYmVsKHRhcmdldExhYmVsKTsKLQkJCWVsc2UKLQkJCQlnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpLnNldExlZnRMYWJlbCh0YXJnZXRMYWJlbCk7Ci0JCQkKLQkJCWlmIChzdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwgJiYgcHBhdGggIT0gbnVsbCkgewkvLyBleHRyYWN0IHN1YiBlbGVtZW50Ci0JCQkJCi0JCQkJZmluYWwgSVN0cnVjdHVyZUNyZWF0b3Igc2M9IHN0cnVjdHVyZUNyZWF0b3I7Ci0JCQkJZmluYWwgT2JqZWN0IHBhdGg9IHBwYXRoOwotCQkJCQotCQkJCS8vIGNvbnN0cnVjdCB0aGUgY29tcGFyZXIgdGhyZWFkCi0JCQkJLy8gYW5kIHBlcmZvcm0gdGhlIGJhY2tncm91bmQgZXh0cmFjdAotCQkJCWZUaHJlYWQ9IG5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkvLyBmcm9tIGZyb250IChuZXdlc3QpIHRvIGJhY2sgKG9sZGVzdCkKLQkJCQkJCWZvciAoaW50IGk9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCQkJCQotCQkJCQkJCWlmIChmRWRpdGlvblRyZWUgPT0gbnVsbCB8fCBmRWRpdGlvblRyZWUuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlJVHlwZWRFbGVtZW50IGVkaXRpb249IChJVHlwZWRFbGVtZW50KSBlZGl0aW9uc1tpXTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBleHRyYWN0IHN1YiBlbGVtZW50IGZyb20gZWRpdGlvbgotCQkJCQkJCVBhaXIgcGFpcj0gY3JlYXRlUGFpcihzYywgcGF0aCwgZWRpdGlvbik7Ci0JCQkJCQkJaWYgKHBhaXIgIT0gbnVsbCkKLQkJCQkJCQkJc2VuZFBhaXIocGFpcik7Ci0JCQkJCQl9Ci0JCQkJCQlzZW5kUGFpcihudWxsKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgewotCQkJCS8vIGNyZWF0ZSB0cmVlIHdpZGdldAotCQkJCWNyZWF0ZSgpOwotCQkJCQotCQkJCS8vIGZyb20gZnJvbnQgKG5ld2VzdCkgdG8gYmFjayAob2xkZXN0KQotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBjb3VudDsgaSsrKQotCQkJCQlhZGRNZW1iZXJFZGl0aW9uKG5ldyBQYWlyKG51bGwsIChJVHlwZWRFbGVtZW50KSBlZGl0aW9uc1tpXSkpOwotCQkJfQotCQkJCi0JCX0gZWxzZSB7Ci0JCQkvLyBhZGQgbW9kZQotCQkJZmluYWwgT2JqZWN0IGNvbnRhaW5lcj0gcHBhdGg7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRhaW5lcik7Ci0JCQkJCQkJCQotCQkJaWYgKHN0cnVjdHVyZUNyZWF0b3IgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsJLy8gZXJyb3IKLQkJCi0JCQkvLyBleHRyYWN0IGFsbCBlbGVtZW50cyBvZiBjb250YWluZXIKLQkJCWZpbmFsIEhhc2hTZXQgY3VycmVudD0gbmV3IEhhc2hTZXQoKTsKLQkJCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIHNjbz0gc3RydWN0dXJlQ3JlYXRvci5sb2NhdGUoY29udGFpbmVyLCB0YXJnZXQpOwotCQkJaWYgKHNjbyAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gY2hpbGRyZW49IHNjby5nZXRDaGlsZHJlbigpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKQotCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJCQljdXJyZW50LmFkZChjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIElTdHJ1Y3R1cmVDcmVhdG9yIHNjPSBzdHJ1Y3R1cmVDcmVhdG9yOwotCQkJCi0JCQkvLyBjb25zdHJ1Y3QgdGhlIGNvbXBhcmVyIHRocmVhZAotCQkJLy8gYW5kIHBlcmZvcm0gdGhlIGJhY2tncm91bmQgZXh0cmFjdAotCQkJZlRocmVhZD0gbmV3IFRocmVhZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQotCQkJCQkvLyBmcm9tIGZyb250IChuZXdlc3QpIHRvIGJhY2sgKG9sZGVzdCkKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJCQkKLQkJCQkJCWlmIChmRWRpdGlvblRyZWUgPT0gbnVsbCB8fCBmRWRpdGlvblRyZWUuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJSVR5cGVkRWxlbWVudCBlZGl0aW9uPSAoSVR5cGVkRWxlbWVudCkgZWRpdGlvbnNbaV07Ci0JCQkJCQkKLQkJCQkJCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIHNjbzI9IHNjLmxvY2F0ZShjb250YWluZXIsIGVkaXRpb24pOwotCQkJCQkJaWYgKHNjbzIgIT0gbnVsbCkgewotCQkJCQkJCU9iamVjdFtdIGNoaWxkcmVuPSBzY28yLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChpbnQgaTI9IDA7IGkyIDwgY2hpbGRyZW4ubGVuZ3RoOyBpMisrKSB7Ci0JCQkJCQkJCQlJVHlwZWRFbGVtZW50IGNoaWxkPSAoSVR5cGVkRWxlbWVudCkgY2hpbGRyZW5baTJdOwotCQkJCQkJCQkJaWYgKCFjdXJyZW50LmNvbnRhaW5zKGNoaWxkKSkKLQkJCQkJCQkJCQlzZW5kUGFpcihuZXcgUGFpcihzYywgZWRpdGlvbiwgY2hpbGQpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZW5kUGFpcihudWxsKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlvcGVuKCk7Ci0JCQotCQlpZiAoZ2V0UmV0dXJuQ29kZSgpID09IE9LKQotCQkJcmV0dXJuIGZTZWxlY3RlZEl0ZW07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFBhaXIgY3JlYXRlUGFpcihJU3RydWN0dXJlQ3JlYXRvciBzYywgT2JqZWN0IHBhdGgsIElUeXBlZEVsZW1lbnQgaW5wdXQpIHsKLQkJSVN0cnVjdHVyZUNvbXBhcmF0b3Igc2NtcD0gc2MubG9jYXRlKHBhdGgsIGlucHV0KTsKLQkJaWYgKHNjbXAgPT0gbnVsbCAmJiBzYy5nZXRTdHJ1Y3R1cmUoaW5wdXQpID09IG51bGwpIHsJLy8gcGFyc2UgZXJyb3IKLQkJCVBhaXIgcD0gbmV3IFBhaXIoc2MsIGlucHV0KTsKLQkJCXAuZkhhc0Vycm9yPSB0cnVlOwotCQkJcmV0dXJuIHA7Ci0JCX0KLQkJaWYgKHNjbXAgaW5zdGFuY2VvZiBJVHlwZWRFbGVtZW50KQotCQkJcmV0dXJuIG5ldyBQYWlyKHNjLCBpbnB1dCwgKElUeXBlZEVsZW1lbnQpIHNjbXApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9scyB3aGV0aGVyIGlkZW50aWNhbCBlbnRyaWVzIGFyZSBzaG93biBvciBub3QgKGRlZmF1bHQpLgotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSA8Y29kZT5zZWxlY3RFZGl0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBoaWRlIGlmIHRydWUgaWRlbnRpY2FsIGVudHJpZXMgYXJlIGhpZGRlbjsgb3RoZXJ3aXNlIHRoZXkgYXJlIHNob3duLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWRlSWRlbnRpY2FsRW50cmllcyhib29sZWFuIGhpZGUpIHsKLQkJZkhpZGVJZGVudGljYWw9IGhpZGU7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciB3b3Jrc3BhY2UgdGFyZ2V0IGlzIG9uIHRoZSBsZWZ0ICh0aGUgZGVmYXVsdCkgb3IgcmlnaHQgaGFuZCBzaWRlLgotCSAqCi0JICogQHBhcmFtIGlzUmlnaHQgaWYgdHJ1ZSB0YXJnZXQgaXMgc2hvd24gb24gcmlnaHQgaGFuZCBzaWRlLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRJc1JpZ2h0KGJvb2xlYW4gaXNSaWdodCkgewotCQlmVGFyZ2V0SXNSaWdodD0gaXNSaWdodDsKLQl9Ci0JCQotCS8qKgotCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIDxjb2RlPkVkaXRpb25TZWxlY3Rpb25EaWFsb2c8L2NvZGU+IGlzIGluICdhZGQnIG1vZGUKLQkgKiBvciAncmVwbGFjZScgbW9kZSAodGhlIGRlZmF1bHQpLgotCSAqCi0JICogQHBhcmFtIGFkZE1vZGUgaWYgdHJ1ZSBkaWFsb2cgaXMgaW4gJ2FkZCcgbW9kZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkTW9kZShib29sZWFuIGFkZE1vZGUpIHsKLQkJZkFkZE1vZGU9IGFkZE1vZGU7Ci0JCWZNdWx0aVNlbGVjdD0gYWRkTW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciB0aGUgPGNvZGU+RWRpdGlvblNlbGVjdGlvbkRpYWxvZzwvY29kZT4gaXMgaW4gJ2NvbXBhcmUnIG1vZGUKLQkgKiBvciAnYWRkL3JlcGxhY2UnICh0aGUgZGVmYXVsdCkgbW9kZS4gCi0JICoKLQkgKiBAcGFyYW0gY29tcGFyZU1vZGUgaWYgdHJ1ZSBkaWFsb2cgaXMgaW4gJ2FkZCcgbW9kZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyZU1vZGUoYm9vbGVhbiBjb21wYXJlTW9kZSkgewotCQlmQ29tcGFyZU1vZGU9IGNvbXBhcmVNb2RlOwotCQlmU3RydWN0dXJlQ29tcGFyZT0gZkNvbXBhcmVNb2RlICYmICFmQWRkTW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5wdXQgdGFyZ2V0IHRoYXQgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGggdGhlIG1vc3QgcmVjZW50IGNhbGwKLQkgKiB0byA8Y29kZT5zZWxlY3RFZGl0aW9uPC9jb2RlPi4gSWYgYSBub3QgPGNvZGU+bnVsbDwvY29kZT4gcGF0aCB3YXMgc3BlY2lmaWVkIHRoaXMgbWV0aG9kCi0JICogcmV0dXJucyBhIHN1YnNlY3Rpb24gb2YgdGhpcyB0YXJnZXQgKDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yLmxvY2F0ZShwYXRoLCB0YXJnZXQpPC9jb2RlPikKLQkgKiBpbnN0ZWFkIG9mIHRoZSBpbnB1dCB0YXJnZXQuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUgaWYgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gaXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIDxjb2RlPnBhdGg8L2NvZGU+IHNwZWNpZmllcwotCSAqIGEgbWV0aG9kLCB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSA8Y29kZT5nZXRUYXJnZXQ8L2NvZGU+IHdpbGwgYmUgdGhlIG1ldGhvZCBub3QgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsYXN0IHNwZWNpZmllZCB0YXJnZXQgb3IgYSBzdWJzZWN0aW9uIHRoZXJlb2YuCi0JICovCi0JcHVibGljIElUeXBlZEVsZW1lbnQgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gZlRhcmdldFBhaXIuZ2V0SXRlbSgpOwotCX0KLSAJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgd2l0aCB0aGUgbW9zdAotCSAqIHJlY2VudCBjYWxsIHRvIDxjb2RlPnNlbGVjdEVkaXRpb248L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGVkaXRpb25zIGFzIGFuIGFycmF5LgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudFtdIGdldFNlbGVjdGlvbigpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZk1lbWJlclNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyPSBmQXJyYXlMaXN0Lml0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpdGVyLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVkaXRpb249IGl0ZXIubmV4dCgpOwkJCi0JCQkJT2JqZWN0IGl0ZW09IGZNZW1iZXJTZWxlY3Rpb24uZ2V0KGVkaXRpb24pOwotCQkJCWlmIChpdGVtICE9IG51bGwpCi0JCQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZlNlbGVjdGVkSXRlbSAhPSBudWxsKQotCQkJcmVzdWx0LmFkZChmU2VsZWN0ZWRJdGVtKTsKLQkJcmV0dXJuIChJVHlwZWRFbGVtZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBJVHlwZWRFbGVtZW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCQotIAkvKioKLSAJICogUmV0dXJucyBhIGxhYmVsIGZvciBpZGVudGlmeWluZyB0aGUgdGFyZ2V0IHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlci4KLSAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBleHRyYWN0cyB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgInRhcmdldExhYmVsIiBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUKLSAJICogYW5kIHBhc3NlcyBpdCBhcyB0aGUgZm9ybWF0IGFyZ3VtZW50IHRvIDxjb2RlPk1lc3NhZ2VGb3JtYXQuZm9ybWF0PC9jb2RlPi4KLSAJICogVGhlIHNpbmdsZSBmb3JtYXQgYXJndW1lbnQgZm9yIDxjb2RlPk1lc3NhZ2VGb3JtYXQuZm9ybWF0PC9jb2RlPiAoInswfSIgaW4gdGhlIGZvcm1hdCBzdHJpbmcpCi0gCSAqIGlzIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBpbnB1dCBlbGVtZW50LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGNyZWF0ZSB0aGVpciBvd24gbGFiZWwuCi0JICogPC9wPgotIAkgKgotIAkgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgZWxlbWVudCBmb3Igd2hpY2ggYSBsYWJlbCBtdXN0IGJlIHJldHVybmVkCi0gCSAqIEBwYXJhbSBpdGVtIGlmIGEgcGF0aCBoYXMgYmVlbiBzcGVjaWZpZWQgaW4gPGNvZGU+c2VsZWN0RWRpdGlvbjwvY29kZT4gYSBzdWIgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gdGFyZ2V0OyBvdGhlcndpc2UgdGhlIHNhbWUgYXMgdGFyZ2V0Ci0gCSAqIEByZXR1cm4gYSBsYWJlbCB0aGUgdGFyZ2V0IHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlcgotICAJICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRMYWJlbChJVHlwZWRFbGVtZW50IHRhcmdldCwgSVR5cGVkRWxlbWVudCBpdGVtKSB7Ci0JCVN0cmluZyBmb3JtYXQ9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBSZXNvdXJjZU5vZGUpCi0JCQlmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgIndvcmtzcGFjZVRhcmdldExhYmVsIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0YXJnZXRMYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmb3JtYXQgPT0gbnVsbCkKLQkJCWZvcm1hdD0gInh7MH0iOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyB0YXJnZXQuZ2V0TmFtZSgpIH0pOwotCX0KLQkKLSAJLyoqCi0gCSAqIFJldHVybnMgYSBsYWJlbCBmb3IgaWRlbnRpZnlpbmcgdGhlIGVkaXRpb24gc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyLgotIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGV4dHJhY3RzIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSAiZWRpdGlvbkxhYmVsIiBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUKLSAJICogYW5kIHBhc3NlcyBpdCBhcyB0aGUgZm9ybWF0IGFyZ3VtZW50IHRvIDxjb2RlPk1lc3NhZ2VGb3JtYXQuZm9ybWF0PC9jb2RlPi4KLSAJICogVGhlIHNpbmdsZSBmb3JtYXQgYXJndW1lbnQgZm9yIDxjb2RlPk1lc3NhZ2VGb3JtYXQuZm9ybWF0PC9jb2RlPiAoInswfSIgaW4gdGhlIGZvcm1hdCBzdHJpbmcpCi0gCSAqIGlzIHRoZSBmb3JtYXR0ZWQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGdpdmVuIGlucHV0IGVsZW1lbnQuCi0gCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGNyZWF0ZSB0aGVpciBvd24gbGFiZWwuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHNlbGVjdGVkRWRpdGlvbiB0aGUgc2VsZWN0ZWQgZWRpdGlvbiBmb3Igd2hpY2ggYSBsYWJlbCBtdXN0IGJlIHJldHVybmVkCi0gCSAqIEBwYXJhbSBpdGVtIGlmIGEgcGF0aCBoYXMgYmVlbiBzcGVjaWZpZWQgaW4gPGNvZGU+c2VsZWN0RWRpdGlvbjwvY29kZT4gYSBzdWIgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gc2VsZWN0ZWRFZGl0aW9uOyBvdGhlcndpc2UgdGhlIHNhbWUgYXMgc2VsZWN0ZWRFZGl0aW9uCi0gCSAqIEByZXR1cm4gYSBsYWJlbCBmb3IgdGhlIGVkaXRpb24gc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyCi0gIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRpb25MYWJlbChJVHlwZWRFbGVtZW50IHNlbGVjdGVkRWRpdGlvbiwgSVR5cGVkRWxlbWVudCBpdGVtKSB7Ci0JCVN0cmluZyBmb3JtYXQ9IG51bGw7Ci0JCWlmIChzZWxlY3RlZEVkaXRpb24gaW5zdGFuY2VvZiBSZXNvdXJjZU5vZGUpCi0JCQlmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgIndvcmtzcGFjZUVkaXRpb25MYWJlbCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHNlbGVjdGVkRWRpdGlvbiBpbnN0YW5jZW9mIEhpc3RvcnlJdGVtKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJoaXN0b3J5RWRpdGlvbkxhYmVsIiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJlZGl0aW9uTGFiZWwiKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlmb3JtYXQ9ICJ4ezB9IjsJLy8kTk9OLU5MUy0xJAotCQkKLQotCQlTdHJpbmcgZGF0ZT0gIiI7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkRWRpdGlvbiBpbnN0YW5jZW9mIElNb2RpZmljYXRpb25EYXRlKSB7Ci0JCQlsb25nIG1vZERhdGU9ICgoSU1vZGlmaWNhdGlvbkRhdGUpc2VsZWN0ZWRFZGl0aW9uKS5nZXRNb2RpZmljYXRpb25EYXRlKCk7Ci0JCQlkYXRlPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoKS5mb3JtYXQobmV3IERhdGUobW9kRGF0ZSkpOwotCQl9Ci0JCQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyBkYXRlIH0pOwotCX0KLQkKLSAJLyoqCi0gCSAqIFJldHVybnMgYSBsYWJlbCBmb3IgaWRlbnRpZnlpbmcgYSBub2RlIGluIHRoZSBlZGl0aW9uIHRyZWUgdmlld2VyLgotIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGV4dHJhY3RzIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSAid29ya3NwYWNlVHJlZUZvcm1hdCIgb3IKLSAJICogInRyZWVGb3JtYXQiIChpbiB0aGF0IG9yZGVyKSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUKLSAJICogYW5kIHBhc3NlcyBpdCBhcyB0aGUgZm9ybWF0IGFyZ3VtZW50IHRvIDxjb2RlPk1lc3NhZ2VGb3JtYXQuZm9ybWF0PC9jb2RlPi4KLSAJICogVGhlIHNpbmdsZSBmb3JtYXQgYXJndW1lbnQgZm9yIDxjb2RlPk1lc3NhZ2VGb3JtYXQuZm9ybWF0PC9jb2RlPiAoInswfSIgaW4gdGhlIGZvcm1hdCBzdHJpbmcpCi0gCSAqIGlzIHRoZSBmb3JtYXR0ZWQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGdpdmVuIGlucHV0IGVsZW1lbnQuCi0gCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGNyZWF0ZSB0aGVpciBvd24gbGFiZWwuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGVkaXRpb24gdGhlIGVkaXRpb24gZm9yIHdoaWNoIGEgbGFiZWwgbXVzdCBiZSByZXR1cm5lZAotIAkgKiBAcGFyYW0gaXRlbSBpZiBhIHBhdGggaGFzIGJlZW4gc3BlY2lmaWVkIGluIDxjb2RlPmVkaXRpb248L2NvZGU+IGEgc3ViIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGVkaXRpb247IG90aGVyd2lzZSB0aGUgc2FtZSBhcyBlZGl0aW9uCi0gCSAqIEBwYXJhbSBkYXRlIHRoaXMgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzIHBhcnQgb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcKLSAJICogQHJldHVybiBhIGxhYmVsIG9mIGEgbm9kZSBpbiB0aGUgZWRpdGlvbiB0cmVlIHZpZXdlcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNob3J0RWRpdGlvbkxhYmVsKElUeXBlZEVsZW1lbnQgZWRpdGlvbiwgSVR5cGVkRWxlbWVudCBpdGVtLCBEYXRlIGRhdGUpIHsKLQkJU3RyaW5nIGZvcm1hdD0gbnVsbDsKLQkJaWYgKGVkaXRpb24gaW5zdGFuY2VvZiBSZXNvdXJjZU5vZGUpCi0JCQlmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgIndvcmtzcGFjZVRyZWVGb3JtYXQiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRyZWVGb3JtYXQiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlmb3JtYXQ9ICJ4ezB9IjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBkcz0gRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoKS5mb3JtYXQoZGF0ZSk7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBPYmplY3RbXSB7IGRzIH0pOwotCX0KLQkKLSAJLyoqCi0gCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIGlkZW50aWZ5aW5nIHRoZSBlZGl0aW9uIHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlci4KLSAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBleHRyYWN0cyB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgImVkaXRpb25MYWJlbCIgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gCSAqIGFuZCBwYXNzZXMgaXQgYXMgdGhlIGZvcm1hdCBhcmd1bWVudCB0byA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4uCi0gCSAqIFRoZSBzaW5nbGUgZm9ybWF0IGFyZ3VtZW50IGZvciA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4gKCJ7MH0iIGluIHRoZSBmb3JtYXQgc3RyaW5nKQotIAkgKiBpcyB0aGUgZm9ybWF0dGVkIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBnaXZlbiBpbnB1dCBlbGVtZW50LgotIAkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBjcmVhdGUgdGhlaXIgb3duIGxhYmVsLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3RlZEVkaXRpb24gdGhlIHNlbGVjdGVkIGVkaXRpb24gZm9yIHdoaWNoIGEgbGFiZWwgbXVzdCBiZSByZXR1cm5lZAotIAkgKiBAcGFyYW0gaXRlbSBpZiBhIHBhdGggaGFzIGJlZW4gc3BlY2lmaWVkIGluIDxjb2RlPnNlbGVjdEVkaXRpb248L2NvZGU+IGEgc3ViIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNlbGVjdGVkRWRpdGlvbjsgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIHNlbGVjdGVkRWRpdGlvbgotIAkgKiBAcmV0dXJuIGEgbGFiZWwgdGhlIGVkaXRpb24gc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyCi0gIAkgKiBAc2luY2UgMi4wCi0gCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRFZGl0aW9uSW1hZ2UoSVR5cGVkRWxlbWVudCBzZWxlY3RlZEVkaXRpb24sIElUeXBlZEVsZW1lbnQgaXRlbSkgewotCQlpZiAoc2VsZWN0ZWRFZGl0aW9uIGluc3RhbmNlb2YgUmVzb3VyY2VOb2RlKQotCQkJcmV0dXJuIHNlbGVjdGVkRWRpdGlvbi5nZXRJbWFnZSgpOwotCQlpZiAoc2VsZWN0ZWRFZGl0aW9uIGluc3RhbmNlb2YgSGlzdG9yeUl0ZW0pIHsKLQkJCWlmIChmVGltZUltYWdlID09IG51bGwpIHsKLQkJCQlTdHJpbmcgaWNvbk5hbWU9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRpbWVJY29uIiwgIm9iajE2L3Jlc291cmNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGljb25OYW1lKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQkJZlRpbWVJbWFnZT0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJCX0KLQkJCXJldHVybiBmVGltZUltYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAJLyogKG5vbiBKYXZhZG9jKQotIAkgKiBDcmVhdGVzIFNXVCBjb250cm9sIHRyZWUuCi0gCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQyKSB7Ci0JCQotCQlDb21wb3NpdGUgcGFyZW50PSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudDIpOwotCi0JCWdldFNoZWxsKCkuc2V0VGV4dChVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJU3BsaXR0ZXIgdnNwbGl0dGVyPSBuZXcgU3BsaXR0ZXIocGFyZW50LCAgU1dULlZFUlRJQ0FMKTsKLQkJdnNwbGl0dGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0KLQkJdnNwbGl0dGVyLmFkZERpc3Bvc2VMaXN0ZW5lcigKLQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZGlzcG9zZSgpOwotCQkJCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChmRGF0ZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCWZEYXRlSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJZkRhdGVJbWFnZT0gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoZlRpbWVJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQlmVGltZUltYWdlLmRpc3Bvc2UoKTsJCQkJCQkKLQkJCQkJCWZUaW1lSW1hZ2U9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlpZiAoZkFkZE1vZGUpIHsKLQkJCS8vIHdlIG5lZWQgdHdvIHBhbmVzOiB0aGUgbGVmdCBmb3IgdGhlIGVsZW1lbnRzLCB0aGUgcmlnaHQgb25lIGZvciB0aGUgZWRpdGlvbnMKLQkJCVNwbGl0dGVyIGhzcGxpdHRlcj0gbmV3IFNwbGl0dGVyKHZzcGxpdHRlciwgIFNXVC5IT1JJWk9OVEFMKTsKLQkJCQotCQkJZk1lbWJlclBhbmU9IG5ldyBDb21wYXJlVmlld2VyUGFuZShoc3BsaXR0ZXIsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCk7Ci0JCQlmTWVtYmVyUGFuZS5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgIm1lbWJlclBhbmVUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpbnQgZmxhZ3M9IFNXVC5IX1NDUk9MTCArIFNXVC5WX1NDUk9MTDsKLQkJCWlmIChmTXVsdGlTZWxlY3QpCi0JCQkJZmxhZ3N8PSBTV1QuQ0hFQ0s7Ci0JCQlmTWVtYmVyVGFibGU9IG5ldyBUYWJsZShmTWVtYmVyUGFuZSwgZmxhZ3MpOwotCQkJZk1lbWJlclRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJCQkJaWYgKGUuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCQkJCQlUYWJsZUl0ZW0gdGk9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLQkJCQkJCQkJT2JqZWN0IGRhdGE9IHRpLmdldERhdGEoKTsKLQkJCQkJCQkJaWYgKHRpLmdldENoZWNrZWQoKSkKLQkJCQkJCQkJCWZBcnJheUxpc3QuYWRkKGRhdGEpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlmQXJyYXlMaXN0LnJlbW92ZShkYXRhKTsKLQkJCQkJCQkJCQotCQkJCQkJCQlpZiAoZkNvbW1pdEJ1dHRvbiAhPSBudWxsKQotCQkJCQkJCQkJZkNvbW1pdEJ1dHRvbi5zZXRFbmFibGVkKGZBcnJheUxpc3Quc2l6ZSgpID4gMCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJZk1lbWJlclRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyB0aSB9KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQloYW5kbGVNZW1iZXJTZWxlY3QoZS5pdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQlmTWVtYmVyUGFuZS5zZXRDb250ZW50KGZNZW1iZXJUYWJsZSk7Ci0JCQlmTWVtYmVyVGFibGUuc2V0Rm9jdXMoKTsKLQkJCQkJCQotCQkJZkVkaXRpb25QYW5lPSBuZXcgQ29tcGFyZVZpZXdlclBhbmUoaHNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCQl9IGVsc2UgewotCQkJaWYgKGZTdHJ1Y3R1cmVDb21wYXJlKSB7Ci0JCQkJLy8gd2UgbmVlZCB0d28gcGFuZXM6IHRoZSBsZWZ0IGZvciB0aGUgZWxlbWVudHMsIHRoZSByaWdodCBvbmUgZm9yIHRoZSBzdHJ1Y3R1cmVkIGRpZmYKLQkJCQlTcGxpdHRlciBoc3BsaXR0ZXI9IG5ldyBTcGxpdHRlcih2c3BsaXR0ZXIsICBTV1QuSE9SSVpPTlRBTCk7Ci0JCQkJCi0JCQkJZkVkaXRpb25QYW5lPSBuZXcgQ29tcGFyZVZpZXdlclBhbmUoaHNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCQkJCWZTdHJ1Y3R1cmVkQ29tcGFyZVBhbmU9IG5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZShoc3BsaXR0ZXIsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCwgdHJ1ZSkgewotCQkJCQlwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpIHsKLQkJCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCQkJcmV0dXJuIENvbXBhcmVVSS5maW5kU3RydWN0dXJlVmlld2VyKG9sZFZpZXdlciwgKElDb21wYXJlSW5wdXQpaW5wdXQsIHRoaXMsIGdldENvbXBhcmVDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWZTdHJ1Y3R1cmVkQ29tcGFyZVBhbmUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQkJCQlmZWVkSW5wdXQyKGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gb25seSBhIHNpbmdsZSBwYW5lIHNob3dpbmcgdGhlIGVkaXRpb25zCi0JCQkJZkVkaXRpb25QYW5lPSBuZXcgQ29tcGFyZVZpZXdlclBhbmUodnNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCQkJfQotCQkJaWYgKGZUaXRsZUFyZyA9PSBudWxsKQotCQkJCWZUaXRsZUFyZz0gZlRhcmdldFBhaXIuZ2V0SXRlbSgpLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0aXRsZUZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAidHJlZVRpdGxlRm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0aXRsZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGl0bGVGb3JtYXQsIG5ldyBTdHJpbmdbXSB7IGZUaXRsZUFyZyB9KTsKLQkJCWZFZGl0aW9uUGFuZS5zZXRUZXh0KHRpdGxlKTsKLQkJCWlmIChmVGl0bGVJbWFnZSAhPSBudWxsKQotCQkJCWZFZGl0aW9uUGFuZS5zZXRJbWFnZShmVGl0bGVJbWFnZSk7Ci0JCX0KLQkJCi0JCWZFZGl0aW9uVHJlZT0gbmV3IFRyZWUoZkVkaXRpb25QYW5lLCBTV1QuSF9TQ1JPTEwgKyBTV1QuVl9TQ1JPTEwpOwotCQlmRWRpdGlvblRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLS8vCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCQkJaGFuZGxlRGVmYXVsdFNlbGVjdGVkKCk7Ci0vLwkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlmZWVkSW5wdXQoZS5pdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZFZGl0aW9uUGFuZS5zZXRDb250ZW50KGZFZGl0aW9uVHJlZSk7CQkKLQkJCi0JCS8vIG5vdyBzdGFydCB0aGUgdGhyZWFkIChhbmQgZm9yZ2V0IGFib3V0IGl0KQotCQlpZiAoZlRocmVhZCAhPSBudWxsKSB7Ci0JCQlmVGhyZWFkLnN0YXJ0KCk7Ci0JCQlmVGhyZWFkPSBudWxsOwotCQl9Ci0JCQotCQlmQ29udGVudFBhbmU9IG5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSh2c3BsaXR0ZXIsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCkgewotCQkJcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0JCQkJcmV0dXJuIENvbXBhcmVVSS5maW5kQ29udGVudFZpZXdlcihvbGRWaWV3ZXIsIGlucHV0LCB0aGlzLCBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpKTsJCi0JCQl9Ci0JCX07Ci0JCXZzcGxpdHRlci5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDMwLCA3MCB9KTsKLQotCQlhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsJCQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGJ1dHRvbkxhYmVsPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJidXR0b25MYWJlbCIsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmQ29tcGFyZU1vZGUpIHsKLQkJCS8vIG9ubHkgYSAnRG9uZScgYnV0dG9uCi0JCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgYnV0dG9uTGFiZWwsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGEgJ0NhbmNlbCcgYW5kIGEgJ0FkZC9SZXBsYWNlJyBidXR0b24KLQkJCWZDb21taXRCdXR0b249IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIGJ1dHRvbkxhYmVsLCB0cnVlKTsKLQkJCWZDb21taXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJpZGRlbiB0byBkaXNhYmxlIGRpc21pc3Mgb24gZG91YmxlIGNsaWNrIGluIGNvbXBhcmUgbW9kZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoZkNvbXBhcmVNb2RlKSB7Ci0JCQkvLyBkb24ndCBkaXNtaXNzIGRpYWxvZwotCQl9IGVsc2UKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8vLS0tLSBwcml2YXRlIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQkKLQkvKgotCSAqIEFzeW5jaHJvbmVvdXNseSBzZW5kcyBhIFBhaXIgKG9yIG51bGwpIHRvIHRoZSBVSSB0aHJlYWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbmRQYWlyKGZpbmFsIFBhaXIgcGFpcikgewkJCi0JCWlmIChmRWRpdGlvblRyZWUgIT0gbnVsbCAmJiAhZkVkaXRpb25UcmVlLmlzRGlzcG9zZWQoKSkgewotCQkJRGlzcGxheSBkaXNwbGF5PSBmRWRpdGlvblRyZWUuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlhZGRNZW1iZXJFZGl0aW9uKHBhaXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGludGVybmFsU29ydChJTW9kaWZpY2F0aW9uRGF0ZVtdIGtleXMpIHsgCi0JCUFycmF5cy5zb3J0KGtleXMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJSU1vZGlmaWNhdGlvbkRhdGUgZDE9IChJTW9kaWZpY2F0aW9uRGF0ZSkgbzE7Ci0JCQkJSU1vZGlmaWNhdGlvbkRhdGUgZDI9IChJTW9kaWZpY2F0aW9uRGF0ZSkgbzI7Ci0JCQkJbG9uZyBkPSBkMi5nZXRNb2RpZmljYXRpb25EYXRlKCkgLSBkMS5nZXRNb2RpZmljYXRpb25EYXRlKCk7Ci0JCQkJaWYgKGQgPCAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJaWYgKGQgPiAwKQotCQkJCQlyZXR1cm4gMTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qCi0JICogQWRkcyB0aGUgZ2l2ZW4gUGFpciB0byB0aGUgbWVtYmVyIGVkaXRpb25zLgotCSAqIElmIEhJREVfSURFTlRJQ0FMIGlzIHRydWUgdGhlIG5ldyBQYWlyIGlzIG9ubHkgYWRkZWQgaWYgaXRzIGNvbnRlbnRzCi0JICogaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZWNlZWRpbmcgUGFpci4KLQkgKiBJZiB0aGUgYXJndW1lbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIG1lc3NhZ2UgIk5vIEVkaXRpb25zIGZvdW5kIiBpcyBzaG93bgotCSAqIGluIHRoZSBtZW1iZXIgb3IgZWRpdGlvbiB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE1lbWJlckVkaXRpb24oUGFpciBwYWlyKSB7Ci0JCQotCQlpZiAocGFpciA9PSBudWxsKSB7CS8vIGVuZCBvZiBsaXN0IG9mIHBhaXJzCi0JCQlpZiAoZk1lbWJlclRhYmxlICE9IG51bGwpIHsJCi0JCQkJaWYgKCFmTWVtYmVyVGFibGUuaXNEaXNwb3NlZCgpICYmIGZNZW1iZXJUYWJsZS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJCWlmIChmTXVsdGlTZWxlY3QpIHsKLQkJCQkJCWZNZW1iZXJUYWJsZS5kaXNwb3NlKCk7Ci0JCQkJCQlmTWVtYmVyVGFibGU9IG5ldyBUYWJsZShmTWVtYmVyUGFuZSwgU1dULk5PTkUpOwotCQkJCQkJZk1lbWJlclBhbmUuc2V0Q29udGVudChmTWVtYmVyVGFibGUpOwotCQkJCQl9Ci0JCQkJCVRhYmxlSXRlbSB0aT0gbmV3IFRhYmxlSXRlbShmTWVtYmVyVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJdGkuc2V0VGV4dChVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJub0FkZGl0aW9uYWxNZW1iZXJzTWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZkVkaXRpb25UcmVlICE9IG51bGwgJiYgIWZFZGl0aW9uVHJlZS5pc0Rpc3Bvc2VkKCkgJiYgZkVkaXRpb25UcmVlLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQlUcmVlSXRlbSB0aT0gbmV3IFRyZWVJdGVtKGZFZGl0aW9uVHJlZSwgU1dULk5PTkUpOwotCQkJCXRpLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAibm90Rm91bmRJbkxvY2FsSGlzdG9yeU1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGZNZW1iZXJFZGl0aW9ucyA9PSBudWxsKQotCQkJZk1lbWJlckVkaXRpb25zPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoZk11bHRpU2VsZWN0ICYmIGZNZW1iZXJTZWxlY3Rpb24gPT0gbnVsbCkKLQkJCWZNZW1iZXJTZWxlY3Rpb249IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlJVHlwZWRFbGVtZW50IGl0ZW09IHBhaXIuZ2V0SXRlbSgpOwotCQlMaXN0IGVkaXRpb25zPSAoTGlzdCkgZk1lbWJlckVkaXRpb25zLmdldChpdGVtKTsKLQkJaWYgKGVkaXRpb25zID09IG51bGwpIHsKLQkJCWVkaXRpb25zPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmTWVtYmVyRWRpdGlvbnMucHV0KGl0ZW0sIGVkaXRpb25zKTsKLQkJCWlmIChmTWVtYmVyVGFibGUgIT0gbnVsbCAmJiAhZk1lbWJlclRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCUlUeXBlZEVsZW1lbnQgdGU9IGl0ZW07Ci0JCQkJU3RyaW5nIG5hbWU9IHRlLmdldE5hbWUoKTsKLQkJCQkKLQkJCQkvLyBmaW5kIHBvc2l0aW9uCi0JCQkJVGFibGVJdGVtW10gaXRlbXM9IGZNZW1iZXJUYWJsZS5nZXRJdGVtcygpOwotCQkJCWludCB3aGVyZT0gaXRlbXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCB3aGVyZTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0JCQkJCWlmIChuLmNvbXBhcmVUbyhuYW1lKSA+IDApIHsKLQkJCQkJCXdoZXJlPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJVGFibGVJdGVtIHRpPSBuZXcgVGFibGVJdGVtKGZNZW1iZXJUYWJsZSwgd2hlcmUsIFNXVC5OVUxMKTsKLQkJCQl0aS5zZXRJbWFnZSh0ZS5nZXRJbWFnZSgpKTsKLQkJCQl0aS5zZXRUZXh0KG5hbWUpOwotCQkJCXRpLnNldERhdGEoZWRpdGlvbnMpOwotCQkJfQotCQl9Ci0JCWlmIChmSGlkZUlkZW50aWNhbCkgewotCQkJUGFpciBsYXN0PSBmVGFyZ2V0UGFpcjsKLQkJCWludCBzaXplPSBlZGl0aW9ucy5zaXplKCk7Ci0JCQlpZiAoc2l6ZSA+IDApCi0JCQkJbGFzdD0gKFBhaXIpIGVkaXRpb25zLmdldChzaXplLTEpOwotCQkJaWYgKGxhc3QgIT0gbnVsbCAmJiBsYXN0LmVxdWFscyhwYWlyKSkKLQkJCQlyZXR1cm47CS8vIGRvbid0IGFkZCBzaW5jZSB0aGUgbmV3IG9uZSBpcyBlcXVhbCB0byBvbGQKLQkJfQotCQllZGl0aW9ucy5hZGQocGFpcik7Ci0JCQotCQlpZiAoIWZBZGRNb2RlIHx8IGVkaXRpb25zID09IGZDdXJyZW50RWRpdGlvbnMpCi0JCQlhZGRFZGl0aW9uKHBhaXIpOwotCX0KLQkJCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcyBzaW5jZSBKYW4gMXN0LCAxOTcwLgotCSAqIFRoZSBnaXZlbiBkYXRlIGlzIGNvbnZlcnRlZCB0byBHTVQgYW5kIGRheWxpZ2h0IHNhdmluZyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG9vLgotCSAqLwotCXByaXZhdGUgbG9uZyBkYXlOdW1iZXIobG9uZyBkYXRlKSB7Ci0JCWludCBPTkVfREFZX01TPSAyNCo2MCo2MCAqIDEwMDA7IC8vIG9uZSBkYXkgaW4gbWlsbGkgc2Vjb25kcwotCQkKLQkJQ2FsZW5kYXIgY2FsZW5kYXI9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCWxvbmcgbG9jYWxUaW1lT2Zmc2V0PSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpOwotCQkKLQkJcmV0dXJuIChkYXRlICsgbG9jYWxUaW1lT2Zmc2V0KSAvIE9ORV9EQVlfTVM7Ci0JfQotCQotCS8qCi0JICogQWRkcyB0aGUgZ2l2ZW4gUGFpciB0byB0aGUgZWRpdGlvbiB0cmVlLgotCSAqIEl0IHRha2VzIGNhcmUgb2YgY3JlYXRpbmcgdHJlZSBub2RlcyBmb3IgZGlmZmVyZW50IGRhdGVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFZGl0aW9uKFBhaXIgcGFpcikgewotCQlpZiAoZkVkaXRpb25UcmVlID09IG51bGwgfHwgZkVkaXRpb25UcmVlLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGZpbmQgbGFzdCBkYXkKLQkJVHJlZUl0ZW1bXSBkYXlzPSBmRWRpdGlvblRyZWUuZ2V0SXRlbXMoKTsKLQkJVHJlZUl0ZW0gbGFzdERheT0gbnVsbDsKLQkJaWYgKGRheXMubGVuZ3RoID4gMCkKLQkJCWxhc3REYXk9IGRheXNbZGF5cy5sZW5ndGgtMV07Ci0JCQotCQlib29sZWFuIGZpcnN0PSBsYXN0RGF5ID09IG51bGw7Ci0JCQotCQlJVHlwZWRFbGVtZW50IGVkaXRpb249IHBhaXIuZ2V0RWRpdGlvbigpOwotCQlJVHlwZWRFbGVtZW50IGl0ZW09IHBhaXIuZ2V0SXRlbSgpOwotCQkKLQkJbG9uZyBsZGF0ZT0gKChJTW9kaWZpY2F0aW9uRGF0ZSllZGl0aW9uKS5nZXRNb2RpZmljYXRpb25EYXRlKCk7CQkKLQkJbG9uZyBkYXk9IGRheU51bWJlcihsZGF0ZSk7Ci0JCURhdGUgZGF0ZT0gbmV3IERhdGUobGRhdGUpOwotCQlpZiAobGFzdERheSA9PSBudWxsIHx8IGRheSAhPSBkYXlOdW1iZXIoKChEYXRlKWxhc3REYXkuZ2V0RGF0YSgpKS5nZXRUaW1lKCkpKSB7Ci0JCQlsYXN0RGF5PSBuZXcgVHJlZUl0ZW0oZkVkaXRpb25UcmVlLCBTV1QuTk9ORSk7Ci0JCQlpZiAoZkRhdGVJbWFnZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGljb25OYW1lPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkYXRlSWNvbiIsICJvYmoxNi9kYXlfb2JqLmdpZiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQlJbWFnZURlc2NyaXB0b3IgaWQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoaWNvbk5hbWUpOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQlmRGF0ZUltYWdlPSBpZC5jcmVhdGVJbWFnZSgpOwotCQkJfQotCQkJbGFzdERheS5zZXRJbWFnZShmRGF0ZUltYWdlKTsKLQkJCVN0cmluZyBkZj0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQoZGF0ZSk7Ci0JCQlsb25nIHRvZGF5PSBkYXlOdW1iZXIoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCi0JCQlTdHJpbmcgZm9ybWF0S2V5OwotCQkJaWYgKGRheSA9PSB0b2RheSkKLQkJCQlmb3JtYXRLZXk9ICJ0b2RheUZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGRheSA9PSB0b2RheS0xKQotCQkJCWZvcm1hdEtleT0gInllc3RlcmRheUZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlmb3JtYXRLZXk9ICJkYXlGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGF0dGVybj0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCBmb3JtYXRLZXkpOwotCQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCQlkZj0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgbmV3IFN0cmluZ1tdIHsgZGYgfSk7Ci0JCQlsYXN0RGF5LnNldFRleHQoZGYpOwotCQkJbGFzdERheS5zZXREYXRhKGRhdGUpOwotCQl9Ci0JCVRyZWVJdGVtIHRpPSBuZXcgVHJlZUl0ZW0obGFzdERheSwgU1dULk5PTkUpOwotCQl0aS5zZXRJbWFnZShnZXRFZGl0aW9uSW1hZ2UoZWRpdGlvbiwgaXRlbSkpOwotCQkKLQkJU3RyaW5nIHM9IGdldFNob3J0RWRpdGlvbkxhYmVsKGVkaXRpb24sIGl0ZW0sIGRhdGUpOwotCQlpZiAocGFpci5mSGFzRXJyb3IpIHsKLQkJCVN0cmluZyBwYXR0ZXJuPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJwYXJzZUVycm9yRm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXM9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIG5ldyBTdHJpbmdbXSB7IHMgfSApOwotCQl9Ci0JCXRpLnNldFRleHQocyk7Ci0JCQotCQl0aS5zZXREYXRhKHBhaXIpOwotCQkKLQkJLy8gZGV0ZXJtaW5lIHNlbGVjdGVkIFRyZWVJdGVtCi0JCVRyZWVJdGVtIHNlbGVjdGlvbj0gZmlyc3QgPyB0aSA6IG51bGw7Ci0JCWlmIChmTWVtYmVyU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBzZWxlY3RlZD0gZk1lbWJlclNlbGVjdGlvbi5nZXQoZkN1cnJlbnRFZGl0aW9ucyk7Ci0JCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCWlmIChzZWxlY3RlZCA9PSBwYWlyLmdldEl0ZW0oKSkKLQkJCQkJc2VsZWN0aW9uPSB0aTsKLQkJCQllbHNlCi0JCQkJCXNlbGVjdGlvbj0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWZFZGl0aW9uVHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBzZWxlY3Rpb24gfSk7Ci0JCQlpZiAoIWZBZGRNb2RlKQotCQkJCWZFZGl0aW9uVHJlZS5zZXRGb2N1cygpOwotCQkJZmVlZElucHV0KHNlbGVjdGlvbik7Ci0JCX0KLQkJCi0JCWlmIChmaXJzdCkgLy8gZXhwYW5kIGZpcnN0IG5vZGUKLQkJCWxhc3REYXkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JfQotCQkJCQkJCi0JLyoKLQkgKiBGZWVkcyBzZWxlY3Rpb24gZnJvbSBtZW1iZXIgdmlld2VyIHRvIGVkaXRpb24gdmlld2VyLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVNZW1iZXJTZWxlY3QoV2lkZ2V0IHcpIHsKLQkJT2JqZWN0IGRhdGE9IHcuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgZWRpdGlvbnM9IChMaXN0KSBkYXRhOwotCQkJaWYgKGVkaXRpb25zICE9IGZDdXJyZW50RWRpdGlvbnMpIHsKLQkJCQlmQ3VycmVudEVkaXRpb25zPSBlZGl0aW9uczsKLQkJCQlmRWRpdGlvblRyZWUucmVtb3ZlQWxsKCk7Ci0JCQkJCi0JCQkJU3RyaW5nIHBhdHRlcm49IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRyZWVUaXRsZUZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRpdGxlPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBuZXcgT2JqZWN0W10geyAoKEl0ZW0pdykuZ2V0VGV4dCgpIH0pOwotCQkJCWZFZGl0aW9uUGFuZS5zZXRUZXh0KHRpdGxlKTsKLQkJCQkJCQkJCi0JCQkJSXRlcmF0b3IgaXRlcj0gZWRpdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGl0ZW09IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBhaXIpCi0JCQkJCQlhZGRFZGl0aW9uKChQYWlyKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoIWZDb21wYXJlICYmIGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJSUNvbXBhcmVJbnB1dCBjaT0gKElDb21wYXJlSW5wdXQpIGlucHV0OwotCQkJaWYgKGZUYXJnZXRJc1JpZ2h0KQotCQkJCWlucHV0PSBjaS5nZXRMZWZ0KCk7Ci0JCQllbHNlCi0JCQkJaW5wdXQ9IGNpLmdldFJpZ2h0KCk7Ci0JCX0KLQkJZkNvbnRlbnRQYW5lLnNldElucHV0KGlucHV0KTsKLQkJaWYgKGZTdHJ1Y3R1cmVkQ29tcGFyZVBhbmUgIT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkQ29tcGFyZVBhbmUuc2V0SW5wdXQoaW5wdXQpOwotCX0KLQkKLQkvKgotCSAqIEZlZWRzIHNlbGVjdGlvbiBmcm9tIGVkaXRpb24gdmlld2VyIHRvIGNvbnRlbnQgKGFuZCBzdHJ1Y3R1cmUpIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmVlZElucHV0KFdpZGdldCB3KSB7Ci0JCU9iamVjdCBpbnB1dD0gdy5nZXREYXRhKCk7Ci0JCWJvb2xlYW4gaXNPSz0gZmFsc2U7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIFBhaXIpIHsKLQkJCVBhaXIgcGFpcj0gKFBhaXIpIGlucHV0OwotCQkJZlNlbGVjdGVkSXRlbT0gcGFpci5nZXRJdGVtKCk7Ci0JCQlpc09LPSAhcGFpci5mSGFzRXJyb3I7Ci0JCQkKLQkJCUlUeXBlZEVsZW1lbnQgZWRpdGlvbj0gcGFpci5nZXRFZGl0aW9uKCk7Ci0JCQlTdHJpbmcgZWRpdGlvbkxhYmVsPSBnZXRFZGl0aW9uTGFiZWwoZWRpdGlvbiwgZlNlbGVjdGVkSXRlbSk7Ci0JCQlJbWFnZSBlZGl0aW9uSW1hZ2U9IGdldEVkaXRpb25JbWFnZShlZGl0aW9uLCBmU2VsZWN0ZWRJdGVtKTsKLQkJCQkJCi0JCQlpZiAoZkFkZE1vZGUpIHsKLQkJCQlpZiAoZk1lbWJlclNlbGVjdGlvbiAhPSBudWxsKQotCQkJCQlmTWVtYmVyU2VsZWN0aW9uLnB1dChmQ3VycmVudEVkaXRpb25zLCBmU2VsZWN0ZWRJdGVtKTsKLQkJCQlzZXRJbnB1dChmU2VsZWN0ZWRJdGVtKTsKLQkJCQlmQ29udGVudFBhbmUuc2V0VGV4dChlZGl0aW9uTGFiZWwpOwotCQkJCWZDb250ZW50UGFuZS5zZXRJbWFnZShlZGl0aW9uSW1hZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChmVGFyZ2V0SXNSaWdodCkgewotCQkJCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0TGVmdExhYmVsKGVkaXRpb25MYWJlbCk7Ci0JCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRMZWZ0SW1hZ2UoZWRpdGlvbkltYWdlKTsKLQkJCQkJc2V0SW5wdXQobmV3IERpZmZOb2RlKGZTZWxlY3RlZEl0ZW0sIGZUYXJnZXRQYWlyLmdldEl0ZW0oKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRSaWdodExhYmVsKGVkaXRpb25MYWJlbCk7Ci0JCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRSaWdodEltYWdlKGVkaXRpb25JbWFnZSk7Ci0JCQkJCXNldElucHV0KG5ldyBEaWZmTm9kZShmVGFyZ2V0UGFpci5nZXRJdGVtKCksIGZTZWxlY3RlZEl0ZW0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmU2VsZWN0ZWRJdGVtPSBudWxsOwotCQkJc2V0SW5wdXQobnVsbCk7Ci0JCX0KLQkJaWYgKGZDb21taXRCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKGZNdWx0aVNlbGVjdCkKLQkJCQlmQ29tbWl0QnV0dG9uLnNldEVuYWJsZWQoaXNPSyAmJiBmU2VsZWN0ZWRJdGVtICE9IG51bGwgJiYgZkFycmF5TGlzdC5zaXplKCkgPiAwKTsKLQkJCWVsc2UKLQkJCQlmQ29tbWl0QnV0dG9uLnNldEVuYWJsZWQoaXNPSyAmJiBmU2VsZWN0ZWRJdGVtICE9IG51bGwgJiYgZlRhcmdldFBhaXIuZ2V0SXRlbSgpICE9IGZTZWxlY3RlZEl0ZW0pOwotCQl9Ci0JfQotCQotCS8qCi0JICogRmVlZHMgc2VsZWN0aW9uIGZyb20gc3RydWN0dXJlIHZpZXdlciB0byBjb250ZW50IHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmVlZElucHV0MihJU2VsZWN0aW9uIHNlbCkgewotCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJCWlmIChzcy5zaXplKCkgPT0gMSkKLQkJCQlmQ29udGVudFBhbmUuc2V0SW5wdXQoc3MuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9IaXN0b3J5SXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9IaXN0b3J5SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDNhY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSGlzdG9yeUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JUmVzb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGVTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBIGNvbWJpbmF0aW9uIDxjb2RlPklGaWxlU3RhdGU8L2NvZGU+IGFuZCA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPiB0aGF0IGNhbiBiZSB1c2VkIGFzCi0gKiBhbiBpbnB1dCB0byBhIGNvbXBhcmUgdmlld2VyIG9yIG90aGVyIHBsYWNlcyB3aGVyZSBhbiA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPgotICogaXMgbmVlZGVkLgotICogPHA+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3M7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSGlzdG9yeUl0ZW0gaW1wbGVtZW50cyBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciwgSVR5cGVkRWxlbWVudCwgSU1vZGlmaWNhdGlvbkRhdGUsIElSZXNvdXJjZVByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZkJhc2U7Ci0JcHJpdmF0ZSBJRmlsZVN0YXRlIGZGaWxlU3RhdGU7IAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkhpc3RvcnlJdGVtPC9jb2RlPiBvYmplY3Qgd2hpY2ggY29tYmluZXMgdGhlIGdpdmVuIDxjb2RlPklGaWxlU3RhdGU8L2NvZGU+Ci0JICogYW5kIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+IGludG8gYW4gb2JqZWN0Ci0JICogd2hpY2ggaXMgc3VpdGFibGUgYXMgaW5wdXQgZm9yIGEgY29tcGFyZSB2aWV3ZXIgb3IgPGNvZGU+UmVwbGFjZVdpdGhFZGl0aW9uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBiYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gaW50ZXJmYWNlIGRlbGVnYXRlcyB0byB0aGlzIGJhc2UgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4KLQkgKiBAcGFyYW0gZmlsZVN0YXRlIHRoZSA8Y29kZT5JRmlsZVN0YXRlPC9jb2RlPiBmcm9tIHdoaWNoIHRoZSBzdHJlYW1hYmxlIGNvbnRlbnRzIGFuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgaXMgZGVyaXZlZCBmcm9tCi0JICovCi0JcHVibGljIEhpc3RvcnlJdGVtKElUeXBlZEVsZW1lbnQgYmFzZSwgSUZpbGVTdGF0ZSBmaWxlU3RhdGUpIHsKLQkJZkJhc2U9IGJhc2U7Ci0JCWZGaWxlU3RhdGU9IGZpbGVTdGF0ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIHNlZSBJVHlwZWRFbGVtZW50LmdldE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmQmFzZS5nZXROYW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXRJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGZCYXNlLmdldEltYWdlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXRUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZkJhc2UuZ2V0VHlwZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBzZWUgSU1vZGlmaWNhdGlvbkRhdGUuZ2V0TW9kaWZpY2F0aW9uRGF0ZQotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBmRmlsZVN0YXRlLmdldE1vZGlmaWNhdGlvblRpbWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIHNlZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yLmdldENvbnRlbnRzCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZkZpbGVTdGF0ZS5nZXRDb250ZW50cygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLklFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yI2dldENoYXJzZXQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgU3RyaW5nIGNoYXJzZXQ9IGZGaWxlU3RhdGUuZ2V0Q2hhcnNldCgpOyAKLQkgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotCQkgICAgSVJlc291cmNlIHJlc291cmNlPSBnZXRSZXNvdXJjZSgpOwotCQkgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUVuY29kZWRTdG9yYWdlKQotCQkgICAgCWNoYXJzZXQ9ICgoSUVuY29kZWRTdG9yYWdlKXJlc291cmNlKS5nZXRDaGFyc2V0KCk7Ci0JICAgIH0KLQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JUmVzb3VyY2VQcm92aWRlciNnZXRSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkgICAgSVBhdGggZnVsbFBhdGg9IGZGaWxlU3RhdGUuZ2V0RnVsbFBhdGgoKTsKLQkgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmdWxsUGF0aCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb21wYXJlTmF2aWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb21wYXJlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTljMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JQ29tcGFyZU5hdmlnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLS8qKgotICogQSA8Y29kZT5JQ29tcGFyZU5hdmlnYXRvcjwvY29kZT4gaXMgdXNlZCB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBpbmRpdmlkdWFsCi0gKiBkaWZmZXJlbmNlcyBvZiBhIDxjb2RlPkNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4uCi0gKiA8cD4KLSAqIFBsZWFzZSBub3RlOiB0aGUgZm9sbG93aW5nIG1pZ2h0IGNoYW5nZSBiZWZvcmUgdGhlIGZpbmFsIHJlbGVhc2Ugb2YgRWNsaXBzZSAzLjAuCi0gKiBZb3UgY2FuIHJldHJpZXZlIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIDxjb2RlPklDb21wYXJlTmF2aWdhdG9yPC9jb2RlPiBmcm9tIGEKLSAqIDxjb2RlPkNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4gYnkgY2FsbGluZyA8Y29kZT5nZXRBZGFwdGVyKElDb21wYXJlTmF2aWdhdG9yKTwvY29kZT4KLSAqIG9uIHRoZSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+LgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wYXJlTmF2aWdhdG9yIHsKLQkKLQkvKioKLQkgKiBTdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvbiA8Y29kZT5zZWxlY3RDaGFuZ2U8L2NvZGU+IHNlbGVjdHMgYW5kIHJldmVhbHMgdGhlIG5leHQgKHByZXZpb3VzKSBjaGFuZ2UuCi0JICogSWYgdGhlIGVuZCAob3IgYmVnaW5uaW5nKSBpcyByZWFjaGVkLCB0aGUgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG5leHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG5leHQgY2hhbmdlIGlzIHNlbGVjdGVkLCBvdGhlcndpc2UgdGhlIHByZXZpb3VzIGNoYW5nZQotCSAqIEByZXR1cm4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmQgKGJlZ2lubmluZykgaXMgcmVhY2hlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdENoYW5nZShib29sZWFuIG5leHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyNjBmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi0vKioKLSAqIEFuIDxjb2RlPklDb250ZW50Q2hhbmdlTGlzdGVuZXI8L2NvZGU+IGlzIGluZm9ybWVkIGFib3V0IGNvbnRlbnQgY2hhbmdlcyBvZiBhIAotICogPGNvZGU+SUNvbnRlbnRDaGFuZ2VOb3RpZmllcjwvY29kZT4uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElDb250ZW50Q2hhbmdlTm90aWZpZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudENoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuZXZlciB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gc291cmNlIGhhcyBjaGFuZ2VkLgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHdob3NlIGNvbnRlbnRzIGhhcyBjaGFuZ2VkCi0JICovCi0Jdm9pZCBjb250ZW50Q2hhbmdlZChJQ29udGVudENoYW5nZU5vdGlmaWVyIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb250ZW50Q2hhbmdlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUNvbnRlbnRDaGFuZ2VOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY2ODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUNvbnRlbnRDaGFuZ2VOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgb2JqZWN0cyB0aGF0IHByb3ZpZGUgYSBtZWFucyBmb3IgcmVnaXN0ZXJpbmcKLSAqIGZvciBjb250ZW50IGNoYW5nZSBub3RpZmljYXRpb24uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElDb250ZW50Q2hhbmdlTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudENoYW5nZU5vdGlmaWVyIHsKLQkKLQkvKioKLQkgKiBBZGRzIGEgY29udGVudCBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBub3RpZmllci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBjb250ZW50IGNoYW5nZWQgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZENvbnRlbnRDaGFuZ2VMaXN0ZW5lcihJQ29udGVudENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250ZW50IGNoYW5nZWQgbGlzdGVuZXIgZnJvbSB0aGlzIG5vdGlmaWVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgY29udGVudCBjaGFuZ2VkIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVDb250ZW50Q2hhbmdlTGlzdGVuZXIoSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lFZGl0YWJsZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVkaXRhYmxlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzZDhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVkaXRhYmxlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3Igb2JqZWN0cyB3aXRoIGVkaXRhYmxlIGNvbnRlbnRzLgotICogVHlwaWNhbGx5IGl0IGlzIGltcGxlbWVudGVkIGJ5IG9iamVjdHMgdGhhdCBhbHNvIGltcGxlbWVudAotICogdGhlIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+IGludGVyZmFjZS4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgaW1wbGVtZW50aW5nIDxjb2RlPklFZGl0YWJsZUNvbnRlbnQ8L2NvZGU+IGRvZXMgbm90Ci0gKiBhdXRvbWF0aWNhbGx5IG1lYW4gdGhhdCBpdCBpcyBlZGl0YWJsZS4gQW4gb2JqZWN0IGlzIG9ubHkgZWRpdGFibGUgaWYKLSAqIGl0IGltcGxlbWVudHMgPGNvZGU+SUVkaXRhYmxlQ29udGVudDwvY29kZT4gYW5kIHRoZSA8Y29kZT5pc0VkaXRhYmxlPC9jb2RlPiBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KLSAqCi0gKiBAc2VlIElTdHJlYW1Db250ZW50QWNjZXNzb3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdGFibGVDb250ZW50IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGNhbiBiZSBtb2RpZmllZC4KLQkgKiBJZiBpdCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBjYW4gYmUgbW9kaWZpZWQKLQkgKi8KLQlib29sZWFuIGlzRWRpdGFibGUoKTsKLQkJCQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IGNvbnRlbnQgd2l0aCB0aGUgZ2l2ZW4gbmV3IGJ5dGVzLgotCSAqIAotCSAqIEBwYXJhbSBuZXdDb250ZW50IHRoaXMgbmV3IGNvbnRlbnRzIHJlcGxhY2VzIHRoZSBvbGQgY29udGVudHMKLQkgKi8KLQl2b2lkIHNldENvbnRlbnQoYnl0ZVtdIG5ld0NvbnRlbnQpOyAKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhIHBhcmVudCB0byBhZGQgb3IgcmVtb3ZlIGEgY2hpbGQsCi0JICogb3IgdG8gY29weSB0aGUgY29udGVudHMgb2YgYSBjaGlsZC4KLQkgKiAKLQkgKiBXaGF0IHRvIGRvIGlzIGVuY29kZWQgaW4gdGhlIHR3byBhcmd1bWVudHMgYXMgZm9sbG93czoKLQkgKiA8VEFCTEU+Ci0JICogPFRSPgotCSAqIAk8VEQ+YWRkOjwvVEQ+Ci0JICogIDxURD5kZXN0ID09IG51bGw8L1REPgotCSAqICA8VEQ+c3JjICE9IG51bGw8L1REPgotCSAqIDwvVFI+Ci0JICogPFRSPgotCSAqIAk8VEQ+cmVtb3ZlOjwvVEQ+Ci0JICogIDxURD5kZXN0ICE9IG51bGw8L1REPgotCSAqICA8VEQ+c3JjID09IG51bGw8L1REPgotCSAqIDwvVFI+Ci0JICogPFRSPgotCSAqIAk8VEQ+Y29weTo8L1REPgotCSAqICA8VEQ+ZGVzdCAhPSBudWxsPC9URD4KLQkgKiAgPFREPnNyYyAhPSBudWxsPC9URD4KLQkgKiA8L1RSPgotCSAqIDwvVEFCTEU+Ci0JICogQHBhcmFtIGRlc3QgdGhlIGV4aXN0aW5nIGNoaWxkIG9mIHRoaXMgb2JqZWN0IHRvIGJlIHJlcGxhY2VkOyBpZiA8Y29kZT5udWxsPC9udWxsPiBhIG5ldyBjaGlsZCBjYW4gYmUgYWRkZWQuCi0JICogQHBhcmFtIHNyYyB0aGUgbmV3IGNoaWxkIHRvIGJlIGFkZGVkIG9yIHJlcGxhY2VkOyBpZiA8Y29kZT5udWxsPC9jb2RlPiBhbiBleGlzdGluZyBjaGlsZCBjYW4gYmUgcmVtb3ZlZC4KLQkgKiBAcmV0dXJuIHRoZSBhcmd1bWVudCA8Y29kZT5kZXN0PC9jb2RlPgotCSAqLwotCUlUeXBlZEVsZW1lbnQgcmVwbGFjZShJVHlwZWRFbGVtZW50IGRlc3QsIElUeXBlZEVsZW1lbnQgc3JjKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiYzI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEV4dGVuc2lvbiBmb3IgPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4uIEV4dGVuZHMgdGhlIG9yaWdpbmFsCi0gKiBjb25jZXB0IG9mIGEgPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4gdG8gYW5zd2VyIHRoZSBDaGFyc2V0IChlbmNvZGluZykgdXNlZCBmb3IgdGhlIHN0cmVhbS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yIGV4dGVuZHMgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIGNoYXJzZXQgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aGVuIGRlY29kaW5nIHRoaXMgCi0JICogc3RyZWFtIGFjY2Vzc29yJ3MgY29udGVudHMgaW50byBjaGFyYWN0ZXJzLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgcHJvcGVyIAotCSAqIGVuY29kaW5nIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotCSAqIDxwPgotCSAqIDxiPk5vdGU8L2I+OiAgdGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgd2hldGhlciB0aGUgcmVzdWx0IGlzIGEgc3VwcG9ydGVkCi0JICogY2hhcnNldCBuYW1lLiBDYWxsZXJzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgCi0JICogPGNvZGU+VW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjwvY29kZT4gd2hlcmUgdGhpcyBjaGFyc2V0IGlzIHVzZWQuIAotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGEgY2hhcnNldCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3IgaGFwcGVucyB3aGlsZSBkZXRlcm1pbmluZyAKLQkgKiB0aGUgY2hhcnNldC4gU2VlIGFueSByZWZpbmVtZW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQkgKiBAc2VlIElTdHJlYW1Db250ZW50QWNjZXNzb3IjZ2V0Q29udGVudHMKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JU3RyaW5nIGdldENoYXJzZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSU1vZGlmaWNhdGlvbkRhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSU1vZGlmaWNhdGlvbkRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lNb2RpZmljYXRpb25EYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBvYmplY3RzIHdpdGggYSBtb2RpZmljYXRpb24gZGF0ZS4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlCi0gKiBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgdG8gZ2l2ZSB0aGUgdXNlciBhIGdlbmVyYWwgaWRlYSBvZiBob3cgb2xkIGFuIG9iamVjdCBpcy4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RpZmljYXRpb25EYXRlIHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGlzIG9iamVjdC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBzaG91bGQgb25seSBiZSB1c2VkIHRvIGdpdmUgdGhlIHVzZXIgYSBnZW5lcmFsIGlkZWEgb2YgaG93Ci0JICogb2xkIHRoZSBvYmplY3QgaXMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCBHTVQKLQkgKi8KLQlsb25nIGdldE1vZGlmaWNhdGlvbkRhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlYjU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgb2JqZWN0cyB0aGF0IHByb3ZpZGUgYSBtZWFucyBmb3IgcmVnaXN0ZXJpbmcKLSAqIGZvciBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIgewotCQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIG5vdGlmaWVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29udGVudCBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIG5vdGlmaWVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lTdHJlYW1Db250ZW50QWNjZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY4ZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQW4gPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4gb2JqZWN0IHJlcHJlc2VudHMgYSBzZXQgb2YgYnl0ZXMgd2hpY2ggY2FuIGJlCi0gKiBhY2Nlc3NlZCBieSBtZWFucyBvZiBhIHN0cmVhbS4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBvciB1c2UgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uLAotICogPGNvZGU+QnVmZmVyZWRDb250ZW50PC9jb2RlPi4KLSAqCi0gKiBAc2VlIEJ1ZmZlcmVkQ29udGVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCS8qKgotCSAqIFJldHVybnMgYW4gb3BlbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gZm9yIHRoaXMgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBvYmplY3QncyBjb250ZW50LgotCSAqIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHN0cmVhbSB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgaGFzIG5vIHN0cmVhbWFibGUgY29udGVudHMuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QgY291bGQgbm90IGJlIGFjY2Vzc2VkCi0JICovCi0JSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVN0cmVhbU1lcmdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JU3RyZWFtTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODFhMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JU3RyZWFtTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgc2luZ2xlIG9wZXJhdGlvbiBmb3IgcGVyZm9ybWluZyBhIHRocmVlLXdheSBtZXJnZSBvbiB0aHJlZQotICogaW5wdXQgc3RyZWFtcy4gVGhlIG1lcmdlZCByZXN1bHQgaXMgd3JpdHRlbiB0byBhbiBvdXRwdXQgc3RyZWFtLgotICogPHA+Ci0gKiBDbGllbnRzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHdoZW4gY29udHJpYnV0aW5nIG5ldyBtZXJnZXJzIHRvIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJlYW1NZXJnZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RyZWFtTWVyZ2VyIHsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBtZXJnZSBvcGVyYXRpb24gKHZhbHVlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LPSBJU3RhdHVzLk9LOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IGEgY2hhbmdlIGNvbmZsaWN0IHByZXZlbnRlZCB0aGUgbWVyZ2UgZnJvbSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKHZhbHVlIDxjb2RlPjE8L2NvZGU+KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZMSUNUPSAxOwotICAgIAotICAgIC8qKgotICAgICAqIFN0YXR1cyBjb2RlIGRlc2NyaWJpbmcgYW4gaW50ZXJuYWwgZXJyb3IgKHZhbHVlIDxjb2RlPjI8L2NvZGU+KQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfRVJST1I9IDI7Ci0JCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBtZXJnZSBvcGVyYXRpb24gb24gdGhlIGdpdmVuIGlucHV0IHN0cmVhbXMgYW5kIHdyaXRlcyB0aGUgbWVyZ2UgcmVzdWx0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqIE9uIHN1Y2Nlc3MgYSBzdGF0dXMgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaXMgcmV0dXJuZWQsIG9uIGVycm9yIGEgc3RhdHVzIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+LiAKLSAgICAgKiBJZiB0aGUgbWVyZ2Ugb3BlcmF0aW9uIGNhbm5vdCBkZWFsIHdpdGggY29uZmxpY3RzLCB0aGUgY29kZSBvZiB0aGUgZXJyb3Igc3RhdHVzIGhhcyB0aGUgdmFsdWUgPGNvZGU+SVN0cmVhbU1lcmdlci5DT05GTElDVDwvY29kZT4uCi0gICAgICogRm9yIHRleHQgb3JpZW50ZWQgbWVyZ2VycyB0aGUgZW5jb2RpbmcgZm9yIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMgaXMgaG9ub3JlZC4KLSAgICAgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgY2FsbGVycyB0byBjbG9zZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBtZXJnZSByZXN1bHQgaXMgd3JpdHRlbjsgdGhlIG1lcmdlciB3aWxsIG5vdCBjbG9zZSB0aGUgc3RyZWFtCi0gICAgICogQHBhcmFtIG91dHB1dEVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHBhcmFtIGFuY2VzdG9yIHRoZSBieXRlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBjb21tb24gYW5jZXN0b3IgaXMgcmVhZAotICAgICAqIEBwYXJhbSBhbmNlc3RvckVuY29kaW5nIHRoZSBlbmNvZGluZyBvZiB0aGUgYW5jZXN0b3IgaW5wdXQgYnl0ZSBzdHJlYW0KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBieXRlIHN0cmVhbSBjb250YWluaW5nIHRoZSB0YXJnZXQgb2YgdGhlIG1lcmdlCi0gICAgICogQHBhcmFtIHRhcmdldEVuY29kaW5nIHRoZSBlbmNvZGluZyBvZiB0aGUgdGFyZ2V0IGlucHV0IGJ5dGUgc3RyZWFtCi0gICAgICogQHBhcmFtIG90aGVyIHRoZSBieXRlIHN0cmVhbSBjb250YWluaW5nIHRoZSB0YXJnZXQgb2YgdGhlIG1lcmdlCi0gICAgICogQHBhcmFtIG90aGVyRW5jb2RpbmcgdGhlIGVuY29kaW5nIG9mIHRoZSBvdGhlciBpbnB1dCBieXRlIHN0cmVhbQotICAgICAqIEBwYXJhbSBtb25pdG9yIHJlcG9ydHMgcHJvZ3Jlc3Mgb2YgdGhlIG1lcmdlIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY29tcGxldGlvbiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotICAgICAqLwotCUlTdGF0dXMgbWVyZ2UoT3V0cHV0U3RyZWFtIG91dHB1dCwgU3RyaW5nIG91dHB1dEVuY29kaW5nLAotCQkJSW5wdXRTdHJlYW0gYW5jZXN0b3IsIFN0cmluZyBhbmNlc3RvckVuY29kaW5nLAotCQkJSW5wdXRTdHJlYW0gdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0RW5jb2RpbmcsCi0JCQlJbnB1dFN0cmVhbSBvdGhlciwgU3RyaW5nIG90aGVyRW5jb2RpbmcsCi0JICAgICAgICAJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVR5cGVkRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JVHlwZWRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWM4NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JVHlwZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIG5hbWUsIGltYWdlLCBhbmQgdHlwZSBmb3IgYW4gb2JqZWN0LgotICogPHA+Ci0gKiBUaGVzZSBtZXRob2RzIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBwcmVzZW50IGFuIGlucHV0IG9iamVjdCBpbiB0aGUgY29tcGFyZSBVSQotICogKDxjb2RlPmdldE5hbWU8L2NvZGU+IGFuZCA8Y29kZT5nZXRJbWFnZTwvY29kZT4pCi0gKiBhbmQgZm9yIGZpbmRpbmcgYSB2aWV3ZXIgZm9yIGEgZ2l2ZW4gaW5wdXQgdHlwZSAoPGNvZGU+Z2V0VHlwZTwvY29kZT4pLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGVkRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBUeXBlIGZvciBhIGZvbGRlciBpbnB1dCAodmFsdWUgPGNvZGU+IkZPTERFUiI8L2NvZGU+KS4KLQkgKiBGb2xkZXJzIGFyZSBjb21wYXJpc29uIGVsZW1lbnRzIHRoYXQgaGF2ZSBubyBjb250ZW50cywgb25seSBhIG5hbWUgYW5kIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9UWVBFPSAiRk9MREVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVHlwZSBmb3IgYW4gZWxlbWVudCB3aG9zZSBhY3R1YWwgdHlwZSBpcyB0ZXh0ICAodmFsdWUgPGNvZGU+InR4dCI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RZUEU9ICJ0eHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUeXBlIGZvciBhbiBlbGVtZW50IHdob3NlIGFjdHVhbCB0eXBlIGNvdWxkIG5vdAotCSAqIGJlIGRldGVybWluZWQuICh2YWx1ZSA8Y29kZT4iPz8/IjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fVFlQRT0gIj8/PyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBvYmplY3QuCi0JICogVGhlIG5hbWUgaXMgdXNlZCB3aGVuIGRpc3BsYXlpbmcgdGhpcyBvYmplY3QgaW4gdGhlIFVJLgotCSAqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG9iamVjdAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGZvciB0aGlzIG9iamVjdC4KLQkgKiBUaGlzIGltYWdlIGlzIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoaXMgb2JqZWN0IGluIHRoZSBVSS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGltYWdlIG9mIHRoaXMgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBpbnB1dCBoYXMgbm8gaW1hZ2UKLQkgKi8KLQlJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIG9iamVjdC4gRm9yIG9iamVjdHMgd2l0aCBhIGZpbGUgbmFtZQotCSAqIHRoaXMgaXMgdHlwaWNhbGx5IHRoZSBmaWxlIGV4dGVuc2lvbi4gRm9yIGZvbGRlcnMgaXRzIHRoZSBjb25zdGFudAotCSAqIDxjb2RlPkZPTERFUl9UWVBFPC9jb2RlPi4KLQkgKiBUaGUgdHlwZSBpcyB1c2VkIGZvciBkZXRlcm1pbmluZyBhIHN1aXRhYmxlIHZpZXdlciBmb3IgdGhpcyBvYmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgb2JqZWN0Ci0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVZpZXdlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVZpZXdlckNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YjI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lWaWV3ZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEEgZmFjdG9yeSBvYmplY3QgZm9yIDxjb2RlPlZpZXdlcjwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBjcmVhdGluZyBhIDxjb2RlPlZpZXdlcjwvY29kZT4gZnJvbSBhIHBsdWdpbi54bWwgZmlsZS4KLSAqIFNpbmNlIDxjb2RlPlZpZXdlcjwvY29kZT5zIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvciB0aGV5IGNhbm5vdCBiZQotICogaW5zdGFudGlhdGVkIGRpcmVjdGx5IHdpdGggPGNvZGU+Q2xhc3MuZm9yTmFtZTwvY29kZT4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpZXdlckNyZWF0b3IgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB2aWV3ZXIgdW5kZXIgdGhlIGdpdmVuIFNXVCBwYXJlbnQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29udHJvbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhlIHZpZXdlcidzIFNXVCBjb250cm9sCi0JICogQHBhcmFtIGNvbmZpZyBhIGNvbXBhcmUgY29uZmlndXJhdGlvbiB0aGUgbmV3bHkgY3JlYXRlZCB2aWV3ZXIgbWlnaHQgd2FudCB0byB1c2UKLQkgKiBAcmV0dXJuIGEgbmV3IHZpZXdlcgotCSAqLwotCVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvTmF2aWdhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9OYXZpZ2F0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGEwN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9OYXZpZ2F0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPk5hdmlnYXRpb25BY3Rpb248L2NvZGU+IGlzIHVzZWQgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbAotICogZGlmZmVyZW5jZXMgb2YgYSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+LgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQotCXByaXZhdGUgYm9vbGVhbiBmTmV4dDsKLQlwcml2YXRlIENvbXBhcmVFZGl0b3JJbnB1dCBmQ29tcGFyZUVkaXRvcklucHV0OwotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5OYXZpZ2F0aW9uQWN0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuZXh0IGlmIDxjb2RlPnRydWU8L2NvZGU+IGFjdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGRpZmZlcmVuY2U7IG90aGVyd2lzZSB0byB0aGUgcHJldmlvdXMgZGlmZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdGlvbkFjdGlvbihib29sZWFuIG5leHQpIHsKLQkJdGhpcyhDb21wYXJlVUkuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPk5hdmlnYXRpb25BY3Rpb248L2NvZGU+IHRoYXQgaW5pdGlhbGl6ZXMgaXRzIGF0dHJpYnV0ZXMKLQkgKiBmcm9tIHRoZSBnaXZlbiA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYnVuZGxlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgYWN0aW9uCi0JICogQHBhcmFtIG5leHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gYWN0aW9uIGdvZXMgdG8gdGhlIG5leHQgZGlmZmVyZW5jZTsgb3RoZXJ3aXNlIHRvIHRoZSBwcmV2aW91cyBkaWZmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBOYXZpZ2F0aW9uQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgYm9vbGVhbiBuZXh0KSB7Ci0JCVV0aWxpdGllcy5pbml0QWN0aW9uKHRoaXMsIGJ1bmRsZSwgbmV4dCA/ICJhY3Rpb24uTmV4dC4iIDogImFjdGlvbi5QcmV2aW91cy4iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZOZXh0PSBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGZDb21wYXJlRWRpdG9ySW5wdXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGFkYXB0ZXI9IGZDb21wYXJlRWRpdG9ySW5wdXQuZ2V0QWRhcHRlcihJQ29tcGFyZU5hdmlnYXRvci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb21wYXJlTmF2aWdhdG9yKSB7Ci0JCQkJYm9vbGVhbiBhdEVuZD0gKChJQ29tcGFyZU5hdmlnYXRvcilhZGFwdGVyKS5zZWxlY3RDaGFuZ2UoZk5leHQpOwotCQkJCVNoZWxsIHNoZWxsPSBDb21wYXJlVUlQbHVnaW4uZ2V0U2hlbGwoKTsKLQkJCQlpZiAoYXRFbmQgJiYgc2hlbGwgIT0gbnVsbCkgewotCQkJCQkKLQkJCQkJRGlzcGxheSBkaXNwbGF5PSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JCQkJCWlmIChkaXNwbGF5ICE9IG51bGwpCi0JCQkJCQlkaXNwbGF5LmJlZXAoKTsKLQotCQkJCQlTdHJpbmcgdGl0bGU7Ci0JCQkJCVN0cmluZyBtZXNzYWdlOwotCQkJCQlpZiAoZk5leHQpIHsKLQkJCQkJCXRpdGxlPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb21wYXJlTmF2aWdhdG9yLmF0RW5kLnRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1lc3NhZ2U9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbXBhcmVOYXZpZ2F0b3IuYXRFbmQubWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aXRsZT0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiQ29tcGFyZU5hdmlnYXRvci5hdEJlZ2lubmluZy50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltZXNzYWdlPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb21wYXJlTmF2aWdhdG9yLmF0QmVnaW5uaW5nLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIDxjb2RlPkNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4gb24gd2hpY2ggdGhpcyBhY3Rpb24gb3BlcmF0ZXMuCi0JICogCi0JICogQHBhcmFtIGlucHV0IHRoZSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+IG9uIHdoaWNoIHRoaXMgYWN0aW9uIG9wZXJhdGVzOyBpZiA8Y29kZT5udWxsPC9jb2RlPiBhY3Rpb24gZG9lcyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyZUVkaXRvcklucHV0KENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlmQ29tcGFyZUVkaXRvcklucHV0PSBpbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL1Jlc291cmNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9SZXNvdXJjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNGNjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL1Jlc291cmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSVJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JU3RydWN0dXJlQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlJlc291cmNlTm9kZTwvY29kZT4gd3JhcHBlcnMgYW4gPGNvZGU+SVJlc291cmNlczwvY29kZT4gc28gdGhhdCBpdCBjYW4gYmUgdXNlZAotICogYXMgaW5wdXQgZm9yIHRoZSBkaWZmZXJlbmNpbmcgZW5naW5lIChpbnRlcmZhY2VzIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPiBhbmQgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4pCi0gKiBhbmQgdGhlIDxjb2RlPlJlcGxhY2VXaXRoRWRpdGlvbkRpYWxvZzwvY29kZT4gKGludGVyZmFjZXMgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPklNb2RpZmljYXRpb25EYXRlPC9jb2RlPikuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3M7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICoKLSAqIEBzZWUgRWRpdGlvblNlbGVjdGlvbkRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VOb2RlIGV4dGVuZHMgQnVmZmVyZWRDb250ZW50Ci0JCQlpbXBsZW1lbnRzIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yLCBJU3RydWN0dXJlQ29tcGFyYXRvciwgSVR5cGVkRWxlbWVudCwKLQkJCQkJCQlJRWRpdGFibGVDb250ZW50LCBJTW9kaWZpY2F0aW9uRGF0ZSwgSVJlc291cmNlUHJvdmlkZXIgewotCQkJCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZlJlc291cmNlOwotCXByaXZhdGUgQXJyYXlMaXN0IGZDaGlsZHJlbjsKLQkJCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPlJlc291cmNlTm9kZTwvY29kZT4gZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VOb2RlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmUmVzb3VyY2U9IHJlc291cmNlOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlc291cmNlKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBmUmVzb3VyY2U7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5nZXRDb250ZW50cwotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZSZXNvdXJjZSBpbnN0YW5jZW9mIElTdG9yYWdlKQotCQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElNb2RpZmljYXRpb25EYXRlLmdldE1vZGlmaWNhdGlvbkRhdGUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25EYXRlKCkgewotCQlJUGF0aCBwYXRoPSBmUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJRmlsZSBmaWxlPSBwYXRoLnRvRmlsZSgpOwotCQlyZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJVHlwZWRFbGVtZW50LmdldE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChmUmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBmUmVzb3VyY2UuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXRUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAoZlJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCXJldHVybiBJVHlwZWRFbGVtZW50LkZPTERFUl9UWVBFOwotCQlpZiAoZlJlc291cmNlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzPSBmUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gczsKLQkJfQotCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXRJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIENvbXBhcmVVSS5nZXRJbWFnZShmUmVzb3VyY2UpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3RoZXIgb2JqZWN0IGlzIG9mIHR5cGUgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4KLQkgKiBhbmQgdGhlaXIgbmFtZXMgYXJlIGlkZW50aWNhbC4gVGhlIGNvbnRlbnQgaXMgbm90IGNvbnNpZGVyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBJVHlwZWRFbGVtZW50KSB7Ci0JCQlTdHJpbmcgb3RoZXJOYW1lPSAoKElUeXBlZEVsZW1lbnQpb3RoZXIpLmdldE5hbWUoKTsKLQkJCXJldHVybiBnZXROYW1lKCkuZXF1YWxzKG90aGVyTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGUgbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVN0cnVjdHVyZUNvbXBhcmF0b3IuZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZkNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoZlJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZSBtZW1iZXJzW109ICgoSUNvbnRhaW5lcilmUmVzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIGNoaWxkPSBjcmVhdGVDaGlsZChtZW1iZXJzW2ldKTsKLQkJCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQkJCWZDaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBOZWVkV29yawotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBob29rIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gb25jZSBmb3IgZXZlcnkKLQkgKiBtZW1iZXIgb2YgYSBjb250YWluZXIgcmVzb3VyY2UuIFRoaXMgaW1wbGVtZW50YXRpb24KLQkgKiBjcmVhdGVzIGEgbmV3IDxjb2RlPlJlc291cmNlTm9kZTwvY29kZT4gZm9yIHRoZSBnaXZlbiBjaGlsZCByZXNvdXJjZS4KLQkgKiBDbGllbnRzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBkaWZmZXJlbnQgdHlwZSBvZgotCSAqIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPiBvciB0byBmaWx0ZXIgY2hpbGRyZW4gYnkgcmV0dXJuaW5nIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCByZXNvdXJjZSBmb3Igd2hpY2ggYSA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4gbXVzdCBiZSByZXR1cm5lZAotCSAqIEByZXR1cm4gYSA8Y29kZT5SZXNvdXJjZU5vZGU8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gY2hpbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZUNvbXBhcmF0b3IgY3JlYXRlQ2hpbGQoSVJlc291cmNlIGNoaWxkKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VOb2RlKGNoaWxkKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgYW4gb3BlbiBzdHJlYW0gaWYgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgaW1wbGVtZW50cyB0aGUKLQkgKiA8Y29kZT5JU3RvcmFnZTwvY29kZT4gaW50ZXJmYWNlLiBPdGhlcndpc2UgdGhlIHZhbHVlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiBhIGJ1ZmZlcmVkIGlucHV0IHN0cmVhbSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JhZ2UKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmFnZSBjb3VsZCBub3QgYmUgYWNjZXNzZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gY3JlYXRlU3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZlJlc291cmNlIGluc3RhbmNlb2YgSVN0b3JhZ2UpIHsKLQkJCUlucHV0U3RyZWFtIGlzPSBudWxsOwotCQkJSVN0b3JhZ2Ugc3RvcmFnZT0gKElTdG9yYWdlKSBmUmVzb3VyY2U7Ci0JCQl0cnkgewotCQkJCWlzPSBzdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLk9VVF9PRl9TWU5DX0xPQ0FMKSB7Ci0JCQkJCWZSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCQkJaXM9IHN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJCQl9IGVsc2UKLQkJCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkJCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdGFibGVDb250ZW50LmlzRWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdGFibGVDb250ZW50LnJlcGxhY2UKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCByZXBsYWNlKElUeXBlZEVsZW1lbnQgY2hpbGQsIElUeXBlZEVsZW1lbnQgb3RoZXIpIHsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IjZ2V0Q2hhcnNldCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgewotCQlyZXR1cm4gVXRpbGl0aWVzLmdldENoYXJzZXQoZlJlc291cmNlKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvU3BsaXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvU3BsaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxYzE3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL1NwbGl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci0KLS8qKgotICogVGhlIFNwbGl0dGVyIGFkZHMgc3VwcG9ydCBmb3IgbmVzdGluZyB0byBhIFNhc2hGb3JtLgotICogPFA+Ci0gKiBJZiBTcGxpdHRlcnMgYXJlIG5lc3RlZCBkaXJlY3RseToKLSAqIDxVTD4KLSAqIDxMST5jaGFuZ2luZyB0aGUgdmlzaWJpbGl0eSBvZiBhIGNoaWxkIG1heSBwcm9wYWdhdGUgdXB3YXJkIHRvIHRoZSBwYXJlbnQgU3BsaXR0ZXIgaWYgdGhlIGNoaWxkCi0gKiBpcyB0aGUgbGFzdCBjaGlsZCB0byBiZWNvbWUgaW52aXNpYmxlIG9yIHRoZSBmaXJzdCB0byBiZWNvbWUgdmlzaWJsZS48L0xJPgotICogPExJPm1heGltaXppbmcgYSBjaGlsZCBtYWtlcyBpdCBhcyBsYXJnZSBhcyB0aGUgdG9wbW9zdCBlbmNsb3NpbmcgU3BsaXR0ZXI8L0xJPgotICogPC9VTD4KLSAqIAotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgU3BsaXR0ZXIgZXh0ZW5kcyBTYXNoRm9ybSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lCSUxJVFk9ICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnZpc2liaWxpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGdpdmVuIGl0cyBwYXJlbnQKLQkgKiBhbmQgYSBzdHlsZSB2YWx1ZSBkZXNjcmliaW5nIGl0cyBiZWhhdmlvciBhbmQgYXBwZWFyYW5jZS4KLQkgKiA8cD4KLQkgKiBUaGUgc3R5bGUgdmFsdWUgaXMgZWl0aGVyIG9uZSBvZiB0aGUgc3R5bGUgY29uc3RhbnRzIGRlZmluZWQgaW4KLQkgKiBjbGFzcyA8Y29kZT5TV1Q8L2NvZGU+IHdoaWNoIGlzIGFwcGxpY2FibGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMKLQkgKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlcgotCSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0JICogb2YgdGhvc2UgPGNvZGU+U1dUPC9jb2RlPiBzdHlsZSBjb25zdGFudHMuIFRoZSBjbGFzcyBkZXNjcmlwdGlvbgotCSAqIGxpc3RzIHRoZSBzdHlsZSBjb25zdGFudHMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgY2xhc3MuCi0JICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0JICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB3aWRnZXQgdG8gY29uc3RydWN0Ci0JICoKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFyZW50IGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLQkgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFNwbGl0dGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0JCQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGdpdmVuIGNoaWxkIGluIHRoaXMgU3BsaXR0ZXIuIElmIHRoaXMgY2hhbmdlCi0JICogYWZmZWN0cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgd2hvbGUgU3BsaXR0ZXIsIGFuZCBpZiB0aGUgU3BsaXR0ZXIKLQkgKiBpcyBkaXJlY3RseSBuZXN0ZWQgaW4gb25lIG9yIG1vcmUgU3BsaXR0ZXJzLCB0aGlzIG1ldGhvZCByZWN1cnNpdmVseQotCSAqIHByb3BhZ2F0ZXMgdGhlIG5ldyBzdGF0ZSB1cHdhcmQuCi0JICoKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIGNvbnRyb2wgZm9yIHdoaWNoIHRoZSB2aXNpYmlsaXR5IGlzIGNoYW5nZWQKLQkgKiBAcGFyYW0gdmlzaWJsZSB0aGUgbmV3IHZpc2liaWxpdHkgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKENvbnRyb2wgY2hpbGQsIGJvb2xlYW4gdmlzaWJsZSkgewotCQkKLQkJYm9vbGVhbiB3YXNFbXB0eT0gaXNFbXB0eSgpOwotCQkJCQotCQljaGlsZC5zZXRWaXNpYmxlKHZpc2libGUpOwotCQljaGlsZC5zZXREYXRhKFZJU0lCSUxJVFksIG5ldyBCb29sZWFuKHZpc2libGUpKTsKLQkJCi0JCWlmICh3YXNFbXB0eSAhPSBpc0VtcHR5KCkpIHsKLQkJCS8vIHJlY3Vyc2l2ZWx5IHdhbGsgdXAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQ9IGdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNwbGl0dGVyKSB7Ci0JCQkJU3BsaXR0ZXIgc3A9IChTcGxpdHRlcikgcGFyZW50OwotCQkJCXNwLnNldFZpc2libGUodGhpcywgdmlzaWJsZSk7Ci0JCQkJc3AubGF5b3V0KCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsYXlvdXQoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBSZWN1cnNpdmVseSBjYWxscyBzZXRNYXhpbWl6ZWRDb250cm9sIGZvciBhbGwgZGlyZWN0IHBhcmVudHMgdGhhdCBhcmUKLQkgKiBpdHNlbGYgU3BsaXR0ZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heGltaXplZENvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwgfHwgY29udHJvbCA9PSBnZXRNYXhpbWl6ZWRDb250cm9sKCkpCi0JCQlzdXBlci5zZXRNYXhpbWl6ZWRDb250cm9sKG51bGwpOwotCQllbHNlCi0JCQlzdXBlci5zZXRNYXhpbWl6ZWRDb250cm9sKGNvbnRyb2wpOwotCi0JCS8vIHJlY3Vyc2l2ZWx5IHdhbGsgdXB3YXJkCi0JCUNvbXBvc2l0ZSBwYXJlbnQ9IGdldFBhcmVudCgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU3BsaXR0ZXIpCi0JCQkoKFNwbGl0dGVyKSBwYXJlbnQpLnNldE1heGltaXplZENvbnRyb2wodGhpcyk7Ci0JCWVsc2UKLQkJCWxheW91dCh0cnVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmV0dXJucyB0cnVlIGlmIFNwbGl0dGVyIGhhcyBubyBjaGlsZHJlbiBvciBpZiBhbGwgY2hpbGRyZW4gYXJlIGludmlzaWJsZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspCi0JCQlpZiAoaXNWaXNpYmxlKGNvbnRyb2xzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmV0dXJucyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gY2hpbGQgY29udHJvbC4gSWYgdGhlCi0JICogY29udHJvbCBpcyBhIFNhc2gsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGZhbHNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGUoQ29udHJvbCBjaGlsZCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTYXNoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlPYmplY3QgZGF0YT0gY2hpbGQuZ2V0RGF0YShWSVNJQklMSVRZKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJcmV0dXJuICgoQm9vbGVhbilkYXRhKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9aaXBGaWxlU3RydWN0dXJlQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9aaXBGaWxlU3RydWN0dXJlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZjYTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuKjsKLQotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPiBpbnRlcmZhY2UKLSAqIG1ha2VzIHRoZSBjb250ZW50cyBvZiBhIHppcCBhcmNoaXZlIGF2YWlsYWJsZSBhcyBhCi0gKiBoaWVyYXJjaGljYWwgc3RydWN0dXJlIG9mIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPnMuCi0gKiA8cD4KLSAqIEl0IGlzIHVzZWQgd2hlbiBjb21wYXJpbmcgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiBhIHppcCBhcmNoaXZlLgotICoKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yIGltcGxlbWVudHMgSVN0cnVjdHVyZUNyZWF0b3IgewotCi0JLyoqCi0JICogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIFppcEZvbGRlciBhbmQgWmlwRmlsZQotCSAqLwotCXN0YXRpYyBhYnN0cmFjdCBjbGFzcyBaaXBSZXNvdXJjZSBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVDb21wYXJhdG9yLCBJVHlwZWRFbGVtZW50IHsKLQotCQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQotCQlaaXBSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotCQkJZk5hbWU9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZk5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQlyZXR1cm4gQ29tcGFyZVVJLmdldEltYWdlKGdldFR5cGUoKSk7Ci0JCX0KLQotCQkvKgotCQkgKiBSZXR1cm5zIHRydWUgaWYgb3RoZXIgaXMgSVR5cGVkRWxlbWVudCBhbmQgbmFtZXMgYXJlIGVxdWFsLgotCQkgKiBAc2VlIElDb21wYXJhdG9yI2VxdWFscwotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQkJaWYgKG90aGVyIGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkKLQkJCQlyZXR1cm4gZk5hbWUuZXF1YWxzKCgoSVR5cGVkRWxlbWVudCkgb3RoZXIpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG90aGVyKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gZk5hbWUuaGFzaENvZGUoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBaaXBGb2xkZXIgZXh0ZW5kcyBaaXBSZXNvdXJjZSB7Ci0KLQkJcHJpdmF0ZSBIYXNoTWFwIGZDaGlsZHJlbj0gbmV3IEhhc2hNYXAoMTApOwotCi0JCVppcEZvbGRlcihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5GT0xERVJfVFlQRTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJCU9iamVjdFtdIGNoaWxkcmVuPSBuZXcgT2JqZWN0W2ZDaGlsZHJlbi5zaXplKCldOwotCQkJSXRlcmF0b3IgaXRlcj0gZkNoaWxkcmVuLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpdGVyLmhhc05leHQoKTsgaSsrKQotCQkJCWNoaWxkcmVuW2ldPSBpdGVyLm5leHQoKTsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCVppcEZpbGUgY3JlYXRlQ29udGFpbmVyKFN0cmluZyBwYXRoKSB7Ci0JCQlTdHJpbmcgZW50cnk9IHBhdGg7Ci0JCQlpbnQgcG9zPSBwYXRoLmluZGV4T2YoJy8nKTsKLQkJCWlmIChwb3MgPCAwKQotCQkJCXBvcz0gcGF0aC5pbmRleE9mKCdcXCcpOwotCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJZW50cnk9IHBhdGguc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQkJcGF0aD0gcGF0aC5zdWJzdHJpbmcocG9zICsgMSk7Ci0JCQl9IGVsc2UgaWYgKGVudHJ5Lmxlbmd0aCgpID4gMCkgewotCQkJCWlmIChDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbHRlcihwYXRoLCBmYWxzZSwgdHJ1ZSkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCVppcEZpbGUgemU9IG5ldyBaaXBGaWxlKGVudHJ5KTsKLQkJCQlmQ2hpbGRyZW4ucHV0KGVudHJ5LCB6ZSk7Ci0JCQkJcmV0dXJuIHplOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVppcEZvbGRlciBmb2xkZXI9IG51bGw7Ci0JCQlpZiAoZkNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlPYmplY3Qgbz0gZkNoaWxkcmVuLmdldChlbnRyeSk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBaaXBGb2xkZXIpCi0JCQkJCWZvbGRlcj0gKFppcEZvbGRlcikgbzsKLQkJCX0KLQotCQkJaWYgKGZvbGRlciA9PSBudWxsKSB7Ci0JCQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwICYmIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZmlsdGVyKHBhdGgsIHRydWUsIHRydWUpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlmb2xkZXI9IG5ldyBaaXBGb2xkZXIoZW50cnkpOwotCQkJCWZDaGlsZHJlbi5wdXQoZW50cnksIGZvbGRlcik7Ci0JCQl9Ci0KLQkJCXJldHVybiBmb2xkZXIuY3JlYXRlQ29udGFpbmVyKHBhdGgpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFppcEZpbGUgZXh0ZW5kcyBaaXBSZXNvdXJjZSBpbXBsZW1lbnRzIElTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCi0JCXByaXZhdGUgYnl0ZVtdIGZDb250ZW50czsKLQotCQlaaXBGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCVN0cmluZyBzPSB0aGlzLmdldE5hbWUoKTsKLQkJCWludCBwb3M9IHMubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwb3MgPj0gMCkKLQkJCQlyZXR1cm4gcy5zdWJzdHJpbmcocG9zICsgMSk7Ci0JCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgewotCQkJaWYgKGZDb250ZW50cyA9PSBudWxsKQotCQkJCWZDb250ZW50cz0gbmV3IGJ5dGVbMF07Ci0JCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZDb250ZW50cyk7Ci0JCX0KLQotCQlieXRlW10gZ2V0Qnl0ZXMoKSB7Ci0JCQlyZXR1cm4gZkNvbnRlbnRzOwotCQl9Ci0KLQkJdm9pZCBzZXRCeXRlcyhieXRlW10gYnVmZmVyKSB7Ci0JCQlmQ29udGVudHM9IGJ1ZmZlcjsKLQkJfQotCi0JCXZvaWQgYXBwZW5kQnl0ZXMoYnl0ZVtdIGJ1ZmZlciwgaW50IGxlbmd0aCkgewotCSAgICAJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlpbnQgb2xkTGVuPSAwOwotCQkJCWlmIChmQ29udGVudHMgIT0gbnVsbCkKLQkJCQkJb2xkTGVuPSBmQ29udGVudHMubGVuZ3RoOwotCQkJCWJ5dGVbXSBuZXdCdWY9IG5ldyBieXRlW29sZExlbiArIGxlbmd0aF07Ci0JCQkJaWYgKG9sZExlbiA+IDApCi0JCSAgICAJCVN5c3RlbS5hcnJheWNvcHkoZkNvbnRlbnRzLCAwLCBuZXdCdWYsIDAsIG9sZExlbik7Ci0JICAgIAkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld0J1Ziwgb2xkTGVuLCBsZW5ndGgpOwotCSAgICAJCWZDb250ZW50cz0gbmV3QnVmOwotCSAgICAJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGZUaXRsZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBGaWxlU3RydWN0dXJlQ3JlYXRvci4KLQkgKi8KLQlwdWJsaWMgWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3IoKSB7Ci0JCXRoaXMoVXRpbGl0aWVzLmdldFN0cmluZygiWmlwU3RydWN0dXJlQ3JlYXRvci5uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBGaWxlU3RydWN0dXJlQ3JlYXRvciB3aXRoIHRoZSBnaXZlbiB0aXRsZS4KLQkgKiBUaGUgdGl0bGUgaXMgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZCA8Y29kZT5nZXROYW1lKCk8L2NvZGU+LgotCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhpcyBzdHJjdXR1cmUgY3JlYXRvcgotCSAqLwotCXB1YmxpYyBaaXBGaWxlU3RydWN0dXJlQ3JlYXRvcihTdHJpbmcgdGl0bGUpIHsKLQkJZlRpdGxlPSB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmVGl0bGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGdldFN0cnVjdHVyZShPYmplY3QgaW5wdXQpIHsKLQotCQlJbnB1dFN0cmVhbSBpcz0gbnVsbDsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCUlTdHJlYW1Db250ZW50QWNjZXNzb3Igc2NhPSAoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgaW5wdXQ7Ci0JCQl0cnkgewotCQkJCWlzPSBzY2EuZ2V0Q29udGVudHMoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0KLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlaaXBJbnB1dFN0cmVhbSB6aXA9IG5ldyBaaXBJbnB1dFN0cmVhbShpcyk7Ci0JCVppcEZvbGRlciByb290PSBuZXcgWmlwRm9sZGVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZm9yICg7OykgewotCQkJCVppcEVudHJ5IGVudHJ5PSB6aXAuZ2V0TmV4dEVudHJ5KCk7Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJCWJyZWFrOwotCi0JCQkJWmlwRmlsZSB6ZT0gcm9vdC5jcmVhdGVDb250YWluZXIoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoemUgIT0gbnVsbCkgewotCQkJCQlpbnQgbGVuZ3RoPSAoaW50KSBlbnRyeS5nZXRTaXplKCk7Ci0JCQkJCWlmIChsZW5ndGggPj0gMCkgewotCQkJCQkJYnl0ZVtdIGJ1ZmZlcj0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQkJCQkJCWludCBvZmZzZXQ9IDA7Ci0JCi0JCQkJCQlkbyB7Ci0JCQkJCQkJaW50IG49IHppcC5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJCW9mZnNldCArPSBuOwotCQkJCQkJCWxlbmd0aCAtPSBuOwotCQkJCQkJfSB3aGlsZSAobGVuZ3RoID4gMCk7Ci0JCi0JCQkJCQl6ZS5zZXRCeXRlcyhidWZmZXIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYnl0ZVtdIGJ1ZmZlcj0gbmV3IGJ5dGVbMTAyNF07CQkKLQkJCQkJCWludCBuOwotCQkJCQkJZG8gewotCQkJCQkJCW49IHppcC5yZWFkKGJ1ZmZlciwgMCwgMTAyNCk7Ci0JCQkJCQkJemUuYXBwZW5kQnl0ZXMoYnVmZmVyLCBuKTsKLQkJCQkJCX0gd2hpbGUgKG4gPj0gMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJemlwLmNsb3NlRW50cnkoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl6aXAuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9Ci0KLQkJaWYgKHJvb3QuZkNoaWxkcmVuLnNpemUoKSA9PSAxKSB7Ci0JCQlJdGVyYXRvciBpdGVyPSByb290LmZDaGlsZHJlbi52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJcmV0dXJuIChJU3RydWN0dXJlQ29tcGFyYXRvcikgaXRlci5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50cyhPYmplY3QgbywgYm9vbGVhbiBpZ25vcmVXaGl0ZXNwYWNlKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgWmlwRmlsZSkgewotCQkJYnl0ZVtdIGJ5dGVzPSAoKFppcEZpbGUpbykuZ2V0Qnl0ZXMoKTsKLQkJCWlmIChieXRlcyAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgU3RyaW5nKGJ5dGVzKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IHNpbmNlIHdlIGNhbm5vdCB1cGRhdGUgYSB6aXAgYXJjaGl2ZS4KLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblNhdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgYSBjb3B5IG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgb24gYSB0cmVlIG5vZGUuCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYW4gPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPgotCSAqIHNpbmNlIHdlIGNhbm5vdCB1cGRhdGUgYSB6aXAgYXJjaGl2ZS4KLQkgKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmUgdGhlIG5vZGUgZm9yIHdoaWNoIHRvIHNhdmUgdGhlIG5ldyBjb250ZW50Ci0JICogQHBhcmFtIGlucHV0IHRoZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgc3RydWN0dXJlIHRyZWUgd2FzIGNyZWF0ZWQgaW4gPGNvZGU+Z2V0U3RydWN0dXJlPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVN0cnVjdHVyZUNvbXBhcmF0b3Igc3RydWN0dXJlLCBPYmplY3QgaW5wdXQpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIENhbm5vdCB1cGRhdGUgemlwIGFyY2hpdmUKLQl9Ci0JCi0JcHVibGljIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGxvY2F0ZShPYmplY3QgcGF0aCwgT2JqZWN0IHNvdXJjZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IHNpbmNlIHRoaXMgPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+Ci0JICogY2Fubm90IHJld3JpdGUgdGhlIGRpZmYgdHJlZSBpbiBvcmRlciB0byBmb2xkIGNlcnRhaW4gY29tYmluYXRpb25zIG9mCi0JICogYWRkaXRvbnMgYW5kIGRlbGV0aW9ucy4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiAKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJld3JpdGVUcmVlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEVtcHR5IGltcGxlbWVudGF0aW9uIHNpbmNlIHRoaXMgPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+Ci0JICogY2Fubm90IHJld3JpdGUgdGhlIGRpZmYgdHJlZSBpbiBvcmRlciB0byBmb2xkIGNlcnRhaW4gY29tYmluYXRpb25zIG9mCi0JICogYWRkaXRvbnMgYW5kIGRlbGV0aW9ucy4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiAKLQkgKiBAcGFyYW0gZGlmZmVyZW5jZXIKLQkgKiBAcGFyYW0gcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIHJld3JpdGVUcmVlKERpZmZlcmVuY2VyIGRpZmZlcmVuY2VyLCBJRGlmZkNvbnRhaW5lciByb290KSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0NvbnRlbnRNZXJnZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvQ29udGVudE1lcmdlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTgyMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvQ29udGVudE1lcmdlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUtleUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbnRlbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC4qOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGNvbXBhcmUgYW5kIG1lcmdlIHZpZXdlciB3aXRoIHR3byBzaWRlLWJ5LXNpZGUgY29udGVudCBhcmVhcwotICogYW5kIGFuIG9wdGlvbmFsIGNvbnRlbnQgYXJlYSBmb3IgdGhlIGFuY2VzdG9yLiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgbm8KLSAqIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjb250ZW50IHR5cGUuCi0gKiA8cD4KLSAqIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLSAqIDx1bD4KLSAqIDxsaT5pbXBsZW1lbnRzIHRoZSBvdmVyYWxsIGxheW91dCBhbmQgZGVmaW5lcyBob29rcyBzbyB0aGF0IHN1YmNsYXNzZXMKLSAqCWNhbiBlYXNpbHkgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzcGVjaWZpYyBjb250ZW50IHR5cGUsCi0gKiA8bGk+aW1wbGVtZW50cyB0aGUgVUkgZm9yIG1ha2luZyB0aGUgYXJlYXMgcmVzaXphYmxlLAotICogPGxpPmhhcyBhbiBhY3Rpb24gZm9yIGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIGFuY2VzdG9yIGFyZWEgaXMgdmlzaWJsZSBvciBub3QsCi0gKiA8bGk+aGFzIGFjdGlvbnMgZm9yIGNvcHlpbmcgb25lIHNpZGUgb2YgdGhlIGlucHV0IHRvIHRoZSBvdGhlciBzaWRlLAotICogPGxpPnRyYWNrcyB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGFuZCBzZW5kIG91dCBub3RpZmljYXRpb24KLSAqCW9uIHN0YXRlIGNoYW5nZXMuCi0gKiA8L3VsPgotICogQSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+IGFjY2Vzc2VzIGl0cwotICogbW9kZWwgYnkgbWVhbnMgb2YgYSBjb250ZW50IHByb3ZpZGVyIHdoaWNoIG11c3QgaW1wbGVtZW50IHRoZQotICogPGNvZGU+SU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IHdpc2ggdG8gdXNlIHRoZSBzdGFuZGFyZCBjb25jcmV0ZSBzdWJjbGFzcyA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+LAotICogb3IgZGVmaW5lIHRoZWlyIG93biBzdWJjbGFzcy4KLSAqIAotICogQHNlZSBJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIKLSAqIEBzZWUgVGV4dE1lcmdlVmlld2VyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50TWVyZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyCi0JCQkJCWltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIsIElTYXZhYmxlIHsKLQkKLQljbGFzcyBTYXZlQWN0aW9uIGV4dGVuZHMgTWVyZ2VWaWV3ZXJBY3Rpb24gewotCQkJCQotCQlTYXZlQWN0aW9uKGJvb2xlYW4gbGVmdCkgewotCQkJc3VwZXIodHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkJCVV0aWxpdGllcy5pbml0QWN0aW9uKHRoaXMsIGdldFJlc291cmNlQnVuZGxlKCksICJhY3Rpb24uc2F2ZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc2F2ZUNvbnRlbnQoZ2V0SW5wdXQoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQ0VTVE9SX0VOQUJMRUQ9IENvbXBhcmVQcmVmZXJlbmNlUGFnZS5JTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FOwkKLQkKLQkvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTD0gMTsKLQkvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUw9IDI7Ci0JCi0Jc3RhdGljIGZpbmFsIGRvdWJsZSBIU1BMSVQ9IDAuNTsKLQlzdGF0aWMgZmluYWwgZG91YmxlIFZTUExJVD0gMC4zOwotCQotCXByaXZhdGUgY2xhc3MgQ29udGVudE1lcmdlVmlld2VyTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQkJCi0JCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgYywgaW50IHcsIGludCBoLCBib29sZWFuIGZvcmNlKSB7Ci0JCQlyZXR1cm4gbmV3IFBvaW50KDEwMCwgMTAwKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZm9yY2UpIHsKLQkJCQotCQkJLy8gZGV0ZXJtaW5lIHNvbWUgZGVyaXZlZCBzaXplcwotCQkJaW50IGhlYWRlckhlaWdodD0gZkxlZnRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLnk7Ci0JCQlSZWN0YW5nbGUgcj0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCQotCQkJaW50IGNlbnRlcldpZHRoPSBnZXRDZW50ZXJXaWR0aCgpOwkKLQkJCWludCB3aWR0aDE9IChpbnQpKChyLndpZHRoLWNlbnRlcldpZHRoKSpmSFNwbGl0KTsKLQkJCWludCB3aWR0aDI9IHIud2lkdGgtd2lkdGgxLWNlbnRlcldpZHRoOwotCQkJCi0JCQlpbnQgaGVpZ2h0MT0gMDsKLQkJCWludCBoZWlnaHQyPSAwOwotCQkJaWYgKGZBbmNlc3RvckVuYWJsZWQgJiYgZlNob3dBbmNlc3RvcikgewotCQkJCWhlaWdodDE9IChpbnQpKChyLmhlaWdodC0oMipoZWFkZXJIZWlnaHQpKSpmVlNwbGl0KTsKLQkJCQloZWlnaHQyPSByLmhlaWdodC0oMipoZWFkZXJIZWlnaHQpLWhlaWdodDE7Ci0JCQl9IGVsc2UgewotCQkJCWhlaWdodDE9IDA7Ci0JCQkJaGVpZ2h0Mj0gci5oZWlnaHQtaGVhZGVySGVpZ2h0OwotCQkJfQkJCi0JCQkJCQkJCi0JCQlpbnQgeT0gMDsKLQkJCQotCQkJaWYgKGZBbmNlc3RvckVuYWJsZWQgJiYgZlNob3dBbmNlc3RvcikgewotCQkJCWZBbmNlc3RvckxhYmVsLnNldEJvdW5kcygwLCB5LCByLndpZHRoLCBoZWFkZXJIZWlnaHQpOwotCQkJCWZBbmNlc3RvckxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJeSs9IGhlYWRlckhlaWdodDsKLQkJCQloYW5kbGVSZXNpemVBbmNlc3RvcigwLCB5LCByLndpZHRoLCBoZWlnaHQxKTsKLQkJCQl5Kz0gaGVpZ2h0MTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkFuY2VzdG9yTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJaGFuZGxlUmVzaXplQW5jZXN0b3IoMCwgMCwgMCwgMCk7Ci0JCQl9Ci0JCQkKLQkJCWZMZWZ0TGFiZWwuZ2V0U2l6ZSgpOwkvLyB3aXRob3V0IHRoaXMgcmVzaXppbmcgd291bGQgbm90IGFsd2F5cyB3b3JrCi0JCQkKLQkJCWlmIChjZW50ZXJXaWR0aCA+IDMpIHsKLQkJCQlmTGVmdExhYmVsLnNldEJvdW5kcygwLCB5LCB3aWR0aDErMSwgaGVhZGVySGVpZ2h0KTsKLQkJCQlmRGlyZWN0aW9uTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQlmRGlyZWN0aW9uTGFiZWwuc2V0Qm91bmRzKHdpZHRoMSsxLCB5LCBjZW50ZXJXaWR0aC0xLCBoZWFkZXJIZWlnaHQpOwotCQkJCWZSaWdodExhYmVsLnNldEJvdW5kcyh3aWR0aDErY2VudGVyV2lkdGgsIHksIHdpZHRoMiwgaGVhZGVySGVpZ2h0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkxlZnRMYWJlbC5zZXRCb3VuZHMoMCwgeSwgd2lkdGgxLCBoZWFkZXJIZWlnaHQpOwotCQkJCWZEaXJlY3Rpb25MYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlmUmlnaHRMYWJlbC5zZXRCb3VuZHMod2lkdGgxLCB5LCByLndpZHRoLXdpZHRoMSwgaGVhZGVySGVpZ2h0KTsKLQkJCX0KLQkJCQotCQkJeSs9IGhlYWRlckhlaWdodDsKLQkJCQotCQkJaWYgKGZDZW50ZXIgIT0gbnVsbCAmJiAhZkNlbnRlci5pc0Rpc3Bvc2VkKCkpCi0JCQkJZkNlbnRlci5zZXRCb3VuZHMod2lkdGgxLCB5LCBjZW50ZXJXaWR0aCwgaGVpZ2h0Mik7Ci0JCQkJCQotCQkJaGFuZGxlUmVzaXplTGVmdFJpZ2h0KDAsIHksIHdpZHRoMSwgY2VudGVyV2lkdGgsIHdpZHRoMiwgaGVpZ2h0Mik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNpemVyIGV4dGVuZHMgTW91c2VBZGFwdGVyIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIgewotCQkJCQotCQlDb250cm9sIGZDb250cm9sOwotCQlpbnQgZlgsIGZZOwotCQlpbnQgZldpZHRoMSwgZldpZHRoMjsKLQkJaW50IGZIZWlnaHQxLCBmSGVpZ2h0MjsKLQkJaW50IGZEaXJlY3Rpb247Ci0JCWJvb2xlYW4gZkxpdmVSZXNpemU7Ci0JCWJvb2xlYW4gZklzRG93bjsKLQkJCi0JCXB1YmxpYyBSZXNpemVyKENvbnRyb2wgYywgaW50IGRpcikgewotCQkJZkRpcmVjdGlvbj0gZGlyOwotCQkJZkNvbnRyb2w9IGM7Ci0JCQlmTGl2ZVJlc2l6ZT0gIShmQ29udHJvbCBpbnN0YW5jZW9mIFNhc2gpOwotCQkJdXBkYXRlQ3Vyc29yKGMsIGRpcik7Ci0JCQlmQ29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQkJZkNvbnRyb2wuYWRkTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlmQ29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIoCi0JCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJCWZDb250cm9sPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCQkJCQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKChmRGlyZWN0aW9uICYgSE9SSVpPTlRBTCkgIT0gMCkKLQkJCQlmSFNwbGl0PSBIU1BMSVQ7Ci0JCQlpZiAoKGZEaXJlY3Rpb24gJiBWRVJUSUNBTCkgIT0gMCkKLQkJCQlmVlNwbGl0PSBWU1BMSVQ7Ci0JCQlmQ29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJQ29tcG9zaXRlIHBhcmVudD0gZkNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQkKLQkJCVBvaW50IHM9IHBhcmVudC5nZXRTaXplKCk7Ci0JCQlQb2ludCBhcz0gZkFuY2VzdG9yTGFiZWwuZ2V0U2l6ZSgpOwotCQkJUG9pbnQgeXM9IGZMZWZ0TGFiZWwuZ2V0U2l6ZSgpOwotCQkJUG9pbnQgbXM9IGZSaWdodExhYmVsLmdldFNpemUoKTsKLQkJCQotCQkJZldpZHRoMT0geXMueDsKLQkJCWZXaWR0aDI9IG1zLng7Ci0JCQlmSGVpZ2h0MT0gZkxlZnRMYWJlbC5nZXRMb2NhdGlvbigpLnktYXMueTsKLQkJCWZIZWlnaHQyPSBzLnktKGZMZWZ0TGFiZWwuZ2V0TG9jYXRpb24oKS55K3lzLnkpOwotCQkJCi0JCQlmWD0gZS54OwotCQkJZlk9IGUueTsKLQkJCWZJc0Rvd249IHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQlmSXNEb3duPSBmYWxzZTsKLQkJCWlmICghZkxpdmVSZXNpemUpCi0JCQkJcmVzaXplKGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoZklzRG93biAmJiBmTGl2ZVJlc2l6ZSkKLQkJCQlyZXNpemUoZSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByZXNpemUoTW91c2VFdmVudCBlKSB7Ci0JCQlpbnQgZHg9IGUueC1mWDsKLQkJCWludCBkeT0gZS55LWZZOwotCQkKLQkJCWludCBjZW50ZXJXaWR0aD0gZkNlbnRlci5nZXRTaXplKCkueDsKLQotCQkJaWYgKGZXaWR0aDEgKyBkeCA+IGNlbnRlcldpZHRoICYmIGZXaWR0aDIgLSBkeCA+IGNlbnRlcldpZHRoKSB7Ci0JCQkJZldpZHRoMSs9IGR4OwotCQkJCWZXaWR0aDItPSBkeDsKLQkJCQlpZiAoKGZEaXJlY3Rpb24gJiBIT1JJWk9OVEFMKSAhPSAwKQotCQkJCQlmSFNwbGl0PSAoZG91YmxlKWZXaWR0aDEvKGRvdWJsZSkoZldpZHRoMStmV2lkdGgyKTsKLQkJCX0KLQkJCWlmIChmSGVpZ2h0MSArIGR5ID4gY2VudGVyV2lkdGggJiYgZkhlaWdodDIgLSBkeSA+IGNlbnRlcldpZHRoKSB7Ci0JCQkJZkhlaWdodDErPSBkeTsKLQkJCQlmSGVpZ2h0Mi09IGR5OwotCQkJCWlmICgoZkRpcmVjdGlvbiAmIFZFUlRJQ0FMKSAhPSAwKQotCQkJCQlmVlNwbGl0PSAoZG91YmxlKWZIZWlnaHQxLyhkb3VibGUpKGZIZWlnaHQxK2ZIZWlnaHQyKTsKLQkJCX0KLQotCQkJZkNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JCQlmQ29udHJvbC5nZXREaXNwbGF5KCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKiogU3R5bGUgYml0cyBmb3IgdG9wIGxldmVsIGNvbXBvc2l0ZSAqLwotCXByaXZhdGUgaW50IGZTdHlsZXM7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmQnVuZGxlOwotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIgZkNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lckxpc3Q7Ci0JYm9vbGVhbiBmQ29uZmlybVNhdmU9IHRydWU7Ci0JCi0JcHJpdmF0ZSBkb3VibGUgZkhTcGxpdD0gSFNQTElUOwkJLy8gd2lkdGggcmF0aW8gb2YgbGVmdCBhbmQgcmlnaHQgcGFuZXMKLQlwcml2YXRlIGRvdWJsZSBmVlNwbGl0PSBWU1BMSVQ7CQkvLyBoZWlnaHQgcmF0aW8gb2YgYW5jZXN0b3IgYW5kIGJvdHRvbSBwYW5lcwotCQotCXByaXZhdGUgYm9vbGVhbiBmQW5jZXN0b3JFbmFibGVkPSB0cnVlOwkvLyBzaG93IGFuY2VzdG9yIGluIGNhc2Ugb2YgY29uZmxpY3RzCi0JLyogcGFja2FnZSAqLyBib29sZWFuIGZTaG93QW5jZXN0b3I9IGZhbHNlOwkvLyBpZiBjdXJyZW50IGlucHV0IGhhcyBjb25mbGljdHMKLQlwcml2YXRlIGJvb2xlYW4gZklzVGhyZWVXYXk9IGZhbHNlOwotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBmQW5jZXN0b3JJdGVtOwotCQotCXByaXZhdGUgQWN0aW9uIGZDb3B5TGVmdFRvUmlnaHRBY3Rpb247CS8vIGNvcHkgZnJvbSBsZWZ0IHRvIHJpZ2h0Ci0JcHJpdmF0ZSBBY3Rpb24gZkNvcHlSaWdodFRvTGVmdEFjdGlvbjsJLy8gY29weSBmcm9tIHJpZ2h0IHRvIGxlZnQKLQotCU1lcmdlVmlld2VyQWN0aW9uIGZMZWZ0U2F2ZUFjdGlvbjsKLQlNZXJnZVZpZXdlckFjdGlvbiBmUmlnaHRTYXZlQWN0aW9uOwotCQotCXByaXZhdGUgSUtleUJpbmRpbmdTZXJ2aWNlIGZLZXlCaW5kaW5nU2VydmljZTsKLQotCS8vIFNXVCB3aWRnZXRzCi0JLyogcGFja2FnZSAqLyBDb21wb3NpdGUgZkNvbXBvc2l0ZTsKLQlwcml2YXRlIENMYWJlbCBmQW5jZXN0b3JMYWJlbDsKLQlwcml2YXRlIENMYWJlbCBmTGVmdExhYmVsOwotCXByaXZhdGUgQ0xhYmVsIGZSaWdodExhYmVsOwotCS8qIHBhY2thZ2UgKi8gQ0xhYmVsIGZEaXJlY3Rpb25MYWJlbDsKLQkvKiBwYWNrYWdlICovIENvbnRyb2wgZkNlbnRlcjsKLQkJCi0JLy8tLS0tIFNXVCByZXNvdXJjZXMgdG8gYmUgZGlzcG9zZWQKLQlwcml2YXRlIEltYWdlIGZSaWdodEFycm93OwotCXByaXZhdGUgSW1hZ2UgZkxlZnRBcnJvdzsKLQlwcml2YXRlIEltYWdlIGZCb3RoQXJyb3c7Ci0JQ3Vyc29yIGZOb3JtYWxDdXJzb3I7Ci0JcHJpdmF0ZSBDdXJzb3IgZkhTYXNoQ3Vyc29yOwotCXByaXZhdGUgQ3Vyc29yIGZWU2FzaEN1cnNvcjsKLQlwcml2YXRlIEN1cnNvciBmSFZTYXNoQ3Vyc29yOwotCi0JLy8tLS0tIGVuZAotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBtZXJnZSB2aWV3ZXIgYW5kIGluaXRpYWxpemVzIHdpdGggYSByZXNvdXJjZSBidW5kbGUgYW5kIGEKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZSBTV1Qgc3R5bGUgYml0cwotCSAqIEBwYXJhbSBidW5kbGUgdGhlIHJlc291cmNlIGJ1bmRsZQotCSAqIEBwYXJhbSBjYyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudE1lcmdlVmlld2VyKGludCBzdHlsZSwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjYykgewotCQlmU3R5bGVzPSBzdHlsZTsKLQkJZkJ1bmRsZT0gYnVuZGxlOwotCQkKLQkJZkFuY2VzdG9yRW5hYmxlZD0gVXRpbGl0aWVzLmdldEJvb2xlYW4oY2MsIEFOQ0VTVE9SX0VOQUJMRUQsIGZBbmNlc3RvckVuYWJsZWQpOwotCQlmQ29uZmlybVNhdmU9IFV0aWxpdGllcy5nZXRCb29sZWFuKGNjLCBDb21wYXJlRWRpdG9yLkNPTkZJUk1fU0FWRV9QUk9QRVJUWSwgZkNvbmZpcm1TYXZlKTsKLQotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IE1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyKGNjKSk7Ci0JCQotCQlmQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXI9IG5ldyBJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21wYXJlSW5wdXRDaGFuZ2VkKElDb21wYXJlSW5wdXQgaW5wdXQpIHsKLQkJCQlDb250ZW50TWVyZ2VWaWV3ZXIudGhpcy5pbnRlcm5hbFJlZnJlc2goaW5wdXQpOwotCQkJfQotCQl9OwotCQkKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBjYzsKLQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJQ29udGVudE1lcmdlVmlld2VyLnRoaXMucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJCQotCQlmTGVmdFNhdmVBY3Rpb249IG5ldyBTYXZlQWN0aW9uKHRydWUpOwotCQlmTGVmdFNhdmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZSaWdodFNhdmVBY3Rpb249IG5ldyBTYXZlQWN0aW9uKGZhbHNlKTsKLQkJZlJpZ2h0U2F2ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLy8tLS0tIGhvb2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpZXdlcidzIG5hbWUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIncyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFV0aWxpdGllcy5nZXRTdHJpbmcoZ2V0UmVzb3VyY2VCdW5kbGUoKSwgInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGUgYW5jZXN0b3IsIGxlZnQsIGFuZCByaWdodAotCSAqIGNvbnRlbnQgYXJlYXMgb2YgdGhpcyBjb21wYXJlIHZpZXdlci4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgdHlwaWNhbGx5IGhvbGQgb250byB0aGUgY29udHJvbHMKLQkgKiBzbyB0aGF0IHRoZXkgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGlucHV0IG9iamVjdHMgaW4gbWV0aG9kCi0JICogPGNvZGU+dXBkYXRlQ29udGVudDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29tcG9zaXRlIHRoZSBjb250YWluZXIgZm9yIHRoZSB0aHJlZSBhcmVhcwotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi0JLyoqCi0JICogTGF5cyBvdXQgdGhlIGFuY2VzdG9yIGFyZWEgb2YgdGhlIGNvbXBhcmUgdmlld2VyLgotCSAqIEl0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgdmlld2VyIGlzIHJlc2l6ZWQgb3Igd2hlbiB0aGUgc2FzaGVzIGJldHdlZW4KLQkgKiB0aGUgYXJlYXMgYXJlIG1vdmVkIHRvIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgYXJlYXMuCi0JICoKLQkgKiBAcGFyYW0geCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYW5jZXN0b3IgYXJlYSB3aXRoaW4gaXRzIGNvbnRhaW5lcgotCSAqIEBwYXJhbSB5IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgYW5jZXN0b3IgYXJlYSB3aXRoaW4gaXRzIGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGFuY2VzdG9yIGFyZWEKLQkgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGFuY2VzdG9yIGFyZWEKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZXNpemVBbmNlc3RvcihpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JCi0JLyoqCi0JICogTGF5cyBvdXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGFyZWFzIG9mIHRoZSBjb21wYXJlIHZpZXdlci4KLQkgKiBJdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHZpZXdlciBpcyByZXNpemVkIG9yIHdoZW4gdGhlIHNhc2hlcyBiZXR3ZWVuCi0JICogdGhlIGFyZWFzIGFyZSBtb3ZlZCB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGFyZWFzLgotCSAqCi0JICogQHBhcmFtIHggdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGxlZnQgYXJlYSB3aXRoaW4gaXRzIGNvbnRhaW5lcgotCSAqIEBwYXJhbSB5IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgYXJlYSB3aXRoaW4gaXRzIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBsZWZ0IGFyZWEKLQkgKiBAcGFyYW0gY2VudGVyV2lkdGggdGhlIHdpZHRoIG9mIHRoZSBnYXAgYmV0d2VlbiB0aGUgbGVmdCBhbmQgcmlnaHQgYXJlYXMKLQkgKiBAcGFyYW0gcmlnaHRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHJpZ2h0IGFyZWEKLQkgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGFyZWFzCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzaXplTGVmdFJpZ2h0KGludCB4LCBpbnQgeSwgaW50IGxlZnRXaWR0aCwgaW50IGNlbnRlcldpZHRoLAotCQkJaW50IHJpZ2h0V2lkdGgsIGludCBoZWlnaHQpOwotCi0JLyoqCi0JICogQ29udHJpYnV0ZXMgaXRlbXMgdG8gdGhlIGdpdmVuIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPi4KLQkgKiBJdCBpcyBjYWxsZWQgd2hlbiB0aGlzIHZpZXdlciBpcyBpbnN0YWxsZWQgaW4gaXRzIGNvbnRhaW5lciBhbmQgaWYgdGhlIGNvbnRhaW5lcgotCSAqIGhhcyBhIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPi4KLQkgKiBUaGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIgdGhlIHRvb2xiYXIgbWFuYWdlciB0byBjb250cmlidXRlIHRvCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVG9vbEl0ZW1zKFRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCS8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIG9mIHRoZSB0aHJlZSBjb250ZW50IGFyZWFzIHdpdGggdGhlIGdpdmVuIGlucHV0IG9iamVjdHMuCi0JICoKLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGlucHV0IGZvciB0aGUgYW5jZXN0b3IgYXJlYQotCSAqIEBwYXJhbSBsZWZ0IHRoZSBpbnB1dCBmb3IgdGhlIGxlZnQgYXJlYQotCSAqIEBwYXJhbSByaWdodCB0aGUgaW5wdXQgZm9yIHRoZSByaWdodCBhcmVhCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudChPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpOwotCQkKLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2Ygb25lIHNpZGUgdG8gdGhlIG90aGVyIHNpZGUuCi0JICogQ2FsbGVkIGZyb20gdGhlIChpbnRlcm5hbCkgYWN0aW9ucyBmb3IgY29weWluZyB0aGUgc2lkZXMgb2YgdGhlIHZpZXdlcidzIGlucHV0IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdFRvUmlnaHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBsZWZ0IHNpZGUgaXMgY29waWVkIHRvIHRoZSByaWdodCBzaWRlOwotCSAqIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIHJpZ2h0IHNpZGUgaXMgY29waWVkIHRvIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBjb3B5KGJvb2xlYW4gbGVmdFRvUmlnaHQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnl0ZSBjb250ZW50cyBvZiB0aGUgbGVmdCBvciByaWdodCBzaWRlLiBJZiB0aGUgdmlld2VyCi0JICogaGFzIG5vIGVkaXRhYmxlIGNvbnRlbnQgPGNvZGU+bnVsbDwvY29kZT4gY2FuIGJlIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIGxlZnQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBieXRlIGNvbnRlbnRzIG9mIHRoZSBsZWZ0IGFyZWEgaXMgcmV0dXJuZWQ7Ci0JICogCWlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGJ5dGUgY29udGVudHMgb2YgdGhlIHJpZ2h0IGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGFzIGFuIGFycmF5IG9mIGJ5dGVzLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBieXRlW10gZ2V0Q29udGVudHMoYm9vbGVhbiBsZWZ0KTsKLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBvZiB0aGlzIHZpZXdlci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGJ1bmRsZQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIGZCdW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbiBvZiB0aGlzIHZpZXdlciwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpZXdlciBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JfQotCQotCS8qKgotCSAqIFRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0JICogPGNvZGU+Q29udGVudFZpZXdlcjwvY29kZT4gbWV0aG9kCi0JICogY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250ZW50IHByb3ZpZGVyIGlzIGFuIDxjb2RlPklNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcjwvY29kZT4uCi0JICogQHBhcmFtIGNvbnRlbnRQcm92aWRlciB0aGUgY29udGVudHByb3ZpZGVyIHRvIHNldC4gTXVzdCBpbXBsZW1lbnQgSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQlzdXBlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKiBwYWNrYWdlICovIElNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBnZXRNZXJnZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0JICogPGNvZGU+Vmlld2VyPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgZW1wdHkgc2VsZWN0aW9uLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiBAcmV0dXJuIGVtcHR5IHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qCi0JICogVGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLQkgKiA8Y29kZT5WaWV3ZXI8L2NvZGU+IG1ldGhvZCBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiByZXZlYWwpIHsKLQkJLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLQl9Ci0KLQkvKiBwYWNrYWdlICovIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkKLQkJU3RyaW5nIGtleT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotCQlpZiAoa2V5LmVxdWFscyhBTkNFU1RPUl9FTkFCTEVEKSkgewotCQkJZkFuY2VzdG9yRW5hYmxlZD0gVXRpbGl0aWVzLmdldEJvb2xlYW4oZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKSwgQU5DRVNUT1JfRU5BQkxFRCwgZkFuY2VzdG9yRW5hYmxlZCk7Ci0JCQlmQ29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCQotCQkJdXBkYXRlQ3Vyc29yKGZMZWZ0TGFiZWwsIFZFUlRJQ0FMKTsKLQkJCXVwZGF0ZUN1cnNvcihmRGlyZWN0aW9uTGFiZWwsIEhPUklaT05UQUwgfCBWRVJUSUNBTCk7Ci0JCQl1cGRhdGVDdXJzb3IoZlJpZ2h0TGFiZWwsIFZFUlRJQ0FMKTsKLQkJCQotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXZvaWQgdXBkYXRlQ3Vyc29yKENvbnRyb2wgYywgaW50IGRpcikgewotCQlpZiAoIShjIGluc3RhbmNlb2YgU2FzaCkpIHsKLQkJCUN1cnNvciBjdXJzb3I9IG51bGw7Ci0JCQlzd2l0Y2ggKGRpcikgewotCQkJY2FzZSBWRVJUSUNBTDoKLQkJCQlpZiAoZkFuY2VzdG9yRW5hYmxlZCkgewotCQkJCQlpZiAoZlZTYXNoQ3Vyc29yID09IG51bGwpIGZWU2FzaEN1cnNvcj0gbmV3IEN1cnNvcihjLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFTlMpOwotCQkJCQljdXJzb3I9IGZWU2FzaEN1cnNvcjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZk5vcm1hbEN1cnNvciA9PSBudWxsKSBmTm9ybWFsQ3Vyc29yPSBuZXcgQ3Vyc29yKGMuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0FSUk9XKTsKLQkJCQkJY3Vyc29yPSBmTm9ybWFsQ3Vyc29yOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSE9SSVpPTlRBTDoKLQkJCQlpZiAoZkhTYXNoQ3Vyc29yID09IG51bGwpIGZIU2FzaEN1cnNvcj0gbmV3IEN1cnNvcihjLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCQkJCWN1cnNvcj0gZkhTYXNoQ3Vyc29yOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWRVJUSUNBTCArIEhPUklaT05UQUw6Ci0JCQkJaWYgKGZBbmNlc3RvckVuYWJsZWQpIHsKLQkJCQkJaWYgKGZIVlNhc2hDdXJzb3IgPT0gbnVsbCkgZkhWU2FzaEN1cnNvcj0gbmV3IEN1cnNvcihjLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFQUxMKTsKLQkJCQkJY3Vyc29yPSBmSFZTYXNoQ3Vyc29yOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChmSFNhc2hDdXJzb3IgPT0gbnVsbCkgZkhTYXNoQ3Vyc29yPSBuZXcgQ3Vyc29yKGMuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1NJWkVXRSk7Ci0JCQkJCWN1cnNvcj0gZkhTYXNoQ3Vyc29yOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjdXJzb3IgIT0gbnVsbCkKLQkJCQljLnNldEN1cnNvcihjdXJzb3IpOwotCQl9Ci0JfQotCi0Jdm9pZCBzZXRBbmNlc3RvclZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKGZBbmNlc3Rvckl0ZW0gIT0gbnVsbCkgewotCQkJQWN0aW9uIGFjdGlvbj0gKEFjdGlvbikgZkFuY2VzdG9ySXRlbS5nZXRBY3Rpb24oKTsKLQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJCWFjdGlvbi5zZXRDaGVja2VkKHZpc2libGUpOwotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJfQotCQl9Ci0JCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShBTkNFU1RPUl9FTkFCTEVELCBuZXcgQm9vbGVhbih2aXNpYmxlKSk7Ci0JfQotCi0JLy8tLS0tIGlucHV0Ci0JCQkgCi0JLyogcGFja2FnZSAqLyBib29sZWFuIGlzVGhyZWVXYXkoKSB7Ci0JCXJldHVybiBmSXNUaHJlZVdheTsKLQl9Ci0JCi0JLyoqCi0JICogSW50ZXJuYWwgaG9vayBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGlucHV0IHRvIHRoaXMgdmlld2VyIGlzCi0JICogaW5pdGlhbGx5IHNldCBvciBzdWJzZXF1ZW50bHkgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlZpZXdlcjwvY29kZT4KLQkgKiBtZXRob2QgdHJpZXMgdG8gc2F2ZSB0aGUgb2xkIGlucHV0IGJ5IGNhbGxpbmcgPGNvZGU+ZG9TYXZlKC4uLik8L2NvZGU+IGFuZAotCSAqIHRoZW4gY2FsbHMgPGNvZGU+aW50ZXJuYWxSZWZyZXNoKC4uLik8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBuZXcgaW5wdXQgb2YgdGhpcyB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG5ldyBpbnB1dAotCSAqIEBwYXJhbSBvbGRJbnB1dCB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBwcmV2aW91c2x5IG5vIGlucHV0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5wdXRDaGFuZ2VkKE9iamVjdCBpbnB1dCwgT2JqZWN0IG9sZElucHV0KSB7Ci0JCQotCQlpZiAoaW5wdXQgIT0gb2xkSW5wdXQpCi0JCQlpZiAob2xkSW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCSgoSUNvbXBhcmVJbnB1dClvbGRJbnB1dCkucmVtb3ZlQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIoZkNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCWJvb2xlYW4gc3VjY2Vzcz0gZG9TYXZlKGlucHV0LCBvbGRJbnB1dCk7Ci0JCQotCQlpZiAoaW5wdXQgIT0gb2xkSW5wdXQpCi0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCSgoSUNvbXBhcmVJbnB1dClpbnB1dCkuYWRkQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIoZkNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCWlmIChzdWNjZXNzKSB7Ci0JCQlzZXRMZWZ0RGlydHkoZmFsc2UpOwotCQkJc2V0UmlnaHREaXJ0eShmYWxzZSk7Ci0JCX0KLQotCQlpZiAoaW5wdXQgIT0gb2xkSW5wdXQpCi0JCQlpbnRlcm5hbFJlZnJlc2goaW5wdXQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgPGNvZGU+Vmlld2VyPC9jb2RlPiBtZXRob2QgPGNvZGU+aW5wdXRDaGFuZ2VkPC9jb2RlPgotCSAqIHRvIHNhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcyBvZiB0aGUgb2xkIGlucHV0LgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLQkgKiBtZXRob2QgY2FsbHMgPGNvZGU+c2F2ZUNvbnRlbnQoLi4uKTwvY29kZT4uIElmIGNvbmZpcm1hdGlvbiBoYXMgYmVlbiB0dXJuZWQgb24KLQkgKiB3aXRoIDxjb2RlPnNldENvbmZpcm1TYXZlKHRydWUpPC9jb2RlPiwgYSBjb25maXJtYXRpb24gYWxlcnQgaXMgcG9zdGVkIGJlZm9yZSBzYXZpbmcuCi0JICogPC9wPgotCSAqIENsaWVudHMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhcmUgZnJlZSB0byBkZWNpZGUgd2hldGhlcgotCSAqIHRoZXkgd2FudCB0byBjYWxsIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqIEBwYXJhbSBuZXdJbnB1dCB0aGUgbmV3IGlucHV0IG9mIHRoaXMgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBuZXcgaW5wdXQKLQkgKiBAcGFyYW0gb2xkSW5wdXQgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgcHJldmlvdXNseSBubyBpbnB1dAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2F2aW5nIHdhcyBzdWNjZXNzZnVsLCBvciBpZiB0aGUgdXNlciBkaWRuJ3Qgd2FudCB0byBzYXZlIChieSBwcmVzc2luZyAnTk8nIGluIHRoZSBjb25maXJtYXRpb24gZGlhbG9nKS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9TYXZlKE9iamVjdCBuZXdJbnB1dCwgT2JqZWN0IG9sZElucHV0KSB7Ci0JCQotCQkvLyBiZWZvcmUgc2V0dGluZyB0aGUgbmV3IGlucHV0IHdlIGhhdmUgdG8gc2F2ZSB0aGUgb2xkCi0JCWlmIChmTGVmdFNhdmVBY3Rpb24uaXNFbmFibGVkKCkgfHwgZlJpZ2h0U2F2ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCi0JCQkvLyBwb3N0IGFsZXJ0Ci0JCQlpZiAoZkNvbmZpcm1TYXZlKSB7Ci0JCQkJU2hlbGwgc2hlbGw9IGZDb21wb3NpdGUuZ2V0U2hlbGwoKTsKLQkJCQkKLQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZz0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsCi0JCQkJCVV0aWxpdGllcy5nZXRTdHJpbmcoZ2V0UmVzb3VyY2VCdW5kbGUoKSwgInNhdmVEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCAJLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0JCQkJCVV0aWxpdGllcy5nZXRTdHJpbmcoZ2V0UmVzb3VyY2VCdW5kbGUoKSwgInNhdmVEaWFsb2cubWVzc2FnZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0JCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsCi0JCQkJCX0sCi0JCQkJCTApOwkJLy8gZGVmYXVsdCBidXR0b24gaW5kZXgKLQkJCQkJCQkJCQotCQkJCXN3aXRjaCAoZGlhbG9nLm9wZW4oKSkgewkvLyBvcGVuIHJldHVybnMgaW5kZXggb2YgcHJlc3NlZCBidXR0b24KLQkJCQljYXNlIDA6Ci0JCQkJCXNhdmVDb250ZW50KG9sZElucHV0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlzZXRMZWZ0RGlydHkoZmFsc2UpOwotCQkJCQlzZXRSaWdodERpcnR5KGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQl0aHJvdyBuZXcgVmlld2VyU3dpdGNoaW5nQ2FuY2VsbGVkKCk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJc2F2ZUNvbnRlbnQob2xkSW5wdXQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciA8Y29kZT5kb1NhdmUoT2JqZWN0LCBPYmplY3QpPC9jb2RlPiBhc2tzIGZvciBjb25maXJtYXRpb24gYmVmb3JlIHNhdmluZwotCSAqIHRoZSBvbGQgaW5wdXQgd2l0aCA8Y29kZT5zYXZlQ29udGVudChPYmplY3QpPC9jb2RlPi4KLQkgKiBAcGFyYW0gZW5hYmxlIGEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gZW5hYmxlcyBjb25maXJtYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlybVNhdmUoYm9vbGVhbiBlbmFibGUpIHsKLQkJZkNvbmZpcm1TYXZlPSBlbmFibGU7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgVmlld2VyLnJlZnJlc2gKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpbnRlcm5hbFJlZnJlc2goZ2V0SW5wdXQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlZnJlc2goT2JqZWN0IGlucHV0KSB7Ci0JCQotCQlJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgY29udGVudD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGFuY2VzdG9yPSBjb250ZW50LmdldEFuY2VzdG9yQ29udGVudChpbnB1dCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQkKLQkJCQlmSXNUaHJlZVdheT0gKCgoSUNvbXBhcmVJbnB1dClpbnB1dCkuZ2V0S2luZCgpICYgRGlmZmVyZW5jZXIuRElSRUNUSU9OX01BU0spICE9IDA7Ci0JCQllbHNlCi0JCQkJZklzVGhyZWVXYXk9IGFuY2VzdG9yICE9IG51bGw7Ci0JCQkJCi0JCQlpZiAoZkFuY2VzdG9ySXRlbSAhPSBudWxsKQotCQkJCWZBbmNlc3Rvckl0ZW0uc2V0VmlzaWJsZShmSXNUaHJlZVdheSk7Ci0JCQkJCi0JCQlib29sZWFuIG9sZEZsYWc9IGZTaG93QW5jZXN0b3I7Ci0JCQlmU2hvd0FuY2VzdG9yPSBmSXNUaHJlZVdheSAmJiBjb250ZW50LnNob3dBbmNlc3RvcihpbnB1dCk7Ci0JCQkKLQkJCWlmIChmQW5jZXN0b3JFbmFibGVkICYmIG9sZEZsYWcgIT0gZlNob3dBbmNlc3RvcikKLQkJCQlmQ29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCQotCQkJVG9vbEJhck1hbmFnZXIgdGJtPSBDb21wYXJlVmlld2VyUGFuZS5nZXRUb29sQmFyTWFuYWdlcihmQ29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQkJCWlmICh0Ym0gIT0gbnVsbCkgewotCQkJCXVwZGF0ZVRvb2xJdGVtcygpOwotCQkJCXRibS51cGRhdGUodHJ1ZSk7Ci0JCQkJdGJtLmdldENvbnRyb2woKS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCQl9Ci0JCQkKLQkJCXVwZGF0ZUhlYWRlcigpOwotCQkJCQkJCQkJCi0JCQlPYmplY3QgbGVmdD0gY29udGVudC5nZXRMZWZ0Q29udGVudChpbnB1dCk7Ci0JCQlPYmplY3QgcmlnaHQ9IGNvbnRlbnQuZ2V0UmlnaHRDb250ZW50KGlucHV0KTsKLQkJCXVwZGF0ZUNvbnRlbnQoYW5jZXN0b3IsIGxlZnQsIHJpZ2h0KTsKLQkJfQotCX0KLQkKLQkvLy0tLS0gbGF5b3V0ICYgU1dUIGNvbnRyb2wgY3JlYXRpb24KLQkJCi0JLyoqCi0JICogQnVpbGRzIHRoZSBTV1QgY29udHJvbHMgZm9yIHRoZSB0aHJlZSBhcmVhcyBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyLgotCSAqIDxwPgotCSAqIENhbGxzIHRoZSBob29rcyA8Y29kZT5jcmVhdGVDb250cm9sczwvY29kZT4gYW5kIDxjb2RlPmNyZWF0ZVRvb2xJdGVtczwvY29kZT4KLQkgKiB0byBsZXQgc3ViY2xhc3NlcyBidWlsZCB0aGUgc3BlY2lmaWMgY29udGVudCBhcmVhcyBhbmQgdG8gYWRkIGl0ZW1zIHRvCi0JICogYW4gZW5jbG9zaW5nIHRvb2xiYXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgY29uc3RydWN0b3Igb2Ygc3ViY2xhc3Nlcy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiB0aGUgbmV3IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29udHJvbCBidWlsZENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJCQkJCQkKLQkJZkNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIGZTdHlsZXMpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQkJCXJldHVybiBpbnRlcm5hbFNldEZvY3VzKCk7Ci0JCQl9Ci0JCX07Ci0JCWZDb21wb3NpdGUuc2V0RGF0YShDb21wYXJlVUkuQ09NUEFSRV9WSUVXRVJfVElUTEUsIGdldFRpdGxlKCkpOwotCQkKLQkJaG9va0NvbnRyb2woZkNvbXBvc2l0ZSk7CS8vIGhvb2sgaGVscCAmIGRpc3Bvc2UgbGlzdGVuZXIKLQkJCi0JCWZDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBDb250ZW50TWVyZ2VWaWV3ZXJMYXlvdXQoKSk7Ci0JCQotCQlpbnQgc3R5bGU9IFNXVC5TSEFET1dfT1VUOwotCQlmQW5jZXN0b3JMYWJlbD0gbmV3IENMYWJlbChmQ29tcG9zaXRlLCBzdHlsZSk7Ci0JCQotCQlmTGVmdExhYmVsPSBuZXcgQ0xhYmVsKGZDb21wb3NpdGUsIHN0eWxlKTsKLQkJbmV3IFJlc2l6ZXIoZkxlZnRMYWJlbCwgVkVSVElDQUwpOwotCQkKLQkJZkRpcmVjdGlvbkxhYmVsPSBuZXcgQ0xhYmVsKGZDb21wb3NpdGUsIHN0eWxlKTsKLQkJZkRpcmVjdGlvbkxhYmVsLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQkJbmV3IFJlc2l6ZXIoZkRpcmVjdGlvbkxhYmVsLCBIT1JJWk9OVEFMIHwgVkVSVElDQUwpOwotCQkKLQkJZlJpZ2h0TGFiZWw9IG5ldyBDTGFiZWwoZkNvbXBvc2l0ZSwgc3R5bGUpOwotCQluZXcgUmVzaXplcihmUmlnaHRMYWJlbCwgVkVSVElDQUwpOwotCQkKLQkJaWYgKGZDZW50ZXIgPT0gbnVsbCB8fCBmQ2VudGVyLmlzRGlzcG9zZWQoKSkKLQkJCWZDZW50ZXI9IGNyZWF0ZUNlbnRlcihmQ29tcG9zaXRlKTsKLQkJCQkKLQkJY3JlYXRlQ29udHJvbHMoZkNvbXBvc2l0ZSk7Ci0JCQotCQlJV29ya2JlbmNoUGFydFNpdGUgcHM9IFV0aWxpdGllcy5maW5kU2l0ZShmQ29tcG9zaXRlKTsKLQkJZktleUJpbmRpbmdTZXJ2aWNlPSBwcyAhPSBudWxsID8gcHMuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKSA6IG51bGw7Ci0JCQkJCQkKLQkJVG9vbEJhck1hbmFnZXIgdGJtPSBDb21wYXJlVmlld2VyUGFuZS5nZXRUb29sQmFyTWFuYWdlcihwYXJlbnQpOwotCQlpZiAodGJtICE9IG51bGwpIHsKLQkJCXRibS5yZW1vdmVBbGwoKTsKLQkJCQotCQkJLy8gZGVmaW5lIGdyb3VwcwotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJtb2RlcyIpKTsJLy8kTk9OLU5MUy0xJAotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJtZXJnZSIpKTsJLy8kTk9OLU5MUy0xJAotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJuYXZpZ2F0aW9uIikpOwkvLyROT04tTkxTLTEkCi0JCQkKLQkJCUNvbXBhcmVDb25maWd1cmF0aW9uIGNjPSBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQkKLQkJCWlmIChjYy5pc1JpZ2h0RWRpdGFibGUoKSkgewotCQkJCWZDb3B5TGVmdFRvUmlnaHRBY3Rpb249Ci0JCQkJCW5ldyBBY3Rpb24oKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY29weSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihmQ29weUxlZnRUb1JpZ2h0QWN0aW9uLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCAiYWN0aW9uLkNvcHlMZWZ0VG9SaWdodC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRibS5hcHBlbmRUb0dyb3VwKCJtZXJnZSIsIGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJVXRpbGl0aWVzLnJlZ2lzdGVyQWN0aW9uKGZLZXlCaW5kaW5nU2VydmljZSwgZkNvcHlMZWZ0VG9SaWdodEFjdGlvbiwgIm9yZy5lY2xpcHNlLmNvbXBhcmUuY29weUFsbExlZnRUb1JpZ2h0Iik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJaWYgKGNjLmlzTGVmdEVkaXRhYmxlKCkpIHsKLQkJCQlmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uPQotCQkJCQluZXcgQWN0aW9uKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWNvcHkoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCVV0aWxpdGllcy5pbml0QWN0aW9uKGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24sIGdldFJlc291cmNlQnVuZGxlKCksICJhY3Rpb24uQ29weVJpZ2h0VG9MZWZ0LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGJtLmFwcGVuZFRvR3JvdXAoIm1lcmdlIiwgZkNvcHlSaWdodFRvTGVmdEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQlVdGlsaXRpZXMucmVnaXN0ZXJBY3Rpb24oZktleUJpbmRpbmdTZXJ2aWNlLCBmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uLCAib3JnLmVjbGlwc2UuY29tcGFyZS5jb3B5QWxsUmlnaHRUb0xlZnQiKTsJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlBY3Rpb24gYT0gbmV3IENoYW5nZVByb3BlcnR5QWN0aW9uKGZCdW5kbGUsIGZDb21wYXJlQ29uZmlndXJhdGlvbiwgImFjdGlvbi5FbmFibGVBbmNlc3Rvci4iLCBBTkNFU1RPUl9FTkFCTEVEKTsgLy8kTk9OLU5MUy0xJAotCQkJYS5zZXRDaGVja2VkKGZBbmNlc3RvckVuYWJsZWQpOwotCQkJZkFuY2VzdG9ySXRlbT0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYSk7Ci0JCQlmQW5jZXN0b3JJdGVtLnNldFZpc2libGUoZmFsc2UpOwotCQkJdGJtLmFwcGVuZFRvR3JvdXAoIm1vZGVzIiwgZkFuY2VzdG9ySXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJY3JlYXRlVG9vbEl0ZW1zKHRibSk7Ci0JCQl1cGRhdGVUb29sSXRlbXMoKTsKLQkJCQotCQkJdGJtLnVwZGF0ZSh0cnVlKTsKLQkJfQotCQotCQlyZXR1cm4gZkNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBib29sZWFuIGludGVybmFsU2V0Rm9jdXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBpbnQgZ2V0Q2VudGVyV2lkdGgoKSB7Ci0JCXJldHVybiAzOwotCX0KLQkKLQkvKiBwYWNrYWdlICovIGJvb2xlYW4gZ2V0QW5jZXN0b3JFbmFibGVkKCkgewotCQlyZXR1cm4gZkFuY2VzdG9yRW5hYmxlZDsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBDb250cm9sIGNyZWF0ZUNlbnRlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNhc2ggc2FzaD0gbmV3IFNhc2gocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQluZXcgUmVzaXplcihzYXNoLCBIT1JJWk9OVEFMKTsKLQkJcmV0dXJuIHNhc2g7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gQ29udHJvbCBnZXRDZW50ZXIoKSB7Ci0JCXJldHVybiBmQ2VudGVyOwotCX0KLQkJCi0JLyogCi0JICogQHNlZSBWaWV3ZXIuZ2V0Q29udHJvbCgpCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZDb21wb3NpdGU7Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIG9uIHRoZSB2aWV3ZXIgZGlzcG9zYWwuCi0JICogVW5yZWdpc3RlcnMgZnJvbSB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uLgotCSAqIENsaWVudHMgbWF5IGV4dGVuZCBpZiB0aGV5IGhhdmUgdG8gZG8gYWRkaXRpb25hbCBjbGVhbnVwLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQotCQlpZiAoZktleUJpbmRpbmdTZXJ2aWNlICE9IG51bGwpIHsKLQkJCWlmIChmQ29weUxlZnRUb1JpZ2h0QWN0aW9uICE9IG51bGwpCi0JCQkJZktleUJpbmRpbmdTZXJ2aWNlLnVucmVnaXN0ZXJBY3Rpb24oZkNvcHlMZWZ0VG9SaWdodEFjdGlvbik7Ci0JCQlpZiAoZkNvcHlSaWdodFRvTGVmdEFjdGlvbiAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS51bnJlZ2lzdGVyQWN0aW9uKGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24pOwotCQkJZktleUJpbmRpbmdTZXJ2aWNlPSBudWxsOwotCQl9Ci0JCQotCQlPYmplY3QgaW5wdXQ9IGdldElucHV0KCk7CQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJKChJQ29tcGFyZUlucHV0KWlucHV0KS5yZW1vdmVDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcihmQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiAhPSBudWxsICYmIGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCWZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBudWxsOwotCQl9Ci0KLQkJZkFuY2VzdG9yTGFiZWw9IG51bGw7Ci0JCWZMZWZ0TGFiZWw9IG51bGw7Ci0JCWZEaXJlY3Rpb25MYWJlbD0gbnVsbDsKLQkJZlJpZ2h0TGFiZWw9IG51bGw7Ci0JCWZDZW50ZXI9IG51bGw7Ci0JCQkJCi0JCWlmIChmUmlnaHRBcnJvdyAhPSBudWxsKSB7Ci0JCQlmUmlnaHRBcnJvdy5kaXNwb3NlKCk7Ci0JCQlmUmlnaHRBcnJvdz0gbnVsbDsKLQkJfQotCQlpZiAoZkxlZnRBcnJvdyAhPSBudWxsKSB7Ci0JCQlmTGVmdEFycm93LmRpc3Bvc2UoKTsKLQkJCWZMZWZ0QXJyb3c9IG51bGw7Ci0JCX0KLQkJaWYgKGZCb3RoQXJyb3cgIT0gbnVsbCkgewotCQkJZkJvdGhBcnJvdy5kaXNwb3NlKCk7Ci0JCQlmQm90aEFycm93PSBudWxsOwotCQl9Ci0KLQkJaWYgKGZOb3JtYWxDdXJzb3IgIT0gbnVsbCkgewotCQkJZk5vcm1hbEN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmTm9ybWFsQ3Vyc29yPSBudWxsOwotCQl9Ci0JCWlmIChmSFNhc2hDdXJzb3IgIT0gbnVsbCkgewotCQkJZkhTYXNoQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCWZIU2FzaEN1cnNvcj0gbnVsbDsKLQkJfQotCQlpZiAoZlZTYXNoQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZWU2FzaEN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmVlNhc2hDdXJzb3I9IG51bGw7Ci0JCX0KLQkJaWYgKGZIVlNhc2hDdXJzb3IgIT0gbnVsbCkgewotCQkJZkhWU2FzaEN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmSFZTYXNoQ3Vyc29yPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLSAgCX0KLSAgCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIHRvb2xiYXIgaXRlbXMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZiB0aGUgaXRlbXMgbmVlZHMgdXBkYXRpbmcuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kLCBhbHRob3VnaCB0aGlzIGlzIGdlbmVyYWxseSBub3QgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVG9vbEl0ZW1zKCkgewotCQkJCQkJCQkJCQotCQlJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgY29udGVudD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJCi0JCU9iamVjdCBpbnB1dD0gZ2V0SW5wdXQoKTsKLQkJCi0JCWlmIChmQ29weUxlZnRUb1JpZ2h0QWN0aW9uICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZW5hYmxlPSBjb250ZW50LmlzUmlnaHRFZGl0YWJsZShpbnB1dCk7Ci0vLwkJCWlmIChlbmFibGUgJiYgaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0vLwkJCQlJVHlwZWRFbGVtZW50IGU9ICgoSUNvbXBhcmVJbnB1dCkgaW5wdXQpLmdldExlZnQoKTsKLS8vCQkJCWlmIChlID09IG51bGwpCi0vLwkJCQkJZW5hYmxlPSBmYWxzZTsKLS8vCQkJfQotCQkJZkNvcHlMZWZ0VG9SaWdodEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCX0KLQkJCi0JCWlmIChmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZW5hYmxlPSBjb250ZW50LmlzTGVmdEVkaXRhYmxlKGlucHV0KTsKLS8vCQkJaWYgKGVuYWJsZSAmJiBpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLS8vCQkJCUlUeXBlZEVsZW1lbnQgZT0gKChJQ29tcGFyZUlucHV0KSBpbnB1dCkuZ2V0UmlnaHQoKTsKLS8vCQkJCWlmIChlID09IG51bGwpCi0vLwkJCQkJZW5hYmxlPSBmYWxzZTsKLS8vCQkJfQotCQkJZkNvcHlSaWdodFRvTGVmdEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgaGVhZGVycyBvZiB0aGUgdGhyZWUgYXJlYXMKLQkgKiBieSBxdWVyeWluZyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgYSBuYW1lIGFuZCBpbWFnZSBmb3IKLQkgKiB0aGUgdGhyZWUgc2lkZXMgb2YgdGhlIGlucHV0IG9iamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGhlYWRlciBtdXN0IGJlIHVwZGF0ZWQuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kLCBhbHRob3VnaCB0aGlzIGlzIGdlbmVyYWxseSBub3QgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVhZGVyKCkgewotCQkJCQkJCi0JCUlNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBjb250ZW50PSBnZXRNZXJnZUNvbnRlbnRQcm92aWRlcigpOwotCQlPYmplY3QgaW5wdXQ9IGdldElucHV0KCk7Ci0KLQkJaWYgKGZBbmNlc3RvckxhYmVsICE9IG51bGwpIHsKLQkJCWZBbmNlc3RvckxhYmVsLnNldEltYWdlKGNvbnRlbnQuZ2V0QW5jZXN0b3JJbWFnZShpbnB1dCkpOwotCQkJZkFuY2VzdG9yTGFiZWwuc2V0VGV4dChjb250ZW50LmdldEFuY2VzdG9yTGFiZWwoaW5wdXQpKTsKLQkJfQotCQlpZiAoZkxlZnRMYWJlbCAhPSBudWxsKSB7Ci0JCQlmTGVmdExhYmVsLnNldEltYWdlKGNvbnRlbnQuZ2V0TGVmdEltYWdlKGlucHV0KSk7Ci0JCQlmTGVmdExhYmVsLnNldFRleHQoY29udGVudC5nZXRMZWZ0TGFiZWwoaW5wdXQpKTsKLQkJfQotCQlpZiAoZlJpZ2h0TGFiZWwgIT0gbnVsbCkgewotCQkJZlJpZ2h0TGFiZWwuc2V0SW1hZ2UoY29udGVudC5nZXRSaWdodEltYWdlKGlucHV0KSk7Ci0JCQlmUmlnaHRMYWJlbC5zZXRUZXh0KGNvbnRlbnQuZ2V0UmlnaHRMYWJlbChpbnB1dCkpOwotCQl9Ci0JfQotCQotLy8JcHJpdmF0ZSBJbWFnZSBsb2FkSW1hZ2UoU3RyaW5nIG5hbWUpIHsKLS8vCQlJbWFnZURlc2NyaXB0b3IgaWQ9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShDb250ZW50TWVyZ2VWaWV3ZXIuY2xhc3MsIG5hbWUpOwotLy8JCWlmIChpZCAhPSBudWxsKQotLy8JCQlyZXR1cm4gaWQuY3JlYXRlSW1hZ2UoKTsKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkJCi0JLyoKLQkgKiBDYWxjdWxhdGVzIHRoZSBoZWlnaHQgb2YgdGhlIGhlYWRlci4KLQkgKi8KLQkvKiBwYWNrYWdlICovIGludCBnZXRIZWFkZXJIZWlnaHQoKSB7Ci0JCWludCBoZWFkZXJIZWlnaHQ9IGZMZWZ0TGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS55OwotCQloZWFkZXJIZWlnaHQ9IE1hdGgubWF4KGhlYWRlckhlaWdodCwgZkRpcmVjdGlvbkxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueSk7CQkKLQkJcmV0dXJuIGhlYWRlckhlaWdodDsKLQl9Ci0KLQkvLy0tLS0gbWVyZ2UgZGlyZWN0aW9uCi0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBzaWRlcyBhcmUgZWRpdGFibGUuCi0JICovCi0JLyogcGFja2FnZSAqLyBib29sZWFuIGNhblRvZ2dsZU1lcmdlRGlyZWN0aW9uKCkgewotCQlJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgY29udGVudD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0IGlucHV0PSBnZXRJbnB1dCgpOwotCQlyZXR1cm4gY29udGVudC5pc0xlZnRFZGl0YWJsZShpbnB1dCkgJiYgY29udGVudC5pc1JpZ2h0RWRpdGFibGUoaW5wdXQpOwotCX0KLQkKLQkvLy0tLS0gZGlydHkgc3RhdGUgJiBzYXZpbmcgc3RhdGUKLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJMaXN0ID09IG51bGwpCi0JCQlmTGlzdGVuZXJMaXN0PSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCWZMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJUHJvcGVydHlDaGFuZ2VOb3RpZmllci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVyTGlzdCAhPSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlpZiAoZkxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpCi0JCQkJZkxpc3RlbmVyTGlzdD0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiBwYWNrYWdlICovIHZvaWQgZmlyZURpcnR5U3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQlVdGlsaXRpZXMuZmlyZVByb3BlcnR5Q2hhbmdlKGZMaXN0ZW5lckxpc3QsIHRoaXMsIENvbXBhcmVFZGl0b3JJbnB1dC5ESVJUWV9TVEFURSwgbnVsbCwgbmV3IEJvb2xlYW4oc3RhdGUpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIGxlZnQgc2lkZSBvZiB0aGlzIHZpZXdlci4KLQkgKiBJZiB0aGUgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgb2xkCi0JICogYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXIgYXJlIG5vdGlmaWVkIHdpdGgKLQkgKiBhIDxjb2RlPlByb3BlcnR5Q2hhbmdlRXZlbnQ8L2NvZGU+IHdpdGggdGhlCi0JICogcHJvcGVydHkgbmFtZSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQuRElSVFlfU1RBVEU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGRpcnR5IHRoZSBzdGF0ZSBvZiB0aGUgbGVmdCBzaWRlIGRpcnR5IGZsYWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMZWZ0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQlpZiAoZkxlZnRTYXZlQWN0aW9uLmlzRW5hYmxlZCgpICE9IGRpcnR5KSB7Ci0JCQlmTGVmdFNhdmVBY3Rpb24uc2V0RW5hYmxlZChkaXJ0eSk7Ci0JCQlmaXJlRGlydHlTdGF0ZShkaXJ0eSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIHJpZ2h0IHNpZGUgb2YgdGhpcyB2aWV3ZXIuCi0JICogSWYgdGhlIG5ldyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG9sZAotCSAqIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVyIGFyZSBub3RpZmllZCB3aXRoCi0JICogYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiB3aXRoIHRoZQotCSAqIHByb3BlcnR5IG5hbWUgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0LkRJUlRZX1NUQVRFPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBkaXJ0eSB0aGUgc3RhdGUgb2YgdGhlIHJpZ2h0IHNpZGUgZGlydHkgZmxhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJpZ2h0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQlpZiAoZlJpZ2h0U2F2ZUFjdGlvbi5pc0VuYWJsZWQoKSAhPSBkaXJ0eSkgewotCQkJZlJpZ2h0U2F2ZUFjdGlvbi5zZXRFbmFibGVkKGRpcnR5KTsKLQkJCWZpcmVEaXJ0eVN0YXRlKGRpcnR5KTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFNhdmUgdGhlIHZpZXdlcnMncyBjb250ZW50LgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZUNvbnRlbnQoZ2V0SW5wdXQoKSk7Ci0JfQotCQotCS8qCi0JICogU2F2ZSBtb2RpZmllZCBjb250ZW50IGJhY2sgdG8gaW5wdXQgZWxlbWVudHMgdmlhIHRoZSBjb250ZW50IHByb3ZpZGVyLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gdm9pZCBzYXZlQ29udGVudChPYmplY3Qgb2xkSW5wdXQpIHsKLQkJCQkKLQkJLy8gd3JpdGUgYmFjayBtb2RpZmllZCBjb250ZW50cwotCQlJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgY29udGVudD0gKElNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQotCQlib29sZWFuIGxlZnRFbXB0eT0gY29udGVudC5nZXRMZWZ0Q29udGVudChvbGRJbnB1dCkgPT0gbnVsbDsKLQkJYm9vbGVhbiByaWdodEVtcHR5PSBjb250ZW50LmdldFJpZ2h0Q29udGVudChvbGRJbnB1dCkgPT0gbnVsbDsKLQotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uLmlzTGVmdEVkaXRhYmxlKCkgJiYgZkxlZnRTYXZlQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlieXRlW10gYnl0ZXM9IGdldENvbnRlbnRzKHRydWUpOwotCQkJaWYgKGxlZnRFbXB0eSAmJiBieXRlcyAhPSBudWxsICYmIGJ5dGVzLmxlbmd0aCA9PSAwKQotCQkJCWJ5dGVzPSBudWxsOwotCQkJc2V0TGVmdERpcnR5KGZhbHNlKTsKLQkJCWNvbnRlbnQuc2F2ZUxlZnRDb250ZW50KG9sZElucHV0LCBieXRlcyk7Ci0JCX0KLQkJCi0JCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24uaXNSaWdodEVkaXRhYmxlKCkgJiYgZlJpZ2h0U2F2ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJYnl0ZVtdIGJ5dGVzPSBnZXRDb250ZW50cyhmYWxzZSk7Ci0JCQlpZiAocmlnaHRFbXB0eSAmJiBieXRlcyAhPSBudWxsICYmIGJ5dGVzLmxlbmd0aCA9PSAwKQotCQkJCWJ5dGVzPSBudWxsOwotCQkJc2V0UmlnaHREaXJ0eShmYWxzZSk7Ci0JCQljb250ZW50LnNhdmVSaWdodENvbnRlbnQob2xkSW5wdXQsIGJ5dGVzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lEb2N1bWVudFJhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JRG9jdW1lbnRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIzNmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lEb2N1bWVudFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0KLS8qKgotICogRGVmaW5lcyBhIHN1YnJhbmdlIGluIGEgZG9jdW1lbnQuCi0gKiA8cD4KLSAqIEl0IGlzIHVzZWQgYnkgdGV4dCB2aWV3ZXJzIHRoYXQgY2FuIHdvcmsgb24gYSBzdWJyYW5nZSBvZiBhIGRvY3VtZW50LiBGb3IgZXhhbXBsZSwKLSAqIGEgdGV4dCB2aWV3ZXIgZm9yIEphdmEgY29tcGlsYXRpb24gdW5pdHMgbWlnaHQgdXNlIHRoaXMgdG8gcmVzdHJpY3QgdGhlIHZpZXcKLSAqIHRvIGEgc2luZ2xlIG1ldGhvZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICoKLSAqIEBzZWUgVGV4dE1lcmdlVmlld2VyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuRG9jdW1lbnRSYW5nZU5vZGUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRSYW5nZSB7Ci0JCi0JLyoqCi0JICogVGhlIHBvc2l0aW9uIGNhdGVnb3J5IHR5cGljYWxseSB1c2VkIGZvciBhbiA8Y29kZT5JRG9jdW1lbnRSYW5nZTwvY29kZT4gcG9zaXRpb24KLQkgKiAodmFsdWUgPGNvZGU+IkRvY3VtZW50UmFuZ2VDYXRlZ29yeSI8L2NvZGU+KS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfQ0FURUdPUlk9ICJEb2N1bWVudFJhbmdlQ2F0ZWdvcnkiOwkvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQKLQkgKi8KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcG9zaXRpb24gdGhhdCBzcGVjaWZpZXMgYSBzdWJyYW5nZSBpbiB0aGUgdW5kZXJseWluZyBkb2N1bWVudCwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGRvY3VtZW50IHJhbmdlIHNwYW5zIHRoZSB3aG9sZSB1bmRlcmx5aW5nIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NpdGlvbiB0aGF0IHNwZWNpZmllcyBhIHN1YnJhbmdlIGluIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVBvc2l0aW9uIGdldFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVjNTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci0KLQotLyoqIAotICogQSBjb250ZW50IHByb3ZpZGVyIHRoYXQgbWVkaWF0ZXMgYmV0d2VlbiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4ncyBtb2RlbAotICogYW5kIHRoZSB2aWV3ZXIgaXRzZWxmLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgQ29udGVudE1lcmdlVmlld2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSUNvbnRlbnRQcm92aWRlciB7Ci0JCi0JLy8tLS0tIGFuY2VzdG9yIHNpZGUKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgYW5jZXN0b3Igc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgYW5jZXN0b3Igc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0QW5jZXN0b3JMYWJlbChPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvcHRpb25hbCBpbWFnZSBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LAotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCUltYWdlIGdldEFuY2VzdG9ySW1hZ2UoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIGZvciB0aGUgYW5jZXN0b3Igc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXR1cm5lZCBvYmplY3QgZGVwZW5kcyBvbiB0aGUgY29uY3JldGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgY29udGVudCBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LAotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCU9iamVjdCBnZXRBbmNlc3RvckNvbnRlbnQoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgYW5jZXN0b3Igc2lkZSBvZiB0aGUgZ2l2ZW4gaW5wdXQgZWxlbWVudCBzaG91bGQgYmUgc2hvd24uCi0JICogQHBhcmFtIGlucHV0IHRoZSBtZXJnZSB2aWV3ZXIncyBpbnB1dAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFuY2VzdG9yIHNpZGUgb2YgdGhlIGdpdmVuIGlucHV0IGVsZW1lbnQgc2hvdWxkIGJlIHNob3duCi0JICovCi0JYm9vbGVhbiBzaG93QW5jZXN0b3IoT2JqZWN0IGlucHV0KTsKLQkKLQkvLy0tLS0gbGVmdCBzaWRlCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIGxlZnQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgbGVmdCBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqLwotCVN0cmluZyBnZXRMZWZ0TGFiZWwoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGxlZnQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4sCi0JICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JSW1hZ2UgZ2V0TGVmdEltYWdlKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBmb3IgdGhlIGxlZnQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXR1cm5lZCBvYmplY3QgZGVwZW5kcyBvbiB0aGUgY29uY3JldGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgY29udGVudCBmb3IgdGhlIGxlZnQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4sCi0JICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JT2JqZWN0IGdldExlZnRDb250ZW50KE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxlZnQgc2lkZSBpcyBlZGl0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGVmdCBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBpcyBlZGl0YWJsZQkgCi0JICovCi0JYm9vbGVhbiBpc0xlZnRFZGl0YWJsZShPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogU2F2ZXMgbmV3IGNvbnRlbnRzIGZvciB0aGUgbGVmdCBzaWRlIG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcGFyYW0gYnl0ZXMgdGhlIG5ldyBjb250ZW50cyB0byBzYXZlIGZvciB0aGUgbGVmdCBzaWRlCi0JICovCi0Jdm9pZCBzYXZlTGVmdENvbnRlbnQoT2JqZWN0IGlucHV0LCBieXRlW10gYnl0ZXMpOwotCi0JLy8tLS0tIHJpZ2h0IHNpZGUKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgcmlnaHQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgcmlnaHQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0UmlnaHRMYWJlbChPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvcHRpb25hbCBpbWFnZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LAotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCUltYWdlIGdldFJpZ2h0SW1hZ2UoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIGZvciB0aGUgcmlnaHQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXR1cm5lZCBvYmplY3QgZGVwZW5kcyBvbiB0aGUgY29uY3JldGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgY29udGVudCBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LAotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCU9iamVjdCBnZXRSaWdodENvbnRlbnQoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcmlnaHQgc2lkZSBpcyBlZGl0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmlnaHQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gaXMgZWRpdGFibGUJIAotCSAqLwotCWJvb2xlYW4gaXNSaWdodEVkaXRhYmxlKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBTYXZlcyBuZXcgY29udGVudHMgZm9yIHRoZSByaWdodCBzaWRlIG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcGFyYW0gYnl0ZXMgdGhlIG5ldyBjb250ZW50cyB0byBzYXZlIGZvciB0aGUgcmlnaHQgc2lkZQotCSAqLwotCXZvaWQgc2F2ZVJpZ2h0Q29udGVudChPYmplY3QgaW5wdXQsIGJ5dGVbXSBieXRlcyk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvSVRva2VuQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvSVRva2VuQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdkOTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lUb2tlbkNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yOwotCi0KLS8qKgotICogRm9yIHBlcmZvcm1pbmcgYSBzby1jYWxsZWQgInRva2VuIGNvbXBhcmUiIG9uIGEgbGluZSBvZiB0ZXh0LgotICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4gaW50ZXJmYWNlCi0gKiBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+LgotICogPHA+Ci0gKiA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+IGFjdGl2YXRlcyB0aGUgdG9rZW4gY29tcGFyZSB3aGVuIG5hdmlnYXRpbmcgaW50bwotICogYSByYW5nZSBvZiBkaWZmZXJpbmcgbGluZXMuIEF0IGZpcnN0IHRoZSBsaW5lcyBhcmUgc2VsZWN0ZWQgYXMgYSBibG9jay4KLSAqIFdoZW4gbmF2aWdhdGluZyBpbnRvIHRoaXMgYmxvY2sgdGhlIHRva2VuIGNvbXBhcmUgc2hvd3MgZm9yIGV2ZXJ5IGxpbmUgCi0gKiB0aGUgZGlmZmVyaW5nIHRva2VuIGJ5IHNlbGVjdGluZyB0aGVtLgotICogPHA+Ci0gKiA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+J3MgZGVmYXVsdCB0b2tlbiBjb21wYXJhdG9yIHdvcmtzIG9uIGNoYXJhY3RlcnMgc2VwYXJhdGVkCi0gKiBieSB3aGl0ZXNwYWNlLiBJZiBhIGRpZmZlcmVudCBzdHJhdGVneSBpcyBuZWVkZWQgKGZvciBleGFtcGxlLCB0byB1c2UgSmF2YSB0b2tlbnMgaW4KLSAqIGEgSmF2YS1hd2FyZSBtZXJnZSB2aWV3ZXIpLCBjbGllbnRzIG1heSBjcmVhdGUgdGhlaXIgb3duIHRva2VuCi0gKiBjb21wYXJhdG9ycyBieSBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgKGFuZCBvdmVycmlkaW5nIHRoZQotICogPGNvZGU+VGV4dE1lcmdlVmlld2VyLmNyZWF0ZVRva2VuQ29tcGFyYXRvcjwvY29kZT4gZmFjdG9yeSBtZXRob2QpLgotICogPC9wPgotICoKLSAqIEBzZWUgVGV4dE1lcmdlVmlld2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRva2VuQ29tcGFyYXRvciBleHRlbmRzIElSYW5nZUNvbXBhcmF0b3IgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSB0b2tlbiB3aXRoIHRoZSBnaXZlbiBpbmRleC4KLQkgKiBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlIChidXQgbm90IG5lZ2F0aXZlKSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uCi0JICogYmVoaW5kIHRoZSBsYXN0IGNoYXJhY3RlciAodGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nKSBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgdG9rZW4gZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdG9rZW4gd2l0aCB0aGUgZ2l2ZW4gaW5kZXgKLQkgKiBAdGhyb3dzIGphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IGlzIG5lZ2F0aXZlCi0JICovCi0JaW50IGdldFRva2VuU3RhcnQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBsZW5ndGggb2YgdGhlIHRva2VuIHdpdGggdGhlIGdpdmVuIGluZGV4LgotCSAqIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKGJ1dCBub3QgbmVnYXRpdmUpIHRoZSB2YWx1ZSAwIGlzIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSB0b2tlbiBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbgotCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBsZW5ndGggb2YgdGhlIHRva2VuIHdpdGggdGhlIGdpdmVuIGluZGV4Ci0JICogQHRocm93cyBqYXZhLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCBpcyBuZWdhdGl2ZQotCSAqLwotCWludCBnZXRUb2tlbkxlbmd0aChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvVGV4dE1lcmdlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9UZXh0TWVyZ2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0NTg2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9UZXh0TWVyZ2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIGNoYW5uaW5nd2FsdG9uQG1hYy5jb20gLSBjdXJ2ZWQgbGluZSBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklLZXlCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JQ29tcGFyZUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5NZXJnZVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkJ1ZmZlcmVkQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Ub2tlbkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Eb2NMaW5lQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLklOYXZpZ2F0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVOYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotCi0vKioKLSAqIEEgdGV4dCBtZXJnZSB2aWV3ZXIgdXNlcyB0aGUgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlcjwvY29kZT4gdG8gcGVyZm9ybSBhCi0gKiB0ZXh0dWFsLCBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiBvZiB0d28gKG9yIHRocmVlKSBpbnB1dCBkb2N1bWVudHMuCi0gKiBJdCBpcyBiYXNlZCBvbiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBhbmQgdXNlcyA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPnMKLSAqIHRvIGltcGxlbWVudCB0aGUgYW5jZXN0b3IsIGxlZnQsIGFuZCByaWdodCBjb250ZW50IGFyZWFzLgotICogPHA+Ci0gKiBJbiB0aGUgdGhyZWUtd2F5IGNvbXBhcmUgY2FzZSByYW5nZXMgb2YgZGlmZmVyaW5nIGxpbmVzIGFyZSBoaWdobGlnaHRlZCBhbmQgZnJhbWVkCi0gKiB3aXRoIGRpZmZlcmVudCBjb2xvcnMgdG8gc2hvdyB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlIGlzIGFuIGluY29taW5nLCBvdXRnb2luZywgb3IgY29uZmxpY3RpbmcgY2hhbmdlLgotICogVGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4gc3VwcG9ydHMgdGhlIG5vdGlvbiBvZiBhIGN1cnJlbnQgImRpZmZlcmluZyByYW5nZSIKLSAqIGFuZCBwcm92aWRlcyB0b29sYmFyIGJ1dHRvbnMgdG8gbmF2aWdhdGUgZnJvbSBvbmUgcmFuZ2UgdG8gdGhlIG5leHQgKG9yIHByZXZpb3VzKS4KLSAqIDxwPgotICogSWYgdGhlcmUgaXMgYSBjdXJyZW50ICJkaWZmZXJpbmcgcmFuZ2UiIGFuZCB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBpcyBlZGl0YWJsZQotICogdGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4gZW5hYmxlcyBhY3Rpb25zIGluIGNvbnRleHQgbWVudSBhbmQgdG9vbGJhciB0bwotICogY29weSBhIHJhbmdlIGZyb20gb25lIHNpZGUgdG8gdGhlIG90aGVyIHNpZGUsIHRoZXJlYnkgcGVyZm9ybWluZyBhIG1lcmdlIG9wZXJhdGlvbi4KLSAqIDxwPgotICogSW4gYWRkaXRpb24gdG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0aGUgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPgotICogdXNlcyBhIHRva2VuIGJhc2VkIGNvbXBhcmUgb24gZGlmZmVyaW5nIGxpbmVzLgotICogVGhlIHRva2VuIGNvbXBhcmUgaXMgYWN0aXZhdGVkIHdoZW4gbmF2aWdhdGluZyBpbnRvCi0gKiBhIHJhbmdlIG9mIGRpZmZlcmluZyBsaW5lcy4gQXQgZmlyc3QgdGhlIGxpbmVzIGFyZSBzZWxlY3RlZCBhcyBhIGJsb2NrLgotICogV2hlbiBuYXZpZ2F0aW5nIGludG8gdGhpcyBibG9jayB0aGUgdG9rZW4gY29tcGFyZSBzaG93cyBmb3IgZXZlcnkgbGluZSAKLSAqIHRoZSBkaWZmZXJpbmcgdG9rZW4gYnkgc2VsZWN0aW5nIHRoZW0uCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+J3MgZGVmYXVsdCB0b2tlbiBjb21wYXJlIHdvcmtzIG9uIGNoYXJhY3RlcnMgc2VwYXJhdGVkCi0gKiBieSB3aGl0ZXNwYWNlLiBJZiBhIGRpZmZlcmVudCBzdHJhdGVneSBpcyBuZWVkZWQgKGZvciBleGFtcGxlLCBKYXZhIHRva2VucyBpbgotICogYSBKYXZhLWF3YXJlIG1lcmdlIHZpZXdlciksIGNsaWVudHMgY2FuIGNyZWF0ZSB0aGVpciBvd24gdG9rZW4KLSAqIGNvbXBhcmF0b3JzIGJ5IGltcGxlbWVudGluZyB0aGUgPGNvZGU+SVRva2VuQ29tcGFyYXRvcjwvY29kZT4gaW50ZXJmYWNlIGFuZCBvdmVycmlkaW5nIHRoZQotICogPGNvZGU+VGV4dE1lcmdlVmlld2VyLmNyZWF0ZVRva2VuQ29tcGFyYXRvcjwvY29kZT4gZmFjdG9yeSBtZXRob2QpLgotICogPHA+Ci0gKiBBY2Nlc3MgdG8gdGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4ncyBtb2RlbCBpcyBieSBtZWFucyBvZiBhbgotICogPGNvZGU+SU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyPC9jb2RlPi4gSXRzIDxjb2RlPmdldDxpdD5YPC9pdD48L2NvZGU+Q29udGVudDwvY29kZT4gbWV0aG9kcyBtdXN0IHJldHVybgotICogZWl0aGVyIGFuIDxjb2RlPklEb2N1bWVudDwvY29kZT4sIGFuIDxjb2RlPklEb2N1bWVudFJhbmdlPC9jb2RlPiwgb3IgYW4gPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4uCi0gKiBJbiB0aGUgPGNvZGU+SURvY3VtZW50UmFuZ2U8L2NvZGU+IGNhc2UgdGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4KLSAqIHdvcmtzIG9uIGEgc3VicmFuZ2Ugb2YgYSBkb2N1bWVudC4gSW4gdGhlIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+IGNhc2UKLSAqIGEgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbnRlcm5hbGx5IGFuZCBpbml0aWFsaXplZCBmcm9tIHRoZSBzdHJlYW0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPiBjYW4gYmUgdXNlZCBhcyBpcy4gSG93ZXZlciBjbGllbnRzIG1heSBzdWJjbGFzcwotICogdG8gY3VzdG9taXplIHRoZSBiZWhhdmlvci4gRm9yIGV4YW1wbGUgYSA8Y29kZT5NZXJnZVRleHRWaWV3ZXI8L2NvZGU+IGZvciBKYXZhIHdvdWxkIG92ZXJyaWRlCi0gKiB0aGUgPGNvZGU+Y29uZmlndXJlVGV4dFZpZXdlcjwvY29kZT4gbWV0aG9kIHRvIGNvbmZpZ3VyZSB0aGUgPGNvZGU+VGV4dFZpZXdlcjwvY29kZT4gZm9yIEphdmEgc291cmNlIGNvZGUsCi0gKiB0aGUgPGNvZGU+Y3JlYXRlVG9rZW5Db21wYXJhdG9yPC9jb2RlPiBtZXRob2QgdG8gY3JlYXRlIGEgSmF2YSBzcGVjaWZpYyB0b2tlbml6ZXIuCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuUmFuZ2VEaWZmZXJlbmNlcgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXIKLSAqIEBzZWUgSVRva2VuQ29tcGFyYXRvcgotICogQHNlZSBJRG9jdW1lbnRSYW5nZQotICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1Db250ZW50QWNjZXNzb3IKLSAqLwotcHVibGljIGNsYXNzIFRleHRNZXJnZVZpZXdlciBleHRlbmRzIENvbnRlbnRNZXJnZVZpZXdlciAgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklYXzQ3NjQwPSB0cnVlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEdMT0JBTF9BQ1RJT05TPSB7Ci0JCUFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQlBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwKLQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCUFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCksCi0JCUFjdGlvbkZhY3RvcnkuU0FWRS5nZXRJZCgpCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURVhUX0FDVElPTlM9IHsKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuVU5ET19JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuUkVET19JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuQ1VUX0lELAotCQlNZXJnZVNvdXJjZVZpZXdlci5DT1BZX0lELAotCQlNZXJnZVNvdXJjZVZpZXdlci5QQVNURV9JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuREVMRVRFX0lELAotCQlNZXJnZVNvdXJjZVZpZXdlci5TRUxFQ1RfQUxMX0lELAotCQlNZXJnZVNvdXJjZVZpZXdlci5TQVZFX0lECi0JfTsKLQkJCQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIHRoZSBmb2xsb3dpbmcgc3ltYm9saWMgY29uc3RhbnRzIG11c3QgbWF0Y2ggdGhlIElEcyBpbiBDb21wYXJlJ3MgcGx1Z2luLnhtbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNPTUlOR19DT0xPUj0gIklOQ09NSU5HX0NPTE9SIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRHT0lOR19DT0xPUj0gIk9VVEdPSU5HX0NPTE9SIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GTElDVElOR19DT0xPUj0gIkNPTkZMSUNUSU5HX0NPTE9SIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPTFZFRF9DT0xPUj0gIlJFU09MVkVEX0NPTE9SIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIGNvbnN0YW50cwotCS8qKiBXaWR0aCBvZiBsZWZ0IGFuZCByaWdodCB2ZXJ0aWNhbCBiYXIgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFSR0lOX1dJRFRIPSA2OwotCS8qKiBXaWR0aCBvZiBjZW50ZXIgYmFyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9XSURUSD0gMzQ7Ci0JLyoqIFdpZHRoIG9mIGJpcmRzIGV5ZSB2aWV3ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJUkRTX0VZRV9WSUVXX1dJRFRIPSAxMjsKLQkvKiogV2lkdGggb2YgYmlyZHMgZXllIHZpZXcgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklSRFNfRVlFX1ZJRVdfSU5TRVQ9IDI7Ci0JLyoqICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVfU0laRT0gNTsKLQkvKiogaWYgdHJ1ZSBjb3B5aW5nIGNvbmZsaWN0cyBmcm9tIG9uZSBzaWRlIHRvIG90aGVyIGNvbmNhdGVuYXRlcyBib3RoIHNpZGVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBBUFBFTkRfQ09ORkxJQ1Q9IHRydWU7Ci0KLQkvKiogbGluZSB3aWR0aCBvZiBjaGFuZ2UgYm9yZGVycyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVz0gMTsKLQkvKiogU2VsZWN0cyBiZXR3ZWVuIHNtYXJ0VG9rZW5EaWZmIGFuZCBtZXJnaW5nVG9rZW5EaWZmICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfTUVSR0lOR19UT0tFTl9ESUZGPSBmYWxzZTsKLQkJCi0JLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgY2hhbmdlIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgaXMgY29uc2lkZXJlZCBpbmNvbWluZyBvciBvdXRnb2luZwotCXByaXZhdGUgYm9vbGVhbiBmTGVmdElzTG9jYWw7Ci0JcHJpdmF0ZSBib29sZWFuIGZTaG93Q3VycmVudE9ubHk9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2hvd0N1cnJlbnRPbmx5Mj0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZk1hcmdpbldpZHRoPSBNQVJHSU5fV0lEVEg7Ci0JcHJpdmF0ZSBpbnQgZlRvcEluc2V0OwotCQotCS8vIENvbG9ycwotCXByaXZhdGUgUkdCIGZCYWNrZ3JvdW5kOwotCXByaXZhdGUgUkdCIGZGb3JlZ3JvdW5kOwotCXByaXZhdGUgYm9vbGVhbiBmUG9sbFN5c3RlbUZvcmVncm91bmQ9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZQb2xsU3lzdGVtQmFja2dyb3VuZD0gdHJ1ZTsKLQkKLQlwcml2YXRlIFJHQiBTRUxFQ1RFRF9JTkNPTUlORzsKLQlwcml2YXRlIFJHQiBJTkNPTUlORzsKLQlwcml2YXRlIFJHQiBJTkNPTUlOR19GSUxMOwotCQotCXByaXZhdGUgUkdCIFNFTEVDVEVEX0NPTkZMSUNUOwotCXByaXZhdGUgUkdCIENPTkZMSUNUOwotCXByaXZhdGUgUkdCIENPTkZMSUNUX0ZJTEw7Ci0JCi0JcHJpdmF0ZSBSR0IgU0VMRUNURURfT1VUR09JTkc7Ci0JcHJpdmF0ZSBSR0IgT1VUR09JTkc7Ci0JcHJpdmF0ZSBSR0IgT1VUR09JTkdfRklMTDsKLQkKLQlwcml2YXRlIFJHQiBSRVNPTFZFRDsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW5kT2ZEb2NSZWFjaGVkOwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCQotCS8qKiBBbGwgZGlmZnMgZm9yIGNhbGN1bGF0aW5nIHNjcm9sbGluZyBwb3NpdGlvbiAoaW5jbHVkZXMgbGluZSByYW5nZXMgd2l0aG91dCBjaGFuZ2VzKSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGZBbGxEaWZmczsKLQkvKiogU3Vic2V0IG9mIGFib3ZlOiBqdXN0IHJlYWwgZGlmZmVyZW5jZXMuICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgZkNoYW5nZURpZmZzOwotCS8qKiBUaGUgY3VycmVudCBkaWZmICovCi0JcHJpdmF0ZSBEaWZmIGZDdXJyZW50RGlmZjsKLQkKLQlwcml2YXRlIEhhc2hNYXAgZk5ld0FuY2VzdG9yUmFuZ2VzPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSGFzaE1hcCBmTmV3TGVmdFJhbmdlcz0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgZk5ld1JpZ2h0UmFuZ2VzPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgTWVyZ2VTb3VyY2VWaWV3ZXIgZkFuY2VzdG9yOwotCXByaXZhdGUgTWVyZ2VTb3VyY2VWaWV3ZXIgZkxlZnQ7Ci0JcHJpdmF0ZSBNZXJnZVNvdXJjZVZpZXdlciBmUmlnaHQ7Ci0JCi0JcHJpdmF0ZSBpbnQgZkxlZnRMaW5lQ291bnQ7Ci0JcHJpdmF0ZSBpbnQgZlJpZ2h0TGluZUNvdW50OwotCQotCXByaXZhdGUgU3RyaW5nIGZMZWZ0RW5jb2Rpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgZlJpZ2h0RW5jb2Rpbmc7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZJblNjcm9sbGluZzsKLQkKLQlwcml2YXRlIGludCBmUHRzW109IG5ldyBpbnRbOF07CS8vIHNjcmF0Y2ggYXJlYSBmb3IgcG9seWdvbiBkcmF3aW5nCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVBbmNlc3Rvcj0gZmFsc2U7Ci0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGZJZ25vcmVBbmNlc3Rvckl0ZW07Ci0JcHJpdmF0ZSBib29sZWFuIGZIaWdobGlnaHRSYW5nZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZTaG93UHNldWRvQ29uZmxpY3RzPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZlVzZVNwbGluZXM9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZVc2VTaW5nbGVMaW5lPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmVXNlUmVzb2x2ZVVJPSB0cnVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlN5bWJvbGljRm9udE5hbWU7Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZk5leHRJdGVtOwkvLyBnb3RvIG5leHQgZGlmZmVyZW5jZQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBmUHJldmlvdXNJdGVtOwkvLyBnb3RvIHByZXZpb3VzIGRpZmZlcmVuY2UKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtOwotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBmQ29weURpZmZSaWdodFRvTGVmdEl0ZW07Ci0JCi0JcHJpdmF0ZSBJS2V5QmluZGluZ1NlcnZpY2UgZktleUJpbmRpbmdTZXJ2aWNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBmU3luY2hyb25pemVkU2Nyb2xsaW5nPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmU2hvd01vcmVJbmZvPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1lcmdlU291cmNlVmlld2VyIGZGb2N1c1BhcnQ7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZTdWJEb2M9IHRydWU7Ci0JcHJpdmF0ZSBJUG9zaXRpb25VcGRhdGVyIGZQb3NpdGlvblVwZGF0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc01vdGlmOwkKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FyYm9uOwkKLQkKLQlwcml2YXRlIGJvb2xlYW4gZkhhc0Vycm9yczsKLQkJCi0KLQkvLyBTV1Qgd2lkZ2V0cwotCXByaXZhdGUgQnVmZmVyZWRDYW52YXMgZkFuY2VzdG9yQ2FudmFzOwotCXByaXZhdGUgQnVmZmVyZWRDYW52YXMgZkxlZnRDYW52YXM7Ci0JcHJpdmF0ZSBCdWZmZXJlZENhbnZhcyBmUmlnaHRDYW52YXM7Ci0JcHJpdmF0ZSBDYW52YXMgZlNjcm9sbENhbnZhczsKLQlwcml2YXRlIFNjcm9sbEJhciBmVlNjcm9sbEJhcjsKLQlwcml2YXRlIENhbnZhcyBmQmlyZHNFeWVDYW52YXM7Ci0JcHJpdmF0ZSBDYW52YXMgZlN1bW1hcnlIZWFkZXI7Ci0JcHJpdmF0ZSBIZWFkZXJQYWludGVyIGZIZWFkZXJQYWludGVyOwotCQotCS8vIFNXVCByZXNvdXJjZXMgdG8gYmUgZGlzcG9zZWQKLQlwcml2YXRlIE1hcCBmQ29sb3JzOwotCXByaXZhdGUgQ3Vyc29yIGZCaXJkc0V5ZUN1cnNvcjsKLQkJCQkKLQkvLyBwb2ludHMgZm9yIGNlbnRlciBjdXJ2ZXMKLQlwcml2YXRlIGRvdWJsZVtdIGZCYXNpY0NlbnRlckN1cnZlOwotCQotCXByaXZhdGUgQnV0dG9uIGZDZW50ZXJCdXR0b247Ci0JcHJpdmF0ZSBEaWZmIGZCdXR0b25EaWZmOwotCQkJCQkKLQljbGFzcyBIZWFkZXJQYWludGVyIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVQ9IEJJUkRTX0VZRV9WSUVXX0lOU0VUOwotCi0JCXByaXZhdGUgUkdCIGZJbmRpY2F0b3JDb2xvcjsKLQkJcHJpdmF0ZSBDb2xvciBmU2VwYXJhdG9yQ29sb3I7Ci0JCQotCQlwdWJsaWMgSGVhZGVyUGFpbnRlcigpIHsKLQkJCWZTZXBhcmF0b3JDb2xvcj0gZlN1bW1hcnlIZWFkZXIuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVyk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFJldHVybnMgdHJ1ZSBvbiBjb2xvciBjaGFuZ2UKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNldENvbG9yKFJHQiBjb2xvcikgewotCQkJUkdCIG9sZENvbG9yPSBmSW5kaWNhdG9yQ29sb3I7Ci0JCQlmSW5kaWNhdG9yQ29sb3I9IGNvbG9yOwotCQkJaWYgKGNvbG9yID09IG51bGwpCi0JCQkJcmV0dXJuIG9sZENvbG9yICE9IG51bGw7Ci0JCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gIWNvbG9yLmVxdWFscyhvbGRDb2xvcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGRyYXdCZXZlbFJlY3QoR0MgZ2MsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvciB0b3BMZWZ0LCBDb2xvciBib3R0b21SaWdodCkgewotCQkJZ2Muc2V0Rm9yZWdyb3VuZCh0b3BMZWZ0KTsKLQkJCWdjLmRyYXdMaW5lKHgsIHksIHggKyB3IC0xLCB5KTsKLQkJCWdjLmRyYXdMaW5lKHgsIHksIHgsIHkgKyBoIC0xKTsKLQkJCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJvdHRvbVJpZ2h0KTsKLQkJCWdjLmRyYXdMaW5lKHggKyB3LCB5LCB4ICsgdywgeSArIGgpOwotCQkJZ2MuZHJhd0xpbmUoeCwgeSArIGgsIHggKyB3LCB5ICsgaCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQotCQkJUG9pbnQgcz0gZlN1bW1hcnlIZWFkZXIuZ2V0U2l6ZSgpOwotCQkJCi0JCQlpZiAoZkluZGljYXRvckNvbG9yICE9IG51bGwpIHsKLQkJCQlEaXNwbGF5IGQ9IGZTdW1tYXJ5SGVhZGVyLmdldERpc3BsYXkoKTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoZ2V0Q29sb3IoZCwgZkluZGljYXRvckNvbG9yKSk7Ci0JCQkJaW50IG1pbj0gTWF0aC5taW4ocy54LCBzLnkpLTIqSU5TRVQ7Ci0JCQkJUmVjdGFuZ2xlIHI9IG5ldyBSZWN0YW5nbGUoKHMueC1taW4pLzIsIChzLnktbWluKS8yLCBtaW4sIG1pbik7Ci0JCQkJZS5nYy5maWxsUmVjdGFuZ2xlKHIpOwotCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCWRyYXdCZXZlbFJlY3QoZS5nYywgci54LCByLnksIHIud2lkdGggLTEsIHIuaGVpZ2h0IC0xLCBkLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVyksIGQuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XKSk7Ci0KLQkJCQllLmdjLnNldEZvcmVncm91bmQoZlNlcGFyYXRvckNvbG9yKTsKLQkJCQllLmdjLnNldExpbmVXaWR0aCgxKTsKLQkJCQllLmdjLmRyYXdMaW5lKDArMSwgcy55LTEsIHMueC0xLTEsIHMueS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVGhlIHBvc2l0aW9uIHVwZGF0ZXIgdXNlZCB0byBhZGFwdCB0aGUgcG9zaXRpb25zIHJlcHJlc2VudGluZwotCSAqIHRoZSBjaGlsZCBkb2N1bWVudCByYW5nZXMgdG8gY2hhbmdlcyBvZiB0aGUgcGFyZW50IGRvY3VtZW50LgotCSAqLwotCWNsYXNzIENoaWxkUG9zaXRpb25VcGRhdGVyIGV4dGVuZHMgRGVmYXVsdFBvc2l0aW9uVXBkYXRlciB7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGVzIHRoZSBwb3NpdGlvbiB1cGRhdGVkLgotCQkgKi8KLQkJcHJvdGVjdGVkIENoaWxkUG9zaXRpb25VcGRhdGVyKFN0cmluZyBjYXRlZ29yeSkgewotCQkJc3VwZXIoY2F0ZWdvcnkpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBDaGlsZCBkb2N1bWVudCByYW5nZXMgY2Fubm90IGJlIGRlbGV0ZWQgb3RoZXIgdGhlbiBieSBjYWxsaW5nCi0JCSAqIGZyZWVDaGlsZERvY3VtZW50LgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gbm90RGVsZXRlZCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvKgotCQkgKiBJZiBhbiBpbnNlcnRpb24gaGFwcGVucyBhdCBhIGNoaWxkIGRvY3VtZW50J3Mgc3RhcnQgb2Zmc2V0LCB0aGUKLQkJICogcG9zaXRpb24gaXMgZXh0ZW5kZWQgcmF0aGVyIHRoYW4gc2hpZnRlZC4gQWxzbywgaWYgc29tZXRoaW5nIGlzIGFkZGVkIAotCQkgKiByaWdodCBiZWhpbmQgdGhlIGVuZCBvZiB0aGUgcG9zaXRpb24sIHRoZSBwb3NpdGlvbiBpcyBleHRlbmRlZCByYXRoZXIKLQkJICogdGhhbiBrZXB0IHN0YWJsZS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkYXB0VG9JbnNlcnQoKSB7Ci0JCQkKLQkJCWlmIChmUG9zaXRpb24gPT0gZkxlZnQuZ2V0UmVnaW9uKCkgfHwgZlBvc2l0aW9uID09IGZSaWdodC5nZXRSZWdpb24oKSkgewotCQkJCWludCBteVN0YXJ0PSBmUG9zaXRpb24ub2Zmc2V0OwotCQkJCWludCBteUVuZD0gICBmUG9zaXRpb24ub2Zmc2V0ICsgZlBvc2l0aW9uLmxlbmd0aDsKLQkJCQlteUVuZD0gTWF0aC5tYXgobXlTdGFydCwgbXlFbmQpOwotCQkJCQotCQkJCWludCB5b3Vyc1N0YXJ0PSBmT2Zmc2V0OwotCQkJCWludCB5b3Vyc0VuZD0gICBmT2Zmc2V0ICsgZlJlcGxhY2VMZW5ndGggLTE7Ci0JCQkJeW91cnNFbmQ9IE1hdGgubWF4KHlvdXJzU3RhcnQsIHlvdXJzRW5kKTsKLQkJCQkKLQkJCQlpZiAobXlFbmQgPCB5b3Vyc1N0YXJ0KQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJaWYgKG15U3RhcnQgPD0geW91cnNTdGFydCkKLQkJCQkJZlBvc2l0aW9uLmxlbmd0aCArPSBmUmVwbGFjZUxlbmd0aDsKLQkJCQllbHNlCi0JCQkJCWZQb3NpdGlvbi5vZmZzZXQgKz0gZlJlcGxhY2VMZW5ndGg7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmFkYXB0VG9JbnNlcnQoKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQkvKgotCSAqIEEgRGlmZiByZXByZXNlbnRzIHN5bmNocm9uaXplZCBjaGFyYWN0ZXIgcmFuZ2VzIGluIHR3byBvciB0aHJlZSBEb2N1bWVudHMuCi0JICogVGhlIE1lcmdlVGV4dFZpZXdlciB1c2VzIERpZmZzIHRvIGZpbmQgZGlmZmVyZW5jZXMgaW4gbGluZSBhbmQgdG9rZW4gcmFuZ2VzLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gY2xhc3MgRGlmZiB7Ci0JCS8qKiBjaGFyYWN0ZXIgcmFuZ2UgaW4gYW5jZXN0b3IgZG9jdW1lbnQgKi8KLQkJUG9zaXRpb24gZkFuY2VzdG9yUG9zOwotCQkvKiogY2hhcmFjdGVyIHJhbmdlIGluIGxlZnQgZG9jdW1lbnQgKi8KLQkJUG9zaXRpb24gZkxlZnRQb3M7Ci0JCS8qKiBjaGFyYWN0ZXIgcmFuZ2UgaW4gcmlnaHQgZG9jdW1lbnQgKi8KLQkJUG9zaXRpb24gZlJpZ2h0UG9zOwotCQkvKiogaWYgdGhpcyBpcyBhIFRva2VuRGlmZiBmUGFyZW50IHBvaW50cyB0byB0aGUgZW5jbG9zaW5nIExpbmVEaWZmICovCi0JCURpZmYgZlBhcmVudDsJCi0JCS8qKiBpZiBEaWZmIGhhcyBiZWVuIHJlc29sdmVkICovCi0JCWJvb2xlYW4gZlJlc29sdmVkOwotCQlpbnQgZkRpcmVjdGlvbjsKLQkJYm9vbGVhbiBmSXNUb2tlbj0gZmFsc2U7Ci0JCS8qKiBjaGlsZCB0b2tlbiBkaWZmcyAqLwotCQlBcnJheUxpc3QgZkRpZmZzOwotCQlib29sZWFuIGZJc1doaXRlc3BhY2U9IGZhbHNlOwotCi0JCS8qCi0JCSAqIENyZWF0ZSBEaWZmIGZyb20gdHdvIHJhbmdlcyBhbmQgYW4gb3B0aW9uYWwgcGFyZW50IGRpZmYuCi0JCSAqLwotCQlEaWZmKERpZmYgcGFyZW50LCBpbnQgZGlyLCBJRG9jdW1lbnQgYW5jZXN0b3JEb2MsIFBvc2l0aW9uIGFSYW5nZSwgaW50IGFuY2VzdG9yU3RhcnQsIGludCBhbmNlc3RvckVuZCwKLQkJCQkJCQkgSURvY3VtZW50IGxlZnREb2MsIFBvc2l0aW9uIGxSYW5nZSwgaW50IGxlZnRTdGFydCwgaW50IGxlZnRFbmQsCi0JCQkJCQkJIElEb2N1bWVudCByaWdodERvYywgUG9zaXRpb24gclJhbmdlLCBpbnQgcmlnaHRTdGFydCwgaW50IHJpZ2h0RW5kKSB7Ci0JCQlmUGFyZW50PSBwYXJlbnQgIT0gbnVsbCA/IHBhcmVudCA6IHRoaXM7Ci0JCQlmRGlyZWN0aW9uPSBkaXI7Ci0JCQkKLQkJCWZMZWZ0UG9zPSBjcmVhdGVQb3NpdGlvbihsZWZ0RG9jLCBsUmFuZ2UsIGxlZnRTdGFydCwgbGVmdEVuZCk7Ci0JCQlmUmlnaHRQb3M9IGNyZWF0ZVBvc2l0aW9uKHJpZ2h0RG9jLCByUmFuZ2UsIHJpZ2h0U3RhcnQsIHJpZ2h0RW5kKTsKLQkJCWlmIChhbmNlc3RvckRvYyAhPSBudWxsKQotCQkJCWZBbmNlc3RvclBvcz0gY3JlYXRlUG9zaXRpb24oYW5jZXN0b3JEb2MsIGFSYW5nZSwgYW5jZXN0b3JTdGFydCwgYW5jZXN0b3JFbmQpOwotCQl9Ci0JCQotCQlQb3NpdGlvbiBnZXRQb3NpdGlvbihjaGFyIHR5cGUpIHsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAnQSc6Ci0JCQkJcmV0dXJuIGZBbmNlc3RvclBvczsKLQkJCWNhc2UgJ0wnOgotCQkJCXJldHVybiBmTGVmdFBvczsKLQkJCWNhc2UgJ1InOgotCQkJCXJldHVybiBmUmlnaHRQb3M7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc0luUmFuZ2UoY2hhciB0eXBlLCBpbnQgcG9zKSB7Ci0JCQlQb3NpdGlvbiBwPSBnZXRQb3NpdGlvbih0eXBlKTsKLQkJCXJldHVybiAocG9zID49IHAub2Zmc2V0KSAmJiAocG9zIDwgKHAub2Zmc2V0K3AubGVuZ3RoKSk7Ci0JCX0KLQkJCi0JCVN0cmluZyBjaGFuZ2VUeXBlKCkgewotCQkJYm9vbGVhbiBsZWZ0RW1wdHk9IGZMZWZ0UG9zLmxlbmd0aCA9PSAwOwotCQkJYm9vbGVhbiByaWdodEVtcHR5PSBmUmlnaHRQb3MubGVuZ3RoID09IDA7Ci0JCQkKLQkJCWlmIChmRGlyZWN0aW9uID09IFJhbmdlRGlmZmVyZW5jZS5MRUZUKSB7Ci0JCQkJaWYgKCFsZWZ0RW1wdHkgJiYgcmlnaHRFbXB0eSkKLQkJCQkJcmV0dXJuIENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5jaGFuZ2VUeXBlLmFkZGl0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobGVmdEVtcHR5ICYmICFyaWdodEVtcHR5KQotCQkJCQlyZXR1cm4gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmNoYW5nZVR5cGUuZGVsZXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlpZiAobGVmdEVtcHR5ICYmICFyaWdodEVtcHR5KQotCQkJCQlyZXR1cm4gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmNoYW5nZVR5cGUuYWRkaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghbGVmdEVtcHR5ICYmIHJpZ2h0RW1wdHkpCi0JCQkJCXJldHVybiBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuY2hhbmdlVHlwZS5kZWxldGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmNoYW5nZVR5cGUuY2hhbmdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQlpbnQgY29kZT0gRGlmZmVyZW5jZXIuQ0hBTkdFOwotCQkJc3dpdGNoIChmRGlyZWN0aW9uKSB7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLQkJCQljb2RlKz0gRGlmZmVyZW5jZXIuTEVGVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkxFRlQ6Ci0JCQkJY29kZSs9IERpZmZlcmVuY2VyLlJJR0hUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQU5DRVNUT1I6Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVDoKLQkJCQljb2RlKz0gRGlmZmVyZW5jZXIuQ09ORkxJQ1RJTkc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29kZSAhPSAwKQotCQkJCXJldHVybiBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpLmdldEltYWdlKGNvZGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKElEb2N1bWVudCBkb2MsIFBvc2l0aW9uIHJhbmdlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGw9IGVuZC1zdGFydDsKLQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQlpbnQgZGw9IHJhbmdlLmxlbmd0aDsKLQkJCQkJaWYgKGwgPiBkbCkKLQkJCQkJCWw9IGRsOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IGRsPSBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWlmIChzdGFydCtsID4gZGwpCi0JCQkJCQlsPSBkbC1zdGFydDsKLQkJCQl9Ci0JCQkJCQotCQkJCVBvc2l0aW9uIHA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJcD0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJZG9jLmFkZFBvc2l0aW9uKElEb2N1bWVudFJhbmdlLlJBTkdFX0NBVEVHT1JZLCBwKTsKLQkJCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQkJcmV0dXJuIHA7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlZSkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdm9pZCBhZGQoRGlmZiBkKSB7Ci0JCQlpZiAoZkRpZmZzID09IG51bGwpCi0JCQkJZkRpZmZzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmRGlmZnMuYWRkKGQpOwotCQl9Ci0JCQotCQlib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJCWlmIChmQW5jZXN0b3JQb3MgIT0gbnVsbCAmJiBmQW5jZXN0b3JQb3MuaXNEZWxldGVkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZkxlZnRQb3MuaXNEZWxldGVkKCkgfHwgZlJpZ2h0UG9zLmlzRGVsZXRlZCgpOwotCQl9Ci0JCQotCQl2b2lkIHNldFJlc29sdmVkKGJvb2xlYW4gcikgewotCQkJZlJlc29sdmVkPSByOwotCQkJaWYgKHIpCi0JCQkJZkRpZmZzPSBudWxsOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQkJaWYgKCFmUmVzb2x2ZWQgJiYgZkRpZmZzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBlPSBmRGlmZnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQkJRGlmZiBkPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJCWlmICghZC5pc1Jlc29sdmVkKCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZSZXNvbHZlZDsKLQkJfQotCQkKLS8vCQlwcml2YXRlIGJvb2xlYW4gaXNJbmNvbWluZygpIHsKLS8vCQkJc3dpdGNoIChmRGlyZWN0aW9uKSB7Ci0vLwkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotLy8JCQkJaWYgKGZMZWZ0SXNMb2NhbCkKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotLy8JCQkJaWYgKCFmTGVmdElzTG9jYWwpCi0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzSW5jb21pbmdPckNvbmZsaWN0aW5nKCkgewotCQkJc3dpdGNoIChmRGlyZWN0aW9uKSB7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLQkJCQlpZiAoZkxlZnRJc0xvY2FsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkxFRlQ6Ci0JCQkJaWYgKCFmTGVmdElzTG9jYWwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1Q6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0vLwkJcHJpdmF0ZSBib29sZWFuIGlzVW5yZXNvbHZlZEluY29taW5nKCkgewotLy8JCQlpZiAoZlJlc29sdmVkKQotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQlyZXR1cm4gaXNJbmNvbWluZygpOwotLy8JCX0KLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBpc1VucmVzb2x2ZWRJbmNvbWluZ09yQ29uZmxpY3RpbmcoKSB7Ci0JCQlpZiAoZlJlc29sdmVkKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBpc0luY29taW5nT3JDb25mbGljdGluZygpOwotCQl9Ci0JCQkJCi0JCVBvc2l0aW9uIGdldFBvc2l0aW9uKE1lcmdlU291cmNlVmlld2VyIHcpIHsKLQkJCWlmICh3ID09IGZMZWZ0KQotCQkJCXJldHVybiBmTGVmdFBvczsKLQkJCWlmICh3ID09IGZSaWdodCkKLQkJCQlyZXR1cm4gZlJpZ2h0UG9zOwotCQkJaWYgKHcgPT0gZkFuY2VzdG9yKQotCQkJCXJldHVybiBmQW5jZXN0b3JQb3M7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoKLQkJICogUmV0dXJucyB0cnVlIGlmIGdpdmVuIGNoYXJhY3RlciByYW5nZSBvdmVybGFwcyB3aXRoIHRoaXMgRGlmZi4KLQkJICovCi0JCWJvb2xlYW4gb3ZlcmxhcHMoTWVyZ2VTb3VyY2VWaWV3ZXIgdywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQlQb3NpdGlvbiBoPSBnZXRQb3NpdGlvbih3KTsKLQkJCWlmIChoICE9IG51bGwpIHsKLQkJCQlpbnQgZHM9IGguZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGRlPSBkcyArIGguZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKChzdGFydCA8IGRlKSAmJiAoZW5kID49IGRzKSkKLQkJCQkJcmV0dXJuIHRydWU7CQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkJCi0JCWludCBnZXRNYXhEaWZmSGVpZ2h0KGJvb2xlYW4gd2l0aEFuY2VzdG9yKSB7Ci0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsKLQkJCWludCBoPSBmTGVmdC5nZXRMaW5lUmFuZ2UoZkxlZnRQb3MsIHJlZ2lvbikueTsKLQkJCWlmICh3aXRoQW5jZXN0b3IpCi0JCQkJaD0gTWF0aC5tYXgoaCwgZkFuY2VzdG9yLmdldExpbmVSYW5nZShmQW5jZXN0b3JQb3MsIHJlZ2lvbikueSk7Ci0JCQlyZXR1cm4gTWF0aC5tYXgoaCwgZlJpZ2h0LmdldExpbmVSYW5nZShmUmlnaHRQb3MsIHJlZ2lvbikueSk7Ci0JCX0KLQkJCi0JCWludCBnZXRBbmNlc3RvckhlaWdodCgpIHsKLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwkJCQotCQkJcmV0dXJuIGZBbmNlc3Rvci5nZXRMaW5lUmFuZ2UoZkFuY2VzdG9yUG9zLCByZWdpb24pLnk7Ci0JCX0KLQotCQlpbnQgZ2V0TGVmdEhlaWdodCgpIHsKLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwkJCQotCQkJcmV0dXJuIGZMZWZ0LmdldExpbmVSYW5nZShmTGVmdFBvcywgcmVnaW9uKS55OwotCQl9Ci0KLQkJaW50IGdldFJpZ2h0SGVpZ2h0KCkgewotCQkJUG9pbnQgcmVnaW9uPSBuZXcgUG9pbnQoMCwgMCk7CQkJCi0JCQlyZXR1cm4gZlJpZ2h0LmdldExpbmVSYW5nZShmUmlnaHRQb3MsIHJlZ2lvbikueTsKLQkJfQotCX0KLQotCS8vLS0tLSBNZXJnZVRleHRWaWV3ZXIKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgdGV4dCBtZXJnZSB2aWV3ZXIgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgVGV4dE1lcmdlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5OVUxMLCBjb25maWd1cmF0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgbWVyZ2Ugdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIHN0eWxlIFNXVCBzdHlsZSBiaXRzIGZvciB0b3AgbGV2ZWwgY29tcG9zaXRlIG9mIHRoaXMgdmlld2VyCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIFRleHRNZXJnZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIoc3R5bGUsIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSksIGNvbmZpZ3VyYXRpb24pOwotCQkKLQkJZlN5bWJvbGljRm9udE5hbWU9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkKLQkJU3RyaW5nIHBsYXRmb3JtPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQkJZklzTW90aWY9ICJtb3RpZiIuZXF1YWxzKHBsYXRmb3JtKTsgLy8kTk9OLU5MUy0xJAotCQlmSXNDYXJib249ICJjYXJib24iLmVxdWFscyhwbGF0Zm9ybSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChmSXNNb3RpZikKLQkJCWZNYXJnaW5XaWR0aD0gMDsKLQkJCQotCQlEaXNwbGF5IGRpc3BsYXk9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCQotCQlmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dE1lcmdlVmlld2VyLnRoaXMucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJfQotCQl9OwotCi0JCWZQcmVmZXJlbmNlU3RvcmU9IGNvbmZpZ3VyYXRpb24uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJCQotCQkJY2hlY2tGb3JDb2xvclVwZGF0ZShkaXNwbGF5KTsKLQotCQkJZkxlZnRJc0xvY2FsPSBVdGlsaXRpZXMuZ2V0Qm9vbGVhbihjb25maWd1cmF0aW9uLCAiTEVGVF9JU19MT0NBTCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJZlN5bmNocm9uaXplZFNjcm9sbGluZz0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TWU5DSFJPTklaRV9TQ1JPTExJTkcpOwotCQkJZlNob3dNb3JlSW5mbz0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TSE9XX01PUkVfSU5GTyk7Ci0JCQlmU2hvd1BzZXVkb0NvbmZsaWN0cz0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TSE9XX1BTRVVET19DT05GTElDVFMpOwotCQkJLy9mVXNlU3BsaW5lcz0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfU1BMSU5FUyk7Ci0JCQlmVXNlU2luZ2xlTGluZT0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfU0lOR0xFX0xJTkUpOwotCQkJLy9mVXNlUmVzb2x2ZVVJPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tcGFyZVByZWZlcmVuY2VQYWdlLlVTRV9SRVNPTFZFX1VJKTsKLQkJfQotCQkKLQkJZkRvY3VtZW50TGlzdGVuZXI9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZSkgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZSkgewotCQkJCVRleHRNZXJnZVZpZXdlci50aGlzLmRvY3VtZW50Q2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQkJCi0JCWJ1aWxkQ29udHJvbChwYXJlbnQpOwotCQkKLQkJSU5hdmlnYXRhYmxlIG5hdj0gbmV3IElOYXZpZ2F0YWJsZSgpIHsKLQkJCXB1YmxpYyBib29sZWFuIGdvdG9EaWZmZXJlbmNlKGJvb2xlYW4gbmV4dCkgewotCQkJCXJldHVybiBuYXZpZ2F0ZShuZXh0LCBmYWxzZSwgZmFsc2UpOwotCQkJfQotCQl9OwotCQlmQ29tcG9zaXRlLnNldERhdGEoSU5hdmlnYXRhYmxlLk5BVklHQVRPUl9QUk9QRVJUWSwgbmF2KTsKLQkJCi0JCWZCaXJkc0V5ZUN1cnNvcj0gbmV3IEN1cnNvcihwYXJlbnQuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotCQkKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCUpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKS5hZGRMaXN0ZW5lcihmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJdXBkYXRlRm9udCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRm9udCgpIHsKLQkJRm9udCBmPSBKRmFjZVJlc291cmNlcy5nZXRGb250KGZTeW1ib2xpY0ZvbnROYW1lKTsKLQkJaWYgKGYgIT0gbnVsbCkgewotCQkJaWYgKGZBbmNlc3RvciAhPSBudWxsKQotCQkJCWZBbmNlc3Rvci5zZXRGb250KGYpOwotCQkJaWYgKGZMZWZ0ICE9IG51bGwpCi0JCQkJZkxlZnQuc2V0Rm9udChmKTsKLQkJCWlmIChmUmlnaHQgIT0gbnVsbCkKLQkJCQlmUmlnaHQuc2V0Rm9udChmKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JDb2xvclVwZGF0ZShEaXNwbGF5IGRpc3BsYXkpIHsKLQkJaWYgKGZQb2xsU3lzdGVtRm9yZWdyb3VuZCkgewotCQkJUkdCIGZnPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpLmdldFJHQigpOwotCQkJaWYgKGZGb3JlZ3JvdW5kID09IG51bGwgfHwgIWZnLmVxdWFscyhmRm9yZWdyb3VuZCkpIHsKLQkJCQlmRm9yZWdyb3VuZD0gZmc7Ci0JCQkJdXBkYXRlQ29sb3JzKGRpc3BsYXkpOwotCQkJfQotCQl9Ci0JCWlmIChmUG9sbFN5c3RlbUJhY2tncm91bmQpIHsKLQkJCVJHQiBiZz0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKS5nZXRSR0IoKTsKLQkJCWlmIChmQmFja2dyb3VuZCA9PSBudWxsIHx8ICFiZy5lcXVhbHMoZkJhY2tncm91bmQpKSB7Ci0JCQkJZkJhY2tncm91bmQ9IGJnOwotCQkJCXVwZGF0ZUNvbG9ycyhkaXNwbGF5KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2aWV3ZXIncyBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSBnaXZlbiBSR0IgdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgaXMgdXNlZC4KLQkgKiBAcGFyYW0gYmFja2dyb3VuZCB0aGUgYmFja2dyb3VuZCBjb2xvciBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIHN5c3RlbSdzIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoUkdCIGJhY2tncm91bmQpIHsKLQkJZlBvbGxTeXN0ZW1CYWNrZ3JvdW5kPSAoYmFja2dyb3VuZCA9PSBudWxsKTsKLQkJZkJhY2tncm91bmQ9IGJhY2tncm91bmQ7Ci0JCXVwZGF0ZUNvbG9ycyhudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBSR0IgZ2V0QmFja2dyb3VuZChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJaWYgKGZCYWNrZ3JvdW5kICE9IG51bGwpCi0JCQlyZXR1cm4gZkJhY2tncm91bmQ7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5PSBmQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJcmV0dXJuIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkuZ2V0UkdCKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHZpZXdlcidzIGZvcmVncm91bmQgY29sb3IgdG8gdGhlIGdpdmVuIFJHQiB2YWx1ZS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvciBpcyB1c2VkLgotCSAqIEBwYXJhbSBmb3JlZ3JvdW5kIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihSR0IgZm9yZWdyb3VuZCkgewotCQlmUG9sbFN5c3RlbUZvcmVncm91bmQ9IChmb3JlZ3JvdW5kID09IG51bGwpOwotCQlmRm9yZWdyb3VuZD0gZm9yZWdyb3VuZDsKLQkJdXBkYXRlQ29sb3JzKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29sb3JzKERpc3BsYXkgZGlzcGxheSkgewotCQkKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXk9IGZDb21wb3NpdGUuZ2V0RGlzcGxheSgpOwotCQkKLQkJQ29sb3IgY29sb3I9IG51bGw7Ci0JCWlmIChmQmFja2dyb3VuZCAhPSBudWxsKQotCQkJY29sb3I9IGdldENvbG9yKGRpc3BsYXksIGZCYWNrZ3JvdW5kKTsKLQkJCi0JCWlmIChmQW5jZXN0b3IgIT0gbnVsbCkKLQkJCWZBbmNlc3Rvci5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotCQlpZiAoZkxlZnQgIT0gbnVsbCkKLQkJCWZMZWZ0LnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0JCWlmIChmUmlnaHQgIT0gbnVsbCkKLQkJCWZSaWdodC5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotCQkJCQkJCi0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnk9IEpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKTsKLQkJCi0JCVJHQiBiZz0gZ2V0QmFja2dyb3VuZChkaXNwbGF5KTsKLQkJU0VMRUNURURfSU5DT01JTkc9IHJlZ2lzdHJ5LmdldFJHQihJTkNPTUlOR19DT0xPUik7Ci0JCWlmIChTRUxFQ1RFRF9JTkNPTUlORyA9PSBudWxsKQotCQkJU0VMRUNURURfSU5DT01JTkc9IG5ldyBSR0IoMCwgMCwgMjU1KTsJLy8gQkxVRQotCQlJTkNPTUlORz0gaW50ZXJwb2xhdGUoU0VMRUNURURfSU5DT01JTkcsIGJnLCAwLjYpOwotCQlJTkNPTUlOR19GSUxMPSBpbnRlcnBvbGF0ZShTRUxFQ1RFRF9JTkNPTUlORywgYmcsIDAuOTcpOwotCi0JCVNFTEVDVEVEX09VVEdPSU5HPSByZWdpc3RyeS5nZXRSR0IoT1VUR09JTkdfQ09MT1IpOwotCQlpZiAoU0VMRUNURURfT1VUR09JTkcgPT0gbnVsbCkKLQkJCVNFTEVDVEVEX09VVEdPSU5HPSBuZXcgUkdCKDAsIDAsIDApOwkvLyBCTEFDSwotCQlPVVRHT0lORz0gaW50ZXJwb2xhdGUoU0VMRUNURURfT1VUR09JTkcsIGJnLCAwLjYpOwotCQlPVVRHT0lOR19GSUxMPSBpbnRlcnBvbGF0ZShTRUxFQ1RFRF9PVVRHT0lORywgYmcsIDAuOTcpOwotCQkKLQkJU0VMRUNURURfQ09ORkxJQ1Q9IHJlZ2lzdHJ5LmdldFJHQihDT05GTElDVElOR19DT0xPUik7Ci0JCWlmIChTRUxFQ1RFRF9DT05GTElDVCA9PSBudWxsKQotCQkJU0VMRUNURURfQ09ORkxJQ1Q9IG5ldyBSR0IoMjU1LCAwLCAwKTsJLy8gUkVECi0JCUNPTkZMSUNUPSBpbnRlcnBvbGF0ZShTRUxFQ1RFRF9DT05GTElDVCwgYmcsIDAuNik7Ci0JCUNPTkZMSUNUX0ZJTEw9IGludGVycG9sYXRlKFNFTEVDVEVEX0NPTkZMSUNULCBiZywgMC45Nyk7Ci0JCi0JCVJFU09MVkVEPSByZWdpc3RyeS5nZXRSR0IoUkVTT0xWRURfQ09MT1IpOwotCQlpZiAoUkVTT0xWRUQgPT0gbnVsbCkKLQkJCVJFU09MVkVEPSBuZXcgUkdCKDAsIDI1NSwgMCk7CS8vIEdSRUVOCi0JCQkJCi0JCXJlZnJlc2hCaXJkc0V5ZVZpZXcoKTsKLQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCQotCQl1cGRhdGVBbGxEaWZmQmFja2dyb3VuZHMoZGlzcGxheSk7Ci0JfQotCQotCS8qKgotCSAqIEludmFsaWRhdGVzIHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiBieSBpbnZhbGlkYXRpbmcgdGhlIHRocmVlIHRleHQgdmlld2Vycy4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKSB7Ci0JCWlmIChmQW5jZXN0b3IgIT0gbnVsbCkKLQkJCWZBbmNlc3Rvci5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCQlpZiAoZkxlZnQgIT0gbnVsbCkKLQkJCWZMZWZ0LmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCWlmIChmUmlnaHQgIT0gbnVsbCkKLQkJCWZSaWdodC5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBwYXNzZWQgdGV4dCB2aWV3ZXIuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSB0aHJlZSB0ZXh0IHZpZXdlcnMgaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIHRoZQotCSAqIGNvbnRlbnQgYXJlYXMuCi0JICogVGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRvIHByb3ZpZGUgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgdGV4dCB2aWV3ZXIuCi0JICoKLQkgKiBAcGFyYW0gdGV4dFZpZXdlciB0aGUgdGV4dCB2aWV3ZXIgdG8gY29uZmlndXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVGV4dFZpZXdlcihUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJLy8gZW1wdHkgaW1wbAotCX0KLQkJCQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIDxjb2RlPklUb2tlbkNvbXBhcmF0b3I8L2NvZGU+IHdoaWNoIGlzIHVzZWQgdG8gc2hvdyB0aGUKLQkgKiBpbnRyYSBsaW5lIGRpZmZlcmVuY2VzLgotCSAqIFRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgYSAKLQkgKiB0b2tlbml6ZXIgdGhhdCBicmVha3MgYSBsaW5lIGludG8gd29yZHMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCi0JICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdG8gcHJvdmlkZSBhIHNwZWNpZmljIHRva2VuaXplci4KLQkgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBmb3Igd2hpY2ggdG8gY3JlYXRlIHRoZSA8Y29kZT5JVG9rZW5Db21wYXJhdG9yPC9jb2RlPgotCSAqIEByZXR1cm4gYSBJVG9rZW5Db21wYXJhdG9yIHdoaWNoIGlzIHVzZWQgZm9yIGEgc2Vjb25kIGxldmVsIHRva2VuIGNvbXBhcmUuCi0JICovCi0JcHJvdGVjdGVkIElUb2tlbkNvbXBhcmF0b3IgY3JlYXRlVG9rZW5Db21wYXJhdG9yKFN0cmluZyBsaW5lKSB7Ci0JCXJldHVybiBuZXcgVG9rZW5Db21wYXJhdG9yKGxpbmUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgZG9jdW1lbnQgcGFydGl0aW9uZXIgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgdHlwZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgaW5wdXQgcHJvdmlkZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgaXMgYQotCSAqIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+IGFuZCBhbiBpbnRlcm5hbCBkb2N1bWVudCBtdXN0IGJlIGNyZWF0ZWQuIFRoaXMKLQkgKiBkb2N1bWVudCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBwYXJ0aXRpb25lciByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgCi0JICogPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRvIGNyZWF0ZSBhIHBhcnRpdGlvbmVyIGZvciBhIAotCSAqIHNwZWNpZmljIGNvbnRlbnQgdHlwZS4KLQkgKgotCSAqIEByZXR1cm4gYSBkb2N1bWVudCBwYXJ0aXRpb25lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBvbiB0aGUgdmlld2VyIGRpc3Bvc2FsLgotCSAqIFVucmVnaXN0ZXJzIGZyb20gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbi4KLQkgKiBDbGllbnRzIG1heSBleHRlbmQgaWYgdGhleSBoYXZlIHRvIGRvIGFkZGl0aW9uYWwgY2xlYW51cC4KLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkKLQkJaWYgKGZLZXlCaW5kaW5nU2VydmljZSAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGE7Ci0JCQlpZiAoZk5leHRJdGVtICE9IG51bGwpIHsKLQkJCQlhPSBmTmV4dEl0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQkJZktleUJpbmRpbmdTZXJ2aWNlLnVucmVnaXN0ZXJBY3Rpb24oYSk7Ci0JCQl9Ci0JCQlpZiAoZlByZXZpb3VzSXRlbSAhPSBudWxsKSB7Ci0JCQkJYT0gZlByZXZpb3VzSXRlbS5nZXRBY3Rpb24oKTsKLQkJCQlpZiAoYSAhPSBudWxsKQotCQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhKTsKLQkJCX0KLQkJCWlmIChmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW0gIT0gbnVsbCkgewotCQkJCWE9IGZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbS5nZXRBY3Rpb24oKTsKLQkJCQlpZiAoYSAhPSBudWxsKQotCQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhKTsKLQkJCX0KLQkJCWlmIChmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0gIT0gbnVsbCkgewotCQkJCWE9IGZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbS5nZXRBY3Rpb24oKTsKLQkJCQlpZiAoYSAhPSBudWxsKQotCQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhKTsKLQkJCX0KLQkJCWZLZXlCaW5kaW5nU2VydmljZT0gbnVsbDsKLQkJfQotCQkKLQkJT2JqZWN0IGlucHV0PSBnZXRJbnB1dCgpOwotCQlEb2N1bWVudE1hbmFnZXIucmVtb3ZlKGdldERvY3VtZW50MignQScsIGlucHV0KSk7Ci0JCURvY3VtZW50TWFuYWdlci5yZW1vdmUoZ2V0RG9jdW1lbnQyKCdMJywgaW5wdXQpKTsKLQkJRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZShnZXREb2N1bWVudDIoJ1InLCBpbnB1dCkpOwotCQkKLQkJaWYgKERFQlVHKQotCQkJRG9jdW1lbnRNYW5hZ2VyLmR1bXAoKTsKLQotCQlpZiAoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcihmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJCUpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcihmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQkJZlByZWZlcmVuY2VTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcj0gbnVsbDsKLQkJfQotCQkKLQkJZkxlZnRDYW52YXM9IG51bGw7Ci0JCWZSaWdodENhbnZhcz0gbnVsbDsKLQkJZlZTY3JvbGxCYXI9IG51bGw7Ci0JCWZCaXJkc0V5ZUNhbnZhcz0gbnVsbDsKLQkJZlN1bW1hcnlIZWFkZXI9IG51bGw7Ci0KLQkJdW5zZXREb2N1bWVudChmQW5jZXN0b3IpOwotCQl1bnNldERvY3VtZW50KGZMZWZ0KTsKLQkJdW5zZXREb2N1bWVudChmUmlnaHQpOwotCQkKLQkJaWYgKGZDb2xvcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaT0gZkNvbG9ycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ29sb3IgY29sb3I9IChDb2xvcikgaS5uZXh0KCk7Ci0JCQkJaWYgKCFjb2xvci5pc0Rpc3Bvc2VkKCkpCi0JCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZDb2xvcnM9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChmQmlyZHNFeWVDdXJzb3IgIT0gbnVsbCkgewotCQkJZkJpcmRzRXllQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCWZCaXJkc0V5ZUN1cnNvcj0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuaGFuZGxlRGlzcG9zZShldmVudCk7Ci0gIAl9Ci0gIAkgIAkgIAkJCQkgCQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLSBpbnRlcm5hbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKgotCSAqIENyZWF0ZXMgdGhlIHNwZWNpZmljIFNXVCBjb250cm9scyBmb3IgdGhlIGNvbnRlbnQgYXJlYXMuCi0JICogQ2xpZW50cyBtdXN0IG5vdCBjYWxsIG9yIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIElDb21wYXJlQ29udGV4dElkcy5URVhUX01FUkdFX1ZJRVcpOwotCQkKLQkJLy8gMXN0IHJvdwotCQlpZiAoZk1hcmdpbldpZHRoID4gMCkgewotCQkJZkFuY2VzdG9yQ2FudmFzPSBuZXcgQnVmZmVyZWRDYW52YXMoY29tcG9zaXRlLCBTV1QuTk9ORSkgewotCQkJCXB1YmxpYyB2b2lkIGRvUGFpbnQoR0MgZ2MpIHsKLQkJCQkJcGFpbnRTaWRlcyhnYywgZkFuY2VzdG9yLCBmQW5jZXN0b3JDYW52YXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9OwotCQkJZkFuY2VzdG9yQ2FudmFzLmFkZE1vdXNlTGlzdGVuZXIoCi0JCQkJbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCQkJc2V0Q3VycmVudERpZmYyKGhhbmRsZU1vdXNlSW5TaWRlcyhmQW5jZXN0b3JDYW52YXMsIGZBbmNlc3RvciwgZS55KSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCQkJCQkJCQkJCi0JCWZBbmNlc3Rvcj0gY3JlYXRlUGFydChjb21wb3NpdGUpOwotCQlmQW5jZXN0b3Iuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkKLQkJZlN1bW1hcnlIZWFkZXI9IG5ldyBDYW52YXMoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZIZWFkZXJQYWludGVyPSBuZXcgSGVhZGVyUGFpbnRlcigpOwotCQlmU3VtbWFyeUhlYWRlci5hZGRQYWludExpc3RlbmVyKGZIZWFkZXJQYWludGVyKTsKLQkJdXBkYXRlUmVzb2x2ZVN0YXR1cygpOwotCQkJCQotCQkvLyAybmQgcm93Ci0JCWlmIChmTWFyZ2luV2lkdGggPiAwKSB7Ci0JCQlmTGVmdENhbnZhcz0gbmV3IEJ1ZmZlcmVkQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PTkUpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb1BhaW50KEdDIGdjKSB7Ci0JCQkJCXBhaW50U2lkZXMoZ2MsIGZMZWZ0LCBmTGVmdENhbnZhcywgZmFsc2UpOwotCQkJCX0KLQkJCX07Ci0JCQlmTGVmdENhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKAotCQkJCW5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJCXNldEN1cnJlbnREaWZmMihoYW5kbGVNb3VzZUluU2lkZXMoZkxlZnRDYW52YXMsIGZMZWZ0LCBlLnkpLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlmTGVmdD0gY3JlYXRlUGFydChjb21wb3NpdGUpOwotCQlmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuZ2V0VmVydGljYWxCYXIoKS5zZXRWaXNpYmxlKCFmU3luY2hyb25pemVkU2Nyb2xsaW5nKTsKLQkJZkxlZnQuYWRkQWN0aW9uKE1lcmdlU291cmNlVmlld2VyLlNBVkVfSUQsIGZMZWZ0U2F2ZUFjdGlvbik7Ci0JCQkKLQkJZlJpZ2h0PSBjcmVhdGVQYXJ0KGNvbXBvc2l0ZSk7Ci0JCWZSaWdodC5nZXRUZXh0V2lkZ2V0KCkuZ2V0VmVydGljYWxCYXIoKS5zZXRWaXNpYmxlKCFmU3luY2hyb25pemVkU2Nyb2xsaW5nKTsKLQkJZlJpZ2h0LmFkZEFjdGlvbihNZXJnZVNvdXJjZVZpZXdlci5TQVZFX0lELCBmUmlnaHRTYXZlQWN0aW9uKTsKLQkJCi0JCWhzeW5jaFZpZXdwb3J0KGZBbmNlc3RvciwgZkxlZnQsIGZSaWdodCk7Ci0JCWhzeW5jaFZpZXdwb3J0KGZMZWZ0LCBmQW5jZXN0b3IsIGZSaWdodCk7Ci0JCWhzeW5jaFZpZXdwb3J0KGZSaWdodCwgZkFuY2VzdG9yLCBmTGVmdCk7Ci0KLQkJaWYgKGZNYXJnaW5XaWR0aCA+IDApIHsKLQkJCWZSaWdodENhbnZhcz0gbmV3IEJ1ZmZlcmVkQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PTkUpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb1BhaW50KEdDIGdjKSB7Ci0JCQkJCXBhaW50U2lkZXMoZ2MsIGZSaWdodCwgZlJpZ2h0Q2FudmFzLCBmU3luY2hyb25pemVkU2Nyb2xsaW5nKTsKLQkJCQl9Ci0JCQl9OwotCQkJZlJpZ2h0Q2FudmFzLmFkZE1vdXNlTGlzdGVuZXIoCi0JCQkJbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCQkJc2V0Q3VycmVudERpZmYyKGhhbmRsZU1vdXNlSW5TaWRlcyhmUmlnaHRDYW52YXMsIGZSaWdodCwgZS55KSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCQkKLQkJZlNjcm9sbENhbnZhcz0gbmV3IENhbnZhcyhjb21wb3NpdGUsIFNXVC5WX1NDUk9MTCk7Ci0JCVJlY3RhbmdsZSB0cmltPSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCWZUb3BJbnNldD0gdHJpbS55OwotCQkKLQkJZlZTY3JvbGxCYXI9IGZTY3JvbGxDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJZlZTY3JvbGxCYXIuc2V0SW5jcmVtZW50KDEpOwotCQlmVlNjcm9sbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCQlmVlNjcm9sbEJhci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLAotCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW50IHZwb3M9ICgoU2Nyb2xsQmFyKWUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJc2Nyb2xsVmVydGljYWwodnBvcywgdnBvcywgdnBvcywgbnVsbCk7Ci0JCQkJCXdvcmthcm91bmQ2NTIwNSgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JCWZCaXJkc0V5ZUNhbnZhcz0gbmV3IEJ1ZmZlcmVkQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PTkUpIHsKLQkJCXB1YmxpYyB2b2lkIGRvUGFpbnQoR0MgZ2MpIHsKLQkJCQlwYWludEJpcmRzRXllVmlldyh0aGlzLCBnYyk7Ci0JCQl9Ci0JCX07Ci0JCWZCaXJkc0V5ZUNhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKAotCQkJbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJCXNldEN1cnJlbnREaWZmMihoYW5kbGVtb3VzZUluQmlyZHNFeWVWaWV3KGZCaXJkc0V5ZUNhbnZhcywgZS55KSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmQmlyZHNFeWVDYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIoCi0JCQluZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQkJCi0JCQkJcHJpdmF0ZSBDdXJzb3IgZkxhc3RDdXJzb3I7Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJCQlDdXJzb3IgY3Vyc29yPSBudWxsOwotCQkJCQlEaWZmIGRpZmY9IGhhbmRsZW1vdXNlSW5CaXJkc0V5ZVZpZXcoZkJpcmRzRXllQ2FudmFzLCBlLnkpOwotCQkJCQlpZiAoZGlmZiAhPSBudWxsICYmIGRpZmYuZkRpcmVjdGlvbiAhPSBSYW5nZURpZmZlcmVuY2UuTk9DSEFOR0UpCi0JCQkJCQljdXJzb3I9IGZCaXJkc0V5ZUN1cnNvcjsKLQkJCQkJaWYgKGZMYXN0Q3Vyc29yICE9IGN1cnNvcikgewotCQkJCQkJZkJpcmRzRXllQ2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJCQkJZkxhc3RDdXJzb3I9IGN1cnNvcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhzeW5jaFZpZXdwb3J0KGZpbmFsIFRleHRWaWV3ZXIgdHYxLCBmaW5hbCBUZXh0Vmlld2VyIHR2MiwgZmluYWwgVGV4dFZpZXdlciB0djMpIHsKLQkJZmluYWwgU3R5bGVkVGV4dCBzdDE9IHR2MS5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWZpbmFsIFN0eWxlZFRleHQgc3QyPSB0djIuZ2V0VGV4dFdpZGdldCgpOwotCQlmaW5hbCBTdHlsZWRUZXh0IHN0Mz0gdHYzLmdldFRleHRXaWRnZXQoKTsKLQkJZmluYWwgU2Nyb2xsQmFyIHNiMT0gc3QxLmdldEhvcml6b250YWxCYXIoKTsKLQkJc2IxLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJICAgIGlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nKSB7Ci0JCQkJCWludCBtYXg9IHNiMS5nZXRNYXhpbXVtKCktc2IxLmdldFRodW1iKCk7Ci0JCQkJCWRvdWJsZSB2PSAwLjA7Ci0JCQkJCWlmIChtYXggPiAwKQotCQkJCQkJdj0gKGZsb2F0KXNiMS5nZXRTZWxlY3Rpb24oKSAvIChmbG9hdCltYXg7Ci0JCQkJCWlmIChzdDIuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCVNjcm9sbEJhciBzYjI9IHN0Mi5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCQkJCQlzdDIuc2V0SG9yaXpvbnRhbFBpeGVsKChpbnQpKChzYjIuZ2V0TWF4aW11bSgpLXNiMi5nZXRUaHVtYigpKSAqIHYpKTsKLQkJCQkJfQotCQkJCQlpZiAoc3QzLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlTY3JvbGxCYXIgc2IzPSBzdDMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQkJCQkJc3QzLnNldEhvcml6b250YWxQaXhlbCgoaW50KSgoc2IzLmdldE1heGltdW0oKS1zYjMuZ2V0VGh1bWIoKSkgKiB2KSk7Ci0JCQkJCX0KLQkJCQkJd29ya2Fyb3VuZDY1MjA1KCk7Ci0JCQkgICAgfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBIHdvcmthcm91bmQgZm9yIGJ1ZyAjNjUyMDUuCi0JICogT24gTWFjT1MgWCBhIERpc3BsYXkudXBkYXRlKCkgaXMgcmVxdWlyZWQgdG8gZmx1c2ggcGVuZGluZyBwYWludCByZXF1ZXN0cyBhZnRlcgotCSAqIHByb2dyYW1tYXRpY2FsIHNjb2xsaW5nLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgd29ya2Fyb3VuZDY1MjA1KCkgewotCQlpZiAoZklzQ2FyYm9uICYmIGZDb21wb3NpdGUgIT0gbnVsbCAmJiAhZkNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29tcG9zaXRlLmdldERpc3BsYXkoKS51cGRhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudERpZmYyKERpZmYgZGlmZiwgYm9vbGVhbiByZXZlYWwpIHsKLQkJaWYgKGRpZmYgIT0gbnVsbCAmJiBkaWZmLmZEaXJlY3Rpb24gIT0gUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFKSB7Ci0JCQkvL2ZDdXJyZW50RGlmZj0gbnVsbDsKLQkJCXNldEN1cnJlbnREaWZmKGRpZmYsIHJldmVhbCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEaWZmIGhhbmRsZU1vdXNlSW5TaWRlcyhDYW52YXMgY2FudmFzLCBNZXJnZVNvdXJjZVZpZXdlciB0cCwgaW50IG15KSB7Ci0KLQkJaW50IGxpbmVIZWlnaHQ9IHRwLmdldFRleHRXaWRnZXQoKS5nZXRMaW5lSGVpZ2h0KCk7Ci0JCWludCB2aXNpYmxlSGVpZ2h0PSB0cC5nZXRWaWV3cG9ydEhlaWdodCgpOwotCi0JCWlmICghIGZIaWdobGlnaHRSYW5nZXMpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCWludCBzaGlmdD0gdHAuZ2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKSArICgyLUxXKTsKLQotCQkJUG9pbnQgcmVnaW9uPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQlJdGVyYXRvciBlPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWlmIChkaWZmLmlzRGVsZXRlZCgpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChmU2hvd0N1cnJlbnRPbmx5MiAmJiAhaXNDdXJyZW50RGlmZihkaWZmKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQl0cC5nZXRMaW5lUmFuZ2UoZGlmZi5nZXRQb3NpdGlvbih0cCksIHJlZ2lvbik7Ci0JCQkJaW50IHk9IChyZWdpb24ueCAqIGxpbmVIZWlnaHQpICsgc2hpZnQ7Ci0JCQkJaW50IGg9IHJlZ2lvbi55ICogbGluZUhlaWdodDsKLQotCQkJCWlmICh5K2ggPCAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoeSA+PSB2aXNpYmxlSGVpZ2h0KQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJaWYgKG15ID49IHkgJiYgbXkgPCB5K2gpCi0JCQkJCXJldHVybiBkaWZmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIERpZmYgZ2V0RGlmZlVuZGVyTW91c2UoQ2FudmFzIGNhbnZhcywgaW50IG14LCBpbnQgbXksIFJlY3RhbmdsZSByKSB7Ci0KLQkJaWYgKCEgZlN5bmNocm9uaXplZFNjcm9sbGluZykKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBsaW5lSGVpZ2h0PSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuZ2V0TGluZUhlaWdodCgpOwotCQlpbnQgdmlzaWJsZUhlaWdodD0gZlJpZ2h0LmdldFZpZXdwb3J0SGVpZ2h0KCk7Ci0KLQkJUG9pbnQgc2l6ZT0gY2FudmFzLmdldFNpemUoKTsKLQkJaW50IHc9IHNpemUueDsKLQotCQlpZiAoISBmSGlnaGxpZ2h0UmFuZ2VzKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQlpbnQgbHNoaWZ0PSBmTGVmdC5nZXRWZXJ0aWNhbFNjcm9sbE9mZnNldCgpOwotCQkJaW50IHJzaGlmdD0gZlJpZ2h0LmdldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KCk7Ci0KLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCi0JCQlJdGVyYXRvciBlPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWlmIChkaWZmLmlzRGVsZXRlZCgpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChmU2hvd0N1cnJlbnRPbmx5MiAmJiAhaXNDdXJyZW50RGlmZihkaWZmKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlmTGVmdC5nZXRMaW5lUmFuZ2UoZGlmZi5mTGVmdFBvcywgcmVnaW9uKTsKLQkJCQlpbnQgbHk9IChyZWdpb24ueCAqIGxpbmVIZWlnaHQpICsgbHNoaWZ0OwotCQkJCWludCBsaD0gcmVnaW9uLnkgKiBsaW5lSGVpZ2h0OwotCi0JCQkJZlJpZ2h0LmdldExpbmVSYW5nZShkaWZmLmZSaWdodFBvcywgcmVnaW9uKTsKLQkJCQlpbnQgcnk9IChyZWdpb24ueCAqIGxpbmVIZWlnaHQpICsgcnNoaWZ0OwotCQkJCWludCByaD0gcmVnaW9uLnkgKiBsaW5lSGVpZ2h0OwotCi0JCQkJaWYgKE1hdGgubWF4KGx5K2xoLCByeStyaCkgPCAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoTWF0aC5taW4obHksIHJ5KSA+PSB2aXNpYmxlSGVpZ2h0KQotCQkJCQlicmVhazsKLQotCQkJCWludCBjeD0gKHctUkVTT0xWRV9TSVpFKS8yOwotCQkJCWludCBjeT0gKChseStsaC8yKSArIChyeStyaC8yKSAtIFJFU09MVkVfU0laRSkvMjsgCi0JCQkJaWYgKG15ID49IGN5ICYmIG15IDwgY3krUkVTT0xWRV9TSVpFICYmIG14ID49IGN4ICYmIG14IDwgY3grUkVTT0xWRV9TSVpFKSB7Ci0JCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJCWludCBTSVpFPSBmSXNDYXJib24gPyAzMCA6IDIwOwotCQkJCQkJci54PSBjeCsoUkVTT0xWRV9TSVpFLVNJWkUpLzI7Ci0JCQkJCQlyLnk9IGN5KyhSRVNPTFZFX1NJWkUtU0laRSkvMjsKLQkJCQkJCXIud2lkdGg9IFNJWkU7Ci0JCQkJCQlyLmhlaWdodD0gU0laRTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBEaWZmIGhhbmRsZW1vdXNlSW5CaXJkc0V5ZVZpZXcoQ2FudmFzIGNhbnZhcywgaW50IG15KSB7Ci0JCWludCB5eSwgaGg7Ci0JCQotCQlQb2ludCBzaXplPSBjYW52YXMuZ2V0U2l6ZSgpOwotCQkKLQkJaW50IHZpcnR1YWxIZWlnaHQ9IGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgPyBnZXRWaXJ0dWFsSGVpZ2h0KCkgOiBnZXRSaWdodEhlaWdodCgpOwkJCi0JCWlmICh2aXJ0dWFsSGVpZ2h0IDwgZ2V0Vmlld3BvcnRIZWlnaHQoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IHk9IDA7Ci0JCWlmIChmQWxsRGlmZnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkFsbERpZmZzLml0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBlLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJaW50IGg9IGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgPyBkaWZmLmdldE1heERpZmZIZWlnaHQoZlNob3dBbmNlc3RvcikKLQkJCQkJCQkJCQkJICA6IGRpZmYuZ2V0UmlnaHRIZWlnaHQoKTsKLQkJCQlpZiAodXNlQ2hhbmdlKGRpZmYuZkRpcmVjdGlvbikgJiYgIWRpZmYuZklzV2hpdGVzcGFjZSkgewotCQkJCQkJCQkJCi0JCQkJCXl5PSAoeSpzaXplLnkpL3ZpcnR1YWxIZWlnaHQ7Ci0JCQkJCWhoPSAoaCpzaXplLnkpL3ZpcnR1YWxIZWlnaHQ7Ci0JCQkJCWlmIChoaCA8IDMpCi0JCQkJCQloaD0gMzsKLQkJCQkJCQotCQkJCQlpZiAobXkgPj0geXkgJiYgbXkgPCB5eStoaCkKLQkJCQkJCXJldHVybiBkaWZmOwotCQkJCX0KLQkJCQl5Kz0gaDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhaW50QmlyZHNFeWVWaWV3KENhbnZhcyBjYW52YXMsIEdDIGdjKSB7Ci0JCQotCQlDb2xvciBjOwotCQlSZWN0YW5nbGUgcj0gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKTsKLQkJaW50IHl5LCBoaDsKLQkJCi0JCVBvaW50IHNpemU9IGNhbnZhcy5nZXRTaXplKCk7Ci0JCQotCQlpbnQgdmlydHVhbEhlaWdodD0gZlN5bmNocm9uaXplZFNjcm9sbGluZyA/IGdldFZpcnR1YWxIZWlnaHQoKSA6IGdldFJpZ2h0SGVpZ2h0KCk7CQkKLQkJaWYgKHZpcnR1YWxIZWlnaHQgPCBnZXRWaWV3cG9ydEhlaWdodCgpKQotCQkJcmV0dXJuOwotCQkJCQotCQlEaXNwbGF5IGRpc3BsYXk9IGNhbnZhcy5nZXREaXNwbGF5KCk7Ci0JCWludCB5PSAwOwotCQlpZiAoZkFsbERpZmZzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGU9IGZBbGxEaWZmcy5pdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaT0gMDsgZS5oYXNOZXh0KCk7IGkrKykgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWludCBoPSBmU3luY2hyb25pemVkU2Nyb2xsaW5nID8gZGlmZi5nZXRNYXhEaWZmSGVpZ2h0KGZTaG93QW5jZXN0b3IpCi0JCQkJCQkJCQkJCSAgOiBkaWZmLmdldFJpZ2h0SGVpZ2h0KCk7Ci0JCQkJCQkJCQotCQkJCWlmICh1c2VDaGFuZ2UoZGlmZi5mRGlyZWN0aW9uKSAmJiAhZGlmZi5mSXNXaGl0ZXNwYWNlKSB7Ci0JCQkJCQotCQkJCQl5eT0gKHkqc2l6ZS55KS92aXJ0dWFsSGVpZ2h0OwotCQkJCQloaD0gKGgqc2l6ZS55KS92aXJ0dWFsSGVpZ2h0OwotCQkJCQlpZiAoaGggPCAzKQotCQkJCQkJaGg9IDM7Ci0JCQkJCQotCQkJCQljPSBnZXRDb2xvcihkaXNwbGF5LCBnZXRGaWxsQ29sb3IoZGlmZikpOwotCQkJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGMpOwotCQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShCSVJEU19FWUVfVklFV19JTlNFVCwgeXksIHNpemUueC0oMipCSVJEU19FWUVfVklFV19JTlNFVCksaGgpOwotCQkJCQl9Ci0JCQkJCWM9IGdldENvbG9yKGRpc3BsYXksIGdldFN0cm9rZUNvbG9yKGRpZmYpKTsKLQkJCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChjKTsKLQkJCQkJCXIueD0gQklSRFNfRVlFX1ZJRVdfSU5TRVQ7Ci0JCQkJCQlyLnk9IHl5OwotCQkJCQkJci53aWR0aD0gc2l6ZS54LSgyKkJJUkRTX0VZRV9WSUVXX0lOU0VUKS0xOwotCQkJCQkJci5oZWlnaHQ9IGhoOwotCQkJCQkJaWYgKGRpZmYgPT0gZkN1cnJlbnREaWZmIHx8Ci0JCQkJCQkJCShmQ3VycmVudERpZmYgIT0gbnVsbCAmJiBkaWZmID09IGZDdXJyZW50RGlmZi5mUGFyZW50KSkgewotCQkJCQkJCWdjLnNldExpbmVXaWR0aCgyKTsKLQkJCQkJCQlyLngrKzsKLQkJCQkJCQlyLnkrKzsKLQkJCQkJCQlyLndpZHRoLS07Ci0JCQkJCQkJci5oZWlnaHQtLTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZ2Muc2V0TGluZVdpZHRoKDEpOwotCQkJCQkJfQotCQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl5Kz0gaDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaEJpcmRzRXllVmlldygpIHsKLQkJaWYgKGZCaXJkc0V5ZUNhbnZhcyAhPSBudWxsKQotCQkJZkJpcmRzRXllQ2FudmFzLnJlZHJhdygpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuZXZlciBzZXRGb2N1cygpIGlzIGNhbGxlZCBvbiB0aGUgQ29udGVudFZpZXdlcidzIHRvcCBsZXZlbCBTV1QgQ29tcG9zaXRlLgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGVuYWJsZWQgdGV4dCB3aWRnZXQuCi0JICovCi0JLyogcGFja2FnZSAqLyBib29sZWFuIGludGVybmFsU2V0Rm9jdXMoKSB7Ci0JCWlmIChmRm9jdXNQYXJ0ID09IG51bGwpIHsKLQkJCWlmIChmTGVmdCAhPSBudWxsICYmIGZMZWZ0LmdldEVuYWJsZWQoKSkgewotCQkJCWZGb2N1c1BhcnQ9IGZMZWZ0OwotCQkJfSBlbHNlIGlmIChmUmlnaHQgIT0gbnVsbCAmJiBmUmlnaHQuZ2V0RW5hYmxlZCgpKSB7Ci0JCQkJZkZvY3VzUGFydD0gZlJpZ2h0OwotCQkJfSBlbHNlIGlmIChmQW5jZXN0b3IgIT0gbnVsbCAmJiBmQW5jZXN0b3IuZ2V0RW5hYmxlZCgpKSB7Ci0JCQkJZkZvY3VzUGFydD0gZkFuY2VzdG9yOwotCQkJfQotCQl9Ci0JCWlmIChmRm9jdXNQYXJ0ICE9IG51bGwpIHsKLQkJCVN0eWxlZFRleHQgc3Q9IGZGb2N1c1BhcnQuZ2V0VGV4dFdpZGdldCgpOwotCQkJaWYgKHN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0LnNldEZvY3VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkvLyBjb3VsZCBub3Qgc2V0IGZvY3VzCi0JfQotCQotCQotCWNsYXNzIEhvdmVyUmVzaXplciBleHRlbmRzIFJlc2l6ZXIgewotCQlDYW52YXMgZkNhbnZhczsKLQkJcHVibGljIEhvdmVyUmVzaXplcihDYW52YXMgYywgaW50IGRpcikgewotCQkJc3VwZXIoYywgZGlyKTsKLQkJCWZDYW52YXM9IGM7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKCFmSXNEb3duICYmIGZVc2VTaW5nbGVMaW5lICYmIHNob3dSZXNvbHZlVUkoKSAmJiBoYW5kbGVNb3VzZU1vdmVPdmVyQ2VudGVyKGZDYW52YXMsIGUueCwgZS55KSkKLQkJCQlyZXR1cm47Ci0JCQlzdXBlci5tb3VzZU1vdmUoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDcmVhdGVzIHRoZSBjZW50cmFsIENhbnZhcy4KLQkgKiBDYWxsZWQgZnJvbSBDb250ZW50TWVyZ2VWaWV3ZXIuCi0JICovCi0JLyogcGFja2FnZSAqLyBDb250cm9sIGNyZWF0ZUNlbnRlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nKSB7Ci0JCQlmaW5hbCBDYW52YXMgY2FudmFzPSBuZXcgQnVmZmVyZWRDYW52YXMocGFyZW50LCBTV1QuTk9ORSkgewotCQkJCXB1YmxpYyB2b2lkIGRvUGFpbnQoR0MgZ2MpIHsKLQkJCQkJcGFpbnRDZW50ZXIodGhpcywgZ2MpOwotCQkJCX0KLQkJCX07Ci0JCQlpZiAoZlVzZVJlc29sdmVVSSkgewotCQkJCQotCQkJCW5ldyBIb3ZlclJlc2l6ZXIoY2FudmFzLCBIT1JJWk9OVEFMKTsKLQkJCQkJCQkJCi0JCQkJZkNlbnRlckJ1dHRvbj0gbmV3IEJ1dHRvbihjYW52YXMsIGZJc0NhcmJvbiA/IFNXVC5GTEFUIDogU1dULlBVU0gpOwotCQkJCWlmIChmTm9ybWFsQ3Vyc29yID09IG51bGwpIGZOb3JtYWxDdXJzb3I9IG5ldyBDdXJzb3IoY2FudmFzLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9BUlJPVyk7Ci0JCQkJZkNlbnRlckJ1dHRvbi5zZXRDdXJzb3IoZk5vcm1hbEN1cnNvcik7Ci0JCQkJZkNlbnRlckJ1dHRvbi5zZXRUZXh0KCI8Iik7CSAvLyROT04tTkxTLTEkCi0JCQkJZkNlbnRlckJ1dHRvbi5wYWNrKCk7Ci0JCQkJZkNlbnRlckJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlmQ2VudGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlmQ2VudGVyQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJCWlmIChmQnV0dG9uRGlmZiAhPSBudWxsKSB7Ci0JCQkJCQkJCXNldEN1cnJlbnREaWZmKGZCdXR0b25EaWZmLCBmYWxzZSk7Ci0JCQkJCQkJCWNvcHkoZkN1cnJlbnREaWZmLCBmYWxzZSwgZkN1cnJlbnREaWZmLmZEaXJlY3Rpb24gPT0gUmFuZ2VEaWZmZXJlbmNlLkNPTkZMSUNUKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3IFJlc2l6ZXIoY2FudmFzLCBIT1JJWk9OVEFMKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNhbnZhczsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ2VudGVyKHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVNb3VzZU1vdmVPdmVyQ2VudGVyKENhbnZhcyBjYW52YXMsIGludCB4LCBpbnQgeSkgewotCQlSZWN0YW5nbGUgcj0gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKTsKLQkJRGlmZiBkaWZmPSBnZXREaWZmVW5kZXJNb3VzZShjYW52YXMsIHgsIHksIHIpOwotCQlpZiAoZGlmZiAhPSBudWxsICYmICFkaWZmLmlzVW5yZXNvbHZlZEluY29taW5nT3JDb25mbGljdGluZygpKQotCQkJZGlmZj0gbnVsbDsKLQkJaWYgKGRpZmYgIT0gZkJ1dHRvbkRpZmYpIHsKLQkJCWlmIChkaWZmICE9IG51bGwpIHsKLQkJCQlpZiAoZkxlZnQuaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCWZCdXR0b25EaWZmPSBkaWZmOwotCQkJCQlmQ2VudGVyQnV0dG9uLnNldFRleHQoIjwiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHR0PSBmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0uZ2V0QWN0aW9uKCkuZ2V0VG9vbFRpcFRleHQoKTsKLQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRUb29sVGlwVGV4dCh0dCk7Ci0JCQkJCWZDZW50ZXJCdXR0b24uc2V0Qm91bmRzKHIpOwotCQkJCQlmQ2VudGVyQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfSBlbHNlIGlmIChmUmlnaHQuaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCWZCdXR0b25EaWZmPSBkaWZmOwotCQkJCQlmQ2VudGVyQnV0dG9uLnNldFRleHQoIj4iKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHR0PSBmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW0uZ2V0QWN0aW9uKCkuZ2V0VG9vbFRpcFRleHQoKTsKLQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRUb29sVGlwVGV4dCh0dCk7Ci0JCQkJCWZDZW50ZXJCdXR0b24uc2V0Qm91bmRzKHIpOwotCQkJCQlmQ2VudGVyQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7CQkJCQkJCQkJCQotCQkJCX0gZWxzZQotCQkJCQlmQnV0dG9uRGlmZj0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJZkNlbnRlckJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlmQnV0dG9uRGlmZj0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkJ1dHRvbkRpZmYgIT0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHdpZHRoIG9mIGNlbnRyYWwgY2FudmFzLgotCSAqIE92ZXJyaWRkZW4gZnJvbSBDb250ZW50TWVyZ2VWaWV3ZXIuCi0JICovCi0JLyogcGFja2FnZSAqLyBpbnQgZ2V0Q2VudGVyV2lkdGgoKSB7Ci0JCWlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nKQotCQkJcmV0dXJuIENFTlRFUl9XSURUSDsKLQkJcmV0dXJuIHN1cGVyLmdldENlbnRlcldpZHRoKCk7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHRleHQgcGFydC4KLQkgKi8KLQlwcml2YXRlIE1lcmdlU291cmNlVmlld2VyIGNyZWF0ZVBhcnQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJZmluYWwgTWVyZ2VTb3VyY2VWaWV3ZXIgcGFydD0gbmV3IE1lcmdlU291cmNlVmlld2VyKHBhcmVudCwgZ2V0UmVzb3VyY2VCdW5kbGUoKSk7Ci0JCWZpbmFsIFN0eWxlZFRleHQgdGU9IHBhcnQuZ2V0VGV4dFdpZGdldCgpOwotCQkKLQkJaWYgKCFmQ29uZmlybVNhdmUpCi0JCQlwYXJ0LmhpZGVTYXZlQWN0aW9uKCk7Ci0JCQotCQl0ZS5hZGRQYWludExpc3RlbmVyKAotCQkJbmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCQlwYWludChlLCBwYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCSk7CQkKLQkJdGUuYWRkS2V5TGlzdGVuZXIoCi0JCQluZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChwYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCXRlLmFkZE1vdXNlTGlzdGVuZXIoCi0JCQluZXcgTW91c2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJLy9zeW5jVmlld3BvcnQocGFydCk7Ci0JCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQocGFydCk7Ci0JCQkJfQotCQkJfQotCQkpOwkJCi0JCQkJCQotCQl0ZS5hZGRGb2N1c0xpc3RlbmVyKAotCQkJbmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGZlKSB7Ci0JCQkJCWZGb2N1c1BhcnQ9IHBhcnQ7Ci0JCQkJCWNvbm5lY3RHbG9iYWxBY3Rpb25zKGZGb2N1c1BhcnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBmZSkgewotCQkJCQljb25uZWN0R2xvYmFsQWN0aW9ucyhudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlwYXJ0LmFkZFZpZXdwb3J0TGlzdGVuZXIoCi0JCQluZXcgSVZpZXdwb3J0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgdmlld3BvcnRDaGFuZ2VkKGludCB2ZXJ0aWNhbFBvc2l0aW9uKSB7Ci0JCQkJCXN5bmNWaWV3cG9ydChwYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlGb250IGZvbnQ9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoZlN5bWJvbGljRm9udE5hbWUpOwotCQlpZiAoZm9udCAhPSBudWxsKQotCQkJdGUuc2V0Rm9udChmb250KTsKLQkJCi0JCWlmIChmQmFja2dyb3VuZCAhPSBudWxsKQkvLyBub3QgZGVmYXVsdAotCQkJdGUuc2V0QmFja2dyb3VuZChnZXRDb2xvcihwYXJlbnQuZ2V0RGlzcGxheSgpLCBmQmFja2dyb3VuZCkpOwkJCQotCQkKLQkJY29uZmlndXJlVGV4dFZpZXdlcihwYXJ0KTsKLQkJCi0JCXJldHVybiBwYXJ0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29ubmVjdEdsb2JhbEFjdGlvbnMoTWVyZ2VTb3VyY2VWaWV3ZXIgcGFydCkgewotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzPSBVdGlsaXRpZXMuZmluZEFjdGlvbkJhcnMoZkNvbXBvc2l0ZSk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBHTE9CQUxfQUNUSU9OUy5sZW5ndGg7IGkrKykgewotCQkJCUlBY3Rpb24gYWN0aW9uPSBudWxsOyAKLQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCWFjdGlvbj0gcGFydC5nZXRBY3Rpb24oVEVYVF9BQ1RJT05TW2ldKTsKLQkJCQkJaWYgKGFjdGlvbiA9PSBudWxsICYmIFRFWFRfQUNUSU9OU1tpXS5lcXVhbHMoTWVyZ2VTb3VyY2VWaWV3ZXIuU0FWRV9JRCkpIHsJCQkKLQkJCQkJCWlmIChwYXJ0ID09IGZMZWZ0KQotCQkJCQkJCWFjdGlvbj0gZkxlZnRTYXZlQWN0aW9uOwotCQkJCQkJZWxzZQotCQkJCQkJCWFjdGlvbj0gZlJpZ2h0U2F2ZUFjdGlvbjsKLQkJCQkJfQotCQkJCX0KLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoR0xPQkFMX0FDVElPTlNbaV0sIGFjdGlvbik7Ci0JCQl9Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLQkKLQlJVHlwZWRFbGVtZW50IGdldExlZyhjaGFyIHR5cGUsIE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgJ0EnOgotCQkJCXJldHVybiAoKElDb21wYXJlSW5wdXQpaW5wdXQpLmdldEFuY2VzdG9yKCk7Ci0JCQljYXNlICdMJzoKLQkJCQlyZXR1cm4gKChJQ29tcGFyZUlucHV0KWlucHV0KS5nZXRMZWZ0KCk7Ci0JCQljYXNlICdSJzoKLQkJCQlyZXR1cm4gKChJQ29tcGFyZUlucHV0KWlucHV0KS5nZXRSaWdodCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudChjaGFyIHR5cGUsIE9iamVjdCBpbnB1dCkgewotCQlJVHlwZWRFbGVtZW50IHRlPSBnZXRMZWcodHlwZSwgaW5wdXQpOwotCQlpZiAodGUgaW5zdGFuY2VvZiBJRG9jdW1lbnQpCi0JCQlyZXR1cm4gKElEb2N1bWVudCkgdGU7Ci0JCWlmICh0ZSBpbnN0YW5jZW9mIElEb2N1bWVudFJhbmdlKQotCQkJcmV0dXJuICgoSURvY3VtZW50UmFuZ2UpIHRlKS5nZXREb2N1bWVudCgpOwotCQlpZiAodGUgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKQotCQkJcmV0dXJuIERvY3VtZW50TWFuYWdlci5nZXQodGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JSURvY3VtZW50IGdldERvY3VtZW50MihjaGFyIHR5cGUsIE9iamVjdCBpbnB1dCkgewotCQlJRG9jdW1lbnQgZG9jPSBnZXREb2N1bWVudCh0eXBlLCBpbnB1dCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkKLQkJCXJldHVybiBkb2M7Ci0JCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSURpZmZFbGVtZW50KSB7Ci0JCQlJRGlmZkNvbnRhaW5lciBwYXJlbnQ9ICgoSURpZmZFbGVtZW50KWlucHV0KS5nZXRQYXJlbnQoKTsKLQkJCXJldHVybiBnZXREb2N1bWVudCh0eXBlLCBwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gaW5wdXRzIG1hcCB0byB0aGUgc2FtZSBkb2N1bWVudHMKLQkgKi8KLQlib29sZWFuIHNhbWVEb2MoY2hhciB0eXBlLCBPYmplY3QgbmV3SW5wdXQsIE9iamVjdCBvbGRJbnB1dCkgewotCQlJRG9jdW1lbnQgbmV3RG9jPSBnZXREb2N1bWVudDIodHlwZSwgbmV3SW5wdXQpOwotCQlJRG9jdW1lbnQgb2xkRG9jPSBnZXREb2N1bWVudDIodHlwZSwgb2xkSW5wdXQpOwotCQlyZXR1cm4gbmV3RG9jID09IG9sZERvYzsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBwcmV2ZW50IHNhdmUgY29uZmlybWF0aW9uIGlmIG5ldyBpbnB1dCBpcyBzdWIgZG9jdW1lbnQgb2YgY3VycmVudCBpbnB1dC4KLQkgKiBAcGFyYW0gbmV3SW5wdXQgdGhlIG5ldyBpbnB1dCBvZiB0aGlzIHZpZXdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gbmV3IGlucHV0Ci0JICogQHBhcmFtIG9sZElucHV0IHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2FzIHByZXZpb3VzbHkgbm8gaW5wdXQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNhdmluZyB3YXMgc3VjY2Vzc2Z1bCwgb3IgaWYgdGhlIHVzZXIgZGlkbid0IHdhbnQgdG8gc2F2ZSAoYnkgcHJlc3NpbmcgJ05PJyBpbiB0aGUgY29uZmlybWF0aW9uIGRpYWxvZykuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRvU2F2ZShPYmplY3QgbmV3SW5wdXQsIE9iamVjdCBvbGRJbnB1dCkgewotCQkKLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgd2hldGhlciB1bmRlcmx5aW5nIGRvY3VtZW50cyBoYXZlIGNoYW5nZWQuCi0JCQlpZiAoc2FtZURvYygnQScsIG5ld0lucHV0LCBvbGRJbnB1dCkgJiYKLQkJCQkJc2FtZURvYygnTCcsIG5ld0lucHV0LCBvbGRJbnB1dCkgJiYKLQkJCQkJCXNhbWVEb2MoJ1InLCBuZXdJbnB1dCwgb2xkSW5wdXQpKSB7Ci0JCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tIFNhbWUgZG9jcyAhISEhIik7CS8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiBOZXcgZG9jcyAhISEhIik7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCUlEb2N1bWVudCBhRG9jPSBnZXREb2N1bWVudDIoJ0EnLCBvbGRJbnB1dCk7Ci0JCURvY3VtZW50TWFuYWdlci5yZW1vdmUoYURvYyk7Ci0JCUlEb2N1bWVudCBsRG9jPSBnZXREb2N1bWVudDIoJ0wnLCBvbGRJbnB1dCk7Ci0JCURvY3VtZW50TWFuYWdlci5yZW1vdmUobERvYyk7Ci0JCUlEb2N1bWVudCByRG9jPSBnZXREb2N1bWVudDIoJ1InLCBvbGRJbnB1dCk7Ci0JCURvY3VtZW50TWFuYWdlci5yZW1vdmUockRvYyk7Ci0JCQotCQlpZiAoREVCVUcpCi0JCQlEb2N1bWVudE1hbmFnZXIuZHVtcCgpOwotCQkKLQkJcmV0dXJuIHN1cGVyLmRvU2F2ZShuZXdJbnB1dCwgb2xkSW5wdXQpOwotCX0KLQkKLQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZ2V0UGFyZW50KGNoYXIgdHlwZSkgewotCQlPYmplY3QgaW5wdXQ9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElEaWZmRWxlbWVudCkgewotCQkJSURpZmZDb250YWluZXIgcGFyZW50PSAoKElEaWZmRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50KCk7Ci0JCQlyZXR1cm4gZ2V0TGVnKHR5cGUsIHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKgotCSAqIEluaXRpYWxpemVzIHRoZSB0ZXh0IHZpZXdlcnMgb2YgdGhlIHRocmVlIGNvbnRlbnQgYXJlYXMgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0cy4KLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudChPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCi0JCWJvb2xlYW4gZW1wdHlJbnB1dD0gKGFuY2VzdG9yID09IG51bGwgJiYgbGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpOwotCi0JCU9iamVjdCBpbnB1dD0gZ2V0SW5wdXQoKTsKLQotCQlQb3NpdGlvbiBsZWZ0UmFuZ2U9IG51bGw7Ci0JCVBvc2l0aW9uIHJpZ2h0UmFuZ2U9IG51bGw7Ci0JCQotCQkvLyBpZiBvbmUgc2lkZSBpcyBlbXB0eSB1c2UgY29udGFpbmVyCi0JCWlmIChGSVhfNDc2NDAgJiYgIWVtcHR5SW5wdXQgJiYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSURpZmZFbGVtZW50KSB7Ci0JCQkJSURpZmZDb250YWluZXIgcGFyZW50PSAoKElEaWZmRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCQkgICAgSUNvbXBhcmVJbnB1dCBjaT0gKElDb21wYXJlSW5wdXQpIHBhcmVudDsKLQkJCQkgICAgCi0JCQkJICAgIGlmIChjaS5nZXRBbmNlc3RvcigpIGluc3RhbmNlb2YgSURvY3VtZW50UmFuZ2UKLQkJCQkgICAgICAgICAgICB8fCBjaS5nZXRMZWZ0KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZQotCQkJCSAgICAgICAgICAgIAkJfHwgY2kuZ2V0UmlnaHQoKSBpbnN0YW5jZW9mIElEb2N1bWVudFJhbmdlKSB7Ci0JCQkJICAgIAotCQkJCSAgICAgICAgCWlmIChsZWZ0IGluc3RhbmNlb2YgSURvY3VtZW50UmFuZ2UpCi0JCQkJICAgICAgICAJICAgIGxlZnRSYW5nZT0gKChJRG9jdW1lbnRSYW5nZSlsZWZ0KS5nZXRSYW5nZSgpOwotCQkJCSAgICAgICAgCWlmIChyaWdodCBpbnN0YW5jZW9mIElEb2N1bWVudFJhbmdlKQotCQkJCSAgICAgICAgCSAgICByaWdodFJhbmdlPSAoKElEb2N1bWVudFJhbmdlKXJpZ2h0KS5nZXRSYW5nZSgpOwotCQkJCQkgICAgCi0JCQkJCSAgICBhbmNlc3Rvcj0gY2kuZ2V0QW5jZXN0b3IoKTsKLQkJCQkJICAgIGxlZnQ9IGNpLmdldExlZnQoKTsKLQkJCQkJICAgIHJpZ2h0PSBjaS5nZXRSaWdodCgpOwotCQkJCSAgICB9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IG49IDA7Ci0JCWlmIChsZWZ0ICE9IG51bGwpCi0JCQluKys7Ci0JCWlmIChyaWdodCAhPSBudWxsKQotCQkJbisrOwotCQlmSGlnaGxpZ2h0UmFuZ2VzPSBuID4gMTsKLQkJCi0JCS8vIGNsZWFyIHN0dWZmCi0JCWZDdXJyZW50RGlmZj0gbnVsbDsKLQkgCWZDaGFuZ2VEaWZmcz0gbnVsbDsKLQkJZkFsbERpZmZzPSBudWxsOwotCQlmRW5kT2ZEb2NSZWFjaGVkPSBmYWxzZTsKLQkJZkhhc0Vycm9ycz0gZmFsc2U7IC8vIHN0YXJ0IHdpdGggbm8gZXJyb3JzCi0JCQotCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYz0gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNwPSBnZXRNZXJnZUNvbnRlbnRQcm92aWRlcigpOwotCQkKLQkJaWYgKGNwIGluc3RhbmNlb2YgTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIpIHsKLQkJCU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIG1jcD0gKE1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyKSBjcDsKLQkJCW1jcC5zZXRBbmNlc3RvckVycm9yKG51bGwpOwotCQkJbWNwLnNldExlZnRFcnJvcihudWxsKTsKLQkJCW1jcC5zZXRSaWdodEVycm9yKG51bGwpOwotCQl9Ci0JCQotCQkvLyBzZXQgbmV3IGRvY3VtZW50cwotCQlzZXREb2N1bWVudChmTGVmdCwgJ0wnLCBsZWZ0KTsKLQkJZkxlZnRMaW5lQ291bnQ9IGZMZWZ0LmdldExpbmVDb3VudCgpOwotCQlmTGVmdEVuY29kaW5nPSBnZXRFbmNvZGluZyhsZWZ0KTsKLQotCQlzZXREb2N1bWVudChmUmlnaHQsICdSJywgcmlnaHQpOwotCQlmUmlnaHRMaW5lQ291bnQ9IGZSaWdodC5nZXRMaW5lQ291bnQoKTsKLQkJZlJpZ2h0RW5jb2Rpbmc9IGdldEVuY29kaW5nKHJpZ2h0KTsKLQkJCi0JCXNldERvY3VtZW50KGZBbmNlc3RvciwgJ0EnLCBhbmNlc3Rvcik7Ci0JCQotCQl1cGRhdGVIZWFkZXIoKTsKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJdXBkYXRlVG9vbEl0ZW1zKCk7Ci0JCQotCQlpZiAoIWZIYXNFcnJvcnMpCi0JCQlkb0RpZmYoKTsKLQotCQlmUmlnaHQuc2V0RWRpdGFibGUoY2MuaXNSaWdodEVkaXRhYmxlKCkgJiYgY3AuaXNSaWdodEVkaXRhYmxlKGlucHV0KSk7Ci0JCWZMZWZ0LnNldEVkaXRhYmxlKGNjLmlzTGVmdEVkaXRhYmxlKCkgJiYgY3AuaXNMZWZ0RWRpdGFibGUoaW5wdXQpKTsKLQkJCi0JCWludmFsaWRhdGVMaW5lcygpOwotCQl1cGRhdGVWU2Nyb2xsQmFyKCk7Ci0JCXJlZnJlc2hCaXJkc0V5ZVZpZXcoKTsKLQkJCi0JCWlmICghZkhhc0Vycm9ycyAmJiAhZW1wdHlJbnB1dCAmJiAhZkNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCURpZmYgc2VsZWN0RGlmZj0gbnVsbDsKLQkJCWlmIChGSVhfNDc2NDApIHsKLQkJCQlpZiAobGVmdFJhbmdlICE9IG51bGwpCi0JCQkJICAgIHNlbGVjdERpZmY9IGZpbmREaWZmKCdMJywgbGVmdFJhbmdlKTsKLQkJCQllbHNlIGlmIChyaWdodFJhbmdlICE9IG51bGwpCi0JCQkJICAgIHNlbGVjdERpZmY9IGZpbmREaWZmKCdSJywgcmlnaHRSYW5nZSk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0RGlmZiAhPSBudWxsKQotCQkJCXNldEN1cnJlbnREaWZmKHNlbGVjdERpZmYsIHRydWUpOwotCQkJZWxzZQotCQkJCXNlbGVjdEZpcnN0RGlmZigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBEaWZmIGZpbmREaWZmKGNoYXIgYywgUG9zaXRpb24gcmFuZ2UpIHsKLQkJCi0JCU1lcmdlU291cmNlVmlld2VyIHY7Ci0JCWludCBzdGFydD0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQ9IHN0YXJ0ICsgcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChjID09ICdMJykKLQkJCXY9IGZMZWZ0OwotCQllbHNlIGlmIChjID09ICdSJykKLQkJCXY9IGZSaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXI9IGZDaGFuZ2VEaWZmcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRGlmZiBkaWZmPSAoRGlmZikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGRpZmYuaXNEZWxldGVkKCkgfHwgZGlmZi5mRGlyZWN0aW9uID09IFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSkKLQkJCQkgICAgY29udGludWU7Ci0JCQkJaWYgKGRpZmYub3ZlcmxhcHModiwgc3RhcnQsIGVuZCkpCi0JCQkJCXJldHVybiBkaWZmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZyhPYmplY3QgbykgewotCQlTdHJpbmcgZW5jb2Rpbmc9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCXRyeSB7Ci0JCQkJZW5jb2Rpbmc9ICgoSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IpbykuZ2V0Q2hhcnNldCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlZAotCQkJfQotCQl9Ci0JCWlmIChlbmNvZGluZyA9PSBudWxsKQotCQkJZW5jb2Rpbmc9IFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVEaWZmQmFja2dyb3VuZChEaWZmIGRpZmYpIHsKLQkJCi0JCWlmICghIGZIaWdobGlnaHRSYW5nZXMpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZGlmZiA9PSBudWxsIHx8IGRpZmYuZklzVG9rZW4pCi0JCQlyZXR1cm47Ci0JCQkKLQkJaWYgKGZTaG93Q3VycmVudE9ubHkgJiYgIWlzQ3VycmVudERpZmYoZGlmZikpCi0JCQlyZXR1cm47Ci0JCQkJCQkKLQkJQ29sb3IgYz0gZ2V0Q29sb3IobnVsbCwgZ2V0RmlsbENvbG9yKGRpZmYpKTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlpZiAoaXNUaHJlZVdheSgpKQotCQkJZkFuY2VzdG9yLnNldExpbmVCYWNrZ3JvdW5kKGRpZmYuZkFuY2VzdG9yUG9zLCBjKTsKLQkJZkxlZnQuc2V0TGluZUJhY2tncm91bmQoZGlmZi5mTGVmdFBvcywgYyk7Ci0JCWZSaWdodC5zZXRMaW5lQmFja2dyb3VuZChkaWZmLmZSaWdodFBvcywgYyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVBbGxEaWZmQmFja2dyb3VuZHMoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmIChmQ2hhbmdlRGlmZnMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiB0aHJlZVdheT0gaXNUaHJlZVdheSgpOwotCQkJSXRlcmF0b3IgaXRlcj0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBpdGVyLm5leHQoKTsKLQkJCQlDb2xvciBjPSBnZXRDb2xvcihkaXNwbGF5LCBnZXRGaWxsQ29sb3IoZGlmZikpOwotCQkJCWlmICh0aHJlZVdheSkKLQkJCQkJZkFuY2VzdG9yLnNldExpbmVCYWNrZ3JvdW5kKGRpZmYuZkFuY2VzdG9yUG9zLCBjKTsKLQkJCQlmTGVmdC5zZXRMaW5lQmFja2dyb3VuZChkaWZmLmZMZWZ0UG9zLCBjKTsKLQkJCQlmUmlnaHQuc2V0TGluZUJhY2tncm91bmQoZGlmZi5mUmlnaHRQb3MsIGMpOwotCQkJfQotCQl9Ci0JfQotCQotCWJvb2xlYW4gaXNDdXJyZW50RGlmZihEaWZmIGRpZmYpIHsKLQkJaWYgKGRpZmYgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGRpZmYgPT0gZkN1cnJlbnREaWZmKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmQ3VycmVudERpZmYgIT0gbnVsbCAmJiBmQ3VycmVudERpZmYuZlBhcmVudCA9PSBkaWZmKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbnZlciBvbmUgb2YgdGhlIGRvY3VtZW50cyBjaGFuZ2VzLgotCSAqIFNldHMgdGhlIGRpcnR5IHN0YXRlIG9mIHRoaXMgdmlld2VyIGFuZCB1cGRhdGVzIHRoZSBsaW5lcy4KLQkgKiBJbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQotCQlJRG9jdW1lbnQgZG9jPSBlLmdldERvY3VtZW50KCk7Ci0JCQotCQlpZiAoZG9jID09IGZMZWZ0LmdldERvY3VtZW50KCkpIHsKLQkJCXNldExlZnREaXJ0eSh0cnVlKTsKLQkJfSBlbHNlIGlmIChkb2MgPT0gZlJpZ2h0LmdldERvY3VtZW50KCkpIHsKLQkJCXNldFJpZ2h0RGlydHkodHJ1ZSk7Ci0JCX0KLQotCQl1cGRhdGVMaW5lcyhkb2MpOwotCX0KLQkJCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgYSByYW5nZSBvZiB0ZXh0IG9uIG9uZSBzaWRlIGlzIGNvcGllZCBpbnRvIGFuIGVtcHR5IHN1YmRvY3VtZW50Ci0JICogb24gdGhlIG90aGVyIHNpZGUuIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIHN1YmRvY3VtZW50IGlzIHBsYWNlZCBpbnRvIHRoZSBiYXNlIGRvY3VtZW50LgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBieSB1c2luZyB0aGUgdGV4dCByYW5nZSBkaWZmZXJlbmNlci4KLQkgKiBIb3dldmVyIHRoaXMgcG9zaXRpb24gaXMgbm90IGFsd2F5cyBvcHRpbWFsIGZvciBzcGVjaWZpYyB0eXBlcyBvZiB0ZXh0LgotCSAqIFNvIHN1YmNsYXNzZXMgKHdoaWNoIGFyZSBhd2FyZSBvZiB0aGUgdHlwZSBvZiB0ZXh0IHRoZXkgYXJlIGRlYWxpbmcgd2l0aCkgCi0JICogbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGZpbmQgYSBiZXR0ZXIgcG9zaXRpb24gd2hlcmUgdG8gaW5zZXJ0IGEgbmV3bHkgYWRkZWQKLQkgKiBwaWVjZSBvZiB0ZXh0LgotCSAqIEBwYXJhbSB0eXBlIHRoZSBzaWRlIGZvciB3aGljaCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIHNob3VsZCBiZSBkZXRlcm1pbmVkOiAnQScgZm9yIGFuY2VzdG9yLCAnTCcgZm9yIGxlZnQgaGFuZCBzaWRlLCAnUicgZm9yIHJpZ2h0IGhhbmQgc2lkZS4KLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGN1cnJlbnQgaW5wdXQgb2JqZWN0IG9mIHRoaXMgdmlld2VyCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBpbnQgZmluZEluc2VydGlvblBvc2l0aW9uKGNoYXIgdHlwZSwgSUNvbXBhcmVJbnB1dCBpbnB1dCkgewotCQkJCi0JCUlUeXBlZEVsZW1lbnQgb3RoZXI9IG51bGw7Ci0JCWNoYXIgb3RoZXJUeXBlPSAwOwotCQkKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgJ0EnOgotCQkJb3RoZXI9IGlucHV0LmdldExlZnQoKTsKLQkJCW90aGVyVHlwZT0gJ0wnOwotCQkJaWYgKG90aGVyID09IG51bGwpIHsKLQkJCQlvdGhlcj0gaW5wdXQuZ2V0UmlnaHQoKTsKLQkJCQlvdGhlclR5cGU9ICdSJzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdMJzoKLQkJCW90aGVyPSBpbnB1dC5nZXRSaWdodCgpOwotCQkJb3RoZXJUeXBlPSAnUic7Ci0JCQlpZiAob3RoZXIgPT0gbnVsbCkgewotCQkJCW90aGVyPSBpbnB1dC5nZXRBbmNlc3RvcigpOwotCQkJCW90aGVyVHlwZT0gJ0EnOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ1InOgotCQkJb3RoZXI9IGlucHV0LmdldExlZnQoKTsKLQkJCW90aGVyVHlwZT0gJ0wnOwotCQkJaWYgKG90aGVyID09IG51bGwpIHsKLQkJCQlvdGhlcj0gaW5wdXQuZ2V0QW5jZXN0b3IoKTsKLQkJCQlvdGhlclR5cGU9ICdBJzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCQotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZSkgewotCQkJSURvY3VtZW50UmFuZ2UgZHI9IChJRG9jdW1lbnRSYW5nZSkgb3RoZXI7Ci0JCQlQb3NpdGlvbiBwPSBkci5nZXRSYW5nZSgpOwkKLQkJCURpZmYgZGlmZj0gZmluZERpZmYob3RoZXJUeXBlLCBwLm9mZnNldCk7Ci0JCQlpZiAoZGlmZiAhPSBudWxsKSB7Ci0JCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSAnQSc6Ci0JCQkJCWlmIChkaWZmLmZBbmNlc3RvclBvcyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRpZmYuZkFuY2VzdG9yUG9zLm9mZnNldDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnTCc6Ci0JCQkJCWlmIChkaWZmLmZMZWZ0UG9zICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGlmZi5mTGVmdFBvcy5vZmZzZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1InOgotCQkJCQlpZiAoZGlmZi5mUmlnaHRQb3MgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkaWZmLmZSaWdodFBvcy5vZmZzZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEVycm9yKGNoYXIgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNwPSBnZXRNZXJnZUNvbnRlbnRQcm92aWRlcigpOwotCQlpZiAoY3AgaW5zdGFuY2VvZiBNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcikgewotCQkJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgbWNwPSAoTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIpIGNwOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlICdBJzoKLQkJCQltY3Auc2V0QW5jZXN0b3JFcnJvcihtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ0wnOgotCQkJCW1jcC5zZXRMZWZ0RXJyb3IobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdSJzoKLQkJCQltY3Auc2V0UmlnaHRFcnJvcihtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlmSGFzRXJyb3JzPSB0cnVlOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIG5ldyBEb2N1bWVudCBjb3VsZCBiZSBpbnN0YWxsZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNldERvY3VtZW50KE1lcmdlU291cmNlVmlld2VyIHRwLCBjaGFyIHR5cGUsIE9iamVjdCBvKSB7Ci0JCQotCQlpZiAodHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQkKLQkJSURvY3VtZW50IG5ld0RvYz0gbnVsbDsKLQkJUG9zaXRpb24gcmFuZ2U9IG51bGw7Ci0KLQkJaWYgKG8gaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZSkgewotCQkJbmV3RG9jPSAoKElEb2N1bWVudFJhbmdlKW8pLmdldERvY3VtZW50KCk7Ci0JCQlyYW5nZT0gKChJRG9jdW1lbnRSYW5nZSlvKS5nZXRSYW5nZSgpOwotCi0JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIElEb2N1bWVudCkgewotCQkJbmV3RG9jPSAoSURvY3VtZW50KSBvOwotCQkJCi0JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCQotCQkJbmV3RG9jPSBEb2N1bWVudE1hbmFnZXIuZ2V0KG8pOwotCQkJaWYgKG5ld0RvYyA9PSBudWxsKSB7Ci0JCQkJSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzY2E9IChJU3RyZWFtQ29udGVudEFjY2Vzc29yKSBvOwotCQkJCVN0cmluZyBzPSBudWxsOwotCQkKLQkJCQl0cnkgewotCQkJCQlzPSBVdGlsaXRpZXMucmVhZFN0cmluZyhzY2EpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJc2V0RXJyb3IodHlwZSwgZXguZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCi0JCQkJbmV3RG9jPSBuZXcgRG9jdW1lbnQocyAhPSBudWxsID8gcyA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCURvY3VtZW50TWFuYWdlci5wdXQobywgbmV3RG9jKTsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcj0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQkJCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQkJCW5ld0RvYy5zZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmVyKTsKLQkJCQkJcGFydGl0aW9uZXIuY29ubmVjdChuZXdEb2MpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvID09IG51bGwpIHsJLy8gZGVsZXRpb24gb24gb25lIHNpZGUKLQkJCQotCQkJSVR5cGVkRWxlbWVudCBwYXJlbnQ9IGdldFBhcmVudCh0eXBlKTsJLy8gd2UgdHJ5IHRvIGZpbmQgYW4gaW5zZXJ0aW9uIHBvc2l0aW9uIHdpdGhpbiB0aGUgZGVsZXRpb24ncyBwYXJlbnQKLQkJCQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElEb2N1bWVudFJhbmdlKSB7Ci0JCQkJbmV3RG9jPSAoKElEb2N1bWVudFJhbmdlKXBhcmVudCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQluZXdEb2MuYWRkUG9zaXRpb25DYXRlZ29yeShJRG9jdW1lbnRSYW5nZS5SQU5HRV9DQVRFR09SWSk7Ci0JCQkJT2JqZWN0IGlucHV0PSBnZXRJbnB1dCgpOwotCQkJCXJhbmdlPSBnZXROZXdSYW5nZSh0eXBlLCBpbnB1dCk7Ci0JCQkJaWYgKHJhbmdlID09IG51bGwpIHsKLQkJCQkJaW50IHBvcz0gMDsKLQkJCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkJCXBvcz0gZmluZEluc2VydGlvblBvc2l0aW9uKHR5cGUsIChJQ29tcGFyZUlucHV0KWlucHV0KTsKLQkJCQkJcmFuZ2U9IG5ldyBQb3NpdGlvbihwb3MsIDApOwotCQkJCQl0cnkgewotCQkJCQkJbmV3RG9jLmFkZFBvc2l0aW9uKElEb2N1bWVudFJhbmdlLlJBTkdFX0NBVEVHT1JZLCByYW5nZSk7Ci0JCQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOiAiICsgZXgpOwkvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiQmFkTG9jYXRpb25FeGNlcHRpb246ICIgKyBleCk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlhZGROZXdSYW5nZSh0eXBlLCBpbnB1dCwgcmFuZ2UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSURvY3VtZW50KSB7Ci0JCQkJbmV3RG9jPSAoKElEb2N1bWVudFJhbmdlKW8pLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZWQ9IHRydWU7Ci0JCWlmIChuZXdEb2MgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNldERvY3VtZW50OiBjcmVhdGUgbmV3IERvY3VtZW50Iik7Ci0JCQluZXdEb2M9IG5ldyBEb2N1bWVudCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVuYWJsZWQ9IGZhbHNlOwotCQl9Ci0JCQotCQlJRG9jdW1lbnQgb2xkRG9jPSB0cC5nZXREb2N1bWVudCgpOwotCQkKLQkJaWYgKG5ld0RvYyAhPSBvbGREb2MpIHsKLQkJCQotCQkJLy8gZ290IGEgbmV3IGRvY3VtZW50Ci0JCQkKLQkJCXVuc2V0RG9jdW1lbnQodHApOwotCQkJCi0JCQlpZiAobmV3RG9jICE9IG51bGwpIHsKLQkJCQluZXdEb2MuYWRkUG9zaXRpb25DYXRlZ29yeShJRG9jdW1lbnRSYW5nZS5SQU5HRV9DQVRFR09SWSk7Ci0JCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXIgPT0gbnVsbCkKLQkJCQkJZlBvc2l0aW9uVXBkYXRlcj0gbmV3IENoaWxkUG9zaXRpb25VcGRhdGVyKElEb2N1bWVudFJhbmdlLlJBTkdFX0NBVEVHT1JZKTsKLQkJCQllbHNlCi0JCQkJCW5ld0RvYy5yZW1vdmVQb3NpdGlvblVwZGF0ZXIoZlBvc2l0aW9uVXBkYXRlcik7Ci0JCQkJbmV3RG9jLmFkZFBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25VcGRhdGVyKTsKLQkJCX0KLQotCQkJLy8gaW5zdGFsbCBuZXcgZG9jdW1lbnQKLQkJCWlmIChuZXdEb2MgIT0gbnVsbCkgewotCQkJCQkJCi0JCQkJdHAuc2V0UmVnaW9uKHJhbmdlKTsKLQkJCQlpZiAoZlN1YkRvYykgewotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQkJSVJlZ2lvbiByPSBub3JtYWxpemVEb2N1bWVudFJlZ2lvbihuZXdEb2MsIHRvUmVnaW9uKHJhbmdlKSk7Ci0JCQkJCQl0cC5zZXREb2N1bWVudChuZXdEb2MsIHIuZ2V0T2Zmc2V0KCksIHIuZ2V0TGVuZ3RoKCkpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRwLnNldERvY3VtZW50KG5ld0RvYyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRwLnNldERvY3VtZW50KG5ld0RvYyk7Ci0JCQkJCQkJCQotCQkJCXRwLnJlbWVtYmVyRG9jdW1lbnQobmV3RG9jKTsKLQkJCQluZXdEb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJLy9MZWFrVGVzdGVyLmFkZChuZXdEb2MpOwotCQkJfQotCQkJCi0JCX0gZWxzZSB7CS8vIHNhbWUgZG9jdW1lbnQgYnV0IGRpZmZlcmVudCByYW5nZQotCQkJCi0JCQl0cC5zZXRSZWdpb24ocmFuZ2UpOwotCQkJaWYgKGZTdWJEb2MpIHsKLQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQlJUmVnaW9uIHI9IG5vcm1hbGl6ZURvY3VtZW50UmVnaW9uKG5ld0RvYywgdG9SZWdpb24ocmFuZ2UpKTsKLQkJCQkJdHAuc2V0VmlzaWJsZVJlZ2lvbihyLmdldE9mZnNldCgpLCByLmdldExlbmd0aCgpKTsKLQkJCQl9IGVsc2UKLQkJCQkJdHAucmVzZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCQl9IGVsc2UKLQkJCQl0cC5yZXNldFZpc2libGVSZWdpb24oKTsKLQkJfQotCQkKLQkJdHAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0JCi0JcHJpdmF0ZSBQb3NpdGlvbiBnZXROZXdSYW5nZShjaGFyIHR5cGUsIE9iamVjdCBpbnB1dCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAnQSc6Ci0JCQlyZXR1cm4gKFBvc2l0aW9uKSBmTmV3QW5jZXN0b3JSYW5nZXMuZ2V0KGlucHV0KTsKLQkJY2FzZSAnTCc6Ci0JCQlyZXR1cm4gKFBvc2l0aW9uKSBmTmV3TGVmdFJhbmdlcy5nZXQoaW5wdXQpOwotCQljYXNlICdSJzoKLQkJCXJldHVybiAoUG9zaXRpb24pIGZOZXdSaWdodFJhbmdlcy5nZXQoaW5wdXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTmV3UmFuZ2UoY2hhciB0eXBlLCBPYmplY3QgaW5wdXQsIFBvc2l0aW9uIHJhbmdlKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlICdBJzoKLQkJCWZOZXdBbmNlc3RvclJhbmdlcy5wdXQoaW5wdXQsIHJhbmdlKTsKLQkJCWJyZWFrOwotCQljYXNlICdMJzoKLQkJCWZOZXdMZWZ0UmFuZ2VzLnB1dChpbnB1dCwgcmFuZ2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1InOgotCQkJZk5ld1JpZ2h0UmFuZ2VzLnB1dChpbnB1dCwgcmFuZ2UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5zZXREb2N1bWVudChNZXJnZVNvdXJjZVZpZXdlciB0cCkgewotCQlJRG9jdW1lbnQgb2xkRG9jPSB0cC5nZXREb2N1bWVudCgpOwotCQlpZiAob2xkRG9jID09IG51bGwpIHsKLQkJCW9sZERvYz0gdHAuZ2V0UmVtZW1iZXJlZERvY3VtZW50KCk7Ci0vLwkJCWlmIChvbGREb2MgIT0gbnVsbCkKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVGV4dE1lcmdlVmlld2VyLnVuc2V0RG9jdW1lbnQ6IHdvdWxkIGxlYWsiKTsKLQkJfQotCQlpZiAob2xkRG9jICE9IG51bGwpIHsKLQkJCXRwLnJlbWVtYmVyRG9jdW1lbnQobnVsbCk7Ci0JCQkvLyBkZWluc3RhbGwgb2xkIHBvc2l0aW9ucwotCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXIgIT0gbnVsbCkKLQkJCQlvbGREb2MucmVtb3ZlUG9zaXRpb25VcGRhdGVyKGZQb3NpdGlvblVwZGF0ZXIpOwotCQkJdHJ5IHsKLQkJCQlvbGREb2MucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShJRG9jdW1lbnRSYW5nZS5SQU5HRV9DQVRFR09SWSk7Ci0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0KLQkJCQotCQkJb2xkRG9jLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQkJLy9MZWFrVGVzdGVyLnJlbW92ZShvbGREb2MpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50IGFzIGFuIGFycmF5IG9mIGJ5dGVzIHVzaW5nIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgY29udGVudHMgb2YgdGhlIGxlZnQgc2lkZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIHRoZSByaWdodCBzaWRlCi0JICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxlZnQgb3IgcmlnaHQgZG9jdW1lbnQgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBieXRlW10gZ2V0Q29udGVudHMoYm9vbGVhbiBsZWZ0KSB7Ci0JCU1lcmdlU291cmNlVmlld2VyIHY9IGxlZnQgPyBmTGVmdCA6IGZSaWdodDsKLQkJaWYgKHYgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGQ9IHYuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgY29udGVudHM9IGQuZ2V0KCk7Ci0JCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzOwotCQkJCQl0cnkgewotCQkJCQkJYnl0ZXM9IGNvbnRlbnRzLmdldEJ5dGVzKGxlZnQgPyBmTGVmdEVuY29kaW5nIDogZlJpZ2h0RW5jb2RpbmcpOwotCQkJCQl9IGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlieXRlcz0gY29udGVudHMuZ2V0Qnl0ZXMoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gYnl0ZXM7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCQkKLQlwcml2YXRlIElSZWdpb24gbm9ybWFsaXplRG9jdW1lbnRSZWdpb24oSURvY3VtZW50IGRvYywgSVJlZ2lvbiByZWdpb24pIHsKLQkJCi0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCBkb2MgPT0gbnVsbCkKLQkJCXJldHVybiByZWdpb247Ci0JCQkKLQkJaW50IG1heExlbmd0aD0gZG9jLmdldExlbmd0aCgpOwotCQkKLQkJaW50IHN0YXJ0PSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydD0gMDsKLQkJZWxzZSBpZiAoc3RhcnQgPiBtYXhMZW5ndGgpCi0JCQlzdGFydD0gbWF4TGVuZ3RoOwotCQkJCi0JCWludCBsZW5ndGg9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA8IDApCi0JCQlsZW5ndGg9IDA7Ci0JCWVsc2UgaWYgKHN0YXJ0ICsgbGVuZ3RoID4gbWF4TGVuZ3RoKQotCQkJbGVuZ3RoPSBtYXhMZW5ndGggLSBzdGFydDsKLQkJCQotCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVJlc2l6ZUFuY2VzdG9yKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICh3aWR0aCA+IDApIHsKLQkJCVJlY3RhbmdsZSB0cmltPSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlpbnQgc2Nyb2xsYmFySGVpZ2h0PSB0cmltLmhlaWdodDsKLQkJCWlmIChVdGlsaXRpZXMub2tUb1VzZShmQW5jZXN0b3JDYW52YXMpKQotCQkJCWZBbmNlc3RvckNhbnZhcy5zZXRWaXNpYmxlKHRydWUpOwotCQkJaWYgKGZBbmNlc3Rvci5pc0NvbnRyb2xPa1RvVXNlKCkpCi0JCQkJZkFuY2VzdG9yLmdldFRleHRXaWRnZXQoKS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCi0JCQlpZiAoZkFuY2VzdG9yQ2FudmFzICE9IG51bGwpIHsKLQkJCQlmQW5jZXN0b3JDYW52YXMuc2V0Qm91bmRzKHgsIHksIGZNYXJnaW5XaWR0aCwgaGVpZ2h0LXNjcm9sbGJhckhlaWdodCk7Ci0JCQkJeCs9IGZNYXJnaW5XaWR0aDsKLQkJCQl3aWR0aC09IGZNYXJnaW5XaWR0aDsKLQkJCX0KLQkJCWZBbmNlc3Rvci5nZXRUZXh0V2lkZ2V0KCkuc2V0Qm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQl9IGVsc2UgewotCQkJaWYgKFV0aWxpdGllcy5va1RvVXNlKGZBbmNlc3RvckNhbnZhcykpCi0JCQkJZkFuY2VzdG9yQ2FudmFzLnNldFZpc2libGUoZmFsc2UpOwotCQkJaWYgKGZBbmNlc3Rvci5pc0NvbnRyb2xPa1RvVXNlKCkpIHsKLQkJCQlTdHlsZWRUZXh0IHQ9IGZBbmNlc3Rvci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJdC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl0LnNldEJvdW5kcygwLCAwLCAwLCAwKTsKLQkJCQlpZiAoZkZvY3VzUGFydCA9PSBmQW5jZXN0b3IpIHsKLQkJCQkJZkZvY3VzUGFydD0gZkxlZnQ7Ci0JCQkJCWZGb2N1c1BhcnQuZ2V0VGV4dFdpZGdldCgpLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBMYXlzIG91dCBldmVyeXRoaW5nLgotCSAqLwotICAJcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlUmVzaXplTGVmdFJpZ2h0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoMSwgaW50IGNlbnRlcldpZHRoLCBpbnQgd2lkdGgyLCAgaW50IGhlaWdodCkgewotICAJCQkJCi0gIAkJaWYgKGZCaXJkc0V5ZUNhbnZhcyAhPSBudWxsKQotICAJCQl3aWR0aDItPSBCSVJEU19FWUVfVklFV19XSURUSDsKLSAgCQkJCi0JCVJlY3RhbmdsZSB0cmltPSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCWludCBzY3JvbGxiYXJIZWlnaHQ9IHRyaW0uaGVpZ2h0ICsgdHJpbS54OwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IChDb21wb3NpdGUpIGdldENvbnRyb2woKTsKLQotCQlpbnQgbGVmdFRleHRXaWR0aD0gd2lkdGgxOwotCQlpZiAoZkxlZnRDYW52YXMgIT0gbnVsbCkgewotCQkJZkxlZnRDYW52YXMuc2V0Qm91bmRzKHgsIHksIGZNYXJnaW5XaWR0aCwgaGVpZ2h0LXNjcm9sbGJhckhlaWdodCk7Ci0JCQl4Kz0gZk1hcmdpbldpZHRoOwotCQkJbGVmdFRleHRXaWR0aC09IGZNYXJnaW5XaWR0aDsKLQkJfQotCQkKLQkJZkxlZnQuZ2V0VGV4dFdpZGdldCgpLnNldEJvdW5kcyh4LCB5LCBsZWZ0VGV4dFdpZHRoLCBoZWlnaHQpOwotCQl4Kz0gbGVmdFRleHRXaWR0aDsKLQkJCi0JCWlmIChmQ2VudGVyID09IG51bGwgfHwgZkNlbnRlci5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ2VudGVyPSBjcmVhdGVDZW50ZXIoY29tcG9zaXRlKTsKLQkJZkNlbnRlci5zZXRCb3VuZHMoeCwgeSwgY2VudGVyV2lkdGgsIGhlaWdodC1zY3JvbGxiYXJIZWlnaHQpOwotCQl4Kz0gY2VudGVyV2lkdGg7Ci0JCQotCQlpZiAoIWZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpIHsJLy8gY2FudmFzIGlzIHRvIHRoZSBsZWZ0IG9mIHRleHQKLQkJCWlmIChmUmlnaHRDYW52YXMgIT0gbnVsbCkgewotCQkJCWZSaWdodENhbnZhcy5zZXRCb3VuZHMoeCwgeSwgZk1hcmdpbldpZHRoLCBoZWlnaHQtc2Nyb2xsYmFySGVpZ2h0KTsKLQkJCQlmUmlnaHRDYW52YXMucmVkcmF3KCk7Ci0JCQkJeCs9IGZNYXJnaW5XaWR0aDsKLQkJCX0KLQkJCS8vIHdlIGRyYXcgdGhlIGNhbnZhcyB0byB0aGUgbGVmdCBvZiB0aGUgdGV4dCB3aWRnZXQKLQkJfQotCQkKLQkJaW50IHNjcm9sbGJhcldpZHRoPSAwOwotCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZyAmJiBmU2Nyb2xsQ2FudmFzICE9IG51bGwpIHsKLQkJCXRyaW09IGZMZWZ0LmdldFRleHRXaWRnZXQoKS5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCXNjcm9sbGJhcldpZHRoPSB0cmltLndpZHRoICsgMip0cmltLng7Ci0JCX0KLQkJaW50IHJpZ2h0VGV4dFdpZHRoPSB3aWR0aDItc2Nyb2xsYmFyV2lkdGg7Ci0JCWlmIChmUmlnaHRDYW52YXMgIT0gbnVsbCkKLQkJCXJpZ2h0VGV4dFdpZHRoLT0gZk1hcmdpbldpZHRoOwotCQlmUmlnaHQuZ2V0VGV4dFdpZGdldCgpLnNldEJvdW5kcyh4LCB5LCByaWdodFRleHRXaWR0aCwgaGVpZ2h0KTsKLQkJeCs9IHJpZ2h0VGV4dFdpZHRoOwotCQkJCi0JCWlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nKSB7Ci0JCQlpZiAoZlJpZ2h0Q2FudmFzICE9IG51bGwpIHsJLy8gY2FudmFzIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dAotCQkJCWZSaWdodENhbnZhcy5zZXRCb3VuZHMoeCwgeSwgZk1hcmdpbldpZHRoLCBoZWlnaHQtc2Nyb2xsYmFySGVpZ2h0KTsKLQkJCQl4Kz0gZk1hcmdpbldpZHRoOwotCQkJfQotCQkJaWYgKGZTY3JvbGxDYW52YXMgIT0gbnVsbCkKLQkJCQlmU2Nyb2xsQ2FudmFzLnNldEJvdW5kcyh4LCB5LCBzY3JvbGxiYXJXaWR0aCwgaGVpZ2h0LXNjcm9sbGJhckhlaWdodCk7Ci0JCX0KLQkJCi0gIAkJaWYgKGZCaXJkc0V5ZUNhbnZhcyAhPSBudWxsKSB7Ci0gIAkJCWludCB2ZXJ0aWNhbFNjcm9sbGJhckJ1dHRvbkhlaWdodD0gc2Nyb2xsYmFyV2lkdGg7Ci0JCQlpbnQgaG9yaXpvbnRhbFNjcm9sbGJhckJ1dHRvbkhlaWdodD0gc2Nyb2xsYmFySGVpZ2h0OwotCQkJaWYgKGZJc0NhcmJvbikgewotCQkJCXZlcnRpY2FsU2Nyb2xsYmFyQnV0dG9uSGVpZ2h0Kz0gMjsKLQkJCQlob3Jpem9udGFsU2Nyb2xsYmFyQnV0dG9uSGVpZ2h0PSAxODsKLQkJCX0KLSAgCQkJaWYgKGZTdW1tYXJ5SGVhZGVyICE9IG51bGwpCi0JCQkJZlN1bW1hcnlIZWFkZXIuc2V0Qm91bmRzKHgrc2Nyb2xsYmFyV2lkdGgsIHksIEJJUkRTX0VZRV9WSUVXX1dJRFRILCB2ZXJ0aWNhbFNjcm9sbGJhckJ1dHRvbkhlaWdodCk7Ci0gIAkJCXkrPSB2ZXJ0aWNhbFNjcm9sbGJhckJ1dHRvbkhlaWdodDsKLSAgCQkJZkJpcmRzRXllQ2FudmFzLnNldEJvdW5kcyh4K3Njcm9sbGJhcldpZHRoLCB5LCBCSVJEU19FWUVfVklFV19XSURUSCwgaGVpZ2h0LSgyKnZlcnRpY2FsU2Nyb2xsYmFyQnV0dG9uSGVpZ2h0K2hvcml6b250YWxTY3JvbGxiYXJCdXR0b25IZWlnaHQpKTsKLSAgIAkJfQotCQkKLQkJLy8gZG9lc24ndCB3b3JrIHNpbmNlIFRleHRFZGl0b3JzIGRvbid0IGhhdmUgdGhlaXIgY29ycmVjdCBzaXplIHlldC4KLQkJdXBkYXRlVlNjcm9sbEJhcigpOyAKLQkJcmVmcmVzaEJpcmRzRXllVmlldygpOwotCX0KLQkJCQkJCQkKLQkvKgotCSAqIFRyYWNrIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCBEaWZmLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKE1lcmdlU291cmNlVmlld2VyIHR3KSB7Ci0JCVBvaW50IHA9IHR3LmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJRGlmZiBkPSBmaW5kRGlmZih0dywgcC54LCBwLngrcC55KTsKLQkJdXBkYXRlU3RhdHVzKGQpOwotCQlzZXRDdXJyZW50RGlmZihkLCBmYWxzZSk7CS8vIGRvbid0IHNlbGVjdCBvciByZXZlYWwKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUmVnaW9uIHRvUmVnaW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCWlmIChwb3NpdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBSZWdpb24ocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vLS0tLSB0aGUgZGlmZmVyZW5jaW5nCi0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4V29yayhJUmFuZ2VDb21wYXJhdG9yIGEsIElSYW5nZUNvbXBhcmF0b3IgbCwgSVJhbmdlQ29tcGFyYXRvciByKSB7Ci0JCWludCBsbj0gbC5nZXRSYW5nZUNvdW50KCk7Ci0JCWludCBybj0gci5nZXRSYW5nZUNvdW50KCk7Ci0JCWlmIChhICE9IG51bGwpIHsKLQkJCWludCBhbj0gYS5nZXRSYW5nZUNvdW50KCk7Ci0JCQlyZXR1cm4gKDIgKiBNYXRoLm1heChhbiwgbG4pKSArICgyICogTWF0aC5tYXgoYW4sIHJuKSk7Ci0JCX0KLQkJcmV0dXJuIDIgKiBNYXRoLm1heChsbiwgcm4pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtIGEgdHdvIGxldmVsIDItIG9yIDMtd2F5IGRpZmYuCi0JICogVGhlIGZpcnN0IGxldmVsIGlzIGJhc2VkIG9uIGxpbmUgY29tcGFyaXNvbiwgdGhlIHNlY29uZCBsZXZlbCBvbiB0b2tlbiBjb21wYXJpc29uLgotCSAqLwotCXByaXZhdGUgdm9pZCBkb0RpZmYoKSB7Ci0JCQkJCQkKLQkJZkFsbERpZmZzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDaGFuZ2VEaWZmcz0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ3VycmVudERpZmY9IG51bGw7Ci0JCQotCQlJRG9jdW1lbnQgYURvYz0gbnVsbDsKLQkJSURvY3VtZW50IGxEb2M9IGZMZWZ0LmdldERvY3VtZW50KCk7Ci0JCUlEb2N1bWVudCByRG9jPSBmUmlnaHQuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGxEb2MgPT0gbnVsbCB8fCByRG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJUG9zaXRpb24gYVJlZ2lvbj0gbnVsbDsKLQkJUG9zaXRpb24gbFJlZ2lvbj0gZkxlZnQuZ2V0UmVnaW9uKCk7Ci0JCVBvc2l0aW9uIHJSZWdpb249IGZSaWdodC5nZXRSZWdpb24oKTsKLQkJCQkKLQkJYm9vbGVhbiB0aHJlZVdheT0gaXNUaHJlZVdheSgpOwotCQkKLQkJaWYgKHRocmVlV2F5ICYmICFmSWdub3JlQW5jZXN0b3IpIHsKLQkJCWFEb2M9IGZBbmNlc3Rvci5nZXREb2N1bWVudCgpOwotCQkJYVJlZ2lvbj0gZkFuY2VzdG9yLmdldFJlZ2lvbigpOwotCQl9Ci0JCQotCQlmQW5jZXN0b3IucmVzZXRMaW5lQmFja2dyb3VuZCgpOwotCQlmTGVmdC5yZXNldExpbmVCYWNrZ3JvdW5kKCk7Ci0JCWZSaWdodC5yZXNldExpbmVCYWNrZ3JvdW5kKCk7Ci0JCQotCQlib29sZWFuIGlnbm9yZVdoaXRlU3BhY2U9IFV0aWxpdGllcy5nZXRCb29sZWFuKGdldENvbXBhcmVDb25maWd1cmF0aW9uKCksIENvbXBhcmVDb25maWd1cmF0aW9uLklHTk9SRV9XSElURVNQQUNFLCBmYWxzZSk7CQkKLQkJCi0JCURvY0xpbmVDb21wYXJhdG9yIHNyaWdodD0gbmV3IERvY0xpbmVDb21wYXJhdG9yKHJEb2MsIHRvUmVnaW9uKHJSZWdpb24pLCBpZ25vcmVXaGl0ZVNwYWNlKTsKLQkJRG9jTGluZUNvbXBhcmF0b3Igc2xlZnQ9IG5ldyBEb2NMaW5lQ29tcGFyYXRvcihsRG9jLCB0b1JlZ2lvbihsUmVnaW9uKSwgaWdub3JlV2hpdGVTcGFjZSk7Ci0JCURvY0xpbmVDb21wYXJhdG9yIHNhbmNlc3Rvcj0gbnVsbDsKLQkJaWYgKGFEb2MgIT0gbnVsbCkKLQkJCXNhbmNlc3Rvcj0gbmV3IERvY0xpbmVDb21wYXJhdG9yKGFEb2MsIHRvUmVnaW9uKGFSZWdpb24pLCBpZ25vcmVXaGl0ZVNwYWNlKTsKLQkJCQotCQlpZiAoIWZTdWJEb2MgJiYgclJlZ2lvbiAhPSBudWxsICYmIGxSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gd2UgaGF2ZSB0byBhZGQgYSBkaWZmIGZvciB0aGUgaWdub3JlZCBsaW5lcwotCQkJCi0JCQlpbnQgYXN0YXJ0PSAwOwotCQkJaW50IGFzPSAwOwotCQkJaWYgKGFSZWdpb24gIT0gbnVsbCkgewotCQkJCWFzdGFydD0gYVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQlhcz0gTWF0aC5tYXgoMCwgYXN0YXJ0LTEpOwotCQkJfQotCQkJaW50IHlzPSBNYXRoLm1heCgwLCBsUmVnaW9uLmdldE9mZnNldCgpLTEpOwotCQkJaW50IG1zPSBNYXRoLm1heCgwLCByUmVnaW9uLmdldE9mZnNldCgpLTEpOwotCQkJCi0JCQlpZiAoYXMgPiAwIHx8IHlzID4gMCB8fCBtcyA+IDApIHsKLQkJCQlEaWZmIGRpZmY9IG5ldyBEaWZmKG51bGwsIFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSwKLQkJCQkJYURvYywgYVJlZ2lvbiwgMCwgYXN0YXJ0LAotCQkJCQlsRG9jLCBsUmVnaW9uLCAwLCBsUmVnaW9uLmdldE9mZnNldCgpLAotCQkJCQlyRG9jLCByUmVnaW9uLCAwLCByUmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQlmQWxsRGlmZnMuYWRkKGRpZmYpOwotCQkJfQotCQl9Ci0JCQotCQlmaW5hbCBSZXNvdXJjZUJ1bmRsZSBidW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCQkKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0PSBuZXcgT2JqZWN0WzFdOwotCQlmaW5hbCBEb2NMaW5lQ29tcGFyYXRvciBzYT0gc2FuY2VzdG9yLCBzbD0gc2xlZnQsIHNyPSBzcmlnaHQ7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZT0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJU3RyaW5nIHByb2dyZXNzVGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAiY29tcGFyZVByb2dyZXNzVGFzay50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvci5iZWdpblRhc2socHJvZ3Jlc3NUaXRsZSwgbWF4V29yayhzYSwgc2wsIHNyKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0WzBdPSBSYW5nZURpZmZlcmVuY2VyLmZpbmRSYW5nZXMobW9uaXRvciwgc2EsIHNsLCBzcik7Ci0JCQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBleCkgewotCQkJCQlTeXN0ZW0uZ2MoKTsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCXsgLy8gY2FuY2VsbGVkCi0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfTsKLQkJSVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2U9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQotCQlSYW5nZURpZmZlcmVuY2VbXSBlPSBudWxsOwotCQl0cnkgewotCQkJcHJvZ3Jlc3NTZXJ2aWNlLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQllPSAoUmFuZ2VEaWZmZXJlbmNlW10pIHJlc3VsdFswXTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJU3RyaW5nIHRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRvb0NvbXBsZXhFcnJvci50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRvb0NvbXBsZXhFcnJvci5mb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1zZz0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyBJbnRlZ2VyLnRvU3RyaW5nKHByb2dyZXNzU2VydmljZS5nZXRMb25nT3BlcmF0aW9uVGltZSgpLzEwMDApIH0gKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGZDb21wb3NpdGUuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZyk7Ci0JCQllPSBudWxsOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gCi0JCX0KLQkJCQkJCi0JCWlmIChlID09IG51bGwpIHsKLQkJCS8vIHdlIGNyZWF0ZSBhIE5PQ0hBTkdFIHJhbmdlIGZvciB0aGUgd2hvbGUgZG9jdW1lbnQKLQkJCURpZmYgZGlmZj0gbmV3IERpZmYobnVsbCwgUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFLAotCQkJCWFEb2MsIGFSZWdpb24sIDAsIGFEb2MgIT0gbnVsbCA/IGFEb2MuZ2V0TGVuZ3RoKCkgOiAwLAotCQkJCWxEb2MsIGxSZWdpb24sIDAsIGxEb2MuZ2V0TGVuZ3RoKCksCi0JCQkJckRvYywgclJlZ2lvbiwgMCwgckRvYy5nZXRMZW5ndGgoKSk7CQotCQkJCQotCQkJZkFsbERpZmZzLmFkZChkaWZmKTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGE9IG51bGwsIHM9IG51bGwsIGQ9IG51bGw7Ci0JCQkJUmFuZ2VEaWZmZXJlbmNlIGVzPSBlW2ldOwotCQkJCQotCQkJCWludCBraW5kPSBlcy5raW5kKCk7Ci0JCQkJCi0JCQkJaW50IGFuY2VzdG9yU3RhcnQ9IDA7Ci0JCQkJaW50IGFuY2VzdG9yRW5kPSAwOwotCQkJCWlmIChzYW5jZXN0b3IgIT0gbnVsbCkgewotCQkJCQlhbmNlc3RvclN0YXJ0PSBzYW5jZXN0b3IuZ2V0VG9rZW5TdGFydChlcy5hbmNlc3RvclN0YXJ0KCkpOwotCQkJCQlhbmNlc3RvckVuZD0gZ2V0VG9rZW5FbmQyKHNhbmNlc3RvciwgZXMuYW5jZXN0b3JTdGFydCgpLCBlcy5hbmNlc3Rvckxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaW50IGxlZnRTdGFydD0gc2xlZnQuZ2V0VG9rZW5TdGFydChlcy5sZWZ0U3RhcnQoKSk7Ci0JCQkJaW50IGxlZnRFbmQ9IGdldFRva2VuRW5kMihzbGVmdCwgZXMubGVmdFN0YXJ0KCksIGVzLmxlZnRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJaW50IHJpZ2h0U3RhcnQ9IHNyaWdodC5nZXRUb2tlblN0YXJ0KGVzLnJpZ2h0U3RhcnQoKSk7Ci0JCQkJaW50IHJpZ2h0RW5kPSBnZXRUb2tlbkVuZDIoc3JpZ2h0LCBlcy5yaWdodFN0YXJ0KCksIGVzLnJpZ2h0TGVuZ3RoKCkpOwotCQkJCQotCQkJCURpZmYgZGlmZj0gbmV3IERpZmYobnVsbCwga2luZCwKLQkJCQkJYURvYywgYVJlZ2lvbiwgYW5jZXN0b3JTdGFydCwgYW5jZXN0b3JFbmQsCi0JCQkJCWxEb2MsIGxSZWdpb24sIGxlZnRTdGFydCwgbGVmdEVuZCwKLQkJCQkJckRvYywgclJlZ2lvbiwgcmlnaHRTdGFydCwgcmlnaHRFbmQpOwkKLQkJCQkKLQkJCQlmQWxsRGlmZnMuYWRkKGRpZmYpOwkvLyByZW1lbWJlciBhbGwgcmFuZ2UgZGlmZnMgZm9yIHNjcm9sbGluZwotCQkKLQkJCQlpZiAoaWdub3JlV2hpdGVTcGFjZSkgewotCQkJCQlpZiAoc2FuY2VzdG9yICE9IG51bGwpCi0JCQkJCQlhPSBleHRyYWN0MihhRG9jLCBzYW5jZXN0b3IsIGVzLmFuY2VzdG9yU3RhcnQoKSwgZXMuYW5jZXN0b3JMZW5ndGgoKSk7Ci0JCQkJCXM9IGV4dHJhY3QyKGxEb2MsIHNsZWZ0LCBlcy5sZWZ0U3RhcnQoKSwgZXMubGVmdExlbmd0aCgpKTsKLQkJCQkJZD0gZXh0cmFjdDIockRvYywgc3JpZ2h0LCBlcy5yaWdodFN0YXJ0KCksIGVzLnJpZ2h0TGVuZ3RoKCkpOwotCQkJCQotCQkJCQlpZiAoKGEgPT0gbnVsbCB8fCBhLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiBzLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmIGQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWRpZmYuZklzV2hpdGVzcGFjZT0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkKLQkJCQlpZiAodXNlQ2hhbmdlKGtpbmQpKSB7Ci0JCQkJCWZDaGFuZ2VEaWZmcy5hZGQoZGlmZik7CS8vIGhlcmUgd2UgcmVtZW1iZXIgb25seSB0aGUgcmVhbCBkaWZmcwotCQkJCQl1cGRhdGVEaWZmQmFja2dyb3VuZChkaWZmKTsKLQkJCi0JCQkJCWlmIChzID09IG51bGwpCi0JCQkJCQlzPSBleHRyYWN0MihsRG9jLCBzbGVmdCwgZXMubGVmdFN0YXJ0KCksIGVzLmxlZnRMZW5ndGgoKSk7Ci0JCQkJCWlmIChkID09IG51bGwpCi0JCQkJCQlkPSBleHRyYWN0MihyRG9jLCBzcmlnaHQsIGVzLnJpZ2h0U3RhcnQoKSwgZXMucmlnaHRMZW5ndGgoKSk7Ci0JCQkJCQotCQkJCQlpZiAocy5sZW5ndGgoKSA+IDAgJiYgZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWlmIChhID09IG51bGwgJiYgc2FuY2VzdG9yICE9IG51bGwpCi0JCQkJCQkJYT0gZXh0cmFjdDIoYURvYywgc2FuY2VzdG9yLCBlcy5hbmNlc3RvclN0YXJ0KCksIGVzLmFuY2VzdG9yTGVuZ3RoKCkpOwotCQkJCQkJaWYgKFVTRV9NRVJHSU5HX1RPS0VOX0RJRkYpCi0JCQkJCQkJbWVyZ2luZ1Rva2VuRGlmZihkaWZmLCBhRG9jLCBhLCByRG9jLCBkLCBsRG9jLCBzKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzaW1wbGVUb2tlbkRpZmYoZGlmZiwgYURvYywgYSwgckRvYywgZCwgbERvYywgcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICghZlN1YkRvYyAmJiByUmVnaW9uICE9IG51bGwgJiYgbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyB3ZSBoYXZlIHRvIGFkZCBhIGRpZmYgZm9yIHRoZSBpZ25vcmVkIGxpbmVzCi0JCQkKLQkJCWludCBhRW5kPSAwOwotCQkJaW50IGFMZW49IDA7Ci0JCQlpZiAoYVJlZ2lvbiAhPSBudWxsICYmIGFEb2MgIT0gbnVsbCkgewotCQkJCWFFbmQ9IGFSZWdpb24uZ2V0T2Zmc2V0KCkrYVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQlhTGVuPSBhRG9jLmdldExlbmd0aCgpOwotCQkJfQotCQkJRGlmZiBkaWZmPSBuZXcgRGlmZihudWxsLCBSYW5nZURpZmZlcmVuY2UuTk9DSEFOR0UsCi0JCQkJYURvYywgYVJlZ2lvbiwgYUVuZCwgYUxlbiwKLQkJCQlsRG9jLCBsUmVnaW9uLCBsUmVnaW9uLmdldE9mZnNldCgpK2xSZWdpb24uZ2V0TGVuZ3RoKCksIGxEb2MuZ2V0TGVuZ3RoKCksCi0JCQkJckRvYywgclJlZ2lvbiwgclJlZ2lvbi5nZXRPZmZzZXQoKStyUmVnaW9uLmdldExlbmd0aCgpLCByRG9jLmdldExlbmd0aCgpKTsKLQkJCWZBbGxEaWZmcy5hZGQoZGlmZik7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIERpZmYgZmluZERpZmYoY2hhciB0eXBlLCBpbnQgcG9zKSB7Ci0JCQkJCQkJCQotCQlJRG9jdW1lbnQgYURvYz0gbnVsbDsKLQkJSURvY3VtZW50IGxEb2M9IGZMZWZ0LmdldERvY3VtZW50KCk7Ci0JCUlEb2N1bWVudCByRG9jPSBmUmlnaHQuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGxEb2MgPT0gbnVsbCB8fCByRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlQb3NpdGlvbiBhUmVnaW9uPSBudWxsOwotCQlQb3NpdGlvbiBsUmVnaW9uPSBudWxsOwotCQlQb3NpdGlvbiByUmVnaW9uPSBudWxsOwotCQkJCQotCQlib29sZWFuIHRocmVlV2F5PSBpc1RocmVlV2F5KCk7Ci0JCQotCQlpZiAodGhyZWVXYXkgJiYgIWZJZ25vcmVBbmNlc3RvcikKLQkJCWFEb2M9IGZBbmNlc3Rvci5nZXREb2N1bWVudCgpOwotCi0JCWJvb2xlYW4gaWdub3JlV2hpdGVTcGFjZT0gVXRpbGl0aWVzLmdldEJvb2xlYW4oZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKSwgQ29tcGFyZUNvbmZpZ3VyYXRpb24uSUdOT1JFX1dISVRFU1BBQ0UsIGZhbHNlKTsJCQotCQkKLQkJRG9jTGluZUNvbXBhcmF0b3Igc3JpZ2h0PSBuZXcgRG9jTGluZUNvbXBhcmF0b3IockRvYywgdG9SZWdpb24oclJlZ2lvbiksIGlnbm9yZVdoaXRlU3BhY2UpOwotCQlEb2NMaW5lQ29tcGFyYXRvciBzbGVmdD0gbmV3IERvY0xpbmVDb21wYXJhdG9yKGxEb2MsIHRvUmVnaW9uKGxSZWdpb24pLCBpZ25vcmVXaGl0ZVNwYWNlKTsKLQkJRG9jTGluZUNvbXBhcmF0b3Igc2FuY2VzdG9yPSBudWxsOwotCQlpZiAoYURvYyAhPSBudWxsKQotCQkJc2FuY2VzdG9yPSBuZXcgRG9jTGluZUNvbXBhcmF0b3IoYURvYywgdG9SZWdpb24oYVJlZ2lvbiksIGlnbm9yZVdoaXRlU3BhY2UpOwotCQkJCi0JCWZpbmFsIFJlc291cmNlQnVuZGxlIGJ1bmRsZT0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJCQotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQ9IG5ldyBPYmplY3RbMV07Ci0JCWZpbmFsIERvY0xpbmVDb21wYXJhdG9yIHNhPSBzYW5jZXN0b3IsIHNsPSBzbGVmdCwgc3I9IHNyaWdodDsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQlTdHJpbmcgcHJvZ3Jlc3NUaXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZyhidW5kbGUsICJjb21wYXJlUHJvZ3Jlc3NUYXNrLnRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQltb25pdG9yLmJlZ2luVGFzayhwcm9ncmVzc1RpdGxlLCBtYXhXb3JrKHNhLCBzbCwgc3IpKTsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHRbMF09IFJhbmdlRGlmZmVyZW5jZXIuZmluZFJhbmdlcyhtb25pdG9yLCBzYSwgc2wsIHNyKTsKLQkJCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGV4KSB7Ci0JCQkJCVN5c3RlbS5nYygpOwotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkJeyAvLyBjYW5jZWxsZWQKLQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZT0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCi0JCVJhbmdlRGlmZmVyZW5jZVtdIGU9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9ncmVzc1NlcnZpY2UucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJCWU9IChSYW5nZURpZmZlcmVuY2VbXSkgcmVzdWx0WzBdOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAidG9vQ29tcGxleEVycm9yLnRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAidG9vQ29tcGxleEVycm9yLmZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbXNnPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBPYmplY3RbXSB7IEludGVnZXIudG9TdHJpbmcocHJvZ3Jlc3NTZXJ2aWNlLmdldExvbmdPcGVyYXRpb25UaW1lKCkvMTAwMCkgfSApOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZkNvbXBvc2l0ZS5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnKTsKLQkJCWU9IG51bGw7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyAKLQkJfQotCQkJCQkKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHsKLQkJCQlSYW5nZURpZmZlcmVuY2UgZXM9IGVbaV07Ci0JCQkJCi0JCQkJaW50IGtpbmQ9IGVzLmtpbmQoKTsKLQkJCQkKLQkJCQlpbnQgYW5jZXN0b3JTdGFydD0gMDsKLQkJCQlpbnQgYW5jZXN0b3JFbmQ9IDA7Ci0JCQkJaWYgKHNhbmNlc3RvciAhPSBudWxsKSB7Ci0JCQkJCWFuY2VzdG9yU3RhcnQ9IHNhbmNlc3Rvci5nZXRUb2tlblN0YXJ0KGVzLmFuY2VzdG9yU3RhcnQoKSk7Ci0JCQkJCWFuY2VzdG9yRW5kPSBnZXRUb2tlbkVuZDIoc2FuY2VzdG9yLCBlcy5hbmNlc3RvclN0YXJ0KCksIGVzLmFuY2VzdG9yTGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkKLQkJCQlpbnQgbGVmdFN0YXJ0PSBzbGVmdC5nZXRUb2tlblN0YXJ0KGVzLmxlZnRTdGFydCgpKTsKLQkJCQlpbnQgbGVmdEVuZD0gZ2V0VG9rZW5FbmQyKHNsZWZ0LCBlcy5sZWZ0U3RhcnQoKSwgZXMubGVmdExlbmd0aCgpKTsKLQkJCQkKLQkJCQlpbnQgcmlnaHRTdGFydD0gc3JpZ2h0LmdldFRva2VuU3RhcnQoZXMucmlnaHRTdGFydCgpKTsKLQkJCQlpbnQgcmlnaHRFbmQ9IGdldFRva2VuRW5kMihzcmlnaHQsIGVzLnJpZ2h0U3RhcnQoKSwgZXMucmlnaHRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJRGlmZiBkaWZmPSBuZXcgRGlmZihudWxsLCBraW5kLAotCQkJCQlhRG9jLCBhUmVnaW9uLCBhbmNlc3RvclN0YXJ0LCBhbmNlc3RvckVuZCwKLQkJCQkJbERvYywgbFJlZ2lvbiwgbGVmdFN0YXJ0LCBsZWZ0RW5kLAotCQkJCQlyRG9jLCByUmVnaW9uLCByaWdodFN0YXJ0LCByaWdodEVuZCk7CQotCi0JCQkJaWYgKGRpZmYuaXNJblJhbmdlKHR5cGUsIHBvcykpCi0JCQkJCXJldHVybiBkaWZmOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYga2luZCBvZiBjaGFuZ2Ugc2hvdWxkIGJlIHNob3duLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB1c2VDaGFuZ2UoaW50IGtpbmQpIHsKLQkJaWYgKGtpbmQgPT0gUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoa2luZCA9PSBSYW5nZURpZmZlcmVuY2UuQU5DRVNUT1IpCi0JCQlyZXR1cm4gZlNob3dQc2V1ZG9Db25mbGljdHM7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRUb2tlbkVuZChJVG9rZW5Db21wYXJhdG9yIHRjLCBpbnQgc3RhcnQsIGludCBjb3VudCkgewotCQlpZiAoY291bnQgPD0gMCkKLQkJCXJldHVybiB0Yy5nZXRUb2tlblN0YXJ0KHN0YXJ0KTsKLQkJaW50IGluZGV4PSBzdGFydCArIGNvdW50IC0gMTsKLQkJcmV0dXJuIHRjLmdldFRva2VuU3RhcnQoaW5kZXgpICsgdGMuZ2V0VG9rZW5MZW5ndGgoaW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VG9rZW5FbmQyKElUb2tlbkNvbXBhcmF0b3IgdGMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGMuZ2V0VG9rZW5TdGFydChzdGFydCArIGxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIGxpbmVzIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UgYXMgYSBTdHJpbmcuCi0JICogVGhpcyBpbmNsdWRlcyB0aGUgbGluZSBzZXBhcmF0b3JzLgotCSAqCi0JICogQHBhcmFtIGRvYyB0aGUgZG9jdW1lbnQgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBjaGFyYWN0ZXJzCi0JICogQHBhcmFtIHN0YXJ0IGluZGV4IG9mIGZpcnN0IGxpbmUKLQkgKiBAcGFyYW0gbGVuZ3RoIG51bWJlciBvZiBsaW5lcwotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgbGluZSByYW5nZSBhcyBhIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3QyKElEb2N1bWVudCBkb2MsIElUb2tlbkNvbXBhcmF0b3IgdGMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpbnQgY291bnQ9IHRjLmdldFJhbmdlQ291bnQoKTsKLQkJaWYgKGxlbmd0aCA+IDAgJiYgY291bnQgPiAwKSB7Ci0JCQkKLS8vCQkJCi0vLwkJCWludCBzdGFydFBvcz0gdGMuZ2V0VG9rZW5TdGFydChzdGFydCk7Ci0vLwkJCWludCBlbmRQb3M9IHN0YXJ0UG9zOwotLy8JCQkKLS8vCQkJaWYgKGxlbmd0aCA+IDEpCi0vLwkJCQllbmRQb3M9IHRjLmdldFRva2VuU3RhcnQoc3RhcnQgKyAobGVuZ3RoLTEpKTsKLS8vCQkJZW5kUG9zKz0gdGMuZ2V0VG9rZW5MZW5ndGgoc3RhcnQgKyAobGVuZ3RoLTEpKTsKLS8vCQkJCQotCi0JCQlpbnQgc3RhcnRQb3M9IHRjLmdldFRva2VuU3RhcnQoc3RhcnQpOwotCQkJaW50IGVuZFBvczsKLQkJCQotCQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQkJZW5kUG9zPSBzdGFydFBvcyArIHRjLmdldFRva2VuTGVuZ3RoKHN0YXJ0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZW5kUG9zPSB0Yy5nZXRUb2tlblN0YXJ0KHN0YXJ0ICsgbGVuZ3RoKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZG9jLmdldChzdGFydFBvcywgZW5kUG9zIC0gc3RhcnRQb3MpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogUGVyZm9ybXMgYSB0b2tlbiBiYXNlZCAzLXdheSBkaWZmIG9uIHRoZSBjaGFyYWN0ZXIgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBiYXNlRGlmZi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2ltcGxlVG9rZW5EaWZmKGZpbmFsIERpZmYgYmFzZURpZmYsCi0JCQkJSURvY3VtZW50IGFuY2VzdG9yRG9jLCBTdHJpbmcgYSwKLQkJCQlJRG9jdW1lbnQgcmlnaHREb2MsIFN0cmluZyBkLAotCQkJCUlEb2N1bWVudCBsZWZ0RG9jLCBTdHJpbmcgcykgewotCi0JCWludCBhbmNlc3RvclN0YXJ0PSAwOwotCQlJVG9rZW5Db21wYXJhdG9yIHNhPSBudWxsOwotCQlpZiAoYW5jZXN0b3JEb2MgIT0gbnVsbCkgewotCQkJYW5jZXN0b3JTdGFydD0gYmFzZURpZmYuZkFuY2VzdG9yUG9zLmdldE9mZnNldCgpOwotCQkJc2E9IGNyZWF0ZVRva2VuQ29tcGFyYXRvcihhKTsKLQkJfQotCQkKLQkJaW50IHJpZ2h0U3RhcnQ9IGJhc2VEaWZmLmZSaWdodFBvcy5nZXRPZmZzZXQoKTsJCi0JCUlUb2tlbkNvbXBhcmF0b3Igc209IGNyZWF0ZVRva2VuQ29tcGFyYXRvcihkKTsKLQkJCi0JCWludCBsZWZ0U3RhcnQ9IGJhc2VEaWZmLmZMZWZ0UG9zLmdldE9mZnNldCgpOwotCQlJVG9rZW5Db21wYXJhdG9yIHN5PSBjcmVhdGVUb2tlbkNvbXBhcmF0b3Iocyk7Ci0JCQotCQlSYW5nZURpZmZlcmVuY2VbXSBlPSBSYW5nZURpZmZlcmVuY2VyLmZpbmRSYW5nZXMoc2EsIHN5LCBzbSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7Ci0JCQlSYW5nZURpZmZlcmVuY2UgZXM9IGVbaV07Ci0JCQlpbnQga2luZD0gZXMua2luZCgpOwotCQkJaWYgKGtpbmQgIT0gUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFKSB7Ci0JCQkJCi0JCQkJaW50IGFuY2VzdG9yU3RhcnQyPSBhbmNlc3RvclN0YXJ0OwotCQkJCWludCBhbmNlc3RvckVuZDI9IGFuY2VzdG9yU3RhcnQ7Ci0JCQkJaWYgKGFuY2VzdG9yRG9jICE9IG51bGwpIHsKLQkJCQkJYW5jZXN0b3JTdGFydDIgKz0gc2EuZ2V0VG9rZW5TdGFydChlcy5hbmNlc3RvclN0YXJ0KCkpOwotCQkJCQlhbmNlc3RvckVuZDIgKz0gZ2V0VG9rZW5FbmQoc2EsIGVzLmFuY2VzdG9yU3RhcnQoKSwgZXMuYW5jZXN0b3JMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWludCBsZWZ0U3RhcnQyPSBsZWZ0U3RhcnQgKyBzeS5nZXRUb2tlblN0YXJ0KGVzLmxlZnRTdGFydCgpKTsKLQkJCQlpbnQgbGVmdEVuZDI9IGxlZnRTdGFydCArIGdldFRva2VuRW5kKHN5LCBlcy5sZWZ0U3RhcnQoKSwgZXMubGVmdExlbmd0aCgpKTsKLQkJCQkKLQkJCQlpbnQgcmlnaHRTdGFydDI9IHJpZ2h0U3RhcnQgKyBzbS5nZXRUb2tlblN0YXJ0KGVzLnJpZ2h0U3RhcnQoKSk7Ci0JCQkJaW50IHJpZ2h0RW5kMj0gcmlnaHRTdGFydCArIGdldFRva2VuRW5kKHNtLCBlcy5yaWdodFN0YXJ0KCksIGVzLnJpZ2h0TGVuZ3RoKCkpOwotCQkJCQotCQkJCURpZmYgZGlmZj0gbmV3IERpZmYoYmFzZURpZmYsIGtpbmQsCi0JCQkJCQlhbmNlc3RvckRvYywgbnVsbCwgYW5jZXN0b3JTdGFydDIsIGFuY2VzdG9yRW5kMiwKLQkJCQkJCWxlZnREb2MsIG51bGwsIGxlZnRTdGFydDIsIGxlZnRFbmQyLAotCQkJCQkJcmlnaHREb2MsIG51bGwsIHJpZ2h0U3RhcnQyLCByaWdodEVuZDIpOwotCQkJCQotCQkJCS8vIGVuc3VyZSB0aGF0IHRva2VuIGRpZmYgaXMgc21hbGxlciB0aGFuIGJhc2VkaWZmCi0JCQkJaW50IGxlZnRTPSBiYXNlRGlmZi5mTGVmdFBvcy5vZmZzZXQ7Ci0JCQkJaW50IGxlZnRFPSBiYXNlRGlmZi5mTGVmdFBvcy5vZmZzZXQrYmFzZURpZmYuZkxlZnRQb3MubGVuZ3RoOwotCQkJCWludCByaWdodFM9IGJhc2VEaWZmLmZSaWdodFBvcy5vZmZzZXQ7Ci0JCQkJaW50IHJpZ2h0RT0gYmFzZURpZmYuZlJpZ2h0UG9zLm9mZnNldCtiYXNlRGlmZi5mUmlnaHRQb3MubGVuZ3RoOwotCQkJCWlmIChsZWZ0UyAhPSBsZWZ0U3RhcnQyIHx8IGxlZnRFICE9IGxlZnRFbmQyIHx8Ci0JCQkJCQkJcmlnaHRTICE9IHJpZ2h0U3RhcnQyIHx8IHJpZ2h0RSAhPSByaWdodEVuZDIpIHsKLQkJCQkJZGlmZi5mSXNUb2tlbj0gdHJ1ZTsKLQkJCQkJLy8gYWRkIHRvIGJhc2UgRGlmZgotCQkJCQliYXNlRGlmZi5hZGQoZGlmZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogUGVyZm9ybXMgYSAic21hcnQiIHRva2VuIGJhc2VkIDMtd2F5IGRpZmYgb24gdGhlIGNoYXJhY3RlciByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGJhc2VEaWZmLgotCSAqIEl0IGlzICJzbWFydCIgYmVjYXVzZSBpdCB0cmllcyB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHRva2VuIGRpZmZzIGJ5IG1lcmdpbmcgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWVyZ2luZ1Rva2VuRGlmZihEaWZmIGJhc2VEaWZmLCAKLQkJCQlJRG9jdW1lbnQgYW5jZXN0b3JEb2MsIFN0cmluZyBhLAotCQkJCUlEb2N1bWVudCByaWdodERvYywgU3RyaW5nIGQsCi0JCQkJSURvY3VtZW50IGxlZnREb2MsIFN0cmluZyBzKSB7Ci0JCUlUb2tlbkNvbXBhcmF0b3Igc2E9IG51bGw7Ci0JCWludCBhbmNlc3RvclN0YXJ0PSAwOwotCQlpZiAoYW5jZXN0b3JEb2MgIT0gbnVsbCkgewotCQkJc2E9IGNyZWF0ZVRva2VuQ29tcGFyYXRvcihhKTsKLQkJCWFuY2VzdG9yU3RhcnQ9IGJhc2VEaWZmLmZBbmNlc3RvclBvcy5nZXRPZmZzZXQoKTsKLQkJfQotCQkKLQkJaW50IHJpZ2h0U3RhcnQ9IGJhc2VEaWZmLmZSaWdodFBvcy5nZXRPZmZzZXQoKTsJCi0JCUlUb2tlbkNvbXBhcmF0b3Igc209IGNyZWF0ZVRva2VuQ29tcGFyYXRvcihkKTsKLQkJCi0JCWludCBsZWZ0U3RhcnQ9IGJhc2VEaWZmLmZMZWZ0UG9zLmdldE9mZnNldCgpOwotCQlJVG9rZW5Db21wYXJhdG9yIHN5PSBjcmVhdGVUb2tlbkNvbXBhcmF0b3Iocyk7Ci0JCQotCQlSYW5nZURpZmZlcmVuY2VbXSByPSBSYW5nZURpZmZlcmVuY2VyLmZpbmRSYW5nZXMoc2EsIHN5LCBzbSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSB7Ci0JCQlSYW5nZURpZmZlcmVuY2UgIGVzPSByW2ldOwotCQkJLy8gZGV0ZXJtaW5lIHJhbmdlIG9mIGRpZmZzIGluIG9uZSBsaW5lCi0JCQlpbnQgc3RhcnQ9IGk7Ci0JCQlpbnQgbGVmdExpbmU9IC0xOwotCQkJaW50IHJpZ2h0TGluZT0gLTE7Ci0JCQl0cnkgewotCQkJCWxlZnRMaW5lPSBsZWZ0RG9jLmdldExpbmVPZk9mZnNldChsZWZ0U3RhcnQrc3kuZ2V0VG9rZW5TdGFydChlcy5sZWZ0U3RhcnQoKSkpOwotCQkJCXJpZ2h0TGluZT0gcmlnaHREb2MuZ2V0TGluZU9mT2Zmc2V0KHJpZ2h0U3RhcnQrc20uZ2V0VG9rZW5TdGFydChlcy5yaWdodFN0YXJ0KCkpKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCQlpKys7Ci0JCQlmb3IgKDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKLQkJCQllcz0gcltpXTsKLQkJCQl0cnkgewotCQkJCQlpZiAobGVmdExpbmUgIT0gbGVmdERvYy5nZXRMaW5lT2ZPZmZzZXQobGVmdFN0YXJ0K3N5LmdldFRva2VuU3RhcnQoZXMubGVmdFN0YXJ0KCkpKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAocmlnaHRMaW5lICE9IHJpZ2h0RG9jLmdldExpbmVPZk9mZnNldChyaWdodFN0YXJ0K3NtLmdldFRva2VuU3RhcnQoZXMucmlnaHRTdGFydCgpKSkpCi0JCQkJCQlicmVhazsKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgZW5kPSBpOwotCQkJCi0JCQkvLyBmaW5kIGZpcnN0IGRpZmYgZnJvbSBsZWZ0Ci0JCQlSYW5nZURpZmZlcmVuY2UgZmlyc3Q9IG51bGw7Ci0JCQlmb3IgKGludCBpaT0gc3RhcnQ7IGlpIDwgZW5kOyBpaSsrKSB7Ci0JCQkJZXM9IHJbaWldOwotCQkJCWlmICh1c2VDaGFuZ2UoZXMua2luZCgpKSkgewotCQkJCQlmaXJzdD0gZXM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZmluZCBmaXJzdCBkaWZmIGZyb20gbWluZQotCQkJUmFuZ2VEaWZmZXJlbmNlIGxhc3Q9IG51bGw7Ci0JCQlmb3IgKGludCBpaT0gZW5kLTE7IGlpID49IHN0YXJ0OyBpaS0tKSB7Ci0JCQkJZXM9IHJbaWldOwotCQkJCWlmICh1c2VDaGFuZ2UoZXMua2luZCgpKSkgewotCQkJCQlsYXN0PSBlczsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZmlyc3QgIT0gbnVsbCAmJiBsYXN0ICE9IG51bGwpIHsKLQkJCQkKLQkJCQlpbnQgYW5jZXN0b3JTdGFydDI9IDA7Ci0JCQkJaW50IGFuY2VzdG9yRW5kMj0gMDsKLQkJCQlpZiAoYW5jZXN0b3JEb2MgIT0gbnVsbCkgewotCQkJCQlhbmNlc3RvclN0YXJ0Mj0gYW5jZXN0b3JTdGFydCtzYS5nZXRUb2tlblN0YXJ0KGZpcnN0LmFuY2VzdG9yU3RhcnQoKSk7Ci0JCQkJCWFuY2VzdG9yRW5kMj0gYW5jZXN0b3JTdGFydCtnZXRUb2tlbkVuZChzYSwgbGFzdC5hbmNlc3RvclN0YXJ0KCksIGxhc3QuYW5jZXN0b3JMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWludCBsZWZ0U3RhcnQyPSBsZWZ0U3RhcnQrc3kuZ2V0VG9rZW5TdGFydChmaXJzdC5sZWZ0U3RhcnQoKSk7Ci0JCQkJaW50IGxlZnRFbmQyPSBsZWZ0U3RhcnQrZ2V0VG9rZW5FbmQoc3ksIGxhc3QubGVmdFN0YXJ0KCksIGxhc3QubGVmdExlbmd0aCgpKTsKLQkJCQkKLQkJCQlpbnQgcmlnaHRTdGFydDI9IHJpZ2h0U3RhcnQrc20uZ2V0VG9rZW5TdGFydChmaXJzdC5yaWdodFN0YXJ0KCkpOwotCQkJCWludCByaWdodEVuZDI9IHJpZ2h0U3RhcnQrZ2V0VG9rZW5FbmQoc20sIGxhc3QucmlnaHRTdGFydCgpLCBsYXN0LnJpZ2h0TGVuZ3RoKCkpOwotCQkJCURpZmYgZGlmZj0gbmV3IERpZmYoYmFzZURpZmYsIGZpcnN0LmtpbmQoKSwKLQkJCQkJCQlhbmNlc3RvckRvYywgbnVsbCwgYW5jZXN0b3JTdGFydDIsIGFuY2VzdG9yRW5kMisxLAotCQkJCQkJCWxlZnREb2MsIG51bGwsIGxlZnRTdGFydDIsIGxlZnRFbmQyKzEsCi0JCQkJCQkJcmlnaHREb2MsIG51bGwsIHJpZ2h0U3RhcnQyLCByaWdodEVuZDIrMSk7CQotCQkJCWRpZmYuZklzVG9rZW49IHRydWU7Ci0JCQkJYmFzZURpZmYuYWRkKGRpZmYpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vLS0tLSB1cGRhdGUgVUkgc3R1ZmYKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCQotCQlib29sZWFuIGxlZnRUb1JpZ2h0PSBmYWxzZTsKLQkJYm9vbGVhbiByaWdodFRvTGVmdD0gZmFsc2U7Ci0JCQotCQl1cGRhdGVTdGF0dXMoZkN1cnJlbnREaWZmKTsKLQkJdXBkYXRlUmVzb2x2ZVN0YXR1cygpOwotCi0JCWlmIChmQ3VycmVudERpZmYgIT0gbnVsbCkgewotCQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNwPSBnZXRNZXJnZUNvbnRlbnRQcm92aWRlcigpOwotCQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCQlyaWdodFRvTGVmdD0gY3AuaXNMZWZ0RWRpdGFibGUoZ2V0SW5wdXQoKSk7Ci0JCQkJbGVmdFRvUmlnaHQ9IGNwLmlzUmlnaHRFZGl0YWJsZShnZXRJbnB1dCgpKTsKLQkJCX0JCQkKLQkJfQotCQkKLQkJaWYgKGZEaXJlY3Rpb25MYWJlbCAhPSBudWxsKSB7Ci0JCQlpZiAoZkhpZ2hsaWdodFJhbmdlcyAmJiBmQ3VycmVudERpZmYgIT0gbnVsbCAmJiBpc1RocmVlV2F5KCkgJiYgIWZJZ25vcmVBbmNlc3RvcikgewotCQkJCWZEaXJlY3Rpb25MYWJlbC5zZXRJbWFnZShmQ3VycmVudERpZmYuZ2V0SW1hZ2UoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWZEaXJlY3Rpb25MYWJlbC5zZXRJbWFnZShudWxsKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbSAhPSBudWxsKQotCQkJKChBY3Rpb24pZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtLmdldEFjdGlvbigpKS5zZXRFbmFibGVkKGxlZnRUb1JpZ2h0KTsKLQkJaWYgKGZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbSAhPSBudWxsKQotCQkJKChBY3Rpb24pZkNvcHlEaWZmUmlnaHRUb0xlZnRJdGVtLmdldEFjdGlvbigpKS5zZXRFbmFibGVkKHJpZ2h0VG9MZWZ0KTsKLQkJCQotCQlib29sZWFuIGVuYWJsZU5hdmlnYXRpb249IGZhbHNlOwotCQlpZiAoZkN1cnJlbnREaWZmID09IG51bGwgJiYgZkNoYW5nZURpZmZzICE9IG51bGwgJiYgZkNoYW5nZURpZmZzLnNpemUoKSA+IDApCi0JCQllbmFibGVOYXZpZ2F0aW9uPSB0cnVlOwotCQllbHNlIGlmIChmQ2hhbmdlRGlmZnMgIT0gbnVsbCAmJiBmQ2hhbmdlRGlmZnMuc2l6ZSgpID4gMSkKLQkJCWVuYWJsZU5hdmlnYXRpb249IHRydWU7Ci0JCWVsc2UgaWYgKGZDdXJyZW50RGlmZiAhPSBudWxsICYmIGZDdXJyZW50RGlmZi5mRGlmZnMgIT0gbnVsbCkKLQkJCWVuYWJsZU5hdmlnYXRpb249IHRydWU7Ci0JCWVsc2UgaWYgKGZDdXJyZW50RGlmZiAhPSBudWxsICYmIGZDdXJyZW50RGlmZi5mSXNUb2tlbikKLQkJCWVuYWJsZU5hdmlnYXRpb249IHRydWU7Ci0JCQotCQlpZiAoZk5leHRJdGVtICE9IG51bGwpIHsKLQkJCUlBY3Rpb24gYT0gZk5leHRJdGVtLmdldEFjdGlvbigpOwotCQkJYS5zZXRFbmFibGVkKGVuYWJsZU5hdmlnYXRpb24pOwotCQl9Ci0JCWlmIChmUHJldmlvdXNJdGVtICE9IG51bGwpIHsKLQkJCUlBY3Rpb24gYT0gZlByZXZpb3VzSXRlbS5nZXRBY3Rpb24oKTsKLQkJCWEuc2V0RW5hYmxlZChlbmFibGVOYXZpZ2F0aW9uKTsKLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlc29sdmVTdGF0dXMoKSB7Ci0JCQkKLQkJUkdCIHJnYj0gbnVsbDsKLQkJCi0JCWlmIChzaG93UmVzb2x2ZVVJKCkpIHsKLQkJCS8vIHdlIG9ubHkgc2hvdyByZWQgb3IgZ3JlZW4gaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGluY29taW5nIG9yIGNvbmZsaWN0aW5nIGNoYW5nZQotCQkJaW50IGluY29taW5nT3JDb25mbGljdGluZz0gMDsKLQkJCWludCB1bnJlc29sdmVkSW5jb21pbmc9IDA7Ci0JCQlpbnQgdW5yZXNvbHZlZENvbmZsaWN0aW5nPSAwOwotCi0JCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBlPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQkJRGlmZiBkPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJCWlmIChkLmlzSW5jb21pbmdPckNvbmZsaWN0aW5nKCkgLyogJiYgdXNlQ2hhbmdlKGQuZkRpcmVjdGlvbikgJiYgIWQuZklzV2hpdGVzcGFjZSAqLykgewotCQkJCQkJaW5jb21pbmdPckNvbmZsaWN0aW5nKys7Ci0JCQkJCQlpZiAoIWQuZlJlc29sdmVkKSB7Ci0JCQkJCQkJaWYgKGQuZkRpcmVjdGlvbiA9PSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1QpIHsKLQkJCQkJCQkJdW5yZXNvbHZlZENvbmZsaWN0aW5nKys7Ci0JCQkJCQkJCWJyZWFrOyAvLyB3ZSBjYW4gc3RvcCBoZXJlIGJlY2F1c2UgYSBjb25mbGljdCBoYXMgdGhlIG1heGltdW0gcHJpb3JpdHkKLQkJCQkJCQl9Ci0JCQkJCQkJdW5yZXNvbHZlZEluY29taW5nKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQotCQkJaWYgKGluY29taW5nT3JDb25mbGljdGluZyA+IDApIHsKLQkJCQlpZiAodW5yZXNvbHZlZENvbmZsaWN0aW5nID4gMCkKLQkJCQkJcmdiPSBTRUxFQ1RFRF9DT05GTElDVDsKLQkJCQllbHNlIGlmICh1bnJlc29sdmVkSW5jb21pbmcgPiAwKQotCQkJCQlyZ2I9IFNFTEVDVEVEX0lOQ09NSU5HOwotCQkJCWVsc2UKLQkJCQkJcmdiPSBSRVNPTFZFRDsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGZIZWFkZXJQYWludGVyLnNldENvbG9yKHJnYikpCi0JCQlmU3VtbWFyeUhlYWRlci5yZWRyYXcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKERpZmYgZGlmZikgewotCQkKLQkJaWYgKCEgZlNob3dNb3JlSW5mbykKLQkJCXJldHVybjsKLQkJCi0JCUlBY3Rpb25CYXJzIGJhcnM9IFV0aWxpdGllcy5maW5kQWN0aW9uQmFycyhmQ29tcG9zaXRlKTsKLQkJaWYgKGJhcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHNsbT0gYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoc2xtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkJCQotCQlTdHJpbmcgZGlmZkRlc2NyaXB0aW9uOwotCQkKLQkJaWYgKGRpZmYgPT0gbnVsbCkgewotCQkJZGlmZkRlc2NyaXB0aW9uPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuZGlmZkRlc2NyaXB0aW9uLm5vRGlmZi5mb3JtYXQiKTsJLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJCi0JCQlpZiAoZGlmZi5mSXNUb2tlbikJCS8vIHdlIGRvbid0IHNob3cgc3BlY2lhbCBpbmZvIGZvciB0b2tlbiBkaWZmcwotCQkJCWRpZmY9IGRpZmYuZlBhcmVudDsKLQkJCi0JCQlTdHJpbmcgZm9ybWF0PSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuZGlmZkRlc2NyaXB0aW9uLmRpZmYuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJCWRpZmZEZXNjcmlwdGlvbj0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCAKLQkJCQluZXcgU3RyaW5nW10gewotCQkJCQlnZXREaWZmVHlwZShkaWZmKSwJCQkJCQkvLyAwOiBkaWZmIHR5cGUKLQkJCQkJZ2V0RGlmZk51bWJlcihkaWZmKSwJCQkJCS8vIDE6IGRpZmYgbnVtYmVyCi0JCQkJCWdldERpZmZSYW5nZShmTGVmdCwgZGlmZi5mTGVmdFBvcyksCQkvLyAyOiBsZWZ0IHN0YXJ0IGxpbmUKLQkJCQkJZ2V0RGlmZlJhbmdlKGZSaWdodCwgZGlmZi5mUmlnaHRQb3MpCS8vIDM6IGxlZnQgZW5kIGxpbmUKLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlTdHJpbmcgZm9ybWF0PSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuc3RhdHVzTGluZS5mb3JtYXQiKTsJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcz0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCAKLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJZ2V0Q3Vyc29yUG9zaXRpb24oZkxlZnQpLAkvLyAwOiBsZWZ0IGNvbHVtbgotCQkJCWdldEN1cnNvclBvc2l0aW9uKGZSaWdodCksCS8vIDE6IHJpZ2h0IGNvbHVtbgotCQkJCWRpZmZEZXNjcmlwdGlvbgkJCQkvLyAyOiBkaWZmIGRlc2NyaXB0aW9uCi0JCQl9Ci0JCSk7Ci0JCi0JCXNsbS5zZXRNZXNzYWdlKHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclN0YXR1cygpIHsKLQkJCi0JCUlBY3Rpb25CYXJzIGJhcnM9IFV0aWxpdGllcy5maW5kQWN0aW9uQmFycyhmQ29tcG9zaXRlKTsKLQkJaWYgKGJhcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHNsbT0gYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoc2xtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkJCQkKLQkJc2xtLnNldE1lc3NhZ2UobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERpZmZUeXBlKERpZmYgZGlmZikgewotCQlTdHJpbmcgcz0gIiI7IAkvLyROT04tTkxTLTEkCi0JCXN3aXRjaChkaWZmLmZEaXJlY3Rpb24pIHsKLQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuTEVGVDoKLQkJCXM9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5kaXJlY3Rpb24ub3V0Z29pbmciKTsJLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotCQkJcz0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmRpcmVjdGlvbi5pbmNvbWluZyIpOwkvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1Q6Ci0JCQlzPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuZGlyZWN0aW9uLmNvbmZsaWN0aW5nIik7CS8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwotCQl9Ci0JCVN0cmluZyBmb3JtYXQ9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5kaWZmVHlwZS5mb3JtYXQiKTsJLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10geyBzLCBkaWZmLmNoYW5nZVR5cGUoKSB9ICk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERpZmZOdW1iZXIoRGlmZiBkaWZmKSB7Ci0JCS8vIGZpbmQgdGhlIGRpZmYncyBudW1iZXIKLQkJaW50IGRpZmZOdW1iZXI9IDA7Ci0JCWlmIChmQ2hhbmdlRGlmZnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlEaWZmIGQ9IChEaWZmKSBlLm5leHQoKTsKLQkJCQlkaWZmTnVtYmVyKys7Ci0JCQkJaWYgKGQgPT0gZGlmZikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoZGlmZk51bWJlcik7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERpZmZSYW5nZShNZXJnZVNvdXJjZVZpZXdlciB2LCBQb3NpdGlvbiBwb3MpIHsKLQkJUG9pbnQgcD0gdi5nZXRMaW5lUmFuZ2UocG9zLCBuZXcgUG9pbnQoMCwgMCkpOwotCQlpbnQgc3RhcnRMaW5lPSBwLngrMTsKLQkJaW50IGVuZExpbmU9IHAueCtwLnk7Ci0JCQotCQlTdHJpbmcgZm9ybWF0OwotCQlpZiAoZW5kTGluZSA8IHN0YXJ0TGluZSkKLQkJCWZvcm1hdD0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmJlZm9yZUxpbmUuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJZm9ybWF0PSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIucmFuZ2UuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhzdGFydExpbmUpLAotCQkJCQkJCQkJSW50ZWdlci50b1N0cmluZyhlbmRMaW5lKSB9ICk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJzb3IgcG9zaXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJzb3IgcG9zaXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDdXJzb3JQb3NpdGlvbihNZXJnZVNvdXJjZVZpZXdlciB2KSB7Ci0JCWlmICh2ICE9IG51bGwpIHsKLQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dD0gdi5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkKLQkJCUlEb2N1bWVudCBkb2N1bWVudD0gdi5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0PSB2LmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgY2FyZXQ9IG9mZnNldCArIHN0eWxlZFRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQkKLQkJCQkJaW50IGxpbmU9ZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGNhcmV0KTsKLQkJCQkJCi0JCQkJCWludCBsaW5lT2Zmc2V0PSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJCQlpbnQgb2NjdXJyZW5jZXM9IDA7Ci0JCQkJCWZvciAoaW50IGk9IGxpbmVPZmZzZXQ7IGkgPCBjYXJldDsgaSsrKQotCQkJCQkJaWYgKCdcdCcgPT0gZG9jdW1lbnQuZ2V0Q2hhcihpKSkKLQkJCQkJCQkrKyBvY2N1cnJlbmNlczsKLQkJCQkJCQkKLQkJCQkJaW50IHRhYldpZHRoPSBzdHlsZWRUZXh0LmdldFRhYnMoKTsKLQkJCQkJaW50IGNvbHVtbj0gY2FyZXQgLSBsaW5lT2Zmc2V0ICsgKHRhYldpZHRoIC0xKSAqIG9jY3VycmVuY2VzOwotCQkJCQkKLQkJCQkJU3RyaW5nIGZvcm1hdD0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmN1cnNvclBvc2l0aW9uLmZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsCi0JCQkJCQluZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKGxpbmUgKyAxKSwgSW50ZWdlci50b1N0cmluZyhjb2x1bW4gKyAxKSB9ICk7Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIZWFkZXIoKSB7Ci0JCQotCQlzdXBlci51cGRhdGVIZWFkZXIoKTsKLQkJCQkKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgdGhlIHR3byBpdGVtcyBmb3IgY29weWluZyBhIGRpZmZlcmVuY2UgcmFuZ2UgZnJvbSBvbmUgc2lkZSB0byB0aGUgb3RoZXIgCi0JICogYW5kIGFkZHMgdGhlbSB0byB0aGUgZ2l2ZW4gdG9vbGJhciBtYW5hZ2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRvb2xJdGVtcyhUb29sQmFyTWFuYWdlciB0Ym0pIHsKLQotCQlJV29ya2JlbmNoUGFydFNpdGUgcHM9IFV0aWxpdGllcy5maW5kU2l0ZShmQ29tcG9zaXRlKTsKLQkJZktleUJpbmRpbmdTZXJ2aWNlPSBwcyAhPSBudWxsID8gcHMuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKSA6IG51bGw7Ci0JCQotCQlmaW5hbCBTdHJpbmcgaWdub3JlQW5jZXN0b3JBY3Rpb25LZXk9ICJhY3Rpb24uSWdub3JlQW5jZXN0b3IuIjsJLy8kTk9OLU5MUy0xJAotCQlBY3Rpb24gaWdub3JlQW5jZXN0b3JBY3Rpb249IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0SWdub3JlQW5jZXN0b3IoISBmSWdub3JlQW5jZXN0b3IpOwotCQkJCVV0aWxpdGllcy5pbml0VG9nZ2xlQWN0aW9uKHRoaXMsIGdldFJlc291cmNlQnVuZGxlKCksIGlnbm9yZUFuY2VzdG9yQWN0aW9uS2V5LCBmSWdub3JlQW5jZXN0b3IpOwotCQkJfQotCQl9OwotCQlpZ25vcmVBbmNlc3RvckFjdGlvbi5zZXRDaGVja2VkKGZJZ25vcmVBbmNlc3Rvcik7Ci0JCVV0aWxpdGllcy5pbml0QWN0aW9uKGlnbm9yZUFuY2VzdG9yQWN0aW9uLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCBpZ25vcmVBbmNlc3RvckFjdGlvbktleSk7Ci0JCVV0aWxpdGllcy5pbml0VG9nZ2xlQWN0aW9uKGlnbm9yZUFuY2VzdG9yQWN0aW9uLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCBpZ25vcmVBbmNlc3RvckFjdGlvbktleSwgZklnbm9yZUFuY2VzdG9yKTsKLQkJCi0JCWZJZ25vcmVBbmNlc3Rvckl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGlnbm9yZUFuY2VzdG9yQWN0aW9uKTsKLQkJZklnbm9yZUFuY2VzdG9ySXRlbS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdGJtLmFwcGVuZFRvR3JvdXAoIm1vZGVzIiwgZklnbm9yZUFuY2VzdG9ySXRlbSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJCQotCQlBY3Rpb24gYT0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluYXZpZ2F0ZSh0cnVlLCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJfTsKLQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oYSwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgImFjdGlvbi5OZXh0RGlmZi4iKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV4dEl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGEpOwotCQl0Ym0uYXBwZW5kVG9Hcm91cCgibmF2aWdhdGlvbiIsIGZOZXh0SXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJVXRpbGl0aWVzLnJlZ2lzdGVyQWN0aW9uKGZLZXlCaW5kaW5nU2VydmljZSwgYSwgIm9yZy5lY2xpcHNlLmNvbXBhcmUuc2VsZWN0TmV4dENoYW5nZSIpOwkvLyROT04tTkxTLTEkCi0JCQotCQlhPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5hdmlnYXRlKGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJfTsKLQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oYSwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgImFjdGlvbi5QcmV2RGlmZi4iKTsgLy8kTk9OLU5MUy0xJAotCQlmUHJldmlvdXNJdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhKTsKLQkJdGJtLmFwcGVuZFRvR3JvdXAoIm5hdmlnYXRpb24iLCBmUHJldmlvdXNJdGVtKTsgLy8kTk9OLU5MUy0xJAotCQlVdGlsaXRpZXMucmVnaXN0ZXJBY3Rpb24oZktleUJpbmRpbmdTZXJ2aWNlLCBhLCAib3JnLmVjbGlwc2UuY29tcGFyZS5zZWxlY3RQcmV2aW91c0NoYW5nZSIpOwkvLyROT04tTkxTLTEkCi0KLQkJCi0JCUNvbXBhcmVDb25maWd1cmF0aW9uIGNjPSBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQkKLQkJaWYgKGNjLmlzUmlnaHRFZGl0YWJsZSgpKSB7Ci0JCQlhPSBuZXcgQWN0aW9uKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY29weURpZmZMZWZ0VG9SaWdodCgpOwotCQkJCX0KLQkJCX07Ci0JCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihhLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCAiYWN0aW9uLkNvcHlEaWZmTGVmdFRvUmlnaHQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbT0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYSk7Ci0JCQlmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXRibS5hcHBlbmRUb0dyb3VwKCJtZXJnZSIsIGZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJCVV0aWxpdGllcy5yZWdpc3RlckFjdGlvbihmS2V5QmluZGluZ1NlcnZpY2UsIGEsICJvcmcuZWNsaXBzZS5jb21wYXJlLmNvcHlMZWZ0VG9SaWdodCIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWlmIChjYy5pc0xlZnRFZGl0YWJsZSgpKSB7Ci0JCQlhPSBuZXcgQWN0aW9uKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY29weURpZmZSaWdodFRvTGVmdCgpOwotCQkJCX0KLQkJCX07Ci0JCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihhLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCAiYWN0aW9uLkNvcHlEaWZmUmlnaHRUb0xlZnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbT0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYSk7Ci0JCQlmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXRibS5hcHBlbmRUb0dyb3VwKCJtZXJnZSIsIGZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJCVV0aWxpdGllcy5yZWdpc3RlckFjdGlvbihmS2V5QmluZGluZ1NlcnZpY2UsIGEsICJvcmcuZWNsaXBzZS5jb21wYXJlLmNvcHlSaWdodFRvTGVmdCIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyogcGFja2FnZSAqLyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCi0JCVN0cmluZyBrZXk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQotCQlpZiAoa2V5LmVxdWFscyhDb21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV0hJVEVTUEFDRSkKLQkJCQl8fCBrZXkuZXF1YWxzKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TSE9XX1BTRVVET19DT05GTElDVFMpKSB7Ci0JCQkJCQotCQkJZlNob3dQc2V1ZG9Db25mbGljdHM9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuU0hPV19QU0VVRE9fQ09ORkxJQ1RTKTsKLQkJCQotCQkJLy8gY2xlYXIgc3R1ZmYKLQkJCWZDdXJyZW50RGlmZj0gbnVsbDsKLQkJIAlmQ2hhbmdlRGlmZnM9IG51bGw7Ci0JCQlmQWxsRGlmZnM9IG51bGw7Ci0JCQkJCQotCQkJZG9EaWZmKCk7Ci0JCQkJCQotCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCWludmFsaWRhdGVMaW5lcygpOwotCQkJdXBkYXRlVlNjcm9sbEJhcigpOwotCQkJcmVmcmVzaEJpcmRzRXllVmlldygpOwotCQkJCi0JCQlzZWxlY3RGaXJzdERpZmYoKTsKLQkJCQotLy8JCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1NQTElORVMpKSB7Ci0vLwkJCWZVc2VTcGxpbmVzPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tcGFyZVByZWZlcmVuY2VQYWdlLlVTRV9TUExJTkVTKTsKLS8vCQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0KLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfU0lOR0xFX0xJTkUpKSB7Ci0JCQlmVXNlU2luZ2xlTGluZT0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfU0lOR0xFX0xJTkUpOwotLy8JCQlmVXNlUmVzb2x2ZVVJPSBmVXNlU2luZ2xlTGluZTsKLQkJCWZCYXNpY0NlbnRlckN1cnZlPSBudWxsOwotCQkJdXBkYXRlUmVzb2x2ZVN0YXR1cygpOwotCQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCi0vLwkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfUkVTT0xWRV9VSSkpIHsKLS8vCQkJZlVzZVJlc29sdmVVST0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfUkVTT0xWRV9VSSk7Ci0vLwkJCXVwZGF0ZVJlc29sdmVTdGF0dXMoKTsKLS8vCQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCQotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoZlN5bWJvbGljRm9udE5hbWUpKSB7Ci0JCQl1cGRhdGVGb250KCk7Ci0JCQlpbnZhbGlkYXRlTGluZXMoKTsKLQotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoSU5DT01JTkdfQ09MT1IpIHx8IGtleS5lcXVhbHMoT1VUR09JTkdfQ09MT1IpIHx8IGtleS5lcXVhbHMoQ09ORkxJQ1RJTkdfQ09MT1IpIHx8IGtleS5lcXVhbHMoUkVTT0xWRURfQ09MT1IpKSB7Ci0JCQl1cGRhdGVDb2xvcnMobnVsbCk7Ci0JCQlpbnZhbGlkYXRlTGluZXMoKTsKLQkJCQotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ29tcGFyZVByZWZlcmVuY2VQYWdlLlNZTkNIUk9OSVpFX1NDUk9MTElORykpIHsKLQkJCQotCQkJYm9vbGVhbiBiPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tcGFyZVByZWZlcmVuY2VQYWdlLlNZTkNIUk9OSVpFX1NDUk9MTElORyk7Ci0JCQlpZiAoYiAhPSBmU3luY2hyb25pemVkU2Nyb2xsaW5nKQotCQkJCXRvZ2dsZVN5bmNoTW9kZSgpOwotCQkKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TSE9XX01PUkVfSU5GTykpIHsKLQkJCQotCQkJYm9vbGVhbiBiPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tcGFyZVByZWZlcmVuY2VQYWdlLlNIT1dfTU9SRV9JTkZPKTsKLQkJCWlmIChiICE9IGZTaG93TW9yZUluZm8pIHsKLQkJCQlmU2hvd01vcmVJbmZvPSBiOwotCQkJCWlmIChmU2hvd01vcmVJbmZvKQotCQkJCQl1cGRhdGVTdGF0dXMoZkN1cnJlbnREaWZmKTsKLQkJCQllbHNlCi0JCQkJCWNsZWFyU3RhdHVzKCk7Ci0JCQl9Ci0JCQotCQl9IGVsc2UKLQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldElnbm9yZUFuY2VzdG9yKGJvb2xlYW4gaWdub3JlKSB7Ci0JCWlmIChpZ25vcmUgIT0gZklnbm9yZUFuY2VzdG9yKSB7Ci0JCQlmSWdub3JlQW5jZXN0b3I9IGlnbm9yZTsKLQkJCXNldEFuY2VzdG9yVmlzaWJpbGl0eShmYWxzZSwgIWZJZ25vcmVBbmNlc3Rvcik7Ci0JCQotCQkJLy8gY2xlYXIgc3R1ZmYKLQkJCWZDdXJyZW50RGlmZj0gbnVsbDsKLQkJIAlmQ2hhbmdlRGlmZnM9IG51bGw7Ci0JCQlmQWxsRGlmZnM9IG51bGw7Ci0JCQkJCQotCQkJZG9EaWZmKCk7Ci0JCQkJCQotCQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCQl1cGRhdGVWU2Nyb2xsQmFyKCk7Ci0JCQlyZWZyZXNoQmlyZHNFeWVWaWV3KCk7Ci0JCQkKLQkJCXNlbGVjdEZpcnN0RGlmZigpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3RGaXJzdERpZmYoKSB7Ci0JCQotCQlpZiAoZkxlZnQgPT0gbnVsbCB8fCBmUmlnaHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmTGVmdC5nZXREb2N1bWVudCgpID09IG51bGwgfHwgZlJpZ2h0LmdldERvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlEaWZmIGZpcnN0RGlmZj0gbnVsbDsKLQkJaWYgKENvbXBhcmVOYXZpZ2F0b3IuZ2V0RGlyZWN0aW9uKGZDb21wb3NpdGUpKQotCQkJZmlyc3REaWZmPSBmaW5kTmV4dChmUmlnaHQsIGZDaGFuZ2VEaWZmcywgLTEsIC0xLCBmYWxzZSk7Ci0JCWVsc2UKLQkJCWZpcnN0RGlmZj0gZmluZFByZXYoZlJpZ2h0LCBmQ2hhbmdlRGlmZnMsIDk5OTk5OTksIDk5OTk5OTksIGZhbHNlKTsKLQkJc2V0Q3VycmVudERpZmYoZmlyc3REaWZmLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZVN5bmNoTW9kZSgpIHsKLQkJZlN5bmNocm9uaXplZFNjcm9sbGluZz0gISBmU3luY2hyb25pemVkU2Nyb2xsaW5nOwotCQkKLQkJc2Nyb2xsVmVydGljYWwoMCwgMCwgMCwgbnVsbCk7Ci0JCQotCQkvLyB0aHJvdyBhd2F5IGNlbnRyYWwgY29udHJvbCAoU2FzaCBvciBDYW52YXMpCi0JCUNvbnRyb2wgY2VudGVyPSBnZXRDZW50ZXIoKTsKLQkJaWYgKGNlbnRlciAhPSBudWxsICYmICFjZW50ZXIuaXNEaXNwb3NlZCgpKQotCQkJY2VudGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWZMZWZ0LmdldFRleHRXaWRnZXQoKS5nZXRWZXJ0aWNhbEJhcigpLnNldFZpc2libGUoIWZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpOwotCQlmUmlnaHQuZ2V0VGV4dFdpZGdldCgpLmdldFZlcnRpY2FsQmFyKCkuc2V0VmlzaWJsZSghZlN5bmNocm9uaXplZFNjcm9sbGluZyk7Ci0KLQkJZkNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JfQotCQkJCQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUb29sSXRlbXMoKSB7Ci0JCQkJCQotCQlpZiAoZklnbm9yZUFuY2VzdG9ySXRlbSAhPSBudWxsKQotCQkJZklnbm9yZUFuY2VzdG9ySXRlbS5zZXRWaXNpYmxlKGlzVGhyZWVXYXkoKSk7Ci0JCQotCQlpZiAoZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtICE9IG51bGwpIHsKLQkJCUlBY3Rpb24gYT0gZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtLmdldEFjdGlvbigpOwotCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQlhLnNldEVuYWJsZWQoYS5pc0VuYWJsZWQoKSAmJiAhZkhhc0Vycm9ycyk7Ci0JCX0KLQkJaWYgKGZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbSAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGE9IGZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbS5nZXRBY3Rpb24oKTsKLQkJCWlmIChhICE9IG51bGwpCi0JCQkJYS5zZXRFbmFibGVkKGEuaXNFbmFibGVkKCkgJiYgIWZIYXNFcnJvcnMpOwotCQl9Ci0JCQotCQlzdXBlci51cGRhdGVUb29sSXRlbXMoKTsKLQl9Ci0JCi0JLy8tLS0tIHBhaW50aW5nIGxpbmVzCi0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpbmVzKElEb2N1bWVudCBkKSB7Ci0KLQkJYm9vbGVhbiBsZWZ0PSBmYWxzZTsKLQkJYm9vbGVhbiByaWdodD0gZmFsc2U7Ci0JCQotCQkvLyBGSVhNRTogdGhpcyBvcHRpbWl6YXRpb24gaXMgaW5jb3JyZWN0IGJlY2F1c2UKLQkJLy8gaXQgZG9lc24ndCB0YWtlIHJlcGxhY2Ugb3BlcmF0aW9ucyBpbnRvIGFjY291bnQgd2hlcmUKLQkJLy8gdGhlIG9sZCBhbmQgbmV3IGxpbmUgY291bnQgZG9lcyBub3QgZGlmZmVyCi0JCWlmIChkID09IGZMZWZ0LmdldERvY3VtZW50KCkpIHsKLQkJCWludCBsPSBmTGVmdC5nZXRMaW5lQ291bnQoKTsKLQkJCWxlZnQ9IGZMZWZ0TGluZUNvdW50ICE9IGw7Ci0JCQlmTGVmdExpbmVDb3VudD0gbDsKLQkJfSBlbHNlIGlmIChkID09IGZSaWdodC5nZXREb2N1bWVudCgpKSB7Ci0JCQlpbnQgbD0gZlJpZ2h0LmdldExpbmVDb3VudCgpOwotCQkJcmlnaHQ9IGZSaWdodExpbmVDb3VudCAhPSBsOwotCQkJZlJpZ2h0TGluZUNvdW50PSBsOwotCQl9Ci0JCQotCQlpZiAobGVmdCB8fCByaWdodCkgewotCQkJCi0JCQlpZiAobGVmdCkgewotCQkJCWlmIChmTGVmdENhbnZhcyAhPSBudWxsKQotCQkJCQlmTGVmdENhbnZhcy5yZWRyYXcoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZSaWdodENhbnZhcyAhPSBudWxsKQotCQkJCQlmUmlnaHRDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCQlDb250cm9sIGNlbnRlcj0gZ2V0Q2VudGVyKCk7Ci0JCQlpZiAoY2VudGVyICE9IG51bGwpCi0JCQkJY2VudGVyLnJlZHJhdygpOwotCi0JCQl1cGRhdGVWU2Nyb2xsQmFyKCk7Ci0JCQlyZWZyZXNoQmlyZHNFeWVWaWV3KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVMaW5lcygpIHsKLQkJaWYgKGlzVGhyZWVXYXkoKSkgewotCQkJaWYgKFV0aWxpdGllcy5va1RvVXNlKGZBbmNlc3RvckNhbnZhcykpCi0JCQkJZkFuY2VzdG9yQ2FudmFzLnJlZHJhdygpOwotCQkJaWYgKGZBbmNlc3RvciAhPSBudWxsICYmIGZBbmNlc3Rvci5pc0NvbnRyb2xPa1RvVXNlKCkpCi0JCQkJZkFuY2VzdG9yLmdldFRleHRXaWRnZXQoKS5yZWRyYXcoKTsKLQkJfQotCQkKLQkJaWYgKFV0aWxpdGllcy5va1RvVXNlKGZMZWZ0Q2FudmFzKSkKLQkJCWZMZWZ0Q2FudmFzLnJlZHJhdygpOwotCQkJCi0JCWlmIChmTGVmdCAhPSBudWxsICYmIGZMZWZ0LmlzQ29udHJvbE9rVG9Vc2UoKSkKLQkJCWZMZWZ0LmdldFRleHRXaWRnZXQoKS5yZWRyYXcoKTsKLQkJCQotCQlpZiAoVXRpbGl0aWVzLm9rVG9Vc2UoZ2V0Q2VudGVyKCkpKQotCQkJZ2V0Q2VudGVyKCkucmVkcmF3KCk7Ci0JCQkKLQkJaWYgKGZSaWdodCAhPSBudWxsICYmIGZSaWdodC5pc0NvbnRyb2xPa1RvVXNlKCkpCi0JCQlmUmlnaHQuZ2V0VGV4dFdpZGdldCgpLnJlZHJhdygpOwotCQkJCi0JCWlmIChVdGlsaXRpZXMub2tUb1VzZShmUmlnaHRDYW52YXMpKQotCQkJZlJpZ2h0Q2FudmFzLnJlZHJhdygpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvd1Jlc29sdmVVSSgpIHsKLQkJaWYgKCFmVXNlUmVzb2x2ZVVJIHx8ICFpc1RocmVlV2F5KCkgfHwgZklnbm9yZUFuY2VzdG9yKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYz0gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNjID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHdlIG9ubHkgZW5hYmxlIHRoZSBuZXcgcmVzb2x2ZSB1aSBpZiBleGFjdGx5IG9uZSBzaWRlIGlzIGVkaXRhYmxlCi0JCWJvb2xlYW4gbD0gY2MuaXNMZWZ0RWRpdGFibGUoKTsKLQkJYm9vbGVhbiByPSBjYy5pc1JpZ2h0RWRpdGFibGUoKTsKLQkJLy9yZXR1cm4gKGwgJiYgIXIpIHx8IChyICYmICFsKTsKLQkJcmV0dXJuIGwgfHwgcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhaW50Q2VudGVyKENhbnZhcyBjYW52YXMsIEdDIGcpIHsKLQkJCi0JCURpc3BsYXkgZGlzcGxheT0gY2FudmFzLmdldERpc3BsYXkoKTsKLQkJCi0JCWNoZWNrRm9yQ29sb3JVcGRhdGUoZGlzcGxheSk7Ci0JCQotCQlpZiAoISBmU3luY2hyb25pemVkU2Nyb2xsaW5nKQotCQkJcmV0dXJuOwotCi0JCWludCBsaW5lSGVpZ2h0PSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuZ2V0TGluZUhlaWdodCgpOwkJCQotCQlpbnQgdmlzaWJsZUhlaWdodD0gZlJpZ2h0LmdldFZpZXdwb3J0SGVpZ2h0KCk7Ci0KLQkJUG9pbnQgc2l6ZT0gY2FudmFzLmdldFNpemUoKTsKLQkJaW50IHg9IDA7Ci0JCWludCB3PSBzaXplLng7Ci0JCQkJCi0JCWcuc2V0QmFja2dyb3VuZChjYW52YXMuZ2V0QmFja2dyb3VuZCgpKTsKLQkJZy5maWxsUmVjdGFuZ2xlKHgrMSwgMCwgdy0yLCBzaXplLnkpOwotCQkKLQkJaWYgKCFmSXNNb3RpZikgewotCQkJLy8gZHJhdyB0aGluIGxpbmUgYmV0d2VlbiBjZW50ZXIgcnVsZXIgYW5kIGJvdGggdGV4dHMKLQkJCWcuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVykpOwotCQkJZy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEsIHNpemUueSk7Ci0JCQlnLmZpbGxSZWN0YW5nbGUody0xLCAwLCAxLCBzaXplLnkpOwotCQl9Ci0JCQkKLQkJaWYgKCEgZkhpZ2hsaWdodFJhbmdlcykKLQkJCXJldHVybjsKLQotCQlib29sZWFuIHNob3dSZXNvbHZlVUk9IHNob3dSZXNvbHZlVUkoKTsKLQotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCWludCBsc2hpZnQ9IGZMZWZ0LmdldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KCk7Ci0JCQlpbnQgcnNoaWZ0PSBmUmlnaHQuZ2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKTsKLQkJCQkJCi0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsKLQkJCi0JCQlJdGVyYXRvciBlPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWlmIChkaWZmLmlzRGVsZXRlZCgpKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlpZiAoZlNob3dDdXJyZW50T25seTIgJiYgIWlzQ3VycmVudERpZmYoZGlmZikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJZkxlZnQuZ2V0TGluZVJhbmdlKGRpZmYuZkxlZnRQb3MsIHJlZ2lvbik7Ci0JCQkJaW50IGx5PSAocmVnaW9uLnggKiBsaW5lSGVpZ2h0KSArIGxzaGlmdDsKLQkJCQlpbnQgbGg9IHJlZ2lvbi55ICogbGluZUhlaWdodDsKLQkKLQkJCQlmUmlnaHQuZ2V0TGluZVJhbmdlKGRpZmYuZlJpZ2h0UG9zLCByZWdpb24pOwotCQkJCWludCByeT0gKHJlZ2lvbi54ICogbGluZUhlaWdodCkgKyByc2hpZnQ7Ci0JCQkJaW50IHJoPSByZWdpb24ueSAqIGxpbmVIZWlnaHQ7Ci0JCi0JCQkJaWYgKE1hdGgubWF4KGx5K2xoLCByeStyaCkgPCAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoTWF0aC5taW4obHksIHJ5KSA+PSB2aXNpYmxlSGVpZ2h0KQotCQkJCQlicmVhazsKLQkKLQkJCQlmUHRzWzBdPSB4OwlmUHRzWzFdPSBseTsJZlB0c1syXT0gdzsJZlB0c1szXT0gcnk7Ci0JCQkJZlB0c1s2XT0geDsJZlB0c1s3XT0gbHkrbGg7CWZQdHNbNF09IHc7CWZQdHNbNV09IHJ5K3JoOwotCQkJCQotCQkJCUNvbG9yIGZpbGxDb2xvcj0gZ2V0Q29sb3IoZGlzcGxheSwgZ2V0RmlsbENvbG9yKGRpZmYpKTsKLQkJCQlDb2xvciBzdHJva2VDb2xvcj0gZ2V0Q29sb3IoZGlzcGxheSwgZ2V0U3Ryb2tlQ29sb3IoZGlmZikpOwotCQkJCQotCQkJCWlmIChmVXNlU2luZ2xlTGluZSkgewotCQkJCQlpbnQgdzI9IDM7Ci0KLQkJCQkJZy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCQkJCWcuZmlsbFJlY3RhbmdsZSgwLCBseSwgdzIsIGxoKTsJCS8vIGxlZnQKLQkJCQkJZy5maWxsUmVjdGFuZ2xlKHctdzIsIHJ5LCB3MiwgcmgpOwkvLyByaWdodAotCi0JCQkJCWcuc2V0TGluZVdpZHRoKExXKTsKLQkJCQkJZy5zZXRGb3JlZ3JvdW5kKHN0cm9rZUNvbG9yKTsKLQkJCQkJZy5kcmF3UmVjdGFuZ2xlKDAtMSwgbHksIHcyLCBsaCk7CS8vIGxlZnQKLQkJCQkJZy5kcmF3UmVjdGFuZ2xlKHctdzIsIHJ5LCB3MiwgcmgpOwkvLyByaWdodAotCi0JCQkJCWlmIChmVXNlU3BsaW5lcykgewotCQkJCQkJaW50W10gcG9pbnRzPSBnZXRDZW50ZXJDdXJ2ZVBvaW50cyh3MiwgbHkrbGgvMiwgdy13MiwgcnkrcmgvMik7Ci0JCQkJCQlmb3IgKGludCBpPSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKQotCQkJCQkJCWcuZHJhd0xpbmUodzIraS0xLCBwb2ludHNbaS0xXSwgdzIraSwgcG9pbnRzW2ldKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWcuZHJhd0xpbmUodzIsIGx5K2xoLzIsIHctdzIsIHJ5K3JoLzIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdHdvIGxpbmVzCi0JCQkJCWlmIChmVXNlU3BsaW5lcykgewotCQkJCQkJZy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0KLQkJCQkJCWcuc2V0TGluZVdpZHRoKExXKTsKLQkJCQkJCWcuc2V0Rm9yZWdyb3VuZChzdHJva2VDb2xvcik7Ci0KLQkJCQkJCWludFtdIHRvcFBvaW50cz0gZ2V0Q2VudGVyQ3VydmVQb2ludHMoZlB0c1swXSwgZlB0c1sxXSwgZlB0c1syXSwgZlB0c1szXSk7Ci0JCQkJCQlpbnRbXSBib3R0b21Qb2ludHM9IGdldENlbnRlckN1cnZlUG9pbnRzKGZQdHNbNl0sIGZQdHNbN10sIGZQdHNbNF0sIGZQdHNbNV0pOwotCQkJCQkJZy5zZXRGb3JlZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCQkJCQlnLmRyYXdMaW5lKDAsIGJvdHRvbVBvaW50c1swXSwgMCwgdG9wUG9pbnRzWzBdKTsKLQkJCQkJCWZvciAoaW50IGk9IDE7IGkgPCBib3R0b21Qb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlnLnNldEZvcmVncm91bmQoZmlsbENvbG9yKTsKLQkJCQkJCQlnLmRyYXdMaW5lKGksIGJvdHRvbVBvaW50c1tpXSwgaSwgdG9wUG9pbnRzW2ldKTsKLQkJCQkJCQlnLnNldEZvcmVncm91bmQoc3Ryb2tlQ29sb3IpOwotCQkJCQkJCWcuZHJhd0xpbmUoaS0xLCB0b3BQb2ludHNbaS0xXSwgaSwgdG9wUG9pbnRzW2ldKTsKLQkJCQkJCQlnLmRyYXdMaW5lKGktMSwgYm90dG9tUG9pbnRzW2ktMV0sIGksIGJvdHRvbVBvaW50c1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlnLnNldEJhY2tncm91bmQoZmlsbENvbG9yKTsKLQkJCQkJCWcuZmlsbFBvbHlnb24oZlB0cyk7Ci0KLQkJCQkJCWcuc2V0TGluZVdpZHRoKExXKTsKLQkJCQkJCWcuc2V0Rm9yZWdyb3VuZChzdHJva2VDb2xvcik7Ci0JCQkJCQlnLmRyYXdMaW5lKGZQdHNbMF0sIGZQdHNbMV0sIGZQdHNbMl0sIGZQdHNbM10pOwotCQkJCQkJZy5kcmF3TGluZShmUHRzWzZdLCBmUHRzWzddLCBmUHRzWzRdLCBmUHRzWzVdKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZlVzZVNpbmdsZUxpbmUgJiYgc2hvd1Jlc29sdmVVSSAmJiBkaWZmLmlzVW5yZXNvbHZlZEluY29taW5nT3JDb25mbGljdGluZygpKSB7Ci0JCQkJCS8vIGRyYXcgcmVzb2x2ZSBzdGF0ZQotCQkJCQlpbnQgY3g9ICh3LVJFU09MVkVfU0laRSkvMjsKLQkJCQkJaW50IGN5PSAoKGx5K2xoLzIpICsgKHJ5K3JoLzIpIC0gUkVTT0xWRV9TSVpFKS8yOwotCQkJCQkKLQkJCQkJZy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCQkJCWcuZmlsbFJlY3RhbmdsZShjeCwgY3ksIFJFU09MVkVfU0laRSwgUkVTT0xWRV9TSVpFKTsKLQkJCQkJCi0JCQkJCWcuc2V0Rm9yZWdyb3VuZChzdHJva2VDb2xvcik7Ci0JCQkJCWcuZHJhd1JlY3RhbmdsZShjeCwgY3ksIFJFU09MVkVfU0laRSwgUkVTT0xWRV9TSVpFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBpbnRbXSBnZXRDZW50ZXJDdXJ2ZVBvaW50cyhpbnQgc3RhcnR4LCBpbnQgc3RhcnR5LCBpbnQgZW5keCwgaW50IGVuZHkpIHsKLQkJaWYgKGZCYXNpY0NlbnRlckN1cnZlID09IG51bGwpCi0JCQlidWlsZEJhc2VDZW50ZXJDdXJ2ZShlbmR4LXN0YXJ0eCk7Ci0JCWRvdWJsZSBoZWlnaHQ9IGVuZHkgLSBzdGFydHk7Ci0JCWhlaWdodD0gaGVpZ2h0LzI7Ci0JCWludCB3aWR0aD0gZW5keC1zdGFydHg7Ci0JCWludFtdIHBvaW50cz0gbmV3IGludFt3aWR0aF07Ci0JCWZvciAoaW50IGk9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0JCQlwb2ludHNbaV09IChpbnQpICgtaGVpZ2h0ICogZkJhc2ljQ2VudGVyQ3VydmVbaV0gKyBoZWlnaHQgKyBzdGFydHkpOwotCQl9Ci0JCXJldHVybiBwb2ludHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQmFzZUNlbnRlckN1cnZlKGludCB3KSB7Ci0JCWRvdWJsZSB3aWR0aD0gdzsKLQkJZkJhc2ljQ2VudGVyQ3VydmU9IG5ldyBkb3VibGVbZ2V0Q2VudGVyV2lkdGgoKV07Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBnZXRDZW50ZXJXaWR0aCgpOyBpKyspIHsKLQkJCWRvdWJsZSByPSBpIC8gd2lkdGg7Ci0JCQlmQmFzaWNDZW50ZXJDdXJ2ZVtpXT0gTWF0aC5jb3MoTWF0aC5QSSAqIHIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhaW50U2lkZXMoR0MgZywgTWVyZ2VTb3VyY2VWaWV3ZXIgdHAsIENhbnZhcyBjYW52YXMsIGJvb2xlYW4gcmlnaHQpIHsKLQkJCi0JCURpc3BsYXkgZGlzcGxheT0gY2FudmFzLmdldERpc3BsYXkoKTsKLQkJCi0JCWludCBsaW5lSGVpZ2h0PSB0cC5nZXRUZXh0V2lkZ2V0KCkuZ2V0TGluZUhlaWdodCgpOwotCQlpbnQgdmlzaWJsZUhlaWdodD0gdHAuZ2V0Vmlld3BvcnRIZWlnaHQoKTsKLQotCQlQb2ludCBzaXplPSBjYW52YXMuZ2V0U2l6ZSgpOwotCQlpbnQgeD0gMDsKLQkJaW50IHc9IGZNYXJnaW5XaWR0aDsKLQkJaW50IHcyPSB3LzI7Ci0JCQkKLQkJZy5zZXRCYWNrZ3JvdW5kKGNhbnZhcy5nZXRCYWNrZ3JvdW5kKCkpOwotCQlnLmZpbGxSZWN0YW5nbGUoeCwgMCwgdywgc2l6ZS55KTsKLQotCQlpZiAoIWZJc01vdGlmKSB7Ci0JCQkvLyBkcmF3IHRoaW4gbGluZSBiZXR3ZWVuIHJ1bGVyIGFuZCB0ZXh0Ci0JCQlnLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpKTsKLQkJCWlmIChyaWdodCkKLQkJCQlnLmZpbGxSZWN0YW5nbGUoMCwgMCwgMSwgc2l6ZS55KTsKLQkJCWVsc2UKLQkJCQlnLmZpbGxSZWN0YW5nbGUoc2l6ZS54LTEsIDAsIDEsIHNpemUueSk7Ci0JCX0KLQotCQlpZiAoISBmSGlnaGxpZ2h0UmFuZ2VzKQotCQkJcmV0dXJuOwotCi0JCWlmIChmQ2hhbmdlRGlmZnMgIT0gbnVsbCkgewotCQkJaW50IHNoaWZ0PSB0cC5nZXRWZXJ0aWNhbFNjcm9sbE9mZnNldCgpICsgKDItTFcpOwotCQkJCQotCQkJUG9pbnQgcmVnaW9uPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQlJdGVyYXRvciBlPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWlmIChkaWZmLmlzRGVsZXRlZCgpKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlpZiAoZlNob3dDdXJyZW50T25seTIgJiYgIWlzQ3VycmVudERpZmYoZGlmZikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJdHAuZ2V0TGluZVJhbmdlKGRpZmYuZ2V0UG9zaXRpb24odHApLCByZWdpb24pOwkKLQkJCQlpbnQgeT0gKHJlZ2lvbi54ICogbGluZUhlaWdodCkgKyBzaGlmdDsKLQkJCQlpbnQgaD0gcmVnaW9uLnkgKiBsaW5lSGVpZ2h0OwotCQotCQkJCWlmICh5K2ggPCAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoeSA+PSB2aXNpYmxlSGVpZ2h0KQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJZy5zZXRCYWNrZ3JvdW5kKGdldENvbG9yKGRpc3BsYXksIGdldEZpbGxDb2xvcihkaWZmKSkpOwotCQkJCWlmIChyaWdodCkKLQkJCQkJZy5maWxsUmVjdGFuZ2xlKHgsIHksIHcyLCBoKTsKLQkJCQllbHNlCi0JCQkJCWcuZmlsbFJlY3RhbmdsZSh4K3cyLCB5LCB3MiwgaCk7Ci0JCi0JCQkJZy5zZXRMaW5lV2lkdGgoTFcpOwotCQkJCWcuc2V0Rm9yZWdyb3VuZChnZXRDb2xvcihkaXNwbGF5LCBnZXRTdHJva2VDb2xvcihkaWZmKSkpOwotCQkJCWlmIChyaWdodCkKLQkJCQkJZy5kcmF3UmVjdGFuZ2xlKHgtMSwgeS0xLCB3MiwgaCk7Ci0JCQkJZWxzZQotCQkJCQlnLmRyYXdSZWN0YW5nbGUoeCt3MiwgeS0xLCB3MiwgaCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhaW50KFBhaW50RXZlbnQgZXZlbnQsIE1lcmdlU291cmNlVmlld2VyIHRwKSB7Ci0JCQotCQlpZiAoISBmSGlnaGxpZ2h0UmFuZ2VzKQotCQkJcmV0dXJuOwotCQlpZiAoZkNoYW5nZURpZmZzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ29udHJvbCBjYW52YXM9IChDb250cm9sKSBldmVudC53aWRnZXQ7Ci0JCUdDIGc9IGV2ZW50LmdjOwotCQkKLQkJRGlzcGxheSBkaXNwbGF5PSBjYW52YXMuZ2V0RGlzcGxheSgpOwotCQkKLQkJaW50IGxpbmVIZWlnaHQ9IHRwLmdldFRleHRXaWRnZXQoKS5nZXRMaW5lSGVpZ2h0KCk7CQkJCi0JCWludCB3PSBjYW52YXMuZ2V0U2l6ZSgpLng7Ci0JCWludCBzaGlmdD0gdHAuZ2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKSArICgyLUxXKTsKLQkJaW50IG1heGg9IGV2ZW50LnkrZXZlbnQuaGVpZ2h0OyAJLy8gdmlzaWJsZUhlaWdodAotCQkKLQkJLy9pZiAoZklzTW90aWYpCi0JCQlzaGlmdCs9IGZUb3BJbnNldDsKLQkJCQkKLQkJUG9pbnQgcmFuZ2U9IG5ldyBQb2ludCgwLCAwKTsKLQkJCQkKLQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7CQotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJaWYgKGRpZmYuaXNEZWxldGVkKCkpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChmU2hvd0N1cnJlbnRPbmx5ICYmICFpc0N1cnJlbnREaWZmKGRpZmYpKQotCQkJCWNvbnRpbnVlOwotCi0JCQl0cC5nZXRMaW5lUmFuZ2UoZGlmZi5nZXRQb3NpdGlvbih0cCksIHJhbmdlKTsKLQkJCWludCB5PSAocmFuZ2UueCAqIGxpbmVIZWlnaHQpICsgc2hpZnQ7Ci0JCQlpbnQgaD0gcmFuZ2UueSAqIGxpbmVIZWlnaHQ7Ci0JCQkKLQkJCWlmICh5K2ggPCBldmVudC55KQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHkgPiBtYXhoKQotCQkJCWJyZWFrOwotCQkJCi0JCQlnLnNldEJhY2tncm91bmQoZ2V0Q29sb3IoZGlzcGxheSwgZ2V0U3Ryb2tlQ29sb3IoZGlmZikpKTsKLQkJCWcuZmlsbFJlY3RhbmdsZSgwLCB5LTEsIHcsIExXKTsKLQkJCWcuZmlsbFJlY3RhbmdsZSgwLCB5K2gtMSwgdywgTFcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSR0IgZ2V0RmlsbENvbG9yKERpZmYgZGlmZikgewotCQlib29sZWFuIHNlbGVjdGVkPSBmQ3VycmVudERpZmYgIT0gbnVsbCAmJiBmQ3VycmVudERpZmYuZlBhcmVudCA9PSBkaWZmOwotCQkKLQkJUkdCIHNlbGVjdGVkX2ZpbGw9IGdldEJhY2tncm91bmQobnVsbCk7Ci0KLQkJaWYgKGlzVGhyZWVXYXkoKSAmJiAhZklnbm9yZUFuY2VzdG9yKSB7Ci0JCQlzd2l0Y2ggKGRpZmYuZkRpcmVjdGlvbikgewotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuUklHSFQ6Ci0JCQkJaWYgKGZMZWZ0SXNMb2NhbCkKLQkJCQkJcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWRfZmlsbCA6IElOQ09NSU5HX0ZJTEw7Ci0JCQkJcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWRfZmlsbCA6IE9VVEdPSU5HX0ZJTEw7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5BTkNFU1RPUjoKLQkJCQlyZXR1cm4gc2VsZWN0ZWQgPyBzZWxlY3RlZF9maWxsIDogQ09ORkxJQ1RfRklMTDsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkxFRlQ6Ci0JCQkJaWYgKGZMZWZ0SXNMb2NhbCkKLQkJCQkJcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWRfZmlsbCA6IE9VVEdPSU5HX0ZJTEw7Ci0JCQkJcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWRfZmlsbCA6IElOQ09NSU5HX0ZJTEw7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVDoKLQkJCQlyZXR1cm4gc2VsZWN0ZWQgPyBzZWxlY3RlZF9maWxsIDogQ09ORkxJQ1RfRklMTDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkX2ZpbGwgOiBPVVRHT0lOR19GSUxMOwotCX0KLQkKLQlwcml2YXRlIFJHQiBnZXRTdHJva2VDb2xvcihEaWZmIGRpZmYpIHsKLQkJYm9vbGVhbiBzZWxlY3RlZD0gZkN1cnJlbnREaWZmICE9IG51bGwgJiYgZkN1cnJlbnREaWZmLmZQYXJlbnQgPT0gZGlmZjsKLQkJCi0JCWlmIChpc1RocmVlV2F5KCkgJiYgIWZJZ25vcmVBbmNlc3RvcikgewotCQkJc3dpdGNoIChkaWZmLmZEaXJlY3Rpb24pIHsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotCQkJCWlmIChmTGVmdElzTG9jYWwpCi0JCQkJCXJldHVybiBzZWxlY3RlZCA/IFNFTEVDVEVEX0lOQ09NSU5HIDogSU5DT01JTkc7Ci0JCQkJcmV0dXJuIHNlbGVjdGVkID8gU0VMRUNURURfT1VUR09JTkcgOiBPVVRHT0lORzsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkFOQ0VTVE9SOgotCQkJCXJldHVybiBzZWxlY3RlZCA/IFNFTEVDVEVEX0NPTkZMSUNUIDogQ09ORkxJQ1Q7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotCQkJCWlmIChmTGVmdElzTG9jYWwpCi0JCQkJCXJldHVybiBzZWxlY3RlZCA/IFNFTEVDVEVEX09VVEdPSU5HIDogT1VUR09JTkc7Ci0JCQkJcmV0dXJuIHNlbGVjdGVkID8gU0VMRUNURURfSU5DT01JTkcgOiBJTkNPTUlORzsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkNPTkZMSUNUOgotCQkJCXJldHVybiBzZWxlY3RlZCA/IFNFTEVDVEVEX0NPTkZMSUNUIDogQ09ORkxJQ1Q7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQgPyBTRUxFQ1RFRF9PVVRHT0lORyA6IE9VVEdPSU5HOwotCX0KLQkKLQlwcml2YXRlIENvbG9yIGdldENvbG9yKERpc3BsYXkgZGlzcGxheSwgUkdCIHJnYikgewotCQlpZiAocmdiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsJCQotCQlpZiAoZkNvbG9ycyA9PSBudWxsKQotCQkJZkNvbG9ycz0gbmV3IEhhc2hNYXAoMjApOwotCQlDb2xvciBjPSAoQ29sb3IpIGZDb2xvcnMuZ2V0KHJnYik7Ci0JCWlmIChjID09IG51bGwpIHsKLQkJCWM9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJZkNvbG9ycy5wdXQocmdiLCBjKTsKLQkJfQotCQlyZXR1cm4gYzsKLQl9Ci0JCQkKLQlzdGF0aWMgUkdCIGludGVycG9sYXRlKFJHQiBmZywgUkdCIGJnLCBkb3VibGUgc2NhbGUpIHsKLQkJaWYgKGZnICE9IG51bGwgJiYgYmcgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUkdCKAotCQkJCShpbnQpKCgxLjAtc2NhbGUpICogZmcucmVkICsgc2NhbGUgKiBiZy5yZWQpLAotCQkJCShpbnQpKCgxLjAtc2NhbGUpICogZmcuZ3JlZW4gKyBzY2FsZSAqIGJnLmdyZWVuKSwKLQkJCQkoaW50KSgoMS4wLXNjYWxlKSAqIGZnLmJsdWUgKyBzY2FsZSAqIGJnLmJsdWUpCi0JCQkpOwotCQlpZiAoZmcgIT0gbnVsbCkKLQkJCXJldHVybiBmZzsKLQkJaWYgKGJnICE9IG51bGwpCi0JCQlyZXR1cm4gYmc7Ci0JCXJldHVybiBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwkvLyBhIGdyYXkKLQl9Ci0JCi0JLy8tLS0tIE5hdmlnYXRpbmcgYW5kIHJlc29sdmluZyBEaWZmcwotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIGVuZCAob3IgYmVnaW5uaW5nKSBvZiBkb2N1bWVudCByZWFjaGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuYXZpZ2F0ZShib29sZWFuIGRvd24sIGJvb2xlYW4gd3JhcCwgYm9vbGVhbiBkZWVwKSB7Ci0KLQkJRGlmZiBkaWZmPSBudWxsOwotCQkKLQkJZm9yICg7OykgewotCQkJCi0JCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCQlNZXJnZVNvdXJjZVZpZXdlciBwYXJ0PSBmRm9jdXNQYXJ0OwotCQkJCWlmIChwYXJ0ID09IG51bGwpCi0JCQkJCXBhcnQ9IGZSaWdodDsKLQkJCQkKLQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHM9IHBhcnQuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJCQlpZiAoZG93bikKLQkJCQkJCWRpZmY9IGZpbmROZXh0KHBhcnQsIGZDaGFuZ2VEaWZmcywgcy54LCBzLngrcy55LCBkZWVwKTsKLQkJCQkJZWxzZQotCQkJCQkJZGlmZj0gZmluZFByZXYocGFydCwgZkNoYW5nZURpZmZzLCBzLngsIHMueCtzLnksIGRlZXApOwkJCQkJCi0JCQkJfQkJCi0JCQl9Ci0JCQotCQkJaWYgKGRpZmYgPT0gbnVsbCkgewkvLyBhdCBlbmQgb3IgYmVnaW5uaW5nCi0JCQkJaWYgKHdyYXApIHsKLQkJCQkJaWYgKCFmRW5kT2ZEb2NSZWFjaGVkKSB7Ci0JCQkJCQlmRW5kT2ZEb2NSZWFjaGVkPSB0cnVlOwotCQkJCQkJaWYgKCEgZW5kT2ZEb2N1bWVudFJlYWNoZWQoZG93bikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJZkVuZE9mRG9jUmVhY2hlZD0gZmFsc2U7Ci0JCQkJCWlmIChmQ2hhbmdlRGlmZnMgIT0gbnVsbCAmJiBmQ2hhbmdlRGlmZnMuc2l6ZSgpID4gMCkgewotCQkJCQkJaWYgKGRvd24pCi0JCQkJCQkJZGlmZj0gKERpZmYpIGZDaGFuZ2VEaWZmcy5nZXQoMCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZGlmZj0gKERpZmYpIGZDaGFuZ2VEaWZmcy5nZXQoZkNoYW5nZURpZmZzLnNpemUoKS0xKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZFbmRPZkRvY1JlYWNoZWQ9IGZhbHNlOwkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlzZXRDdXJyZW50RGlmZihkaWZmLCB0cnVlKTsKLQkJCQotCQkJaWYgKGRpZmYgIT0gbnVsbCAmJiBkaWZmLmZEaXJlY3Rpb24gPT0gUmFuZ2VEaWZmZXJlbmNlLkFOQ0VTVE9SCi0JCQkJCQkJCQkmJiAhZ2V0QW5jZXN0b3JFbmFibGVkKCkpCi0JCQkJY29udGludWU7Ci0JCQkJCi0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVuZE9mRG9jdW1lbnRSZWFjaGVkKGJvb2xlYW4gZG93bikgewotCQlDb250cm9sIGM9IGdldENvbnRyb2woKTsKLQkJaWYgKFV0aWxpdGllcy5va1RvVXNlKGMpKSB7Ci0JCQkKLQkJCWMuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQkJCQotCQkJU3RyaW5nIGtleT0gZG93biA/ICJhdEVuZCIgOiAiYXRCZWdpbm5pbmciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihjLmdldFNoZWxsKCksCi0JCQkJQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLiIra2V5KyIudGl0bGUiKSwJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLiIra2V5KyIubWVzc2FnZSIpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEZpbmQgdGhlIERpZmYgdGhhdCBvdmVybGFwcyB3aXRoIHRoZSBnaXZlbiBUZXh0UGFydCdzIHRleHQgcmFuZ2UuCi0JICogSWYgdGhlIHJhbmdlIGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSByYW5nZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlzIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgRGlmZiBmaW5kRGlmZihNZXJnZVNvdXJjZVZpZXdlciB0cCwgaW50IHJhbmdlU3RhcnQsIGludCByYW5nZUVuZCkgewotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGU9IGZDaGFuZ2VEaWZmcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJaWYgKGRpZmYub3ZlcmxhcHModHAsIHJhbmdlU3RhcnQsIHJhbmdlRW5kKSkKLQkJCQkJcmV0dXJuIGRpZmY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERpZmYgZmluZE5leHQoTWVyZ2VTb3VyY2VWaWV3ZXIgdHAsIExpc3QgdiwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sZWFuIGRlZXApIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKLQkJCURpZmYgZGlmZj0gKERpZmYpIHYuZ2V0KGkpOwotCQkJUG9zaXRpb24gcD0gZGlmZi5nZXRQb3NpdGlvbih0cCk7Ci0JCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0PSBwLmdldE9mZnNldCgpOwotCQkJCWlmIChlbmQgPCBzdGFydE9mZnNldCkgIC8vIDw9Ci0JCQkJCXJldHVybiBkaWZmOwotCQkJCWlmIChkZWVwICYmIGRpZmYuZkRpZmZzICE9IG51bGwpIHsKLQkJCQkJRGlmZiBkPSBudWxsOwotCQkJCQlpbnQgZW5kT2Zmc2V0PSBzdGFydE9mZnNldCArIHAuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWlmIChzdGFydCA9PSBzdGFydE9mZnNldCAmJiAoZW5kID09IGVuZE9mZnNldCB8fCBlbmQgPT0gZW5kT2Zmc2V0LTEpKSB7Ci0JCQkJCQlkPSBmaW5kTmV4dCh0cCwgZGlmZi5mRGlmZnMsIHN0YXJ0LTEsIHN0YXJ0LTEsIGRlZXApOwotCQkJCQl9IGVsc2UgaWYgKGVuZCA8IGVuZE9mZnNldCkgewotCQkJCQkJZD0gZmluZE5leHQodHAsIGRpZmYuZkRpZmZzLCBzdGFydCwgZW5kLCBkZWVwKTsKLQkJCQkJfQotCQkJCQlpZiAoZCAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEaWZmIGZpbmRQcmV2KE1lcmdlU291cmNlVmlld2VyIHRwLCBMaXN0IHYsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWZvciAoaW50IGk9IHYuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlEaWZmIGRpZmY9IChEaWZmKSB2LmdldChpKTsKLQkJCVBvc2l0aW9uIHA9IGRpZmYuZ2V0UG9zaXRpb24odHApOwotCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCWludCBzdGFydE9mZnNldD0gcC5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0PSBzdGFydE9mZnNldCArIHAuZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHN0YXJ0ID4gZW5kT2Zmc2V0KQotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQlpZiAoZGVlcCAmJiBkaWZmLmZEaWZmcyAhPSBudWxsKSB7Ci0JCQkJCURpZmYgZD0gbnVsbDsKLQkJCQkJaWYgKHN0YXJ0ID09IHN0YXJ0T2Zmc2V0ICYmIGVuZCA9PSBlbmRPZmZzZXQpIHsKLQkJCQkJCWQ9IGZpbmRQcmV2KHRwLCBkaWZmLmZEaWZmcywgZW5kLCBlbmQsIGRlZXApOwotCQkJCQl9IGVsc2UgaWYgKHN0YXJ0ID49IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJCQlkPSBmaW5kUHJldih0cCwgZGlmZi5mRGlmZnMsIHN0YXJ0LCBlbmQsIGRlZXApOwotCQkJCQl9Ci0JCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKgotCSAqIFNldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBEaWZmIGFuZCB1cGRhdGUgdGhlIHRvb2xiYXJzIGNvbnRyb2xzIGFuZCBsaW5lcy4KLQkgKiBJZiA8Y29kZT5yZXZlYWxBbmRTZWxlY3Q8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBEaWZmIGlzIHJldmVhbGVkIGFuZAotCSAqIHNlbGVjdGVkIGluIGJvdGggVGV4dFBhcnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50RGlmZihEaWZmIGQsIGJvb2xlYW4gcmV2ZWFsQW5kU2VsZWN0KSB7Ci0KLS8vCQlpZiAoZCA9PSBmQ3VycmVudERpZmYpCi0vLwkJCXJldHVybjsKLQotCQlpZiAoZkNlbnRlckJ1dHRvbiAhPSBudWxsKQotCQkJZkNlbnRlckJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQotCQlmRW5kT2ZEb2NSZWFjaGVkPSBmYWxzZTsJCi0KLQkJRGlmZiBvbGREaWZmPSBmQ3VycmVudERpZmY7Ci0JCQkJCQotCQlpZiAoZCAhPSBudWxsICYmIHJldmVhbEFuZFNlbGVjdCkgewotCQkJCi0JCQkvLyBiZWZvcmUgd2Ugc2V0IGZDdXJyZW50RGlmZiB3ZSBjaGFuZ2UgdGhlIHNlbGVjdGlvbgotCQkJLy8gc28gdGhhdCB0aGUgcGFpbnQgY29kZSB1c2VzIHRoZSBvbGQgYmFja2dyb3VuZCBjb2xvcnMKLQkJCS8vIG90aGVyd2lzZSBzZWxlY3Rpb24gaXNuJ3QgZHJhd24gY29ycmVjdGx5Ci0JCQlpZiAoaXNUaHJlZVdheSgpICYmICFmSWdub3JlQW5jZXN0b3IpCi0JCQkJZkFuY2VzdG9yLnNldFNlbGVjdGlvbihkLmZBbmNlc3RvclBvcyk7Ci0JCQlmTGVmdC5zZXRTZWxlY3Rpb24oZC5mTGVmdFBvcyk7Ci0JCQlmUmlnaHQuc2V0U2VsZWN0aW9uKGQuZlJpZ2h0UG9zKTsKLQkJCQotCQkJLy8gbm93IHN3aXRjaCBkaWZmcwotCQkJZkN1cnJlbnREaWZmPSBkOwotCQkJcmV2ZWFsRGlmZihkLCBkLmZJc1Rva2VuKTsKLQkJfSBlbHNlIHsKLQkJCWZDdXJyZW50RGlmZj0gZDsKLQkJfQotCQkKLQkJRGlmZiBkMT0gb2xkRGlmZiAhPSBudWxsID8gb2xkRGlmZi5mUGFyZW50IDogbnVsbDsKLQkJRGlmZiBkMj0gZkN1cnJlbnREaWZmICE9IG51bGwgPyBmQ3VycmVudERpZmYuZlBhcmVudCA6IG51bGw7Ci0JCWlmIChkMSAhPSBkMikgewotCQkJdXBkYXRlRGlmZkJhY2tncm91bmQoZDEpOwotCQkJdXBkYXRlRGlmZkJhY2tncm91bmQoZDIpOwotCQl9Ci0JCQotCQl1cGRhdGVDb250cm9scygpOwotCQlpbnZhbGlkYXRlTGluZXMoKTsKLQkJcmVmcmVzaEJpcmRzRXllVmlldygpOwotCX0KLQkKLQkvKgotCSAqIFNtYXJ0IGRldGVybWluZXMgd2hldGhlciAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmV2ZWFsRGlmZihEaWZmIGQsIGJvb2xlYW4gc21hcnQpIHsKLQkJCi0JCWJvb2xlYW4gYW5jZXN0b3JJc1Zpc2libGU9IGZhbHNlOwotCQlib29sZWFuIGxlZnRJc1Zpc2libGU9IGZhbHNlOwotCQlib29sZWFuIHJpZ2h0SXNWaXNpYmxlPSBmYWxzZTsKLQotCQlpZiAoc21hcnQpIHsKLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCQkJLy8gZmluZCB0aGUgc3RhcnRpbmcgbGluZSBvZiB0aGUgZGlmZiBpbiBhbGwgdGV4dCB3aWRnZXRzCi0JCQlpbnQgbHM9IGZMZWZ0LmdldExpbmVSYW5nZShkLmZMZWZ0UG9zLCByZWdpb24pLng7Ci0JCQlpbnQgcnM9IGZSaWdodC5nZXRMaW5lUmFuZ2UoZC5mUmlnaHRQb3MsIHJlZ2lvbikueDsKLQkJCQotCQkJaWYgKGlzVGhyZWVXYXkoKSAmJiAhZklnbm9yZUFuY2VzdG9yKSB7Ci0JCQkJaW50IGFzPSBmQW5jZXN0b3IuZ2V0TGluZVJhbmdlKGQuZkFuY2VzdG9yUG9zLCByZWdpb24pLng7Ci0JCQkJaWYgKGFzID49IGZBbmNlc3Rvci5nZXRUb3BJbmRleCgpICYmIGFzIDw9IGZBbmNlc3Rvci5nZXRCb3R0b21JbmRleCgpKQotCQkJCQlhbmNlc3RvcklzVmlzaWJsZT0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGxzID49IGZMZWZ0LmdldFRvcEluZGV4KCkgJiYgbHMgPD0gZkxlZnQuZ2V0Qm90dG9tSW5kZXgoKSkKLQkJCQlsZWZ0SXNWaXNpYmxlPSB0cnVlOwotCi0JCQlpZiAocnMgPj0gZlJpZ2h0LmdldFRvcEluZGV4KCkgJiYgcnMgPD0gZlJpZ2h0LmdldEJvdHRvbUluZGV4KCkpCi0JCQkJcmlnaHRJc1Zpc2libGU9IHRydWU7Ci0JCX0KLQotCQkvLyB2ZXJ0aWNhbCBzY3JvbGxpbmcKLQkJaWYgKCFsZWZ0SXNWaXNpYmxlIHx8ICFyaWdodElzVmlzaWJsZSkgewotCQkJaW50IGF2cG9zPSAwLCBsdnBvcz0gMCwgcnZwb3M9IDA7Ci0JCQkKLQkJCU1lcmdlU291cmNlVmlld2VyIGFsbEJ1dFRoaXM9IG51bGw7Ci0JCQlpZiAobGVmdElzVmlzaWJsZSkgewotCQkJCWF2cG9zPSBsdnBvcz0gcnZwb3M9IHJlYWxUb1ZpcnR1YWxQb3NpdGlvbihmTGVmdCwgZkxlZnQuZ2V0VG9wSW5kZXgoKSk7Ci0JCQkJYWxsQnV0VGhpcz0gZkxlZnQ7Ci0JCQl9IGVsc2UgaWYgKHJpZ2h0SXNWaXNpYmxlKSB7Ci0JCQkJYXZwb3M9IGx2cG9zPSBydnBvcz0gcmVhbFRvVmlydHVhbFBvc2l0aW9uKGZSaWdodCwgZlJpZ2h0LmdldFRvcEluZGV4KCkpOwotCQkJCWFsbEJ1dFRoaXM9IGZSaWdodDsKLQkJCX0gZWxzZSBpZiAoYW5jZXN0b3JJc1Zpc2libGUpIHsKLQkJCQlhdnBvcz0gbHZwb3M9IHJ2cG9zPSByZWFsVG9WaXJ0dWFsUG9zaXRpb24oZkFuY2VzdG9yLCBmQW5jZXN0b3IuZ2V0VG9wSW5kZXgoKSk7Ci0JCQkJYWxsQnV0VGhpcz0gZkFuY2VzdG9yOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZkFsbERpZmZzICE9IG51bGwpIHsKLQkJCQkJaW50IHZwb3M9IDA7Ci0JCQkJCUl0ZXJhdG9yIGU9IGZBbGxEaWZmcy5pdGVyYXRvcigpOwotCQkJCQlmb3IgKGludCBpPSAwOyBlLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQkJCWlmIChkaWZmID09IGQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZykgewotCQkJCQkJCXZwb3MrPSBkaWZmLmdldE1heERpZmZIZWlnaHQoZlNob3dBbmNlc3Rvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWF2cG9zKz0gZGlmZi5nZXRBbmNlc3RvckhlaWdodCgpOwotCQkJCQkJCWx2cG9zKz0gZGlmZi5nZXRMZWZ0SGVpZ2h0KCk7Ci0JCQkJCQkJcnZwb3MrPSBkaWZmLmdldFJpZ2h0SGVpZ2h0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpCi0JCQkJCQlhdnBvcz0gbHZwb3M9IHJ2cG9zPSB2cG9zOwotCQkJCX0KLQkJCQlpbnQgZGVsdGE9IGZSaWdodC5nZXRWaWV3cG9ydExpbmVzKCkvNDsKLQkJCQlhdnBvcy09IGRlbHRhOwotCQkJCWlmIChhdnBvcyA8IDApCi0JCQkJCWF2cG9zPSAwOwotCQkJCWx2cG9zLT0gZGVsdGE7Ci0JCQkJaWYgKGx2cG9zIDwgMCkKLQkJCQkJbHZwb3M9IDA7Ci0JCQkJcnZwb3MtPSBkZWx0YTsKLQkJCQlpZiAocnZwb3MgPCAwKQotCQkJCQlydnBvcz0gMDsKLQkJCX0KLQkJCQkJCQkKLQkJCXNjcm9sbFZlcnRpY2FsKGF2cG9zLCBsdnBvcywgcnZwb3MsIGFsbEJ1dFRoaXMpOwotCQkJCi0JCQlpZiAoZlZTY3JvbGxCYXIgIT0gbnVsbCkKLQkJCQlmVlNjcm9sbEJhci5zZXRTZWxlY3Rpb24oYXZwb3MpOwotCQl9Ci0JCQotCQkvLyBob3Jpem9udGFsIHNjcm9sbGluZwotCQlpZiAoZC5mSXNUb2tlbikgewotCQkJLy8gd2Ugb25seSBzY3JvbGwgaG9yaXpvbnRhbGx5IGZvciB0b2tlbiBkaWZmcwotCQkJcmV2ZWFsKGZBbmNlc3RvciwgZC5mQW5jZXN0b3JQb3MpOwotCQkJcmV2ZWFsKGZMZWZ0LCBkLmZMZWZ0UG9zKTsKLQkJCXJldmVhbChmUmlnaHQsIGQuZlJpZ2h0UG9zKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGluIGFsbCBvdGhlciBjYXNlcyB3ZSByZXNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQKLQkJCWhzY3JvbGwoZkFuY2VzdG9yKTsKLQkJCWhzY3JvbGwoZkxlZnQpOwotCQkJaHNjcm9sbChmUmlnaHQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmV2ZWFsKE1lcmdlU291cmNlVmlld2VyIHYsIFBvc2l0aW9uIHApIHsKLQkJaWYgKHYgIT0gbnVsbCAmJiBwICE9IG51bGwpIHsKLQkJCVN0eWxlZFRleHQgc3Q9IHYuZ2V0VGV4dFdpZGdldCgpOwotCQkJaWYgKHN0ICE9IG51bGwpIHsKLQkJCQlSZWN0YW5nbGUgcj0gc3QuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWlmICghci5pc0VtcHR5KCkpCS8vIHdvcmthcm91bmQgZm9yICM3MzIwOiBOZXh0IGRpZmYgc2Nyb2xscyB3aGVuIGdvaW5nIGludG8gY3VycmVudCBkaWZmIAotCQkJCQl2LnJldmVhbFJhbmdlKHAub2Zmc2V0LCBwLmxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoc2Nyb2xsKE1lcmdlU291cmNlVmlld2VyIHYpIHsKLQkJaWYgKHYgIT0gbnVsbCkgewotCQkJU3R5bGVkVGV4dCBzdD0gdi5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQlzdC5zZXRIb3Jpem9udGFsSW5kZXgoMCk7Ci0JCX0KLQl9Ci0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXZvaWQgY29weUFsbFVucmVzb2x2ZWQoYm9vbGVhbiBsZWZ0VG9SaWdodCkgewotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwgJiYgaXNUaHJlZVdheSgpICYmICFmSWdub3JlQW5jZXN0b3IpIHsKLQkJCUlSZXdyaXRlVGFyZ2V0IHRhcmdldD0gbGVmdFRvUmlnaHQgPyBmUmlnaHQuZ2V0UmV3cml0ZVRhcmdldCgpIDogZkxlZnQuZ2V0UmV3cml0ZVRhcmdldCgpOwotCQkJYm9vbGVhbiBjb21wb3VuZENoYW5nZVN0YXJ0ZWQ9IGZhbHNlOwotCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl0cnkgewotCQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQkJc3dpdGNoIChkaWZmLmZEaXJlY3Rpb24pIHsKLQkJCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuTEVGVDoKLQkJCQkJCWlmIChsZWZ0VG9SaWdodCkgewotCQkJCQkJCWlmICghY29tcG91bmRDaGFuZ2VTdGFydGVkKSB7Ci0JCQkJCQkJCXRhcmdldC5iZWdpbkNvbXBvdW5kQ2hhbmdlKCk7Ci0JCQkJCQkJCWNvbXBvdW5kQ2hhbmdlU3RhcnRlZD0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJY29weShkaWZmLCBsZWZ0VG9SaWdodCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuUklHSFQ6Ci0JCQkJCQlpZiAoIWxlZnRUb1JpZ2h0KSB7Ci0JCQkJCQkJaWYgKCFjb21wb3VuZENoYW5nZVN0YXJ0ZWQpIHsKLQkJCQkJCQkJdGFyZ2V0LmJlZ2luQ29tcG91bmRDaGFuZ2UoKTsKLQkJCQkJCQkJY29tcG91bmRDaGFuZ2VTdGFydGVkPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQljb3B5KGRpZmYsIGxlZnRUb1JpZ2h0KTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjb21wb3VuZENoYW5nZVN0YXJ0ZWQpIHsKLQkJCQkJdGFyZ2V0LmVuZENvbXBvdW5kQ2hhbmdlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQ29weSB3aG9sZSBkb2N1bWVudCBmcm9tIG9uZSBzaWRlIHRvIHRoZSBvdGhlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5KGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJCi0JCWlmIChzaG93UmVzb2x2ZVVJKCkpIHsKLQkJCWNvcHlBbGxVbnJlc29sdmVkKGxlZnRUb1JpZ2h0KTsKLQkJCWludmFsaWRhdGVMaW5lcygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCWlmIChsZWZ0VG9SaWdodCkgewotCQkJaWYgKGZMZWZ0LmdldEVuYWJsZWQoKSkgewotCQkJCS8vIGNvcHkgdGV4dAotCQkJCVN0cmluZyB0ZXh0PSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQkJCWZSaWdodC5nZXRUZXh0V2lkZ2V0KCkuc2V0VGV4dCh0ZXh0KTsKLQkJCQlmUmlnaHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZGVsZXRlCi0JCQkJZlJpZ2h0LmdldFRleHRXaWRnZXQoKS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZSaWdodC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCWZSaWdodExpbmVDb3VudD0gZlJpZ2h0LmdldExpbmVDb3VudCgpOwotCQkJc2V0UmlnaHREaXJ0eSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmUmlnaHQuZ2V0RW5hYmxlZCgpKSB7Ci0JCQkJLy8gY29weSB0ZXh0Ci0JCQkJU3RyaW5nIHRleHQ9IGZSaWdodC5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQkJCWZMZWZ0LmdldFRleHRXaWRnZXQoKS5zZXRUZXh0KHRleHQpOwotCQkJCWZMZWZ0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRlbGV0ZQotCQkJCWZMZWZ0LmdldFRleHRXaWRnZXQoKS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZMZWZ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJZkxlZnRMaW5lQ291bnQ9IGZMZWZ0LmdldExpbmVDb3VudCgpOwotCQkJc2V0TGVmdERpcnR5KHRydWUpOwotCQl9Ci0JCWRvRGlmZigpOwotCQlpbnZhbGlkYXRlTGluZXMoKTsKLQkJdXBkYXRlVlNjcm9sbEJhcigpOwotCQlzZWxlY3RGaXJzdERpZmYoKTsKLQkJcmVmcmVzaEJpcmRzRXllVmlldygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5RGlmZkxlZnRUb1JpZ2h0KCkgewotCQljb3B5KGZDdXJyZW50RGlmZiwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5RGlmZlJpZ2h0VG9MZWZ0KCkgewotCQljb3B5KGZDdXJyZW50RGlmZiwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0JCQotCS8qCi0JICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGRpZmYgZnJvbSBvbmUgc2lkZSB0byB0aGUgb3RoZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHkoRGlmZiBkaWZmLCBib29sZWFuIGxlZnRUb1JpZ2h0LCBib29sZWFuIGdvdG9OZXh0KSB7Ci0JCWlmIChjb3B5KGRpZmYsIGxlZnRUb1JpZ2h0KSkgewotCQkJaWYgKGdvdG9OZXh0KSB7Ci0JCQkJbmF2aWdhdGUodHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldmVhbERpZmYoZGlmZiwgdHJ1ZSk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGRpZmYgZnJvbSBvbmUgc2lkZSB0byB0aGUgb3RoZXIgYnV0Ci0JICogZG9lc24ndCByZXZlYWwgYW55dGhpbmcuCi0JICogUmV0dXJucyB0cnVlIGlmIGNvcHkgd2FzIHN1Y2Nlc2Z1bC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29weShEaWZmIGRpZmYsIGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJCi0JCWlmIChkaWZmICE9IG51bGwgJiYgIWRpZmYuaXNSZXNvbHZlZCgpKSB7Ci0KLQkJCVBvc2l0aW9uIGZyb21Qb3M9IG51bGw7Ci0JCQlQb3NpdGlvbiB0b1Bvcz0gbnVsbDsKLQkJCUlEb2N1bWVudCBmcm9tRG9jPSBudWxsOwotCQkJSURvY3VtZW50IHRvRG9jPSBudWxsOwotCi0JCQlpZiAobGVmdFRvUmlnaHQpIHsKLQkJCQlmUmlnaHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmcm9tUG9zPSBkaWZmLmZMZWZ0UG9zOwotCQkJCXRvUG9zPSBkaWZmLmZSaWdodFBvczsKLQkJCQlmcm9tRG9jPSBmTGVmdC5nZXREb2N1bWVudCgpOwotCQkJCXRvRG9jPSBmUmlnaHQuZ2V0RG9jdW1lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkxlZnQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmcm9tUG9zPSBkaWZmLmZSaWdodFBvczsKLQkJCQl0b1Bvcz0gZGlmZi5mTGVmdFBvczsKLQkJCQlmcm9tRG9jPSBmUmlnaHQuZ2V0RG9jdW1lbnQoKTsKLQkJCQl0b0RvYz0gZkxlZnQuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQkJCQotCQkJaWYgKGZyb21Eb2MgIT0gbnVsbCkgewotCQkJCQotCQkJCWludCBmcm9tU3RhcnQ9IGZyb21Qb3MuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGZyb21MZW49IGZyb21Qb3MuZ2V0TGVuZ3RoKCk7Ci0JCQkJCi0JCQkJaW50IHRvU3RhcnQ9IHRvUG9zLmdldE9mZnNldCgpOwotCQkJCWludCB0b0xlbj0gdG9Qb3MuZ2V0TGVuZ3RoKCk7Ci0KLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgcz0gbnVsbDsKLQkJCQkJCQkJCQkJCi0JCQkJCXN3aXRjaCAoZGlmZi5mRGlyZWN0aW9uKSB7Ci0JCQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotCQkJCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotCQkJCQkJcz0gZnJvbURvYy5nZXQoZnJvbVN0YXJ0LCBmcm9tTGVuKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5BTkNFU1RPUjoKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVDoKLQkJCQkJCWlmIChBUFBFTkRfQ09ORkxJQ1QpIHsKLQkJCQkJCQlzPSB0b0RvYy5nZXQodG9TdGFydCwgdG9MZW4pOwotCQkJCQkJCXMrPSBmcm9tRG9jLmdldChmcm9tU3RhcnQsIGZyb21MZW4pOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJcz0gZnJvbURvYy5nZXQoZnJvbVN0YXJ0LCBmcm9tTGVuKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChzICE9IG51bGwpIHsKLQkJCQkJCXRvRG9jLnJlcGxhY2UodG9TdGFydCwgdG9MZW4sIHMpOwkJCQkJCQotCQkJCQkJdG9Qb3Muc2V0T2Zmc2V0KHRvU3RhcnQpOwotCQkJCQkJdG9Qb3Muc2V0TGVuZ3RoKHMubGVuZ3RoKCkpOwotCQkJCQl9CQotCQkJCQotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJCi0JCQlkaWZmLnNldFJlc29sdmVkKHRydWUpOwotCQkJdXBkYXRlUmVzb2x2ZVN0YXR1cygpOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8tLS0tIHNjcm9sbGluZwotCi0JLyoKLQkgKiBDYWxjdWxhdGVzIHZpcnR1YWwgaGVpZ2h0IChpbiBsaW5lcykgb2Ygdmlld3MgYnkgYWRkaW5nIHRoZSBtYXhpbXVtIG9mIGNvcnJlc3BvbmRpbmcgZGlmZnMuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VmlydHVhbEhlaWdodCgpIHsKLQkJaW50IGg9IDE7Ci0JCWlmIChmQWxsRGlmZnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkFsbERpZmZzLml0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBlLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJaCs9IGRpZmYuZ2V0TWF4RGlmZkhlaWdodChmU2hvd0FuY2VzdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaDsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxjdWxhdGVzIGhlaWdodCAoaW4gbGluZXMpIG9mIHJpZ2h0IHZpZXcgYnkgYWRkaW5nIHRoZSBoZWlnaHQgb2YgdGhlIHJpZ2h0IGRpZmZzLgotCSAqLwotCXByaXZhdGUgaW50IGdldFJpZ2h0SGVpZ2h0KCkgewotCQlpbnQgaD0gMTsKLQkJaWYgKGZBbGxEaWZmcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlPSBmQWxsRGlmZnMuaXRlcmF0b3IoKTsKLQkJCWZvciAoaW50IGk9IDA7IGUuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQloKz0gZGlmZi5nZXRSaWdodEhlaWdodCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoOwotCX0KLQkKLQkvKgotCSAqIFRoZSBoZWlnaHQgb2YgdGhlIFRleHRFZGl0b3JzIGluIGxpbmVzLgotCSAqLwotCXByaXZhdGUgaW50IGdldFZpZXdwb3J0SGVpZ2h0KCkgewotCQlTdHlsZWRUZXh0IHRlPSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQotCQlpbnQgdmg9IHRlLmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0JCWlmICh2aCA9PSAwKSB7Ci0JCQlSZWN0YW5nbGUgdHJpbT0gdGUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlpbnQgc2Nyb2xsYmFySGVpZ2h0PSB0cmltLmhlaWdodDsKLQkJCQotCQkJaW50IGhlYWRlckhlaWdodD0gZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlPSAoQ29tcG9zaXRlKSBnZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcj0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCQkJCQkKLQkJCXZoPSByLmhlaWdodC1oZWFkZXJIZWlnaHQtc2Nyb2xsYmFySGVpZ2h0OwotCQl9CQkJCQkJCQkJCQkJCQkJCi0KLQkJcmV0dXJuIHZoIC8gdGUuZ2V0TGluZUhlaWdodCgpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdGhlIHZpcnR1YWwgcG9zaXRpb24gZm9yIHRoZSBnaXZlbiB2aWV3IHBvc2l0aW9uLgotCSAqLwotCXByaXZhdGUgaW50IHJlYWxUb1ZpcnR1YWxQb3NpdGlvbihNZXJnZVNvdXJjZVZpZXdlciB3LCBpbnQgdnBvcykgewotCi0JCWlmICghIGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgfHwgZkFsbERpZmZzID09IG51bGwpCi0JCQlyZXR1cm4gdnBvczsKLQkJCQkKLQkJaW50IHZpZXdQb3M9IDA7CQkvLyByZWFsIHZpZXcgcG9zaXRpb24KLQkJaW50IHZpcnR1YWxQb3M9IDA7CS8vIHZpcnR1YWwgcG9zaXRpb24KLQkJUG9pbnQgcmVnaW9uPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQotCQlJdGVyYXRvciBlPSBmQWxsRGlmZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCVBvc2l0aW9uIHBvcz0gZGlmZi5nZXRQb3NpdGlvbih3KTsKLQkJCXcuZ2V0TGluZVJhbmdlKHBvcywgcmVnaW9uKTsKLQkJCWludCByZWFsSGVpZ2h0PSByZWdpb24ueTsKLQkJCWludCB2aXJ0dWFsSGVpZ2h0PSBkaWZmLmdldE1heERpZmZIZWlnaHQoZlNob3dBbmNlc3Rvcik7Ci0JCQlpZiAodnBvcyA8PSB2aWV3UG9zICsgcmVhbEhlaWdodCkgewkvLyBPSywgZm91bmQhCi0JCQkJdnBvcy09IHZpZXdQb3M7CS8vIG1ha2UgcmVsYXRpdmUgdG8gdGhpcyBzbG90Ci0JCQkJLy8gbm93IHNjYWxlIHBvc2l0aW9uIHdpdGhpbiB0aGlzIHNsb3QgdG8gdmlydHVhbCBzbG90Ci0JCQkJaWYgKHJlYWxIZWlnaHQgPD0gMCkKLQkJCQkJdnBvcz0gMDsKLQkJCQllbHNlCi0JCQkJCXZwb3M9ICh2cG9zKnZpcnR1YWxIZWlnaHQpL3JlYWxIZWlnaHQ7Ci0JCQkJcmV0dXJuIHZpcnR1YWxQb3MrdnBvczsKLQkJCX0KLQkJCXZpZXdQb3MrPSByZWFsSGVpZ2h0OwotCQkJdmlydHVhbFBvcys9IHZpcnR1YWxIZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxQb3M7Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgc2Nyb2xsVmVydGljYWwoaW50IGF2cG9zLCBpbnQgbHZwb3MsIGludCBydnBvcywgTWVyZ2VTb3VyY2VWaWV3ZXIgYWxsQnV0KSB7Ci0JCQkJCQkKLQkJaW50IHM9IDA7Ci0JCQotCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZykgewotCQkJcz0gZ2V0VmlydHVhbEhlaWdodCgpIC0gcnZwb3M7Ci0JCQlpbnQgaGVpZ2h0PSBmUmlnaHQuZ2V0Vmlld3BvcnRMaW5lcygpLzQ7Ci0JCQlpZiAocyA8IDApCi0JCQkJcz0gMDsKLQkJCWlmIChzID4gaGVpZ2h0KQotCQkJCXM9IGhlaWdodDsKLQkJfQotCi0JCWZJblNjcm9sbGluZz0gdHJ1ZTsKLQkJCQkKLQkJaWYgKGlzVGhyZWVXYXkoKSAmJiBhbGxCdXQgIT0gZkFuY2VzdG9yKSB7Ci0JCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZyB8fCBhbGxCdXQgPT0gbnVsbCkgewotCQkJCWludCB5PSB2aXJ0dWFsVG9SZWFsUG9zaXRpb24oZkFuY2VzdG9yLCBhdnBvcytzKS1zOwotCQkJCWZBbmNlc3Rvci52c2Nyb2xsKHkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbEJ1dCAhPSBmTGVmdCkgewotCQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgfHwgYWxsQnV0ID09IG51bGwpIHsKLQkJCQlpbnQgeT0gdmlydHVhbFRvUmVhbFBvc2l0aW9uKGZMZWZ0LCBsdnBvcytzKS1zOwotCQkJCWZMZWZ0LnZzY3JvbGwoeSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWxsQnV0ICE9IGZSaWdodCkgewotCQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgfHwgYWxsQnV0ID09IG51bGwpIHsKLQkJCQlpbnQgeT0gdmlydHVhbFRvUmVhbFBvc2l0aW9uKGZSaWdodCwgcnZwb3MrcyktczsKLQkJCQlmUmlnaHQudnNjcm9sbCh5KTsKLQkJCX0KLQkJfQotCQkKLQkJZkluU2Nyb2xsaW5nPSBmYWxzZTsKLQkJCi0JCWlmIChpc1RocmVlV2F5KCkgJiYgZkFuY2VzdG9yQ2FudmFzICE9IG51bGwpCi0JCQlmQW5jZXN0b3JDYW52YXMucmVwYWludCgpOwotCQkKLQkJaWYgKGZMZWZ0Q2FudmFzICE9IG51bGwpCi0JCQlmTGVmdENhbnZhcy5yZXBhaW50KCk7Ci0JCQotCQlDb250cm9sIGNlbnRlcj0gZ2V0Q2VudGVyKCk7Ci0JCWlmIChjZW50ZXIgaW5zdGFuY2VvZiBCdWZmZXJlZENhbnZhcykKLQkJCSgoQnVmZmVyZWRDYW52YXMpY2VudGVyKS5yZXBhaW50KCk7Ci0JCQotCQlpZiAoZlJpZ2h0Q2FudmFzICE9IG51bGwpCi0JCQlmUmlnaHRDYW52YXMucmVwYWludCgpOwotCX0KLQkJCi0JLyoKLQkgKiBVcGRhdGVzIFNjcm9sbGJhcnMgd2l0aCB2aWV3cG9ydHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNWaWV3cG9ydChNZXJnZVNvdXJjZVZpZXdlciB3KSB7Ci0JCQotCQlpZiAoZkluU2Nyb2xsaW5nKQotCQkJcmV0dXJuOwotCi0JCWludCBpeD0gdy5nZXRUb3BJbmRleCgpOwotCQlpbnQgaXgyPSB3LmdldERvY3VtZW50UmVnaW9uT2Zmc2V0KCk7Ci0JCQotCQlpbnQgdmlld1Bvc2l0aW9uPSByZWFsVG9WaXJ0dWFsUG9zaXRpb24odywgaXgtaXgyKTsKLQkJCQkKLQkJc2Nyb2xsVmVydGljYWwodmlld1Bvc2l0aW9uLCB2aWV3UG9zaXRpb24sIHZpZXdQb3NpdGlvbiwgdyk7CS8vIHNjcm9sbCBhbGwgYnV0IHRoZSBnaXZlbiB2aWV3cwotCQkKLQkJaWYgKGZWU2Nyb2xsQmFyICE9IG51bGwpIHsKLQkJCWludCB2YWx1ZT0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmlld1Bvc2l0aW9uLCBnZXRWaXJ0dWFsSGVpZ2h0KCkgLSBnZXRWaWV3cG9ydEhlaWdodCgpKSk7Ci0JCQlmVlNjcm9sbEJhci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQkJLy9yZWZyZXNoQmlyZEV5ZVZpZXcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVWU2Nyb2xsQmFyKCkgewotCQkKLQkJaWYgKFV0aWxpdGllcy5va1RvVXNlKGZWU2Nyb2xsQmFyKSAmJiBmU3luY2hyb25pemVkU2Nyb2xsaW5nKSB7Ci0JCQlpbnQgdmlydHVhbEhlaWdodD0gZ2V0VmlydHVhbEhlaWdodCgpOwotCQkJaW50IHZpZXdQb3J0SGVpZ2h0PSBnZXRWaWV3cG9ydEhlaWdodCgpOwotCQkJaW50IHBhZ2VJbmNyZW1lbnQ9IHZpZXdQb3J0SGVpZ2h0LTE7Ci0JCQlpbnQgdGh1bWI9ICh2aWV3UG9ydEhlaWdodCA+IHZpcnR1YWxIZWlnaHQpID8gdmlydHVhbEhlaWdodCA6IHZpZXdQb3J0SGVpZ2h0OwotCQkJCQkJCi0JCQlmVlNjcm9sbEJhci5zZXRQYWdlSW5jcmVtZW50KHBhZ2VJbmNyZW1lbnQpOwotCQkJZlZTY3JvbGxCYXIuc2V0TWF4aW11bSh2aXJ0dWFsSGVpZ2h0KTsKLQkJCWZWU2Nyb2xsQmFyLnNldFRodW1iKHRodW1iKTsKLQkJfQkJCQotCX0KLQkKLQkvKgotCSAqIG1hcHMgZ2l2ZW4gdmlydHVhbCBwb3NpdGlvbiBpbnRvIGEgcmVhbCB2aWV3IHBvc2l0aW9uIG9mIHRoaXMgdmlldy4KLQkgKi8KLQlwcml2YXRlIGludCB2aXJ0dWFsVG9SZWFsUG9zaXRpb24oTWVyZ2VTb3VyY2VWaWV3ZXIgcGFydCwgaW50IHYpIHsKLQkJCQotCQlpZiAoISBmU3luY2hyb25pemVkU2Nyb2xsaW5nIHx8IGZBbGxEaWZmcyA9PSBudWxsKQotCQkJcmV0dXJuIHY7Ci0JCQkJCQotCQlpbnQgdmlydHVhbFBvcz0gMDsKLQkJaW50IHZpZXdQb3M9IDA7Ci0JCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCQkKLQkJSXRlcmF0b3IgZT0gZkFsbERpZmZzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQlQb3NpdGlvbiBwb3M9IGRpZmYuZ2V0UG9zaXRpb24ocGFydCk7Ci0JCQlpbnQgdmlld0hlaWdodD0gcGFydC5nZXRMaW5lUmFuZ2UocG9zLCByZWdpb24pLnk7Ci0JCQlpbnQgdmlydHVhbEhlaWdodD0gZGlmZi5nZXRNYXhEaWZmSGVpZ2h0KGZTaG93QW5jZXN0b3IpOwotCQkJaWYgKHYgPCAodmlydHVhbFBvcyArIHZpcnR1YWxIZWlnaHQpKSB7Ci0JCQkJdi09IHZpcnR1YWxQb3M7CQkvLyBtYWtlIHJlbGF0aXZlIHRvIHRoaXMgc2xvdAotCQkJCWlmICh2aWV3SGVpZ2h0IDw9IDApIHsKLQkJCQkJdj0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQl2PSAodip2aWV3SGVpZ2h0KS92aXJ0dWFsSGVpZ2h0OwotCQkJCX0KLQkJCQlyZXR1cm4gdmlld1Bvcyt2OwotCQkJfQotCQkJdmlydHVhbFBvcys9IHZpcnR1YWxIZWlnaHQ7Ci0JCQl2aWV3UG9zKz0gdmlld0hlaWdodDsKLQkJfQotCQlyZXR1cm4gdmlld1BvczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9UZXh0TWVyZ2VWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL1RleHRNZXJnZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdhY2IzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL1RleHRNZXJnZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIEAoIylUZXh0TWVyZ2VWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcwotIwotIyBSZXNvdXJjZSBzdHJpbmdzIGZvciBUZXh0TWVyZ2VWaWV3ZXIuamF2YQotCi10aXRsZT0gVGV4dCBDb21wYXJlCi0KLXNhdmVEaWFsb2cudGl0bGU9IFNhdmUgUmVzb3VyY2UKLXNhdmVEaWFsb2cubWVzc2FnZT0gUmVzb3VyY2UgaGFzIGJlZW4gbW9kaWZpZWQuIFNhdmUgY2hhbmdlcz8KLQotY29tcGFyZVByb2dyZXNzVGFzay50aXRsZT0gQ29tcHV0aW5nIERpZmZlcmVuY2VzLi4uCi0KLXRvb0NvbXBsZXhFcnJvci50aXRsZT0gRXJyb3IKLSMgTkxTX01FU1NBR0VGT1JNQVRfQUxMCi10b29Db21wbGV4RXJyb3IuZm9ybWF0PSBUb28gbWFueSBkaWZmZXJlbmNlcy4gVHVybiBvbiB0aGUgJydJZ25vcmUgV2hpdGUgU3BhY2UnJyBvcHRpb24gb3IgZG8gYSBzdHJ1Y3R1cmUgY29tcGFyZSBmaXJzdC4KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRvb2xiYXIgYWN0aW9ucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYWN0aW9uLkNvcHlMZWZ0VG9SaWdodC5sYWJlbD1Db3B5IExlZnQgdG8gUmlnaHQKLWFjdGlvbi5Db3B5TGVmdFRvUmlnaHQudG9vbHRpcD1Db3B5IEFsbCBmcm9tIExlZnQgdG8gUmlnaHQKLWFjdGlvbi5Db3B5TGVmdFRvUmlnaHQuaW1hZ2U9Y29weV9yX2NvLmdpZgotCi1hY3Rpb24uQ29weVJpZ2h0VG9MZWZ0LmxhYmVsPUNvcHkgUmlnaHQgdG8gTGVmdAotYWN0aW9uLkNvcHlSaWdodFRvTGVmdC50b29sdGlwPUNvcHkgQWxsIE5vbi1Db25mbGljdGluZyBDaGFuZ2VzIGZyb20gUmlnaHQgdG8gTGVmdAotYWN0aW9uLkNvcHlSaWdodFRvTGVmdC5pbWFnZT1jb3B5X2xfY28uZ2lmCi0KLWFjdGlvbi5Db3B5RGlmZkxlZnRUb1JpZ2h0LmxhYmVsPUNvcHkgQ3VycmVudCBDaGFuZ2UgdG8gUmlnaHQKLWFjdGlvbi5Db3B5RGlmZkxlZnRUb1JpZ2h0LnRvb2x0aXA9Q29weSBDdXJyZW50IENoYW5nZSBmcm9tIExlZnQgdG8gUmlnaHQKLWFjdGlvbi5Db3B5RGlmZkxlZnRUb1JpZ2h0LmltYWdlPWNvcHljb250X3JfY28uZ2lmCi0KLWFjdGlvbi5Db3B5RGlmZlJpZ2h0VG9MZWZ0LmxhYmVsPUNvcHkgQ3VycmVudCBDaGFuZ2UgdG8gTGVmdAotYWN0aW9uLkNvcHlEaWZmUmlnaHRUb0xlZnQudG9vbHRpcD1Db3B5IEN1cnJlbnQgQ2hhbmdlIGZyb20gUmlnaHQgdG8gTGVmdAotYWN0aW9uLkNvcHlEaWZmUmlnaHRUb0xlZnQuaW1hZ2U9Y29weWNvbnRfbF9jby5naWYKLQotYWN0aW9uLk5leHREaWZmLmxhYmVsPU5leHQKLWFjdGlvbi5OZXh0RGlmZi50b29sdGlwPVNlbGVjdCBOZXh0IENoYW5nZQotYWN0aW9uLk5leHREaWZmLmltYWdlPW5leHRfbmF2LmdpZgotCi1hY3Rpb24uUHJldkRpZmYubGFiZWw9UHJldmlvdXMKLWFjdGlvbi5QcmV2RGlmZi50b29sdGlwPVNlbGVjdCBQcmV2aW91cyBDaGFuZ2UKLWFjdGlvbi5QcmV2RGlmZi5pbWFnZT1wcmV2X25hdi5naWYKLQotYWN0aW9uLkVuYWJsZUFuY2VzdG9yLmxhYmVsPUVuYWJsZSBBbmNlc3RvciBQYW5lCi1hY3Rpb24uRW5hYmxlQW5jZXN0b3IudG9vbHRpcC51bmNoZWNrZWQ9U2hvdyBBbmNlc3RvciBQYW5lCi1hY3Rpb24uRW5hYmxlQW5jZXN0b3IudG9vbHRpcC5jaGVja2VkPUhpZGUgQW5jZXN0b3IgUGFuZQotYWN0aW9uLkVuYWJsZUFuY2VzdG9yLmRlc2NyaXB0aW9uLnVuY2hlY2tlZD1TaG93IEFuY2VzdG9yIFBhbmUKLWFjdGlvbi5FbmFibGVBbmNlc3Rvci5kZXNjcmlwdGlvbi5jaGVja2VkPUhpZGUgQW5jZXN0b3IgUGFuZQotYWN0aW9uLkVuYWJsZUFuY2VzdG9yLmltYWdlPWFuY2VzdG9ycGFuZV9jby5naWYKLQotYWN0aW9uLklnbm9yZUFuY2VzdG9yLmxhYmVsPUlnbm9yZSBBbmNlc3RvcgotYWN0aW9uLklnbm9yZUFuY2VzdG9yLnRvb2x0aXAudW5jaGVja2VkPVR3by1XYXkgQ29tcGFyZSAoSWdub3JlIEFuY2VzdG9yKQotYWN0aW9uLklnbm9yZUFuY2VzdG9yLnRvb2x0aXAuY2hlY2tlZD1UaHJlZS1XYXkgQ29tcGFyZQotYWN0aW9uLklnbm9yZUFuY2VzdG9yLmRlc2NyaXB0aW9uLnVuY2hlY2tlZD1Ud28tV2F5IENvbXBhcmUgKElnbm9yZSBBbmNlc3RvcikKLWFjdGlvbi5JZ25vcmVBbmNlc3Rvci5kZXNjcmlwdGlvbi5jaGVja2VkPVRocmVlLVdheSBDb21wYXJlCi1hY3Rpb24uSWdub3JlQW5jZXN0b3IuaW1hZ2U9dHdvd2F5Y29tcGFyZV9jby5naWYKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb250ZXh0IG1lbnUgYWN0aW9ucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYWN0aW9uLnVuZG8ubGFiZWw9VW5kb0BDdHJsK1oKLWFjdGlvbi51bmRvLnRvb2x0aXA9VW5kbyBMYXN0IE9wZXJhdGlvbgotCi1hY3Rpb24ucmVkby5sYWJlbD1SZWRvQEN0cmwrWQotYWN0aW9uLnJlZG8udG9vbHRpcD1SZWRvIExhc3QgT3BlcmF0aW9uCi0KLWFjdGlvbi5jdXQubGFiZWw9Q3V0QEN0cmwrWAotYWN0aW9uLmN1dC50b29sdGlwPUN1dCBUZXh0IFNlbGVjdGlvbiB0byBDbGlwYm9hcmQKLQotYWN0aW9uLmNvcHkubGFiZWw9Q29weUBDdHJsK0MKLWFjdGlvbi5jb3B5LnRvb2x0aXA9Q29weSBUZXh0IFNlbGVjdGlvbiB0byBDbGlwYm9hcmQKLQotYWN0aW9uLnBhc3RlLmxhYmVsPVBhc3RlQEN0cmwrVgotYWN0aW9uLnBhc3RlLnRvb2x0aXA9UmVwbGFjZSBUZXh0IFNlbGVjdGlvbiB3aXRoIENsaXBib2FyZCBDb250ZW50cwotCi1hY3Rpb24uZGVsZXRlLmxhYmVsPURlbGV0ZQotYWN0aW9uLmRlbGV0ZS50b29sdGlwPURlbGV0ZSBDdXJyZW50IFRleHQgU2VsZWN0aW9uCi0KLWFjdGlvbi5maW5kLmxhYmVsPUZpbmQuLi5AQ3RybCtGCi1hY3Rpb24uZmluZC50b29sdGlwPUZpbmQgT2NjdXJyZW5jZQotCi1hY3Rpb24uc2VsZWN0QWxsLmxhYmVsPVNlbGVjdCBBbGxAQ3RybCtBCi1hY3Rpb24uc2VsZWN0QWxsLnRvb2x0aXA9U2VsZWN0IEFsbCBDaGFuZ2VzCi0KLWFjdGlvbi5zYXZlLmxhYmVsPVNhdmVAQ3RybCtTCi1hY3Rpb24uc2F2ZS50b29sdGlwPVNhdmUgQ2hhbmdlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYwNmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5OVDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotU3VwcG9ydCBmb3IgY29tcGFyZSBhbmQgbWVyZ2Ugdmlld2VycyB3aGljaCBzaG93IHRoZQotY29udGVudCBzaWRlLWJ5LXNpZGUuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotCi1UaGUgPGI+Q29udGVudE1lcmdlVmlld2VyPC9iPiBpcyBhbiBhYnN0cmFjdCBjb21wYXJlIGFuZCBtZXJnZSB2aWV3ZXIKLXdpdGggdHdvIHNpZGUtYnktc2lkZSBjb250ZW50IGFyZWFzIGFuZCBhbiBvcHRpb25hbCBjb250ZW50IGFyZWEgZm9yIGEKLWNvbW1vbiBhbmNlc3RvciAoZm9yIHRocmVlLXdheSBjb21wYXJlKS4gQmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gbWFrZXMKLW5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjb250ZW50IHR5cGUgaXQgaXMgYSBzdWJjbGFzcyByZXNwb25zaWJpbGl0eSB0bwotZGVhbCB3aXRoIGEgc3BlY2lmaWMgdHlwZS4gSXRzIHN1YmNsYXNzIDxiPkltYWdlTWVyZ2VWaWV3ZXI8L2I+IGluCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwgc2hvd3MgaG93IHRvIGJhc2UgYSBzaW1wbGUKLW1lcmdldmlld2VyIGZvciBpbWFnZXMgb24gPGI+Q29udGVudE1lcmdlVmlld2VyPC9iPi4KLTxwPgotCi1BIDxiPkNvbnRlbnRNZXJnZVZpZXdlcjwvYj4gYWNjZXNzZXMgaXRzIG1vZGVsIGJ5IG1lYW5zIG9mIGEgY29udGVudAotcHJvdmlkZXIgd2hpY2ggbXVzdCBpbXBsZW1lbnQgdGhlIDxiPklNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcjwvYj4gaW50ZXJmYWNlLgotPHA+Ci0KLVRoZSA8Yj5UZXh0TWVyZ2VWaWV3ZXI8L2I+IGlzIHRoZSBzdGFuZGFyZCBjb25jcmV0ZSBzdWJjbGFzcyBvZgotPGI+Q29udGVudE1lcmdlVmlld2VyPC9iPiBmb3IgY29tcGFyaW5nIGFuZCBtZXJnaW5nIHRleHQgY29udGVudC4KLTxicj4KLUEgdGV4dCBtZXJnZSB2aWV3ZXIgdXNlcyB0aGUgPGI+b3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLlJhbmdlRGlmZmVyZW5jZXI8L2I+Ci10byBwZXJmb3JtIGEgdGV4dHVhbCwgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gb2YgdHdvIChvciB0aHJlZSkgaW5wdXQgZG9jdW1lbnRzLgotRm9yIHRleHQgbGluZXMgdGhhdCBkaWZmZXIgdGhlIDxiPlRleHRNZXJnZVZpZXdlcjwvYj4gdXNlcyBhbiA8Yj5JVG9rZW5Db21wYXJhdG9yPC9iPgotdG8gZmluZCBsb25nZXN0IHNlcXVlbmNlcyBvZiBtYXRjaGluZyBhbmQgbm9uLW1hdGNoaW5nIHRva2Vucy4KLVRoZSA8Yj5UZXh0TWVyZ2VWaWV3ZXI8L2I+J3MKLWRlZmF1bHQgdG9rZW4gY29tcGFyZSB3b3JrcyBvbiBjaGFyYWN0ZXJzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiBJZiBhCi1kaWZmZXJlbnQgc3RyYXRlZ3kgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSwgSmF2YSB0b2tlbnMgaW4gYSBKYXZhLWF3YXJlCi1tZXJnZSB2aWV3ZXIpLCBjbGllbnRzIGNhbiBjcmVhdGUgdGhlaXIgb3duIHRva2VuIGNvbXBhcmF0b3JzIGJ5IGltcGxlbWVudGluZwotdGhlIDxiPklUb2tlbkNvbXBhcmF0b3I8L2I+IGludGVyZmFjZS4KLTxwPlRoZSA8Yj5UZXh0TWVyZ2VWaWV3ZXI8L2I+IG5vdCBvbmx5IHdvcmtzIG9uIHdob2xlIGRvY3VtZW50cyBidXQgb24KLXN1YnJhbmdlcyBvZiBkb2N1bWVudHMgdG9vLiBJbiB0aGlzIGNhc2UgdGhlIHZpZXdlcidzIGlucHV0IG11c3QgYmUgYW4KLTxiPklEb2N1bWVudFJhbmdlPC9iPiBpbnN0ZWFkIG9mIGFuIDxiPklEb2N1bWVudDwvYj4uCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWJzdHJhY3RWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWJzdHJhY3RWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiZDI1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0Fic3RyYWN0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaWV3ZXIgZXh0ZW5kcyBWaWV3ZXIgewotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHMsIGJvb2xlYW4gcmV2ZWFsKSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMTg1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0FkZEZyb21IaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLQotcHVibGljIGNsYXNzIEFkZEZyb21IaXN0b3J5QWN0aW9uIGV4dGVuZHMgQmFzZUNvbXBhcmVBY3Rpb24gewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQWRkRnJvbUhpc3RvcnlBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQWRkRnJvbUhpc3RvcnlBY3Rpb24oKSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKHNlbGVjdGlvbikubGVuZ3RoID09IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAidGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCVNoZWxsIHBhcmVudFNoZWxsPSBDb21wYXJlVUlQbHVnaW4uZ2V0U2hlbGwoKTsKLQkJQWRkRnJvbUhpc3RvcnlEaWFsb2cgZGlhbG9nPSBudWxsOwotCi0JCU9iamVjdFtdIHM9IFV0aWxpdGllcy5nZXRSZXNvdXJjZXMoc2VsZWN0aW9uKTsKLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgbz0gc1tpXTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCUlDb250YWluZXIgY29udGFpbmVyPSAoSUNvbnRhaW5lcikgbzsKLQkJCQkKLQkJCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgcG1kaWFsb2c9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cocGFyZW50U2hlbGwpOwkKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIHBtPSBwbWRpYWxvZy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQkJCQlJRmlsZVtdIHN0YXRlcz0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdGF0ZXM9IGNvbnRhaW5lci5maW5kRGVsZXRlZE1lbWJlcnNXaXRoSGlzdG9yeShJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIHBtKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXBtLmRvbmUoKTsKLQkJCQl9Ci0JCQotCQkJCWlmIChzdGF0ZXMgPT0gbnVsbCB8fCBzdGF0ZXMubGVuZ3RoIDw9IDApIHsKLQkJCQkJU3RyaW5nIG1zZz0gVXRpbGl0aWVzLmdldFN0cmluZyhidW5kbGUsICJub0xvY2FsSGlzdG9yeUVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24ocGFyZW50U2hlbGwsIHRpdGxlLCBtc2cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkKLQkJCQlpZiAoZGlhbG9nID09IG51bGwpIHsKLQkJCQkJZGlhbG9nPSBuZXcgQWRkRnJvbUhpc3RvcnlEaWFsb2cocGFyZW50U2hlbGwsIGJ1bmRsZSk7Ci0JCQkJCWRpYWxvZy5zZXRIZWxwQ29udGV4dElkKElDb21wYXJlQ29udGV4dElkcy5BRERfRlJPTV9ISVNUT1JZX0RJQUxPRyk7Ci0JCQkJfQotCQkJCQkKLQkJCQlpZiAoZGlhbG9nLnNlbGVjdChjb250YWluZXIsIHN0YXRlcykpIHsJCQotCQkJCQkJCQotCQkJCQlBZGRGcm9tSGlzdG9yeURpYWxvZy5IaXN0b3J5SW5wdXRbXSBzZWxlY3RlZD0gZGlhbG9nLmdldFNlbGVjdGVkKCk7CQkJCQotCi0JCQkJCWlmIChzZWxlY3RlZCAhPSBudWxsICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsJCi0JCQkJCQl0cnkgewotCQkJCQkJCXVwZGF0ZVdvcmtzcGFjZShidW5kbGUsIHBhcmVudFNoZWxsLCBzZWxlY3RlZCk7Ci0JCi0JCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkJLy8gRG8gbm90aGluZy4gT3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGVkIGJ5IHVzZXIuCi0JCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHgpIHsKLQkJCQkJCQlTdHJpbmcgcmVhc29uPSB4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYXJlbnRTaGVsbCwgdGl0bGUsIFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoYnVuZGxlLCAicmVwbGFjZUVycm9yIiwgcmVhc29uKSk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQl2b2lkIGNyZWF0ZUNvbnRhaW5lcnMoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb250YWluZXIgY29udGFpbmVyPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCUlGb2xkZXIgcGFyZW50PSAoSUZvbGRlcikgY29udGFpbmVyOwotCQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQljcmVhdGVDb250YWluZXJzKHBhcmVudCk7Ci0JCQkJcGFyZW50LmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVdvcmtzcGFjZShmaW5hbCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFNoZWxsIHNoZWxsLAotCQkJCQlmaW5hbCBBZGRGcm9tSGlzdG9yeURpYWxvZy5IaXN0b3J5SW5wdXRbXSBzZWxlY3RlZCkKLQkJCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHRhc2tOYW1lPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRhc2tOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcG0uYmVnaW5UYXNrKHRhc2tOYW1lLCBzZWxlY3RlZC5sZW5ndGgpOwotCQkJCQkKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJRmlsZSBmaWxlPSBzZWxlY3RlZFtpXS5mRmlsZTsKLQkJCQkJCUlGaWxlU3RhdGUgZmlsZVN0YXRlPSBzZWxlY3RlZFtpXS5mRmlsZVN0YXRlOwotCQkJCQkJY3JlYXRlQ29udGFpbmVycyhmaWxlKTsKLQkJCQkJCQotCQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3I9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmaWxlLmNyZWF0ZShmaWxlU3RhdGUuZ2V0Q29udGVudHMoKSwgZmFsc2UsIHN1Yk1vbml0b3IpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwbS5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtZGlhbG9nPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsJCQkJCi0JCXBtZGlhbG9nLnJ1bihmYWxzZSwgdHJ1ZSwgb3BlcmF0aW9uKTsJCQkJCQkJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0FkZEZyb21IaXN0b3J5QWN0aW9uLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0FkZEZyb21IaXN0b3J5QWN0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDU1MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BZGRGcm9tSGlzdG9yeUFjdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEAoIylBZGRGcm9tSGlzdG9yeUFjdGlvbi5wcm9wZXJ0aWVzCi0jCi0jIFJlc291cmNlcyBmb3IgQWRkRnJvbUhpc3RvcnlBY3Rpb24uamF2YQotCi10aXRsZT0gUmVzdG9yZSBmcm9tIExvY2FsIEhpc3RvcnkKLQotbWVtYmVyUGFuZVRpdGxlPSB7MH0gLSBBdmFpbGFibGUgRmlsZXMgaW4gTG9jYWwgSGlzdG9yeToKLQotdHJlZVRpdGxlRm9ybWF0PSBMb2NhbCBIaXN0b3J5IG9mICcnezB9JycKLWRhdGVJY29uPSBvYmoxNi9kYXlfb2JqLmdpZgotdGltZUljb249IG9iajE2L3Jlc291cmNlX29iai5naWYKLQotbWVtYmVyRGVzY3JpcHRpb249IENoZWNrIGZpbGVzIHRvIHJlc3RvcmUgZnJvbSBsb2NhbCBoaXN0b3J5OgotZWRpdGlvbkRlc2NyaXB0aW9uPSBTZWxlY3QgYW4gZWRpdGlvbiBvZiBhIGZpbGU6Ci0KLXRyZWVGb3JtYXQ9IHswfQotd29ya3NwYWNlVHJlZUZvcm1hdD0gezB9IChXb3Jrc3BhY2UgRmlsZSkKLXBhcnNlRXJyb3JGb3JtYXQ9IHswfSAoUGFyc2UgRXJyb3IpCi0KLWVkaXRpb25MYWJlbD0gTG9jYWwgSGlzdG9yeSAoezB9KQotd29ya3NwYWNlRWRpdGlvbkxhYmVsPSBXb3Jrc3BhY2UgRmlsZQotCi10YXJnZXRMYWJlbD0gezB9Ci0KLXRvZGF5Rm9ybWF0PSBUb2RheSAoezB9KQoteWVzdGVyZGF5Rm9ybWF0PSBZZXN0ZXJkYXkgKHswfSkKLWRheUZvcm1hdD0gezB9Ci0KLWJ1dHRvbkxhYmVsPSBSZXN0b3JlCi0KLW5vTG9jYWxIaXN0b3J5RXJyb3I9IE5vIGRlbGV0ZWQgcmVzb3VyY2VzIGluIGxvY2FsIGhpc3RvcnkgZm9yIHNlbGVjdGVkIGNvbnRhaW5lci4KLXJlcGxhY2VFcnJvcj1DYW5ub3QgcmVwbGFjZSByZXNvdXJjZSAocmVhc29uOiB7MH0pLgotCi10YXNrTmFtZT1SZXN0b3JpbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5OTIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0FkZEZyb21IaXN0b3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRGcm9tSGlzdG9yeURpYWxvZyBleHRlbmRzIFJlc2l6YWJsZURpYWxvZyB7Ci0JCi0Jc3RhdGljIGNsYXNzIEhpc3RvcnlJbnB1dCBpbXBsZW1lbnRzIElUeXBlZEVsZW1lbnQsIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yLCBJTW9kaWZpY2F0aW9uRGF0ZSB7Ci0JCUlGaWxlIGZGaWxlOwotCQlJRmlsZVN0YXRlIGZGaWxlU3RhdGU7Ci0JCQotCQlIaXN0b3J5SW5wdXQoSUZpbGUgZmlsZSwgSUZpbGVTdGF0ZSBmaWxlU3RhdGUpIHsKLQkJCWZGaWxlPSBmaWxlOwotCQkJZkZpbGVTdGF0ZT0gZmlsZVN0YXRlOwotCQl9Ci0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmRmlsZVN0YXRlLmdldENvbnRlbnRzKCkpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJCVN0cmluZyBjaGFyc2V0PSBudWxsOwotCQkJdHJ5IHsKLQkJCQljaGFyc2V0PSBmRmlsZVN0YXRlLmdldENoYXJzZXQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJfQotCQkJaWYgKGNoYXJzZXQgPT0gbnVsbCkKLQkJCQljaGFyc2V0PSBVdGlsaXRpZXMuZ2V0Q2hhcnNldChmRmlsZSk7Ci0JCQlyZXR1cm4gY2hhcnNldDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBmRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJcmV0dXJuIENvbXBhcmVVSS5nZXRJbWFnZShmRmlsZSk7Ci0JCX0KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpIHsKLQkJCXJldHVybiBmRmlsZVN0YXRlLmdldE1vZGlmaWNhdGlvblRpbWUoKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgY2xhc3MgRmlsZUhpc3RvcnkgewotCQlwcml2YXRlIElGaWxlIGZGaWxlOwotCQlwcml2YXRlIElGaWxlU3RhdGVbXSBmU3RhdGVzOwotCQlwcml2YXRlIGludCBmU2VsZWN0ZWQ7Ci0JCQotCQlGaWxlSGlzdG9yeShJRmlsZSBmaWxlKSB7Ci0JCQlmRmlsZT0gZmlsZTsKLQkJfQotCQkKLQkJSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCXJldHVybiBmRmlsZTsKLQkJfQotCQkKLQkJSUZpbGVTdGF0ZVtdIGdldFN0YXRlcygpIHsKLQkJCWlmIChmU3RhdGVzID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmU3RhdGVzPSBmRmlsZS5nZXRIaXN0b3J5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gTmVlZFdvcmsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlN0YXRlczsKLQkJfQotCQkKLQkJSUZpbGVTdGF0ZSBnZXRTZWxlY3RlZFN0YXRlKCkgewotCQkJcmV0dXJuIGdldFN0YXRlcygpW2ZTZWxlY3RlZF07Ci0JCX0KLQkJCi0JCXZvaWQgc2V0U2VsZWN0ZWQoSUZpbGVTdGF0ZSBzdGF0ZSkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZTdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZlN0YXRlc1tpXSA9PSBzdGF0ZSkgewotCQkJCQlmU2VsZWN0ZWQ9IGk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUhpc3RvcnlJbnB1dCBnZXRIaXN0b3J5SW5wdXQoKSB7Ci0JCQlyZXR1cm4gbmV3IEhpc3RvcnlJbnB1dChmRmlsZSwgZ2V0U2VsZWN0ZWRTdGF0ZSgpKTsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc1NlbGVjdGVkKGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ID09IGZTZWxlY3RlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCXByaXZhdGUgQXJyYXlMaXN0IGZBcnJheUxpc3Q9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIEZpbGVIaXN0b3J5IGZDdXJyZW50RmlsZUhpc3Rvcnk7Ci0KLQkvLyBTV1QgY29udHJvbHMKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZDb250ZW50UGFuZTsKLQlwcml2YXRlIEJ1dHRvbiBmQ29tbWl0QnV0dG9uOwotCXByaXZhdGUgVGFibGUgZk1lbWJlclRhYmxlOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclBhbmUgZk1lbWJlclBhbmU7Ci0JcHJpdmF0ZSBUcmVlIGZFZGl0aW9uVHJlZTsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJQYW5lIGZFZGl0aW9uUGFuZTsKLQlwcml2YXRlIEltYWdlIGZEYXRlSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmVGltZUltYWdlOwotCi0KLQlwdWJsaWMgQWRkRnJvbUhpc3RvcnlEaWFsb2coU2hlbGwgcGFyZW50LCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUpIHsKLQkJc3VwZXIocGFyZW50LCBidW5kbGUpOwotCQkJCQkKLQkJU3RyaW5nIGljb25OYW1lPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkYXRlSWNvbiIsICJvYmoxNi9kYXlfb2JqLmdpZiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGljb25OYW1lKTsKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlmRGF0ZUltYWdlPSBpZC5jcmVhdGVJbWFnZSgpOwotCQlpY29uTmFtZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAidGltZUljb24iLCAib2JqMTYvcmVzb3VyY2Vfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoaWNvbk5hbWUpOwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCWZUaW1lSW1hZ2U9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChJQ29udGFpbmVyIHJvb3QsIElGaWxlW10gaW5wdXRGaWxlcykgewotCQkKLQkJY3JlYXRlKCk7CS8vIGNyZWF0ZSB3aWRnZXRzCi0JCQotCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJtZW1iZXJQYW5lVGl0bGUiKTsJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGl0bGU9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgcm9vdC5nZXROYW1lKCkgfSk7Ci0JCWZNZW1iZXJQYW5lLnNldEltYWdlKENvbXBhcmVVSS5nZXRJbWFnZShyb290KSk7Ci0JCWZNZW1iZXJQYW5lLnNldFRleHQodGl0bGUpOwotCQkKLQkJLy8gc29ydCBpbnB1dCBmaWxlcwotCQlmaW5hbCBpbnQgY291bnQ9IGlucHV0RmlsZXMubGVuZ3RoOwotCQlmaW5hbCBJRmlsZVtdIGZpbGVzPSBuZXcgSUZpbGVbY291bnRdOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCWZpbGVzW2ldPSBpbnB1dEZpbGVzW2ldOwotCQlpZiAoY291bnQgPiAxKQotCQkJaW50ZXJuYWxTb3J0KGZpbGVzLCAwLCBjb3VudC0xKTsKLQkJCQotCQkKLQkJU3RyaW5nIHByZWZpeD0gcm9vdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQotCQlpZiAoZk1lbWJlclRhYmxlICE9IG51bGwgJiYgIWZNZW1iZXJUYWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGaWxlIGZpbGU9IGZpbGVzW2ldOwotCQkJCVN0cmluZyBwYXRoPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJCXBhdGg9IHBhdGguc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSsxKTsKLQkJCQlUYWJsZUl0ZW0gdGk9IG5ldyBUYWJsZUl0ZW0oZk1lbWJlclRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdGkuc2V0SW1hZ2UoQ29tcGFyZVVJLmdldEltYWdlKGZpbGUpKTsKLQkJCQl0aS5zZXRUZXh0KHBhdGgpOwotCQkJCXRpLnNldERhdGEobmV3IEZpbGVIaXN0b3J5KGZpbGUpKTsKLQkJCX0KLQkJfQotCQkKLQkJb3BlbigpOwotCQkKLQkJcmV0dXJuIChnZXRSZXR1cm5Db2RlKCkgPT0gT0spICYmIChmQXJyYXlMaXN0LnNpemUoKSA+IDApOwotCX0KLQkJCi0JSGlzdG9yeUlucHV0W10gZ2V0U2VsZWN0ZWQoKSB7Ci0JCUhpc3RvcnlJbnB1dFtdIHNlbGVjdGVkPSBuZXcgSGlzdG9yeUlucHV0W2ZBcnJheUxpc3Quc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRlcj0gZkFycmF5TGlzdC5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpPSAwOyBpdGVyLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlGaWxlSGlzdG9yeSBoPSAoRmlsZUhpc3RvcnkpIGl0ZXIubmV4dCgpOwotCQkJc2VsZWN0ZWRbaV09IGguZ2V0SGlzdG9yeUlucHV0KCk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQkJCQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50MikgewotCQkKLQkJQ29tcG9zaXRlIHBhcmVudD0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQyKTsKLQotCQlnZXRTaGVsbCgpLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAidGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCW9yZy5lY2xpcHNlLmNvbXBhcmUuU3BsaXR0ZXIgdnNwbGl0dGVyPSBuZXcgb3JnLmVjbGlwc2UuY29tcGFyZS5TcGxpdHRlcihwYXJlbnQsICBTV1QuVkVSVElDQUwpOwotCQl2c3BsaXR0ZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQotCQl2c3BsaXR0ZXIuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCQlpZiAoZkRhdGVJbWFnZSAhPSBudWxsKQotCQkJCQkJZkRhdGVJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWlmIChmVGltZUltYWdlICE9IG51bGwpCi0JCQkJCQlmVGltZUltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQkvLyB3ZSBuZWVkIHR3byBwYW5lczogdGhlIGxlZnQgZm9yIHRoZSBlbGVtZW50cywgdGhlIHJpZ2h0IG9uZSBmb3IgdGhlIGVkaXRpb25zCi0JCVNwbGl0dGVyIGhzcGxpdHRlcj0gbmV3IFNwbGl0dGVyKHZzcGxpdHRlciwgIFNXVC5IT1JJWk9OVEFMKTsKLQkJCi0JCUNvbXBvc2l0ZSBjPSBuZXcgQ29tcG9zaXRlKGhzcGxpdHRlciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAyOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nPSAyOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMTsKLQkJYy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJTGFiZWwgbDE9IG5ldyBMYWJlbChjLCBTV1QuTk9ORSk7Ci0JCWwxLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAibWVtYmVyRGVzY3JpcHRpb24iKSk7CS8vJE5PTi1OTFMtMSQKLQkJZk1lbWJlclBhbmU9IG5ldyBDb21wYXJlVmlld2VyUGFuZShjLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlmTWVtYmVyUGFuZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmTWVtYmVyVGFibGU9IG5ldyBUYWJsZShmTWVtYmVyUGFuZSwgU1dULkNIRUNLIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJZk1lbWJlclRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJCQlpZiAoZS5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQkJVGFibGVJdGVtIHRpPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0JCQkJCQkJaWYgKHRpLmdldENoZWNrZWQoKSkKLQkJCQkJCQkJZkFycmF5TGlzdC5hZGQodGkuZ2V0RGF0YSgpKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWZBcnJheUxpc3QucmVtb3ZlKHRpLmdldERhdGEoKSk7Ci0JCQkJCQkJCQotCQkJCQkJCWlmIChmQ29tbWl0QnV0dG9uICE9IG51bGwpCi0JCQkJCQkJCWZDb21taXRCdXR0b24uc2V0RW5hYmxlZChmQXJyYXlMaXN0LnNpemUoKSA+IDApOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaGFuZGxlTWVtYmVyU2VsZWN0KGUuaXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQkJCi0JCWZNZW1iZXJQYW5lLnNldENvbnRlbnQoZk1lbWJlclRhYmxlKTsKLQkJCi0JCWM9IG5ldyBDb21wb3NpdGUoaHNwbGl0dGVyLCBTV1QuTk9ORSk7Ci0JCWxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAyOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nPSAyOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMTsKLQkJYy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJTGFiZWwgbDI9IG5ldyBMYWJlbChjLCBTV1QuTk9ORSk7Ci0JCWwyLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZWRpdGlvbkRlc2NyaXB0aW9uIikpOwkvLyROT04tTkxTLTEkCi0JCWZFZGl0aW9uUGFuZT0gbmV3IENvbXBhcmVWaWV3ZXJQYW5lKGMsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWZFZGl0aW9uUGFuZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWZFZGl0aW9uVHJlZT0gbmV3IFRyZWUoZkVkaXRpb25QYW5lLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlmRWRpdGlvblRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWZlZWRDb250ZW50KGUuaXRlbSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmRWRpdGlvblBhbmUuc2V0Q29udGVudChmRWRpdGlvblRyZWUpOwkJCi0JCQotCQlhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsgLy8gdG8gYXZvaWQgYXBwbHlpbmcgZm9udCB0byBjb21wYXJlIHZpZXdlcgotCQlmQ29udGVudFBhbmU9IG5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSh2c3BsaXR0ZXIsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCkgewotCQkJcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0JCQkJcmV0dXJuIENvbXBhcmVVSS5maW5kQ29udGVudFZpZXdlcihvbGRWaWV3ZXIsIGlucHV0LCB0aGlzLCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24pOwkKLQkJCX0KLQkJfTsKLQkJdnNwbGl0dGVyLnNldFdlaWdodHMobmV3IGludFtdIHsgMzAsIDcwIH0pOwotCQkKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JLyoKLQkgKiBGZWVkcyBzZWxlY3Rpb24gZnJvbSBtZW1iZXIgdmlld2VyIHRvIGVkaXRpb24gdmlld2VyLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVNZW1iZXJTZWxlY3QoV2lkZ2V0IHcpIHsKLQkJT2JqZWN0IGRhdGE9IG51bGw7Ci0JCWlmICh3ICE9IG51bGwpCi0JCQlkYXRhPSB3LmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBGaWxlSGlzdG9yeSkgewotCQkJCi0JCQlGaWxlSGlzdG9yeSBoPSAoRmlsZUhpc3RvcnkpIGRhdGE7Ci0JCQlmQ3VycmVudEZpbGVIaXN0b3J5PSBoOwotCQkJCi0JCQlJRmlsZSBmaWxlPSBoLmdldEZpbGUoKTsKLQkJCUlGaWxlU3RhdGVbXSBzdGF0ZXM9IGguZ2V0U3RhdGVzKCk7Ci0JCQkKLQkJCWZFZGl0aW9uUGFuZS5zZXRJbWFnZShDb21wYXJlVUkuZ2V0SW1hZ2UoZmlsZSkpOwotCQkJU3RyaW5nIHBhdHRlcm49IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRyZWVUaXRsZUZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdGl0bGU9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIG5ldyBPYmplY3RbXSB7IGZpbGUuZ2V0TmFtZSgpIH0pOwotCQkJZkVkaXRpb25QYW5lLnNldFRleHQodGl0bGUpOwotCQkJCi0JCQlpZiAoZkVkaXRpb25UcmVlICE9IG51bGwpIHsKLQkJCQlmRWRpdGlvblRyZWUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlmRWRpdGlvblRyZWUucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IHN0YXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlhZGRFZGl0aW9uKG5ldyBIaXN0b3J5SW5wdXQoZmlsZSwgc3RhdGVzW2ldKSwgaC5pc1NlbGVjdGVkKGkpKTsKLQkJCQl9Ci0JCQkJZkVkaXRpb25UcmVlLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlmQ3VycmVudEZpbGVIaXN0b3J5PSBudWxsOwotCX0KLQkKLQkvKgotCSAqIEFkZHMgdGhlIGdpdmVuIFBhaXIgdG8gdGhlIGVkaXRpb24gdHJlZS4KLQkgKiBJdCB0YWtlcyBjYXJlIG9mIGNyZWF0aW5nIHRyZWUgbm9kZXMgZm9yIGRpZmZlcmVudCBkYXRlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRWRpdGlvbihIaXN0b3J5SW5wdXQgaW5wdXQsIGJvb2xlYW4gaXNTZWxlY3RlZCkgewotCQlpZiAoZkVkaXRpb25UcmVlID09IG51bGwgfHwgZkVkaXRpb25UcmVlLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJCi0JCUlGaWxlU3RhdGUgc3RhdGU9IGlucHV0LmZGaWxlU3RhdGU7Ci0JCQotCQkvLyBmaW5kIGxhc3QgZGF5Ci0JCVRyZWVJdGVtW10gZGF5cz0gZkVkaXRpb25UcmVlLmdldEl0ZW1zKCk7Ci0JCVRyZWVJdGVtIGxhc3REYXk9IG51bGw7Ci0JCWlmIChkYXlzLmxlbmd0aCA+IDApCi0JCQlsYXN0RGF5PSBkYXlzW2RheXMubGVuZ3RoLTFdOwotCQkJCQkJCi0JCWxvbmcgbGRhdGU9IHN0YXRlLmdldE1vZGlmaWNhdGlvblRpbWUoKTsJCQotCQlsb25nIGRheT0gZGF5TnVtYmVyKGxkYXRlKTsKLQkJRGF0ZSBkYXRlPSBuZXcgRGF0ZShsZGF0ZSk7Ci0JCWlmIChsYXN0RGF5ID09IG51bGwgfHwgZGF5ICE9IGRheU51bWJlcigoKERhdGUpbGFzdERheS5nZXREYXRhKCkpLmdldFRpbWUoKSkpIHsKLQkJCWxhc3REYXk9IG5ldyBUcmVlSXRlbShmRWRpdGlvblRyZWUsIFNXVC5OT05FKTsKLQkJCWxhc3REYXkuc2V0SW1hZ2UoZkRhdGVJbWFnZSk7Ci0JCQlTdHJpbmcgZGY9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpOwotCQkJbG9uZyB0b2RheT0gZGF5TnVtYmVyKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQotCQkJU3RyaW5nIGZvcm1hdEtleTsKLQkJCWlmIChkYXkgPT0gdG9kYXkpCi0JCQkJZm9ybWF0S2V5PSAidG9kYXlGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChkYXkgPT0gdG9kYXktMSkKLQkJCQlmb3JtYXRLZXk9ICJ5ZXN0ZXJkYXlGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJZm9ybWF0S2V5PSAiZGF5Rm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBhdHRlcm49IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgZm9ybWF0S2V5KTsKLQkJCWlmIChwYXR0ZXJuICE9IG51bGwpCi0JCQkJZGY9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIG5ldyBTdHJpbmdbXSB7IGRmIH0pOwotCQkJbGFzdERheS5zZXRUZXh0KGRmKTsKLQkJCWxhc3REYXkuc2V0RGF0YShkYXRlKTsKLQkJfQotCQlUcmVlSXRlbSB0aT0gbmV3IFRyZWVJdGVtKGxhc3REYXksIFNXVC5OT05FKTsKLQkJdGkuc2V0SW1hZ2UoZlRpbWVJbWFnZSk7Ci0JCXRpLnNldFRleHQoRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoKS5mb3JtYXQoZGF0ZSkpOwotCQl0aS5zZXREYXRhKGlucHV0KTsKLQotCQlpZiAoaXNTZWxlY3RlZCkgewotCQkJbGFzdERheS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWZFZGl0aW9uVHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyB0aSB9KTsKLQkJCWZlZWRDb250ZW50KHRpKTsKLQkJfQotCX0KLQkJCQkJCQotCS8qCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHMgc2luY2UgSmFuIDFzdCwgMTk3MC4KLQkgKiBUaGUgZ2l2ZW4gZGF0ZSBpcyBjb252ZXJ0ZWQgdG8gR01UIGFuZCBkYXlsaWdodCBzYXZpbmcgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvby4KLQkgKi8KLQlwcml2YXRlIGxvbmcgZGF5TnVtYmVyKGxvbmcgZGF0ZSkgewotCQlpbnQgT05FX0RBWV9NUz0gMjQqNjAqNjAgKiAxMDAwOyAvLyBvbmUgZGF5IGluIG1pbGxpIHNlY29uZHMKLQkJCi0JCUNhbGVuZGFyIGNhbGVuZGFyPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQlsb25nIGxvY2FsVGltZU9mZnNldD0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKLQkJCi0JCXJldHVybiAoZGF0ZSArIGxvY2FsVGltZU9mZnNldCkgLyBPTkVfREFZX01TOwotCX0KLQkKLQkvKgotCSAqIEZlZWRzIHRoZSB0cmVlIHZpZXdlcidzIHNlbGVjdGlvbiB0byB0aGUgY29udGVudHZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBmZWVkQ29udGVudChXaWRnZXQgdykgewotCQlpZiAoZkNvbnRlbnRQYW5lICE9IG51bGwgJiYgIWZDb250ZW50UGFuZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCU9iamVjdCBvPSB3LmdldERhdGEoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSGlzdG9yeUlucHV0KSB7Ci0JCQkJSGlzdG9yeUlucHV0IHNlbGVjdGVkPSAoSGlzdG9yeUlucHV0KSBvOwotCQkJCWZDb250ZW50UGFuZS5zZXRJbnB1dChzZWxlY3RlZCk7Ci0JCQkJZkNvbnRlbnRQYW5lLnNldFRleHQoZ2V0RWRpdGlvbkxhYmVsKHNlbGVjdGVkKSk7Ci0JCQkJZkNvbnRlbnRQYW5lLnNldEltYWdlKGZUaW1lSW1hZ2UpOwotCQkJCQotCQkJCWlmIChmQ3VycmVudEZpbGVIaXN0b3J5ICE9IG51bGwpCi0JCQkJCWZDdXJyZW50RmlsZUhpc3Rvcnkuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQuZkZpbGVTdGF0ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWZDb250ZW50UGFuZS5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRpb25MYWJlbChIaXN0b3J5SW5wdXQgaW5wdXQpIHsKLQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiaGlzdG9yeUVkaXRpb25MYWJlbCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCWlmIChmb3JtYXQgPT0gbnVsbCkKLQkJCWZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZWRpdGlvbkxhYmVsIik7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJZm9ybWF0PSAieHswfSI7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvbmcgbW9kRGF0ZT0gaW5wdXQuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpOwotCQlTdHJpbmcgZGF0ZT0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKCkuZm9ybWF0KG5ldyBEYXRlKG1vZERhdGUpKTsKLQkJCi0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBPYmplY3RbXSB7IGRhdGUgfSk7Ci0JfQotCQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBidXR0b25MYWJlbD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiYnV0dG9uTGFiZWwiLCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBhICdDYW5jZWwnIGFuZCBhICdBZGQnIGJ1dHRvbgotCQlmQ29tbWl0QnV0dG9uPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBidXR0b25MYWJlbCwgdHJ1ZSk7Ci0JCWZDb21taXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgb2YgZjEgY29tZXMgYWZ0ZXIgZjIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGdyZWF0ZXJUaGFuKElGaWxlIGYxLCBJRmlsZSBmMikgewotCQlTdHJpbmdbXSBzczE9IGYxLmdldEZ1bGxQYXRoKCkuc2VnbWVudHMoKTsKLQkJU3RyaW5nW10gc3MyPSBmMi5nZXRGdWxsUGF0aCgpLnNlZ21lbnRzKCk7Ci0JCWludCBsMT0gc3MxLmxlbmd0aDsKLQkJaW50IGwyPSBzczIubGVuZ3RoOwotCQlpbnQgbj0gTWF0aC5tYXgobDEsIGwyKTsKLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVN0cmluZyBzMT0gaSA8IGwxID8gc3MxW2ldIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzMj0gaSA8IGwyID8gc3MyW2ldIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCByYz0gczEuY29tcGFyZVRvSWdub3JlQ2FzZShzMik7Ci0JCQlpZiAocmMgIT0gMCkKLQkJCQlyZXR1cm4gcmMgPCAwOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnRlcm5hbFNvcnQoSUZpbGVbXSBrZXlzLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7IAotCQotCQlpbnQgb3JpZ2luYWxfbGVmdD0gbGVmdDsKLQkJaW50IG9yaWdpbmFsX3JpZ2h0PSByaWdodDsKLQkJCi0JCUlGaWxlIG1pZD0ga2V5c1sobGVmdCArIHJpZ2h0KSAvIDJdOyAKLQkJZG8geyAKLQkJCXdoaWxlIChncmVhdGVyVGhhbihrZXlzW2xlZnRdLCBtaWQpKQotCQkJCWxlZnQrKzsgCi0JCQkKLQkJCXdoaWxlIChncmVhdGVyVGhhbihtaWQsIGtleXNbcmlnaHRdKSkKLQkJCQlyaWdodC0tOyAKLQkJCi0JCQlpZiAobGVmdCA8PSByaWdodCkgeyAKLQkJCQlJRmlsZSB0bXA9IGtleXNbbGVmdF07IAotCQkJCWtleXNbbGVmdF09IGtleXNbcmlnaHRdOyAKLQkJCQlrZXlzW3JpZ2h0XT0gdG1wOwkJCQotCQkJCWxlZnQrKzsgCi0JCQkJcmlnaHQtLTsgCi0JCQl9IAotCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQkJCi0JCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpCi0JCQlpbnRlcm5hbFNvcnQoa2V5cywgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOyAKLQkJCi0JCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpCi0JCQlpbnRlcm5hbFNvcnQoa2V5cywgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0Jhc2VDb21wYXJlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0Jhc2VDb21wYXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjY3ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CYXNlQ29tcGFyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQ29tcGFyZUFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oZlNlbGVjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uPSBzZWxlY3Rpb247Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZChmU2VsZWN0aW9uKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0JpbmFyeUNvbXBhcmVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU3MTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JQ29tcGFyZUlucHV0OwotCi0vKioKLSAqIEEgc2ltcGxlIGNvbXBhcmUgdmlld2VyIGZvciBiaW5hcnkgZmlsZXMuCi0gKiBTaG93cyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG5vbi1tYXRjaGluZyBieXRlLgotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5Q29tcGFyZVZpZXdlciBleHRlbmRzIEFic3RyYWN0Vmlld2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQmluYXJ5Q29tcGFyZVZpZXdlclJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0Y9IC0xOwotCXByaXZhdGUgTGFiZWwgZkNvbnRyb2w7Ci0JcHJpdmF0ZSBJQ29tcGFyZUlucHV0IGZJbnB1dDsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZCdW5kbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZMZWZ0SXNMb2NhbDsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5Q29tcGFyZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBjYykgewotCQkKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgSUNvbXBhcmVDb250ZXh0SWRzLkJJTkFSWV9DT01QQVJFX1ZJRVcpOwotCi0JCWZCdW5kbGU9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQkJZkNvbnRyb2w9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJZkNvbnRyb2wuc2V0RGF0YShDb21wYXJlVUkuQ09NUEFSRV9WSUVXRVJfVElUTEUsIFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmTGVmdElzTG9jYWw9IFV0aWxpdGllcy5nZXRCb29sZWFuKGNjLCAiTEVGVF9JU19MT0NBTCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGZDb250cm9sICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlmSW5wdXQ9IChJQ29tcGFyZUlucHV0KSBpbnB1dDsKLQkJCQotCQkJSW5wdXRTdHJlYW0gbGVmdD0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIHJpZ2h0PSBudWxsOwotCQkJCi0JCQlTdHJpbmcgbWVzc2FnZT0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbGVmdD0gZ2V0U3RyZWFtKGZJbnB1dC5nZXRMZWZ0KCkpOwotCQkJCXJpZ2h0PSBnZXRTdHJlYW0oZklucHV0LmdldFJpZ2h0KCkpOwotCQkJCQotCQkJCWlmIChsZWZ0ICE9IG51bGwgJiYgcmlnaHQgIT0gbnVsbCkgewotCQkJCQlpbnQgcG9zPSAwOwotCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJaW50IGw9IGxlZnQucmVhZCgpOwotCQkJCQkJaW50IHI9IHJpZ2h0LnJlYWQoKTsKLQkJCQkJCWlmIChsICE9IHIpIHsKLQkJCQkJCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkaWZmTWVzc2FnZUZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbWVzc2FnZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBvcykgfSApOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJaWYgKGwgPT0gRU9GKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJcG9zKys7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImRlbGV0ZUNvbmZsaWN0TWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChsZWZ0ID09IG51bGwpIHsKLQkJCQkJaWYgKGZMZWZ0SXNMb2NhbCkKLQkJCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImRlbGV0ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJbWVzc2FnZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiYWRkZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHJpZ2h0ID09IG51bGwpIHsKLQkJCQkJaWYgKGZMZWZ0SXNMb2NhbCkKLQkJCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImFkZGVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImRlbGV0ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJbWVzc2FnZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZXJyb3JNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJbWVzc2FnZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZXJyb3JNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJVXRpbGl0aWVzLmNsb3NlKGxlZnQpOwotCQkJCVV0aWxpdGllcy5jbG9zZShyaWdodCk7CQkJCi0JCQl9Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJCWZDb250cm9sLnNldFRleHQobWVzc2FnZSk7CQkJCQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGZJbnB1dDsKLQl9Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIGdldFN0cmVhbShJVHlwZWRFbGVtZW50IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpCi0JCQlyZXR1cm4gKChJU3RyZWFtQ29udGVudEFjY2Vzc29yKWlucHV0KS5nZXRDb250ZW50cygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0JpbmFyeUNvbXBhcmVWaWV3ZXJDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0JpbmFyeUNvbXBhcmVWaWV3ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjJlMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CaW5hcnlDb21wYXJlVmlld2VyQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci0KLS8qKgotICogQSBmYWN0b3J5IG9iamVjdCBmb3IgdGhlIDxjb2RlPkJpbmFyeUNvbXBhcmVWaWV3ZXI8L2NvZGU+LgotICogVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvbmx5IG9iamVjdHMgd2l0aCBhIGRlZmF1bHQKLSAqIGNvbnN0cnVjdG9yIGNhbiBiZSBjcmVhdGVkIHZpYSBhbiBleHRlbnNpb24gcG9pbnQKLSAqICh0aGlzIHByZWNsdWRlcyBWaWV3ZXJzKS4KLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUNvbXBhcmVWaWV3ZXJDcmVhdG9yIGltcGxlbWVudHMgSVZpZXdlckNyZWF0b3IgewotCi0JcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gbXApIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlDb21wYXJlVmlld2VyKHBhcmVudCwgbXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CaW5hcnlDb21wYXJlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjg0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CaW5hcnlDb21wYXJlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQCgjKUJpbmFyeUNvbXBhcmVWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcwotIwotIyBSZXNvdXJjZSBzdHJpbmdzIGZvciBCaW5hcnlDb21wYXJlVmlld2VyLmphdmEKLQotdGl0bGU9IEJpbmFyeSBDb21wYXJlCi0KLWRpZmZNZXNzYWdlRm9ybWF0PSBGaXJzdCBieXRlcyBkaWZmZXIgYXQgcG9zaXRpb24gezB9Ci1kZWxldGVDb25mbGljdE1lc3NhZ2U9IERlbGV0ZSBDb25mbGljdAotYWRkZWRNZXNzYWdlPSBBZGRlZCBSZXNvdXJjZQotZGVsZXRlZE1lc3NhZ2U9IFJlbW92ZWQgUmVzb3VyY2UKLWVycm9yTWVzc2FnZT0gSW50ZXJuYWwgRXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQnVmZmVyZWRDYW52YXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQnVmZmVyZWRDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NGU4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0J1ZmZlcmVkQ2FudmFzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIEEgQ2FudmFzIHdoaWNoIHJlZHVjZXMgZmxpY2tlciBieSBkcmF3aW5nIGluIGFuIG9mZiBzY3JlZW4gYnVmZmVyLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnVmZmVyZWRDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9ET1VCTEVfQlVGRkVSPSAhImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0RPVUJMRV9CVUZGRVI9IHRydWU7Ci0JCi0JLyoqIFRoZSBkcmF3YWJsZSBmb3IgZG91YmxlIGJ1ZmZlcmluZyAqLwotCUltYWdlIGZCdWZmZXI7Ci0KLQlwdWJsaWMgQnVmZmVyZWRDYW52YXMoQ29tcG9zaXRlIHBhcmVudCwgaW50IGZsYWdzKSB7Ci0JCXN1cGVyKHBhcmVudCwgZmxhZ3MgKyBTV1QuTk9fQkFDS0dST1VORCk7Ci0KLQkJYWRkUGFpbnRMaXN0ZW5lcigKLQkJCW5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRvdWJsZUJ1ZmZlclBhaW50KGV2ZW50LmdjKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0KLQkJYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCQlpZiAoZkJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJCQlmQnVmZmVyLmRpc3Bvc2UoKTsKLQkJCQkJCWZCdWZmZXI9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwYWludCgpIHsKLQkJaWYgKCFpc0Rpc3Bvc2VkKCkpIHsKLQkJCUdDIGdjPSBuZXcgR0ModGhpcyk7Ci0JCQlkb3VibGVCdWZmZXJQYWludChnYyk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIERvdWJsZSBidWZmZXIgZHJhd2luZy4KLQkgKi8KLQl2b2lkIGRvdWJsZUJ1ZmZlclBhaW50KEdDIGRlc3QpIHsKLQkJCi0JCWlmICghVVNFX0RPVUJMRV9CVUZGRVIpIHsKLQkJCWRvUGFpbnQoZGVzdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQb2ludCBzaXplPSBnZXRTaXplKCk7Ci0KLQkJaWYgKHNpemUueCA8PSAxIHx8IHNpemUueSA8PSAxKSAvLyB3ZSB0ZXN0IGZvciA8PSAxIGJlY2F1c2Ugb24gWDExIGNvbnRyb2xzIGhhdmUgaW5pdGlhbCBzaXplIDEsMQotCQkJcmV0dXJuOwotCi0JCWlmIChmQnVmZmVyICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSByPSBmQnVmZmVyLmdldEJvdW5kcygpOwotCQkJaWYgKHIud2lkdGggIT0gc2l6ZS54IHx8IHIuaGVpZ2h0ICE9IHNpemUueSkgewotCQkJCWZCdWZmZXIuZGlzcG9zZSgpOwotCQkJCWZCdWZmZXI9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZCdWZmZXIgPT0gbnVsbCkKLQkJCWZCdWZmZXI9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksIHNpemUueCwgc2l6ZS55KTsKLQotCQlHQyBnYz0gbmV3IEdDKGZCdWZmZXIpOwotCQl0cnkgewotCQkJZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBzaXplLngsIHNpemUueSk7Ci0JCQlkb1BhaW50KGdjKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWRlc3QuZHJhd0ltYWdlKGZCdWZmZXIsIDAsIDApOwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGRvUGFpbnQoR0MgZ2MpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CdWZmZXJlZFJlc291cmNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CdWZmZXJlZFJlc291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZlNzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQnVmZmVyZWRSZXNvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNvbXBhcmF0b3I7Ci0KLS8qKgotICogQSBidWZmZXIgZm9yIGEgd29ya3NwYWNlIHJlc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRSZXNvdXJjZU5vZGUgZXh0ZW5kcyBSZXNvdXJjZU5vZGUgewotCQotCXByaXZhdGUgYm9vbGVhbiBmRGlydHk9IGZhbHNlOwotCXByaXZhdGUgSUZpbGUgZkRlbGV0ZUZpbGU7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5SZXNvdXJjZU5vZGU8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlCi0JICovCi0JcHVibGljIEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JfQotCQotICAgIC8qCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBidWZmZXIgY29udGFpbnMgdW5jb21taXR0ZWQgY2hhbmdlcy4KLSAgICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCSAgICByZXR1cm4gZkRpcnR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZUNvbXBhcmF0b3IgY3JlYXRlQ2hpbGQoSVJlc291cmNlIGNoaWxkKSB7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRSZXNvdXJjZU5vZGUoY2hpbGQpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gY29udGVudHMpIHsKLQkJZkRpcnR5PSB0cnVlOwotCQlzdXBlci5zZXRDb250ZW50KGNvbnRlbnRzKTsKLQl9CQotCi0JLyoKLQkgKiBDb21taXRzIGJ1ZmZlcmVkIGNvbnRlbnRzIHRvIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1pdChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmRGlydHkpIHsKLQkJCQotCQkJaWYgKGZEZWxldGVGaWxlICE9IG51bGwpIHsKLQkJCQlmRGVsZXRlRmlsZS5kZWxldGUodHJ1ZSwgdHJ1ZSwgcG0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVJlc291cmNlIHJlc291cmNlPSBnZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQotCQkJCWJ5dGVbXSBieXRlcz0gZ2V0Q29udGVudCgpOwotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlzPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlIGZpbGU9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZS5zZXRDb250ZW50cyhpcywgZmFsc2UsIHRydWUsIHBtKTsKLQkJCQkJZWxzZQotCQkJCQkJZmlsZS5jcmVhdGUoaXMsIGZhbHNlLCBwbSk7Ci0JCQkJCWZEaXJ0eT0gZmFsc2U7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJCQl0cnkgewotCQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gU2lsZW50bHkgaWdub3JlZAotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgSVR5cGVkRWxlbWVudCByZXBsYWNlKElUeXBlZEVsZW1lbnQgY2hpbGQsIElUeXBlZEVsZW1lbnQgb3RoZXIpIHsKLQkJCi0JCWlmIChjaGlsZCA9PSBudWxsKSB7CS8vIGFkZCByZXNvdXJjZQotCQkJLy8gY3JlYXRlIGEgbm9kZSB3aXRob3V0IGEgcmVzb3VyY2UgYmVoaW5kIGl0IQotCQkJSVJlc291cmNlIHJlc291cmNlPSBnZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCUlGb2xkZXIgZm9sZGVyPSAoSUZvbGRlcikgcmVzb3VyY2U7Ci0JCQkJSUZpbGUgZmlsZT0gZm9sZGVyLmdldEZpbGUob3RoZXIuZ2V0TmFtZSgpKTsKLQkJCQljaGlsZD0gbmV3IEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKGZpbGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAob3RoZXIgPT0gbnVsbCkgewkvLyBkZWxldGUgcmVzb3VyY2UKLQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQlJRm9sZGVyIGZvbGRlcj0gKElGb2xkZXIpIHJlc291cmNlOwotCQkJCUlGaWxlIGZpbGU9IGZvbGRlci5nZXRGaWxlKGNoaWxkLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWZEZWxldGVGaWxlPSBmaWxlOwotCQkJCQlmRGlydHk9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmIChvdGhlciBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IgJiYgY2hpbGQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50KSB7Ci0JCQlJRWRpdGFibGVDb250ZW50IGRzdD0gKElFZGl0YWJsZUNvbnRlbnQpIGNoaWxkOwotCQkJCi0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlzPSAoKElTdHJlYW1Db250ZW50QWNjZXNzb3Ipb3RoZXIpLmdldENvbnRlbnRzKCk7Ci0JCQkJYnl0ZVtdIGJ5dGVzPSBVdGlsaXRpZXMucmVhZEJ5dGVzKGlzKTsKLQkJCQlpZiAoYnl0ZXMgIT0gbnVsbCkKLQkJCQkJZHN0LnNldENvbnRlbnQoYnl0ZXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9DaGFuZ2VQcm9wZXJ0eUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9DaGFuZ2VQcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZkYWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ2hhbmdlUHJvcGVydHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRvZ2dsZXMgYSBib29sZWFuIHByb3BlcnR5IG9mIGFuIDxjb2RlPklDb21wYXJlQ29uZmlndXJhdGlvbjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VQcm9wZXJ0eUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIENvbXBhcmVDb25maWd1cmF0aW9uIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmUHJvcGVydHlLZXk7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmQnVuZGxlOwotCXByaXZhdGUgU3RyaW5nIGZQcmVmaXg7Ci0KLQotCXB1YmxpYyBDaGFuZ2VQcm9wZXJ0eUFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIENvbXBhcmVDb25maWd1cmF0aW9uIGNjLCBTdHJpbmcgcmtleSwgU3RyaW5nIHBrZXkpIHsKLQkJZlByb3BlcnR5S2V5PSBwa2V5OwotCQlmQnVuZGxlPSBidW5kbGU7Ci0JCWZQcmVmaXg9IHJrZXk7Ci0JCVV0aWxpdGllcy5pbml0QWN0aW9uKHRoaXMsIGZCdW5kbGUsIGZQcmVmaXgpOwotCQlzZXRDb21wYXJlQ29uZmlndXJhdGlvbihjYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlib29sZWFuIGI9ICFVdGlsaXRpZXMuZ2V0Qm9vbGVhbihmQ29tcGFyZUNvbmZpZ3VyYXRpb24sIGZQcm9wZXJ0eUtleSwgZmFsc2UpOwotCQlzZXRDaGVja2VkKGIpOwotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoZlByb3BlcnR5S2V5LCBuZXcgQm9vbGVhbihiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIHN0YXRlKSB7Ci0JCXN1cGVyLnNldENoZWNrZWQoc3RhdGUpOwotCQlVdGlsaXRpZXMuaW5pdFRvZ2dsZUFjdGlvbih0aGlzLCBmQnVuZGxlLCBmUHJlZml4LCBzdGF0ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbXBhcmVDb25maWd1cmF0aW9uKENvbXBhcmVDb25maWd1cmF0aW9uIGNjKSB7Ci0JCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gY2M7Ci0JCXNldENoZWNrZWQoVXRpbGl0aWVzLmdldEJvb2xlYW4oZkNvbXBhcmVDb25maWd1cmF0aW9uLCBmUHJvcGVydHlLZXksIGZhbHNlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOTQ4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlVUk7Ci0KLQotLyoKLSAqIFRoZSAiQ29tcGFyZSB3aXRoIGVhY2ggb3RoZXIiIGFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZUFjdGlvbiBleHRlbmRzIEJhc2VDb21wYXJlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgUmVzb3VyY2VDb21wYXJlSW5wdXQgZklucHV0OwotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZldvcmtiZW5jaFBhZ2U7Ci0KLQotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZklucHV0ICE9IG51bGwpIHsKLQkJCWZJbnB1dC5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCWZJbnB1dC5pbml0aWFsaXplQ29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJCUNvbXBhcmVVSS5vcGVuQ29tcGFyZUVkaXRvck9uUGFnZShmSW5wdXQsIGZXb3JrYmVuY2hQYWdlKTsKLQkJCWZJbnB1dD0gbnVsbDsJLy8gZG9uJ3QgcmV1c2UgdGhpcyBpbnB1dCEKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZklucHV0ID09IG51bGwpIHsKLQkJCUNvbXBhcmVDb25maWd1cmF0aW9uIGNjPSBuZXcgQ29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJCS8vIGJ1ZmZlcmVkIG1lcmdlIG1vZGU6IGRvbid0IGFzayBmb3IgY29uZmlybWF0aW9uCi0JCQkvLyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIG1vZGlmaWVkIHJlc291cmNlcwotCQkJY2Muc2V0UHJvcGVydHkoQ29tcGFyZUVkaXRvci5DT05GSVJNX1NBVkVfUFJPUEVSVFksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkKLQkJCS8vIHVuY29tbWVudCBmb2xsb3dpbmcgbGluZSB0byBoYXZlIHNlcGFyYXRlIG91dGxpbmUgdmlldwotCQkJLy9jYy5zZXRQcm9wZXJ0eShDb21wYXJlQ29uZmlndXJhdGlvbi5VU0VfT1VUTElORV9WSUVXLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCQkKLQkJCWZJbnB1dD0gbmV3IFJlc291cmNlQ29tcGFyZUlucHV0KGNjKTsKLQkJfQotCQlyZXR1cm4gZklucHV0LmlzRW5hYmxlZChzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJZldvcmtiZW5jaFBhZ2U9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYwODA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wYXJlRGlhbG9nIGV4dGVuZHMgUmVzaXphYmxlRGlhbG9nIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkKLQlwcml2YXRlIENvbXBhcmVFZGl0b3JJbnB1dCBmQ29tcGFyZUVkaXRvcklucHV0OwotCXByaXZhdGUgQnV0dG9uIGZDb21taXRCdXR0b247Ci0KLQotCUNvbXBhcmVEaWFsb2coU2hlbGwgc2hlbGwsIENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlcihzaGVsbCwgbnVsbCk7Ci0JCQotCQlBc3NlcnQuaXNOb3ROdWxsKGlucHV0KTsKLQkJZkNvbXBhcmVFZGl0b3JJbnB1dD0gaW5wdXQ7Ci0JCWZDb21wYXJlRWRpdG9ySW5wdXQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJc2V0SGVscENvbnRleHRJZChJQ29tcGFyZUNvbnRleHRJZHMuQ09NUEFSRV9ESUFMT0cpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKHN1cGVyLmNsb3NlKCkpIHsKLQkJCWlmIChmQ29tcGFyZUVkaXRvcklucHV0ICE9IG51bGwpCi0JCQkJZkNvbXBhcmVFZGl0b3JJbnB1dC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZkNvbW1pdEJ1dHRvbj0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZURpYWxvZy5jb21taXRBY3Rpb24ubGFiZWwiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZkNvbW1pdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZkNvbW1pdEJ1dHRvbiAhPSBudWxsICYmIGZDb21wYXJlRWRpdG9ySW5wdXQgIT0gbnVsbCkKLQkJCWZDb21taXRCdXR0b24uc2V0RW5hYmxlZChmQ29tcGFyZUVkaXRvcklucHV0LmlzU2F2ZU5lZWRlZCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50MikgewotCQkJCQkJCi0JCUNvbXBvc2l0ZSBwYXJlbnQ9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50Mik7Ci0KLQkJQ29udHJvbCBjPSBmQ29tcGFyZUVkaXRvcklucHV0LmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCWMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlTaGVsbCBzaGVsbD0gYy5nZXRTaGVsbCgpOwotCQlzaGVsbC5zZXRUZXh0KGZDb21wYXJlRWRpdG9ySW5wdXQuZ2V0VGl0bGUoKSk7Ci0JCXNoZWxsLnNldEltYWdlKGZDb21wYXJlRWRpdG9ySW5wdXQuZ2V0VGl0bGVJbWFnZSgpKTsKLQkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCQotCQlpbnQgcmM9IHN1cGVyLm9wZW4oKTsKLQkJCi0JCWlmIChyYyA9PSBPSyAmJiBmQ29tcGFyZUVkaXRvcklucHV0LmlzU2F2ZU5lZWRlZCgpKSB7Ci0JCQkJCQkKLQkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb249IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWZDb21wYXJlRWRpdG9ySW5wdXQuc2F2ZUNoYW5nZXMocG0pOwotCQkJCX0KLQkJCX07Ci0JCQkJCQkKLQkJCVNoZWxsIHNoZWxsPSBnZXRQYXJlbnRTaGVsbCgpOwotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtZD0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7CQkJCQotCQkJdHJ5IHsKLQkJCQlvcGVyYXRpb24ucnVuKHBtZC5nZXRQcm9ncmVzc01vbml0b3IoKSk7CQkJCQotCQkJCQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24geCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geCkgewotCQkJCVN0cmluZyB0aXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZURpYWxvZy5zYXZlRXJyb3JUaXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1zZz0gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZURpYWxvZy5zYXZlRXJyb3JNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZyArIHguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjhjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci0KLQotLyoqCi0gKiBBIENvbXBhcmVFZGl0b3IgdGFrZXMgYSBJQ29tcGFyZUVkaXRvcklucHV0IGFzIGlucHV0LgotICogTW9zdCBmdW5jdGlvbmFsaXR5IGlzIGRlbGVnYXRlZCB0byB0aGUgSUNvbXBhcmVFZGl0b3JJbnB1dC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IGltcGxlbWVudHMgSVJldXNhYmxlRWRpdG9yIHsKLQkKLQkvKioKLQkgKiBJbnRlcm5hbCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGhhbmRsaW5nIGNoYW5nZXMgaW4gdGhlIGVkaXRvcidzIGlucHV0LgotCSAqLwotCWNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qCi0JCSAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJQ29tcGFyZUVkaXRvci50aGlzLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkZJUk1fU0FWRV9QUk9QRVJUWT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ09ORklSTV9TQVZFX1BST1BFUlRZIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkFjdGlvbkJhcnM7Ci0JLyoqIFRoZSBlZGl0b3IncyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuICovCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkvKiogdGhlIFNXVCBjb250cm9sICovCi0JcHJpdmF0ZSBDb250cm9sIGZDb250cm9sOwotCS8qKiB0aGUgb3V0bGluZSBwYWdlICovCi0JcHJpdmF0ZSBDb21wYXJlT3V0bGluZVBhZ2UgZk91dGxpbmVQYWdlOwotCS8qKiBlbmFibGUgb3V0bGluZSAqLwotCQotCQotCXB1YmxpYyBDb21wYXJlRWRpdG9yKCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFkYXB0YWJsZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJCi0JCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0PSBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KENvbXBhcmVDb25maWd1cmF0aW9uLlVTRV9PVVRMSU5FX1ZJRVcpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4gJiYgKChCb29sZWFuKW9iamVjdCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KSB7Ci0JCQkJCWZPdXRsaW5lUGFnZT0gbmV3IENvbXBhcmVPdXRsaW5lUGFnZSgoQ29tcGFyZUVkaXRvcklucHV0KSBpbnB1dCk7Ci0JCQkJCXJldHVybiBmT3V0bGluZVBhZ2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gQ29tcGFyZUNvbmZpZ3VyYXRpb24gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KQotCQkJcmV0dXJuICgoQ29tcGFyZUVkaXRvcklucHV0KWlucHV0KS5nZXRDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQkJCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCQotCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkpCi0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZUVkaXRvci5pbnZhbGlkSW5wdXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJdHJ5IHsKLQkJCWRvU2V0SW5wdXQoaW5wdXQpOwkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCVN0cmluZyB0aXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZUVkaXRvci5lcnJvci5zZXRpbnB1dC50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbXNnPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlRWRpdG9yLmVycm9yLnNldGlucHV0Lm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnLCB4LmdldFN0YXR1cygpKTsKLQkJfQkJCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9TZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkKLQkJaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9ySW5wdXQpKSB7Ci0JCQlJU3RhdHVzIHM9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVFZGl0b3IuaW52YWxpZElucHV0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzKTsKLQkJfQotCi0JCUlFZGl0b3JJbnB1dCBvbGRJbnB1dD0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKG9sZElucHV0IGluc3RhbmNlb2YgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIpCi0JCQkoKElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyKWlucHV0KS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCQotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0JCQotCQlDb21wYXJlRWRpdG9ySW5wdXQgY2VpPSAoQ29tcGFyZUVkaXRvcklucHV0KSBpbnB1dDsKLQotCQlzZXRUaXRsZUltYWdlKGNlaS5nZXRUaXRsZUltYWdlKCkpOwotCQlzZXRQYXJ0TmFtZShjZWkuZ2V0VGl0bGUoKSk7CS8vIHdhcyBzZXRUaXRsZShjZWkuZ2V0VGl0bGUoKSk7Ci0JCQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyKQotCQkJKChJUHJvcGVydHlDaGFuZ2VOb3RpZmllcilpbnB1dCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkKLQkJaWYgKG9sZElucHV0ICE9IG51bGwpIHsKLQkJCWlmIChmQ29udHJvbCAhPSBudWxsICYmICFmQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlQb2ludCBvbGRTaXplPSBmQ29udHJvbC5nZXRTaXplKCk7Ci0JCQkJQ29tcG9zaXRlIHBhcmVudD0gZkNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQkJZkNvbnRyb2wuZGlzcG9zZSgpOwotCQkJCWNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0JCQkJaWYgKGZDb250cm9sICE9IG51bGwpCi0JCQkJCWZDb250cm9sLnNldFNpemUob2xkU2l6ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0JCXJldHVybiBmQWN0aW9uQmFyczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWZBY3Rpb25CYXJzPSBhY3Rpb25CYXJzOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSURlc2t0b3BQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhcmVudC5zZXREYXRhKHRoaXMpOwotCQkKLQkJSUVkaXRvcklucHV0IGlucHV0PSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9ySW5wdXQpIHsKLQkJCWZDb250cm9sPSAoKENvbXBhcmVFZGl0b3JJbnB1dCkgaW5wdXQpLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoZkNvbnRyb2wsIElDb21wYXJlQ29udGV4dElkcy5DT01QQVJFX0VESVRPUik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIERlc2t0b3BQYXJ0I2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQotCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyKQotCQkJKChJUHJvcGVydHlDaGFuZ2VOb3RpZmllcilpbnB1dCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJCQkJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbnVsbDsKLQl9Ci0JCQkKLQkvKgotCSAqIEBzZWUgSURlc2t0b3BQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KQotCQkJKChDb21wYXJlRWRpdG9ySW5wdXQpaW5wdXQpLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJRWRpdG9yUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW5hdGF0aW9uCi0JfQotCQotCS8qKgotCSAqIEFsd2F5cyB0aHJvd3MgYW4gQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLgotCSAqLwotCS8qCi0JICogQHNlZSBJRWRpdG9yUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UpOyAvLyBTYXZlIEFzIG5vdCBzdXBwb3J0ZWQgZm9yIENvbXBhcmVFZGl0b3IKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0I2RvU2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlmaW5hbCBJRWRpdG9ySW5wdXQgaW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCQotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KQotCQkJCQkoKENvbXBhcmVFZGl0b3JJbnB1dClpbnB1dCkuc2F2ZUNoYW5nZXMocG0pOwotCQkJfQotCQl9OwotCi0JCVNoZWxsIHNoZWxsPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCi0JCXRyeSB7Ci0JCQkKLQkJCW9wZXJhdGlvbi5ydW4ocHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJCQkJCQotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKLQkJCS8vIE5lZWRXb3JrCi0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHgpIHsKLQkJCS8vIE5lZWRXb3JrCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geCkgewotCQkJU3RyaW5nIHRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlRWRpdG9yLnNhdmVFcnJvci50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcmVhc29uPSB4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZUVkaXRvci5jYW50U2F2ZUVycm9yIiwgcmVhc29uKSk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCX0JCi0JCQotCS8qCi0JICogQHNlZSBJRWRpdG9yUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkKLQkJCXJldHVybiAoKENvbXBhcmVFZGl0b3JJbnB1dClpbnB1dCkuaXNTYXZlTmVlZGVkKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlPYmplY3Qgb2xkX3ZhbHVlPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQlPYmplY3QgbmV3X3ZhbHVlPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAob2xkX3ZhbHVlID09IG51bGwgfHwgbmV3X3ZhbHVlID09IG51bGwgfHwgIW9sZF92YWx1ZS5lcXVhbHMobmV3X3ZhbHVlKSkKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZUVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVFZGl0b3JDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTE5ODM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZUVkaXRvckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOyAKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGFyZUVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCQotCXByaXZhdGUgSUVkaXRvclBhcnQgZkFjdGl2ZUVkaXRvclBhcnQ9IG51bGw7Ci0KLQlwcml2YXRlIElnbm9yZVdoaXRlU3BhY2VBY3Rpb24gZklnbm9yZVdoaXRlc3BhY2U7Ci0JcHJpdmF0ZSBOYXZpZ2F0aW9uQWN0aW9uIGZOZXh0OwotCXByaXZhdGUgTmF2aWdhdGlvbkFjdGlvbiBmUHJldmlvdXM7Ci0JCi0JcHJpdmF0ZSBOYXZpZ2F0aW9uQWN0aW9uIGZUb29sYmFyTmV4dDsKLQlwcml2YXRlIE5hdmlnYXRpb25BY3Rpb24gZlRvb2xiYXJQcmV2aW91czsKLQotCi0JcHVibGljIENvbXBhcmVFZGl0b3JDb250cmlidXRvcigpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBDb21wYXJlVUkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJCi0JCWZJZ25vcmVXaGl0ZXNwYWNlPSBuZXcgSWdub3JlV2hpdGVTcGFjZUFjdGlvbihidW5kbGUsIG51bGwpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoZklnbm9yZVdoaXRlc3BhY2UsIElDb21wYXJlQ29udGV4dElkcy5JR05PUkVfV0hJVEVTUEFDRV9BQ1RJT04pOwotCQkKLQkJZk5leHQ9IG5ldyBOYXZpZ2F0aW9uQWN0aW9uKGJ1bmRsZSwgdHJ1ZSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChmTmV4dCwgSUNvbXBhcmVDb250ZXh0SWRzLkdMT0JBTF9ORVhUX0RJRkZfQUNUSU9OKTsKLQkJCi0JCWZQcmV2aW91cz0gbmV3IE5hdmlnYXRpb25BY3Rpb24oYnVuZGxlLCBmYWxzZSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChmUHJldmlvdXMsIElDb21wYXJlQ29udGV4dElkcy5HTE9CQUxfUFJFVklPVVNfRElGRl9BQ1RJT04pOwotCQkKLQkJZlRvb2xiYXJOZXh0PSBuZXcgTmF2aWdhdGlvbkFjdGlvbihidW5kbGUsIHRydWUpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoZlRvb2xiYXJOZXh0LCBJQ29tcGFyZUNvbnRleHRJZHMuTkVYVF9ESUZGX0FDVElPTik7Ci0JCQotCQlmVG9vbGJhclByZXZpb3VzPSBuZXcgTmF2aWdhdGlvbkFjdGlvbihidW5kbGUsIGZhbHNlKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGZUb29sYmFyUHJldmlvdXMsIElDb21wYXJlQ29udGV4dElkcy5QUkVWSU9VU19ESUZGX0FDVElPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRibSkgewotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRibS5hZGQoZklnbm9yZVdoaXRlc3BhY2UpOwotCQl0Ym0uYWRkKGZUb29sYmFyTmV4dCk7Ci0JCXRibS5hZGQoZlRvb2xiYXJQcmV2aW91cyk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJCQkKLQkJaWYgKGZBY3RpdmVFZGl0b3JQYXJ0ID09IHRhcmdldEVkaXRvcikKLQkJCXJldHVybjsKLQkJCQotCQlmQWN0aXZlRWRpdG9yUGFydD0gdGFyZ2V0RWRpdG9yOwotCQkKLQkJaWYgKGZBY3RpdmVFZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dD0gZkFjdGl2ZUVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkgewotCQkJCUNvbXBhcmVFZGl0b3JJbnB1dCBjb21wYXJlSW5wdXQ9IChDb21wYXJlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJCWZOZXh0LnNldENvbXBhcmVFZGl0b3JJbnB1dChjb21wYXJlSW5wdXQpOwotCQkJCWZQcmV2aW91cy5zZXRDb21wYXJlRWRpdG9ySW5wdXQoY29tcGFyZUlucHV0KTsKLQkJCQkvLyBCZWdpbiBmaXggaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDUKLQkJCQlmVG9vbGJhck5leHQuc2V0Q29tcGFyZUVkaXRvcklucHV0KGNvbXBhcmVJbnB1dCk7Ci0JCQkJZlRvb2xiYXJQcmV2aW91cy5zZXRDb21wYXJlRWRpdG9ySW5wdXQoY29tcGFyZUlucHV0KTsKLQkJCQkvLyBFbmQgZml4IGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA1Ci0JCQl9Ci0JCX0KLQkJCQotCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcikgewotCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycz0gZ2V0QWN0aW9uQmFycygpOwotCQkKLQkJCUNvbXBhcmVFZGl0b3IgZWRpdG9yPSAoQ29tcGFyZUVkaXRvcikgdGFyZ2V0RWRpdG9yOwotCQkJZWRpdG9yLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuTkVYVC5nZXRJZCgpLCBmTmV4dCk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5nZXRJZCgpLCBmUHJldmlvdXMpOwotCi0JCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYz0gZWRpdG9yLmdldENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCQlmSWdub3JlV2hpdGVzcGFjZS5zZXRDb21wYXJlQ29uZmlndXJhdGlvbihjYyk7Ci0JCX0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDNlNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wYXJlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBOT19DSEFSX0NIQVI9IG5ldyBjaGFyWzBdW107Ci0JCi0JcHJpdmF0ZSBjaGFyW11bXSBmRXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzOwotCXByaXZhdGUgU3RyaW5nW10gZkV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzOwotCi0JCi0JcHVibGljIENvbXBhcmVGaWx0ZXIoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBwYXRoIG1hdGNoZXMgZmlsdGVyLCB0aGF0IGlzIGlmIHBhdGggc2hvdWxkIGJlIGZpbHRlcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpbHRlcihTdHJpbmcgcGF0aDAsIGJvb2xlYW4gZm9sZGVyLCBib29sZWFuIGlzQXJjaGl2ZSkgewotCQlpZiAoIWZvbGRlciAmJiBmRXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzICE9IG51bGwpIHsKLQkJCWNoYXJbXSBuYW1lPSBwYXRoMC50b0NoYXJBcnJheSgpOwotCQkJZm9yIChpbnQgaT0gMCwgbD0gZkV4dHJhUmVzb3VyY2VGaWxlRmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCQkJaWYgKG1hdGNoKGZFeHRyYVJlc291cmNlRmlsZUZpbHRlcnNbaV0sIG5hbWUsIHRydWUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZm9sZGVyICYmIGZFeHRyYVJlc291cmNlRm9sZGVyRmlsdGVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwLCBsPSBmRXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQkJCWlmIChmRXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnNbMF0uZXF1YWxzKHBhdGgwKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlUmVzb3VyY2VGaWx0ZXJzKFN0cmluZyB0ZXh0KSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCVN0cmluZ1tdIGZpbHRlcnM9IGdldFRva2Vucyh0ZXh0LCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWU9IGZpbHRlcnNbaV0ucmVwbGFjZSgnKicsICd4Jyk7Ci0JCQlpbnQgcmVzb3VyY2VUeXBlPSBJUmVzb3VyY2UuRklMRTsKLQkJCWludCBsYXN0Q2hhcmFjdGVyPSBmaWxlTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAobGFzdENoYXJhY3RlciA+PSAwICYmIGZpbGVOYW1lLmNoYXJBdChsYXN0Q2hhcmFjdGVyKSA9PSAnLycpIHsKLQkJCQlmaWxlTmFtZT0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RDaGFyYWN0ZXIpOwotCQkJCXJlc291cmNlVHlwZT0gSVJlc291cmNlLkZPTERFUjsKLQkJCX0KLQkJCUlTdGF0dXMgc3RhdHVzPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKGZpbGVOYW1lLCByZXNvdXJjZVR5cGUpOwotCQkJaWYgKHN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7CQkKLQkJCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UuZmlsdGVyLmludmFsaWRzZWdtZW50LmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10geyBzdGF0dXMuZ2V0TWVzc2FnZSgpIH0gKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlsdGVycyhTdHJpbmcgZmlsdGVyU2VxdWVuY2UpIHsKLQkJY2hhcltdW10gZmlsdGVycz0gZmlsdGVyU2VxdWVuY2UgIT0gbnVsbCAmJiBmaWx0ZXJTZXF1ZW5jZS5sZW5ndGgoKSA+IDAKLQkJPyBzcGxpdEFuZFRyaW1PbignLCcsIGZpbHRlclNlcXVlbmNlLnRvQ2hhckFycmF5KCkpCi0JCTogbnVsbDsKLQkJaWYgKGZpbHRlcnMgPT0gbnVsbCkgewotCQkJZkV4dHJhUmVzb3VyY2VGaWxlRmlsdGVycz0gbnVsbDsKLQkJCWZFeHRyYVJlc291cmNlRm9sZGVyRmlsdGVycz0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWludCBmaWxlQ291bnQ9IDAsIGZvbGRlckNvdW50PSAwOwotCQkJZm9yIChpbnQgaT0gMCwgbD0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCQljaGFyW10gZj0gZmlsdGVyc1tpXTsKLQkJCQlpZiAoZi5sZW5ndGggPT0gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGZbZi5sZW5ndGggLSAxXSA9PSAnLycpCi0JCQkJCWZvbGRlckNvdW50Kys7Ci0JCQkJZWxzZQotCQkJCQlmaWxlQ291bnQrKzsKLQkJCX0KLQkJCWZFeHRyYVJlc291cmNlRmlsZUZpbHRlcnM9IG5ldyBjaGFyW2ZpbGVDb3VudF1bXTsKLQkJCWZFeHRyYVJlc291cmNlRm9sZGVyRmlsdGVycz0gbmV3IFN0cmluZ1tmb2xkZXJDb3VudF07Ci0JCQlmb3IgKGludCBpPSAwLCBsPSBmaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJCWNoYXJbXSBmPSBmaWx0ZXJzW2ldOwotCQkJCWlmIChmLmxlbmd0aCA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZltmLmxlbmd0aCAtIDFdID09ICcvJykKLQkJCQkJZkV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzWy0tZm9sZGVyQ291bnRdPSBuZXcgU3RyaW5nKHN1YmFycmF5KGYsIDAsIGYubGVuZ3RoIC0gMSkpOwotCQkJCWVsc2UKLQkJCQkJZkV4dHJhUmVzb3VyY2VGaWxlRmlsdGVyc1stLWZpbGVDb3VudF09IGY7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLy8vLy8vLy8KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIHRleHQsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRvaz0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0LCBzZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0JCWludCBuVG9rZW5zPSB0b2suY291bnRUb2tlbnMoKTsKLQkJU3RyaW5nW10gcmVzPSBuZXcgU3RyaW5nW25Ub2tlbnNdOwotCQlmb3IgKGludCBpPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKQotCQkJcmVzW2ldPSB0b2submV4dFRva2VuKCkudHJpbSgpOwotCQlyZXR1cm4gcmVzOwotCX0JCi0JCi0JLyoqCi0JICogQW5zd2VycyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBUaGlzIGNoYXJbXSBwYXR0ZXJuIG1hdGNoaW5nIGFjY2VwdHMgd2lsZC1jYXJkcyAnKicgYW5kICc/Jy4KLQkgKiAKLQkgKiBXaGVuIG5vdCBjYXNlIHNlbnNpdGl2ZSwgdGhlIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlCi0JICogbG93ZXJjYXNlZCwgdGhlIG5hbWUgd2lsbCBiZSBsb3dlcmNhc2VkIGNoYXJhY3RlciBwZXIgY2hhcmFjdGVyIGFzCi0JICogY29tcGFyaW5nLiBJZiBuYW1lIGlzIG51bGwsIHRoZSBhbnN3ZXIgaXMgZmFsc2UuIElmIHBhdHRlcm4gaXMgbnVsbCwgdGhlCi0JICogYW5zd2VyIGlzIHRydWUgaWYgbmFtZSBpcyBub3QgbnVsbC4gPGJyPjxicj5Gb3IgZXhhbXBsZToKLQkgKiA8b2w+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIHBhdHRlcm4gPSB7ICc/JywgJ2InLCAnKicgfSBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZSByZXN1bHQgPT4gdHJ1ZQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIHBhdHRlcm4gPSB7ICc/JywgJ2InLCAnPycgfSBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZSByZXN1bHQgPT4gZmFsc2UKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiAKLQkgKiA8L2xpPgotCSAqIDxsaT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICBwYXR0ZXJuID0geyAnYicsICcqJyB9IG5hbWUgPSB7ICdhJywgJ2InLCAnYycgLCAnZCcgfSBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlIHJlc3VsdCA9PiBmYWxzZQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPC9vbD4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHBhdHRlcm4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUKLQkgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBmbGFnIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlCi0JICogICAgICAgICAgICBzZW5zaXRpdmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoKGNoYXJbXSBwYXR0ZXJuLCBjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gbnVsbCBuYW1lIGNhbm5vdCBtYXRjaAotCQlpZiAocGF0dGVybiA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIG51bGwgcGF0dGVybiBpcyBlcXVpdmFsZW50IHRvICcqJwotCQlyZXR1cm4gbWF0Y2gocGF0dGVybiwgMCwgcGF0dGVybi5sZW5ndGgsIG5hbWUsIDAsIG5hbWUubGVuZ3RoLCBpc0Nhc2VTZW5zaXRpdmUpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWJwYXJ0IG9mIHRoZSBnaXZlbiBuYW1lLAotCSAqIGZhbHNlIG90aGVyd2lzZS4gY2hhcltdIHBhdHRlcm4gbWF0Y2hpbmcsIGFjY2VwdGluZyB3aWxkLWNhcmRzICcqJyBhbmQKLQkgKiAnPycuIENhbiBtYXRjaCBvbmx5IHN1YnNldCBvZiBuYW1lL3BhdHRlcm4uIGVuZCBwb3NpdGlvbnMgYXJlCi0JICogbm9uLWluY2x1c2l2ZS4gVGhlIHN1YnBhdHRlcm4gaXMgZGVmaW5lZCBieSB0aGUgcGF0dGVyblN0YXJ0IGFuZAotCSAqIHBhdHR0ZXJuRW5kIHBvc2l0aW9ucy4gV2hlbiBub3QgY2FzZSBzZW5zaXRpdmUsIHRoZSBwYXR0ZXJuIGlzIGFzc3VtZWQKLQkgKiB0byBhbHJlYWR5IGJlIGxvd2VyY2FzZWQsIHRoZSBuYW1lIHdpbGwgYmUgbG93ZXJjYXNlZCBjaGFyYWN0ZXIgcGVyCi0JICogY2hhcmFjdGVyIGFzIGNvbXBhcmluZy4gPGJyPjxicj5Gb3IgZXhhbXBsZToKLQkgKiA8b2w+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIHBhdHRlcm4gPSB7ICc/JywgJ2InLCAnKicgfSBwYXR0ZXJuU3RhcnQgPSAxIHBhdHRlcm5FbmQgPSAzIG5hbWUgPSB7ICdhJywgJ2InLCAnYycgLCAnZCcgfSBuYW1lU3RhcnQgPSAxIG5hbWVFbmQgPSA0IGlzQ2FzZVNlbnNpdGl2ZSA9IHRydWUgcmVzdWx0ID0+IHRydWUKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiAKLQkgKiA8L2xpPgotCSAqIDxsaT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICBwYXR0ZXJuID0geyAnPycsICdiJywgJyonIH0gcGF0dGVyblN0YXJ0ID0gMSBwYXR0ZXJuRW5kID0gMiBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0gbmFtZVN0YXJ0ID0gMSBuYW1lRW5kID0gMiBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlIHJlc3VsdCA9PiBmYWxzZQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPC9vbD4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHBhdHRlcm4KLQkgKiBAcGFyYW0gcGF0dGVyblN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gcGF0dGVybiBzdGFydAotCSAqIEBwYXJhbSBwYXR0ZXJuRW5kCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gcGF0dGVybiBlbmQKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gbmFtZSBzdGFydAotCSAqIEBwYXJhbSBuYW1lRW5kCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gbmFtZSBlbmQKLQkgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBmbGFnIHRvIGtub3cgaWYgdGhlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWJwYXJ0IG9mIHRoZSBnaXZlbiBuYW1lLAotCSAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoKGNoYXJbXSBwYXR0ZXJuLCBpbnQgcGF0dGVyblN0YXJ0LCBpbnQgcGF0dGVybkVuZCwgY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gbnVsbCBuYW1lIGNhbm5vdCBtYXRjaAotCQlpZiAocGF0dGVybiA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIG51bGwgcGF0dGVybiBpcyBlcXVpdmFsZW50IHRvICcqJwotCQlpbnQgaVBhdHRlcm49IHBhdHRlcm5TdGFydDsKLQkJaW50IGlOYW1lPSBuYW1lU3RhcnQ7Ci0JCWlmIChwYXR0ZXJuRW5kIDwgMCkKLQkJCXBhdHRlcm5FbmQ9IHBhdHRlcm4ubGVuZ3RoOwotCQlpZiAobmFtZUVuZCA8IDApCi0JCQluYW1lRW5kPSBuYW1lLmxlbmd0aDsKLQkJLyogY2hlY2sgZmlyc3Qgc2VnbWVudCAqLwotCQljaGFyIHBhdHRlcm5DaGFyPSAwOwotCQl3aGlsZSAoKGlQYXR0ZXJuIDwgcGF0dGVybkVuZCkgJiYgKHBhdHRlcm5DaGFyPSBwYXR0ZXJuW2lQYXR0ZXJuXSkgIT0gJyonKSB7Ci0JCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAocGF0dGVybkNoYXIgIT0gKGlzQ2FzZVNlbnNpdGl2ZSA/IG5hbWVbaU5hbWVdIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaU5hbWVdKSkgJiYgcGF0dGVybkNoYXIgIT0gJz8nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaU5hbWUrKzsKLQkJCWlQYXR0ZXJuKys7Ci0JCX0KLQkJLyogY2hlY2sgc2VxdWVuY2Ugb2Ygc3RhcitzZWdtZW50ICovCi0JCWludCBzZWdtZW50U3RhcnQ7Ci0JCWlmIChwYXR0ZXJuQ2hhciA9PSAnKicpIHsKLQkJCXNlZ21lbnRTdGFydD0gKytpUGF0dGVybjsgLy8gc2tpcCBzdGFyCi0JCX0gZWxzZSB7Ci0JCQlzZWdtZW50U3RhcnQ9IDA7IC8vIGZvcmNlIGlOYW1lIGNoZWNrCi0JCX0KLQkJaW50IHByZWZpeFN0YXJ0PSBpTmFtZTsKLQkJY2hlY2tTZWdtZW50IDogd2hpbGUgKGlOYW1lIDwgbmFtZUVuZCkgewotCQkJaWYgKGlQYXR0ZXJuID09IHBhdHRlcm5FbmQpIHsKLQkJCQlpUGF0dGVybj0gc2VnbWVudFN0YXJ0OyAvLyBtaXNtYXRjaCAtIHJlc3RhcnQgY3VycmVudCBzZWdtZW50Ci0JCQkJaU5hbWU9ICsrcHJlZml4U3RhcnQ7Ci0JCQkJY29udGludWUgY2hlY2tTZWdtZW50OwotCQkJfQotCQkJLyogc2VnbWVudCBpcyBlbmRpbmcgKi8KLQkJCWlmICgocGF0dGVybkNoYXI9IHBhdHRlcm5baVBhdHRlcm5dKSA9PSAnKicpIHsKLQkJCQlzZWdtZW50U3RhcnQ9ICsraVBhdHRlcm47IC8vIHNraXAgc3RhcnQKLQkJCQlpZiAoc2VnbWVudFN0YXJ0ID09IHBhdHRlcm5FbmQpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXByZWZpeFN0YXJ0PSBpTmFtZTsKLQkJCQljb250aW51ZSBjaGVja1NlZ21lbnQ7Ci0JCQl9Ci0JCQkvKiBjaGVjayBjdXJyZW50IG5hbWUgY2hhcmFjdGVyICovCi0JCQlpZiAoKGlzQ2FzZVNlbnNpdGl2ZSA/IG5hbWVbaU5hbWVdIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaU5hbWVdKSkgIT0gcGF0dGVybkNoYXIgJiYgcGF0dGVybkNoYXIgIT0gJz8nKSB7Ci0JCQkJaVBhdHRlcm49IHNlZ21lbnRTdGFydDsgLy8gbWlzbWF0Y2ggLSByZXN0YXJ0IGN1cnJlbnQgc2VnbWVudAotCQkJCWlOYW1lPSArK3ByZWZpeFN0YXJ0OwotCQkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKLQkJCX0KLQkJCWlOYW1lKys7Ci0JCQlpUGF0dGVybisrOwotCQl9Ci0JCXJldHVybiAoc2VnbWVudFN0YXJ0ID09IHBhdHRlcm5FbmQpIHx8IChpTmFtZSA9PSBuYW1lRW5kICYmIGlQYXR0ZXJuID09IHBhdHRlcm5FbmQpCi0JCQkJfHwgKGlQYXR0ZXJuID09IHBhdHRlcm5FbmQgLSAxICYmIHBhdHRlcm5baVBhdHRlcm5dID09ICcqJyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIHRoZSBzcGxpdCBvZiB0aGUgZ2l2ZW4gYXJyYXkgdXNpbmcgdGhlIGdpdmVuCi0JICogZGl2aWRlciBhbmQgdHJpbWluZyBlYWNoIHN1YmFycmF5IHRvIHJlbW92ZSB3aGl0ZXNwYWNlcyBlcXVhbHMgdG8gJyAnLgotCSAqIDxicj48YnI+Rm9yIGV4YW1wbGU6Ci0JICogPG9sPgotCSAqIDxsaT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICBkaXZpZGVyID0gJ2InIGFycmF5ID0geyAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9IHJlc3VsdCA9PiB7IHsgJ2EnIH0sIHsgfSwgeyAnYScgfSwgeyAnYScgfSB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgZGl2aWRlciA9ICdjJyBhcnJheSA9IHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfSByZXN1bHQgPT4geyB7ICdhJywgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfSB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgZGl2aWRlciA9ICdiJyBhcnJheSA9IHsgJ2EnICwgJyAnLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9IHJlc3VsdCA9PiB7IHsgJ2EnIH0sIHsgfSwgeyAnYScgfSwgeyAnYScgfSB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgZGl2aWRlciA9ICdjJyBhcnJheSA9IHsgJyAnLCAnICcsICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnLCAnICcgfSByZXN1bHQgPT4geyB7ICdhJywgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfSB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBkaXZpZGVyCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gZGl2aWRlcgotCSAqIEBwYXJhbSBhcnJheQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGFycmF5Ci0JICogQHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyB0aGUgc3BsaXQgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gZGl2aWRlciBhbmQgdHJpbWluZyBlYWNoIHN1YmFycmF5IHRvIHJlbW92ZSB3aGl0ZXNwYWNlcwotCSAqICAgICAgICAgZXF1YWxzIHRvICcgJwotCSAqLwotCXByaXZhdGUgY2hhcltdW10gc3BsaXRBbmRUcmltT24oY2hhciBkaXZpZGVyLCBjaGFyW10gYXJyYXkpIHsKLQkJaW50IGxlbmd0aD0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiBOT19DSEFSX0NIQVI7Ci0JCWludCB3b3JkQ291bnQ9IDE7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCWlmIChhcnJheVtpXSA9PSBkaXZpZGVyKQotCQkJCXdvcmRDb3VudCsrOwotCQljaGFyW11bXSBzcGxpdD0gbmV3IGNoYXJbd29yZENvdW50XVtdOwotCQlpbnQgbGFzdD0gMCwgY3VycmVudFdvcmQ9IDA7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpIHsKLQkJCQlpbnQgc3RhcnQ9IGxhc3QsIGVuZD0gaSAtIDE7Ci0JCQkJd2hpbGUgKHN0YXJ0IDwgaSAmJiBhcnJheVtzdGFydF0gPT0gJyAnKQotCQkJCQlzdGFydCsrOwotCQkJCXdoaWxlIChlbmQgPiBzdGFydCAmJiBhcnJheVtlbmRdID09ICcgJykKLQkJCQkJZW5kLS07Ci0JCQkJc3BsaXRbY3VycmVudFdvcmRdPSBuZXcgY2hhcltlbmQgLSBzdGFydCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHN0YXJ0LCBzcGxpdFtjdXJyZW50V29yZCsrXSwgMCwgZW5kIC0gc3RhcnQgKyAxKTsKLQkJCQlsYXN0PSBpICsgMTsKLQkJCX0KLQkJfQotCQlpbnQgc3RhcnQ9IGxhc3QsIGVuZD0gbGVuZ3RoIC0gMTsKLQkJd2hpbGUgKHN0YXJ0IDwgbGVuZ3RoICYmIGFycmF5W3N0YXJ0XSA9PSAnICcpCi0JCQlzdGFydCsrOwotCQl3aGlsZSAoZW5kID4gc3RhcnQgJiYgYXJyYXlbZW5kXSA9PSAnICcpCi0JCQllbmQtLTsKLQkJc3BsaXRbY3VycmVudFdvcmRdPSBuZXcgY2hhcltlbmQgLSBzdGFydCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgc3BsaXRbY3VycmVudFdvcmQrK10sIDAsIGVuZCAtIHN0YXJ0ICsgMSk7Ci0JCXJldHVybiBzcGxpdDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlCi0JICogZ2l2ZW4gc3RhcnQgYW5kIGVuZGluZyBhdCB0aGUgZ2l2ZW4gZW5kLiBUaGUgZ2l2ZW4gc3RhcnQgaXMgaW5jbHVzaXZlCi0JICogYW5kIHRoZSBnaXZlbiBlbmQgaXMgZXhjbHVzaXZlLiBBbnN3ZXJzIG51bGwgaWYgc3RhcnQgaXMgZ3JlYXRlciB0aGFuCi0JICogZW5kLCBpZiBzdGFydCBpcyBsb3dlciB0aGFuIDAgb3IgaWYgZW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCi0JICogdGhlIGdpdmVuIGFycmF5LiBJZiBlbmQgZXF1YWxzIC0xLCBpdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IGxlbmd0aC4KLQkgKiA8YnI+PGJyPkZvciBleGFtcGxlOgotCSAqIDxvbD4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgYXJyYXkgPSB7ICdhJyAsICdiJyB9IHN0YXJ0ID0gMCBlbmQgPSAxIHJlc3VsdCA9PiB7ICdhJyB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgYXJyYXkgPSB7ICdhJywgJ2InIH0gc3RhcnQgPSAwIGVuZCA9IC0xIHJlc3VsdCA9PiB7ICdhJyAsICdiJyB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBhcnJheQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGFycmF5Ci0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gc3RhcnRpbmcgaW5kZXgKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gZW5kaW5nIGluZGV4Ci0JICogQHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gc3RhcnQgYW5kIGVuZGluZyBhdCB0aGUgZ2l2ZW4gZW5kCi0JICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBhcnJheSBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBjaGFyW10gc3ViYXJyYXkoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCWVuZD0gYXJyYXkubGVuZ3RoOwotCQlpZiAoc3RhcnQgPiBlbmQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZW5kID4gYXJyYXkubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0JCWNoYXJbXSByZXN1bHQ9IG5ldyBjaGFyW2VuZCAtIHN0YXJ0XTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHJlc3VsdCwgMCwgZW5kIC0gc3RhcnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzExYjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ29tcGFyZU1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEU9ICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLQlwcml2YXRlIENvbXBhcmVNZXNzYWdlcygpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzMDhiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Db21wYXJlUGx1Z2luLmludGVybmFsX2Vycm9yPSBJbnRlcm5hbCBFcnJvcgotRXhjZXB0aW9uRGlhbG9nLnNlZUVycm9yTG9nTWVzc2FnZT0gU2VlIGVycm9yIGxvZyBmb3IgZGV0YWlscy4KLQotIwotIyBUaXRsZSBmb3JtYXQgZm9yIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lCi0jCi1Db21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZS5UaXRsZWZvcm1hdD0gezB9ICAoezF9KQotCi0jCi0jIFRpdGxlIG1lc3NhZ2UgZm9yIFN0cnVjdHVyZURpZmZWaWV3ZXIgaWYgbm8gc3RydWN0dXJhbCBkaWZmZXJlbmNlcyBjb3VsZCBiZSBmb3VuZAotIwotU3RydWN0dXJlRGlmZlZpZXdlci5Ob1N0cnVjdHVyYWxEaWZmZXJlbmNlcz0gTm8gU3RydWN0dXJhbCBEaWZmZXJlbmNlcwotU3RydWN0dXJlRGlmZlZpZXdlci5TdHJ1Y3R1cmVFcnJvcj0gQ2Fubm90IENvbXBhcmUgU3RydWN0dXJlcwotCi0jCi0jIFRleHRNZXJnZVZpZXdlcgotIwotVGV4dE1lcmdlVmlld2VyLmN1cnNvclBvc2l0aW9uLmZvcm1hdD0gezB9IDogezF9Ci0KLVRleHRNZXJnZVZpZXdlci5iZWZvcmVMaW5lLmZvcm1hdD0gYmVmb3JlIGxpbmUgezB9Ci1UZXh0TWVyZ2VWaWV3ZXIucmFuZ2UuZm9ybWF0PSB7MH0gOiB7MX0KLQotVGV4dE1lcmdlVmlld2VyLmNoYW5nZVR5cGUuYWRkaXRpb249IGFkZGl0aW9uCi1UZXh0TWVyZ2VWaWV3ZXIuY2hhbmdlVHlwZS5kZWxldGlvbj0gZGVsZXRpb24KLVRleHRNZXJnZVZpZXdlci5jaGFuZ2VUeXBlLmNoYW5nZT0gY2hhbmdlCi0KLVRleHRNZXJnZVZpZXdlci5kaXJlY3Rpb24ub3V0Z29pbmc9IG91dGdvaW5nCi1UZXh0TWVyZ2VWaWV3ZXIuZGlyZWN0aW9uLmluY29taW5nPSBpbmNvbWluZwotVGV4dE1lcmdlVmlld2VyLmRpcmVjdGlvbi5jb25mbGljdGluZz0gY29uZmxpY3RpbmcKLQotVGV4dE1lcmdlVmlld2VyLmRpZmZUeXBlLmZvcm1hdD0gezB9IHsxfQotCi1UZXh0TWVyZ2VWaWV3ZXIuZGlmZkRlc2NyaXB0aW9uLm5vRGlmZi5mb3JtYXQ9IG5vIGRpZmYKLVRleHRNZXJnZVZpZXdlci5kaWZmRGVzY3JpcHRpb24uZGlmZi5mb3JtYXQ9IHswfSAjezF9IChMZWZ0OiB7Mn0sIFJpZ2h0OiB7M30pCi1UZXh0TWVyZ2VWaWV3ZXIuc3RhdHVzTGluZS5mb3JtYXQ9IExlZnQ6IHswfSwgUmlnaHQ6IHsxfSwgezJ9Ci0KLVRleHRNZXJnZVZpZXdlci5hdEVuZC50aXRsZT0gR28gdG8gTmV4dCBEaWZmZXJlbmNlCi1UZXh0TWVyZ2VWaWV3ZXIuYXRFbmQubWVzc2FnZT0gRW5kIG9mIGRvY3VtZW50IHJlYWNoZWQuIENvbnRpbnVlIGZyb20gYmVnaW5uaW5nPwotCQkJCQotVGV4dE1lcmdlVmlld2VyLmF0QmVnaW5uaW5nLnRpdGxlPSBHbyB0byBQcmV2aW91cyBEaWZmZXJlbmNlCi1UZXh0TWVyZ2VWaWV3ZXIuYXRCZWdpbm5pbmcubWVzc2FnZT0gQmVnaW5uaW5nIG9mIGRvY3VtZW50IHJlYWNoZWQuIENvbnRpbnVlIGZyb20gZW5kPwotCi1Db21wYXJlTmF2aWdhdG9yLmF0RW5kLnRpdGxlPSBHbyB0byBOZXh0IERpZmZlcmVuY2UKLUNvbXBhcmVOYXZpZ2F0b3IuYXRFbmQubWVzc2FnZT0gTGFzdCBkaWZmZXJlbmNlIHJlYWNoZWQuCi0JCQkJCi1Db21wYXJlTmF2aWdhdG9yLmF0QmVnaW5uaW5nLnRpdGxlPSBHbyB0byBQcmV2aW91cyBEaWZmZXJlbmNlCi1Db21wYXJlTmF2aWdhdG9yLmF0QmVnaW5uaW5nLm1lc3NhZ2U9IEZpcnN0IGRpZmZlcmVuY2UgcmVhY2hlZC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU5hdmlnYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZTMzNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTmF2aWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLQotLyoqCi0gKiBTdXBwb3J0cyBjcm9zcy1wYW5lIG5hdmlnYXRpb24gdGhyb3VnaCBkaWZmZXJlbmNlcy4KLSAqIFhYWDogRGVzaWduIGlzIGFzIGl0IGlzIGJlY2F1c2UgdGhlIGZlYXR1cmUgaGFkIHRvIGJlIGFkZGVkIHdpdGhvdXQgdG91Y2hpbmcgQVBJLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZU5hdmlnYXRvciBpbXBsZW1lbnRzIElDb21wYXJlTmF2aWdhdG9yIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZkxhc3REaXJlY3Rpb249IHRydWU7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZVtdIGZQYW5lczsKLQkvLyBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQlwcml2YXRlIGJvb2xlYW4gZk5leHRGaXJzdFRpbWU9IHRydWU7Ci0JCi0JcHVibGljIENvbXBhcmVOYXZpZ2F0b3IoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmVbXSBwYW5lcykgewotCQlmUGFuZXM9IHBhbmVzOwotCX0KLQotCXB1YmxpYyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZVtdIGdldFBhbmVzKCkgewotCQlyZXR1cm4gZlBhbmVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RDaGFuZ2UoYm9vbGVhbiBuZXh0KSB7Ci0JCQotCQlmTGFzdERpcmVjdGlvbj0gbmV4dDsKLQotCQkvLyBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkJaWYgKG5leHQgJiYgZk5leHRGaXJzdFRpbWUgJiYgbXVzdE9wZW4oKSkgewotCQkJZk5leHRGaXJzdFRpbWU9IGZhbHNlOwotCQkJb3BlbkVsZW1lbnQoKTsKLQkJfQotCQkKLQkJLy8gZmluZCBtb3N0IGRvd24gc3RyZWFtIENvbXBhcmVWaWV3ZXJQYW5lCi0JCWludCBuPSAwOwotCQlJTmF2aWdhdGFibGVbXSBuYXZpZ2F0b3JzPSBuZXcgSU5hdmlnYXRhYmxlWzRdOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZlBhbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYXZpZ2F0b3JzW25dPSBnZXROYXZpZ2F0b3IoZlBhbmVzW2ldKTsKLQkJCWlmIChuYXZpZ2F0b3JzW25dICE9IG51bGwpCi0JCQkJbisrOwotCQl9Ci0JCQkJCQkJCQkKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQluLS07Ci0JCQlpZiAobmF2aWdhdG9yc1tuXS5nb3RvRGlmZmVyZW5jZShuZXh0KSkgewotCQkJCS8vIGF0IGVuZCBvZiB0aGlzIG5hdmlnYXRvcgotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gbm90IGF0IGVuZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSU5hdmlnYXRhYmxlIGdldE5hdmlnYXRvcihDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBwYW5lKSB7Ci0JCWlmIChwYW5lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhbmUuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZpZXdlciB2aWV3ZXI9IHBhbmUuZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250cm9sIGNvbnRyb2w9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGRhdGE9IGNvbnRyb2wuZ2V0RGF0YShJTmF2aWdhdGFibGUuTkFWSUdBVE9SX1BST1BFUlRZKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBJTmF2aWdhdGFibGUpCi0JCQlyZXR1cm4gKElOYXZpZ2F0YWJsZSkgZGF0YTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENvbXBhcmVOYXZpZ2F0b3IgZmluZE5hdmlnYXRvcihDb250cm9sIGMpIHsKLQkJd2hpbGUgKGMgIT0gbnVsbCAmJiAhYy5pc0Rpc3Bvc2VkKCkpIHsJLy8gUFIgMUdFVVZWMgotCQkJT2JqZWN0IGRhdGE9IGMuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9ySW5wdXQpIHsKLQkJCQlDb21wYXJlRWRpdG9ySW5wdXQgY2VpPSAoQ29tcGFyZUVkaXRvcklucHV0KSBkYXRhOwotCQkJCU9iamVjdCBhZGFwdGVyPSBjZWkuZ2V0QWRhcHRlcihDb21wYXJlTmF2aWdhdG9yLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIENvbXBhcmVOYXZpZ2F0b3IpCi0JCQkJCXJldHVybiAoQ29tcGFyZU5hdmlnYXRvcilhZGFwdGVyOwotCQkJfQotCQkJYz0gYy5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlc2V0RGlyZWN0aW9uKCkgewotCQlib29sZWFuIGxhc3Q9IGZMYXN0RGlyZWN0aW9uOwotCQlmTGFzdERpcmVjdGlvbj0gdHJ1ZTsKLQkJcmV0dXJuIGxhc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXJlY3Rpb24oQ29udHJvbCBjKSB7Ci0JCUNvbXBhcmVOYXZpZ2F0b3IgbmF2PSBmaW5kTmF2aWdhdG9yKGMpOwotCQlpZiAobmF2ICE9IG51bGwpCi0JCQlyZXR1cm4gbmF2LnJlc2V0RGlyZWN0aW9uKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKgotCSAqIEZpeCBmb3IgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtdXN0T3BlbigpIHsKLQkJaWYgKGZQYW5lcyA9PSBudWxsIHx8IGZQYW5lcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaT0gMTsgaSA8IGZQYW5lcy5sZW5ndGg7IGkrKykgewotCQkJQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgcGFuZT0gZlBhbmVzW2ldOwotCQkJaWYgKHBhbmUgIT0gbnVsbCAmJiBwYW5lLmdldElucHV0KCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qCi0JICogRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5FbGVtZW50KCkgewotCQlpZiAoZlBhbmVzID09IG51bGwgfHwgZlBhbmVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlJT3BlbmFibGUgb3BlbmFibGU9IGdldE9wZW5hYmxlKGZQYW5lc1swXSk7Ci0JCWlmIChvcGVuYWJsZSAhPSBudWxsKSB7Ci0JCQlvcGVuYWJsZS5vcGVuU2VsZWN0ZWQoKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEZpeCBmb3IgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNgotCSAqLwotCXByaXZhdGUgc3RhdGljIElPcGVuYWJsZSBnZXRPcGVuYWJsZShDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBwYW5lKSB7Ci0JCWlmIChwYW5lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhbmUuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZpZXdlciB2aWV3ZXI9IHBhbmUuZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250cm9sIGNvbnRyb2w9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGRhdGE9IGNvbnRyb2wuZ2V0RGF0YShJT3BlbmFibGUuT1BFTkFCTEVfUFJPUEVSVFkpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIElPcGVuYWJsZSkKLQkJCXJldHVybiAoSU9wZW5hYmxlKSBkYXRhOwotCQlyZXR1cm4gbnVsbDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlT3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjczMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlT3V0bGluZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXJlT3V0bGluZVBhZ2UgaW1wbGVtZW50cyBJQ29udGVudE91dGxpbmVQYWdlIHsKLQotCXByaXZhdGUgQ29udHJvbCBmQ29udHJvbDsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JLy9wcml2YXRlIElBY3Rpb25CYXJzIGZBY3Rpb25CYXJzOwotCXByaXZhdGUgQ29tcGFyZUVkaXRvcklucHV0IGZDb21wYXJlRWRpdG9ySW5wdXQ7Ci0JCi0JQ29tcGFyZU91dGxpbmVQYWdlKENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlmQ29tcGFyZUVkaXRvcklucHV0PSBpbnB1dDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZkNvbXBhcmVFZGl0b3JJbnB1dCAhPSBudWxsKSB7Ci0JCQlmQ29udHJvbD0gZkNvbXBhcmVFZGl0b3JJbnB1dC5jcmVhdGVPdXRsaW5lQ29udGVudHMocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZkNvbnRyb2wgIT0gbnVsbCkKLQkJCWZDb250cm9sLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI2dldENvbnRyb2woKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI3NldEFjdGlvbkJhcnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCS8vZkFjdGlvbkJhcnM9IGFjdGlvbkJhcnM7Ci0JCS8vaWYgKGZDb250cm9sICE9IG51bGwpCi0JCS8vCWZDb250cm9sLnNldERhdGEoImFjdGlvbkJhcnMiLCBhY3Rpb25CYXJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGZDb250cm9sICE9IG51bGwpCi0JCQlmQ29udHJvbC5zZXRGb2N1cygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uPSBzZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjA5OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wYXJlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JCi0JY2xhc3MgRmFrZUlucHV0IGltcGxlbWVudHMgSVR5cGVkRWxlbWVudCwgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNj0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZDb250ZW50OwotCQkKLQkJRmFrZUlucHV0KFN0cmluZyBuYW1lKSB7Ci0JCQlmQ29udGVudD0gbG9hZFByZXZpZXdDb250ZW50RnJvbUZpbGUobmFtZSk7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJubyBuYW1lIjsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiAibm8gdHlwZSI7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB7Ci0JCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFV0aWxpdGllcy5nZXRCeXRlcyhmQ29udGVudCwgVVRGXzE2KSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgewotCQkJcmV0dXJuIFVURl8xNjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVg9IENvbXBhcmVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1NUUlVDVFVSRV9DT01QQVJFPSBQUkVGSVggKyAiT3BlblN0cnVjdHVyZUNvbXBhcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ0hST05JWkVfU0NST0xMSU5HPSBQUkVGSVggKyAiU3luY2hyb25pemVTY3JvbGxpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19QU0VVRE9fQ09ORkxJQ1RTPSBQUkVGSVggKyAiU2hvd1BzZXVkb0NvbmZsaWN0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FPSBQUkVGSVggKyAiSW5pdGlhbGx5U2hvd0FuY2VzdG9yUGFuZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NBVkVfQUxMX0VESVRPUlM9IFBSRUZJWCArICJTYXZlQWxsRWRpdG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX01PUkVfSU5GTz0gUFJFRklYICsgIlNob3dNb3JlSW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfV0hJVEVTUEFDRT0gUFJFRklYICsgIklnbm9yZVdoaXRlc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfU1BMSU5FUz0gUFJFRklYICsgIlVzZVNwbGluZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1NJTkdMRV9MSU5FPSBQUkVGSVggKyAiVXNlU2luZ2xlTGluZSI7IC8vJE5PTi1OTFMtMSQKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9SRVNPTFZFX1VJPSBQUkVGSVggKyAiVXNlUmVzb2x2ZVVJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfRklMVEVSPSBQUkVGSVggKyAiUGF0aEZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIFRleHRNZXJnZVZpZXdlciBmUHJldmlld1ZpZXdlcjsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGZPdmVybGF5U3RvcmU7Ci0JcHJpdmF0ZSBNYXAgZkNoZWNrQm94ZXM9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBUZXh0IGZGaWx0ZXJzOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkNoZWNrQm94TGlzdGVuZXI7Ci0KLQotCXB1YmxpYyBmaW5hbCBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBmS2V5cz0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIHsJCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBPUEVOX1NUUlVDVFVSRV9DT01QQVJFKSwKLQkJbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIFNZTkNIUk9OSVpFX1NDUk9MTElORyksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBTSE9XX1BTRVVET19DT05GTElDVFMpLAotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBTSE9XX01PUkVfSU5GTyksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBJR05PUkVfV0hJVEVTUEFDRSksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBQUkVGX1NBVkVfQUxMX0VESVRPUlMpLAotCQkKLQkJbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfQkFDS0dST1VORCksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9CQUNLR1JPVU5EX1NZU1RFTV9ERUZBVUxUKSwKLQkJCi0JCS8vbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIFVTRV9TUExJTkVTKSwKLQkJbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIFVTRV9TSU5HTEVfTElORSksCi0JCS8vbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIFVTRV9SRVNPTFZFX1VJKSwKLQkJbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgUEFUSF9GSUxURVIpLAotCX07Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXREZWZhdWx0cyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoT1BFTl9TVFJVQ1RVUkVfQ09NUEFSRSwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoU1lOQ0hST05JWkVfU0NST0xMSU5HLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChTSE9XX1BTRVVET19DT05GTElDVFMsIGZhbHNlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FLCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoU0hPV19NT1JFX0lORk8sIGZhbHNlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJR05PUkVfV0hJVEVTUEFDRSwgZmFsc2UpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBSRUZfU0FWRV9BTExfRURJVE9SUywgZmFsc2UpOwotCQkvL3N0b3JlLnNldERlZmF1bHQoVVNFX1NQTElORVMsIGZhbHNlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChVU0VfU0lOR0xFX0xJTkUsIHRydWUpOwotCQkvL3N0b3JlLnNldERlZmF1bHQoVVNFX1JFU09MVkVfVUksIGZhbHNlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQQVRIX0ZJTFRFUiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlzdG9yZS5zZXREZWZhdWx0KEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkRfU1lTVEVNX0RFRkFVTFQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBDb21wYXJlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCQotCQkvL3NldERlc2NyaXB0aW9uKFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5kZXNjcmlwdGlvbiIpKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQkKLQkJZk92ZXJsYXlTdG9yZT0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGZLZXlzKTsKLQkJZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcj0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBrZXk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkJaWYgKGtleS5lcXVhbHMoSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSkpIHsKLQkJCQkJYm9vbGVhbiBiPSBmT3ZlcmxheVN0b3JlLmdldEJvb2xlYW4oSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSk7Ci0JCQkJCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KElOSVRJQUxMWV9TSE9XX0FOQ0VTVE9SX1BBTkUsIG5ldyBCb29sZWFuKGIpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZk92ZXJsYXlTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gZW1wdHkKLQl9CQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlmT3ZlcmxheVN0b3JlLnByb3BhZ2F0ZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQkKLQkJZk92ZXJsYXlTdG9yZS5sb2FkRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJCi0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWlmIChmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlmT3ZlcmxheVN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcj0gbnVsbDsKLQkJCX0KLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQkJZk92ZXJsYXlTdG9yZT0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBnZXRTYXZlQWxsRWRpdG9ycygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlLmdldEJvb2xlYW4oUFJFRl9TQVZFX0FMTF9FRElUT1JTKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHNldFNhdmVBbGxFZGl0b3JzKGJvb2xlYW4gdmFsdWUpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0VmFsdWUoUFJFRl9TQVZFX0FMTF9FRElUT1JTLCB2YWx1ZSk7Ci0JfQkKLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgSUNvbXBhcmVDb250ZXh0SWRzLkNPTVBBUkVfUFJFRkVSRU5DRV9QQUdFKTsKLQkJCi0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0JCQotCQlUYWJGb2xkZXIgZm9sZGVyPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7CQotCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlUYWJJdGVtIGl0ZW09IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmdlbmVyYWxUYWIubGFiZWwiKSk7CS8vJE5PTi1OTFMtMSQKLQkJLy9pdGVtLnNldEltYWdlKEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfQ0ZJTEUpKTsKLQkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZUdlbmVyYWxQYWdlKGZvbGRlcikpOwotCQkKLQkJaXRlbT0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UudGV4dENvbXBhcmVUYWIubGFiZWwiKSk7CS8vJE5PTi1OTFMtMSQKLQkJLy9pdGVtLnNldEltYWdlKEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfQ0ZJTEUpKTsKLQkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZVRleHRDb21wYXJlUGFnZShmb2xkZXIpKTsKLQkJCi0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChmb2xkZXIpOwotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlR2VuZXJhbFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDE7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkKLQkJYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnN0cnVjdHVyZUNvbXBhcmUubGFiZWwiLCBPUEVOX1NUUlVDVFVSRV9DT01QQVJFLCAwKTsJLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChjb21wb3NpdGUsICJDb21wYXJlUHJlZmVyZW5jZVBhZ2Uuc2hvd01vcmVJbmZvLmxhYmVsIiwgU0hPV19NT1JFX0lORk8sIDApOwkvLyROT04tTkxTLTEkCi0JCWFkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5pZ25vcmVXaGl0ZXNwYWNlLmxhYmVsIiwgSUdOT1JFX1dISVRFU1BBQ0UsIDApOwkvLyROT04tTkxTLTEkCi0JCQotCQkvLyBhIHNwYWNlcgotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnNhdmVCZWZvcmVQYXRjaGluZy5sYWJlbCIsIFBSRUZfU0FWRV9BTExfRURJVE9SUywgMCk7CS8vJE5PTi1OTFMtMSQKLQotCQkvLyBhIHNwYWNlcgotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQotCQlMYWJlbCBsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWwuc2V0VGV4dChVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UuZmlsdGVyLmRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlDb21wb3NpdGUgYzI9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWMyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQljMi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWw9IG5ldyBMYWJlbChjMiwgU1dULk5PTkUpOwotCQlsLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmZpbHRlci5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZkZpbHRlcnM9IG5ldyBUZXh0KGMyLCBTV1QuQk9SREVSKTsKLQkJZkZpbHRlcnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZGaWx0ZXJzLnNldFRleHQoZk92ZXJsYXlTdG9yZS5nZXRTdHJpbmcoUEFUSF9GSUxURVIpKTsKLQkJZkZpbHRlcnMuYWRkTW9kaWZ5TGlzdGVuZXIoCi0JCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBmaWx0ZXJzPSBmRmlsdGVycy5nZXRUZXh0KCk7Ci0JCQkJCVN0cmluZyBtZXNzYWdlPSBDb21wYXJlRmlsdGVyLnZhbGlkYXRlUmVzb3VyY2VGaWx0ZXJzKGZpbHRlcnMpOwotCQkJCQlzZXRWYWxpZChtZXNzYWdlID09IG51bGwpOwotCQkJCQlzZXRNZXNzYWdlKG51bGwpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoUEFUSF9GSUxURVIsIGZpbHRlcnMpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVUZXh0Q29tcGFyZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCi0JCWFkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zeW5jaHJvbml6ZVNjcm9sbGluZy5sYWJlbCIsIFNZTkNIUk9OSVpFX1NDUk9MTElORywgMCk7CS8vJE5PTi1OTFMtMSQKLQkJYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmluaXRpYWxseVNob3dBbmNlc3RvclBhbmUubGFiZWwiLCBJTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FLCAwKTsJLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChjb21wb3NpdGUsICJDb21wYXJlUHJlZmVyZW5jZVBhZ2Uuc2hvd1BzZXVkb0NvbmZsaWN0cy5sYWJlbCIsIFNIT1dfUFNFVURPX0NPTkZMSUNUUywgMCk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnVzZVNwbGluZXMubGFiZWwiLCBVU0VfU1BMSU5FUywgMCk7CS8vJE5PTi1OTFMtMSQKLQkJYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnVzZVNpbmdsZUxpbmUubGFiZWwiLCBVU0VfU0lOR0xFX0xJTkUsIDApOwkvLyROT04tTkxTLTEkCi0JCS8vYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnVzZVJlc29sdmVVSS5sYWJlbCIsIFVTRV9SRVNPTFZFX1VJLCAwKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gYSBzcGFjZXIKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkKLQkJTGFiZWwgcHJldmlld0xhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXByZXZpZXdMYWJlbC5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5wcmV2aWV3LmxhYmVsIikpOwkvLyROT04tTkxTLTEkCi0JCQotCQlDb250cm9sIHByZXZpZXdlcj0gY3JlYXRlUHJldmlld2VyKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2Qud2lkdGhIaW50PSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNjApOwotCQlnZC5oZWlnaHRIaW50PSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEzKTsKLQkJcHJldmlld2VyLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZVByZXZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gbmV3IENvbXBhcmVDb25maWd1cmF0aW9uKGZPdmVybGF5U3RvcmUpOwotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0QW5jZXN0b3JMYWJlbChVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UuYW5jZXN0b3IubGFiZWwiKSk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRMZWZ0TGFiZWwoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmxlZnQubGFiZWwiKSk7CS8vJE5PTi1OTFMtMSQKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldExlZnRFZGl0YWJsZShmYWxzZSk7Ci0JCQotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UmlnaHRMYWJlbChVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UucmlnaHQubGFiZWwiKSk7CS8vJE5PTi1OTFMtMSQKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldFJpZ2h0RWRpdGFibGUoZmFsc2UpOwotCQkKLQkJZlByZXZpZXdWaWV3ZXI9IG5ldyBUZXh0TWVyZ2VWaWV3ZXIocGFyZW50LCBTV1QuQk9SREVSLCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24pOwotCQkKLQkJZlByZXZpZXdWaWV3ZXIuc2V0SW5wdXQoCi0JCQluZXcgRGlmZk5vZGUoRGlmZmVyZW5jZXIuQ09ORkxJQ1RJTkcsCi0JCQkJbmV3IEZha2VJbnB1dCgiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnByZXZpZXdBbmNlc3RvciIpLAkvLyROT04tTkxTLTEkCi0JCQkJbmV3IEZha2VJbnB1dCgiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnByZXZpZXdMZWZ0IiksCS8vJE5PTi1OTFMtMSQKLQkJCQluZXcgRmFrZUlucHV0KCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UucHJldmlld1JpZ2h0IikJLy8kTk9OLU5MUy0xJAotCQkJKQotCQkpOwotCi0JCUNvbnRyb2wgYz0gZlByZXZpZXdWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQljLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuICBjOwotCX0KLQkJCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQkKLQkJSXRlcmF0b3IgZT0gZkNoZWNrQm94ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlCdXR0b24gYj0gKEJ1dHRvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5PSAoU3RyaW5nKSBmQ2hlY2tCb3hlcy5nZXQoYik7Ci0JCQliLnNldFNlbGVjdGlvbihmT3ZlcmxheVN0b3JlLmdldEJvb2xlYW4oa2V5KSk7Ci0JCX0KLQkJCi0JCWlmIChmRmlsdGVycyAhPSBudWxsKQotCQkJZkZpbHRlcnMuc2V0VGV4dChmT3ZlcmxheVN0b3JlLmdldFN0cmluZyhQQVRIX0ZJTFRFUikpOwotCX0KLQotCS8vIG92ZXJsYXkgc3R1ZmYKLQkKLQlwcml2YXRlIEJ1dHRvbiBhZGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxLZXksIFN0cmluZyBrZXksIGludCBpbmRlbnRhdGlvbikgewotCQkKLQkJU3RyaW5nIGxhYmVsPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGxhYmVsS2V5KTsKLQkJCQkKLQkJQnV0dG9uIGNoZWNrQm94PSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dChsYWJlbCk7Ci0JCQotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQ9IGluZGVudGF0aW9uOwotCQlnZC5ob3Jpem9udGFsU3Bhbj0gMjsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlpZiAoZkNoZWNrQm94TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkNoZWNrQm94TGlzdGVuZXI9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQnV0dG9uIGJ1dHRvbj0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGJ1dHRvbiksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmQ2hlY2tCb3hMaXN0ZW5lcik7Ci0JCQotCQlmQ2hlY2tCb3hlcy5wdXQoY2hlY2tCb3gsIGtleSk7Ci0JCQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGxvYWRQcmV2aWV3Q29udGVudEZyb21GaWxlKFN0cmluZyBrZXkpIHsKLQkJCi0JCVN0cmluZyBwcmV2aWV3PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGtleSk7Ci0JCVN0cmluZyBzZXBhcmF0b3I9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBwcmV2aWV3Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgYz0gcHJldmlldy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnXG4nKQotCQkJCWJ1ZmZlci5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyYmJkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGUgQ29tcGFyZSBVSSBwbHVnLWluIGRlZmluZXMgdGhlIGVudHJ5IHBvaW50IHRvIGluaXRpYXRlIGEgY29uZmlndXJhYmxlCi0gKiBjb21wYXJlIG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgcmVzb3VyY2VzLiBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJlCi0gKiBpcyBvcGVuZWQgaW50byBhIGNvbXBhcmUgZWRpdG9yIHdoZXJlIHRoZSBkZXRhaWxzIGNhbiBiZSBicm93c2VkIGFuZAotICogZWRpdGVkIGluIGR5bmFtaWNhbGx5IHNlbGVjdGVkIHN0cnVjdHVyZSBhbmQgY29udGVudCB2aWV3ZXJzLgotICogPHA+Ci0gKiBUaGUgQ29tcGFyZSBVSSBwcm92aWRlcyBhIHJlZ2lzdHJ5IGZvciBjb250ZW50IGFuZCBzdHJ1Y3R1cmUgY29tcGFyZSB2aWV3ZXJzLAotICogd2hpY2ggaXMgaW5pdGlhbGl6ZWQgZnJvbSBleHRlbnNpb25zIGNvbnRyaWJ1dGVkIHRvIGV4dGVuc2lvbiBwb2ludHMKLSAqIGRlY2xhcmVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyB0aGUgcGx1Zy1pbiBydW50aW1lIGNsYXNzIGZvciB0aGUgCi0gKiA8Y29kZT4ib3JnLmVjbGlwc2UuY29tcGFyZSI8L2NvZGU+IHBsdWctaW4uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXJlVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAKLSAgICBzdGF0aWMgY2xhc3MgQ29tcGFyZVJlZ2lzdHJ5IHsKLSAgICAgICAgCi0gICAgCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSURfQVRUUklCVVRFPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OU19BVFRSSUJVVEU9ICJleHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotICAgIAkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRFTlRfVFlQRV9JRF9BVFRSSUJVVEU9ICJjb250ZW50VHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotIAotICAgIAkJcHJpdmF0ZSBIYXNoTWFwIGZJZE1hcDsKLSAgICAJCXByaXZhdGUgSGFzaE1hcCBmRXh0ZW5zaW9uTWFwOwotICAgIAkJcHJpdmF0ZSBIYXNoTWFwIGZDb250ZW50VHlwZUJpbmRpbmdzOwkJLy8gbWFwcyBjb250ZW50IHR5cGUgYmluZGluZ3MgdG8gZGF0YXMKLSAgICAgICAgCi0gCi0JICAgIAl2b2lkIHJlZ2lzdGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgZGF0YSkgewotCSAgICAJICAgIFN0cmluZyBpZD0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFKTsKLQkgICAgCSAgICBpZiAoaWQgIT0gbnVsbCkgeyAgICAgIAotCSAgICAJICAgICAgICBpZiAoZklkTWFwID09IG51bGwpCi0JICAgIAkgICAgICAgICAgICBmSWRNYXA9IG5ldyBIYXNoTWFwKCk7Ci0JICAgIAkgICAgICAgIGZJZE1hcC5wdXQoaWQsIGRhdGEpOwotCSAgICAJICAgIH0KLQkgICAgCSAgICAKLQkgICAgCSAgICBTdHJpbmcgdHlwZXM9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVYVEVOU0lPTlNfQVRUUklCVVRFKTsKLQkgICAgCSAgICBpZiAodHlwZXMgIT0gbnVsbCkgewotCSAgICAJICAgICAgICBpZiAoZkV4dGVuc2lvbk1hcCA9PSBudWxsKQotCSAgICAJICAgICAgICAgICAgZkV4dGVuc2lvbk1hcD0gbmV3IEhhc2hNYXAoKTsKLQkJICAgIAkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplcj0gbmV3IFN0cmluZ1Rva2VuaXplcih0eXBlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCSAgICAJCQlTdHJpbmcgZXh0ZW5zaW9uPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkgICAgCQkJZkV4dGVuc2lvbk1hcC5wdXQobm9ybWFsaXplQ2FzZShleHRlbnNpb24pLCBkYXRhKTsKLQkJICAgIAkJfQotCSAgICAJICAgIH0KLQkgICAgCX0KLQotCSAgICAJdm9pZCBjcmVhdGVCaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgaWRBdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZT0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ09OVEVOVF9UWVBFX0lEX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBTdHJpbmcgaWQ9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGlkQXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2UoVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLnRhcmdldElkQXR0cmlidXRlTWlzc2luZyIsIGlkQXR0cmlidXRlTmFtZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIGlkICE9IG51bGwgJiYgZklkTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgbz0gZklkTWFwLmdldChpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgY3Q9IGZnQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZDb250ZW50VHlwZUJpbmRpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRUeXBlQmluZGluZ3M9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudFR5cGVCaW5kaW5ncy5wdXQoY3QsIG8pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3JNZXNzYWdlKFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi5jb250ZW50VHlwZU5vdEZvdW5kIiwgdHlwZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2UoVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLnRhcmdldE5vdEZvdW5kIiwgaWQpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkgICAgCX0KLQotCSAgICAJT2JqZWN0IHNlYXJjaChJQ29udGVudFR5cGUgdHlwZSkgewotCSAgICAJICAgIGlmICh0eXBlICE9IG51bGwgJiYgZkNvbnRlbnRUeXBlQmluZGluZ3MgIT0gbnVsbCkgewotCQkgICAgCSAgICBPYmplY3QgYj0gZkNvbnRlbnRUeXBlQmluZGluZ3MuZ2V0KHR5cGUpOwotCQkgICAgCSAgICBpZiAoYiAhPSBudWxsKQotCQkgICAgCSAgICAgICAgcmV0dXJuIGI7Ci0JICAgICAgICAgICAgSXRlcmF0b3IgaXRlcj0gZkNvbnRlbnRUeXBlQmluZGluZ3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGN0PSAoSUNvbnRlbnRUeXBlKSBpdGVyLm5leHQoKTsKLQkgICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNLaW5kT2YoY3QpKSB7Ci0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gZkNvbnRlbnRUeXBlQmluZGluZ3MuZ2V0KGN0KTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgCSAgICB9Ci0JICAgIAkgICAgcmV0dXJuIG51bGw7Ci0JICAgIAl9Ci0JICAgIAkKLQkgICAgCU9iamVjdCBzZWFyY2goU3RyaW5nIGV4dGVuc2lvbikgewotCSAgICAJICAgIGlmIChmRXh0ZW5zaW9uTWFwICE9IG51bGwpCi0JICAgIAkgICAgICAgIHJldHVybiBmRXh0ZW5zaW9uTWFwLmdldChub3JtYWxpemVDYXNlKGV4dGVuc2lvbikpOwotCSAgICAJICAgIHJldHVybiBudWxsOwotCSAgICAJfQotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTF9ORVhUPSAiZGxjbDE2L25leHRfbmF2LmdpZiI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTF9ORVhUPSAiZWxjbDE2L25leHRfbmF2LmdpZiI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVE9PTF9ORVhUPSBFVE9PTF9ORVhUOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUT09MX1BSRVY9ICJkbGNsMTYvcHJldl9uYXYuZ2lmIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUT09MX1BSRVY9ICJlbGNsMTYvcHJldl9uYXYuZ2lmIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUT09MX1BSRVY9IEVUT09MX1BSRVY7Ci0JCQkJCi0JLyoqIFN0YXR1cyBjb2RlIGRlc2NyaWJpbmcgYW4gaW50ZXJuYWwgZXJyb3IgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUj0gMTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gTk9STUFMSVpFX0NBU0U9IHRydWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQ9ICJvcmcuZWNsaXBzZS5jb21wYXJlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfVFlQRT0gImJpbmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fTUVSR0VSX0VYVEVOU0lPTl9QT0lOVD0gInN0cmVhbU1lcmdlcnMiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fTUVSR0VSPSAic3RyZWFtTWVyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01FUkdFUl9JRF9BVFRSSUJVVEU9ICJzdHJlYW1NZXJnZXJJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFX0NSRUFUT1JfRVhURU5TSU9OX1BPSU5UPSAic3RydWN0dXJlQ3JlYXRvcnMiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkVfQ1JFQVRPUj0gInN0cnVjdHVyZUNyZWF0b3IiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkVfQ1JFQVRPUl9JRF9BVFRSSUJVVEU9ICJzdHJ1Y3R1cmVDcmVhdG9ySWQiOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXRVJfVEFHPSAidmlld2VyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkVfTUVSR0VfVklFV0VSX0VYVEVOU0lPTl9QT0lOVD0gInN0cnVjdHVyZU1lcmdlVmlld2VycyI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUlVDVFVSRV9NRVJHRV9WSUVXRVJfSURfQVRUUklCVVRFPSAic3RydWN0dXJlTWVyZ2VWaWV3ZXJJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NRVJHRV9WSUVXRVJfRVhURU5TSU9OX1BPSU5UPSAiY29udGVudE1lcmdlVmlld2VycyI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUVSR0VfVklFV0VSX0lEX0FUVFJJQlVURT0gImNvbnRlbnRNZXJnZVZpZXdlcklkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1ZJRVdFUl9FWFRFTlNJT05fUE9JTlQ9ICJjb250ZW50Vmlld2VycyI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVklFV0VSX0lEX0FUVFJJQlVURT0gImNvbnRlbnRWaWV3ZXJJZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQklORElORz0gImNvbnRlbnRUeXBlQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCi0gIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRV9FRElUT1I9IFBMVUdJTl9JRCArICIuQ29tcGFyZUVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFVklFV0VSX0FMSUFTRVNfUFJFRkVSRU5DRV9OQU1FPSAiU3RydWN0dXJlVmlld2VyQWxpYXNlcyI7CS8vJE5PTi1OTFMtMSQKLQotCS8vIGNvbnRlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZU1hbmFnZXIgZmdDb250ZW50VHlwZU1hbmFnZXI9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCi0JLyoqCi0JICogVGhlIHBsdWdpbiBzaW5nbGV0b24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyZVVJUGx1Z2luIGZnQ29tcGFyZVBsdWdpbjsKLQkKLQkvKiogTWFwcyB0eXBlIHRvIGljb25zICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZnSW1hZ2VzPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQkvKiogTWFwcyB0eXBlIHRvIEltYWdlRGVzY3JpcHRvcnMgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZmdJbWFnZURlc2NyaXB0b3JzPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQkvKiogTWFwcyBJbWFnZURlc2NyaXB0b3JzIHRvIEltYWdlcyAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBmZ0ltYWdlczI9IG5ldyBIYXNodGFibGUoMTApOwotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZmdEaXNwb3NlT25TaHV0ZG93bkltYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZSZWdpc3RyaWVzSW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBDb21wYXJlUmVnaXN0cnkgZlN0cmVhbU1lcmdlcnM9IG5ldyBDb21wYXJlUmVnaXN0cnkoKTsKLQlwcml2YXRlIENvbXBhcmVSZWdpc3RyeSBmU3RydWN0dXJlQ3JlYXRvcnM9IG5ldyBDb21wYXJlUmVnaXN0cnkoKTsKLQlwcml2YXRlIENvbXBhcmVSZWdpc3RyeSBmU3RydWN0dXJlTWVyZ2VWaWV3ZXJzPSBuZXcgQ29tcGFyZVJlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBDb21wYXJlUmVnaXN0cnkgZkNvbnRlbnRWaWV3ZXJzPSBuZXcgQ29tcGFyZVJlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBDb21wYXJlUmVnaXN0cnkgZkNvbnRlbnRNZXJnZVZpZXdlcnM9IG5ldyBDb21wYXJlUmVnaXN0cnkoKTsKLQotCXByaXZhdGUgTWFwIGZTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzOwotCXByaXZhdGUgQ29tcGFyZUZpbHRlciBmRmlsdGVyOwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+Q29tcGFyZVVJUGx1Z2luPC9jb2RlPiBvYmplY3QgYW5kIHJlZ2lzdGVycyBhbGwKLQkgKiBzdHJ1Y3R1cmUgY3JlYXRvcnMsIGNvbnRlbnQgbWVyZ2Ugdmlld2VycywgYW5kIHN0cnVjdHVyZSBtZXJnZSB2aWV3ZXJzCi0JICogY29udHJpYnV0ZWQgdG8gdGhpcyBwbHVnLWluJ3MgZXh0ZW5zaW9uIHBvaW50cy4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgaW5zdGFuY2VzIG9mIHBsdWctaW4gcnVudGltZSBjbGFzc2VzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgCi0JICogYnkgdGhlIHBsYXRmb3JtIGluIHRoZSBjb3Vyc2Ugb2YgcGx1Zy1pbiBhY3RpdmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21wYXJlVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUFzc2VydC5pc1RydWUoZmdDb21wYXJlUGx1Z2luID09IG51bGwpOwotCQlmZ0NvbXBhcmVQbHVnaW49IHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQkJCQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHM9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZW1lbWJlckFsaWFzZXMocHMpOwkKLQkJaWYgKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXBzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlpZiAoZmdEaXNwb3NlT25TaHV0ZG93bkltYWdlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpPSBmZ0Rpc3Bvc2VPblNodXRkb3duSW1hZ2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJbWFnZSBpbWc9IChJbWFnZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKCFpbWcuaXNEaXNwb3NlZCgpKQotCQkJCQlpbWcuZGlzcG9zZSgpOwotCQkJfQotCQkJZmdJbWFnZXM9IG51bGw7Ci0JCX0KLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWctaW4gcnVudGltZSBjbGFzcy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgcGx1Zy1pbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcGFyZVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBmZ0NvbXBhcmVQbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwbHVnLWluJ3MgcmVzb3VyY2UgYnVuZGxlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQlmUmVzb3VyY2VCdW5kbGU9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHBsdWctaW4ncyB1bmlxdWUgaWRlbnRpZmllci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBsdWdpbidzIHVuaXF1ZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVSZWdpc3RyaWVzKCkgewotCQlpZiAoIWZSZWdpc3RyaWVzSW5pdGlhbGl6ZWQpIHsKLQkJCXJlZ2lzdGVyRXh0ZW5zaW9ucygpOwotCQkJZlJlZ2lzdHJpZXNJbml0aWFsaXplZD0gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlcnMgYWxsIHN0cmVhbSBtZXJnZXJzLCBzdHJ1Y3R1cmUgY3JlYXRvcnMsIGNvbnRlbnQgbWVyZ2Ugdmlld2VycywgYW5kIHN0cnVjdHVyZSBtZXJnZSB2aWV3ZXJzCi0JICogdGhhdCBhcmUgZm91bmQgaW4gdGhlIFhNTCBwbHVnaW4gZmlsZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRXh0ZW5zaW9ucygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5PSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkKLQkJLy8gY29sbGVjdCBhbGwgSVN0cmVhbU1lcmdlcnMKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihQTFVHSU5fSUQsIFNUUkVBTV9NRVJHRVJfRVhURU5TSU9OX1BPSU5UKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JICAgIAkJaWYgKFNUUkVBTV9NRVJHRVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQlmU3RyZWFtTWVyZ2Vycy5yZWdpc3RlcihlbGVtZW50LCBuZXcgU3RyZWFtTWVyZ2VyRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JICAgIAkJaWYgKENPTlRFTlRfVFlQRV9CSU5ESU5HLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JICAgIAkJICAgIGZTdHJlYW1NZXJnZXJzLmNyZWF0ZUJpbmRpbmcoZWxlbWVudCwgU1RSRUFNX01FUkdFUl9JRF9BVFRSSUJVVEUpOwotCQl9Ci0JCQkJCi0JCS8vIGNvbGxlY3QgYWxsIElTdHJ1Y3R1cmVDcmVhdG9ycwotCQllbGVtZW50cz0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFBMVUdJTl9JRCwgU1RSVUNUVVJFX0NSRUFUT1JfRVhURU5TSU9OX1BPSU5UKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBTdHJpbmcgbmFtZT0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCSAgICBpZiAoIUNPTlRFTlRfVFlQRV9CSU5ESU5HLmVxdWFscyhuYW1lKSkgewotCQkgICAgICAgIGlmICghU1RSVUNUVVJFX0NSRUFUT1IuZXF1YWxzKG5hbWUpKQotCSAgICAgICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2UoVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLnVuZXhwZWN0ZWRUYWciLCBuYW1lLCBTVFJVQ1RVUkVfQ1JFQVRPUikpOyAvLyROT04tTkxTLTEkCQkgICAgICAgICAgICAKLQkJICAgICAgICBmU3RydWN0dXJlQ3JlYXRvcnMucmVnaXN0ZXIoZWxlbWVudCwgbmV3IFN0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJICAgIH0KLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50PSBlbGVtZW50c1tpXTsKLQkJICAgIGlmIChDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkgICAgICAgIGZTdHJ1Y3R1cmVDcmVhdG9ycy5jcmVhdGVCaW5kaW5nKGVsZW1lbnQsIFNUUlVDVFVSRV9DUkVBVE9SX0lEX0FUVFJJQlVURSk7Ci0JCX0KLQkJCQkKLQkJLy8gY29sbGVjdCBhbGwgdmlld2VycyB3aGljaCBkZWZpbmUgdGhlIHN0cnVjdHVyZSBtZXJnZXZpZXdlciBleHRlbnNpb24gcG9pbnQKLQkJZWxlbWVudHM9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihQTFVHSU5fSUQsIFNUUlVDVFVSRV9NRVJHRV9WSUVXRVJfRVhURU5TSU9OX1BPSU5UKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBTdHJpbmcgbmFtZT0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCSAgICBpZiAoIUNPTlRFTlRfVFlQRV9CSU5ESU5HLmVxdWFscyhuYW1lKSkgewotCQkgICAgICAgIGlmICghVklFV0VSX1RBRy5lcXVhbHMobmFtZSkpCi0JICAgICAgICAgICAgICAgIGxvZ0Vycm9yTWVzc2FnZShVdGlsaXRpZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJDb21wYXJlVUlQbHVnaW4udW5leHBlY3RlZFRhZyIsIG5hbWUsIFZJRVdFUl9UQUcpKTsgLy8kTk9OLU5MUy0xJAkJICAgICAgICAgICAgCi0JCSAgICAgICAgZlN0cnVjdHVyZU1lcmdlVmlld2Vycy5yZWdpc3RlcihlbGVtZW50LCBuZXcgVmlld2VyRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCSAgICB9Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBpZiAoQ09OVEVOVF9UWVBFX0JJTkRJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJICAgICAgICBmU3RydWN0dXJlTWVyZ2VWaWV3ZXJzLmNyZWF0ZUJpbmRpbmcoZWxlbWVudCwgU1RSVUNUVVJFX01FUkdFX1ZJRVdFUl9JRF9BVFRSSUJVVEUpOwotCQl9Ci0JCQotCQkvLyBjb2xsZWN0IGFsbCB2aWV3ZXJzIHdoaWNoIGRlZmluZSB0aGUgY29udGVudCBtZXJnZXZpZXdlciBleHRlbnNpb24gcG9pbnQKLQkJZWxlbWVudHM9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihQTFVHSU5fSUQsIENPTlRFTlRfTUVSR0VfVklFV0VSX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkgICAgU3RyaW5nIG5hbWU9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkgICAgaWYgKCFDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMobmFtZSkpIHsKLQkJICAgICAgICBpZiAoIVZJRVdFUl9UQUcuZXF1YWxzKG5hbWUpKQotCSAgICAgICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2UoVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLnVuZXhwZWN0ZWRUYWciLCBuYW1lLCBWSUVXRVJfVEFHKSk7IC8vJE5PTi1OTFMtMSQJCSAgICAgICAgICAgIAotCQkgICAgICAgIGZDb250ZW50TWVyZ2VWaWV3ZXJzLnJlZ2lzdGVyKGVsZW1lbnQsIG5ldyBWaWV3ZXJEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJICAgIH0KLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50PSBlbGVtZW50c1tpXTsKLQkJICAgIGlmIChDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkgICAgICAgIGZDb250ZW50TWVyZ2VWaWV3ZXJzLmNyZWF0ZUJpbmRpbmcoZWxlbWVudCwgQ09OVEVOVF9NRVJHRV9WSUVXRVJfSURfQVRUUklCVVRFKTsKLQkJfQotCQkKLQkJLy8gY29sbGVjdCBhbGwgdmlld2VycyB3aGljaCBkZWZpbmUgdGhlIGNvbnRlbnQgdmlld2VyIGV4dGVuc2lvbiBwb2ludAotCQllbGVtZW50cz0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFBMVUdJTl9JRCwgQ09OVEVOVF9WSUVXRVJfRVhURU5TSU9OX1BPSU5UKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBTdHJpbmcgbmFtZT0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCSAgICBpZiAoIUNPTlRFTlRfVFlQRV9CSU5ESU5HLmVxdWFscyhuYW1lKSkgewotCQkgICAgICAgIGlmICghVklFV0VSX1RBRy5lcXVhbHMobmFtZSkpCi0JICAgICAgICAgICAgICAgIGxvZ0Vycm9yTWVzc2FnZShVdGlsaXRpZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJDb21wYXJlVUlQbHVnaW4udW5leHBlY3RlZFRhZyIsIG5hbWUsIFZJRVdFUl9UQUcpKTsgLy8kTk9OLU5MUy0xJAkJICAgICAgICAgICAgCi0JCSAgICAgICAgZkNvbnRlbnRWaWV3ZXJzLnJlZ2lzdGVyKGVsZW1lbnQsIG5ldyBWaWV3ZXJEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJICAgIH0KLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50PSBlbGVtZW50c1tpXTsKLQkJICAgIGlmIChDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkgICAgICAgIGZDb250ZW50Vmlld2Vycy5jcmVhdGVCaW5kaW5nKGVsZW1lbnQsIENPTlRFTlRfVklFV0VSX0lEX0FUVFJJQlVURSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoIGdldEFjdGl2ZVdvcmtiZW5jaCgpIHsKLQkJQ29tcGFyZVVJUGx1Z2luIHBsdWdpbj0gZ2V0RGVmYXVsdCgpOwotCQlpZiAocGx1Z2luID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBsdWdpbi5nZXRXb3JrYmVuY2goKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2g9IGdldEFjdGl2ZVdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsJCi0JCXJldHVybiB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSB3b3Jra2JlbmNoIHBhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBhY3RpdmUgd29ya2tiZW5jaCBwYWdlIGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqCi0JICogQHJldHVybiB0aGUgYWN0aXZlIHdvcmtrYmVuY2ggcGFnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIAlubyBhY3RpdmUgd29ya2tiZW5jaCBwYWdlIGNhbiBiZSBkZXRlcm1pbmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNXVCBTaGVsbCBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyB3b3JrYmVuY2ggd2luZG93IGlzIGFjdGl2ZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIFNXVCBTaGVsbCBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogCW5vIHdvcmtiZW5jaCB3aW5kb3cgaXMgYWN0aXZlCi0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHdpbmRvdy5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gaW1hZ2UgZm9yIGJlaW5nIGRpc3Bvc2VkIHdoZW4gdGhpcyBwbHVnLWluIGlzIHNodXRkb3duLgotCSAqCi0JICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byByZWdpc3RlciBmb3IgZGlzcG9zYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZU9uU2h1dGRvd24oSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQlmZ0Rpc3Bvc2VPblNodXRkb3duSW1hZ2VzLmFkZChpbWFnZSk7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21wYXJpc29uIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gaW5wdXQgYW5kIG9wZW5zIGEKLQkgKiBjb21wYXJlIGVkaXRvciBvbiB0aGUgcmVzdWx0LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvbiB3aGljaCB0byBvcGVuIHRoZSBjb21wYXJlIGVkaXRvcgotCSAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZSBvbiB3aGljaCB0byBjcmVhdGUgYSBuZXcgY29tcGFyZSBlZGl0b3IKLQkgKiBAcGFyYW0gZWRpdG9yIGlmIG5vdCBudWxsIHRoZSBpbnB1dCBpcyBvcGVuZWQgaW4gdGhpcyBlZGl0b3IKLQkgKiBAc2VlIENvbXBhcmVFZGl0b3JJbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5Db21wYXJlRWRpdG9yKENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCwgSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSVJldXNhYmxlRWRpdG9yIGVkaXRvcikgewotCSAgICAKLQkJaWYgKGNvbXBhcmVSZXN1bHRPSyhpbnB1dCkpIHsKLQkJCQotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7CS8vIHJldXNlIHRoZSBnaXZlbiBlZGl0b3IKLQkJCQllZGl0b3Iuc2V0SW5wdXQoaW5wdXQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHBhZ2UgPT0gbnVsbCkKLQkJCQlwYWdlPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJLy8gb3BlbiBuZXcgQ29tcGFyZUVkaXRvciBvbiBwYWdlCi0JCQkJdHJ5IHsKLQkJCQkJcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBDT01QQVJFX0VESVRPUik7Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlVUlQbHVnaW4ub3BlbkVkaXRvckVycm9yIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0JCQotCQkJfSBlbHNlIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLAotCQkJCQkJVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLm9wZW5FZGl0b3JFcnJvciIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlVUlQbHVnaW4ubm9BY3RpdmVXb3JrYmVuY2hQYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tcGFyaXNvbiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGlucHV0IGFuZCBvcGVucyBhCi0JICogY29tcGFyZSBkaWFsb2cgb24gdGhlIHJlc3VsdC4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb24gd2hpY2ggdG8gb3BlbiB0aGUgY29tcGFyZSBlZGl0b3IKLQkgKiBAc2VlIENvbXBhcmVFZGl0b3JJbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5Db21wYXJlRGlhbG9nKGZpbmFsIENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkJCQotCQlpZiAoY29tcGFyZVJlc3VsdE9LKGlucHV0KSkgewotCQkJQ29tcGFyZURpYWxvZyBkaWFsb2c9IG5ldyBDb21wYXJlRGlhbG9nKGdldFNoZWxsKCksIGlucHV0KTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbXBhcmUgcmVzdWx0IGlzIE9LIHRvIHNob3csIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyZVJlc3VsdE9LKENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlmaW5hbCBTaGVsbCBzaGVsbD0gZ2V0U2hlbGwoKTsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gcnVuIG9wZXJhdGlvbiBpbiBzZXBhcmF0ZSB0aHJlYWQgYW5kIG1ha2UgaXQgY2FuY2VhYmxlCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCB0cnVlLCBpbnB1dCk7Ci0JCQkKLQkJCVN0cmluZyBtZXNzYWdlPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi5jb21wYXJlRmFpbGVkIiksIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAoaW5wdXQuZ2V0Q29tcGFyZVJlc3VsdCgpID09IG51bGwpIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLmRpYWxvZ1RpdGxlIiksIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi5ub0RpZmZlcmVuY2VzIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKLQkJCS8vIGNhbmNlbGxlZCBieSB1c2VyCQkKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB4KSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLmNvbXBhcmVGYWlsZWQiKSwgeC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyoKLQkgKiBSZWdpc3RlcnMgYW4gaW1hZ2UgZm9yIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJJbWFnZShTdHJpbmcgdHlwZSwgSW1hZ2UgaW1hZ2UsIGJvb2xlYW4gZGlzcG9zZSkgewotCQlmZ0ltYWdlcy5wdXQobm9ybWFsaXplQ2FzZSh0eXBlKSwgaW1hZ2UpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBkaXNwb3NlKSB7Ci0JCQlmZ0Rpc3Bvc2VPblNodXRkb3duSW1hZ2VzLmFkZChpbWFnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0eXBlLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckltYWdlRGVzY3JpcHRvcihTdHJpbmcgdHlwZSwgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJZmdJbWFnZURlc2NyaXB0b3JzLnB1dChub3JtYWxpemVDYXNlKHR5cGUpLCBkZXNjcmlwdG9yKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJCi0JCVVSTCBpbnN0YWxsVVJMPSBudWxsOwotCQlpZiAoZmdDb21wYXJlUGx1Z2luICE9IG51bGwpCi0JCQlpbnN0YWxsVVJMPSBmZ0NvbXBhcmVQbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJaWYgKGluc3RhbGxVUkwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsPSBuZXcgVVJMKGluc3RhbGxVUkwsIFV0aWxpdGllcy5nZXRJY29uUGF0aChudWxsKSArIHJlbGF0aXZlUGF0aCk7Ci0JCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhcmVkIGltYWdlIGZvciB0aGUgZ2l2ZW4gdHlwZSwgb3IgYSBnZW5lcmljIGltYWdlIGlmIG5vbmUKLQkgKiBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBJbWFnZXMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGJlIGF1dG9taXRpY2FsbHkgZGlzcG9zZWQKLQkgKiBvZiB3aGVuIHRoaXMgcGx1Zy1pbiBzaHV0cyBkb3duLiBDYWxsZXJzIG11c3Qgbm90IGRpc3Bvc2Ugb2YgdGhlc2UKLQkgKiBpbWFnZXMgdGhlbXNlbHZlcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gdGhlIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgdHlwZSkgewotCQkKLQkJdHlwZT0gbm9ybWFsaXplQ2FzZSh0eXBlKTsKLQkJCi0JCWJvb2xlYW4gZGlzcG9zZT0gZmFsc2U7Ci0JCUltYWdlIGltYWdlPSBudWxsOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJaW1hZ2U9IChJbWFnZSkgZmdJbWFnZXMuZ2V0KHR5cGUpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSAoSW1hZ2VEZXNjcmlwdG9yKSBmZ0ltYWdlRGVzY3JpcHRvcnMuZ2V0KHR5cGUpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlpbWFnZT0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJCQlkaXNwb3NlPSB0cnVlOwotCQkJfQotCQkJCQotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlpZiAoZmdDb21wYXJlUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJaWYgKElUeXBlZEVsZW1lbnQuRk9MREVSX1RZUEUuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQlpbWFnZT0gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOwotCQkJCQkJLy9pbWFnZT0gU2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW1hZ2U9IGNyZWF0ZVdvcmtiZW5jaEltYWdlKHR5cGUpOwotCQkJCQkJZGlzcG9zZT0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlkPSAoSW1hZ2VEZXNjcmlwdG9yKSBmZ0ltYWdlRGVzY3JpcHRvcnMuZ2V0KG5vcm1hbGl6ZUNhc2UoImZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW1hZ2U9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQkJCWRpc3Bvc2U9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJcmVnaXN0ZXJJbWFnZSh0eXBlLCBpbWFnZSwgZGlzcG9zZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhcmVkIGltYWdlIGZvciB0aGUgZ2l2ZW4gYWRhcHRhYmxlLgotCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHF1ZXJpZXMgdGhlIGdpdmVuIGFkYXB0YWJsZQotCSAqIGZvciBpdHMgPGNvZGU+SVdvcmtiZW5jaEFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPiwgd2hpY2ggaXQKLQkgKiB1c2VzIHRvIGNyZWF0ZSBhbiBpbWFnZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgb25lLgotCSAqIDxwPgotCSAqIE5vdGU6IEltYWdlcyByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgYmUgYXV0b21pdGljYWxseSBkaXNwb3NlZAotCSAqIG9mIHdoZW4gdGhpcyBwbHVnLWluIHNodXRzIGRvd24uIENhbGxlcnMgbXVzdCBub3QgZGlzcG9zZSBvZiB0aGVzZQotCSAqIGltYWdlcyB0aGVtc2VsdmVzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGFibGUgdGhlIGFkYXB0YWJsZSBmb3Igd2hpY2ggdG8gZmluZCBhbiBpbWFnZQotCSAqIEByZXR1cm4gYW4gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgYWRhcHRhYmxlKSB7Ci0JCWlmIChhZGFwdGFibGUgIT0gbnVsbCkgewotCQkJT2JqZWN0IG89IGFkYXB0YWJsZS5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIpIHsKLQkJCQlJbWFnZURlc2NyaXB0b3IgaWQ9ICgoSVdvcmtiZW5jaEFkYXB0ZXIpIG8pLmdldEltYWdlRGVzY3JpcHRvcihhZGFwdGFibGUpOwotCQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJCUltYWdlIGltYWdlPSAoSW1hZ2UpZmdJbWFnZXMyLmdldChpZCk7Ci0JCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQlpbWFnZT0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZmdJbWFnZXMyLnB1dChpZCwgaW1hZ2UpOwotCQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBOZWVkV29yawotCQkJCQkJfQotCQkJCQkJZmdEaXNwb3NlT25TaHV0ZG93bkltYWdlcy5hZGQoaW1hZ2UpOwotCi0JCQkJCX0KLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgY3JlYXRlV29ya2JlbmNoSW1hZ2UoU3RyaW5nIHR5cGUpIHsKLQkJSUVkaXRvclJlZ2lzdHJ5IGVyPSBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSBlci5nZXRJbWFnZURlc2NyaXB0b3IoImZvby4iICsgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGlkLmNyZWF0ZUltYWdlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gc3RydWN0dXJlIGNyZWF0b3IgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHR5cGUuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggdG8gZmluZCBhIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICBkZXNjcmlwdG9yIGhhcyBiZWVuIHJlZ2lzdGVyZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3IgZ2V0U3RydWN0dXJlQ3JlYXRvcihTdHJpbmcgdHlwZSkgewotCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQlyZXR1cm4gKFN0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yKSBmU3RydWN0dXJlQ3JlYXRvcnMuc2VhcmNoKHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIHR5cGUuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cmVhbSBtZXJnZXIKLQkgKiBAcmV0dXJuIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICBzdHJlYW0gbWVyZ2VyIGhhcyBiZWVuIHJlZ2lzdGVyZWQKLQkgKi8KLQlwdWJsaWMgSVN0cmVhbU1lcmdlciBjcmVhdGVTdHJlYW1NZXJnZXIoU3RyaW5nIHR5cGUpIHsKLQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJU3RyZWFtTWVyZ2VyRGVzY3JpcHRvciBkZXNjcmlwdG9yPSAoU3RyZWFtTWVyZ2VyRGVzY3JpcHRvcikgZlN0cmVhbU1lcmdlcnMuc2VhcmNoKHR5cGUpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlU3RyZWFtTWVyZ2VyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZS4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGZvciB3aGljaCB0byBmaW5kIGEgc3RyZWFtIG1lcmdlcgotCSAqIEByZXR1cm4gYSBzdHJlYW0gbWVyZ2VyIGZvciB0aGUgZ2l2ZW4gdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiAgIHN0cmVhbSBtZXJnZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZAotCSAqLwotCXB1YmxpYyBJU3RyZWFtTWVyZ2VyIGNyZWF0ZVN0cmVhbU1lcmdlcihJQ29udGVudFR5cGUgdHlwZSkgewotCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQlTdHJlYW1NZXJnZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3I9IChTdHJlYW1NZXJnZXJEZXNjcmlwdG9yKSBmU3RyZWFtTWVyZ2Vycy5zZWFyY2godHlwZSk7Ci0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVTdHJlYW1NZXJnZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmUgY29tcGFyZSB2aWV3ZXIgYmFzZWQgb24gYW4gb2xkIHZpZXdlciBhbmQgYW4gaW5wdXQgb2JqZWN0LgotCSAqIElmIHRoZSBvbGQgdmlld2VyIGlzIHN1aXRhYmxlIGZvciBzaG93aW5nIHRoZSBpbnB1dCwgdGhlIG9sZCB2aWV3ZXIKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQncyB0eXBlIGlzIHVzZWQgdG8gZmluZCBhIHZpZXdlciBkZXNjcmlwdG9yIGluIHRoZSByZWdpc3RyeQotCSAqIHdoaWNoIGluIHR1cm4gaXMgdXNlZCB0byBjcmVhdGUgYSBzdHJ1Y3R1cmUgY29tcGFyZSB2aWV3ZXIgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogSWYgbm8gdmlld2VyIGRlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIG9sZFZpZXdlciBhIG5ldyB2aWV3ZXIgaXMgb25seSBjcmVhdGVkIGlmIHRoaXMgb2xkIHZpZXdlciBjYW5ub3Qgc2hvdyB0aGUgZ2l2ZW4gaW5wdXQKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cnVjdHVyZSB2aWV3ZXIKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgcGFyZW50IGNvbXBvc2l0ZSB1bmRlciB3aGljaCB0aGUgbmV3IHZpZXdlciBpcyBjcmVhdGVkCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHBhc3NlZCB0byBhIG5ld2x5IGNyZWF0ZWQgdmlld2VyCi0JICogQHJldHVybiB0aGUgY29tcGFyZSB2aWV3ZXIgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHRoZSBnaXZlbiBpbnB1dCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGZpbmRTdHJ1Y3R1cmVWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgSUNvbXBhcmVJbnB1dCBpbnB1dCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLQkJaWYgKGlucHV0LmdldExlZnQoKSA9PSBudWxsIHx8IGlucHV0LmdldFJpZ2h0KCkgPT0gbnVsbCkJLy8gd2UgZG9uJ3Qgc2hvdyB0aGUgc3RydWN0dXJlIG9mIGFkZGl0aW9ucyBvciBkZWxldGlvbnMKLQkJCXJldHVybiBudWxsOwotCQkJCQkKLQkJLy8gY29udGVudCB0eXBlIHNlYXJjaAotCQlJQ29udGVudFR5cGUgY3R5cGU9IGdldENvbW1vblR5cGUoZ2V0Q29udGVudFR5cGVzKGlucHV0KSk7Ci0JCWlmIChjdHlwZSAhPSBudWxsKSB7Ci0JCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQkgICAgVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKGZTdHJ1Y3R1cmVNZXJnZVZpZXdlcnMuc2VhcmNoKGN0eXBlKSwgb2xkVmlld2VyLCBwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOwotCQkgICAgaWYgKHZpZXdlciAhPSBudWxsKQotCQkgICAgICAgIHJldHVybiB2aWV3ZXI7Ci0JCX0KLQkJCi0JCS8vIG9sZCBzdHlsZSBzZWFyY2gKLQkJU3RyaW5nW10gdHlwZXM9IGdldFR5cGVzKGlucHV0KTsKLQkJU3RyaW5nIHR5cGU9IG51bGw7Ci0JCWlmIChpc0hvbW9nZW5vdXModHlwZXMpKSB7Ci0JCQl0eXBlPSBub3JtYWxpemVDYXNlKHR5cGVzWzBdKTsKLQkJCWluaXRpYWxpemVSZWdpc3RyaWVzKCk7Ci0JCQlJVmlld2VyRGVzY3JpcHRvciB2ZD0gKElWaWV3ZXJEZXNjcmlwdG9yKSBmU3RydWN0dXJlTWVyZ2VWaWV3ZXJzLnNlYXJjaCh0eXBlKTsKLQkJCWlmICh2ZCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGFsaWFzPSBnZXRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcyh0eXBlKTsKLQkJCQlpZiAoYWxpYXMgIT0gbnVsbCkKLQkJCQkJdmQ9IChJVmlld2VyRGVzY3JpcHRvcikgZlN0cnVjdHVyZU1lcmdlVmlld2Vycy5zZWFyY2goYWxpYXMpOwotCQkJfQotCQkJaWYgKHZkICE9IG51bGwpCi0JCQkJcmV0dXJuIHZkLmNyZWF0ZVZpZXdlcihvbGRWaWV3ZXIsIHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JCX0KLQkJCi0JCS8vIHdlIGRpZG4ndCBmb3VuZCBhbnkgdmlld2VyIHNvIGZhci4KLQkJLy8gbm93IHdlIHRyeSB0byBmaW5kIGEgc3RydWN0dXJlY3JlYXRvciBmb3IgdGhlIGdlbmVyaWMgU3RydWN0dXJlRGlmZlZpZXdlcgotCQkKLQkJU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3Igc2NjPSBudWxsOwotCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQlPYmplY3QgZGVzYz0gZlN0cnVjdHVyZUNyZWF0b3JzLnNlYXJjaChjdHlwZSk7CS8vIHNlYXJjaCBmb3IgY29udGVudCB0eXBlCi0JCWlmIChkZXNjIGluc3RhbmNlb2YgU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3IpCi0JCSAgICBzY2M9IChTdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvcikgZGVzYzsKLQkJaWYgKHNjYyA9PSBudWxsICYmIHR5cGUgIT0gbnVsbCkKLQkJICAgIHNjYz0gZ2V0U3RydWN0dXJlQ3JlYXRvcih0eXBlKTsJLy8gc2VhcmNoIGZvciBvbGQtc3R5bGUgdHlwZSBzY2hlbWUKLQkJaWYgKHNjYyAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlQ3JlYXRvciBzYz0gc2NjLmNyZWF0ZVN0cnVjdHVyZUNyZWF0b3IoKTsKLQkJCWlmIChzYyAhPSBudWxsKSB7Ci0JCQkJU3RydWN0dXJlRGlmZlZpZXdlciBzZHY9IG5ldyBTdHJ1Y3R1cmVEaWZmVmlld2VyKHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JCQkJc2R2LnNldFN0cnVjdHVyZUNyZWF0b3Ioc2MpOwotCQkJCXJldHVybiBzZHY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBjb250ZW50IGNvbXBhcmUgdmlld2VyIGJhc2VkIG9uIGFuIG9sZCB2aWV3ZXIgYW5kIGFuIGlucHV0IG9iamVjdC4KLQkgKiBJZiB0aGUgb2xkIHZpZXdlciBpcyBzdWl0YWJsZSBmb3Igc2hvd2luZyB0aGUgaW5wdXQgdGhlIG9sZCB2aWV3ZXIKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBpbnB1dCdzIHR5cGUgaXMgdXNlZCB0byBmaW5kIGEgdmlld2VyIGRlc2NyaXB0b3IgaW4gdGhlIHJlZ2lzdHJ5Ci0JICogd2hpY2ggaW4gdHVybiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGNvbnRlbnQgY29tcGFyZSB2aWV3ZXIgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogSWYgbm8gdmlld2VyIGRlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIG9sZFZpZXdlciBhIG5ldyB2aWV3ZXIgaXMgb25seSBjcmVhdGVkIGlmIHRoaXMgb2xkIHZpZXdlciBjYW5ub3Qgc2hvdyB0aGUgZ2l2ZW4gaW5wdXQKLQkgKiBAcGFyYW0gaW4gdGhlIGlucHV0IG9iamVjdCBmb3Igd2hpY2ggdG8gZmluZCBhIGNvbnRlbnQgdmlld2VyCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb21wb3NpdGUgdW5kZXIgd2hpY2ggdGhlIG5ldyB2aWV3ZXIgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBjYyBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgcGFzc2VkIHRvIGEgbmV3bHkgY3JlYXRlZCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIHZpZXdlciB3aGljaCBpcyBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIGlucHV0IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZmluZENvbnRlbnRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGluLCBDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBjYykgewotCQkKLQkJaWYgKGluIGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgewotCQkJU3RyaW5nIHR5cGU9IElUeXBlZEVsZW1lbnQuVEVYVF9UWVBFOwotCQkJCi0JCQlpZiAoaW4gaW5zdGFuY2VvZiBJVHlwZWRFbGVtZW50KSB7Ci0JCQkJSVR5cGVkRWxlbWVudCB0aW49IChJVHlwZWRFbGVtZW50KSBpbjsKLQkJCSAgICAJCSAgICAKLQkJCSAgICBJQ29udGVudFR5cGUgY3Q9IGdldENvbnRlbnRUeXBlKHRpbik7Ci0JCQkJaWYgKGN0ICE9IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJCQkJVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKGZDb250ZW50Vmlld2Vycy5zZWFyY2goY3QpLCBvbGRWaWV3ZXIsIHBhcmVudCwgY2MpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdmlld2VyOwotCQkJCX0KLQkJCSAgICAKLQkJCQlTdHJpbmcgdHk9IHRpbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHR5ICE9IG51bGwpCi0JCQkJCXR5cGU9IHR5OwotCQkJfQotCQkJCi0JCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQkJVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKGZDb250ZW50Vmlld2Vycy5zZWFyY2godHlwZSksIG9sZFZpZXdlciwgcGFyZW50LCBjYyk7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJcmV0dXJuIHZpZXdlcjsKLQkJCS8vIGZhbGxiYWNrCi0JCQlyZXR1cm4gbmV3IFNpbXBsZVRleHRWaWV3ZXIocGFyZW50KTsKLQkJfQotCi0JCWlmICghKGluIGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlJQ29tcGFyZUlucHV0IGlucHV0PSAoSUNvbXBhcmVJbnB1dCkgaW47Ci0JCQotCQlJQ29udGVudFR5cGUgY3R5cGU9IGdldENvbW1vblR5cGUoZ2V0Q29udGVudFR5cGVzKGlucHV0KSk7Ci0JCWlmIChjdHlwZSAhPSBudWxsKSB7Ci0JCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQkJVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKGZDb250ZW50TWVyZ2VWaWV3ZXJzLnNlYXJjaChjdHlwZSksIG9sZFZpZXdlciwgcGFyZW50LCBjYyk7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJcmV0dXJuIHZpZXdlcjsKLQkJfQotCQkKLQkJU3RyaW5nW10gdHlwZXM9IGdldFR5cGVzKGlucHV0KTsKLQkJU3RyaW5nIHR5cGU9IG51bGw7Ci0JCWlmIChpc0hvbW9nZW5vdXModHlwZXMpKQotCQkJdHlwZT0gdHlwZXNbMF07Ci0JCQotCQlpZiAoSVR5cGVkRWxlbWVudC5GT0xERVJfVFlQRS5lcXVhbHModHlwZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlpbnQgbj0gMDsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoIUlUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFLmVxdWFscyh0eXBlc1tpXSkpIHsKLQkJCQkJbisrOwotCQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQkJdHlwZT0gdHlwZXNbaV07CS8vIHJlbWVtYmVyIHRoZSBmaXJzdCBrbm93biB0eXBlCi0JCQkJfQotCQkJaWYgKG4gPiAxKQkvLyBkb24ndCB1c2UgdGhlIHR5cGUgaWYgdGhlcmUgd2VyZSBtb3JlIHRoYW4gb25lCi0JCQkJdHlwZT0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJCVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcihmQ29udGVudE1lcmdlVmlld2Vycy5zZWFyY2godHlwZSksIG9sZFZpZXdlciwgcGFyZW50LCBjYyk7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJcmV0dXJuIHZpZXdlcjsKLQkJfQotCi0JCS8vIGZhbGxiYWNrCi0JCVN0cmluZyBsZWZ0VHlwZT0gZ3Vlc3NUeXBlKGlucHV0LmdldExlZnQoKSk7Ci0JCVN0cmluZyByaWdodFR5cGU9IGd1ZXNzVHlwZShpbnB1dC5nZXRSaWdodCgpKTsKLQkJCQotCQlpZiAobGVmdFR5cGUgIT0gbnVsbCB8fCByaWdodFR5cGUgIT0gbnVsbCkgewotCQkJYm9vbGVhbiByaWdodF90ZXh0PSByaWdodFR5cGUgIT0gbnVsbCAmJiBJVHlwZWRFbGVtZW50LlRFWFRfVFlQRS5lcXVhbHMocmlnaHRUeXBlKTsKLQkJCWJvb2xlYW4gbGVmdF90ZXh0PSBsZWZ0VHlwZSAhPSBudWxsICYmIElUeXBlZEVsZW1lbnQuVEVYVF9UWVBFLmVxdWFscyhsZWZ0VHlwZSk7Ci0JCQlpZiAoKGxlZnRUeXBlID09IG51bGwgJiYgcmlnaHRfdGV4dCkgfHwgKGxlZnRfdGV4dCAmJiByaWdodFR5cGUgPT0gbnVsbCkgfHwgKGxlZnRfdGV4dCAmJiByaWdodF90ZXh0KSkKLQkJCQl0eXBlPSBJVHlwZWRFbGVtZW50LlRFWFRfVFlQRTsKLQkJCWVsc2UKLQkJCQl0eXBlPSBCSU5BUllfVFlQRTsKLQkJCQotCQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJCUlWaWV3ZXJEZXNjcmlwdG9yIHZkPSAoSVZpZXdlckRlc2NyaXB0b3IpIGZDb250ZW50TWVyZ2VWaWV3ZXJzLnNlYXJjaCh0eXBlKTsKLQkJCWlmICh2ZCAhPSBudWxsKQotCQkJCXJldHVybiB2ZC5jcmVhdGVWaWV3ZXIob2xkVmlld2VyLCBwYXJlbnQsIGNjKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVmlld2VyIGdldFZpZXdlcihPYmplY3QgZGVzY3JpcHRvciwgVmlld2VyIG9sZFZpZXdlciwgQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MpIHsgICAgCi0JICAgIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgSVZpZXdlckRlc2NyaXB0b3IpCi0JCQlyZXR1cm4gKChJVmlld2VyRGVzY3JpcHRvcilkZXNjcmlwdG9yKS5jcmVhdGVWaWV3ZXIob2xkVmlld2VyLCBwYXJlbnQsIGNjKTsKLQkgICAgcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFR5cGVzKElDb21wYXJlSW5wdXQgaW5wdXQpIHsKLQkJSVR5cGVkRWxlbWVudCBhbmNlc3Rvcj0gaW5wdXQuZ2V0QW5jZXN0b3IoKTsKLQkJSVR5cGVkRWxlbWVudCBsZWZ0PSBpbnB1dC5nZXRMZWZ0KCk7Ci0JCUlUeXBlZEVsZW1lbnQgcmlnaHQ9IGlucHV0LmdldFJpZ2h0KCk7Ci0JCQotCQlBcnJheUxpc3QgdG1wPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJaWYgKGFuY2VzdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlPSBhbmNlc3Rvci5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKQotCQkJICAgIHRtcC5hZGQobm9ybWFsaXplQ2FzZSh0eXBlKSk7Ci0JCX0KLQkJaWYgKGxlZnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGU9IGxlZnQuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCSAgICB0bXAuYWRkKG5vcm1hbGl6ZUNhc2UodHlwZSkpOwotCQl9Ci0JCWlmIChyaWdodCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZT0gcmlnaHQuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCSAgICB0bXAuYWRkKG5vcm1hbGl6ZUNhc2UodHlwZSkpOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHRtcC50b0FycmF5KG5ldyBTdHJpbmdbdG1wLnNpemUoKV0pOwotCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlW10gZ2V0Q29udGVudFR5cGVzKElDb21wYXJlSW5wdXQgaW5wdXQpIHsKLQkJSVR5cGVkRWxlbWVudCBhbmNlc3Rvcj0gaW5wdXQuZ2V0QW5jZXN0b3IoKTsKLQkJSVR5cGVkRWxlbWVudCBsZWZ0PSBpbnB1dC5nZXRMZWZ0KCk7Ci0JCUlUeXBlZEVsZW1lbnQgcmlnaHQ9IGlucHV0LmdldFJpZ2h0KCk7Ci0JCQotCQlBcnJheUxpc3QgdG1wPSBuZXcgQXJyYXlMaXN0KCk7CQkJCQotCSAgICBJQ29udGVudFR5cGUgdHlwZT0gZ2V0Q29udGVudFR5cGUoYW5jZXN0b3IpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkgICAgdG1wLmFkZCh0eXBlKTsKLQkgICAgdHlwZT0gZ2V0Q29udGVudFR5cGUobGVmdCk7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCSAgICB0bXAuYWRkKHR5cGUpOwotCQl0eXBlPSBnZXRDb250ZW50VHlwZShyaWdodCk7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCSAgICB0bXAuYWRkKHR5cGUpOwotCQkKLQkJcmV0dXJuIChJQ29udGVudFR5cGVbXSkgdG1wLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVt0bXAuc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShJVHlwZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICBTdHJpbmcgbmFtZT0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCUlDb250ZW50VHlwZVtdIGFzc29jaWF0ZWQ9IGZnQ29udGVudFR5cGVNYW5hZ2VyLmZpbmRDb250ZW50VHlwZXNGb3IobmFtZSk7Ci0JCWlmIChhc3NvY2lhdGVkLmxlbmd0aCA+IDApCi0JCSAgICByZXR1cm4gYXNzb2NpYXRlZFswXTsKLSAgICAgICAgSUNvbnRlbnRUeXBlIGN0PSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJICAgIElTdHJlYW1Db250ZW50QWNjZXNzb3IgaXNhPSAoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgZWxlbWVudDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXM9IGlzYS5nZXRDb250ZW50cygpOwotICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0JICAgIAkJICAgICAgICBJbnB1dFN0cmVhbSBiaXM9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKTsKLQkgICAgCQkgICAgICAgIHRyeSB7Ci0JICAgIAkJICAgICAgICAgICAgY3Q9IGZnQ29udGVudFR5cGVNYW5hZ2VyLmZpbmRDb250ZW50VHlwZUZvcihpcywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0gICAgICAgICAgICAgICAgICAgIH0KLQkgICAgCQkgICAgICAgIHRyeSB7Ci0JICAgIAkJICAgICAgICAgICAgCWJpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIAkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgIAkJICAgIAkJfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0gICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgcmV0dXJuIGN0OwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZXMgYXJlIGhvbW9nZW5vdXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0hvbW9nZW5vdXMoU3RyaW5nW10gdHlwZXMpIHsKLQkJc3dpdGNoICh0eXBlcy5sZW5ndGgpIHsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgMjoKLQkJCXJldHVybiB0eXBlc1swXS5lcXVhbHModHlwZXNbMV0pOwotCQljYXNlIDM6Ci0JCQlyZXR1cm4gdHlwZXNbMF0uZXF1YWxzKHR5cGVzWzFdKSAmJiB0eXBlc1sxXS5lcXVhbHModHlwZXNbMl0pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBtb3N0IHNwZWNpZmljIGNvbnRlbnQgdHlwZSB0aGF0IGlzIGNvbW1vbiB0byB0aGUgZ2l2ZW4gaW5wdXRzIG9yIG51bGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldENvbW1vblR5cGUoSUNvbnRlbnRUeXBlW10gdHlwZXMpIHsKLQkgICAgU2V0IHM9IG51bGw7Ci0JICAgIEFycmF5TGlzdCBsPSBudWxsOwotCSAgICAJc3dpdGNoICh0eXBlcy5sZW5ndGgpIHsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIHR5cGVzWzBdOwotCQljYXNlIDI6Ci0JCSAgICBsPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgICBzPSB0b1NldChsLCB0eXBlc1swXSk7Ci0JCSAgICBzLnJldGFpbkFsbCh0b1NldChsLCB0eXBlc1sxXSkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJICAgIGw9IG5ldyBBcnJheUxpc3QoKTsKLQkJICAgIHM9IHRvU2V0KGwsIHR5cGVzWzBdKTsKLQkJICAgIHMucmV0YWluQWxsKHRvU2V0KGwsIHR5cGVzWzFdKSk7Ci0JCSAgICBzLnJldGFpbkFsbCh0b1NldChsLCB0eXBlc1syXSkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHMgIT0gbnVsbCAmJiAhcy5pc0VtcHR5KCkpIHsKLQkJICAgIEl0ZXJhdG9yIGl0ZXI9IGwuaXRlcmF0b3IoKTsKLQkJICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkgICAgICAgIElDb250ZW50VHlwZSBjdD0gKElDb250ZW50VHlwZSkgaXRlci5uZXh0KCk7Ci0JCSAgICAgICAgaWYgKHMuY29udGFpbnMoY3QpKQotCQkgICAgICAgICAgICByZXR1cm4gY3Q7Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFNldCB0b1NldChBcnJheUxpc3QgbCwgSUNvbnRlbnRUeXBlIGN0KSB7Ci0JICAgIFNldCBzZXQ9IG5ldyBIYXNoU2V0KCk7Ci0JICAgIGZvciAoOyBjdCAhPSBudWxsOyBjdD0gY3QuZ2V0QmFzZVR5cGUoKSkgewotCSAgICAgICAgbC5hZGQoY3QpOwotCSAgICAgICAgc2V0LmFkZChjdCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHNldDsKLQl9Ci0JCi0JLyoKLQkgKiBHdWVzc2VzIHRoZSBmaWxlIHR5cGUgb2YgdGhlIGdpdmVuIGlucHV0LgotCSAqIFJldHVybnMgSVR5cGVkRWxlbWVudC5URVhUX1RZUEUgaWYgbm9uZSBvZiB0aGUgZmlyc3QgMTAgbGluZXMgaXMgbG9uZ2VyIHRoYW4gMTAwMCBieXRlcy4KLQkgKiBSZXR1cm5zIElUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFIG90aGVyd2lzZS4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBpc24ndCBhbiA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NUeXBlKElUeXBlZEVsZW1lbnQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgewotCQkJSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzY2E9IChJU3RyZWFtQ29udGVudEFjY2Vzc29yKSBpbnB1dDsKLQkJCUlucHV0U3RyZWFtIGlzPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpcz0gc2NhLmdldENvbnRlbnRzKCk7Ci0JCQkJaWYgKGlzID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWludCBsaW5lTGVuZ3RoPSAwOwotCQkJCWludCBsaW5lcz0gMDsKLQkJCQl3aGlsZSAobGluZXMgPCAxMCkgewotCQkJCQlpbnQgYz0gaXMucmVhZCgpOwotCQkJCQlpZiAoYyA9PSAtMSkJLy8gRU9GCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicpIHsgLy8gcmVzZXQgbGluZSBsZW5ndGgKLQkJCQkJCWxpbmVMZW5ndGg9IDA7Ci0JCQkJCQlsaW5lcysrOwotCQkJCQl9IGVsc2UKLQkJCQkJCWxpbmVMZW5ndGgrKzsKLQkJCQkJaWYgKGxpbmVMZW5ndGggPiAxMDAwKQotCQkJCQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFOwotCQkJCX0KLQkJCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5URVhUX1RZUEU7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gYmUgc2lsZW50IGFuZCByZXR1cm4gVU5LTk9XTl9UWVBFCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vIGJlIHNpbGVudCBhbmQgcmV0dXJuIFVOS05PV05fVFlQRQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBJVHlwZWRFbGVtZW50LlVOS05PV05fVFlQRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZUNhc2UoU3RyaW5nIHMpIHsKLQkJaWYgKE5PUk1BTElaRV9DQVNFICYmIHMgIT0gbnVsbCkKLQkJCXJldHVybiBzLnRvVXBwZXJDYXNlKCk7Ci0JCXJldHVybiBzOwotCX0KLQkKLQkvLy0tLS0gYWxpYXMgbWdtdAotCQotCXByaXZhdGUgU3RyaW5nIGdldFN0cnVjdHVyZVZpZXdlckFsaWFzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzKCkuZ2V0KHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cnVjdHVyZVZpZXdlckFsaWFzKFN0cmluZyB0eXBlLCBTdHJpbmcgYWxpYXMpIHsKLQkJZ2V0U3RydWN0dXJlVmlld2VyQWxpYXNlcygpLnB1dChub3JtYWxpemVDYXNlKGFsaWFzKSwgbm9ybWFsaXplQ2FzZSh0eXBlKSk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGdldFN0cnVjdHVyZVZpZXdlckFsaWFzZXMoKSB7Ci0JCWlmIChmU3RydWN0dXJlVmlld2VyQWxpYXNlcyA9PSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlVmlld2VyQWxpYXNlcz0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0JCQlTdHJpbmcgYWxpYXNlcz0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFNUUlVDVFVSRVZJRVdFUl9BTElBU0VTX1BSRUZFUkVOQ0VfTkFNRSk7Ci0JCQlpZiAoYWxpYXNlcyAhPSBudWxsICYmIGFsaWFzZXMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHN0PSBuZXcgU3RyaW5nVG9rZW5pemVyKGFsaWFzZXMsICIgIik7CS8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN0cmluZyBwYWlyPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJaW50IHBvcz0gcGFpci5pbmRleE9mKCcuJyk7Ci0JCQkJCWlmIChwb3MgPiAwKSB7Ci0JCQkJCQlTdHJpbmcga2V5PSBwYWlyLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCQkJU3RyaW5nIGFsaWFzPSBwYWlyLnN1YnN0cmluZyhwb3MrMSk7Ci0JCQkJCQlmU3RydWN0dXJlVmlld2VyQWxpYXNlcy5wdXQoa2V5LCBhbGlhcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzKFN0cmluZyB0eXBlKSB7Ci0JCWlmIChmU3RydWN0dXJlVmlld2VyQWxpYXNlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdD0gbm9ybWFsaXplQ2FzZSh0eXBlKTsKLQkJU2V0IGVudHJ5U2V0PSBmU3RydWN0dXJlVmlld2VyQWxpYXNlcy5lbnRyeVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeT0gKE1hcC5FbnRyeSlpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmVxdWFscyh0KSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ29udmVydHMgdGhlIGFsaWFzZXMgaW50byBhIHNpbmdsZSBzdHJpbmcgYmVmb3JlIHRoZXkgYXJlIHN0b3JlZAotCSAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIFRoZSBmb3JtYXQgaXM6Ci0JICogPGtleT4gJy4nIDxhbGlhcz4gJyAnIDxrZXk+ICcuJyA8YWxpYXM+IC4uLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1lbWJlckFsaWFzZXMoSVByZWZlcmVuY2VTdG9yZSBwcykgewotCQlpZiAoZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJdGVyYXRvciBpdGVyPSBmU3RydWN0dXJlVmlld2VyQWxpYXNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXk9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGFsaWFzPSAoU3RyaW5nKSBmU3RydWN0dXJlVmlld2VyQWxpYXNlcy5nZXQoa2V5KTsKLQkJCWJ1ZmZlci5hcHBlbmQoa2V5KTsKLQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJCWJ1ZmZlci5hcHBlbmQoYWxpYXMpOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQl9Ci0JCXBzLnNldFZhbHVlKFNUUlVDVFVSRVZJRVdFUl9BTElBU0VTX1BSRUZFUkVOQ0VfTkFNRSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vLS0tLSBmaWx0ZXJzCi0JCi0JcHVibGljIGJvb2xlYW4gZmlsdGVyKFN0cmluZyBuYW1lLCBib29sZWFuIGlzRm9sZGVyLCBib29sZWFuIGlzQXJjaGl2ZSkgewotCSAgICBpZiAoZkZpbHRlciA9PSBudWxsKSB7Ci0JCQlmRmlsdGVyPSBuZXcgQ29tcGFyZUZpbHRlcigpOwotCQkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcz0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlmRmlsdGVyLnNldEZpbHRlcnMocHMuZ2V0U3RyaW5nKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5QQVRIX0ZJTFRFUikpOwotCQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChDb21wYXJlUHJlZmVyZW5jZVBhZ2UuUEFUSF9GSUxURVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKQotCQkJCQkJZkZpbHRlci5zZXRGaWx0ZXJzKHBzLmdldFN0cmluZyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuUEFUSF9GSUxURVIpKTsKLQkJCQl9Ci0JCQl9OwotCQkJcHMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGZGaWx0ZXIuZmlsdGVyKG5hbWUsIGlzRm9sZGVyLCBpc0FyY2hpdmUpOwotCX0KLQotCS8vLS0tLSBtb3JlIHV0aWxpdGllcwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGVkaXRvcnMgdGhhdCBoYXZlIGFuIHVuc2F2ZWQgY29udGVudC4gSWYgdGhlIGlkZW50aWNhbCBjb250ZW50IGlzIAotCSAqIHByZXNlbnRlZCBpbiBtb3JlIHRoYW4gb25lIGVkaXRvciwgb25seSBvbmUgb2YgdGhvc2UgZWRpdG9yIHBhcnRzIGlzIHBhcnQgb2YgdGhlIHJlc3VsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBkaXJ0eSBlZGl0b3IgcGFydHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycygpIHsKLQkJU2V0IGlucHV0cz0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoPSBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCQkJSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcz0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgeD0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7Ci0JCQkJSUVkaXRvclBhcnRbXSBlZGl0b3JzPSBwYWdlc1t4XS5nZXREaXJ0eUVkaXRvcnMoKTsKLQkJCQlmb3IgKGludCB6PSAwOyB6IDwgZWRpdG9ycy5sZW5ndGg7IHorKykgewotCQkJCQlJRWRpdG9yUGFydCBlcD0gZWRpdG9yc1t6XTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0PSBlcC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkpIHsKLQkJCQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQkJCQkJcmVzdWx0LmFkZChlcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJRWRpdG9yUGFydFtdKXJlc3VsdC50b0FycmF5KG5ldyBJRWRpdG9yUGFydFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSU5URVJOQUxfRVJST1IsIENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbXBhcmVQbHVnaW4uaW50ZXJuYWxfZXJyb3IiKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QzNTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIENvbXBhcmVXaXRoRWRpdGlvbkFjdGlvbiBleHRlbmRzIEVkaXRpb25BY3Rpb24gewotCQotCXB1YmxpYyBDb21wYXJlV2l0aEVkaXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKGZhbHNlLCAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlV2l0aEVkaXRpb25BY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmZIZWxwQ29udGV4dElkPSBJQ29tcGFyZUNvbnRleHRJZHMuQ09NUEFSRV9XSVRIX0VESVRJT05fRElBTE9HOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlV2l0aEVkaXRpb25BY3Rpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzhhOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlV2l0aEVkaXRpb25BY3Rpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBAKCMpQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLnByb3BlcnRpZXMKLSMKLSMgUmVzb3VyY2VzIGZvciBDb21wYXJlV2l0aEVkaXRpb25BY3Rpb24uamF2YQotCi10aXRsZT0gQ29tcGFyZSB3aXRoIExvY2FsIEhpc3RvcnkKLQotdHJlZVRpdGxlRm9ybWF0PSBMb2NhbCBIaXN0b3J5IG9mICcnezB9JycKLWRhdGVJY29uPSBvYmoxNi9kYXlfb2JqLmdpZgotdGltZUljb249IG9iajE2L3Jlc291cmNlX29iai5naWYKLQotdHJlZUZvcm1hdD0gezB9Ci13b3Jrc3BhY2VUcmVlRm9ybWF0PSB7MH0gKFdvcmtzcGFjZSBGaWxlKQotcGFyc2VFcnJvckZvcm1hdD0gezB9IChQYXJzZSBFcnJvcikKLQotZWRpdGlvbkxhYmVsPSBMb2NhbCBIaXN0b3J5ICh7MH0pCi13b3Jrc3BhY2VFZGl0aW9uTGFiZWw9IFdvcmtzcGFjZSBGaWxlCi0KLXRhcmdldExhYmVsPSBFZGl0b3IgQnVmZmVyCi13b3Jrc3BhY2VUYXJnZXRMYWJlbD0gV29ya3NwYWNlIEZpbGUKLQotdG9kYXlGb3JtYXQ9IFRvZGF5ICh7MH0pCi15ZXN0ZXJkYXlGb3JtYXQ9IFllc3RlcmRheSAoezB9KQotZGF5Rm9ybWF0PSB7MH0KLQotY2xvc2VCdXR0b24ubGFiZWw9Q2xvc2UKLQotbm9Mb2NhbEhpc3RvcnlFcnJvcj0gTm8gbG9jYWwgaGlzdG9yeSBhdmFpbGFibGUgZm9yIHNlbGVjdGVkIHJlc291cmNlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9EaWZmSW1hZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRGlmZkltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTNlODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9EaWZmSW1hZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIENvbWJpbmVzIGFuIGltYWdlIHdpdGggYW4gb3ZlcmxheS4KLSAqLwotcHVibGljIGNsYXNzIERpZmZJbWFnZSBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLQlzdGF0aWMgZmluYWwgaW50IEhFSUdIVD0gMTY7Ci0KLQlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlJbWFnZTsKLQlwcml2YXRlIGludCBmV2lkdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGZMZWZ0PSB0cnVlOwotCi0JcHVibGljIERpZmZJbWFnZShJbWFnZSBiYXNlLCBJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSwgaW50IHcpIHsKLQkJZkJhc2VJbWFnZT0gYmFzZTsKLQkJZk92ZXJsYXlJbWFnZT0gb3ZlcmxheTsKLQkJZldpZHRoPSB3OwotCX0KLQotCXB1YmxpYyBEaWZmSW1hZ2UoSW1hZ2UgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXksIGludCB3LCBib29sZWFuIG9uTGVmdCkgewotCQlmQmFzZUltYWdlPSBiYXNlOwotCQlmT3ZlcmxheUltYWdlPSBvdmVybGF5OwotCQlmV2lkdGg9IHc7Ci0JCWZMZWZ0PSBvbkxlZnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZldpZHRoLCBIRUlHSFQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKGZMZWZ0KSB7Ci0JCQlpZiAoZkJhc2VJbWFnZSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGJhc2U9IGZCYXNlSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCQkJYmFzZT0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJCWRyYXdJbWFnZShiYXNlLCBmV2lkdGggLSBiYXNlLndpZHRoLCAwKTsKLQkJCX0KLQkKLQkJCWlmIChmT3ZlcmxheUltYWdlICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgb3ZlcmxheT0gZk92ZXJsYXlJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJCQlpZiAob3ZlcmxheSA9PSBudWxsKQotCQkJCQlvdmVybGF5PSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0JCQkJZHJhd0ltYWdlKG92ZXJsYXksIDAsIChIRUlHSFQgLSBvdmVybGF5LmhlaWdodCkgLyAyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmQmFzZUltYWdlICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgYmFzZT0gZkJhc2VJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJCQliYXNlPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0JCQkJZHJhd0ltYWdlKGJhc2UsIDAsIDApOwotCQkJfQotCQotCQkJaWYgKGZPdmVybGF5SW1hZ2UgIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBvdmVybGF5PSBmT3ZlcmxheUltYWdlLmdldEltYWdlRGF0YSgpOwotCQkJCWlmIChvdmVybGF5ID09IG51bGwpCi0JCQkJCW92ZXJsYXk9IERFRkFVTFRfSU1BR0VfREFUQTsKLQkJCQlkcmF3SW1hZ2Uob3ZlcmxheSwgZldpZHRoIC0gb3ZlcmxheS53aWR0aCwgKEhFSUdIVCAtIG92ZXJsYXkuaGVpZ2h0KSAvIDIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Eb2NMaW5lQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Eb2NMaW5lQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMwNjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRG9jTGluZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5JVG9rZW5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yOwotCi0vKioKLSAqIEltcGxlbWVudHMgdGhlIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+IGludGVyZmFjZSBmb3IgbGluZXMgaW4gYSBkb2N1bWVudC4KLSAqIEEgPGNvZGU+RG9jTGluZUNvbXBhcmF0b3I8L2NvZGU+IGlzIHVzZWQgYXMgdGhlIGlucHV0IGZvciB0aGUgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlcjwvY29kZT4KLSAqIGVuZ2luZSB0byBwZXJmb3JtIGEgbGluZSBvcmllbnRlZCBjb21wYXJlIG9uIGRvY3VtZW50cy4KLSAqIDxwPgotICogQSA8Y29kZT5Eb2NMaW5lQ29tcGFyYXRvcjwvY29kZT4gZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IGxpbmUgc2VwYXJhdG9ycyBiZWNhdXNlCi0gKiBpdHMgbm90aW9uIG9mIGxpbmVzIGlzIHNvbGVseSBkZWZpbmVkIGluIHRoZSB1bmRlcmx5aW5nIDxjb2RlPklEb2N1bWVudDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2NMaW5lQ29tcGFyYXRvciBpbXBsZW1lbnRzIElUb2tlbkNvbXBhcmF0b3IgewotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZMaW5lT2Zmc2V0OwotCXByaXZhdGUgaW50IGZMaW5lQ291bnQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZVdoaXRlU3BhY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+RG9jTGluZUNvbXBhcmF0b3I8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQgcmFuZ2UuCi0JICogaWdub3JlV2hpdGVTcGFjZSBjb250cm9scyB3aGV0aGVyIGNvbXBhcmluZyBsaW5lcyAoaW4gbWV0aG9kCi0JICogPGNvZGU+cmFuZ2VzRXF1YWw8Y29kZT4pIHNob3VsZCBpZ25vcmUgd2hpdGVzcGFjZS4KLQkgKgotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgZnJvbSB3aGljaCB0aGUgbGluZXMgYXJlIHRha2VuCi0JICogQHBhcmFtIHJlZ2lvbiBpZiBub24tPGNvZGU+bnVsbDwvY29kZT4gb25seSBsaW5lcyB3aXRoaW4gdGhpcyByYW5nZSBhcmUgdGFrZW4KLQkgKiBAcGFyYW0gaWdub3JlV2hpdGVTcGFjZSBpZiA8Y29kZT50cnVlPC9jb2RlPiB3aGl0ZSBzcGFjZSBpcyBpZ25vcmVkIHdoZW4gY29tcGFyaW5nIGxpbmVzCi0JICovCi0JcHVibGljIERvY0xpbmVDb21wYXJhdG9yKElEb2N1bWVudCBkb2N1bWVudCwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gaWdub3JlV2hpdGVTcGFjZSkgewotCi0JCWZEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCWZJZ25vcmVXaGl0ZVNwYWNlPSBpZ25vcmVXaGl0ZVNwYWNlOwotCi0JCWZMaW5lT2Zmc2V0PSAwOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCWZMZW5ndGg9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCWludCBzdGFydD0gcmVnaW9uLmdldE9mZnNldCgpOwotCQkJdHJ5IHsKLQkJCQlmTGluZU9mZnNldD0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQotCQkJaWYgKGZMZW5ndGggPT0gMCkKLQkJCQlmTGluZUNvdW50PSAwOwotCQkJZWxzZSB7Ci0JCQkJaW50IGVuZExpbmU9IGZEb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZW5kTGluZT0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCArIGZMZW5ndGgpOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQkJZkxpbmVDb3VudD0gZW5kTGluZSAtIGZMaW5lT2Zmc2V0ICsgMTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJZkxlbmd0aD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCQlmTGluZUNvdW50PSBmRG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBkb2N1bWVudC4KLQkgKgotCSAqIEByZXR1cm4gbnVtYmVyIG9mIGxpbmVzCi0JICovCi0JcHVibGljIGludCBnZXRSYW5nZUNvdW50KCkgewotCQlyZXR1cm4gZkxpbmVDb3VudDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElUb2tlbkNvbXBhcmF0b3IuZ2V0VG9rZW5TdGFydAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VG9rZW5TdGFydChpbnQgbGluZSkgewotCQl0cnkgewotCQkJSVJlZ2lvbiByPSBmRG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGZMaW5lT2Zmc2V0ICsgbGluZSk7Ci0JCQlyZXR1cm4gci5nZXRPZmZzZXQoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIHNlZSBJVG9rZW5Db21wYXJhdG9yLmdldFRva2VuTGVuZ3RoCi0JICovCi0JcHVibGljIGludCBnZXRUb2tlbkxlbmd0aChpbnQgbGluZSkgewotCQlyZXR1cm4gZ2V0VG9rZW5TdGFydChsaW5lKzEpIC0gZ2V0VG9rZW5TdGFydChsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbGluZSBnaXZlbiBieSB0aGUgZmlyc3QgaW5kZXgKLQkgKiBtYXRjaGVzIGEgbGluZSBzcGVjaWZpZWQgYnkgdGhlIG90aGVyIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+IGFuZCBpbmRleC4KLQkgKgotCSAqIEBwYXJhbSB0aGlzSW5kZXggdGhlIG51bWJlciBvZiB0aGUgbGluZSB3aXRoaW4gdGhpcyByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIG90aGVyQ29tcGFyYXRvciB0aGUgcmFuZ2UgY29tcGFyYXRvciB0byBjb21wYXJlIHRoaXMgd2l0aAotCSAqIEBwYXJhbSBvdGhlckluZGV4IHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgd2l0aGluIHRoZSBvdGhlciBjb21wYXJhdG9yCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZXMgYXJlIGVxdWFsCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmFuZ2VzRXF1YWwoaW50IHRoaXNJbmRleCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlckNvbXBhcmF0b3IsIGludCBvdGhlckluZGV4KSB7Ci0KLQkJaWYgKG90aGVyQ29tcGFyYXRvciAhPSBudWxsICYmIG90aGVyQ29tcGFyYXRvci5nZXRDbGFzcygpID09IGdldENsYXNzKCkpIHsKLQkJCURvY0xpbmVDb21wYXJhdG9yIG90aGVyPSAoRG9jTGluZUNvbXBhcmF0b3IpIG90aGVyQ29tcGFyYXRvcjsKLQotCQkJaWYgKGZJZ25vcmVXaGl0ZVNwYWNlKSB7Ci0JCQkJU3RyaW5nIHMxPSBleHRyYWN0KHRoaXNJbmRleCk7Ci0JCQkJU3RyaW5nIHMyPSBvdGhlci5leHRyYWN0KG90aGVySW5kZXgpOwotCQkJCS8vcmV0dXJuIHMxLnRyaW0oKS5lcXVhbHMoczIudHJpbSgpKTsKLQkJCQlyZXR1cm4gY29tcGFyZShzMSwgczIpOwotCQkJfQotCi0JCQlpbnQgdGxlbj0gZ2V0VG9rZW5MZW5ndGgodGhpc0luZGV4KTsKLQkJCWludCBvbGVuPSBvdGhlci5nZXRUb2tlbkxlbmd0aChvdGhlckluZGV4KTsKLQkJCWlmICh0bGVuID09IG9sZW4pIHsKLQkJCQlTdHJpbmcgczE9IGV4dHJhY3QodGhpc0luZGV4KTsKLQkJCQlTdHJpbmcgczI9IG90aGVyLmV4dHJhY3Qob3RoZXJJbmRleCk7Ci0JCQkJcmV0dXJuIHMxLmVxdWFscyhzMik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFib3J0cyB0aGUgY29tcGFyaXNvbiBpZiB0aGUgbnVtYmVyIG9mIHRva2VucyBpcyB0b28gbGFyZ2UuCi0JICogCi0JICogQHBhcmFtIGxlbmd0aCBhIG51bWJlciBvbiB3aGljaCB0byBiYXNlIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHRvIHJldHVybgotCSAqIAk8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBAcGFyYW0gbWF4TGVuZ3RoIGFub3RoZXIgbnVtYmVyIG9uIHdoaWNoIHRvIGJhc2UgdGhlIGRlY2lzaW9uIHdoZXRoZXIgdG8gcmV0dXJuCi0JICoJPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPiB0byBjb21wYXJlIHdpdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGF2b2lkIGEgdG9vIGxlbmd0aHkgcmFuZ2UgY29tcGFyaXNvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNraXBSYW5nZUNvbXBhcmlzb24oaW50IGxlbmd0aCwgaW50IG1heExlbmd0aCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlcikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQkvLy0tLS0gcHJpdmF0ZSBtZXRob2RzCi0JCi0JLyoqCi0JICogRXh0cmFjdCBhIHNpbmdsZSBsaW5lIGZyb20gdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgd2l0aG91dCB0aGUgbGluZSBzZXBhcmF0b3IuCi0JICoKLQkgKiBAcGFyYW0gbGluZSB0aGUgbnVtYmVyIG9mIHRoZSBsaW5lIHRvIGV4dHJhY3QKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbGluZSBhcyBhIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3QoaW50IGxpbmUpIHsKLQkJaWYgKGxpbmUgPCBmTGluZUNvdW50KSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gcj0gZkRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihmTGluZU9mZnNldCArIGxpbmUpOwotCQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0KHIuZ2V0T2Zmc2V0KCksIHIuZ2V0TGVuZ3RoKCkpOwotCQkJfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlpbnQgbDE9IHMxLmxlbmd0aCgpOwotCQlpbnQgbDI9IHMyLmxlbmd0aCgpOwotCQlpbnQgYzE9IDAsIGMyPSAwOwotCQlpbnQgaTE9IDAsIGkyPSAwOwotCQkKLQkJd2hpbGUgKGMxICE9IC0xKSB7Ci0JCQkKLQkJCWMxPSAtMTsKLQkJCXdoaWxlIChpMSA8IGwxKSB7Ci0JCQkJY2hhciBjPSBzMS5jaGFyQXQoaTErKyk7Ci0JCQkJaWYgKCEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCQljMT0gYzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQljMj0gLTE7Ci0JCQl3aGlsZSAoaTIgPCBsMikgewotCQkJCWNoYXIgYz0gczIuY2hhckF0KGkyKyspOwotCQkJCWlmICghIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQkJYzI9IGM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQkKLQkJCWlmIChjMSAhPSBjMikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0RvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Eb2N1bWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5MWExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0RvY3VtZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0vKioKLSAqIE5vIEFQSSB5ZXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudE1hbmFnZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBmZ0tleXM9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZmdWYWx1ZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBnZXQoT2JqZWN0IG8pIHsKLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmZ0tleXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChmZ0tleXMuZ2V0KGkpID09IG8pCi0JCQkJcmV0dXJuIChJRG9jdW1lbnQpIGZnVmFsdWVzLmdldChpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHB1dChPYmplY3QgbywgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudE1hbmFnZXIucHV0OiAiICsgZG9jdW1lbnQpOwkvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmZ0tleXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChmZ0tleXMuZ2V0KGkpID09IG8pIHsKLQkJCQlmZ1ZhbHVlcy5zZXQoaSwgZG9jdW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmZ0tleXMuYWRkKG8pOwotCQlmZ1ZhbHVlcy5hZGQoZG9jdW1lbnQpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudE1hbmFnZXIucmVtb3ZlOiAiICsgZG9jdW1lbnQpOwkvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpPSAwOyBpIDwgZmdWYWx1ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoZmdWYWx1ZXMuZ2V0KGkpID09IGRvY3VtZW50KSB7Ci0JCQkJCWZnS2V5cy5yZW1vdmUoaSk7Ci0JCQkJCWZnVmFsdWVzLnJlbW92ZShpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudE1hbmFnZXIucmVtb3ZlOiBub3QgZm91bmQiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKCkgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRNYW5hZ2VyOiBtYW5hZ2VkIGRvY3M6IiArIGZnVmFsdWVzLnNpemUoKSk7CS8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0VkaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRWRpdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ0MGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRWRpdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1Db250ZW50QWNjZXNzb3I7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRpb25BY3Rpb24gZXh0ZW5kcyBCYXNlQ29tcGFyZUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRzIHRoZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yIGFuZCBJVHlwZWRFbGVtZW50IHByb3RvY29scwotCSAqIGZvciBhIERvY3VtZW50LgotCSAqLwotCWNsYXNzIERvY3VtZW50QnVmZmVyTm9kZSBpbXBsZW1lbnRzIElUeXBlZEVsZW1lbnQsIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNj0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCQlwcml2YXRlIElGaWxlIGZGaWxlOwotCQkKLQkJRG9jdW1lbnRCdWZmZXJOb2RlKElEb2N1bWVudCBkb2N1bWVudCwgSUZpbGUgZmlsZSkgewotCQkJZkRvY3VtZW50PSBkb2N1bWVudDsKLQkJCWZGaWxlPSBmaWxlOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gZkZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgewotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShVdGlsaXRpZXMuZ2V0Qnl0ZXMoZkRvY3VtZW50LmdldCgpLCBVVEZfMTYpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJCXJldHVybiBVVEZfMTY7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmQnVuZGxlTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZlJlcGxhY2VNb2RlOwotCXByb3RlY3RlZCBib29sZWFuIGZQcmV2aW91cz0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBmSGVscENvbnRleHRJZDsKLQkKLQlFZGl0aW9uQWN0aW9uKGJvb2xlYW4gcmVwbGFjZU1vZGUsIFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCWZSZXBsYWNlTW9kZT0gcmVwbGFjZU1vZGU7Ci0JCWZCdW5kbGVOYW1lPSBidW5kbGVOYW1lOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gVXRpbGl0aWVzLmdldEZpbGVzKHNlbGVjdGlvbikubGVuZ3RoID09IDE7CQkvLyB3ZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIHNlbGVjdGlvbiBmb3Igbm93Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlGaWxlW10gZmlsZXM9IFV0aWxpdGllcy5nZXRGaWxlcyhzZWxlY3Rpb24pOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCQlkb0Zyb21IaXN0b3J5KGZpbGVzW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9Gcm9tSGlzdG9yeShmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCQkJCQkKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZkJ1bmRsZU5hbWUpOwotCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAidGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCVNoZWxsIHBhcmVudFNoZWxsPSBDb21wYXJlVUlQbHVnaW4uZ2V0U2hlbGwoKTsKLQkJCi0JCUlGaWxlU3RhdGUgc3RhdGVzW109IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdGF0ZXM9IGZpbGUuZ2V0SGlzdG9yeShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewkJCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYXJlbnRTaGVsbCwgdGl0bGUsIGV4LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChzdGF0ZXMgPT0gbnVsbCB8fCBzdGF0ZXMubGVuZ3RoIDw9IDApIHsKLQkJCVN0cmluZyBtc2c9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAibm9Mb2NhbEhpc3RvcnlFcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihwYXJlbnRTaGVsbCwgdGl0bGUsIG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlUeXBlZEVsZW1lbnQgYmFzZT0gbmV3IFJlc291cmNlTm9kZShmaWxlKTsKLQkJCi0JCUlEb2N1bWVudCBkb2N1bWVudD0gZ2V0RG9jdW1lbnQoZmlsZSk7Ci0JCUlUeXBlZEVsZW1lbnQgdGFyZ2V0PSBiYXNlOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCXRhcmdldD0gbmV3IERvY3VtZW50QnVmZmVyTm9kZShkb2N1bWVudCwgZmlsZSk7Ci0JCi0JCUlUeXBlZEVsZW1lbnRbXSBlZGl0aW9ucz0gbmV3IElUeXBlZEVsZW1lbnRbc3RhdGVzLmxlbmd0aCsxXTsKLQkJZWRpdGlvbnNbMF09IGJhc2U7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspCi0JCQllZGl0aW9uc1tpKzFdPSBuZXcgSGlzdG9yeUl0ZW0oYmFzZSwgc3RhdGVzW2ldKTsKLQotCQlFZGl0aW9uU2VsZWN0aW9uRGlhbG9nIGQ9IG5ldyBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nKHBhcmVudFNoZWxsLCBidW5kbGUpOwotCQlkLnNldEVkaXRpb25UaXRsZUFyZ3VtZW50KGZpbGUuZ2V0TmFtZSgpKTsKLQkJZC5zZXRFZGl0aW9uVGl0bGVJbWFnZShDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2UoZmlsZSkpOwotCQkvL2Quc2V0SGlkZUlkZW50aWNhbEVudHJpZXMoZmFsc2UpOwotCQlpZiAoZkhlbHBDb250ZXh0SWQgIT0gbnVsbCkKLQkJCWQuc2V0SGVscENvbnRleHRJZChmSGVscENvbnRleHRJZCk7Ci0JCQotCQlpZiAoZlJlcGxhY2VNb2RlKSB7Ci0JCQkKLQkJCUlUeXBlZEVsZW1lbnQgdGk9IG51bGw7Ci0JCQlpZiAoZlByZXZpb3VzKQotCQkJCXRpPSBkLnNlbGVjdFByZXZpb3VzRWRpdGlvbih0YXJnZXQsIGVkaXRpb25zLCBudWxsKTsKLQkJCWVsc2UKLQkJCQl0aT0gZC5zZWxlY3RFZGl0aW9uKHRhcmdldCwgZWRpdGlvbnMsIG51bGwpOwotCQkJCi0JCQlpZiAodGkgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQkJSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzYT0gKElTdHJlYW1Db250ZW50QWNjZXNzb3IpdGk7Ci0JCQkJCi0JCQkJaWYgKFV0aWxpdGllcy52YWxpZGF0ZVJlc291cmNlKGZpbGUsIHBhcmVudFNoZWxsLCB0aXRsZSkpIHsKLQkJCQkJdHJ5IHsKLQkKLQkJCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCQkJCXVwZGF0ZURvY3VtZW50KGRvY3VtZW50LCBzYSk7CQotCQkJCQkJZWxzZQotCQkJCQkJCXVwZGF0ZVdvcmtzcGFjZShidW5kbGUsIHBhcmVudFNoZWxsLCBzYSwgZmlsZSk7Ci0JCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKLQkJCQkJCS8vIERvIG5vdGhpbmcuIE9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCBieSB1c2VyLgotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geCkgewotCQkJCQkJU3RyaW5nIHJlYXNvbj0geC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYXJlbnRTaGVsbCwgdGl0bGUsIFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoYnVuZGxlLCAicmVwbGFjZUVycm9yIiwgcmVhc29uKSk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWQuc2V0Q29tcGFyZU1vZGUodHJ1ZSk7Ci0KLQkJCWQuc2VsZWN0RWRpdGlvbih0YXJnZXQsIGVkaXRpb25zLCBudWxsKTsJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlV29ya3NwYWNlKGZpbmFsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU2hlbGwgc2hlbGwsCi0JCQkJCQlmaW5hbCBJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNhLCBmaW5hbCBJRmlsZSBmaWxlKQotCQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsJCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb249IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgdGFza05hbWU9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAidGFza05hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwbS5iZWdpblRhc2sodGFza05hbWUsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoc2EuZ2V0Q29udGVudHMoKSwgZmFsc2UsIHRydWUsIHBtKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcG0uZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbWRpYWxvZz0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7CQkJCQotCQlwbWRpYWxvZy5ydW4oZmFsc2UsIHRydWUsIG9wZXJhdGlvbik7CQkJCQkJCQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJlYW1Db250ZW50QWNjZXNzb3Igc2EpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXh0PSBVdGlsaXRpZXMucmVhZFN0cmluZyhzYSk7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKDAsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0ZXh0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQlJV29ya2JlbmNoIHdiPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod2IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2JlbmNoV2luZG93W10gd3M9IHdiLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJaWYgKHdzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlGaWxlRWRpdG9ySW5wdXQgdGVzdD0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCB3cy5sZW5ndGg7IGkrKykgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3PSB3c1tpXTsKLQkJCUlXb3JrYmVuY2hQYWdlW10gd3BzPSB3LmdldFBhZ2VzKCk7Ci0JCQlpZiAod3BzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqPSAwOyBqIDwgd3BzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHdwPSB3cHNbal07Ci0JCQkJCUlFZGl0b3JQYXJ0IGVwPSB3cC5maW5kRWRpdG9yKHRlc3QpOwotCQkJCQlpZiAoZXAgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJSVRleHRFZGl0b3IgdGU9IChJVGV4dEVkaXRvcikgZXA7Ci0JCQkJCQlJRG9jdW1lbnRQcm92aWRlciBkcD0gdGUuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJCQkJaWYgKGRwICE9IG51bGwpIHsKLQkJCQkJCQlJRG9jdW1lbnQgZG9jPSBkcC5nZXREb2N1bWVudChlcCk7Ci0JCQkJCQkJaWYgKGRvYyAhPSBudWxsKQotCQkJCQkJCQlyZXR1cm4gZG9jOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjODc0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBleGNlcHRpb24gaGFuZGxlciBzaG93cyBhbiBlcnJvciBkaWFsb2cgd2hlbiBvbmUgb2YgaXRzIGhhbmRsZSBtZXRob2RzCi0gKiBpcyBjYWxsZWQuIElmIHRoZSBwYXNzZWQgZXhjZXB0aW9uIGlzIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gYW4gZXJyb3IgZGlhbG9nCi0gKiBwb3BzIHVwIHNob3dpbmcgdGhlIGV4Y2VwdGlvbidzIHN0YXR1cyBpbmZvcm1hdGlvbi4gRm9yIGEgPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4KLSAqIGEgbm9ybWFsIG1lc3NhZ2UgZGlhbG9nIHBvcHMgdXAgc2hvd2luZyB0aGUgZXhjZXB0aW9uJ3MgbWVzc2FnZS4gQWRkaXRpb25hbGx5IHRoZSBleGNlcHRpb24KLSAqIGlzIHdyaXR0ZW4gdG8gdGhlIHBsYXRmb3JtIGxvZy4KLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRXhjZXB0aW9uSGFuZGxlciBmZ0luc3RhbmNlPSBuZXcgRXhjZXB0aW9uSGFuZGxlcigpOwotCQotCS8qCi0JICogTG9ncyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIGxvZ2dpbmcgbWVjaGFuaXNtLiBUaGUgZXhjZXB0aW9uIGlzCi0JICogbG9nZ2VkIGFzIGFuIGVycm9yIHdpdGggdGhlIGVycm9yIGNvZGUgPGNvZGU+SmF2YVN0YXR1c0NvbnN0YW50cy5JTlRFUk5BTF9FUlJPUjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJQ29tcGFyZVVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvbXBhcmVVSVBsdWdpbi5nZXRQbHVnaW5JZCgpLCAKLQkJCUNvbXBhcmVVSVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSwgdCkpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBnaXZlbiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4gVGhlIHdvcmtiZW5jaCBzaGVsbCBpcyB1c2VkIGFzIGEgcGFyZW50Ci0JICogZm9yIHRoZSBkaWFsb2cgd2luZG93LgotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB0byBiZSBoYW5kbGVkCi0JICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cgd2luZG93J3Mgd2luZG93IHRpdGxlCi0JICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhlIGRpYWxvZyB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlKENvcmVFeGNlcHRpb24gZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQloYW5kbGUoZSwgQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uIAotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB0byBiZSBoYW5kbGVkCi0JICogQHBhcmFtIHBhcmVudCB0aGUgZGlhbG9nIHdpbmRvdydzIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nIHdpbmRvdydzIHdpbmRvdyB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBkaWFsb2cgd2luZG93Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShDb3JlRXhjZXB0aW9uIGUsIFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlmZ0luc3RhbmNlLnBlcmZvcm0oZSwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgdGhlIGdpdmVuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+LiBUaGUgd29ya2JlbmNoIHNoZWxsIGlzIHVzZWQgCi0JICogYXMgYSBwYXJlbnQgZm9yIHRoZSBkaWFsb2cgd2luZG93LgotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiB0byBiZSBoYW5kbGVkCi0JICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cgd2luZG93J3Mgd2luZG93IHRpdGxlCi0JICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhlIGRpYWxvZyB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQloYW5kbGUoZSwgQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgZ2l2ZW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4uIAotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiB0byBiZSBoYW5kbGVkCi0JICogQHBhcmFtIHBhcmVudCB0aGUgZGlhbG9nIHdpbmRvdydzIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nIHdpbmRvdydzIHdpbmRvdyB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBkaWFsb2cgd2luZG93Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUsIFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlmZ0luc3RhbmNlLnBlcmZvcm0oZSwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSk7Ci0JfQotCi0JLy8tLS0tIEhvb2tzIGZvciBzdWJjbGFzc2VzIHRvIGNvbnRyb2wgZXhjZXB0aW9uIGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm0oQ29yZUV4Y2VwdGlvbiBlLCBTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlDb21wYXJlVUlQbHVnaW4ubG9nKGUpOwotCQlJU3RhdHVzIHN0YXR1cz0gZS5nZXRTdGF0dXMoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coZSwgZS5nZXRNZXNzYWdlKCksIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJVGhyb3dhYmxlIHRhcmdldD0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCXBlcmZvcm0oKENvcmVFeGNlcHRpb24pdGFyZ2V0LCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQl9IGVsc2UgewotCQkJQ29tcGFyZVVJUGx1Z2luLmxvZyhlKTsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGUuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkgewotCQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKGUsIGUuZ2V0TWVzc2FnZSgpLCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNwbGF5TWVzc2FnZURpYWxvZyhlLCB0YXJnZXQuZ2V0TWVzc2FnZSgpLCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8tLS0tIEhlbHBlciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlNZXNzYWdlRGlhbG9nKFRocm93YWJsZSB0LCBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nV3JpdGVyIG1zZz0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltc2cud3JpdGUobWVzc2FnZSk7Ci0JCQltc2cud3JpdGUoIlxuXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChleGNlcHRpb25NZXNzYWdlID09IG51bGwgfHwgZXhjZXB0aW9uTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotCQkJbXNnLndyaXRlKENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4Y2VwdGlvbkRpYWxvZy5zZWVFcnJvckxvZ01lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbXNnLndyaXRlKGV4Y2VwdGlvbk1lc3NhZ2UpOwotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZy50b1N0cmluZygpKTsJCQkKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JQ29tcGFyZUNvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSUNvbXBhcmVDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2Y0MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JQ29tcGFyZUNvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlVUk7Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIENvbXBhcmUgVUkuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAqIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBhcmVDb250ZXh0SWRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVg9IENvbXBhcmVVSS5QTFVHSU5fSUQgKyAnLic7Ci0JCi0JLy8gRGlhbG9ncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRJT05fRElBTE9HPSBQUkVGSVggKyAiZWRpdGlvbl9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVfRURJVE9SPSBQUkVGSVggKyAiY29tcGFyZV9lZGl0b3JfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRDSF9JTlBVVF9XSVpBUkRfUEFHRT0gUFJFRklYICsgInBhdGNoX2lucHV0X3dpemFyZF9wYWdlX2NvbnRleHQiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUQ0hfUFJFVklFV19XSVpBUkRfUEFHRT0gUFJFRklYICsgInBhdGNoX3ByZXZpZXdfd2l6YXJkX3BhZ2VfY29udGV4dCI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRlJPTV9ISVNUT1JZX0RJQUxPRz0gUFJFRklYICsgImFkZF9mcm9tX2hpc3RvcnlfZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRV9ESUFMT0c9IFBSRUZJWCArICJjb21wYXJlX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVfV0lUSF9FRElUSU9OX0RJQUxPRz0gUFJFRklYICsgImNvbXBhcmVfd2l0aF9lZGl0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfV0lUSF9FRElUSU9OX0RJQUxPRz0gUFJFRklYICsgInJlcGxhY2Vfd2l0aF9lZGl0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIFZpZXdlcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVSR0VfVklFVz0gUFJFRklYICsgInRleHRfbWVyZ2Vfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0NPTVBBUkVfVklFVz0gUFJFRklYICsgImltYWdlX2NvbXBhcmVfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9DT01QQVJFX1ZJRVc9IFBSRUZJWCArICJiaW5hcnlfY29tcGFyZV92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElGRl9WSUVXPSBQUkVGSVggKyAiZGlmZl92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gQWN0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9ORVhUX0RJRkZfQUNUSU9OPSBQUkVGSVggKyAiZ2xvYmFsX25leHRfZGlmZl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9CQUxfUFJFVklPVVNfRElGRl9BQ1RJT049IFBSRUZJWCArICJnbG9iYWxfcHJldmlvdXNfZGlmZl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVhUX0RJRkZfQUNUSU9OPSBQUkVGSVggKyAibmV4dF9kaWZmX2FjdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJT1VTX0RJRkZfQUNUSU9OPSBQUkVGSVggKyAicHJldmlvdXNfZGlmZl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfV0hJVEVTUEFDRV9BQ1RJT049IFBSRUZJWCArICJpZ25vcmVfd2hpdGVzcGFjZV9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVfUFJFRkVSRU5DRV9QQUdFPSBQUkVGSVggKyAiY29tcGFyZV9wcmVmZXJlbmNlX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSU5hdmlnYXRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lOYXZpZ2F0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzhkMDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSU5hdmlnYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJTmF2aWdhdGFibGUgewotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFWSUdBVE9SX1BST1BFUlRZPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5OYXZpZ2F0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgYXQgZW5kIG9yIGJlZ2lubmluZy4KLQkgKi8KLQlib29sZWFuIGdvdG9EaWZmZXJlbmNlKGJvb2xlYW4gbmV4dCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lPcGVuYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JT3BlbmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1ZWZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lPcGVuYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLS8qCi0gKiBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgSU9wZW5hYmxlIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5BQkxFX1BST1BFUlRZPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5PcGVuYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgc2VsZWN0ZWQgZWxlbWVudAotCSAqLwotCXZvaWQgb3BlblNlbGVjdGVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lSZXNvdXJjZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzg1Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JUmVzb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlUHJvdmlkZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmb3IgdGhpcyBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JSVJlc291cmNlIGdldFJlc291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lTYXZhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lTYXZhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0M2JmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JU2F2YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJU2F2YWJsZSB7Ci0JCi0Jdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JVmlld2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JVmlld2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZlMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSVZpZXdlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIGZhY3Rvcnkgb2JqZWN0IGZvciBjcmVhdGluZyBhIDxjb2RlPlZpZXdlcjwvY29kZT5zIGZyb20gYSBkZXNjcmlwdG9yLgotICogPHA+Ci0gKiBJdCBpcyB1c2VkIHdoZW4gcmVnaXN0ZXJpbmcgYSB2aWV3ZXIgZm9yIGEgc3BlY2lmaWMgdHlwZQotICogaW4gPGNvZGU+Q29tcGFyZVVJUGx1Z2luLnJlZ2lzdGVyQ29udGVudFZpZXdlckRlc2NyaXB0b3I8L2NvZGU+IGFuZAotICogaW4gPGNvZGU+Q29tcGFyZVVJUGx1Z2luLnJlZ2lzdGVyU3RydWN0dXJlVmlld2VyRGVzY3JpcHRvcjwvY29kZT4uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDcmVhdG9yCi0gKiBAc2VlIENvbXBhcmVVSVBsdWdpbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWaWV3ZXJEZXNjcmlwdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdmlld2VyIGZyb20gdGhpcyBkZXNjcmlwdG9yIHVuZGVyIHRoZSBnaXZlbiBTVFcgcGFyZW50IGNvbnRyb2wuCi0JICogSWYgdGhlIGN1cnJlbnQgdmlld2VyIGhhcyB0aGUgc2FtZSB0eXBlIGFzIGEgbmV3IHZpZXdlcgotCSAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBmcmVlIHRvIHJldHVybiB0aGUgY3VycmVudCB2aWV3ZXIgaW5zdGVhZC4KLQkgKgotCSAqIEBwYXJhbSBjdXJyZW50Vmlld2VyIHRoZSBjdXJyZW50IHZpZXdlciB3aGljaCBpcyBnb2luZyB0byBiZSByZXBsYWNlZCB3aXRoIGEgbmV3IHZpZXdlci4KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgcGFyZW50IGNvbnRyb2wgdW5kZXIgd2hpY2ggdGhlIG5ldyB2aWV3ZXIgaGFzIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIGNvbmZpZyBhIGNvbXBhcmUgY29uZmlndXJhdGlvbiB0aGUgbmV3IHZpZXdlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgotCSAqIEByZXR1cm4gYSBuZXcgdmlld2VyIG9yIHRoZSBjdXJyZW50IHZpZXdlci4KLQkgKi8KLQlWaWV3ZXIgY3JlYXRlVmlld2VyKFZpZXdlciBjdXJyZW50Vmlld2VyLCBDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWcpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JZ25vcmVXaGl0ZVNwYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lnbm9yZVdoaXRlU3BhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiN2I0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lnbm9yZVdoaXRlU3BhY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlIDxjb2RlPklDb21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV1M8L2NvZGU+IHByb3BlcnR5IG9mIGFuCi0gKiA8Y29kZT5JQ29tcGFyZUNvbmZpZ3VyYXRpb248L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgSWdub3JlV2hpdGVTcGFjZUFjdGlvbiBleHRlbmRzIENoYW5nZVByb3BlcnR5QWN0aW9uIHsKLQotCXB1YmxpYyBJZ25vcmVXaGl0ZVNwYWNlQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MpIHsKLQkJc3VwZXIoYnVuZGxlLCBjYywgImFjdGlvbi5JZ25vcmVXaGl0ZVNwYWNlLiIsIENvbXBhcmVDb25maWd1cmF0aW9uLklHTk9SRV9XSElURVNQQUNFKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VDYW52YXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkNGRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0ltYWdlQ2FudmFzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEEgPGNvZGU+Q2FudmFzPC9jb2RlPiBzaG93aW5nIGEgc2luZ2xlIGNlbnRlcmVkIFNXVCA8Y29kZT5JbWFnZTwvY29kZT4uCi0gKiBJZiB0aGUgPGNvZGU+SW1hZ2U8L2NvZGU+IGlzIGxhcmdlciB0aGFuIHRoZSA8Y29kZT5DYW52YXM8Y29kZT4sCi0gKiA8Y29kZT5TY3JvbGxiYXJzPC9jb2RlPiB3aWxsIGFwcGVhci4KLSAqLwotY2xhc3MgSW1hZ2VDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCi0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0KLQkvKgotCSAqIENyZWF0ZSBhIG5ldyBJbWFnZUNhbnZhcyB3aXRoIHRoZSBnaXZlbiBTV1Qgc3R5bGViaXRzLgotCSAqIChTV1QuSF9TQ1JPTEwgYW5kIFNXVC5WX1NDUk9MTCBhcmUgYXV0b210aWNhbGx5IGFkZGVkKS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VDYW52YXMoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0JCVNjcm9sbEJhciBzYj0gZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlzYi5zZXRJbmNyZW1lbnQoMjApOwotCQlzYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJcmVwYWludCgpOwotCQkJfQotCQl9KTsKLQotCQlzYj0gZ2V0VmVydGljYWxCYXIoKTsKLQkJc2Iuc2V0SW5jcmVtZW50KDIwKTsKLQkJc2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXJlcGFpbnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXVwZGF0ZVNjcm9sbGJhcnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXBhaW50KGV2ZW50LmdjKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiBTZXQgdGhlIFNXVCBJbWFnZSB0byB1c2UgYXMgdGhlIEltYWdlQ2FudmFzIGNvbnRlbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltZykgewotCQlmSW1hZ2U9IGltZzsKLQotCQlpZiAoIWlzRGlzcG9zZWQoKSkgewotCQkJZ2V0SG9yaXpvbnRhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJCWdldFZlcnRpY2FsQmFyKCkuc2V0U2VsZWN0aW9uKDApOwotCQkJdXBkYXRlU2Nyb2xsYmFycygpOwotCQkJZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCQlyZWRyYXcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGFpbnQoKSB7Ci0JCWlmICghaXNEaXNwb3NlZCgpKSB7Ci0JCQlHQyBnYz0gbmV3IEdDKHRoaXMpOwotCQkJcGFpbnQoZ2MpOwotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBwYWludChHQyBnYykgewotCQlpZiAoZkltYWdlICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHM9IGZJbWFnZS5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhPSBnZXRDbGllbnRBcmVhKCk7Ci0KLQkJCWludCB4OwotCQkJaWYgKGJvdW5kcy53aWR0aCA8IGNsaWVudEFyZWEud2lkdGgpCi0JCQkJeD0gKGNsaWVudEFyZWEud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMjsKLQkJCWVsc2UKLQkJCQl4PSAtZ2V0SG9yaXpvbnRhbEJhcigpLmdldFNlbGVjdGlvbigpOwotCi0JCQlpbnQgeTsKLQkJCWlmIChib3VuZHMuaGVpZ2h0IDwgY2xpZW50QXJlYS5oZWlnaHQpCi0JCQkJeT0gKGNsaWVudEFyZWEuaGVpZ2h0IC0gYm91bmRzLmhlaWdodCkgLyAyOwotCQkJZWxzZQotCQkJCXk9IC1nZXRWZXJ0aWNhbEJhcigpLmdldFNlbGVjdGlvbigpOwotCi0JCQlnYy5kcmF3SW1hZ2UoZkltYWdlLCB4LCB5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwcml2YXRlCi0JICovCi0Jdm9pZCB1cGRhdGVTY3JvbGxiYXJzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzPSBmSW1hZ2UgIT0gbnVsbCA/IGZJbWFnZS5nZXRCb3VuZHMoKSA6IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0JCVBvaW50IHNpemU9IGdldFNpemUoKTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWE9IGdldENsaWVudEFyZWEoKTsKLQotCQlTY3JvbGxCYXIgaG9yaXpvbnRhbD0gZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYm91bmRzLndpZHRoIDw9IGNsaWVudEFyZWEud2lkdGgpIHsKLQkJCWhvcml6b250YWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlob3Jpem9udGFsLnNldFNlbGVjdGlvbigwKTsKLQkJfSBlbHNlIHsKLQkJCWhvcml6b250YWwuc2V0UGFnZUluY3JlbWVudChjbGllbnRBcmVhLndpZHRoIC0gaG9yaXpvbnRhbC5nZXRJbmNyZW1lbnQoKSk7Ci0JCQlpbnQgbWF4PSBib3VuZHMud2lkdGggKyAoc2l6ZS54IC0gY2xpZW50QXJlYS53aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldE1heGltdW0obWF4KTsKLQkJCWhvcml6b250YWwuc2V0VGh1bWIoc2l6ZS54ID4gbWF4ID8gbWF4IDogc2l6ZS54KTsKLQkJCWhvcml6b250YWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JCVNjcm9sbEJhciB2ZXJ0aWNhbD0gZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKGJvdW5kcy5oZWlnaHQgPD0gY2xpZW50QXJlYS5oZWlnaHQpIHsKLQkJCXZlcnRpY2FsLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmVydGljYWwuc2V0U2VsZWN0aW9uKDApOwotCQl9IGVsc2UgewotCQkJdmVydGljYWwuc2V0UGFnZUluY3JlbWVudChjbGllbnRBcmVhLmhlaWdodCAtIHZlcnRpY2FsLmdldEluY3JlbWVudCgpKTsKLQkJCWludCBtYXg9IGJvdW5kcy5oZWlnaHQgKyAoc2l6ZS55IC0gY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJdmVydGljYWwuc2V0TWF4aW11bShtYXgpOwotCQkJdmVydGljYWwuc2V0VGh1bWIoc2l6ZS55ID4gbWF4ID8gbWF4IDogc2l6ZS55KTsKLQkJCXZlcnRpY2FsLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VNZXJnZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjg2ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5Db250ZW50TWVyZ2VWaWV3ZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VNZXJnZVZpZXdlciBleHRlbmRzIENvbnRlbnRNZXJnZVZpZXdlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JbWFnZU1lcmdlVmlld2VyUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwcml2YXRlIE9iamVjdCBmTGVmdEltYWdlOwotCXByaXZhdGUgT2JqZWN0IGZSaWdodEltYWdlOwotCi0JcHJpdmF0ZSBJbWFnZUNhbnZhcyBmQW5jZXN0b3I7Ci0JcHJpdmF0ZSBJbWFnZUNhbnZhcyBmTGVmdDsKLQlwcml2YXRlIEltYWdlQ2FudmFzIGZSaWdodDsKLQkKLQkJCQotCXB1YmxpYyBJbWFnZU1lcmdlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZXMsIENvbXBhcmVDb25maWd1cmF0aW9uIG1wKSB7Ci0JCXN1cGVyKHN0eWxlcywgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKSwgbXApOwotCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIElDb21wYXJlQ29udGV4dElkcy5JTUFHRV9DT01QQVJFX1ZJRVcpOwotCi0JCWJ1aWxkQ29udHJvbChwYXJlbnQpOwotCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoZ2V0UmVzb3VyY2VCdW5kbGUoKSwgInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0Q29udHJvbCgpLnNldERhdGEoQ29tcGFyZVVJLkNPTVBBUkVfVklFV0VSX1RJVExFLCB0aXRsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudChPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCi0JCXNldElucHV0KGZBbmNlc3RvciwgYW5jZXN0b3IpOwotCQkKLQkJZkxlZnRJbWFnZT0gbGVmdDsKLQkJc2V0SW5wdXQoZkxlZnQsIGxlZnQpOwotCQkKLQkJZlJpZ2h0SW1hZ2U9IHJpZ2h0OwotCQlzZXRJbnB1dChmUmlnaHQsIHJpZ2h0KTsKLQl9Ci0JCi0JLyoKLQkgKiBXZSBjYW4ndCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIGVpdGhlciBzaWRlIHdlIGp1c3QgcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRDb250ZW50cyhib29sZWFuIGxlZnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZkFuY2VzdG9yPSBuZXcgSW1hZ2VDYW52YXMoY29tcG9zaXRlLCBTV1QuTk9fRk9DVVMpOwotCQlmTGVmdD0gbmV3IEltYWdlQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PX0ZPQ1VTKTsKLQkJZlJpZ2h0PSBuZXcgSW1hZ2VDYW52YXMoY29tcG9zaXRlLCBTV1QuTk9fRk9DVVMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0SW5wdXQoSW1hZ2VDYW52YXMgY2FudmFzLCBPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGNhbnZhcyAhPSBudWxsKSB7Ci0KLQkJCUlucHV0U3RyZWFtIHN0cmVhbT0gbnVsbDsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCQlJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNjYT0gKElTdHJlYW1Db250ZW50QWNjZXNzb3IpIGlucHV0OwotCQkJCWlmIChzY2EgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtPSBzY2EuZ2V0Q29udGVudHMoKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gTmVlZFdvcmsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJSW1hZ2UgaW1hZ2U9IG51bGw7CQkJCi0JCQlEaXNwbGF5IGRpc3BsYXk9IGNhbnZhcy5nZXREaXNwbGF5KCk7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbWFnZT0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNhbnZhcy5zZXRJbWFnZShpbWFnZSk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCWNhbnZhcy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJfSBlbHNlIHsKLQkJCQljYW52YXMuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJCX0KLQkJCQotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZXNpemVBbmNlc3RvcihpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAod2lkdGggPiAwKSB7Ci0JCQlmQW5jZXN0b3Iuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZBbmNlc3Rvci5zZXRCb3VuZHMoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlmQW5jZXN0b3Iuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZXNpemVMZWZ0UmlnaHQoaW50IHgsIGludCB5LCBpbnQgd2lkdGgxLCBpbnQgY2VudGVyV2lkdGgsIGludCB3aWR0aDIsIGludCBoZWlnaHQpIHsKLQkJZkxlZnQuc2V0Qm91bmRzKHgsIHksIHdpZHRoMSwgaGVpZ2h0KTsKLQkJZlJpZ2h0LnNldEJvdW5kcyh4K3dpZHRoMStjZW50ZXJXaWR0aCwgeSwgd2lkdGgyLCBoZWlnaHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5KGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJaWYgKGxlZnRUb1JpZ2h0KSB7Ci0JCQlmUmlnaHRJbWFnZT0gZkxlZnRJbWFnZTsKLQkJCXNldElucHV0KGZSaWdodCwgZlJpZ2h0SW1hZ2UpOwotCQkJc2V0UmlnaHREaXJ0eSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWZMZWZ0SW1hZ2U9IGZSaWdodEltYWdlOwotCQkJc2V0SW5wdXQoZkxlZnQsIGZMZWZ0SW1hZ2UpOwotCQkJc2V0TGVmdERpcnR5KHRydWUpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0ltYWdlTWVyZ2VWaWV3ZXJDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0ltYWdlTWVyZ2VWaWV3ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOTkxM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBBIGZhY3Rvcnkgb2JqZWN0IGZvciB0aGUgPGNvZGU+SW1hZ2VNZXJnZVZpZXdlcjwvY29kZT4uCi0gKiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9ubHkgb2JqZWN0cyB3aXRoIGEgZGVmYXVsdAotICogY29uc3RydWN0b3IgY2FuIGJlIGNyZWF0ZWQgdmlhIGFuIGV4dGVuc2lvbiBwb2ludAotICogKHRoaXMgcHJlY2x1ZGVzIFZpZXdlcnMpLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VNZXJnZVZpZXdlckNyZWF0b3IgaW1wbGVtZW50cyBJVmlld2VyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBtcCkgewotCQlyZXR1cm4gbmV3IEltYWdlTWVyZ2VWaWV3ZXIocGFyZW50LCBTV1QuTlVMTCwgbXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VNZXJnZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhN2E5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQCgjKUltYWdlTWVyZ2VWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcwotIwotIyBSZXNvdXJjZSBzdHJpbmdzIGZvciBJbWFnZU1lcmdlVmlld2VyLmphdmEKLQotdGl0bGU9IEltYWdlIENvbXBhcmUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQWN0aW9ucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYWN0aW9uLkNvcHlMZWZ0VG9SaWdodC5sYWJlbD0gQ29weSBMZWZ0IHRvIFJpZ2h0Ci1hY3Rpb24uQ29weUxlZnRUb1JpZ2h0LnRvb2x0aXA9IENvcHkgSW1hZ2UgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci1hY3Rpb24uQ29weUxlZnRUb1JpZ2h0LmltYWdlPSBlbGNsMTYvY29weV9yX2NvLmdpZgotCi1hY3Rpb24uQ29weVJpZ2h0VG9MZWZ0LmxhYmVsPSBDb3B5IFJpZ2h0IHRvIExlZnQKLWFjdGlvbi5Db3B5UmlnaHRUb0xlZnQudG9vbHRpcD0gQ29weSBJbWFnZSBmcm9tIFJpZ2h0IHRvIExlZnQKLWFjdGlvbi5Db3B5UmlnaHRUb0xlZnQuaW1hZ2U9IGVsY2wxNi9jb3B5X2xfY28uZ2lmCi0KLWFjdGlvbi5FbmFibGVBbmNlc3Rvci5sYWJlbD0gRW5hYmxlIEFuY2VzdG9yIFBhbmUKLWFjdGlvbi5FbmFibGVBbmNlc3Rvci50b29sdGlwPSBDb250cm9sIFZpc2liaWxpdHkgb2YgQW5jZXN0b3IgUGFuZQotYWN0aW9uLkVuYWJsZUFuY2VzdG9yLmltYWdlPSBlbGNsMTYvYW5jZXN0b3JwYW5lX2NvLmdpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9MaXN0Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NDZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKiogCi0gKiBBIHNwZWNpYWxpemVkIGNvbnRlbnQgcHJvdmlkZXIgdG8gc2hvdyBhIGxpc3Qgb2YgZWRpdG9yIHBhcnRzLgotICovIAotcHVibGljIGNsYXNzIExpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JTGlzdCBmQ29udGVudHM7CQotCi0JcHVibGljIExpc3RDb250ZW50UHJvdmlkZXIoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQlpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0KQotCQkJcmV0dXJuIGZDb250ZW50cy50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBMaXN0KSAKLQkJCWZDb250ZW50cz0gKExpc3QpbmV3SW5wdXQ7Ci0JCWVsc2UKLQkJCWZDb250ZW50cz0gbnVsbDsKLQkJLy8gd2UgdXNlIGEgZml4ZWQgc2V0LgotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmQ29udGVudHMgIT0gbnVsbCAmJiAhZkNvbnRlbnRzLmNvbnRhaW5zKG8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTGlzdERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9MaXN0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzI2ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9MaXN0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgTGlzdERpYWxvZyBleHRlbmRzIFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlcjsKLQlwcml2YXRlIE9iamVjdCBmSW5wdXQ7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZBZGRDYW5jZWxCdXR0b247Ci0JCi0JcHVibGljIExpc3REaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWZBZGRDYW5jZWxCdXR0b249IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlmSW5wdXQ9IGlucHV0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3ApewotCQlmQ29udGVudFByb3ZpZGVyPSBzcDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBscCl7Ci0JCWZMYWJlbFByb3ZpZGVyPSBscDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBZGRDYW5jZWxCdXR0b24oYm9vbGVhbiBhZGRDYW5jZWxCdXR0b24pIHsKLQkJZkFkZENhbmNlbEJ1dHRvbj0gYWRkQ2FuY2VsQnV0dG9uOwotCX0KLQkKLQlwdWJsaWMgVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKXsKLQkJcmV0dXJuIGZUYWJsZVZpZXdlcjsKLQl9Ci0JCQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNGaWx0ZXJzKCl7Ci0JCXJldHVybiBmVGFibGVWaWV3ZXIuZ2V0RmlsdGVycygpICE9IG51bGwgJiYgZlRhYmxlVmlld2VyLmdldEZpbHRlcnMoKS5sZW5ndGggIT0gMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUpOwotCQlzdXBlci5jcmVhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICghIGZBZGRDYW5jZWxCdXR0b24pCi0JCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJZWxzZQotCQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwkKLQl9CQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgcGFyZW50PSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0JCWNyZWF0ZU1lc3NhZ2VBcmVhKHBhcmVudCk7Ci0JCWZUYWJsZVZpZXdlcj0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgZ2V0VGFibGVTdHlsZSgpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihmQ29udGVudFByb3ZpZGVyKTsKLQkJVGFibGUgdGFibGU9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihmTGFiZWxQcm92aWRlcik7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmSW5wdXQpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQ9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTUpOwotCQlnZC53aWR0aEhpbnQ9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1NSk7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQlhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRUYWJsZVN0eWxlKCkgewotCQlyZXR1cm4gU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVNvdXJjZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVNvdXJjZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDU3ODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VTb3VyY2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLS8qKgotICogRXh0ZW5kcyB0aGUgSkZhY2UgU291cmNlVmlld2VyIHdpdGggc29tZSBjb252ZW5pZW5jZSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VTb3VyY2VWaWV3ZXIgZXh0ZW5kcyBTb3VyY2VWaWV3ZXIKLQkJCQkJCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSVRleHRMaXN0ZW5lciwgSU1lbnVMaXN0ZW5lciB7Ci0JCQkJCQkJCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fSUQ9ICJ1bmRvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fSUQ9ICJyZWRvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVVF9JRD0gImN1dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX0lEPSAiY29weSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNURV9JRD0gInBhc3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9JRD0gImRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMX0lEPSAic2VsZWN0QWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSUQ9ICJzYXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JY2xhc3MgVGV4dE9wZXJhdGlvbkFjdGlvbiBleHRlbmRzIE1lcmdlVmlld2VyQWN0aW9uIHsKLQkJCi0JCXByaXZhdGUgaW50IGZPcGVyYXRpb25Db2RlOwotCQkKLQkJVGV4dE9wZXJhdGlvbkFjdGlvbihpbnQgb3BlcmF0aW9uQ29kZSwgYm9vbGVhbiBtdXRhYmxlLCBib29sZWFuIHNlbGVjdGlvbiwgYm9vbGVhbiBjb250ZW50KSB7Ci0JCQlzdXBlcihtdXRhYmxlLCBzZWxlY3Rpb24sIGNvbnRlbnQpOwotCQkJZk9wZXJhdGlvbkNvZGU9IG9wZXJhdGlvbkNvZGU7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGlzRW5hYmxlZCgpKQotCQkJCWRvT3BlcmF0aW9uKGZPcGVyYXRpb25Db2RlKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBmT3BlcmF0aW9uQ29kZSAhPSAtMSAmJiBjYW5Eb09wZXJhdGlvbihmT3BlcmF0aW9uQ29kZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCXRoaXMuc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQlwcml2YXRlIFBvc2l0aW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBib29sZWFuIGZFbmFibGVkPSB0cnVlOwotCXByaXZhdGUgSGFzaE1hcCBmQWN0aW9ucz0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIElEb2N1bWVudCBmUmVtZW1iZXJlZERvY3VtZW50OwotCQotCXByaXZhdGUgYm9vbGVhbiBmQWRkU2F2ZUFjdGlvbj0gdHJ1ZTsKLQkKLQkKLQlwdWJsaWMgTWVyZ2VTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgbnVsbCwgU1dULkhfU0NST0xMICsgU1dULlZfU0NST0xMKTsKLQkJCi0JCWZSZXNvdXJjZUJ1bmRsZT0gYnVuZGxlOwotCQkKLQkJTWVudU1hbmFnZXIgbWVudT0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCW1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJU3R5bGVkVGV4dCB0ZT0gZ2V0VGV4dFdpZGdldCgpOwotCQl0ZS5zZXRNZW51KG1lbnUuY3JlYXRlQ29udGV4dE1lbnUodGUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtZW1iZXJEb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0vLwkJaWYgKGRvYyAhPSBudWxsICYmIGZSZW1lbWJlcmVkRG9jdW1lbnQgIT0gbnVsbCkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk1lcmdlU291cmNlVmlld2VyLnJlbWVtYmVyRG9jdW1lbnQ6IGZSZW1lbWJlcmVkRG9jdW1lbnQgIT0gbnVsbDogc2hvdWxkbid0IGhhcHBlbiIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotCQlmUmVtZW1iZXJlZERvY3VtZW50PSBkb2M7Ci0JfQotCQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0UmVtZW1iZXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlJlbWVtYmVyZWREb2N1bWVudDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGlkZVNhdmVBY3Rpb24oKSB7Ci0JCWZBZGRTYXZlQWN0aW9uPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLQkJU3R5bGVkVGV4dCB0ZT0gZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGUgIT0gbnVsbCkKLQkJCXRlLnNldEZvbnQoZm9udCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgewotCQlTdHlsZWRUZXh0IHRlPSBnZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZSAhPSBudWxsKQotCQkJdGUuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChlbmFibGVkICE9IGZFbmFibGVkKSB7Ci0JCQlmRW5hYmxlZD0gZW5hYmxlZDsKLQkJCVN0eWxlZFRleHQgYz0gZ2V0VGV4dFdpZGdldCgpOwotCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCWMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQlEaXNwbGF5IGQ9IGMuZ2V0RGlzcGxheSgpOwotCQkJCWMuc2V0QmFja2dyb3VuZChlbmFibGVkID8gZC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSA6IG51bGwpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0JCXJldHVybiBmRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb24oUG9zaXRpb24gcmVnaW9uKSB7Ci0JCWZSZWdpb249IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIFBvc2l0aW9uIGdldFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29udHJvbE9rVG9Vc2UoKSB7Ci0JCVN0eWxlZFRleHQgdD0gZ2V0VGV4dFdpZGdldCgpOwotCQlyZXR1cm4gdCAhPSBudWxsICYmICF0LmlzRGlzcG9zZWQoKTsKLQl9Ci0JCQkJCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCWlmIChwb3NpdGlvbiAhPSBudWxsKQotCQkJc2V0U2VsZWN0ZWRSYW5nZShwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMaW5lQmFja2dyb3VuZChQb3NpdGlvbiBwb3NpdGlvbiwgQ29sb3IgYykgewotCQlTdHlsZWRUZXh0IHQ9IGdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHQgIT0gbnVsbCAmJiAhdC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCQkJZ2V0TGluZVJhbmdlKHBvc2l0aW9uLCByZWdpb24pOwotCQkKLQkJCXJlZ2lvbi54LT0gZ2V0RG9jdW1lbnRSZWdpb25PZmZzZXQoKTsKLQkJCi0JCQl0cnkgewotCQkJCXQuc2V0TGluZUJhY2tncm91bmQocmVnaW9uLngsIHJlZ2lvbi55LCBjKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldExpbmVCYWNrZ3JvdW5kKCkgewotCQlTdHlsZWRUZXh0IHQ9IGdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHQgIT0gbnVsbCAmJiAhdC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWludCBsaW5lcz0gZ2V0TGluZUNvdW50KCk7Ci0JCQl0LnNldExpbmVCYWNrZ3JvdW5kKDAsIGxpbmVzLCBudWxsKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgbnVtYmVyIG9mIGxpbmVzIGluIGRvY3VtZW50IHJlZ2lvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJSVJlZ2lvbiByZWdpb249IGdldFZpc2libGVSZWdpb24oKTsKLQotCQlpbnQgbGVuZ3RoPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiAwOwotCQkKLQkJSURvY3VtZW50IGRvYz0gZ2V0RG9jdW1lbnQoKTsKLQkJaW50IHN0YXJ0TGluZT0gMDsKLQkJaW50IGVuZExpbmU9IDA7Ci0KLQkJaW50IHN0YXJ0PSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCXRyeSB7Ci0JCQlzdGFydExpbmU9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQl9IGNhdGNoKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCX0KLQkJdHJ5IHsKLQkJCWVuZExpbmU9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQrbGVuZ3RoKTsKLQkJfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQl9Ci0JCQotCQlyZXR1cm4gZW5kTGluZS1zdGFydExpbmUrMTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWaWV3cG9ydExpbmVzKCkgewotCQlTdHlsZWRUZXh0IHRlPSBnZXRUZXh0V2lkZ2V0KCk7Ci0JCVJlY3RhbmdsZSBjbEFyZWE9IHRlLmdldENsaWVudEFyZWEoKTsKLQkJaWYgKCFjbEFyZWEuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGNsQXJlYS5oZWlnaHQgLyB0ZS5nZXRMaW5lSGVpZ2h0KCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Vmlld3BvcnRIZWlnaHQoKSB7Ci0JCVN0eWxlZFRleHQgdGU9IGdldFRleHRXaWRnZXQoKTsKLQkJUmVjdGFuZ2xlIGNsQXJlYT0gdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQlpZiAoIWNsQXJlYS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gY2xBcmVhLmhlaWdodDsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyBsaW5lcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRSZWdpb25PZmZzZXQoKSB7Ci0JCWludCBzdGFydD0gZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQlJRG9jdW1lbnQgZG9jPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGRvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWZXJ0aWNhbFNjcm9sbE9mZnNldCgpIHsKLQkJU3R5bGVkVGV4dCBzdD0gZ2V0VGV4dFdpZGdldCgpOwotCQlpbnQgbGluZUhlaWdodD0gc3QuZ2V0TGluZUhlaWdodCgpOwotCQlyZXR1cm4gZ2V0VG9wSW5zZXQoKSAtICgoZ2V0RG9jdW1lbnRSZWdpb25PZmZzZXQoKSpsaW5lSGVpZ2h0KSArIHN0LmdldFRvcFBpeGVsKCkpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgc3RhcnQgbGluZSBhbmQgdGhlIG51bWJlciBvZiBsaW5lcyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi4KLQkgKiBTdGFydGluZyBsaW5lIG51bWJlciBpcyAwIGJhc2VkLgotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRMaW5lUmFuZ2UoUG9zaXRpb24gcCwgUG9pbnQgcmVnaW9uKSB7Ci0JCQotCQlJRG9jdW1lbnQgZG9jPSBnZXREb2N1bWVudCgpOwotCQkKLQkJaWYgKHAgPT0gbnVsbCB8fCBkb2MgPT0gbnVsbCkgewotCQkJcmVnaW9uLng9IDA7Ci0JCQlyZWdpb24ueT0gMDsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQkJCi0JCWludCBzdGFydD0gcC5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aD0gcC5nZXRMZW5ndGgoKTsKLQkJCi0JCWludCBzdGFydExpbmU9IDA7Ci0JCXRyeSB7Ci0JCQlzdGFydExpbmU9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCX0KLQkJCi0JCWludCBsaW5lQ291bnQ9IDA7Ci0JCQotCQlpZiAobGVuZ3RoID09IDApIHsKLS8vCQkJLy8gaWYgcmFuZ2UgbGVuZ3RoIGlzIDAgYW5kIGlmIHJhbmdlIHN0YXJ0cyBhIG5ldyBsaW5lCi0vLwkJCXRyeSB7Ci0vLwkJCQlpZiAoc3RhcnQgPT0gZG9jLmdldExpbmVTdGFydE9mZnNldChzdGFydExpbmUpKSB7Ci0vLwkJCQkJbGluZXMtLTsKLS8vCQkJCX0KLS8vCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotLy8JCQkJbGluZXMtLTsKLS8vCQkJfQotCQkJCi0JCX0gZWxzZSB7Ci0JCQlpbnQgZW5kTGluZT0gMDsKLQkJCXRyeSB7Ci0JCQkJZW5kTGluZT0gZG9jLmdldExpbmVPZk9mZnNldChzdGFydCArIGxlbmd0aCAtIDEpOwkvLyB3aHkgLTE/Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQkJbGluZUNvdW50PSBlbmRMaW5lLXN0YXJ0TGluZSsxOwotCQl9Ci0JCQkJCi0JCXJlZ2lvbi54PSBzdGFydExpbmU7Ci0JCXJlZ2lvbi55PSBsaW5lQ291bnQ7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCQotCS8qCi0JICogU2Nyb2xsIFRleHRQYXJ0IHRvIHRoZSBnaXZlbiBsaW5lLgotCSAqLwotCXB1YmxpYyB2b2lkIHZzY3JvbGwoaW50IGxpbmUpIHsKLQotCQlpbnQgc3JjVmlld1NpemU9IGdldExpbmVDb3VudCgpOwotCQlpbnQgc3JjRXh0ZW50U2l6ZT0gZ2V0Vmlld3BvcnRMaW5lcygpOwotCi0JCWlmIChzcmNWaWV3U2l6ZSA+IHNyY0V4dGVudFNpemUpIHsKLQotCQkJaWYgKGxpbmUgPCAwKQotCQkJCWxpbmU9IDA7Ci0KLQkJCWludCBjcD0gZ2V0VG9wSW5kZXgoKTsKLQkJCWlmIChjcCAhPSBsaW5lKQotCQkJCXNldFRvcEluZGV4KGxpbmUgKyBnZXREb2N1bWVudFJlZ2lvbk9mZnNldCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oU3RyaW5nIGFjdGlvbklkLCBNZXJnZVZpZXdlckFjdGlvbiBhY3Rpb24pIHsKLQkJZkFjdGlvbnMucHV0KGFjdGlvbklkLCBhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgTWVyZ2VWaWV3ZXJBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgewotCQlNZXJnZVZpZXdlckFjdGlvbiBhY3Rpb249IChNZXJnZVZpZXdlckFjdGlvbikgZkFjdGlvbnMuZ2V0KGFjdGlvbklkKTsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0JCQlhY3Rpb249IGNyZWF0ZUFjdGlvbihhY3Rpb25JZCk7Ci0JCQlpZiAoYWN0aW9uID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCWlmIChhY3Rpb24uaXNDb250ZW50RGVwZW5kZW50KCkpCi0JCQkJYWRkVGV4dExpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGFjdGlvbi5pc1NlbGVjdGlvbkRlcGVuZGVudCgpKQotCQkJCWFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCQkKLQkJCVV0aWxpdGllcy5pbml0QWN0aW9uKGFjdGlvbiwgZlJlc291cmNlQnVuZGxlLCAiYWN0aW9uLiIgKyBhY3Rpb25JZCArICIuIik7CQkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkFjdGlvbnMucHV0KGFjdGlvbklkLCBhY3Rpb24pOwotCQl9Ci0JCWlmIChhY3Rpb24uaXNFZGl0YWJsZURlcGVuZGVudCgpICYmICFpc0VkaXRhYmxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1lcmdlVmlld2VyQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJaWYgKFVORE9fSUQuZXF1YWxzKGFjdGlvbklkKSkKLQkJCXJldHVybiBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihVTkRPLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWlmIChSRURPX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oUkVETywgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlpZiAoQ1VUX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oQ1VULCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChDT1BZX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oQ09QWSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJaWYgKFBBU1RFX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oUEFTVEUsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCWlmIChERUxFVEVfSUQuZXF1YWxzKGFjdGlvbklkKSkKLQkJCXJldHVybiBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihERUxFVEUsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCWlmIChTRUxFQ1RfQUxMX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU0VMRUNUX0FMTCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJdGVyYXRvciBlPSBmQWN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCU1lcmdlVmlld2VyQWN0aW9uIGFjdGlvbj0gKE1lcmdlVmlld2VyQWN0aW9uKSBlLm5leHQoKTsKLQkJCWlmIChhY3Rpb24uaXNTZWxlY3Rpb25EZXBlbmRlbnQoKSkKLQkJCQlhY3Rpb24udXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCQkJCQotCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRFdmVudCBldmVudCkgewotCQlJdGVyYXRvciBlPSBmQWN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCU1lcmdlVmlld2VyQWN0aW9uIGFjdGlvbj0gKE1lcmdlVmlld2VyQWN0aW9uKSBlLm5leHQoKTsKLQkJCWlmIChhY3Rpb24uaXNDb250ZW50RGVwZW5kZW50KCkpCi0JCQkJYWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQkKLQkvKgotCSAqIEFsbG93cyB0aGUgdmlld2VyIHRvIGFkZCBtZW51cyBhbmQvb3IgdG9vbHMgdG8gdGhlIGNvbnRleHQgbWVudS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInVuZG8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkTWVudShtZW51LCBVTkRPX0lEKTsKLQkJYWRkTWVudShtZW51LCBSRURPX0lEKTsKLQkKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigiY2NwIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZE1lbnUobWVudSwgQ1VUX0lEKTsKLQkJYWRkTWVudShtZW51LCBDT1BZX0lEKTsKLQkJYWRkTWVudShtZW51LCBQQVNURV9JRCk7Ci0JCWFkZE1lbnUobWVudSwgREVMRVRFX0lEKTsKLQkJYWRkTWVudShtZW51LCBTRUxFQ1RfQUxMX0lEKTsKLQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCJlZGl0IikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImZpbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9hZGRNZW51KG1lbnUsIEZJTkRfSUQpOwotCQkKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigic2F2ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZkFkZFNhdmVBY3Rpb24pCi0JCQlhZGRNZW51KG1lbnUsIFNBVkVfSUQpOwotCQkKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigicmVzdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTWVudShJTWVudU1hbmFnZXIgbWVudSwgU3RyaW5nIGFjdGlvbklkKSB7Ci0JCUlBY3Rpb24gYWN0aW9uPSBnZXRBY3Rpb24oYWN0aW9uSWQpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQltZW51LmFkZChhY3Rpb24pOwotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZSgpIHsKLQkJCi0JCXJlbW92ZVRleHRMaXN0ZW5lcih0aGlzKTsKLQkJcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkKLQkJc3VwZXIuaGFuZGxlRGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VWaWV3ZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VWaWV3ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1Njc2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL01lcmdlVmlld2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXJnZVZpZXdlckFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCQotCXByaXZhdGUgYm9vbGVhbiBmTXV0YWJsZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNlbGVjdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gZkNvbnRlbnQ7Ci0JCi0JcHVibGljIE1lcmdlVmlld2VyQWN0aW9uKGJvb2xlYW4gbXV0YWJsZSwgYm9vbGVhbiBzZWxlY3Rpb24sIGJvb2xlYW4gY29udGVudCkgewotCQlmTXV0YWJsZT0gbXV0YWJsZTsKLQkJZlNlbGVjdGlvbj0gc2VsZWN0aW9uOwotCQlmQ29udGVudD0gY29udGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGlvbkRlcGVuZGVudCgpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29udGVudERlcGVuZGVudCgpIHsKLQkJcmV0dXJuIGZDb250ZW50OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlRGVwZW5kZW50KCkgewotCQlyZXR1cm4gZk11dGFibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhNjlmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL01lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIEFkYXB0cyBhbnkgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiB0byB3b3JrIG9uIGFuIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+Ci0gKiBlLmcuIGEgPGNvZGU+RGlmZk5vZGU8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgewotCQotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCXByaXZhdGUgU3RyaW5nIGZBbmNlc3RvckVycm9yOwotCXByaXZhdGUgU3RyaW5nIGZMZWZ0RXJyb3I7Ci0JcHJpdmF0ZSBTdHJpbmcgZlJpZ2h0RXJyb3I7Ci0JCQotCXB1YmxpYyBNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcihDb21wYXJlQ29uZmlndXJhdGlvbiBjYykgewotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb249IGNjOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0JCXJldHVybiBmQW5jZXN0b3JFcnJvciAhPSBudWxsIHx8IGZMZWZ0RXJyb3IgIT0gbnVsbCB8fCBmUmlnaHRFcnJvciAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdiwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJLy8gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIHNpbmNlIHdlIGhhdmUgbm8gc3RhdGUKLQl9Ci0JCi0JLy8tLS0tIGFuY2VzdG9yCi0JCQkKLQlwdWJsaWMgdm9pZCBzZXRBbmNlc3RvckVycm9yKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJZkFuY2VzdG9yRXJyb3I9IGVycm9yTWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbmNlc3RvckxhYmVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChmQW5jZXN0b3JFcnJvciAhPSBudWxsKQotCQkJcmV0dXJuIGZBbmNlc3RvckVycm9yOwotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldEFuY2VzdG9yTGFiZWwoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRBbmNlc3RvckltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChmQW5jZXN0b3JFcnJvciAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZ2V0QW5jZXN0b3JJbWFnZShlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBbmNlc3RvckNvbnRlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJcmV0dXJuICgoSUNvbXBhcmVJbnB1dCkgZWxlbWVudCkuZ2V0QW5jZXN0b3IoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dBbmNlc3RvcihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gZml4IGZvciAjNDUyMzk6IFNob3cgYW5jZXN0b3IgZm9yIGluY29taW5nIGFuZCBvdXRnb2luZyBjaGFuZ2VzCi0JCQkvL3JldHVybiAoKChJQ29tcGFyZUlucHV0KWVsZW1lbnQpLmdldEtpbmQoKSAmIERpZmZlcmVuY2VyLkRJUkVDVElPTl9NQVNLKSA9PSBEaWZmZXJlbmNlci5DT05GTElDVElORzsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vLS0tLSBsZWZ0Ci0JCQkJCQotCXB1YmxpYyB2b2lkIHNldExlZnRFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWZMZWZ0RXJyb3I9IGVycm9yTWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMZWZ0TGFiZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMZWZ0RXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBmTGVmdEVycm9yOwotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldExlZnRMYWJlbChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldExlZnRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkxlZnRFcnJvciAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZ2V0TGVmdEltYWdlKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldExlZnRDb250ZW50KE9iamVjdCBlbGVtZW50KSB7CQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQlyZXR1cm4gKChJQ29tcGFyZUlucHV0KSBlbGVtZW50KS5nZXRMZWZ0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNMZWZ0RWRpdGFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGhhc0Vycm9yKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJT2JqZWN0IGxlZnQ9ICgoSUNvbXBhcmVJbnB1dCkgZWxlbWVudCkuZ2V0TGVmdCgpOwotCQkJaWYgKGxlZnQgPT0gbnVsbCkgewotCQkJCUlEaWZmRWxlbWVudCBwYXJlbnQ9ICgoSURpZmZFbGVtZW50KWVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCQlsZWZ0PSAoKElDb21wYXJlSW5wdXQpIHBhcmVudCkuZ2V0TGVmdCgpOwotCQkJfQotCQkJaWYgKGxlZnQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50KQotCQkJCXJldHVybiAoKElFZGl0YWJsZUNvbnRlbnQpbGVmdCkuaXNFZGl0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlTGVmdENvbnRlbnQoT2JqZWN0IGVsZW1lbnQsIGJ5dGVbXSBieXRlcykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCUlDb21wYXJlSW5wdXQgbm9kZT0gKElDb21wYXJlSW5wdXQpIGVsZW1lbnQ7Ci0JCQlpZiAoYnl0ZXMgIT0gbnVsbCkgewotCQkJCUlUeXBlZEVsZW1lbnQgbGVmdD0gbm9kZS5nZXRMZWZ0KCk7Ci0JCQkJLy8gIzk4Njk6IHByb2JsZW0gaWYgbGVmdCBpcyBudWxsIChiZWNhdXNlIG5vIHJlc291cmNlIGV4aXN0cyB5ZXQpIG5vdGhpbmcgaXMgZG9uZSEKLQkJCQlpZiAobGVmdCA9PSBudWxsKSB7Ci0JCQkJCW5vZGUuY29weShmYWxzZSk7Ci0JCQkJCWxlZnQ9IG5vZGUuZ2V0TGVmdCgpOwotCQkJCX0KLQkJCQlpZiAobGVmdCBpbnN0YW5jZW9mIElFZGl0YWJsZUNvbnRlbnQpCi0JCQkJCSgoSUVkaXRhYmxlQ29udGVudClsZWZ0KS5zZXRDb250ZW50KGJ5dGVzKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJlc291cmNlQ29tcGFyZUlucHV0Lk15RGlmZk5vZGUpCi0JCQkJCSgoUmVzb3VyY2VDb21wYXJlSW5wdXQuTXlEaWZmTm9kZSlub2RlKS5maXJlQ2hhbmdlKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5vZGUuY29weShmYWxzZSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLy8tLS0tIHJpZ2h0Ci0JCi0JcHVibGljIHZvaWQgc2V0UmlnaHRFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWZSaWdodEVycm9yPSBlcnJvck1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmlnaHRMYWJlbChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZlJpZ2h0RXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBmUmlnaHRFcnJvcjsKLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbi5nZXRSaWdodExhYmVsKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0UmlnaHRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZlJpZ2h0RXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldFJpZ2h0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UmlnaHRDb250ZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCXJldHVybiAoKElDb21wYXJlSW5wdXQpIGVsZW1lbnQpLmdldFJpZ2h0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JpZ2h0RWRpdGFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGhhc0Vycm9yKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJT2JqZWN0IHJpZ2h0PSAoKElDb21wYXJlSW5wdXQpIGVsZW1lbnQpLmdldFJpZ2h0KCk7Ci0JCQlpZiAocmlnaHQgPT0gbnVsbCkgewotCQkJCUlEaWZmQ29udGFpbmVyIHBhcmVudD0gKChJRGlmZkVsZW1lbnQpZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCXJpZ2h0PSAoKElDb21wYXJlSW5wdXQpIHBhcmVudCkuZ2V0UmlnaHQoKTsKLQkJCX0KLQkJCWlmIChyaWdodCBpbnN0YW5jZW9mIElFZGl0YWJsZUNvbnRlbnQpCi0JCQkJcmV0dXJuICgoSUVkaXRhYmxlQ29udGVudClyaWdodCkuaXNFZGl0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZVJpZ2h0Q29udGVudChPYmplY3QgZWxlbWVudCwgYnl0ZVtdIGJ5dGVzKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJSUNvbXBhcmVJbnB1dCBub2RlPSAoSUNvbXBhcmVJbnB1dCkgZWxlbWVudDsKLQkJCWlmIChieXRlcyAhPSBudWxsKSB7Ci0JCQkJSVR5cGVkRWxlbWVudCByaWdodD0gbm9kZS5nZXRSaWdodCgpOwotCQkJCS8vICM5ODY5OiBwcm9ibGVtIGlmIHJpZ2h0IGlzIG51bGwgKGJlY2F1c2Ugbm8gcmVzb3VyY2UgZXhpc3RzIHlldCkgbm90aGluZyBpcyBkb25lIQotCQkJCWlmIChyaWdodCA9PSBudWxsKSB7Ci0JCQkJCW5vZGUuY29weSh0cnVlKTsKLQkJCQkJcmlnaHQ9IG5vZGUuZ2V0UmlnaHQoKTsKLQkJCQl9Ci0JCQkJaWYgKHJpZ2h0IGluc3RhbmNlb2YgSUVkaXRhYmxlQ29udGVudCkKLQkJCQkJKChJRWRpdGFibGVDb250ZW50KXJpZ2h0KS5zZXRDb250ZW50KGJ5dGVzKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJlc291cmNlQ29tcGFyZUlucHV0Lk15RGlmZk5vZGUpCi0JCQkJCSgoUmVzb3VyY2VDb21wYXJlSW5wdXQuTXlEaWZmTm9kZSlub2RlKS5maXJlQ2hhbmdlKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5vZGUuY29weSh0cnVlKTsKLQkJCX0JCQotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL051bGxWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTnVsbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTlmNWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTnVsbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVWaWV3ZXJQYW5lOwotCi0vKioKLSAqIFVzZWQgd2hlbmV2ZXIgdGhlIGlucHV0IGlzIG51bGwgb3Igbm8gdmlld2VyIGNhbiBiZSBmb3VuZC4KLSAqLwotcHVibGljIGNsYXNzIE51bGxWaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdFZpZXdlciB7Ci0KLQlwcml2YXRlIENvbnRyb2wgZkR1bW15OwotCi0JcHVibGljIE51bGxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWZEdW1teT0gbmV3IFRyZWUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJQ29tcGFyZVZpZXdlclBhbmUuY2xlYXJUb29sQmFyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZEdW1teTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTFmOTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEFuIG92ZXJsYXlpbmcgcHJlZmVyZW5jZSBzdG9yZS4KLSAqLwotcHVibGljIGNsYXNzIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgIGltcGxlbWVudHMgSVByZWZlcmVuY2VTdG9yZSB7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUeXBlRGVzY3JpcHRvciB7Ci0JCXByaXZhdGUgVHlwZURlc2NyaXB0b3IoKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBCT09MRUFOPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIERPVUJMRT0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBGTE9BVD0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBJTlQ9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgTE9ORz0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBTVFJJTkc9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheUtleSB7Ci0JCQotCQlUeXBlRGVzY3JpcHRvciBmRGVzY3JpcHRvcjsKLQkJU3RyaW5nIGZLZXk7Ci0JCQotCQlwdWJsaWMgT3ZlcmxheUtleShUeXBlRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTdHJpbmcga2V5KSB7Ci0JCQlmRGVzY3JpcHRvcj0gZGVzY3JpcHRvcjsKLQkJCWZLZXk9IGtleTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5TGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCQkJCi0JCS8qCi0JCSAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCU92ZXJsYXlLZXkga2V5PSBmaW5kT3ZlcmxheUtleShldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCWlmIChrZXkgIT0gbnVsbCkKLQkJCQlwcm9wYWdhdGVQcm9wZXJ0eShmUGFyZW50LCBrZXksIGZTdG9yZSk7IAotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUGFyZW50OwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBPdmVybGF5S2V5W10gZk92ZXJsYXlLZXlzOwotCQotCXByaXZhdGUgUHJvcGVydHlMaXN0ZW5lciBmUHJvcGVydHlMaXN0ZW5lcjsKLQkKLQkKLQlwdWJsaWMgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHBhcmVudCwgT3ZlcmxheUtleVtdIG92ZXJsYXlLZXlzKSB7Ci0JCWZQYXJlbnQ9IHBhcmVudDsKLQkJZk92ZXJsYXlLZXlzPSBvdmVybGF5S2V5czsKLQkJZlN0b3JlPSBuZXcgUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByaXZhdGUgT3ZlcmxheUtleSBmaW5kT3ZlcmxheUtleShTdHJpbmcga2V5KSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmT3ZlcmxheUtleXNbaV0uZktleS5lcXVhbHMoa2V5KSkKLQkJCQlyZXR1cm4gZk92ZXJsYXlLZXlzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY292ZXJzKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChmaW5kT3ZlcmxheUtleShrZXkpICE9IG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0KSB7Ci0JCQotCQlpZiAob3JnaW4uaXNEZWZhdWx0KGtleS5mS2V5KSkgewotCQkJaWYgKCF0YXJnZXQuaXNEZWZhdWx0KGtleS5mS2V5KSkKLQkJCQl0YXJnZXQuc2V0VG9EZWZhdWx0KGtleS5mS2V5KTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJVHlwZURlc2NyaXB0b3IgZD0ga2V5LmZEZXNjcmlwdG9yOwotCQlpZiAoQk9PTEVBTiA9PSBkKSB7Ci0JCQkKLQkJCWJvb2xlYW4gb3JpZ2luVmFsdWU9IG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpOwotCQkJYm9vbGVhbiB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldEJvb2xlYW4oa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCQkJCQotCQl9IGVsc2UgaWYgKERPVUJMRSA9PSBkKSB7Ci0JCQkKLQkJCWRvdWJsZSBvcmlnaW5WYWx1ZT0gb3JnaW4uZ2V0RG91YmxlKGtleS5mS2V5KTsKLQkJCWRvdWJsZSB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldERvdWJsZShrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0JCQotCQl9IGVsc2UgaWYgKEZMT0FUID09IGQpIHsKLQkJCQotCQkJZmxvYXQgb3JpZ2luVmFsdWU9IG9yZ2luLmdldEZsb2F0KGtleS5mS2V5KTsKLQkJCWZsb2F0IHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0RmxvYXQoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCQkJCQotCQl9IGVsc2UgaWYgKElOVCA9PSBkKSB7Ci0KLQkJCWludCBvcmlnaW5WYWx1ZT0gb3JnaW4uZ2V0SW50KGtleS5mS2V5KTsKLQkJCWludCB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldEludChrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChMT05HID09IGQpIHsKLQotCQkJbG9uZyBvcmlnaW5WYWx1ZT0gb3JnaW4uZ2V0TG9uZyhrZXkuZktleSk7Ci0JCQlsb25nIHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0TG9uZyhrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChTVFJJTkcgPT0gZCkgewotCi0JCQlTdHJpbmcgb3JpZ2luVmFsdWU9IG9yZ2luLmdldFN0cmluZyhrZXkuZktleSk7Ci0JCQlTdHJpbmcgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRTdHJpbmcoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG51bGwgJiYgb3JpZ2luVmFsdWUgIT0gbnVsbCAmJiAhdGFyZ2V0VmFsdWUuZXF1YWxzKG9yaWdpblZhbHVlKSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BhZ2F0ZSgpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZPdmVybGF5S2V5cy5sZW5ndGg7IGkrKykKLQkJCXByb3BhZ2F0ZVByb3BlcnR5KGZTdG9yZSwgZk92ZXJsYXlLZXlzW2ldLCBmUGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcm9wZXJ0eShJUHJlZmVyZW5jZVN0b3JlIG9yZ2luLCBPdmVybGF5S2V5IGtleSwgSVByZWZlcmVuY2VTdG9yZSB0YXJnZXQsIGJvb2xlYW4gZm9yY2VJbml0aWFsaXphdGlvbikgewotCQlUeXBlRGVzY3JpcHRvciBkPSBrZXkuZkRlc2NyaXB0b3I7Ci0JCWlmIChCT09MRUFOID09IGQpIHsKLQkJCQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCB0cnVlKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0Qm9vbGVhbihrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRCb29sZWFuKGtleS5mS2V5KSk7Ci0JCQkKLQkJfSBlbHNlIGlmIChET1VCTEUgPT0gZCkgewotCQkJCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDEuMEQpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXREb3VibGUoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0RG91YmxlKGtleS5mS2V5KSk7Ci0JCQkKLQkJfSBlbHNlIGlmIChGTE9BVCA9PSBkKSB7Ci0JCQkKLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMS4wRik7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEZsb2F0KGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEZsb2F0KGtleS5mS2V5KSk7Ci0JCQkKLQkJfSBlbHNlIGlmIChJTlQgPT0gZCkgewotCQkJCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDEpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRJbnQoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0SW50KGtleS5mS2V5KSk7Ci0JCQkKLQkJfSBlbHNlIGlmIChMT05HID09IGQpIHsKLQkJCQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxTCk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldExvbmcoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0TG9uZyhrZXkuZktleSkpOwotCQkJCi0JCX0gZWxzZSBpZiAoU1RSSU5HID09IGQpIHsKLQkJCQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAiMSIpOwkvLyROT04tTkxTLTEkCi0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldFN0cmluZyhrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRTdHJpbmcoa2V5LmZLZXkpKTsKLQkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlsb2FkUHJvcGVydHkoZlBhcmVudCwgZk92ZXJsYXlLZXlzW2ldLCBmU3RvcmUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2FkRGVmYXVsdHMoKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlzZXRUb0RlZmF1bHQoZk92ZXJsYXlLZXlzW2ldLmZLZXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyPSBuZXcgUHJvcGVydHlMaXN0ZW5lcigpOwotCQkJZlBhcmVudC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlpZiAoZlByb3BlcnR5TGlzdGVuZXIgIT0gbnVsbCkgIHsKLQkJCWZQYXJlbnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lcj0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlmU3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNjb250YWlucyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5jb250YWlucyhuYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldEJvb2xlYW4obmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdEJvb2xlYW4obmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcpCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXREZWZhdWx0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdERvdWJsZShuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0RmxvYXQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXREZWZhdWx0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0RmxvYXQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdEludChTdHJpbmcpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdEludChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0TG9uZyhTdHJpbmcpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdExvbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0TG9uZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0U3RyaW5nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0U3RyaW5nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERvdWJsZShTdHJpbmcpCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREb3VibGUobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RmxvYXQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRGbG9hdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldEZsb2F0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEludChTdHJpbmcpCi0JICovCi0JcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRJbnQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0TG9uZyhTdHJpbmcpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldExvbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0U3RyaW5nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldFN0cmluZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNpc0RlZmF1bHQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmlzRGVmYXVsdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNuZWVkc1NhdmluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKSB7Ci0JCXJldHVybiBmU3RvcmUubmVlZHNTYXZpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNwdXRWYWx1ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUucHV0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VG9EZWZhdWx0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJZlN0b3JlLnNldFRvRGVmYXVsdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTc5NzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uIGV4dGVuZHMgRWRpdGlvbkFjdGlvbiB7Ci0JCQotCXB1YmxpYyBSZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKHRydWUsICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWZIZWxwQ29udGV4dElkPSBJQ29tcGFyZUNvbnRleHRJZHMuUkVQTEFDRV9XSVRIX0VESVRJT05fRElBTE9HOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRlN2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQCgjKVJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5wcm9wZXJ0aWVzCi0jCi0jIFJlc291cmNlcyBmb3IgUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uLmphdmEKLQotdGl0bGU9IFJlcGxhY2UgZnJvbSBMb2NhbCBIaXN0b3J5Ci0KLXRyZWVUaXRsZUZvcm1hdD0gTG9jYWwgSGlzdG9yeSBvZiAnJ3swfScnCi1kYXRlSWNvbj0gb2JqMTYvZGF5X29iai5naWYKLXRpbWVJY29uPSBvYmoxNi9yZXNvdXJjZV9vYmouZ2lmCi0KLXRyZWVGb3JtYXQ9IHswfQotd29ya3NwYWNlVHJlZUZvcm1hdD0gezB9IChXb3Jrc3BhY2UgRmlsZSkKLXBhcnNlRXJyb3JGb3JtYXQ9IHswfSAoUGFyc2UgRXJyb3IpCi0KLWVkaXRpb25MYWJlbD0gTG9jYWwgSGlzdG9yeSAoezB9KQotd29ya3NwYWNlRWRpdGlvbkxhYmVsPSBXb3Jrc3BhY2UgRmlsZQotCi10YXJnZXRMYWJlbD0gezB9Ci0KLXRvZGF5Rm9ybWF0PSBUb2RheSAoezB9KQoteWVzdGVyZGF5Rm9ybWF0PSBZZXN0ZXJkYXkgKHswfSkKLWRheUZvcm1hdD0gezB9Ci0KLWJ1dHRvbkxhYmVsPSBSZXBsYWNlCi0KLW5vTG9jYWxIaXN0b3J5RXJyb3I9IE5vIGxvY2FsIGhpc3RvcnkgYXZhaWxhYmxlIGZvciBzZWxlY3RlZCByZXNvdXJjZS4KLXJlcGxhY2VFcnJvcj1DYW5ub3QgcmVwbGFjZSByZXNvdXJjZSAocmVhc29uOiB7MH0pLgotCi10YXNrTmFtZT1SZXBsYWNpbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhQcmV2aW91c0VkaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhQcmV2aW91c0VkaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYTEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoUHJldmlvdXNFZGl0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVdpdGhQcmV2aW91c0VkaXRpb25BY3Rpb24gZXh0ZW5kcyBFZGl0aW9uQWN0aW9uIHsKLQkJCi0JcHVibGljIFJlcGxhY2VXaXRoUHJldmlvdXNFZGl0aW9uQWN0aW9uKCkgewotCQlzdXBlcih0cnVlLAotCQkJIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uIik7CS8vJE5PTi1OTFMtMSQKLQkJZlByZXZpb3VzPSB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVzaXphYmxlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Jlc2l6YWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRhYjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVzaXphYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1NldHRpbmdzOwotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgcmVzaXphYmxlIERpYWxvZ3Mgd2l0aCBwZXJzaXN0ZW50IHdpbmRvdyBib3VuZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNpemFibGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLy8gZGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBESUFMT0dfQk9VTkRTX0tFWT0gIlJlc2l6YWJsZURpYWxvZ0JvdW5kcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWD0gIngiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFk9ICJ5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSURUSD0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUlHSFQ9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGZCdW5kbGU7Ci0JcHJpdmF0ZSBSZWN0YW5nbGUgZk5ld0JvdW5kczsKLQlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBmU2V0dGluZ3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHRJZDsKLQotCi0JcHVibGljIFJlc2l6YWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUgfCBTV1QuTUFYKTsKLQkJCi0JCWZCdW5kbGU9IGJ1bmRsZTsKLQkJCi0JCWZTZXR0aW5ncz0gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIZWxwQ29udGV4dElkKFN0cmluZyBjb250ZXh0SWQpIHsKLQkJZkNvbnRleHRJZD0gY29udGV4dElkOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKFNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJaWYgKGZDb250ZXh0SWQgIT0gbnVsbCkKLQkJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChuZXdTaGVsbCwgZkNvbnRleHRJZCk7Ci0JfQotCQotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJCi0JCWludCB3aWR0aD0gMDsKLQkJaW50IGhlaWdodD0gMDsKLQkJCi0JCWZpbmFsIFNoZWxsIHM9IGdldFNoZWxsKCk7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXMuYWRkQ29udHJvbExpc3RlbmVyKAotCQkJCW5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgYXJnMCkgewotCQkJCQkJZk5ld0JvdW5kcz0gcy5nZXRCb3VuZHMoKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgYXJnMCkgewotCQkJCQkJZk5ld0JvdW5kcz0gcy5nZXRCb3VuZHMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCi0JCUlEaWFsb2dTZXR0aW5ncyBib3VuZHM9IGZTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19CT1VORFNfS0VZKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYm91bmRzID09IG51bGwpIHsKLQkJCWlmIChmQnVuZGxlICE9IG51bGwpIHsKLQkJCQl3aWR0aD0gVXRpbGl0aWVzLmdldEludGVnZXIoZkJ1bmRsZSwgV0lEVEgsIDApOwotCQkJCWhlaWdodD0gVXRpbGl0aWVzLmdldEludGVnZXIoZkJ1bmRsZSwgSEVJR0hULCAwKTsKLQkJCQlTaGVsbCBzaGVsbD0gZ2V0UGFyZW50U2hlbGwoKTsKLQkJCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwYXJlbnRTaXplPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQkJCWlmICh3aWR0aCA8PSAwKQotCQkJCQkJd2lkdGg9IHBhcmVudFNpemUueC0zMDA7Ci0JCQkJCWlmIChoZWlnaHQgPD0gMCkKLQkJCQkJCWhlaWdodD0gcGFyZW50U2l6ZS55LTIwMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVNoZWxsIHNoZWxsPSBnZXRQYXJlbnRTaGVsbCgpOwotCQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHBhcmVudFNpemU9IHNoZWxsLmdldFNpemUoKTsKLQkJCQkJd2lkdGg9IHBhcmVudFNpemUueC0xMDA7Ci0JCQkJCWhlaWdodD0gcGFyZW50U2l6ZS55LTEwMDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2lkdGggPCA3MDApCi0JCQkJd2lkdGg9IDcwMDsKLQkJCWlmIChoZWlnaHQgPCA1MDApCi0JCQkJaGVpZ2h0PSA1MDA7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCXdpZHRoPSBib3VuZHMuZ2V0SW50KFdJRFRIKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGg9IDcwMDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaGVpZ2h0PSBib3VuZHMuZ2V0SW50KEhFSUdIVCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCWhlaWdodD0gNTAwOwotCQkJfQotCQl9CQotCQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbExvY2F0aW9uKFBvaW50IGluaXRpYWxTaXplKSB7Ci0JCVBvaW50IGxvYz0gc3VwZXIuZ2V0SW5pdGlhbExvY2F0aW9uKGluaXRpYWxTaXplKTsKLQkJCi0JCUlEaWFsb2dTZXR0aW5ncyBib3VuZHM9IGZTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19CT1VORFNfS0VZKTsKLQkJaWYgKGJvdW5kcyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvYy54PSBib3VuZHMuZ2V0SW50KFgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCQl0cnkgewotCQkJCWxvYy55PSBib3VuZHMuZ2V0SW50KFkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWJvb2xlYW4gY2xvc2VkPSBzdXBlci5jbG9zZSgpOwotCQlpZiAoY2xvc2VkICYmIGZOZXdCb3VuZHMgIT0gbnVsbCkKLQkJCXNhdmVCb3VuZHMoZk5ld0JvdW5kcyk7Ci0JCXJldHVybiBjbG9zZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVCb3VuZHMoUmVjdGFuZ2xlIGJvdW5kcykgewotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nQm91bmRzPSBmU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfQk9VTkRTX0tFWSk7Ci0JCWlmIChkaWFsb2dCb3VuZHMgPT0gbnVsbCkgewotCQkJZGlhbG9nQm91bmRzPSBuZXcgRGlhbG9nU2V0dGluZ3MoRElBTE9HX0JPVU5EU19LRVkpOwotCQkJZlNldHRpbmdzLmFkZFNlY3Rpb24oZGlhbG9nQm91bmRzKTsKLQkJfQotCQlkaWFsb2dCb3VuZHMucHV0KFgsIGJvdW5kcy54KTsKLQkJZGlhbG9nQm91bmRzLnB1dChZLCBib3VuZHMueSk7Ci0JCWRpYWxvZ0JvdW5kcy5wdXQoV0lEVEgsIGJvdW5kcy53aWR0aCk7Ci0JCWRpYWxvZ0JvdW5kcy5wdXQoSEVJR0hULCBib3VuZHMuaGVpZ2h0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Jlc291cmNlQ29tcGFyZUlucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Jlc291cmNlQ29tcGFyZUlucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzJkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9SZXNvdXJjZUNvbXBhcmVJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci0KLQotLyoqCi0gKiBBIHR3by13YXkgb3IgdGhyZWUtd2F5IGNvbXBhcmUgZm9yIGFyYml0cmFyeSBJUmVzb3VyY2VzLgotICovCi1jbGFzcyBSZXNvdXJjZUNvbXBhcmVJbnB1dCBleHRlbmRzIENvbXBhcmVFZGl0b3JJbnB1dCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT1JNQUxJWkVfQ0FTRT0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZlRocmVlV2F5PSBmYWxzZTsKLQlwcml2YXRlIE9iamVjdCBmUm9vdDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGZBbmNlc3RvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGZMZWZ0OwotCXByaXZhdGUgSVN0cnVjdHVyZUNvbXBhcmF0b3IgZlJpZ2h0OwotCXByaXZhdGUgSVJlc291cmNlIGZBbmNlc3RvclJlc291cmNlOwotCXByaXZhdGUgSVJlc291cmNlIGZMZWZ0UmVzb3VyY2U7Ci0JcHJpdmF0ZSBJUmVzb3VyY2UgZlJpZ2h0UmVzb3VyY2U7Ci0JcHJpdmF0ZSBEaWZmVHJlZVZpZXdlciBmRGlmZlZpZXdlcjsKLQlwcml2YXRlIElBY3Rpb24gZk9wZW5BY3Rpb247Ci0JCi0JY2xhc3MgTXlEaWZmTm9kZSBleHRlbmRzIERpZmZOb2RlIHsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBmRGlydHk9IGZhbHNlOwotCQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZkxhc3RJZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkxhc3ROYW1lOwotCQkKLQkJCi0JCXB1YmxpYyBNeURpZmZOb2RlKElEaWZmQ29udGFpbmVyIHBhcmVudCwgaW50IGRlc2NyaXB0aW9uLCBJVHlwZWRFbGVtZW50IGFuY2VzdG9yLCBJVHlwZWRFbGVtZW50IGxlZnQsIElUeXBlZEVsZW1lbnQgcmlnaHQpIHsKLQkJCXN1cGVyKHBhcmVudCwgZGVzY3JpcHRpb24sIGFuY2VzdG9yLCBsZWZ0LCByaWdodCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmlyZUNoYW5nZSgpIHsKLQkJCXN1cGVyLmZpcmVDaGFuZ2UoKTsKLQkJCXNldERpcnR5KHRydWUpOwotCQkJZkRpcnR5PSB0cnVlOwotCQkJaWYgKGZEaWZmVmlld2VyICE9IG51bGwpCi0JCQkJZkRpZmZWaWV3ZXIucmVmcmVzaCh0aGlzKTsKLQkJfQotCQl2b2lkIGNsZWFyRGlydHkoKSB7Ci0JCQlmRGlydHk9IGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCWlmIChmTGFzdE5hbWUgPT0gbnVsbCkKLQkJCQlmTGFzdE5hbWU9IHN1cGVyLmdldE5hbWUoKTsKLQkJCWlmIChmRGlydHkpCi0JCQkJcmV0dXJuICc8JyArIGZMYXN0TmFtZSArICc+JzsKLQkJCXJldHVybiBmTGFzdE5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJVHlwZWRFbGVtZW50IGdldElkKCkgewotCQkJSVR5cGVkRWxlbWVudCBpZD0gc3VwZXIuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBmTGFzdElkOwotCQkJZkxhc3RJZD0gaWQ7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIEZpbHRlcmVkQnVmZmVyZWRSZXNvdXJjZU5vZGUgZXh0ZW5kcyBCdWZmZXJlZFJlc291cmNlTm9kZSB7Ci0JCUZpbHRlcmVkQnVmZmVyZWRSZXNvdXJjZU5vZGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlzdXBlcihyZXNvdXJjZSk7Ci0JCX0KLQkJcHJvdGVjdGVkIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGNyZWF0ZUNoaWxkKElSZXNvdXJjZSBjaGlsZCkgewotCQkJU3RyaW5nIG5hbWU9IGNoaWxkLmdldE5hbWUoKTsKLQkJCWlmIChDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbHRlcihuYW1lLCBjaGlsZCBpbnN0YW5jZW9mIElDb250YWluZXIsIGZhbHNlKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgRmlsdGVyZWRCdWZmZXJlZFJlc291cmNlTm9kZShjaGlsZCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDcmVhdGVzIGFuIGNvbXBhcmUgZWRpdG9yIGlucHV0IGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqLwotCVJlc291cmNlQ29tcGFyZUlucHV0KENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihjb25maWcpOwotCX0KLQkJCQotCXB1YmxpYyBWaWV3ZXIgY3JlYXRlRGlmZlZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZEaWZmVmlld2VyPSBuZXcgRGlmZlRyZWVWaWV3ZXIocGFyZW50LCBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQkKLQkJCQlpZiAoZk9wZW5BY3Rpb24gPT0gbnVsbCkgewotCQkJCQlmT3BlbkFjdGlvbj0gbmV3IEFjdGlvbigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQloYW5kbGVPcGVuKG51bGwpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihmT3BlbkFjdGlvbiwgZ2V0QnVuZGxlKCksICJhY3Rpb24uQ29tcGFyZUNvbnRlbnRzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCQotCQkJCWJvb2xlYW4gZW5hYmxlPSBmYWxzZTsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJCQlpZiAoc3Muc2l6ZSgpID09IDEpIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50PSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTXlEaWZmTm9kZSkgewotCQkJCQkJCUlUeXBlZEVsZW1lbnQgdGU9ICgoTXlEaWZmTm9kZSkgZWxlbWVudCkuZ2V0SWQoKTsKLQkJCQkJCQlpZiAodGUgIT0gbnVsbCkKLQkJCQkJCQkJZW5hYmxlPSAhSVR5cGVkRWxlbWVudC5GT0xERVJfVFlQRS5lcXVhbHModGUuZ2V0VHlwZSgpKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCWVuYWJsZT0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmT3BlbkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJCi0JCQkJbWFuYWdlci5hZGQoZk9wZW5BY3Rpb24pOwotCQkJCQotCQkJCXN1cGVyLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGZEaWZmVmlld2VyOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gcykgewotCQkKLQkJSVJlc291cmNlW10gc2VsZWN0aW9uPSBVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKHMpOwotCi0JCWZUaHJlZVdheT0gc2VsZWN0aW9uLmxlbmd0aCA9PSAzOwotCQkKLQkJZkFuY2VzdG9yUmVzb3VyY2U9IG51bGw7Ci0JCWZMZWZ0UmVzb3VyY2U9IHNlbGVjdGlvblswXTsKLQkJZlJpZ2h0UmVzb3VyY2U9IHNlbGVjdGlvblsxXTsKLQkJaWYgKGZUaHJlZVdheSkgewotCQkJZkxlZnRSZXNvdXJjZT0gc2VsZWN0aW9uWzFdOwkJCi0JCQlmUmlnaHRSZXNvdXJjZT0gc2VsZWN0aW9uWzJdOwotCQl9Ci0JCQotCQlmQW5jZXN0b3I9IG51bGw7Ci0JCWZMZWZ0PSBnZXRTdHJ1Y3R1cmUoZkxlZnRSZXNvdXJjZSk7Ci0JCWZSaWdodD0gZ2V0U3RydWN0dXJlKGZSaWdodFJlc291cmNlKTsKLQkJCQkJCi0JCWlmIChmVGhyZWVXYXkpIHsKLQkJCWZBbmNlc3RvclJlc291cmNlPSBzZWxlY3Rpb25bMF07Ci0JCQlmQW5jZXN0b3I9IGdldFN0cnVjdHVyZShmQW5jZXN0b3JSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgY29tcGFyZSBjYW4gYmUgZXhlY3V0ZWQgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElTZWxlY3Rpb24gcykgewotCQkKLQkJSVJlc291cmNlW10gc2VsZWN0aW9uPSBVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKHMpOwotCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA8IDIgfHwgc2VsZWN0aW9uLmxlbmd0aCA+IDMpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZlRocmVlV2F5PSBzZWxlY3Rpb24ubGVuZ3RoID09IDM7Ci0JCQotCQlmTGVmdFJlc291cmNlPSBzZWxlY3Rpb25bMF07Ci0JCWZSaWdodFJlc291cmNlPSBzZWxlY3Rpb25bMV07Ci0JCWlmIChmVGhyZWVXYXkpIHsKLQkJCWZMZWZ0UmVzb3VyY2U9IHNlbGVjdGlvblsxXTsJCQotCQkJZlJpZ2h0UmVzb3VyY2U9IHNlbGVjdGlvblsyXTsKLQkJfQotCQkJCQkJCQotCQlpZiAoIWNvbXBhcmFibGUoZkxlZnRSZXNvdXJjZSwgZlJpZ2h0UmVzb3VyY2UpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmVGhyZWVXYXkpIHsKLQkJCWZBbmNlc3RvclJlc291cmNlPSBzZWxlY3Rpb25bMF07Ci0JCQkKLQkJCWlmICghY29tcGFyYWJsZShmTGVmdFJlc291cmNlLCBmUmlnaHRSZXNvdXJjZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBpbWFnZXMgaW4gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbi4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemVDb21wYXJlQ29uZmlndXJhdGlvbigpIHsKLQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2M9IGdldENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChmTGVmdFJlc291cmNlICE9IG51bGwpIHsKLQkJCWNjLnNldExlZnRMYWJlbChidWlsZExhYmVsKGZMZWZ0UmVzb3VyY2UpKTsKLQkJCWNjLnNldExlZnRJbWFnZShDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2UoZkxlZnRSZXNvdXJjZSkpOwotCQl9Ci0JCWlmIChmUmlnaHRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQljYy5zZXRSaWdodExhYmVsKGJ1aWxkTGFiZWwoZlJpZ2h0UmVzb3VyY2UpKTsKLQkJCWNjLnNldFJpZ2h0SW1hZ2UoQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlKGZSaWdodFJlc291cmNlKSk7Ci0JCX0KLQkJaWYgKGZUaHJlZVdheSAmJiBmQW5jZXN0b3JSZXNvdXJjZSAhPSBudWxsKSB7CQkJCi0JCQljYy5zZXRBbmNlc3RvckxhYmVsKGJ1aWxkTGFiZWwoZkFuY2VzdG9yUmVzb3VyY2UpKTsKLQkJCWNjLnNldEFuY2VzdG9ySW1hZ2UoQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlKGZBbmNlc3RvclJlc291cmNlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCByZXNvdXJjZXMgYXJlIGVpdGhlciBzdHJ1Y3R1cmVkIG9yIHVuc3RydWN0dXJlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyYWJsZShJUmVzb3VyY2UgYzEsIElSZXNvdXJjZSBjMikgewotCQlyZXR1cm4gaGFzU3RydWN0dXJlKGMxKSA9PSBoYXNTdHJ1Y3R1cmUoYzIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQgaGFzIGEgc3RydWN0dXJlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNTdHJ1Y3R1cmUoSVJlc291cmNlIGlucHV0KSB7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCUlGaWxlIGZpbGU9IChJRmlsZSkgaW5wdXQ7Ci0JCQlTdHJpbmcgdHlwZT0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJdHlwZT0gbm9ybWFsaXplQ2FzZSh0eXBlKTsKLQkJCQlyZXR1cm4gIkpBUiIuZXF1YWxzKHR5cGUpIHx8ICJaSVAiLmVxdWFscyh0eXBlKTsJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBDcmVhdGVzIGEgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gaW5wdXQuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4KLQkgKiBjYW4gYmUgZm91bmQgZm9yIHRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZUNvbXBhcmF0b3IgZ2V0U3RydWN0dXJlKElSZXNvdXJjZSBpbnB1dCkgewotCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCXJldHVybiBuZXcgRmlsdGVyZWRCdWZmZXJlZFJlc291cmNlTm9kZShpbnB1dCk7Ci0JCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIHJuPSBuZXcgRmlsdGVyZWRCdWZmZXJlZFJlc291cmNlTm9kZShpbnB1dCk7Ci0JCQlJRmlsZSBmaWxlPSAoSUZpbGUpIGlucHV0OwotCQkJU3RyaW5nIHR5cGU9IG5vcm1hbGl6ZUNhc2UoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpOwotCQkJaWYgKCJKQVIiLmVxdWFscyh0eXBlKSB8fCAiWklQIi5lcXVhbHModHlwZSkpIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3IoKS5nZXRTdHJ1Y3R1cmUocm4pOwotCQkJcmV0dXJuIHJuOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIFBlcmZvcm1zIGEgdHdvLXdheSBvciB0aHJlZS13YXkgZGlmZiBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBwcmVwYXJlSW5wdXQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCQotCQl0cnkgewotCQkJLy8gZml4IGZvciBQUiAxR0ZNTEZCOiBJVFBVSTpXSU4yMDAwIC0gZmlsZXMgdGhhdCBhcmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYXBwZWFyIGFzIGVtcHR5CQkJCQkJCQotCQkJZkxlZnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBwbSk7Ci0JCQlmUmlnaHRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBwbSk7Ci0JCQlpZiAoZlRocmVlV2F5ICYmIGZBbmNlc3RvclJlc291cmNlICE9IG51bGwpCi0JCQkJZkFuY2VzdG9yUmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgcG0pOwotCQkJLy8gZW5kIGZpeAkJCQkJCQotCQkJCQotCQkJcG0uYmVnaW5UYXNrKFV0aWxpdGllcy5nZXRTdHJpbmcoIlJlc291cmNlQ29tcGFyZS50YXNrTmFtZSIpLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLQkJCVN0cmluZyBsZWZ0TGFiZWw9IGZMZWZ0UmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHJpZ2h0TGFiZWw9IGZSaWdodFJlc291cmNlLmdldE5hbWUoKTsKLQkJCQotCQkJU3RyaW5nIHRpdGxlOwotCQkJaWYgKGZUaHJlZVdheSkgewkJCQotCQkJCVN0cmluZyBmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoIlJlc291cmNlQ29tcGFyZS50aHJlZVdheS50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGFuY2VzdG9yTGFiZWw9IGZBbmNlc3RvclJlc291cmNlLmdldE5hbWUoKTsKLQkJCQl0aXRsZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10ge2FuY2VzdG9yTGFiZWwsIGxlZnRMYWJlbCwgcmlnaHRMYWJlbH0pOwkKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZygiUmVzb3VyY2VDb21wYXJlLnR3b1dheS50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGl0bGU9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHtsZWZ0TGFiZWwsIHJpZ2h0TGFiZWx9KTsKLQkJCX0KLQkJCXNldFRpdGxlKHRpdGxlKTsKLQkJCQotCQkJRGlmZmVyZW5jZXIgZD0gbmV3IERpZmZlcmVuY2VyKCkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgdmlzaXQoT2JqZWN0IHBhcmVudCwgaW50IGRlc2NyaXB0aW9uLCBPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCQkJcmV0dXJuIG5ldyBNeURpZmZOb2RlKChJRGlmZkNvbnRhaW5lcikgcGFyZW50LCBkZXNjcmlwdGlvbiwgKElUeXBlZEVsZW1lbnQpYW5jZXN0b3IsIChJVHlwZWRFbGVtZW50KWxlZnQsIChJVHlwZWRFbGVtZW50KXJpZ2h0KTsKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlmUm9vdD0gZC5maW5kRGlmZmVyZW5jZXMoZlRocmVlV2F5LCBwbSwgbnVsbCwgZkFuY2VzdG9yLCBmTGVmdCwgZlJpZ2h0KTsKLQkJCXJldHVybiBmUm9vdDsKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJaWYgKGZMZWZ0UmVzb3VyY2UgIT0gbnVsbCAmJiBmUmlnaHRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGVmdExhYmVsPSBmTGVmdFJlc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyByaWdodExhYmVsPSBmUmlnaHRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7CQkJCi0JCQlpZiAoZlRocmVlV2F5KSB7CQkJCi0JCQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZygiUmVzb3VyY2VDb21wYXJlLnRocmVlV2F5LnRvb2x0aXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBhbmNlc3RvckxhYmVsPSBmQW5jZXN0b3JSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHthbmNlc3RvckxhYmVsLCBsZWZ0TGFiZWwsIHJpZ2h0TGFiZWx9KTsKLQkJCX0KLQkJCVN0cmluZyBmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoIlJlc291cmNlQ29tcGFyZS50d29XYXkudG9vbHRpcCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10ge2xlZnRMYWJlbCwgcmlnaHRMYWJlbH0pOwotCQl9Ci0JCS8vIGZhbGwgYmFjawotCQlyZXR1cm4gc3VwZXIuZ2V0VG9vbFRpcFRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRMYWJlbChJUmVzb3VyY2UgcikgewotCQlTdHJpbmcgbj0gci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCWlmIChuLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpCi0JCQlyZXR1cm4gbi5zdWJzdHJpbmcoMSk7Ci0JCXJldHVybiBuOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlQ2hhbmdlcyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNhdmVDaGFuZ2VzKHBtKTsKLQkJaWYgKGZSb290IGluc3RhbmNlb2YgRGlmZk5vZGUpIHsKLQkJCXRyeSB7Ci0JCQkJY29tbWl0KHBtLCAoRGlmZk5vZGUpIGZSb290KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGZEaWZmVmlld2VyICE9IG51bGwpCi0JCQkJCWZEaWZmVmlld2VyLnJlZnJlc2goKTsJCQkJCi0JCQkJc2V0RGlydHkoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogUmVjdXJzaXZlbHkgd2Fsa3MgdGhlIGRpZmYgdHJlZSBhbmQgY29tbWl0cyBhbGwgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbW1pdChJUHJvZ3Jlc3NNb25pdG9yIHBtLCBEaWZmTm9kZSBub2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE15RGlmZk5vZGUpCQkKLQkJCSgoTXlEaWZmTm9kZSlub2RlKS5jbGVhckRpcnR5KCk7Ci0JCQotCQlJVHlwZWRFbGVtZW50IGxlZnQ9IG5vZGUuZ2V0TGVmdCgpOwotCQlpZiAobGVmdCBpbnN0YW5jZW9mIEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKQotCQkJKChCdWZmZXJlZFJlc291cmNlTm9kZSkgbGVmdCkuY29tbWl0KHBtKTsKLQkJCQotCQlJVHlwZWRFbGVtZW50IHJpZ2h0PSBub2RlLmdldFJpZ2h0KCk7Ci0JCWlmIChyaWdodCBpbnN0YW5jZW9mIEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKQotCQkJKChCdWZmZXJlZFJlc291cmNlTm9kZSkgcmlnaHQpLmNvbW1pdChwbSk7Ci0KLQkJSURpZmZFbGVtZW50W10gY2hpbGRyZW49IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUlEaWZmRWxlbWVudCBlbGVtZW50PSBjaGlsZHJlbltpXTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpZmZOb2RlKQotCQkJCQljb21taXQocG0sIChEaWZmTm9kZSkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJQWRhcHRhYmxlLmdldEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUZpbGVbXS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJICAgIEhhc2hTZXQgY29sbGVjdG9yPSBuZXcgSGFzaFNldCgpOwotCQkgICAgY29sbGVjdERpcnR5UmVzb3VyY2VzKGZSb290LCBjb2xsZWN0b3IpOwotCQkgICAgcmV0dXJuIChJRmlsZVtdKSBjb2xsZWN0b3IudG9BcnJheShuZXcgSUZpbGVbY29sbGVjdG9yLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdERpcnR5UmVzb3VyY2VzKE9iamVjdCBvLCBTZXQgY29sbGVjdG9yKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgRGlmZk5vZGUpIHsKLQkJICAgIERpZmZOb2RlIG5vZGU9IChEaWZmTm9kZSkgbzsKLQkJCQotCQkJSVR5cGVkRWxlbWVudCBsZWZ0PSBub2RlLmdldExlZnQoKTsKLQkJCWlmIChsZWZ0IGluc3RhbmNlb2YgQnVmZmVyZWRSZXNvdXJjZU5vZGUpIHsKLQkJCSAgICBCdWZmZXJlZFJlc291cmNlTm9kZSBibj0gKEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKSBsZWZ0OwotCQkJICAgIGlmIChibi5pc0RpcnR5KCkpIHsKLQkJCSAgICAgICAgSVJlc291cmNlIHJlc291cmNlPSBibi5nZXRSZXNvdXJjZSgpOwotCQkJICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCSAgICAgICAgICAgIGNvbGxlY3Rvci5hZGQocmVzb3VyY2UpOwotCQkJICAgIH0KLQkJCX0KLQotCQkJSVR5cGVkRWxlbWVudCByaWdodD0gbm9kZS5nZXRSaWdodCgpOwotCQkJaWYgKHJpZ2h0IGluc3RhbmNlb2YgQnVmZmVyZWRSZXNvdXJjZU5vZGUpIHsKLQkJCSAgICBCdWZmZXJlZFJlc291cmNlTm9kZSBibj0gKEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKSByaWdodDsKLQkJCSAgICBpZiAoYm4uaXNEaXJ0eSgpKSB7Ci0JCQkgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZT0gYm4uZ2V0UmVzb3VyY2UoKTsKLQkJCSAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JCQkgICAgICAgICAgICBjb2xsZWN0b3IuYWRkKHJlc291cmNlKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCQkJCi0JCQlJRGlmZkVsZW1lbnRbXSBjaGlsZHJlbj0gbm9kZS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJSURpZmZFbGVtZW50IGVsZW1lbnQ9IGNoaWxkcmVuW2ldOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpZmZOb2RlKQotCQkJCQkgICAgY29sbGVjdERpcnR5UmVzb3VyY2VzKGVsZW1lbnQsIGNvbGxlY3Rvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBub3JtYWxpemVDYXNlKFN0cmluZyBzKSB7Ci0JCWlmIChOT1JNQUxJWkVfQ0FTRSAmJiBzICE9IG51bGwpCi0JCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpOwotCQlyZXR1cm4gczsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU2hvd1BzZXVkb0NvbmZsaWN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TaG93UHNldWRvQ29uZmxpY3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWEzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TaG93UHNldWRvQ29uZmxpY3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSA8Y29kZT5JQ29tcGFyZUNvbmZpZ3VyYXRpb24uU0hPV19QU0VVRE9fQ09ORkxJQ1RTPC9jb2RlPiBwcm9wZXJ0eSBvZiBhbgotICogPGNvZGU+SUNvbXBhcmVDb25maWd1cmF0aW9uPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFNob3dQc2V1ZG9Db25mbGljdHMgZXh0ZW5kcyBDaGFuZ2VQcm9wZXJ0eUFjdGlvbiB7Ci0KLQlwdWJsaWMgU2hvd1BzZXVkb0NvbmZsaWN0cyhSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIENvbXBhcmVDb25maWd1cmF0aW9uIGNjKSB7Ci0JCXN1cGVyKGJ1bmRsZSwgY2MsICJhY3Rpb24uU2hvd1BzZXVkb0NvbmZsaWN0cy4iLCBDb21wYXJlQ29uZmlndXJhdGlvbi5TSE9XX1BTRVVET19DT05GTElDVFMpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TaW1wbGVUZXh0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1NpbXBsZVRleHRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YTdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1NpbXBsZVRleHRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSUNvbXBhcmVJbnB1dDsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGV4dFZpZXdlciBleHRlbmRzIEFic3RyYWN0Vmlld2VyIHsKLQkJCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlNvdXJjZVZpZXdlcjsKLQlwcml2YXRlIElDb21wYXJlSW5wdXQgZklucHV0OwotCQotCQotCVNpbXBsZVRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmU291cmNlVmlld2VyPSBuZXcgU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgU1dULkhfU0NST0xMICsgU1dULlZfU0NST0xMKTsKLQkJZlNvdXJjZVZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQotCQkKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZlNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQlmU291cmNlVmlld2VyLnNldERvY3VtZW50KG5ldyBEb2N1bWVudChnZXRTdHJpbmcoaW5wdXQpKSk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlmSW5wdXQ9IChJQ29tcGFyZUlucHV0KSBpbnB1dDsKLQkJCUlUeXBlZEVsZW1lbnQgbGVmdD0gZklucHV0LmdldExlZnQoKTsKLQkJCWZTb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQobmV3IERvY3VtZW50KGdldFN0cmluZyhsZWZ0KSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgaW5wdXQpIHsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFV0aWxpdGllcy5yZWFkU3RyaW5nKChJU3RyZWFtQ29udGVudEFjY2Vzc29yKSBpbnB1dCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1N0cmVhbU1lcmdlckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU3RyZWFtTWVyZ2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThhZjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU3RyZWFtTWVyZ2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1NZXJnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBBIGZhY3RvcnkgcHJveHkgZm9yIGNyZWF0aW5nIGEgU3RydWN0dXJlQ3JlYXRvci4KLSAqLwotY2xhc3MgU3RyZWFtTWVyZ2VyRGVzY3JpcHRvciB7Ci0gICAgCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0FUVFJJQlVURT0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotCQotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBzb3J0ZXIgbm9kZSB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFN0cmVhbU1lcmdlckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJZkVsZW1lbnQ9IGVsZW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSBtZXJnZXIgZnJvbSB0aGlzIG5vZGUuCi0JICovCi0JcHVibGljIElTdHJlYW1NZXJnZXIgY3JlYXRlU3RyZWFtTWVyZ2VyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJU3RyZWFtTWVyZ2VyKWZFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NfQVRUUklCVVRFKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJLy9FeGNlcHRpb25IYW5kbGVyLmhhbmRsZShleCwgU2VhcmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTZWFyY2guRXJyb3IuY3JlYXRlU29ydGVyLnRpdGxlIiksIFNlYXJjaE1lc3NhZ2VzLmdldFN0cmluZygiU2VhcmNoLkVycm9yLmNyZWF0ZVNvcnRlci5tZXNzYWdlIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vRXhjZXB0aW9uSGFuZGxlci5kaXNwbGF5TWVzc2FnZURpYWxvZyhleCwgU2VhcmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTZWFyY2guRXJyb3IuY3JlYXRlU29ydGVyLnRpdGxlIiksIFNlYXJjaE1lc3NhZ2VzLmdldFN0cmluZygiU2VhcmNoLkVycm9yLmNyZWF0ZVNvcnRlci5tZXNzYWdlIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM2NmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNyZWF0b3I7Ci0KLS8qKgotICogQSBmYWN0b3J5IHByb3h5IGZvciBjcmVhdGluZyBhIFN0cnVjdHVyZUNyZWF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvciB7Ci0gICAgCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0FUVFJJQlVURT0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFWFRFTlNJT05TX0FUVFJJQlVURT0gImV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQ7Ci0JCi0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IHNvcnRlciBub2RlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJZkVsZW1lbnQ9IGVsZW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IHNvcnRlciBmcm9tIHRoaXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZUNyZWF0b3IgY3JlYXRlU3RydWN0dXJlQ3JlYXRvcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVN0cnVjdHVyZUNyZWF0b3IpZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSSUJVVEUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21wYXJlVUlQbHVnaW4ubG9nKGV4LmdldFN0YXR1cygpKTsKLQkJCS8vRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZXgsIFNlYXJjaE1lc3NhZ2VzLmdldFN0cmluZygiU2VhcmNoLkVycm9yLmNyZWF0ZVNvcnRlci50aXRsZSIpLCBTZWFyY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlNlYXJjaC5FcnJvci5jcmVhdGVTb3J0ZXIubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0V4Y2VwdGlvbkhhbmRsZXIuZGlzcGxheU1lc3NhZ2VEaWFsb2coZXgsIFNlYXJjaE1lc3NhZ2VzLmdldFN0cmluZygiU2VhcmNoLkVycm9yLmNyZWF0ZVNvcnRlci50aXRsZSIpLCBTZWFyY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlNlYXJjaC5FcnJvci5jcmVhdGVTb3J0ZXIubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlIGNyZWF0b3IncyBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZkVsZW1lbnQuZ2V0QXR0cmlidXRlKEVYVEVOU0lPTlNfQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1RhYkZvbGRlckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9UYWJGb2xkZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkNTlhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1RhYkZvbGRlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLQotcHVibGljIGNsYXNzIFRhYkZvbGRlckxheW91dCBleHRlbmRzIExheW91dCB7Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUgKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCQkJCi0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCWludCBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJaW50IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKLQkJZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbiBbaV07Ci0JCQlQb2ludCBwdCA9IGNoaWxkLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpOwotCQkJbWF4V2lkdGggPSBNYXRoLm1heCAobWF4V2lkdGgsIHB0LngpOwotCQkJbWF4SGVpZ2h0ID0gTWF0aC5tYXggKG1heEhlaWdodCwgcHQueSk7Ci0JCX0KLQkJCi0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkKLQkJCW1heFdpZHRoPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJbWF4SGVpZ2h0PSBoSGludDsKLQkJCi0JCXJldHVybiBuZXcgUG9pbnQobWF4V2lkdGgsIG1heEhlaWdodCk7CQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0IChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUmVjdGFuZ2xlIHJlY3Q9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1RleHRNZXJnZVZpZXdlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dE1lcmdlVmlld2VyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNhYTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dE1lcmdlVmlld2VyQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXI7Ci0KLS8qKgotICogQSBmYWN0b3J5IG9iamVjdCBmb3IgdGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4uCi0gKiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9ubHkgb2JqZWN0cyB3aXRoIGEgZGVmYXVsdAotICogY29uc3RydWN0b3IgY2FuIGJlIGNyZWF0ZWQgdmlhIGFuIGV4dGVuc2lvbiBwb2ludAotICogKHRoaXMgcHJlY2x1ZGVzIFZpZXdlcnMpLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dE1lcmdlVmlld2VyQ3JlYXRvciBpbXBsZW1lbnRzIElWaWV3ZXJDcmVhdG9yIHsKLQotCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIG1wKSB7Ci0JCXJldHVybiBuZXcgVGV4dE1lcmdlVmlld2VyKHBhcmVudCwgbXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dFZpZXdlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dFZpZXdlckNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1YzBlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1RleHRWaWV3ZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yOwotCi0KLS8qKgotICogQSBmYWN0b3J5IG9iamVjdCBmb3IgdGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4uCi0gKiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9ubHkgb2JqZWN0cyB3aXRoIGEgZGVmYXVsdAotICogY29uc3RydWN0b3IgY2FuIGJlIGNyZWF0ZWQgdmlhIGFuIGV4dGVuc2lvbiBwb2ludAotICogKHRoaXMgcHJlY2x1ZGVzIFZpZXdlcnMpLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dFZpZXdlckNyZWF0b3IgaW1wbGVtZW50cyBJVmlld2VyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBtcCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRleHRWaWV3ZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Rva2VuQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Ub2tlbkNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMTI3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Rva2VuQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuSVJhbmdlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5JVG9rZW5Db21wYXJhdG9yOwotCi0vKioKLSAqIEltcGxlbWVudHMgdGhlIDxjb2RlPklUb2tlbkNvbXBhcmF0b3I8L2NvZGU+IGludGVyZmFjZSBmb3Igd29yZHMgKG9yIHRva2VucykKLSAqIGluIGEgc3RyaW5nLgotICogQSA8Y29kZT5Ub2tlbkNvbXBhcmF0b3I8L2NvZGU+IGlzIHVzZWQgYXMgdGhlIGlucHV0IGZvciB0aGUgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlcjwvY29kZT4KLSAqIGVuZ2luZSB0byBwZXJmb3JtIGEgdG9rZW4gb3JpZW50ZWQgY29tcGFyZSBvbiBzdHJpbmdzLgotICovCi1wdWJsaWMgY2xhc3MgVG9rZW5Db21wYXJhdG9yIGltcGxlbWVudHMgSVRva2VuQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZEVzY2FwZT0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIGludCBmQ291bnQ7Ci0JcHJpdmF0ZSBpbnRbXSBmU3RhcnRzOwotCXByaXZhdGUgaW50W10gZkxlbmd0aHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+VG9rZW5Db21wYXJhdG9yPC9jb2RlPiBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdGhhdCBpcyBzcGxpdCBpbnRvIHRva2VuCi0JICovCi0JcHVibGljIFRva2VuQ29tcGFyYXRvcihTdHJpbmcgdGV4dCkgewotCQkKLQkJQXNzZXJ0LmlzTm90TnVsbCh0ZXh0KTsKLQotCQlmVGV4dD0gdGV4dDsKLQkJCi0JCWludCBsZW5ndGg9IGZUZXh0Lmxlbmd0aCgpOwotCQlmU3RhcnRzPSBuZXcgaW50W2xlbmd0aF07CS8vIHBlc3NpbWlzdGljIGFzc3VtcHRpb24hCi0JCWZMZW5ndGhzPSBuZXcgaW50W2xlbmd0aF07Ci0JCWZDb3VudD0gMDsKLQkJCi0JCWNoYXIgbGFzdENhdGVnb3J5PSAwOwkvLyAwOiBubyBjYXRlZ29yeQotCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYz0gZlRleHQuY2hhckF0KGkpOwotCQkJCi0JCQljaGFyIGNhdGVnb3J5PSAnPyc7CS8vIHVuc3BlY2lmaWVkIGNhdGVnb3J5Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLQkJCQljYXRlZ29yeT0gJyAnOwkvLyB3aGl0ZSBzcGFjZSBjYXRlZ29yeQotCQkJZWxzZSBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYykpCi0JCQkJY2F0ZWdvcnk9ICcwJzsJLy8gZGlnaXRzCi0JCQllbHNlIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykpCi0JCQkJY2F0ZWdvcnk9ICdhJzsJLy8gbGV0dGVycwotCQkJCi0JCQlpZiAoY2F0ZWdvcnkgIT0gbGFzdENhdGVnb3J5KSB7Ci0JCQkJLy8gc3RhcnQgYSBuZXcgdG9rZW4KLQkJCQlmU3RhcnRzW2ZDb3VudCsrXT0gaTsKLQkJCQlsYXN0Q2F0ZWdvcnk9IGNhdGVnb3J5OwotCQkJfQotCQkJZkxlbmd0aHNbZkNvdW50LTFdKys7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPlRva2VuQ29tcGFyYXRvcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRoYXQgaXMgc3BsaXQgaW50byB0b2tlbgotCSAqIEBwYXJhbSBzaG91bGRFc2NhcGUKLQkgKi8KLQlwdWJsaWMgVG9rZW5Db21wYXJhdG9yKFN0cmluZyB0ZXh0LCBib29sZWFuIHNob3VsZEVzY2FwZSkgewotCQl0aGlzKHRleHQpOwotCQlmU2hvdWxkRXNjYXBlPSBzaG91bGRFc2NhcGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRva2VuIGluIHRoZSBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIG51bWJlciBvZiB0b2tlbiBpbiB0aGUgc3RyaW5nCi0JICovCi0JcHVibGljIGludCBnZXRSYW5nZUNvdW50KCkgewotCQlyZXR1cm4gZkNvdW50OwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVRva2VuQ29tcGFyYXRvci5nZXRUb2tlblN0YXJ0Ci0JICovCi0JcHVibGljIGludCBnZXRUb2tlblN0YXJ0KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCBmQ291bnQpCi0JCQlyZXR1cm4gZlN0YXJ0c1tpbmRleF07Ci0JCXJldHVybiBmVGV4dC5sZW5ndGgoKTsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElUb2tlbkNvbXBhcmF0b3IuZ2V0VG9rZW5MZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRva2VuTGVuZ3RoKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCBmQ291bnQpCi0JCQlyZXR1cm4gZkxlbmd0aHNbaW5kZXhdOwotCQlyZXR1cm4gMDsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSB0b2tlbiBnaXZlbiBieSB0aGUgZmlyc3QgaW5kZXgKLQkgKiBtYXRjaGVzIGEgdG9rZW4gc3BlY2lmaWVkIGJ5IHRoZSBvdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPiBhbmQgaW5kZXguCi0JICoKLQkgKiBAcGFyYW0gdGhpc0luZGV4CXRoZSBudW1iZXIgb2YgdGhlIHRva2VuIHdpdGhpbiB0aGlzIHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcGFyYW0gb3RoZXIgdGhlIHJhbmdlIGNvbXBhcmF0b3IgdG8gY29tcGFyZSB0aGlzIHdpdGgKLQkgKiBAcGFyYW0gb3RoZXJJbmRleCB0aGUgbnVtYmVyIG9mIHRoZSB0b2tlbiB3aXRoaW4gdGhlIG90aGVyIGNvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0b2tlbiBhcmUgZXF1YWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByYW5nZXNFcXVhbChpbnQgdGhpc0luZGV4LCBJUmFuZ2VDb21wYXJhdG9yIG90aGVyLCBpbnQgb3RoZXJJbmRleCkgewotCQlpZiAob3RoZXIgIT0gbnVsbCAmJiBnZXRDbGFzcygpID09IG90aGVyLmdldENsYXNzKCkpIHsKLQkJCVRva2VuQ29tcGFyYXRvciB0Yz0gKFRva2VuQ29tcGFyYXRvcikgb3RoZXI7Ci0JCQlpbnQgdGhpc0xlbj0gZ2V0VG9rZW5MZW5ndGgodGhpc0luZGV4KTsKLQkJCWludCBvdGhlckxlbj0gdGMuZ2V0VG9rZW5MZW5ndGgob3RoZXJJbmRleCk7Ci0JCQlpZiAodGhpc0xlbiA9PSBvdGhlckxlbikKLQkJCQlyZXR1cm4gZlRleHQucmVnaW9uTWF0Y2hlcyhmYWxzZSwgZ2V0VG9rZW5TdGFydCh0aGlzSW5kZXgpLCB0Yy5mVGV4dCwgdGMuZ2V0VG9rZW5TdGFydChvdGhlckluZGV4KSwgdGhpc0xlbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQWJvcnRzIHRoZSBjb21wYXJpc29uIGlmIHRoZSBudW1iZXIgb2YgdG9rZW5zIGlzIHRvbyBsYXJnZS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFib3J0IGEgdG9rZW4gY29tcGFyaXNvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNraXBSYW5nZUNvbXBhcmlzb24oaW50IGxlbmd0aCwgaW50IG1heCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlcikgewotCi0JCWlmICghZlNob3VsZEVzY2FwZSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZ2V0UmFuZ2VDb3VudCgpIDwgNTAgfHwgb3RoZXIuZ2V0UmFuZ2VDb3VudCgpIDwgNTApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG1heCA8IDEwMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAobGVuZ3RoIDwgMTAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChtYXggPiA4MDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAobGVuZ3RoIDwgbWF4IC8gNCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotLy8JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotLy8JCS8vU3RyaW5nIGluPSAicHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoY2hhciBjKSB7IjsKLS8vCQkvL1N0cmluZyBpbj0gImZvciAoaW50IGo9IDA7IGogPCBsLTE7IGorKykgeyI7Ci0vLwkJU3RyaW5nIGluPSAiZm9yIGRvICAgIGk9IDEyMzsgaSsrIjsKLS8vCQlUb2tlbkNvbXBhcmF0b3IgdGM9IG5ldyBUb2tlbkNvbXBhcmF0b3IoaW4sIGZhbHNlKTsKLS8vCQkKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIm46ICIgKyB0Yy5nZXRSYW5nZUNvdW50KCkpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihpbik7Ci0vLwkJCi0vLwkJaW50IHA9IDA7Ci0vLwkJZm9yIChpbnQgaT0gMDsgaSA8IHRjLmdldFJhbmdlQ291bnQoKTsgaSsrKSB7Ci0vLwkJCWludCBsPSB0Yy5nZXRUb2tlbkxlbmd0aChpKTsKLS8vCQkJU3lzdGVtLm91dC5wcmludCgiPCIpOwotLy8JCQkKLS8vCQkJZm9yIChpbnQgaj0gMDsgaiA8IGwtMTsgaisrKQotLy8JCQkJU3lzdGVtLm91dC5wcmludCgiICIpOwotLy8JCX0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkKLS8vCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZXh0cmFjdDogPCIgKyB0Yy5leHRyYWN0KDE2LCAxKSArICI+Iik7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjE2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklFbmNvZGVkU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JU3RyZWFtQ29udGVudEFjY2Vzc29yOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGFuZCB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsaXRpZXMgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFjdGlvbihJS2V5QmluZGluZ1NlcnZpY2Uga2JzLCBJQWN0aW9uIGEsIFN0cmluZyBpZCkgewotCQlpZiAoa2JzICE9IG51bGwpIHsKLQkJCWEuc2V0QWN0aW9uRGVmaW5pdGlvbklkKGlkKTsKLQkJCWticy5yZWdpc3RlckFjdGlvbihhKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYXJ0U2l0ZSBmaW5kU2l0ZShDb250cm9sIGMpIHsKLQkJd2hpbGUgKGMgIT0gbnVsbCAmJiAhYy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCU9iamVjdCBkYXRhPSBjLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnQpCi0JCQkJcmV0dXJuICgoSVdvcmtiZW5jaFBhcnQpZGF0YSkuZ2V0U2l0ZSgpOwotCQkJYz0gYy5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBY3Rpb25CYXJzIGZpbmRBY3Rpb25CYXJzKENvbnRyb2wgYykgewotCQl3aGlsZSAoYyAhPSBudWxsICYmICFjLmlzRGlzcG9zZWQoKSkgewotCQkJT2JqZWN0IGRhdGE9IGMuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9yKQotCQkJCXJldHVybiAoKENvbXBhcmVFZGl0b3IpZGF0YSkuZ2V0QWN0aW9uQmFycygpOwotCQkJCQotCQkJLy8gUFIgMUdEVlpWNzogSVRQVkNNOldJTjk4IC0gQ1RSTCArIEMgZG9lcyBub3Qgd29yayBpbiBKYXZhIHNvdXJjZSBjb21wYXJlCi0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIElWaWV3UGFydCkKLQkJCQlyZXR1cm4gKChJVmlld1BhcnQpZGF0YSkuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCQkvLyBlbmQgUFIgMUdEVlpWNwotCQkJCi0JCQljPSBjLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFbmFibGVDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBlbmFibGUpIHsKLQkJQ29udHJvbFtdIGNoaWxkcmVuPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJY2hpbGRyZW5baV0uc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKENvbXBhcmVDb25maWd1cmF0aW9uIGNjLCBTdHJpbmcga2V5LCBib29sZWFuIGRmbHQpIHsKLQkJaWYgKGNjICE9IG51bGwpIHsKLQkJCU9iamVjdCB2YWx1ZT0gY2MuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQkJcmV0dXJuICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZmx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKExpc3RlbmVyTGlzdCBsbCwgT2JqZWN0IHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3Qgb2xkLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKGxsICE9IG51bGwpIHsKLQkJCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ9IG51bGw7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGxsLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGw9IChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCQlldmVudD0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoc291cmNlLCBwcm9wZXJ0eSwgb2xkLCBuZXdWYWx1ZSk7Ci0JCQkJbC5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb2tUb1VzZShXaWRnZXQgd2lkZ2V0KSB7Ci0JCXJldHVybiB3aWRnZXQgIT0gbnVsbCAmJiAhd2lkZ2V0LmlzRGlzcG9zZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGludGVybmFsR2V0UmVzb3VyY2VzKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBDbGFzcyB0eXBlKSB7Ci0JCQotCQlBcnJheUxpc3QgdG1wPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQotCQkJT2JqZWN0W10gcz0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCQkKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCi0JCQkJSVJlc291cmNlIHJlc291cmNlPSBudWxsOwotCQkJCQotCQkJCU9iamVjdCBvPSBzW2ldOwotCQkJCWlmICh0eXBlLmlzSW5zdGFuY2UobykpIHsKLQkJCQkJcmVzb3VyY2U9IChJUmVzb3VyY2UpIG87Ci0JCQkJCQkKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCUlBZGFwdGFibGUgYT0gKElBZGFwdGFibGUpIG87Ci0JCQkJCU9iamVjdCBhZGFwdGVyPSBhLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShhZGFwdGVyKSkKLQkJCQkJCXJlc291cmNlPSAoSVJlc291cmNlKSBhZGFwdGVyOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLQkJCQkJdG1wLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0bXA7Ci0JfQotCQotCS8qCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBleHRyYWN0IGFsbCBhY2Nlc3NpYmxlIDxjb2RlPklSZXNvdXJjZXM8L2NvZGU+IGZyb20gZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3QgdG1wPSBpbnRlcm5hbEdldFJlc291cmNlcyhzZWxlY3Rpb24sIElSZXNvdXJjZS5jbGFzcyk7Ci0JCXJldHVybiAoSVJlc291cmNlW10pIHRtcC50b0FycmF5KG5ldyBJUmVzb3VyY2VbdG1wLnNpemUoKV0pOwotCX0KLQkKLQkvKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogZXh0cmFjdCBhbGwgYWNjZXNzaWJsZSA8Y29kZT5JRmlsZXM8L2NvZGU+IGZyb20gZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlW10gZ2V0RmlsZXMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHRtcD0gaW50ZXJuYWxHZXRSZXNvdXJjZXMoc2VsZWN0aW9uLCBJRmlsZS5jbGFzcyk7Ci0JCXJldHVybiAoSUZpbGVbXSkgdG1wLnRvQXJyYXkobmV3IElGaWxlW3RtcC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkQnl0ZXMoSW5wdXRTdHJlYW0gaW4pIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcz0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewkJCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBjPSBpbi5yZWFkKCk7Ci0JCQkJaWYgKGMgPT0gLTEpCi0JCQkJCWJyZWFrOwotCQkJCWJvcy53cml0ZShjKTsKLQkJCX0KLQkJCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCX0gZmluYWxseSB7Ci0JCQlVdGlsaXRpZXMuY2xvc2UoaW4pOwotCQkJdHJ5IHsKLQkJCQlib3MuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBib3MudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJY29uUGF0aChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJcmV0dXJuICJpY29ucy9mdWxsLyI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBnaXZlbiBBY3Rpb24gZnJvbSBhIFJlc291cmNlQnVuZGxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0QWN0aW9uKElBY3Rpb24gYSwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4KSB7Ci0JCQotCQlTdHJpbmcgbGFiZWxLZXk9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRvb2x0aXBLZXk9ICJ0b29sdGlwIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaW1hZ2VLZXk9ICJpbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlc2NyaXB0aW9uS2V5PSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJbGFiZWxLZXk9IHByZWZpeCArIGxhYmVsS2V5OwotCQkJdG9vbHRpcEtleT0gcHJlZml4ICsgdG9vbHRpcEtleTsKLQkJCWltYWdlS2V5PSBwcmVmaXggKyBpbWFnZUtleTsKLQkJCWRlc2NyaXB0aW9uS2V5PSBwcmVmaXggKyBkZXNjcmlwdGlvbktleTsKLQkJfQotCQkKLQkJYS5zZXRUZXh0KGdldFN0cmluZyhidW5kbGUsIGxhYmVsS2V5LCBsYWJlbEtleSkpOwotCQlhLnNldFRvb2xUaXBUZXh0KGdldFN0cmluZyhidW5kbGUsIHRvb2x0aXBLZXksIG51bGwpKTsKLQkJYS5zZXREZXNjcmlwdGlvbihnZXRTdHJpbmcoYnVuZGxlLCBkZXNjcmlwdGlvbktleSwgbnVsbCkpOwotCQkKLQkJU3RyaW5nIHJlbFBhdGg9IGdldFN0cmluZyhidW5kbGUsIGltYWdlS2V5LCBudWxsKTsKLQkJaWYgKHJlbFBhdGggIT0gbnVsbCAmJiByZWxQYXRoLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQotCQkJU3RyaW5nIGRQYXRoOwotCQkJU3RyaW5nIGVQYXRoOwotCQkJCi0JCQlpZiAocmVsUGF0aC5pbmRleE9mKCIvIikgPj0gMCkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBhdGg9IHJlbFBhdGguc3Vic3RyaW5nKDEpOwotCQkJCWRQYXRoPSAnZCcgKyBwYXRoOwotCQkJCWVQYXRoPSAnZScgKyBwYXRoOwotCQkJfSBlbHNlIHsKLQkJCQlkUGF0aD0gImRsY2wxNi8iICsgcmVsUGF0aDsgLy8kTk9OLU5MUy0xJAotCQkJCWVQYXRoPSAiZWxjbDE2LyIgKyByZWxQYXRoOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUltYWdlRGVzY3JpcHRvciBpZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihkUGF0aCk7CS8vIHdlIHNldCB0aGUgZGlzYWJsZWQgaW1hZ2UgZmlyc3QgKHNlZSBQUiAxR0RERTg3KQotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJYS5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihpZCk7Ci0JCQlpZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihlUGF0aCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCWEuc2V0SW1hZ2VEZXNjcmlwdG9yKGlkKTsKLQkJCQlhLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKGlkKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFRvZ2dsZUFjdGlvbihJQWN0aW9uIGEsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0KLQkJU3RyaW5nIHRvb2x0aXA9IG51bGw7Ci0JCWlmIChjaGVja2VkKQotCQkJdG9vbHRpcD0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJlZml4ICsgInRvb2x0aXAuY2hlY2tlZCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXRvb2x0aXA9IGdldFN0cmluZyhidW5kbGUsIHByZWZpeCArICJ0b29sdGlwLnVuY2hlY2tlZCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCWlmICh0b29sdGlwID09IG51bGwpCi0JCQl0b29sdGlwPSBnZXRTdHJpbmcoYnVuZGxlLCBwcmVmaXggKyAidG9vbHRpcCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCQotCQlpZiAodG9vbHRpcCAhPSBudWxsKQotCQkJYS5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKLQkJCQotCQlTdHJpbmcgZGVzY3JpcHRpb249IG51bGw7Ci0JCWlmIChjaGVja2VkKQotCQkJZGVzY3JpcHRpb249IGdldFN0cmluZyhidW5kbGUsIHByZWZpeCArICJkZXNjcmlwdGlvbi5jaGVja2VkIiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJZGVzY3JpcHRpb249IGdldFN0cmluZyhidW5kbGUsIHByZWZpeCArICJkZXNjcmlwdGlvbi51bmNoZWNrZWQiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uPSBnZXRTdHJpbmcoYnVuZGxlLCBwcmVmaXggKyAiZGVzY3JpcHRpb24iLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQlhLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXksIFN0cmluZyBkZmx0VmFsdWUpIHsKLQkJCi0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0JCXJldHVybiBkZmx0VmFsdWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLQkJCi0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoYnVuZGxlLmdldFN0cmluZyhrZXkpLCBuZXcgU3RyaW5nW10geyBhcmcgfSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBDb21wYXJlVUkuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChDb21wYXJlVUkuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KSwgbmV3IFN0cmluZ1tdIHsgYXJnIH0pOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29tcGFyZVVJLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSksIG5ldyBTdHJpbmdbXSB7IGFyZzAsIGFyZzEgfSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQl9CQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFN0cmluZyhidW5kbGUsIGtleSwga2V5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZWdlcihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXksIGludCBkZmx0VmFsdWUpIHsKLQkJCi0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcz0gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCWlmIChzICE9IG51bGwpCi0JCQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHMpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0JCXJldHVybiBkZmx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGNvbnRhaW5zIHJlc291cmNlcyB0aGF0IGRvbid0Ci0JICogaGF2ZSBvdmVybGFwcGluZyBwYXRocyBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gCi0JICovCi0JLyoKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3Rpb25Ob25PdmVybGFwcGluZygpIHRocm93cyBUZWFtRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJLy8gYWxsb3cgb3BlcmF0aW9uIGZvciBub24tb3ZlcmxhcHBpbmcgcmVzb3VyY2Ugc2VsZWN0aW9ucwotCQlpZihyZXNvdXJjZXMubGVuZ3RoPjApIHsKLQkJCUxpc3QgdmFsaWRQYXRocyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCQkKLQkJCQkvLyBvbmx5IGFsbG93IGN2cyByZXNvdXJjZXMgdG8gYmUgc2VsZWN0ZWQKLQkJCQlpZihSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBDVlNQcm92aWRlclBsdWdpbi5nZXRUeXBlSWQoKSkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGNoZWNrIGlmIHRoaXMgcmVzb3VyY2Ugb3ZlcmxhcHMgb3RoZXIgc2VsZWN0aW9ucwkJCi0JCQkJSVBhdGggcmVzb3VyY2VGdWxsUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJaWYoIXZhbGlkUGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWxpZFBhdGhzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGl0Lm5leHQoKTsKLQkJCQkJCWlmKHBhdGguaXNQcmVmaXhPZihyZXNvdXJjZUZ1bGxQYXRoKSB8fCAKLQkJCQkJICAgICAgIHJlc291cmNlRnVsbFBhdGguaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl2YWxpZFBhdGhzLmFkZChyZXNvdXJjZUZ1bGxQYXRoKTsKLQkJCQkKLQkJCQkvLyBlbnN1cmUgdGhhdCByZXNvdXJjZXMgYXJlIG1hbmFnZWQKLQkJCQlJQ1ZTUmVzb3VyY2UgY3ZzUmVzb3VyY2UgPSBDVlNXb3Jrc3BhY2VSb290LmdldENWU1Jlc291cmNlRm9yKHJlc291cmNlKTsKLQkJCQlpZihjdnNSZXNvdXJjZS5pc0ZvbGRlcigpKSB7Ci0JCQkJCWlmKCAhICgoSUNWU0ZvbGRlciljdnNSZXNvdXJjZSkuaXNDVlNGb2xkZXIoKSkgcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKCAhIGN2c1Jlc291cmNlLmlzTWFuYWdlZCgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkqLwotCQotCS8qIHZhbGlkYXRlIGVkaXQgdXRpbGl0aWVzICovCi0JCi0JLyoqCi0JICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhbiB2YWxpZGF0ZUVkaXQgY2FsbCBoYXMgY2hhbmdlZCB0aGUKLQkgKiBjb250ZW50IG9mIGEgZmlsZSBvbiBkaXNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxJREFURV9FRElUX1BST0JMRU09IDEwMDA0OwkKLQkKLQkvKgotCSAqIE1ha2VzIHRoZSBnaXZlbiByZXNvdXJjZXMgY29tbWl0dGFibGUuIENvbW1pdHRhYmxlIG1lYW5zIHRoYXQgYWxsCi0JICogcmVzb3VyY2VzIGFyZSB3cml0ZWFibGUgYW5kIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlcyBoYXNuJ3QKLQkgKiBjaGFuZ2VkIGJ5IGNhbGxpbmcgPGNvZGU+dmFsaWRhdGVFZGl0PC9jb2RlPiBmb3IgYSBnaXZlbiBmaWxlIG9uCi0JICogPHR0PklXb3Jrc3BhY2U8L3R0Pi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSByZXNvdXJjZXMgdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBzaGVsbCB0aGUgU2hlbGwgcGFzc2VkIHRvIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4gYXMgYSBjb250ZXh0Ci0JICogQHJldHVybiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCByZXNvdXJjZXMgYXJlIGNvbW1pdHRhYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3ZhbGlkYXRlRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZVtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSkgewotCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZXMobmV3IElSZXNvdXJjZVtdIHsgcmVzb3VyY2UgfSwgc2hlbGwsIHRpdGxlKTsKLQl9Ci0JCi0JLyoKLQkgKiBNYWtlcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzIGNvbW1pdHRhYmxlLiBDb21taXR0YWJsZSBtZWFucyB0aGF0IGFsbAotCSAqIHJlc291cmNlcyBhcmUgd3JpdGVhYmxlIGFuZCB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZXMgaGFzbid0Ci0JICogY2hhbmdlZCBieSBjYWxsaW5nIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4gZm9yIGEgZ2l2ZW4gZmlsZSBvbgotCSAqIDx0dD5JV29ya3NwYWNlPC90dD4uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyB0aGUgcmVzb3VyY2VzIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gc2hlbGwgdGhlIFNoZWxsIHBhc3NlZCB0byA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+IGFzIGEgY29udGV4dAotCSAqIEByZXR1cm4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgcmVzb3VyY2VzIGFyZSBjb21taXR0YWJsZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZUVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGVbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZXMoTGlzdCByZXNvdXJjZXMsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUpIHsKLQkJSVJlc291cmNlIHJbXT0gKElSZXNvdXJjZVtdKSByZXNvdXJjZXMudG9BcnJheShuZXcgSVJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKLQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VzKHIsIHNoZWxsLCB0aXRsZSk7Ci0JfQotCQotCS8qCi0JICogTWFrZXMgdGhlIGdpdmVuIHJlc291cmNlcyBjb21taXR0YWJsZS4gQ29tbWl0dGFibGUgbWVhbnMgdGhhdCBhbGwKLQkgKiByZXNvdXJjZXMgYXJlIHdyaXRlYWJsZSBhbmQgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2VzIGhhc24ndAotCSAqIGNoYW5nZWQgYnkgY2FsbGluZyA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+IGZvciBhIGdpdmVuIGZpbGUgb24KLQkgKiA8dHQ+SVdvcmtzcGFjZTwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHJlc291cmNlcyB0byBiZSBjaGVja2VkCi0JICogQHBhcmFtIHNoZWxsIHRoZSBTaGVsbCBwYXNzZWQgdG8gPGNvZGU+dmFsaWRhdGVFZGl0PC9jb2RlPiBhcyBhIGNvbnRleHQKLQkgKiBAcmV0dXJuIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIHJlc291cmNlcyBhcmUgY29tbWl0dGFibGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjdmFsaWRhdGVFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VzKElSZXNvdXJjZVtdIHJlc291cmNlcywgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSkgewotCQkKLQkJLy8gZ2V0IGFsbCByZWFkb25seSBmaWxlcwotCQlMaXN0IHJlYWRPbmx5RmlsZXM9IGdldFJlYWRvbmx5RmlsZXMocmVzb3VyY2VzKTsKLQkJaWYgKHJlYWRPbmx5RmlsZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCS8vIGdldCB0aW1lc3RhbXBzIG9mIHJlYWRvbmx5IGZpbGVzIGJlZm9yZSB2YWxpZGF0ZUVkaXQKLQkJTWFwIG9sZFRpbWVTdGFtcHM9IGNyZWF0ZU1vZGlmaWNhdGlvblN0YW1wTWFwKHJlYWRPbmx5RmlsZXMpOwotCQkKLQkJSUZpbGVbXSBmaWxlcz0gKElGaWxlW10pIHJlYWRPbmx5RmlsZXMudG9BcnJheShuZXcgSUZpbGVbcmVhZE9ubHlGaWxlcy5zaXplKCldKTsKLQkJSVN0YXR1cyBzdGF0dXM9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIHNoZWxsKTsKLQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJU3RyaW5nIG1lc3NhZ2U9IGdldFN0cmluZygiVmFsaWRhdGVFZGl0LmVycm9yLnVuYWJsZV90b19wZXJmb3JtIik7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCi0JCUlTdGF0dXMgbW9kaWZpZWQ9IG51bGw7Ci0JCU1hcCBuZXdUaW1lU3RhbXBzPSBjcmVhdGVNb2RpZmljYXRpb25TdGFtcE1hcChyZWFkT25seUZpbGVzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyPSBvbGRUaW1lU3RhbXBzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSUZpbGUgZmlsZT0gKElGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCUlTdGF0dXMgZW50cnk9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJQ29tcGFyZVVJUGx1Z2luLmdldFBsdWdpbklkKCksCi0JCQkJCQkJCVZBTElEQVRFX0VESVRfUFJPQkxFTSwKLQkJCQkJCQkJZ2V0Rm9ybWF0dGVkU3RyaW5nKCJWYWxpZGF0ZUVkaXQuZXJyb3Iuc3RpbGxSZWFkb25seSIsIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQludWxsKTsKLQkJCQltb2RpZmllZD0gYWRkU3RhdHVzKG1vZGlmaWVkLCBlbnRyeSk7Ci0JCQl9IGVsc2UgaWYgKCEgb2xkVGltZVN0YW1wcy5nZXQoZmlsZSkuZXF1YWxzKG5ld1RpbWVTdGFtcHMuZ2V0KGZpbGUpKSkgewotCQkJCUlTdGF0dXMgZW50cnk9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJQ29tcGFyZVVJUGx1Z2luLmdldFBsdWdpbklkKCksCi0JCQkJCQkJCVZBTElEQVRFX0VESVRfUFJPQkxFTSwKLQkJCQkJCQkJZ2V0Rm9ybWF0dGVkU3RyaW5nKCJWYWxpZGF0ZUVkaXQuZXJyb3IuZmlsZU1vZGlmaWVkIiwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW51bGwpOwotCQkJCW1vZGlmaWVkPSBhZGRTdGF0dXMobW9kaWZpZWQsIGVudHJ5KTsKLQkJCX0KLQkJfQotCQlpZiAobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2U9IGdldFN0cmluZygiVmFsaWRhdGVFZGl0LmVycm9yLnVuYWJsZV90b19wZXJmb3JtIik7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIG1vZGlmaWVkKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRSZWFkb25seUZpbGVzKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCQlMaXN0IHJlYWRPbmx5RmlsZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlc291cmNlPSByZXNvdXJjZXNbaV07Ci0JCQlSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzPSByZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2VBdHRyaWJ1dGVzICE9IG51bGwgJiYgcmVzb3VyY2VBdHRyaWJ1dGVzLmlzUmVhZE9ubHkoKSkJCi0JCQkJcmVhZE9ubHlGaWxlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiByZWFkT25seUZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBjcmVhdGVNb2RpZmljYXRpb25TdGFtcE1hcChMaXN0IGZpbGVzKSB7Ci0JCU1hcCBtYXA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gZmlsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJSUZpbGUgZmlsZT0gKElGaWxlKWl0ZXIubmV4dCgpOwotCQkJbWFwLnB1dChmaWxlLCBuZXcgTG9uZyhmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGFkZFN0YXR1cyhJU3RhdHVzIHN0YXR1cywgSVN0YXR1cyBlbnRyeSkgewotCQkKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIGVudHJ5OwotCQkJCi0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkoKE11bHRpU3RhdHVzKXN0YXR1cykuYWRkKGVudHJ5KTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlNdWx0aVN0YXR1cyByZXN1bHQ9IG5ldyBNdWx0aVN0YXR1cyhDb21wYXJlVUlQbHVnaW4uZ2V0UGx1Z2luSWQoKSwKLQkJCVZBTElEQVRFX0VESVRfUFJPQkxFTSwKLQkJCWdldFN0cmluZygiVmFsaWRhdGVFZGl0LmVycm9yLnVuYWJsZV90b19wZXJmb3JtIiksIG51bGwpOyAvLyROT04tTkxTLTEkIAotCQlyZXN1bHQuYWRkKHN0YXR1cyk7Ci0JCXJlc3VsdC5hZGQoZW50cnkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvLyBlbmNvZGluZwotCQotCS8qCi0JICogUmV0dXJucyBudWxsIGlmIGFuIGVycm9yIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRTdHJpbmcoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBlbmNvZGluZykgewotCQlpZiAoaXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXI9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQljaGFyW10gcGFydD0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgcmVhZD0gMDsKLQkJCXJlYWRlcj0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpKTsKLQotCQkJd2hpbGUgKChyZWFkPSByZWFkZXIucmVhZChwYXJ0KSkgIT0gLTEpCi0JCQkJYnVmZmVyLmFwcGVuZChwYXJ0LCAwLCByZWFkKTsKLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBOZWVkV29yawotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhcnNldChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUVuY29kZWRTdG9yYWdlKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKElFbmNvZGVkU3RvcmFnZSlyZXNvdXJjZSkuZ2V0Q2hhcnNldCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGZhbGwgIHRocm91Z2gKLQkJCX0KLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldEJ5dGVzKFN0cmluZyBzLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJYnl0ZVtdIGJ5dGVzPSBudWxsOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJ5dGVzPSBzLmdldEJ5dGVzKGVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJYnl0ZXM9IHMuZ2V0Qnl0ZXMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnl0ZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFN0cmluZyhJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlzPSBzYS5nZXRDb250ZW50cygpOwotCQlTdHJpbmcgZW5jb2Rpbmc9IG51bGw7Ci0JCWlmIChzYSBpbnN0YW5jZW9mIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKQotCQkJZW5jb2Rpbmc9ICgoSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3Ipc2EpLmdldENoYXJzZXQoKTsKLQkJaWYgKGVuY29kaW5nID09IG51bGwpCi0JCQllbmNvZGluZz0gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JCXJldHVybiBVdGlsaXRpZXMucmVhZFN0cmluZyhpcywgZW5jb2RpbmcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShJbnB1dFN0cmVhbSBpcykgewotCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1ZpZXdlckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVmlld2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBiMDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVmlld2VyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIENyZWF0ZXMgPGNvZGU+Vmlld2VyPC9jb2RlPnMgZnJvbSBhbiA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyRGVzY3JpcHRvciBpbXBsZW1lbnRzIElWaWV3ZXJEZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19BVFRSSUJVVEU9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OU19BVFRSSUJVVEU9ICJleHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBJVmlld2VyQ3JlYXRvciBmVmlld2VyQ3JlYXRvcjsKLQlwcml2YXRlIENsYXNzIGZWaWV3ZXJDbGFzczsKLQotCXB1YmxpYyBWaWV3ZXJEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJZkNvbmZpZ3VyYXRpb249IGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihWaWV3ZXIgY3VycmVudFZpZXdlciwgQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gbXApIHsKLQkJCi0JCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlci5nZXRDbGFzcygpID09IGZWaWV3ZXJDbGFzcykgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJldXNlZCB2aWV3ZXI6ICIgKyBjdXJyZW50Vmlld2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiBjdXJyZW50Vmlld2VyOwotCQl9Ci0JCQotCQlpZiAoZlZpZXdlckNyZWF0b3IgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmVmlld2VyQ3JlYXRvcj0gKElWaWV3ZXJDcmVhdG9yKSBmQ29uZmlndXJhdGlvbi5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX0FUVFJJQlVURSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0KLQkJaWYgKGZWaWV3ZXJDcmVhdG9yICE9IG51bGwpIHsKLQkJCVZpZXdlciB2aWV3ZXI9IGZWaWV3ZXJDcmVhdG9yLmNyZWF0ZVZpZXdlcihwYXJlbnQsIG1wKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCQlmVmlld2VyQ2xhc3M9IHZpZXdlci5nZXRDbGFzcygpOwotCQkJcmV0dXJuIHZpZXdlcjsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEVYVEVOU0lPTlNfQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1ZpZXdlclN3aXRjaGluZ0NhbmNlbGxlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9WaWV3ZXJTd2l0Y2hpbmdDYW5jZWxsZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyMzZmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1ZpZXdlclN3aXRjaGluZ0NhbmNlbGxlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGNsYXNzIFZpZXdlclN3aXRjaGluZ0NhbmNlbGxlZCBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9tZXJnZS9MaW5lQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9tZXJnZS9MaW5lQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUzNDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTGluZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLm1lcmdlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBJUmFuZ2VDb21wYXJhdG9yIGJyZWFrcyBhbiBpbnB1dCBzdHJlYW0gaW50byBsaW5lcy4KLSAqLwotY2xhc3MgTGluZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBJUmFuZ2VDb21wYXJhdG9yIHsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gZkxpbmVzOwotCi0gICAgcHVibGljIExpbmVDb21wYXJhdG9yKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpKTsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIEFycmF5TGlzdCBhciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYXIuYWRkKGxpbmUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkJLy8gc2lsZW50bHkgaWdub3JlZAotICAgICAgICB9Ci0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgaXMuY2xvc2UoKTsKLS8vICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotLy8gICAgICAgIH0KLSAgICAgICAgZkxpbmVzID0gKFN0cmluZ1tdKSBhci50b0FycmF5KG5ldyBTdHJpbmdbYXIuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldExpbmUoaW50IGl4KSB7Ci0gICAgICAgIHJldHVybiBmTGluZXNbaXhdOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yI2dldFJhbmdlQ291bnQoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmFuZ2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGZMaW5lcy5sZW5ndGg7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3IjcmFuZ2VzRXF1YWwoaW50LCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuSVJhbmdlQ29tcGFyYXRvciwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJhbmdlc0VxdWFsKGludCB0aGlzSW5kZXgsIElSYW5nZUNvbXBhcmF0b3Igb3RoZXIsCi0gICAgICAgICAgICBpbnQgb3RoZXJJbmRleCkgewotICAgICAgICBTdHJpbmcgczEgPSBmTGluZXNbdGhpc0luZGV4XTsKLSAgICAgICAgU3RyaW5nIHMyID0gKChMaW5lQ29tcGFyYXRvcikgb3RoZXIpLmZMaW5lc1tvdGhlckluZGV4XTsKLSAgICAgICAgcmV0dXJuIHMxLmVxdWFscyhzMik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3Ijc2tpcFJhbmdlQ29tcGFyaXNvbihpbnQsIGludCwgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3IpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2tpcFJhbmdlQ29tcGFyaXNvbihpbnQgbGVuZ3RoLCBpbnQgbWF4TGVuZ3RoLCBJUmFuZ2VDb21wYXJhdG9yIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL01lcmdlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhjYmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotY2xhc3MgTWVyZ2VNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZS5NZXJnZU1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotCXByaXZhdGUgTWVyZ2VNZXNzYWdlcygpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL01lcmdlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTExM2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1UZXh0QXV0b01lcmdlLmlucHV0RW5jb2RpbmdFcnJvcj0gVW5zdXBwb3J0ZWQgZW5jb2RpbmcgZm9yIGlucHV0IHN0cmVhbXMKLVRleHRBdXRvTWVyZ2Uub3V0cHV0RW5jb2RpbmdFcnJvcj0gVW5zdXBwb3J0ZWQgZW5jb2RpbmcgZm9yIG91dHB1dCBzdHJlYW1zCi1UZXh0QXV0b01lcmdlLm91dHB1dElPRXJyb3I9IElPIGVycm9yIG9uIHdyaXRpbmcKLVRleHRBdXRvTWVyZ2UuY29uZmxpY3Q9IENvbmZsaWN0OiBjYW5ub3QgYXV0byBtZXJnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9tZXJnZS9UZXh0U3RyZWFtTWVyZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL1RleHRTdHJlYW1NZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjNTA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL1RleHRTdHJlYW1NZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLm1lcmdlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuUmFuZ2VEaWZmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5SYW5nZURpZmZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogQSBzaW1wbGUgbWVyZ2VyIGZvciBzdHJlYW1zIGNvbnRhaW5pbmcgdGV4dCBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIFRleHRTdHJlYW1NZXJnZXIgaW1wbGVtZW50cyBJU3RyZWFtTWVyZ2VyIHsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZS5JQXV0b01lcmdlciNhdXRvbWVyZ2UoamF2YS5pby5PdXRwdXRTdHJlYW0sCi0gICAgICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2UsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2UsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2UsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0YXR1cyBtZXJnZShPdXRwdXRTdHJlYW0gb3V0cHV0LCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcsCi0JCQlJbnB1dFN0cmVhbSBhbmNlc3RvciwgU3RyaW5nIGFuY2VzdG9yRW5jb2RpbmcsCi0JCQlJbnB1dFN0cmVhbSB0YXJnZXQsIFN0cmluZyB0YXJnZXRFbmNvZGluZywKLQkJCUlucHV0U3RyZWFtIG90aGVyLCBTdHJpbmcgb3RoZXJFbmNvZGluZywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAKLSAgICAgICAgTGluZUNvbXBhcmF0b3IgYSwgdCwgbzsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYT0gbmV3IExpbmVDb21wYXJhdG9yKGFuY2VzdG9yLCBhbmNlc3RvckVuY29kaW5nKTsKLSAgICAgICAgICAgIHQ9IG5ldyBMaW5lQ29tcGFyYXRvcih0YXJnZXQsIHRhcmdldEVuY29kaW5nKTsKLSAgICAgICAgICAgIG89IG5ldyBMaW5lQ29tcGFyYXRvcihvdGhlciwgb3RoZXJFbmNvZGluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29tcGFyZVVJLlBMVUdJTl9JRCwgMSwgTWVyZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRBdXRvTWVyZ2UuaW5wdXRFbmNvZGluZ0Vycm9yIiksIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhciBsaW5lU2VwYXJhdG9yPSAnXG4nOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSYW5nZURpZmZlcmVuY2VbXSBkaWZmcyA9IFJhbmdlRGlmZmVyZW5jZXIuZmluZFJhbmdlcyhtb25pdG9yLCBhLCB0LCBvKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWZmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFJhbmdlRGlmZmVyZW5jZSByZCA9IGRpZmZzW2ldOwotICAgICAgICAgICAgICAgIHN3aXRjaCAocmQua2luZCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSYW5nZURpZmZlcmVuY2UuQU5DRVNUT1I6CS8vIHBzZXVkbyBjb25mbGljdAotICAgICAgICAgICAgICAgIGNhc2UgUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFOgotICAgICAgICAgICAgICAgIGNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcmQucmlnaHRTdGFydCgpOyBqIDwgcmQucmlnaHRFbmQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcz0gby5nZXRMaW5lKGopOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHMuZ2V0Qnl0ZXMob3V0cHV0RW5jb2RpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShsaW5lU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgUmFuZ2VEaWZmZXJlbmNlLkxFRlQ6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSByZC5sZWZ0U3RhcnQoKTsgaiA8IHJkLmxlZnRFbmQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcz0gdC5nZXRMaW5lKGopOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHMuZ2V0Qnl0ZXMob3V0cHV0RW5jb2RpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShsaW5lU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgUmFuZ2VEaWZmZXJlbmNlLkNPTkZMSUNUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb21wYXJlVUkuUExVR0lOX0lELCBDT05GTElDVCwgTWVyZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRBdXRvTWVyZ2UuY29uZmxpY3QiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb21wYXJlVUkuUExVR0lOX0lELCAxLCBNZXJnZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dEF1dG9NZXJnZS5vdXRwdXRFbmNvZGluZ0Vycm9yIiksIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvbXBhcmVVSS5QTFVHSU5fSUQsIDEsIE1lcmdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0QXV0b01lcmdlLm91dHB1dElPRXJyb3IiKSwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvQ29tcGFyZVdpdGhQYXRjaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9Db21wYXJlV2l0aFBhdGNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDY1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9Db21wYXJlV2l0aFBhdGNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2g7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLio7Ci0KLQotcHVibGljIGNsYXNzIENvbXBhcmVXaXRoUGF0Y2hBY3Rpb24gZXh0ZW5kcyBCYXNlQ29tcGFyZUFjdGlvbiB7Ci0KLQlzdGF0aWMgY2xhc3MgUGF0Y2hXaXphcmREaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cgewotCQotCQlQYXRjaFdpemFyZERpYWxvZyhTaGVsbCBwYXJlbnQsIElXaXphcmQgd2l6YXJkKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHdpemFyZCk7Ci0JCQkKLQkJCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCQlzZXRNaW5pbXVtUGFnZVNpemUoNzAwLCA1MDApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gVXRpbGl0aWVzLmdldFJlc291cmNlcyhzZWxlY3Rpb24pLmxlbmd0aCA9PSAxOwotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5CYXNlQ29tcGFyZUFjdGlvbiNydW4ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlQYXRjaFdpemFyZCB3aXphcmQ9IG5ldyBQYXRjaFdpemFyZChzZWxlY3Rpb24pOwotCQkKLQkJaWYgKGFyZUFsbEVkaXRvcnNTYXZlZCgpKSB7Ci0JCQlQYXRjaFdpemFyZERpYWxvZyBkaWFsb2c9IG5ldyBQYXRjaFdpemFyZERpYWxvZyhDb21wYXJlVUlQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXJlQWxsRWRpdG9yc1NhdmVkKCl7Ci0JCWlmIChDb21wYXJlVUlQbHVnaW4uZ2V0RGlydHlFZGl0b3JzKCkubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCEgc2F2ZUFsbERpcnR5RWRpdG9ycygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTaGVsbCBzaGVsbD0gQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCk7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIGlzbid0IGNhbmNlbGFibGUuCi0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWJvb2xlYW4gYXV0b0J1aWxkPSBkZXNjcmlwdGlvbi5pc0F1dG9CdWlsZGluZygpOwotCQkJZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQl0cnkgewotCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpLnJ1bihmYWxzZSwgZmFsc2UsIGNyZWF0ZVJ1bm5hYmxlKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkKTsKLQkJCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgc2hlbGwsIFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRjaEFjdGlvbi5FeGNlcHRpb25UaXRsZSIpLCBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiRXhjZXB0aW9uIikpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgc2hlbGwsIFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRjaEFjdGlvbi5FeGNlcHRpb25UaXRsZSIpLCBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiRXhjZXB0aW9uIikpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7CQkJCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOyAvLyBDYW4ndCBoYXBwZW4uIE9wZXJhdGlvbiBpc24ndCBjYW5jZWxhYmxlLgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgY3JlYXRlUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJCQlJRWRpdG9yUGFydFtdIGVkaXRvcnNUb1NhdmU9IENvbXBhcmVVSVBsdWdpbi5nZXREaXJ0eUVkaXRvcnMoKTsKLQkJCQlwbS5iZWdpblRhc2soUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoQWN0aW9uLlNhdmluZ0RpcnR5RWRpdG9yc1Rhc2siKSwgZWRpdG9yc1RvU2F2ZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVkaXRvcnNUb1NhdmUubGVuZ3RoOyBpKyspIHsKLQkJCQkJZWRpdG9yc1RvU2F2ZVtpXS5kb1NhdmUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMSkpOwotCQkJCQlwbS53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCXBtLmRvbmUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZUFsbERpcnR5RWRpdG9ycygpIHsKLQkJaWYgKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5nZXRTYXZlQWxsRWRpdG9ycygpKSAvL211c3Qgc2F2ZSBldmVyeXRoaW5nCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlzdERpYWxvZyBkaWFsb2c9IG5ldyBMaXN0RGlhbG9nKENvbXBhcmVVSVBsdWdpbi5nZXRTaGVsbCgpKSB7Ci0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQlDb21wb3NpdGUgcmVzdWx0PSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQkJZmluYWwgQnV0dG9uIGNoZWNrPSBuZXcgQnV0dG9uKHJlc3VsdCwgU1dULkNIRUNLKTsKLQkJCQljaGVjay5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRjaEFjdGlvbi5BbHdheXNTYXZlUXVlc3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGVjay5zZXRTZWxlY3Rpb24oQ29tcGFyZVByZWZlcmVuY2VQYWdlLmdldFNhdmVBbGxFZGl0b3JzKCkpOwotCQkJCWNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlDb21wYXJlUHJlZmVyZW5jZVBhZ2Uuc2V0U2F2ZUFsbEVkaXRvcnMoY2hlY2suZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQlhcHBseURpYWxvZ0ZvbnQocmVzdWx0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0VGl0bGUoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoQWN0aW9uLlNhdmVBbGxRdWVzdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0QWRkQ2FuY2VsQnV0dG9uKHRydWUpOwotCQlkaWFsb2cuc2V0TGFiZWxQcm92aWRlcihjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hBY3Rpb24uU2F2ZUFsbERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChBcnJheXMuYXNMaXN0KENvbXBhcmVVSVBsdWdpbi5nZXREaXJ0eUVkaXRvcnMoKSkpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0s7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGVJbWFnZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9EaWZmLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0RpZmYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzMDNmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0RpZmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmZXJlbmNlcjsKLQotCi0vKiBwYWNrYWdlICovIGNsYXNzIERpZmYgewotCQkKLQlJUGF0aCBmT2xkUGF0aCwgZk5ld1BhdGg7Ci0JbG9uZyBmT2xkRGF0ZSwgZk5ld0RhdGU7CS8vIGlmIDA6IG5vIGZpbGUKLQlMaXN0IGZIdW5rcz0gbmV3IEFycmF5TGlzdCgpOwotCWJvb2xlYW4gZk1hdGNoZXM9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNFbmFibGVkMj0gdHJ1ZTsKLQlTdHJpbmcgZlJlamVjdGVkOwotCi0JCi0gCS8qIHBhY2thZ2UgKi8gRGlmZihJUGF0aCBvbGRQYXRoLCBsb25nIG9sZERhdGUsIElQYXRoIG5ld1BhdGgsIGxvbmcgbmV3RGF0ZSkgewotCQlmT2xkUGF0aD0gb2xkUGF0aDsKLQkJZk9sZERhdGU9IG9sZFBhdGggPT0gbnVsbCA/IDAgOiBvbGREYXRlOwotCQlmTmV3UGF0aD0gbmV3UGF0aDsKLQkJZk5ld0RhdGU9IG5ld1BhdGggPT0gbnVsbCA/IDAgOiBuZXdEYXRlOwkKLQl9Ci0JCi0JYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmSXNFbmFibGVkMjsKLQl9Ci0JCi0Jdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gYikgewotCQlmSXNFbmFibGVkMj0gYjsKLQl9Ci0JCi0Jdm9pZCByZXZlcnNlKCkgewotCQlJUGF0aCB0cD0gZk9sZFBhdGg7Ci0JCWZPbGRQYXRoPSBmTmV3UGF0aDsKLQkJZk5ld1BhdGg9IHRwOwotCQkKLQkJbG9uZyB0PSBmT2xkRGF0ZTsKLQkJZk9sZERhdGU9IGZOZXdEYXRlOwotCQlmTmV3RGF0ZT0gdDsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXI9IGZIdW5rcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUh1bmsgaHVuaz0gKEh1bmspIGl0ZXIubmV4dCgpOwotCQkJaHVuay5yZXZlcnNlKCk7Ci0JCX0KLQl9Ci0JCi0JSHVua1tdIGdldEh1bmtzKCkgewotCQlyZXR1cm4gKEh1bmtbXSkgZkh1bmtzLnRvQXJyYXkobmV3IEh1bmtbZkh1bmtzLnNpemUoKV0pOwotCX0KLQotCUlQYXRoIGdldFBhdGgoKSB7Ci0JCWlmIChmT2xkUGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIGZPbGRQYXRoOwotCQlyZXR1cm4gZk5ld1BhdGg7Ci0JfQotCQotCXZvaWQgZmluaXNoKCkgewotCQlpZiAoZkh1bmtzLnNpemUoKSA9PSAxKSB7Ci0JCQlIdW5rIGg9IChIdW5rKSBmSHVua3MuZ2V0KDApOwotCQkJaWYgKGguZk5ld0xlbmd0aCA9PSAwKSB7Ci0JCQkJZk5ld0RhdGU9IDA7Ci0JCQkJZk5ld1BhdGg9IGZPbGRQYXRoOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gdm9pZCBhZGQoSHVuayBodW5rKSB7Ci0JCWZIdW5rcy5hZGQoaHVuayk7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gaW50IGdldFR5cGUoKSB7Ci0JCWlmIChmT2xkRGF0ZSA9PSAwKQotCQkJcmV0dXJuIERpZmZlcmVuY2VyLkFERElUSU9OOwotCQlpZiAoZk5ld0RhdGUgPT0gMCkKLQkJCXJldHVybiBEaWZmZXJlbmNlci5ERUxFVElPTjsKLQkJcmV0dXJuIERpZmZlcmVuY2VyLkNIQU5HRTsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oaW50IHN0cmlwKSB7Ci0JCUlQYXRoIHBhdGg9IGZPbGRQYXRoOwotCQlpZiAoZk9sZERhdGUgPT0gMCkKLQkJCXBhdGg9IGZOZXdQYXRoOwotCQlpZiAoc3RyaXAgPiAwICYmIHN0cmlwIDwgcGF0aC5zZWdtZW50Q291bnQoKSkKLQkJCXBhdGg9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzdHJpcCk7Ci0JCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSHVuay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9IdW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDU4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9IdW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIEh1bmsgZGVzY3JpYmVzIGEgcmFuZ2Ugb2YgY2hhbmdlZCBsaW5lcyBhbmQgc29tZSBjb250ZXh0IGxpbmVzLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIEh1bmsgewotCQotCURpZmYgZlBhcmVudDsKLQlpbnQgZk9sZFN0YXJ0LCBmT2xkTGVuZ3RoOwotCWludCBmTmV3U3RhcnQsIGZOZXdMZW5ndGg7Ci0JU3RyaW5nW10gZkxpbmVzOwotCWJvb2xlYW4gZk1hdGNoZXM9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNFbmFibGVkPSB0cnVlOwotCQotCQotCS8qIHBhY2thZ2UgKi8gSHVuayhEaWZmIHBhcmVudCwgaW50W10gb2xkUmFuZ2UsIGludFtdIG5ld1JhbmdlLCBMaXN0IGxpbmVzKSB7Ci0JCQotCQlmUGFyZW50PSBwYXJlbnQ7Ci0JCWlmIChmUGFyZW50ICE9IG51bGwpCi0JCQlmUGFyZW50LmFkZCh0aGlzKTsKLQkJCi0JCWlmIChvbGRSYW5nZVswXSA+IDApCi0JCQlmT2xkU3RhcnQ9IG9sZFJhbmdlWzBdLTE7CS8vIGxpbmUgbnVtYmVyIHN0YXJ0IGF0IDAhCi0JCWVsc2UKLQkJCWZPbGRTdGFydD0gMDsKLQkJZk9sZExlbmd0aD0gb2xkUmFuZ2VbMV07Ci0JCWlmIChuZXdSYW5nZVswXSA+IDApCi0JCQlmTmV3U3RhcnQ9IG5ld1JhbmdlWzBdLTE7CS8vIGxpbmUgbnVtYmVyIHN0YXJ0IGF0IDAhCi0JCWVsc2UKLQkJCWZOZXdTdGFydD0gMDsKLQkJZk5ld0xlbmd0aD0gbmV3UmFuZ2VbMV07Ci0JCQotCQlmTGluZXM9IChTdHJpbmdbXSkgbGluZXMudG9BcnJheShuZXcgU3RyaW5nW2xpbmVzLnNpemUoKV0pOwotCX0KLQkJCi0JYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmSXNFbmFibGVkOwotCX0KLQkKLQl2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLQkJZklzRW5hYmxlZD0gZW5hYmxlOwotCX0KLQkKLQl2b2lkIHJldmVyc2UoKSB7Ci0JCWludCB0PSBmT2xkU3RhcnQ7Ci0JCWZPbGRTdGFydD0gZk5ld1N0YXJ0OwotCQlmTmV3U3RhcnQ9IHQ7Ci0JCQotCQl0PSBmT2xkTGVuZ3RoOwotCQlmT2xkTGVuZ3RoPSBmTmV3TGVuZ3RoOwotCQlmTmV3TGVuZ3RoPSB0OwotCQkKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMaW5lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxpbmU9IGZMaW5lc1tpXTsKLQkJCWNoYXIgYz0gbGluZS5jaGFyQXQoMCk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJysnOgotCQkJCWZMaW5lc1tpXT0gJy0nICsgbGluZS5zdWJzdHJpbmcoMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICctJzoKLQkJCQlmTGluZXNbaV09ICcrJyArIGxpbmUuc3Vic3RyaW5nKDEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBodW5rLgotCSAqIEVhY2ggbGluZSBzdGFydHMgd2l0aCBhIGNvbnRyb2wgY2hhcmFjdGVyLiBUaGVpciBtZWFuaW5nIGlzIGFzIGZvbGxvd3M6Ci0JICogPHVsPgotCSAqIDxsaT4KLQkgKiAnKyc6IGFkZCB0aGUgbGluZQotCSAqIDxsaT4KLQkgKiAnLSc6IGRlbGV0ZSB0aGUgbGluZQotCSAqIDxsaT4KLQkgKiAnICc6IG5vIGNoYW5nZSwgY29udGV4dCBsaW5lCi0JICogPC91bD4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29udGVudCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmTGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBsaW5lPSBmTGluZXNbaV07Ci0JCQlzYi5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgUGF0Y2hlci5sZW5ndGgobGluZSkpKTsKLQkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIGEgZGVzY3JpcHRpdmUgU3RyaW5nIGZvciB0aGlzIGh1bmsuCi0JICogSXQgaXMgaW4gdGhlIGZvcm0gb2xkX3N0YXJ0LG9sZF9sZW5ndGggLT4gbmV3X3N0YXJ0LG5ld19sZW5ndGguCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmdCdWZmZXIgc2I9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZk9sZFN0YXJ0KSk7Ci0JCXNiLmFwcGVuZCgnLCcpOwotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmT2xkTGVuZ3RoKSk7Ci0JCXNiLmFwcGVuZCgiIC0+ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZOZXdTdGFydCkpOwotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZk5ld0xlbmd0aCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JU3RyaW5nIGdldFJlamVjdGVkRGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoIkBAIC0iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmT2xkU3RhcnQpKTsKLQkJc2IuYXBwZW5kKCcsJyk7Ci0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZPbGRMZW5ndGgpKTsKLQkJc2IuYXBwZW5kKCIgKyIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZOZXdTdGFydCkpOwotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZk5ld0xlbmd0aCkpOwotCQlzYi5hcHBlbmQoIiBAQCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSW5wdXRQYXRjaFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSW5wdXRQYXRjaFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxZjNlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0lucHV0UGF0Y2hQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLklDb21wYXJlQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSW5wdXRQYXRjaFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8vIGNvbnN0YW50cwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIPSAyNTA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09NQk9fSElTVE9SWV9MRU5HVEg9IDU7Ci0JCi0JLy8gZGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX05BTUU9ICJQYXRjaFdpemFyZFBhZ2UxIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9QQVRDSF9GSUxFU19JRD0gUEFHRV9OQU1FICsgIi5QQVRDSF9GSUxFUyI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfVVNFX0NMSVBCT0FSRF9JRD0gUEFHRV9OQU1FICsgIi5VU0VfQ0xJUEJPQVJEIjsJLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBjaGFyIFNFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSAoImZpbGUuc2VwYXJhdG9yIikuY2hhckF0ICgwKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgYm9vbGVhbiBmU2hvd0Vycm9yPSBmYWxzZTsKLQkKLQkvLyBTV1Qgd2lkZ2V0cwotCXByaXZhdGUgQnV0dG9uIGZVc2VDbGlwYm9hcmRCdXR0b247Ci0JcHJpdmF0ZSBDb21ibyBmUGF0Y2hGaWxlTmFtZUZpZWxkOwotCXByaXZhdGUgQnV0dG9uIGZQYXRjaEZpbGVCcm93c2VCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZlVzZVBhdGNoRmlsZUJ1dHRvbjsKLQlwcml2YXRlIEdyb3VwIGZQYXRjaEZpbGVHcm91cDsKLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciBmUGF0Y2hUYXJnZXRzOwotCXByaXZhdGUgUGF0Y2hXaXphcmQgZlBhdGNoV2l6YXJkOwotCi0KLQlJbnB1dFBhdGNoUGFnZShQYXRjaFdpemFyZCBwdykgewotCQlzdXBlcigiSW5wdXRQYXRjaFBhZ2UiLCBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UudGl0bGUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmUGF0Y2hXaXphcmQ9IHB3OwotCQlzZXRNZXNzYWdlKFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5tZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JICogR2V0IGEgcGF0aCBmcm9tIHRoZSBzdXBwbGllZCB0ZXh0IHdpZGdldC4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRQYXRoRnJvbVRleHQoVGV4dCB0ZXh0RmllbGQpIHsKLQkJcmV0dXJuIChuZXcgUGF0aCh0ZXh0RmllbGQuZ2V0VGV4dCgpKSkubWFrZUFic29sdXRlKCk7Ci0JfQotCi0JLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0UGF0Y2hOYW1lKCkgewotCQlpZiAoZ2V0VXNlQ2xpcGJvYXJkKCkpCi0JCQlyZXR1cm4gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLkNsaXBib2FyZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXRQYXRjaEZpbGVQYXRoKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQotCQlDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotCQlMYWJlbCBsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CQotCQlsLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlNlbGVjdElucHV0IikpOyAvLyROT04tTkxTLTEkCi0JCWJ1aWxkSW5wdXRHcm91cChjb21wb3NpdGUpOwotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwkvLyBhIHNwYWNlcgkJCi0JCQotCQlidWlsZFBhdGNoRmlsZUdyb3VwKGNvbXBvc2l0ZSk7CQkKLQkJCQotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0KLQkJdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgSUNvbXBhcmVDb250ZXh0SWRzLlBBVENIX0lOUFVUX1dJWkFSRF9QQUdFKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhRG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBJV2l6YXJkUGFnZS4KLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCQkKLQkJUGF0Y2hlciBwYXRjaGVyPSAoKFBhdGNoV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0UGF0Y2hlcigpOwotCQkKLQkJU3RyaW5nIHNvdXJjZTsKLQkJLy8gQ3JlYXRlIGEgcmVhZGVyIGZvciB0aGUgaW5wdXQKLQkJUmVhZGVyIHJlYWRlcj0gbnVsbDsKLQkJaWYgKGdldFVzZUNsaXBib2FyZCgpKSB7Ci0JCQlDb250cm9sIGM9IGdldENvbnRyb2woKTsKLQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlDbGlwYm9hcmQgY2xpcGJvYXJkPSBuZXcgQ2xpcGJvYXJkKGMuZ2V0RGlzcGxheSgpKTsKLQkJCQlPYmplY3Qgbz0gY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCQlyZWFkZXI9IG5ldyBTdHJpbmdSZWFkZXIoKFN0cmluZylvKTsKLQkJCX0KLQkJCXNvdXJjZT0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLkNsaXBib2FyZC50aXRsZSIpOwkvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgcGF0Y2hGaWxlUGF0aD0gZ2V0UGF0Y2hGaWxlUGF0aCgpOwotCQkJaWYgKHBhdGNoRmlsZVBhdGggIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlcj0gbmV3IEZpbGVSZWFkZXIocGF0Y2hGaWxlUGF0aCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG51bGwsCi0JCQkJCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuUGF0Y2hFcnJvckRpYWxvZy50aXRsZSIpLAkvLyROT04tTkxTLTEkCi0JCQkJCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuUGF0Y2hGaWxlTm90Rm91bmQubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXNvdXJjZT0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlBhdGNoRmlsZS50aXRsZSIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIHBhcnNlIHRoZSBpbnB1dAotCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcGF0Y2hlci5wYXJzZShuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG51bGwsCi0JCQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5QYXRjaEVycm9yRGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQgCi0JCQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5QYXJzZUVycm9yLm1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQkJCi0JCURpZmZbXSBkaWZmcz0gcGF0Y2hlci5nZXREaWZmcygpOwotCQlpZiAoZGlmZnMgPT0gbnVsbCB8fCBkaWZmcy5sZW5ndGggPT0gMCkgewotCQkJU3RyaW5nIGZvcm1hdD0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLk5vRGlmZnNGb3VuZC5mb3JtYXQiKTsJLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1lc3NhZ2U9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgc291cmNlIH0pOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obnVsbCwKLQkJCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuUGF0Y2hFcnJvckRpYWxvZy50aXRsZSIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJCi0JCS8vIGlmIHNlbGVjdGVkIHRhcmdldCBpcyBmaWxlIGVuc3VyZSB0aGF0IHBhdGNoIGZpbGUKLQkJLy8gY29udGFpbnMgb25seSBhIHBhdGNoIGZvciBhIHNpbmdsZSBmaWxlCi0JCUlSZXNvdXJjZSB0YXJnZXQ9IGZQYXRjaFdpemFyZC5nZXRUYXJnZXQoKTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlICYmIGRpZmZzLmxlbmd0aCA+IDEpIHsKLQkJCVN0cmluZyBmb3JtYXQ9IFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5TaW5nbGVGaWxlRXJyb3IuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtZXNzYWdlPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBTdHJpbmdbXSB7IHNvdXJjZSB9KTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsCi0JCQkJUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlBhdGNoRXJyb3JEaWFsb2cudGl0bGUiKSwgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCQotCQkvLyBndWVzcyBwcmVmaXggY291bnQKLQkJaW50IGd1ZXNzPSAwOyAvLyBndWVzc1ByZWZpeChkaWZmcyk7Ci0JCXBhdGNoZXIuc2V0U3RyaXBQcmVmaXhTZWdtZW50cyhndWVzcyk7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKCk7Ci0JfQotCQkJCi0JLyogKG5vbi1KYXZhRG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBJV2l6YXJkUGFnZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJLy8gd2UgY2FuJ3QgY2FsbCBnZXROZXh0UGFnZSB0byBkZXRlcm1pbmUgaWYgZmxpcHBpbmcgaXMgYWxsb3dlZCBzaW5jZSBjb21wdXRpbmcKLQkJLy8gdGhlIG5leHQgcGFnZSBpcyBxdWl0ZSBleHBlbnNpdmUuIFNvIHdlIHNheSB5ZXMgaWYgdGhlIHBhZ2UgaXMgY29tcGxldGUuCi0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlUGF0Y2hGaWxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWZQYXRjaEZpbGVOYW1lRmllbGQuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUGF0Y2hGaWxlQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQl9Ci0KLQkvKgotCSAqCUNyZWF0ZSB0aGUgZ3JvdXAgZm9yIHNlbGVjdGluZyB0aGUgcGF0Y2ggZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZFBhdGNoRmlsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCWZQYXRjaEZpbGVHcm91cD0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlmUGF0Y2hGaWxlR3JvdXAuc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuU2VsZWN0UGF0Y2gudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAzOwotCQlmUGF0Y2hGaWxlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZQYXRjaEZpbGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCS8vIDFzdCByb3cKLQkJZlVzZVBhdGNoRmlsZUJ1dHRvbj0gbmV3IEJ1dHRvbihmUGF0Y2hGaWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWZVc2VQYXRjaEZpbGVCdXR0b24uc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuRmlsZUJ1dHRvbi50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmUGF0Y2hGaWxlTmFtZUZpZWxkPSBuZXcgQ29tYm8oZlBhdGNoRmlsZUdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkvL2dkLmhvcml6b250YWxJbmRlbnQ9IDg7Ci0JCWdkLndpZHRoSGludD0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWZQYXRjaEZpbGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlmUGF0Y2hGaWxlQnJvd3NlQnV0dG9uPSBuZXcgQnV0dG9uKGZQYXRjaEZpbGVHcm91cCwgU1dULlBVU0gpOwotCQlmUGF0Y2hGaWxlQnJvd3NlQnV0dG9uLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLkNob29zZUZpbGVCdXR0b24udGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmUGF0Y2hGaWxlQnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkKLQkJLy8gMm5kIHJvdwotCQlmVXNlQ2xpcGJvYXJkQnV0dG9uPSBuZXcgQnV0dG9uKGZQYXRjaEZpbGVHcm91cCwgU1dULlJBRElPKTsKLQkJZlVzZUNsaXBib2FyZEJ1dHRvbi5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5Vc2VDbGlwYm9hcmRCdXR0b24udGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW49IDI7Ci0JCWZVc2VDbGlwYm9hcmRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQotCQkvLyBBZGQgbGlzdGVuZXJzCi0JCWZVc2VQYXRjaEZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWZTaG93RXJyb3I9IHRydWU7Ci0JCQkJCXNldEVuYWJsZVBhdGNoRmlsZSghZ2V0VXNlQ2xpcGJvYXJkKCkpOwotCQkJCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZlBhdGNoRmlsZU5hbWVGaWVsZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2V0U291cmNlTmFtZShmUGF0Y2hGaWxlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmUGF0Y2hGaWxlTmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlmU2hvd0Vycm9yPSB0cnVlOwotCQkJCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZlBhdGNoRmlsZUJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlUGF0Y2hGaWxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JCS8vZlBhdGNoRmlsZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZElucHV0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJUGF0Y2hXaXphcmQgcHc9IChQYXRjaFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCUlSZXNvdXJjZSB0YXJnZXQ9IHB3LmdldFRhcmdldCgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gdGFyZ2V0LmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlUm9vdCByb290PSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQkKLQkJVHJlZSB0cmVlPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQ9IDIwMDsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWZQYXRjaFRhcmdldHM9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIodHJlZSk7Ci0JCWZQYXRjaFRhcmdldHMuc2V0TGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKLQkJZlBhdGNoVGFyZ2V0cy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJZlBhdGNoVGFyZ2V0cy5zZXRTb3J0ZXIobmV3IFdvcmtiZW5jaFZpZXdlclNvcnRlcigpKTsKLQkJZlBhdGNoVGFyZ2V0cy5zZXRJbnB1dChyb290KTsKLQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQlmUGF0Y2hUYXJnZXRzLmV4cGFuZFRvTGV2ZWwodGFyZ2V0LCAwKTsKLQkJCWZQYXRjaFRhcmdldHMuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRhcmdldCkpOwotCQl9Ci0JCQotCQkvLyByZWdpc3RlciBsaXN0ZW5lcnMKLQkJZlBhdGNoVGFyZ2V0cy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlmUGF0Y2hXaXphcmQuc2V0VGFyZ2V0cyhVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKGV2ZW50LmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkJCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoaXMgcGFnZSdzIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpIHsKLQkJCi0JCVN0cmluZyBlcnJvcj0gbnVsbDsKLQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZlBhdGNoVGFyZ2V0cy5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBhbnlTZWxlY3RlZD0gc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCWlmICghYW55U2VsZWN0ZWQpCi0JCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLk5vdGhpbmdTZWxlY3RlZC5tZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlib29sZWFuIGdvdFBhdGNoPSBmYWxzZTsKLQkJaWYgKGdldFVzZUNsaXBib2FyZCgpKSB7Ci0JCQlDb250cm9sIGM9IGdldENvbnRyb2woKTsKLQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlDbGlwYm9hcmQgY2xpcGJvYXJkPSBuZXcgQ2xpcGJvYXJkKGMuZ2V0RGlzcGxheSgpKTsKLQkJCQlPYmplY3Qgbz0gY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzPSAoKFN0cmluZykgbykudHJpbSgpOwotCQkJCQlpZiAocy5sZW5ndGgoKSA+IDApCi0JCQkJCQlnb3RQYXRjaD0gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJZXJyb3I9IFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5DbGlwYm9hcmRJc0VtcHR5Lm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZQotCQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLk5vVGV4dEluQ2xpcGJvYXJkLm1lc3NhZ2UiKTsJCQkJCSAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UKLQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLkNvdWxkTm90UmVhZENsaXBib2FyZC5tZXNzYWdlIik7CQkJCQkgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHBhdGg9IGZQYXRjaEZpbGVOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotCQkJCUZpbGUgZmlsZT0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJZ290UGF0Y2g9IGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmxlbmd0aCgpID4gMDsKLQkJCQlpZiAoIWdvdFBhdGNoKQotCQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLkNhbm5vdExvY2F0ZVBhdGNoLm1lc3NhZ2UiKSArIHBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3I9IFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5Ob0ZpbGVOYW1lLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlzZXRQYWdlQ29tcGxldGUoYW55U2VsZWN0ZWQgJiYgZ290UGF0Y2gpOwotCQlpZiAoZlNob3dFcnJvcikKLQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhdGNoRmlsZUJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCWRpYWxvZy5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5TZWxlY3RQYXRjaEZpbGVEaWFsb2cudGl0bGUiKSk7CQkgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGF0Y2hGaWxlUGF0aD0gZ2V0UGF0Y2hGaWxlUGF0aCgpOwotCQlpZiAocGF0Y2hGaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbGFzdFNlZ21lbnQ9IHBhdGNoRmlsZVBhdGgubGFzdEluZGV4T2YoU0VQQVJBVE9SKTsKLQkJCWlmIChsYXN0U2VnbWVudCA+IDApIHsKLQkJCQlwYXRjaEZpbGVQYXRoPSBwYXRjaEZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2VnbWVudCk7Ci0JCQl9Ci0JCX0KLQkJZGlhbG9nLnNldEZpbHRlclBhdGgocGF0Y2hGaWxlUGF0aCk7Ci0JCVN0cmluZyByZXM9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXBhdGNoRmlsZVBhdGg9IGRpYWxvZy5nZXRGaWxlTmFtZSgpOwotCQlJUGF0aCBmaWx0ZXJQYXRoPSBuZXcgUGF0aChkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLQkJSVBhdGggcGF0aD0gZmlsdGVyUGF0aC5hcHBlbmQocGF0Y2hGaWxlUGF0aCkubWFrZUFic29sdXRlKCk7CQotCQlwYXRjaEZpbGVQYXRoPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJLy9mRGlhbG9nU2V0dGluZ3MucHV0KElVSUNvbnN0YW50cy5ESUFMT0dTVE9SRV9MQVNURVhUSkFSLCBmaWx0ZXJQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQotCQlmUGF0Y2hGaWxlTmFtZUZpZWxkLnNldFRleHQocGF0Y2hGaWxlUGF0aCk7Ci0JCS8vc2V0U291cmNlTmFtZShwYXRjaEZpbGVQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc291cmNlIG5hbWUgb2YgdGhlIGltcG9ydCB0byBiZSB0aGUgc3VwcGxpZWQgcGF0aC4KLQkgKiBBZGRzIHRoZSBuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZQotCSAqIHNvdXJjZSBjb21ibyBhbmQgc2VsZWN0cyBpdC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGJlIGFkZGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlTmFtZShTdHJpbmcgcGF0aCkgewotCQotCQlpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKLQkKLQkJCVN0cmluZ1tdIGN1cnJlbnRJdGVtcz0gZlBhdGNoRmlsZU5hbWVGaWVsZC5nZXRJdGVtcygpOwotCQkJaW50IHNlbGVjdGlvbkluZGV4PSAtMTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBjdXJyZW50SXRlbXMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGN1cnJlbnRJdGVtc1tpXS5lcXVhbHMocGF0aCkpCi0JCQkJCXNlbGVjdGlvbkluZGV4PSBpOwotCQkJCi0JCQlpZiAoc2VsZWN0aW9uSW5kZXggPCAwKSB7CS8vIG5vdCBmb3VuZCBpbiBoaXN0b3J5Ci0JCQkJaW50IG9sZExlbmd0aD0gY3VycmVudEl0ZW1zLmxlbmd0aDsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcz0gbmV3IFN0cmluZ1tvbGRMZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRJdGVtcywgMCwgbmV3SXRlbXMsIDAsIG9sZExlbmd0aCk7Ci0JCQkJbmV3SXRlbXNbb2xkTGVuZ3RoXT0gcGF0aDsKLQkJCQlmUGF0Y2hGaWxlTmFtZUZpZWxkLnNldEl0ZW1zKG5ld0l0ZW1zKTsKLQkJCQlzZWxlY3Rpb25JbmRleD0gb2xkTGVuZ3RoOwotCQkJfQotCQkJZlBhdGNoRmlsZU5hbWVGaWVsZC5zZWxlY3Qoc2VsZWN0aW9uSW5kZXgpOwotCQotCQkJLy9yZXNldFNlbGVjdGlvbigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqCVRoZSBGaW5pc2ggYnV0dG9uIHdhcyBwcmVzc2VkLiBUcnkgdG8gZG8gdGhlIHJlcXVpcmVkIHdvcmsgbm93IGFuZCBhbnN3ZXIKLQkgKglhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLiBJZiBmYWxzZSBpcyByZXR1cm5lZCB0aGVuIHRoZSB3aXphcmQgd2lsbAotCSAqCW5vdCBjbG9zZS4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpbmlzaCgpIHsKLS8vCQlpZiAoIWVuc3VyZVNvdXJjZUlzVmFsaWQoKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQotCQlzYXZlV2lkZ2V0VmFsdWVzKCk7Ci0JCi0vLwkJSXRlcmF0b3IgcmVzb3VyY2VzRW51bSA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLS8vCQlMaXN0IGZpbGVTeXN0ZW1PYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCXdoaWxlIChyZXNvdXJjZXNFbnVtLmhhc05leHQoKSkgewotLy8JCQlmaWxlU3lzdGVtT2JqZWN0cy5hZGQoCi0vLwkJCQkoKEZpbGVTeXN0ZW1FbGVtZW50KSByZXNvdXJjZXNFbnVtLm5leHQoKSkuZ2V0RmlsZVN5c3RlbU9iamVjdCgpKTsKLS8vCQl9Ci0vLwkKLS8vCQlpZiAoZmlsZVN5c3RlbU9iamVjdHMuc2l6ZSgpID4gMCkKLS8vCQkJcmV0dXJuIGltcG9ydFJlc291cmNlcyhmaWxlU3lzdGVtT2JqZWN0cyk7Ci0vLwkKLS8vCQlNZXNzYWdlRGlhbG9nCi0vLwkJCS5vcGVuSW5mb3JtYXRpb24oCi0vLwkJCQlnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotLy8JCQkJRGF0YVRyYW5zZmVyTWVzc2FnZXMuZ2V0U3RyaW5nKCJEYXRhVHJhbnNmZXIuaW5mb3JtYXRpb24iKSwgLy8kTk9OLU5MUy0xJAotLy8JCQkJRGF0YVRyYW5zZmVyTWVzc2FnZXMuZ2V0U3RyaW5nKCJGaWxlSW1wb3J0Lm5vbmVTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCi0vLwkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKglVc2UgdGhlIGRpYWxvZyBzdG9yZSB0byByZXN0b3JlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHRoZXkgaGVsZAotCSAqCWxhc3QgdGltZSB0aGlzIHdpemFyZCB3YXMgdXNlZCB0byBjb21wbGV0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCQotCQlib29sZWFuIHVzZUNsaXBib2FyZD0gZmFsc2U7Ci0JCQotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkKLQkJCXVzZUNsaXBib2FyZD0gc2V0dGluZ3MuZ2V0Qm9vbGVhbihTVE9SRV9VU0VfQ0xJUEJPQVJEX0lEKTsKLQotCQkJLy8gc2V0IGZpbGVuYW1lcyBoaXN0b3J5Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcz0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfUEFUQ0hfRklMRVNfSUQpOwotCQkJaWYgKHNvdXJjZU5hbWVzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJCQlpZiAoc291cmNlTmFtZXNbaV0gIT0gbnVsbCAmJiBzb3VyY2VOYW1lc1tpXS5sZW5ndGgoKSA+IDApCi0JCQkJCQlmUGF0Y2hGaWxlTmFtZUZpZWxkLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0JCQkKLQkJCS8vIHNldCBwYXRjaCBmaWxlIHBhdGgKLQkJCVN0cmluZyBwYXRjaEZpbGVQYXRoPSBzZXR0aW5ncy5nZXQoU1RPUkVfUEFUQ0hfRklMRVNfSUQpOwotCQkJaWYgKHBhdGNoRmlsZVBhdGggIT0gbnVsbCkKLQkJCQlzZXRTb3VyY2VOYW1lKHBhdGNoRmlsZVBhdGgpOwotCQl9Ci0JCQotCQkvLyBzZXQgJ1VzZSBDbGlwYm9hcmQnIHJhZGlvIGJ1dHRvbnMKLQkJc2V0VXNlQ2xpcGJvYXJkKHVzZUNsaXBib2FyZCk7Ci0JfQotCQotCS8qKgotCSAqIAlTaW5jZSBGaW5pc2ggd2FzIHByZXNzZWQsIHdyaXRlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIGRpYWxvZyBzdG9yZSBzbyB0aGF0IHRoZXkKLQkgKgl3aWxsIHBlcnNpc3QgaW50byB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIHRoaXMgd2l6YXJkIHBhZ2UKLQkgKi8KLQl2b2lkIHNhdmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCQotCQkJc2V0dGluZ3MucHV0KFNUT1JFX1VTRV9DTElQQk9BUkRfSUQsIGdldFVzZUNsaXBib2FyZCgpKTsKLQkJCXNldHRpbmdzLnB1dChTVE9SRV9QQVRDSF9GSUxFU19JRCwgZ2V0UGF0Y2hGaWxlUGF0aCgpKTsKLQkJCQotCQkJLy8gdXBkYXRlIHNvdXJjZSBuYW1lcyBoaXN0b3J5Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcz0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfUEFUQ0hfRklMRVNfSUQpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJc291cmNlTmFtZXM9IG5ldyBTdHJpbmdbMF07Ci0JCi0JCQlzb3VyY2VOYW1lcz0gYWRkVG9IaXN0b3J5KHNvdXJjZU5hbWVzLCBnZXRQYXRjaEZpbGVQYXRoKCkpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX1BBVENIX0ZJTEVTX0lELCBzb3VyY2VOYW1lcyk7Ci0JCX0KLQl9Ci0JCi0JLy8gc3RhdGljIGhlbHBlcnMKLQkJCi0JcHJpdmF0ZSB2b2lkIHNldFVzZUNsaXBib2FyZChib29sZWFuIHVzZUNsaXBib2FyZCkgewotCQlpZiAodXNlQ2xpcGJvYXJkKQotCQkJZlVzZUNsaXBib2FyZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UKLQkJCWZVc2VQYXRjaEZpbGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzZXRFbmFibGVQYXRjaEZpbGUoIXVzZUNsaXBib2FyZCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRVc2VDbGlwYm9hcmQoKSB7Ci0JCWlmIChmVXNlQ2xpcGJvYXJkQnV0dG9uICE9IG51bGwpCi0JCQlyZXR1cm4gZlVzZUNsaXBib2FyZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhdGNoRmlsZVBhdGgoKSB7Ci0JCWlmIChmUGF0Y2hGaWxlTmFtZUZpZWxkICE9IG51bGwpCi0JCQlyZXR1cm4gZlBhdGNoRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0gCi0KLQkvKgotCSAqIEFkZHMgYW4gZW50cnkgdG8gYSBoaXN0b3J5LCB3aGlsZSB0YWtpbmcgY2FyZSBvZiBkdXBsaWNhdGUgaGlzdG9yeSBpdGVtcwotCSAqIGFuZCBleGNlc3NpdmVseSBsb25nIGhpc3Rvcmllcy4gVGhlIGFzc3VtcHRpb24gaXMgbWFkZSB0aGF0IGFsbCBoaXN0b3JpZXMKLQkgKiBzaG91bGQgYmUgb2YgbGVuZ3RoIDxjb2RlPkNPTUJPX0hJU1RPUllfTEVOR1RIPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBoaXN0b3J5IHRoZSBjdXJyZW50IGhpc3RvcnkKLQkgKiBAcGFyYW0gbmV3RW50cnkgdGhlIGVudHJ5IHRvIGFkZCB0byB0aGUgaGlzdG9yeQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gYWRkVG9IaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnksIFN0cmluZyBuZXdFbnRyeSkgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGw9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGhpc3RvcnkpKTsKLQotCQlsLnJlbW92ZShuZXdFbnRyeSk7Ci0JCWwuYWRkKDAsbmV3RW50cnkpOwotCQotCQkvLyBzaW5jZSBvbmx5IG9uZSBuZXcgaXRlbSB3YXMgYWRkZWQsIHdlIGNhbiBiZSBvdmVyIHRoZSBsaW1pdAotCQkvLyBieSBhdCBtb3N0IG9uZSBpdGVtCi0JCWlmIChsLnNpemUoKSA+IENPTUJPX0hJU1RPUllfTEVOR1RIKQotCQkJbC5yZW1vdmUoQ09NQk9fSElTVE9SWV9MRU5HVEgpOwotCQkKLQkJcmV0dXJuIChTdHJpbmdbXSkgbC50b0FycmF5KG5ldyBTdHJpbmdbbC5zaXplKCldKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvTGluZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9MaW5lUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjI1ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9MaW5lUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBMaW5lUmVhZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSGF2ZUNoYXI9IGZhbHNlOwotCXByaXZhdGUgaW50IGZMYXN0Q2hhcjsKLQlwcml2YXRlIGJvb2xlYW4gZlNhd0VPRj0gZmFsc2U7Ci0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBmUmVhZGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlU2luZ2xlQ1I9IGZhbHNlOwotCQotCQotCS8qIHBhY2thZ2UgKi8gTGluZVJlYWRlcihCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKLQkJZlJlYWRlcj0gcmVhZGVyOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlYWRlcik7Ci0JfQotCi0Jdm9pZCBpZ25vcmVTaW5nbGVDUigpIHsKLQkJZklnbm9yZVNpbmdsZUNSPSB0cnVlOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBSZWFkcyBhIGxpbmUgb2YgdGV4dC4gQSBsaW5lIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGVybWluYXRlZCBieSBhbnkgb25lCi0gICAgICogb2YgYSBsaW5lIGZlZWQgKCdcbicpLCBhIGNhcnJpYWdlIHJldHVybiAoJ1xyJyksIG9yIGEgY2FycmlhZ2UgcmV0dXJuCi0gICAgICogZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYSBsaW5lZmVlZC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIGluY2x1ZGluZwotICAgICAqCXRoZSBsaW5lLXRlcm1pbmF0aW9uIGNoYXJhY3RlcnMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbmQgb2YgdGhlCi0gICAgICoJc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLQkvKiBwYWNrYWdlICovIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBzYj0gbnVsbDsKLQkJCQkKLQkJd2hpbGUgKCFmU2F3RU9GKSB7Ci0JCQlpbnQgYz0gcmVhZENoYXIoKTsKLQkJCWlmIChjID09IC0xKSB7Ci0JCQkJZlNhd0VPRj0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzYiA9PSBudWxsKQotCQkJCXNiPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoKGNoYXIpYyk7Ci0JCQlpZiAoYyA9PSAnXG4nKQotCQkJCWJyZWFrOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCWM9IHJlYWRDaGFyKCk7Ci0JCQkJaWYgKGMgPT0gLTEpIHsKLQkJCQkJZlNhd0VPRj0gdHJ1ZTsKLQkJCQkJYnJlYWs7CS8vIEVPRgotCQkJCX0KLQkJCQlpZiAoYyAhPSAnXG4nKSB7Ci0JCQkJCWlmIChmSWdub3JlU2luZ2xlQ1IpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljKTsJCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlmSGF2ZUNoYXI9IHRydWU7Ci0JCQkJCWZMYXN0Q2hhcj0gYzsKLQkJCQl9IGVsc2UKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWMpOwkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNiICE9IG51bGwpCi0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJfQotCX0KLQkKLQkvKiBwYWNrYWdlICovIExpc3QgcmVhZExpbmVzKCkgewotCQl0cnkgewotCQkJTGlzdCBsaW5lcz0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3RyaW5nIGxpbmU7Ci0JCQl3aGlsZSAoKGxpbmU9IHJlYWRMaW5lKCkpICE9IG51bGwpCi0JCQkJbGluZXMuYWRkKGxpbmUpOwotCQkJcmV0dXJuIGxpbmVzOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJLy8gTmVlZFdvcmsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciB3aGlsZSByZWFkaW5nIGZpbGU6ICIgKyBmaWxlTmFtZSArICIoIiArIGV4ICsgIikiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyB3aXRob3V0Ci0JICogY291bnRpbmcgYSB0cmFpbGluZyBsaW5lIHNlcGFyYXRvci4KLQkgKi8KLQkvKiBwYWNrYWdlICovIGludCBsaW5lQ29udGVudExlbmd0aChTdHJpbmcgbGluZSkgewotCQlpZiAobGluZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWludCBsZW5ndGg9IGxpbmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGk9IGxlbmd0aC0xOyBpID49IDA7IGktLSkgewotCQkJY2hhciBjPSBsaW5lLmNoYXJBdChpKTsKLQkJCWlmIChjID09J1xuJyB8fCBjID09ICdccicpCi0JCQkJbGVuZ3RoLS07Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0JCi0JLy8tLS0tIHByaXZhdGUKLQkKLQlwcml2YXRlIGludCByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmSGF2ZUNoYXIpIHsKLQkJCWZIYXZlQ2hhcj0gZmFsc2U7Ci0JCQlyZXR1cm4gZkxhc3RDaGFyOwotCQl9Ci0JCXJldHVybiBmUmVhZGVyLnJlYWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoRXJyb3JEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hFcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJmYjZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hFcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2g7Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaEVycm9yRGlhbG9nIHsKLQkKLQlwcml2YXRlIFBhdGNoRXJyb3JEaWFsb2coKSB7Ci0JCS8vIG5vIGluc3RhbmNlLgotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzgwNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUGF0Y2hNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaC5QYXRjaE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotCXByaXZhdGUgUGF0Y2hNZXNzYWdlcygpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVhZTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jICdDb21wYXJlIHdpdGggUGF0Y2gnIEFjdGlvbgotIwotUGF0Y2hBY3Rpb24uRXhjZXB0aW9uVGl0bGU9U2F2aW5nIFJlc291cmNlcwotUGF0Y2hBY3Rpb24uRXhjZXB0aW9uPVVuZXhwZWN0ZWQgZXhjZXB0aW9uLiBTZWUgbG9nIGZvciBkZXRhaWxzCi1QYXRjaEFjdGlvbi5TYXZpbmdEaXJ0eUVkaXRvcnNUYXNrPVNhdmluZyBkaXJ0eSBlZGl0b3JzCi1QYXRjaEFjdGlvbi5BbHdheXNTYXZlUXVlc3Rpb249JkFsd2F5cyBzYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byBwYXRjaGluZwotUGF0Y2hBY3Rpb24uU2F2ZUFsbFF1ZXN0aW9uPVNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcwotUGF0Y2hBY3Rpb24uU2F2ZUFsbERlc2NyaXB0aW9uPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgaGF2ZSB0byBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uXG5DbGljayAnT0snIHRvIGNvbmZpcm0gb3IgY2xpY2sgJ0NhbmNlbCcuCi0KLSMKLSMgUGF0Y2hXaXphcmQKLSMKLVBhdGNoV2l6YXJkLnRpdGxlPUFwcGx5IFBhdGNoCi1QYXRjaFdpemFyZC51bmV4cGVjdGVkRXhjZXB0aW9uLm1lc3NhZ2U9IFVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoaWxlIGFwcGx5aW5nIHRoZSBwYXRjaC4gU2VlIGxvZyBmb3IgYSBkZXRhaWxlZCBlcnJvciBkZXNjcmlwdGlvbi4KLQotIwotIyBJbnB1dFBhdGNoUGFnZQotIwotSW5wdXRQYXRjaFBhZ2UudGl0bGU9IFBhdGNoIElucHV0IFNwZWNpZmljYXRpb24KLUlucHV0UGF0Y2hQYWdlLm1lc3NhZ2U9IERlZmluZSB0aGUgcmVzb3VyY2UgdG8gcGF0Y2ggYW5kIHRoZSBwYXRjaCB0byBhcHBseQotSW5wdXRQYXRjaFBhZ2UuQ2xpcGJvYXJkPUNsaXBib2FyZAotSW5wdXRQYXRjaFBhZ2UuU2VsZWN0SW5wdXQ9U2VsZWN0IGEgc2luZ2xlIGZpbGUgb3IgZm9sZGVyIHRvIHBhdGNoOgotSW5wdXRQYXRjaFBhZ2UuUGF0Y2hFcnJvckRpYWxvZy50aXRsZT1QYXRjaCBFcnJvcgotSW5wdXRQYXRjaFBhZ2UuUGF0Y2hFcnJvckRpYWxvZz1QYXRjaCBFcnJvcgotSW5wdXRQYXRjaFBhZ2UuU2VsZWN0UGF0Y2gudGl0bGU9U2VsZWN0IFBhdGNoCi1JbnB1dFBhdGNoUGFnZS5GaWxlQnV0dG9uLnRleHQ9RmlsJmUKLUlucHV0UGF0Y2hQYWdlLkNob29zZUZpbGVCdXR0b24udGV4dD0mQnJvd3NlLi4uCi1JbnB1dFBhdGNoUGFnZS5Vc2VDbGlwYm9hcmRCdXR0b24udGV4dD0mQ2xpcGJvYXJkCi1JbnB1dFBhdGNoUGFnZS5Ob3RoaW5nU2VsZWN0ZWQubWVzc2FnZT1TZWxlY3QgYSBmaWxlIG9yIGZvbGRlciB0byBiZSBwYXRjaGVkCi1JbnB1dFBhdGNoUGFnZS5DbGlwYm9hcmRJc0VtcHR5Lm1lc3NhZ2U9Q2xpcGJvYXJkIGlzIGVtcHR5Ci1JbnB1dFBhdGNoUGFnZS5Ob1RleHRJbkNsaXBib2FyZC5tZXNzYWdlPUNsaXBib2FyZCBkb2VzIG5vdCBjb250YWluIHRleHQKLUlucHV0UGF0Y2hQYWdlLkNvdWxkTm90UmVhZENsaXBib2FyZC5tZXNzYWdlPUNhbm5vdCByZXRyaWV2ZSBjbGlwYm9hcmQgY29udGVudHMKLUlucHV0UGF0Y2hQYWdlLkNhbm5vdExvY2F0ZVBhdGNoLm1lc3NhZ2U9Q2Fubm90IGxvY2F0ZSBwYXRjaCBmaWxlOiAKLUlucHV0UGF0Y2hQYWdlLk5vRmlsZU5hbWUubWVzc2FnZT1ObyBmaWxlIG5hbWUKLSNTSSAtIFNlbGVjdCBmaWxlIG5hbWUgICAgPwotSW5wdXRQYXRjaFBhZ2UuU2VsZWN0UGF0Y2hGaWxlRGlhbG9nLnRpdGxlPVNlbGVjdCBQYXRjaCBGaWxlCi1JbnB1dFBhdGNoUGFnZS5QYXRjaEZpbGVOb3RGb3VuZC5tZXNzYWdlPVBhdGNoIGZpbGUgbm90IGZvdW5kLgotSW5wdXRQYXRjaFBhZ2UuUGFyc2VFcnJvci5tZXNzYWdlPUVycm9yIHdoaWxlIHBhcnNpbmcgcGF0Y2gKLUlucHV0UGF0Y2hQYWdlLkNsaXBib2FyZC50aXRsZT1DbGlwYm9hcmQKLUlucHV0UGF0Y2hQYWdlLlBhdGNoRmlsZS50aXRsZT1QYXRjaCBmaWxlCi1JbnB1dFBhdGNoUGFnZS5Ob0RpZmZzRm91bmQuZm9ybWF0PXswfSBkb2VzIG5vdCBjb250YWluIHZhbGlkIHBhdGNoLgotSW5wdXRQYXRjaFBhZ2UuU2luZ2xlRmlsZUVycm9yLmZvcm1hdD17MH0gY29udGFpbnMgbXVsdGlwbGUgcGF0Y2hlcy4gWW91IGNhbm5vdCBhcHBseSB0aGVtIHRvIGEgc2luZ2xlIGZpbGUuCi0KLSMKLSMgUHJldmlld1BhdGNoUGFnZQotIwotUHJldmlld1BhdGNoUGFnZS50aXRsZT0gVmVyaWZ5IFBhdGNoCi1QcmV2aWV3UGF0Y2hQYWdlLm1lc3NhZ2U9IFRoZSB0cmVlIHNob3dzIHRoZSBjb250ZW50cyBvZiB0aGUgcGF0Y2guXG5BIGNoZWNrZWQgaXRlbSBpbmRpY2F0ZXMgdGhhdCBhIHBhdGNoIGNhbiBiZSBhcHBsaWVkIHN1Y2Nlc3NmdWxseS4gVG8gcmVtb3ZlIGFuIGl0ZW0sIGNsZWFyIGl0cyBjaGVja2JveC4KLVByZXZpZXdQYXRjaFBhZ2UuTGVmdC50aXRsZT0gT3JpZ2luYWwKLVByZXZpZXdQYXRjaFBhZ2UuUmlnaHQudGl0bGU9IFJlc3VsdAotUHJldmlld1BhdGNoUGFnZS5QYXRjaE9wdGlvbnMudGl0bGU9UGF0Y2ggT3B0aW9ucwotUHJldmlld1BhdGNoUGFnZS5JZ25vcmVTZWdtZW50cy50ZXh0PSZJZ25vcmUgbGVhZGluZyBwYXRoIG5hbWUgc2VnbWVudHM6Ci1QcmV2aWV3UGF0Y2hQYWdlLlJldmVyc2VQYXRjaC50ZXh0PSZSZXZlcnNlIHBhdGNoCi1QcmV2aWV3UGF0Y2hQYWdlLkZ1enpGYWN0b3IudGV4dD0mTWF4aW11bSBmdXp6IGZhY3RvcjoKLVByZXZpZXdQYXRjaFBhZ2UuRnV6ekZhY3Rvci50b29sdGlwPUFsbG93IENvbnRleHQgdG8gU2hpZnQgVGhpcyBOdW1iZXIgb2YgTGluZXMgZnJvbSB0aGUgT3JpZ2luYWwgTG9jYXRpb24KLVByZXZpZXdQYXRjaFBhZ2UuSWdub3JlV2hpdGVzcGFjZS50ZXh0PUlnbm9yZSAmd2hpdGUgc3BhY2UKLVByZXZpZXdQYXRjaFBhZ2UuTm9OYW1lLnRleHQ9bm8gbmFtZQotUHJldmlld1BhdGNoUGFnZS5GaWxlRXhpc3RzLmVycm9yPShmaWxlIGFscmVhZHkgZXhpc3RzKQotUHJldmlld1BhdGNoUGFnZS5GaWxlRG9lc05vdEV4aXN0LmVycm9yPShmaWxlIGRvZXMgbm90IGV4aXN0KQotUHJldmlld1BhdGNoUGFnZS5Ob01hdGNoLmVycm9yPShubyBtYXRjaCkKLVByZXZpZXdQYXRjaFBhZ2UuRmlsZUlzUmVhZE9ubHkuZXJyb3I9KGZpbGUgaXMgcmVhZC1vbmx5KQotUHJldmlld1BhdGNoUGFnZS5HdWVzc0Z1enoudGV4dD0gJkd1ZXNzCi1QcmV2aWV3UGF0Y2hQYWdlLkd1ZXNzRnV6elByb2dyZXNzLnRleHQ9IEd1ZXNzaW5nIEZ1enogRmFjdG9yLi4uCi1QcmV2aWV3UGF0Y2hQYWdlLkd1ZXNzRnV6elByb2dyZXNzLmZvcm1hdD0gezB9IChodW5rICN7MX0pCi0KLSMKLSMgUGF0Y2hlcgotIwotUGF0Y2hlci5FcnJvckRpYWxvZy50aXRsZT10aXRsZQotUGF0Y2hlci5EZWxldGVFcnJvci5tZXNzYWdlPUVycm9yIHdoaWxlIGRlbGV0aW5nIHJlc291cmNlCi1QYXRjaGVyLlVwZGF0ZUVycm9yLm1lc3NhZ2U9RXJyb3Igd2hpbGUgdXBkYXRpbmcgcmVzb3VyY2UKLVBhdGNoZXIuUmVmcmVzaEVycm9yLm1lc3NhZ2U9RXJyb3Igd2hpbGUgcmVmcmVzaGluZyBmcm9tIGxvY2FsCi1QYXRjaGVyLk1hcmtlci5tZXNzYWdlPVJlamVjdGVkIHBhdGNoCi1QYXRjaGVyLlRhc2subWVzc2FnZT1QYXRjaGluZwotCi0jCi0jIFBhdGNoQ29tcGFyZUlucHV0Ci0jCi1QYXRjaENvbXBhcmVJbnB1dC5SaWdodFRpdGxlLmZvcm1hdD0gUGF0Y2g6IHswfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjNhOTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC4qOwotCi0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgUGF0Y2hXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCQotCS8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX0tFWT0gIlBhdGNoV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIGZIYXNOZXdEaWFsb2dTZXR0aW5nczsKLQkKLQlwcml2YXRlIElucHV0UGF0Y2hQYWdlIGZQYXRjaFdpemFyZFBhZ2U7Ci0JCi0JcHJpdmF0ZSBQYXRjaGVyIGZQYXRjaGVyOwotCXByaXZhdGUgSVJlc291cmNlIGZUYXJnZXQ7Ci0KLQkJCi0JLyoKLQkgKiBDcmVhdGVzIGEgd2l6YXJkIGZvciBhcHBseWluZyBhIHBhdGNoIGZpbGUgdG8gdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQkvKiBwYWNrYWdlICovIFBhdGNoV2l6YXJkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJ3aXpiYW4vYXBwbHlwYXRjaF93aXpiYW4uZ2lmIikpOwkvLyROT04tTkxTLTEkCi0JCXNldFdpbmRvd1RpdGxlKFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRjaFdpemFyZC50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldFRhcmdldHMoVXRpbGl0aWVzLmdldFJlc291cmNlcyhzZWxlY3Rpb24pKTsKLQotCQlmUGF0Y2hlcj0gbmV3IFBhdGNoZXIoKTsKLQkJCQkKLQkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzPSBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uPSB3b3JrYmVuY2hTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19LRVkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCQlmSGFzTmV3RGlhbG9nU2V0dGluZ3M9IHRydWU7Ci0JCWVsc2UgewotCQkJZkhhc05ld0RpYWxvZ1NldHRpbmdzPSBmYWxzZTsKLQkJCXNldERpYWxvZ1NldHRpbmdzKHNlY3Rpb24pOwotCQl9CQotCX0KLQkKLQlQYXRjaGVyIGdldFBhdGNoZXIoKSB7Ci0JCXJldHVybiBmUGF0Y2hlcjsKLQl9Ci0JCi0JSVJlc291cmNlIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGZUYXJnZXQ7Ci0JfQotCQotCXZvaWQgc2V0VGFyZ2V0cyhJUmVzb3VyY2VbXSB0YXJnZXRzKSB7Ci0JCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKQotCQkJZlRhcmdldD0gdGFyZ2V0c1swXTsJLy8gcmlnaHQgbm93IHdlIGNhbiBvbmx5IGRlYWwgd2l0aCBhIHNpbmdsZSBzZWxlY3Rpb24KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlzdXBlci5hZGRQYWdlcygpOwotCQkKLQkJYWRkUGFnZShmUGF0Y2hXaXphcmRQYWdlPSBuZXcgSW5wdXRQYXRjaFBhZ2UodGhpcykpOwotCQlhZGRQYWdlKG5ldyBQcmV2aWV3UGF0Y2hQYWdlKHRoaXMpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJCi0JCWZQYXRjaGVyLnNldE5hbWUoZlBhdGNoV2l6YXJkUGFnZS5nZXRQYXRjaE5hbWUoKSk7Ci0KLQkJdHJ5IHsKLQkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcD0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmVGFyZ2V0LmdldFByb2plY3QoKSkgewotCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmUGF0Y2hlci5hcHBseUFsbChnZXRUYXJnZXQoKSwgbW9uaXRvciwgZ2V0U2hlbGwoKSwgUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoV2l6YXJkLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLAotCQkJCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hXaXphcmQudGl0bGUiKSwJLy8kTk9OLU5MUy0xJCAKLQkJCQkJUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoV2l6YXJkLnVuZXhwZWN0ZWRFeGNlcHRpb24ubWVzc2FnZSIpKTsJLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjYW5ub3QgaGFwcGVuCi0JCQkvLyBOZWVkV29yazogdXNlIGFzc2VydCEKLQkJfQotCQkKLQkJLy8gU2F2ZSB0aGUgZGlhbG9nIHNldHRpbmdzCi0JCWlmIChmSGFzTmV3RGlhbG9nU2V0dGluZ3MpIHsKLQkJCUlEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncz0gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb249IHdvcmtiZW5jaFNldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdTX0tFWSk7Ci0JCQlzZWN0aW9uPSB3b3JrYmVuY2hTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HU19LRVkpOwotCQkJc2V0RGlhbG9nU2V0dGluZ3Moc2VjdGlvbik7Ci0JCX0KLQkJCi0JCWZQYXRjaFdpemFyZFBhZ2Uuc2F2ZVdpZGdldFZhbHVlcygpOwotCQkvL2ZQcmV2aWV3UGF0Y2hQYWdlLnNhdmVXaWRnZXRWYWx1ZXMoKTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4ZDJlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmZXJlbmNlcjsKLQotLyoqCi0gKiBBIFBhdGNoZXIgCi0gKiAtIGtub3dzIGhvdyB0byBwYXJzZSB2YXJpb3VzIHBhdGNoIGZpbGUgZm9ybWF0cyBpbnRvIHNvbWUgaW4tbWVtb3J5IHN0cnVjdHVyZSwKLSAqIC0gaG9sZHMgb250byB0aGUgcGFyc2VkIGRhdGEgYW5kIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGFwcGx5aW5nIHRoZSBwYXRjaGVzLAotICogLSBrbm93cyBob3cgdG8gYXBwbHkgdGhlIHBhdGNoZXMgdG8gZmlsZXMgYW5kIGZvbGRlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRjaGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWX05VTEw9ICIvZGV2L251bGwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFSkVDVF9GSUxFX0VYVEVOU0lPTj0gIi5yZWoiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9UWVBFPSAib3JnLmVjbGlwc2UuY29tcGFyZS5yZWplY3RlZFBhdGNoTWFya2VyIjsJLy8kTk9OLU5MUy0xJAotCi0JLy8gZGlmZiBmb3JtYXRzCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVD0gMDsKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRD0gMTsKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1JNQUw9IDI7Ci0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5JRklFRD0gMzsKLQkKLQkvLyB3ZSByZWNvZ25pemUgdGhlIGZvbGxvd2luZyBkYXRlL3RpbWUgZm9ybWF0cwotCXByaXZhdGUgc3RhdGljIERhdGVGb3JtYXRbXSBEQVRFX0ZPUk1BVFM9IG5ldyBEYXRlRm9ybWF0W10gewotCQluZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBrazptbTpzcyB5eXl5IiksIC8vJE5PTi1OTFMtMSQKLQkJbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQga2s6bW06c3MiKSwgLy8kTk9OLU5MUy0xJAotCQluZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBrazptbTpzcyB5eXl5IiwgTG9jYWxlLlVTKSAvLyROT04tTkxTLTEkCi0JfTsKLQkJCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0JcHJpdmF0ZSBEaWZmW10gZkRpZmZzOwotCS8vIHBhdGNoIG9wdGlvbnMKLQlwcml2YXRlIGludCBmU3RyaXBQcmVmaXhTZWdtZW50czsKLQlwcml2YXRlIGludCBmRnV6ejsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZVdoaXRlc3BhY2U9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlTGluZURlbGltaXRlcj0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZlByZXNlcnZlTGluZURlbGltaXRlcnM9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmUmV2ZXJzZT0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZBZGp1c3RTaGlmdD0gdHJ1ZTsKLQkKLQkKLQlQYXRjaGVyKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCS8vLS0tLSBvcHRpb25zCi0JCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lPSBuYW1lOwotCX0KLQkKLQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgRGlmZnMgYWZ0ZXIgYSBzdWNlc3NmdWxsIGNhbGwgdG8gPGNvZGU+cGFyc2U8L2NvZGU+LgotCSAqIElmIDxjb2RlPnBhcnNlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlEaWZmW10gZ2V0RGlmZnMoKSB7Ci0JCXJldHVybiBmRGlmZnM7Ci0JfQotCQotCUlQYXRoIGdldFBhdGgoRGlmZiBkaWZmKSB7Ci0JCUlQYXRoIHBhdGg9IGRpZmYuZ2V0UGF0aCgpOwotCQlpZiAoZlN0cmlwUHJlZml4U2VnbWVudHMgPiAwICYmIGZTdHJpcFByZWZpeFNlZ21lbnRzIDwgcGF0aC5zZWdtZW50Q291bnQoKSkKLQkJCXBhdGg9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmU3RyaXBQcmVmaXhTZWdtZW50cyk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIG9sZC4KLQkgKi8KLQlib29sZWFuIHNldFN0cmlwUHJlZml4U2VnbWVudHMoaW50IHN0cmlwKSB7Ci0JCWlmIChzdHJpcCAhPSBmU3RyaXBQcmVmaXhTZWdtZW50cykgewotCQkJZlN0cmlwUHJlZml4U2VnbWVudHM9IHN0cmlwOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlpbnQgZ2V0U3RyaXBQcmVmaXhTZWdtZW50cygpIHsKLQkJcmV0dXJuIGZTdHJpcFByZWZpeFNlZ21lbnRzOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSBvbGQuCi0JICovCi0JYm9vbGVhbiBzZXRGdXp6KGludCBmdXp6KSB7Ci0JCWlmIChmdXp6ICE9IGZGdXp6KSB7Ci0JCQlmRnV6ej0gZnV6ejsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5ldyB2YWx1ZSBkaWZmZXJzIGZyb20gb2xkLgotCSAqLwotCWJvb2xlYW4gc2V0UmV2ZXJzZWQoYm9vbGVhbiByZXZlcnNlKSB7Ci0JCWlmIChmUmV2ZXJzZSAhPSByZXZlcnNlKSB7Ci0JCQlmUmV2ZXJzZT0gcmV2ZXJzZTsKLQkJCQotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZEaWZmcy5sZW5ndGg7IGkrKykKLQkJCQlmRGlmZnNbaV0ucmV2ZXJzZSgpOwotCQkJCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQkvKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSBvbGQuCi0JICovCi0JYm9vbGVhbiBzZXRJZ25vcmVXaGl0ZXNwYWNlKGJvb2xlYW4gaWdub3JlV2hpdGVzcGFjZSkgewotCQlpZiAoaWdub3JlV2hpdGVzcGFjZSAhPSBmSWdub3JlV2hpdGVzcGFjZSkgewotCQkJZklnbm9yZVdoaXRlc3BhY2U9IGlnbm9yZVdoaXRlc3BhY2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQkvLy0tLS0gcGFyc2luZyBwYXRjaCBmaWxlcwotCQkKLQkvKiBwYWNrYWdlICovIHZvaWQgcGFyc2UoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlMaXN0IGRpZmZzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBsaW5lPSBudWxsOwotCQlib29sZWFuIHJlcmVhZD0gZmFsc2U7Ci0JCVN0cmluZyBkaWZmQXJncz0gbnVsbDsKLQkJU3RyaW5nIGZpbGVOYW1lPSBudWxsOwotCQkKLQkJTGluZVJlYWRlciBscj0gbmV3IExpbmVSZWFkZXIocmVhZGVyKTsKLQkJaWYgKCEiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpKQkvLyROT04tTkxTLTEkCi0JCQlsci5pZ25vcmVTaW5nbGVDUigpOwotCQkKLQkJLy8gcmVhZCBsZWFkaW5nIGdhcmJhZ2UKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmICghcmVyZWFkKQotCQkJCWxpbmU9IGxyLnJlYWRMaW5lKCk7Ci0JCQlyZXJlYWQ9IGZhbHNlOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCWlmIChsaW5lLmxlbmd0aCgpIDwgNCkKLQkJCQljb250aW51ZTsJLy8gdG9vIHNob3J0Ci0JCQkJCQkJCQotCQkJLy8gcmVtZW1iZXIgc29tZSBpbmZvcwotCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiSW5kZXg6ICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaWxlTmFtZT0gbGluZS5zdWJzdHJpbmcoNykudHJpbSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiZGlmZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWZmQXJncz0gbGluZS5zdWJzdHJpbmcoNCkudHJpbSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobGluZS5zdGFydHNXaXRoKCItLS0gIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWxpbmU9IHJlYWRVbmlmaWVkRGlmZihkaWZmcywgbHIsIGxpbmUsIGRpZmZBcmdzLCBmaWxlTmFtZSk7Ci0JCQkJZGlmZkFyZ3M9IGZpbGVOYW1lPSBudWxsOwotCQkJCXJlcmVhZD0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIqKiogIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWxpbmU9IHJlYWRDb250ZXh0RGlmZihkaWZmcywgbHIsIGxpbmUsIGRpZmZBcmdzLCBmaWxlTmFtZSk7Ci0JCQkJZGlmZkFyZ3M9IGZpbGVOYW1lPSBudWxsOwotCQkJCXJlcmVhZD0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJbHIuY2xvc2UoKTsKLQkJCi0JCWZEaWZmcz0gKERpZmZbXSkgZGlmZnMudG9BcnJheShuZXcgRGlmZltkaWZmcy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIG5leHQgbGluZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGRpZmYKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZWFkVW5pZmllZERpZmYoTGlzdCBkaWZmcywgTGluZVJlYWRlciByZWFkZXIsIFN0cmluZyBsaW5lLCBTdHJpbmcgYXJncywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCQkJCQkKLQkJU3RyaW5nW10gb2xkQXJncz0gc3BsaXQobGluZS5zdWJzdHJpbmcoNCkpOwotCi0JCS8vIHJlYWQgaW5mbyBhYm91dCBuZXcgZmlsZQotCQlsaW5lPSByZWFkZXIucmVhZExpbmUoKTsKLQkJaWYgKGxpbmUgPT0gbnVsbCB8fCAhbGluZS5zdGFydHNXaXRoKCIrKysgIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBsaW5lOwotCQkJCi0JCVN0cmluZ1tdIG5ld0FyZ3M9IHNwbGl0KGxpbmUuc3Vic3RyaW5nKDQpKTsKLQkKLQkJRGlmZiBkaWZmPSBuZXcgRGlmZihleHRyYWN0UGF0aChvbGRBcmdzLCAwLCBmaWxlTmFtZSksIGV4dHJhY3REYXRlKG9sZEFyZ3MsIDEpLAotCQkJCSAgIAkJCWV4dHJhY3RQYXRoKG5ld0FyZ3MsIDAsIGZpbGVOYW1lKSwgZXh0cmFjdERhdGUobmV3QXJncywgMSkpOwotCQlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJICAgCi0JCWludFtdIG9sZFJhbmdlPSBuZXcgaW50WzJdOwotCQlpbnRbXSBuZXdSYW5nZT0gbmV3IGludFsyXTsKLQkJTGlzdCBsaW5lcz0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXRyeSB7Ci0JCQkvLyByZWFkIGxpbmVzIG9mIGh1bmsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCi0JCQkJbGluZT0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQotCQkJCWlmIChyZWFkZXIubGluZUNvbnRlbnRMZW5ndGgobGluZSkgPT0gMCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogZm91bmQgZW1wdHkgbGluZSBpbiBodW5rOyBpZ25vcmVkIik7Ci0JCQkJCS8vbGluZXMuYWRkKCcgJyArIGxpbmUpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJY2hhciBjPSBsaW5lLmNoYXJBdCgwKTsKLQkJCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdAJzoKLQkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiQEAgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gZmx1c2ggb2xkIGh1bmsKLQkJCQkJCWlmIChsaW5lcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJbmV3IEh1bmsoZGlmZiwgb2xkUmFuZ2UsIG5ld1JhbmdlLCBsaW5lcyk7Ci0JCQkJCQkJbGluZXMuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkvLyBmb3JtYXQ6IEBAIC1vbGRTdGFydCxvbGRMZW5ndGggK25ld1N0YXJ0LG5ld0xlbmd0aCBAQAotCQkJCQkJZXh0cmFjdFBhaXIobGluZSwgJy0nLCBvbGRSYW5nZSk7Ci0JCQkJCQlleHRyYWN0UGFpcihsaW5lLCAnKycsIG5ld1JhbmdlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyAnOgotCQkJCWNhc2UgJysnOgotCQkJCWNhc2UgJy0nOgotCQkJCQlsaW5lcy5hZGQobGluZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCWNhc2UgJ1xcJzoKLQkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIsIDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBsYXN0SW5kZXg9IGxpbmVzLnNpemUoKTsKLQkJCQkJCWlmIChsYXN0SW5kZXggPiAwKSB7Ci0JCQkJCQkJbGluZT0gKFN0cmluZykgbGluZXMuZ2V0KGxhc3RJbmRleC0xKTsKLQkJCQkJCQlpbnQgZW5kPSBsaW5lLmxlbmd0aCgpLTE7Ci0JCQkJCQkJY2hhciBsYz0gbGluZS5jaGFyQXQoZW5kKTsKLQkJCQkJCQlpZiAobGMgPT0gJ1xuJykgewotCQkJCQkJCQllbmQtLTsKLQkJCQkJCQkJaWYgKGVuZCA+IDAgJiYgbGluZS5jaGFyQXQoZW5kLTEpID09ICdccicpCi0JCQkJCQkJCQllbmQtLTsKLQkJCQkJCQl9IGVsc2UgaWYgKGxjID09ICdccicpIHsKLQkJCQkJCQkJZW5kLS07Ci0JCQkJCQkJfQotCQkJCQkJCWxpbmU9IGxpbmUuc3Vic3RyaW5nKDAsIGVuZCk7Ci0JCQkJCQkJbGluZXMuc2V0KGxhc3RJbmRleC0xLCBsaW5lKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJaW50IGExPSBjLCBhMj0gMDsKLQkJCQkJCWlmIChsaW5lLmxlbmd0aCgpID4gMSkKLQkJCQkJCQlhMj0gbGluZS5jaGFyQXQoMSk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYXI6ICIgKyBhMSArICIgIiArIGEyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGxpbmVzLnNpemUoKSA+IDApCi0JCQkJbmV3IEh1bmsoZGlmZiwgb2xkUmFuZ2UsIG5ld1JhbmdlLCBsaW5lcyk7Ci0JCQlkaWZmLmZpbmlzaCgpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgZGlmZgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlYWRDb250ZXh0RGlmZihMaXN0IGRpZmZzLCBMaW5lUmVhZGVyIHJlYWRlciwgU3RyaW5nIGxpbmUsIFN0cmluZyBhcmdzLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmdbXSBvbGRBcmdzPSBzcGxpdChsaW5lLnN1YnN0cmluZyg0KSk7Ci0JCQotCQkvLyByZWFkIGluZm8gYWJvdXQgbmV3IGZpbGUKLQkJbGluZT0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCWlmIChsaW5lID09IG51bGwgfHwgIWxpbmUuc3RhcnRzV2l0aCgiLS0tICIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbGluZTsKLQkJCi0JCVN0cmluZ1tdIG5ld0FyZ3M9IHNwbGl0KGxpbmUuc3Vic3RyaW5nKDQpKTsKLQkJCQkJCQotCQlEaWZmIGRpZmY9IG5ldyBEaWZmKGV4dHJhY3RQYXRoKG9sZEFyZ3MsIDAsIGZpbGVOYW1lKSwgZXh0cmFjdERhdGUob2xkQXJncywgMSksCi0JCQkJICAgCQkJZXh0cmFjdFBhdGgobmV3QXJncywgMCwgZmlsZU5hbWUpLCBleHRyYWN0RGF0ZShuZXdBcmdzLCAxKSk7Ci0JCWRpZmZzLmFkZChkaWZmKTsKLQkJCQkgICAKLQkJaW50W10gb2xkUmFuZ2U9IG5ldyBpbnRbMl07Ci0JCWludFtdIG5ld1JhbmdlPSBuZXcgaW50WzJdOwotCQlMaXN0IG9sZExpbmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmV3TGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBsaW5lcz0gb2xkTGluZXM7Ci0JCQotCQl0cnkgewotCQkJLy8gcmVhZCBsaW5lcyBvZiBodW5rCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCQotCQkJCWxpbmU9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJCXJldHVybiBsaW5lOwotCQkJCQotCQkJCWludCBsPSBsaW5lLmxlbmd0aCgpOwotCQkJCWlmIChsID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChsID4gMSkgewotCQkJCQlzd2l0Y2ggKGxpbmUuY2hhckF0KDApKSB7Ci0JCQkJCWNhc2UgJyonOgkKLQkJCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIioqKioqKioqKioqKioqKiIpKSB7CS8vIG5ldyBodW5rIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBmbHVzaCBvbGQgaHVuawotCQkJCQkJCWlmIChvbGRMaW5lcy5zaXplKCkgPiAwIHx8IG5ld0xpbmVzLnNpemUoKSA+IDApIHsKLQkJCQkJCQkJbmV3IEh1bmsoZGlmZiwgb2xkUmFuZ2UsIG5ld1JhbmdlLCB1bmlmeUxpbmVzKG9sZExpbmVzLCBuZXdMaW5lcykpOwotCQkJCQkJCQlvbGRMaW5lcy5jbGVhcigpOwotCQkJCQkJCQluZXdMaW5lcy5jbGVhcigpOwotCQkJCQkJCX0KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIioqKiAiKSkgewkvLyBvbGQgcmFuZ2UgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGZvcm1hdDogKioqIG9sZFN0YXJ0LG9sZEVuZCAqKioKLQkJCQkJCQlleHRyYWN0UGFpcihsaW5lLCAnICcsIG9sZFJhbmdlKTsKLQkJCQkJCQlvbGRSYW5nZVsxXT0gb2xkUmFuZ2VbMV0tb2xkUmFuZ2VbMF0rMTsKLQkJCQkJCQlsaW5lcz0gb2xkTGluZXM7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnICc6CS8vIGNvbnRleHQgbGluZQotCQkJCQljYXNlICcrJzoJLy8gYWRkaXRpb24KLQkJCQkJY2FzZSAnISc6CS8vIGNoYW5nZQotCQkJCQkJaWYgKGxpbmUuY2hhckF0KDEpID09ICcgJykgewotCQkJCQkJCWxpbmVzLmFkZChsaW5lKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICctJzoKLQkJCQkJCWlmIChsaW5lLmNoYXJBdCgxKSA9PSAnICcpIHsJLy8gZGVsZXRpb24KLQkJCQkJCQlsaW5lcy5hZGQobGluZSk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobGluZS5zdGFydHNXaXRoKCItLS0gIikpIHsJLy8gbmV3IHJhbmdlIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBmb3JtYXQ6ICoqKiBuZXdTdGFydCxuZXdFbmQgKioqCi0JCQkJCQkJZXh0cmFjdFBhaXIobGluZSwgJyAnLCBuZXdSYW5nZSk7Ci0JCQkJCQkJbmV3UmFuZ2VbMV09IG5ld1JhbmdlWzFdLW5ld1JhbmdlWzBdKzE7Ci0JCQkJCQkJbGluZXM9IG5ld0xpbmVzOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGZsdXNoIGxhc3QgaHVuawotCQkJaWYgKG9sZExpbmVzLnNpemUoKSA+IDAgfHwgbmV3TGluZXMuc2l6ZSgpID4gMCkKLQkJCQluZXcgSHVuayhkaWZmLCBvbGRSYW5nZSwgbmV3UmFuZ2UsIHVuaWZ5TGluZXMob2xkTGluZXMsIG5ld0xpbmVzKSk7Ci0JCQlkaWZmLmZpbmlzaCgpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ3JlYXRlcyBhIExpc3Qgb2YgbGluZXMgaW4gdGhlIHVuaWZpZWQgZm9ybWF0IGZyb20KLQkgKiB0d28gTGlzdHMgb2YgbGluZXMgaW4gdGhlICdjbGFzc2ljJyBmb3JtYXQuCi0JICovCi0JcHJpdmF0ZSBMaXN0IHVuaWZ5TGluZXMoTGlzdCBvbGRMaW5lcywgTGlzdCBuZXdMaW5lcykgewotCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVN0cmluZ1tdIG9sPSAoU3RyaW5nW10pIG9sZExpbmVzLnRvQXJyYXkobmV3IFN0cmluZ1tvbGRMaW5lcy5zaXplKCldKTsKLQkJU3RyaW5nW10gbmw9IChTdHJpbmdbXSkgbmV3TGluZXMudG9BcnJheShuZXcgU3RyaW5nW25ld0xpbmVzLnNpemUoKV0pOwotCQkKLQkJaW50IG9pPSAwLCBuaT0gMDsKLQkJCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQkKLQkJCWNoYXIgb2M9IDA7Ci0JCQlTdHJpbmcgbz0gbnVsbDsKLQkJCWlmIChvaSA8IG9sLmxlbmd0aCkgewotCQkJCW89IG9sW29pXTsKLQkJCQlvYz0gby5jaGFyQXQoMCk7Ci0JCQl9Ci0JCQkKLQkJCWNoYXIgbmM9IDA7Ci0JCQlTdHJpbmcgbj0gbnVsbDsKLQkJCWlmIChuaSA8IG5sLmxlbmd0aCkgewotCQkJCW49IG5sW25pXTsKLQkJCQluYz0gbi5jaGFyQXQoMCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIEVPRgotCQkJaWYgKG9jID09IDAgJiYgbmMgPT0gMCkKLQkJCQlicmVhazsKLQkJCQkKLQkJCS8vIGRlbGV0aW9uIGluIG9sZAotCQkJaWYgKG9jID09ICctJykgewotCQkJCWRvIHsKLQkJCQkJcmVzdWx0LmFkZCgnLScgKyBvLnN1YnN0cmluZygyKSk7Ci0JCQkJCW9pKys7Ci0JCQkJCWlmIChvaSA+PSBvbC5sZW5ndGgpCi0JCQkJCQlicmVhazsKLQkJCQkJbz0gb2xbb2ldOwotCQkJCX0gd2hpbGUgKG8uY2hhckF0KDApID09ICctJyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCS8vIGFkZGl0aW9uIGluIG5ldwotCQkJaWYgKG5jID09ICcrJykgewotCQkJCWRvIHsKLQkJCQkJcmVzdWx0LmFkZCgnKycgKyBuLnN1YnN0cmluZygyKSk7Ci0JCQkJCW5pKys7Ci0JCQkJCWlmIChuaSA+PSBubC5sZW5ndGgpCi0JCQkJCQlicmVhazsKLQkJCQkJbj0gbmxbbmldOwotCQkJCX0gd2hpbGUgKG4uY2hhckF0KDApID09ICcrJyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCS8vIGRpZmZlcmluZyBsaW5lcyBvbiBib3RoIHNpZGVzCi0JCQlpZiAob2MgPT0gJyEnICYmIG5jID09ICchJykgewotCQkJCS8vIHJlbW92ZSBvbGQKLQkJCQlkbyB7Ci0JCQkJCXJlc3VsdC5hZGQoJy0nICsgby5zdWJzdHJpbmcoMikpOwotCQkJCQlvaSsrOwotCQkJCQlpZiAob2kgPj0gb2wubGVuZ3RoKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW89IG9sW29pXTsKLQkJCQl9IHdoaWxlIChvLmNoYXJBdCgwKSA9PSAnIScpOwotCQkJCQotCQkJCS8vIGFkZCBuZXcKLQkJCQlkbyB7Ci0JCQkJCXJlc3VsdC5hZGQoJysnICsgbi5zdWJzdHJpbmcoMikpOwotCQkJCQluaSsrOwotCQkJCQlpZiAobmkgPj0gbmwubGVuZ3RoKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW49IG5sW25pXTsKLQkJCQl9IHdoaWxlIChuLmNoYXJBdCgwKSA9PSAnIScpOwotCQkJCQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQkvLyBjb250ZXh0IGxpbmVzCi0JCQlpZiAob2MgPT0gJyAnICYmIG5jID09ICcgJykgewotCQkJCWRvIHsKLQkJCQkJQXNzZXJ0LmlzVHJ1ZShvLmVxdWFscyhuKSwgIm5vbiBtYXRjaGluZyBjb250ZXh0IGxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0LmFkZCgnICcgKyBvLnN1YnN0cmluZygyKSk7Ci0JCQkJCW9pKys7Ci0JCQkJCW5pKys7Ci0JCQkJCWlmIChvaSA+PSBvbC5sZW5ndGggfHwgbmkgPj0gbmwubGVuZ3RoKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW89IG9sW29pXTsKLQkJCQkJbj0gbmxbbmldOwotCQkJCX0gd2hpbGUgKG8uY2hhckF0KDApID09ICcgJyAmJiBuLmNoYXJBdCgwKSA9PSAnICcpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAob2MgPT0gJyAnKSB7Ci0JCQkJZG8gewotCQkJCQlyZXN1bHQuYWRkKCcgJyArIG8uc3Vic3RyaW5nKDIpKTsKLQkJCQkJb2krKzsKLQkJCQkJaWYgKG9pID49IG9sLmxlbmd0aCkKLQkJCQkJCWJyZWFrOwotCQkJCQlvPSBvbFtvaV07Ci0JCQkJfSB3aGlsZSAoby5jaGFyQXQoMCkgPT0gJyAnKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKG5jID09ICcgJykgewotCQkJCWRvIHsKLQkJCQkJcmVzdWx0LmFkZCgnICcgKyBuLnN1YnN0cmluZygyKSk7Ci0JCQkJCW5pKys7Ci0JCQkJCWlmIChuaSA+PSBubC5sZW5ndGgpCi0JCQkJCQlicmVhazsKLQkJCQkJbj0gbmxbbmldOwotCQkJCX0gd2hpbGUgKG4uY2hhckF0KDApID09ICcgJyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJ1bmV4cGVjdGVkIGNoYXIgPCIgKyBvYyArICI+IDwiICsgbmMgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKgotCSAqIEJyZWFrcyB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gdGFiIHNlcGFyYXRlZCBzdWJzdHJpbmdzLgotCSAqIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCBmcm9tIGVhY2ggdG9rZW4uCi0JICovIAotCXByaXZhdGUgU3RyaW5nW10gc3BsaXQoU3RyaW5nIGxpbmUpIHsKLQkJTGlzdCBsPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdD0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyB0b2tlbj0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKHRva2VuLmxlbmd0aCgpID4gMCkKLSAJCQkJbC5hZGQodG9rZW4pOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIGwudG9BcnJheShuZXcgU3RyaW5nW2wuc2l6ZSgpXSk7Ci0JfQotCQotCS8qCi0JICogQHJldHVybiB0aGUgcGFyc2VkIHRpbWUvZGF0ZSBpbiBtaWxsaXNlY29uZHMgb3IgLTEgb24gZXJyb3IKLQkgKi8KLQlwcml2YXRlIGxvbmcgZXh0cmFjdERhdGUoU3RyaW5nW10gYXJncywgaW50IG4pIHsKLQkJaWYgKG4gPCBhcmdzLmxlbmd0aCkgewotCQkJU3RyaW5nIGxpbmU9IGFyZ3Nbbl07Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgREFURV9GT1JNQVRTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJREFURV9GT1JNQVRTW2ldLnNldExlbmllbnQodHJ1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJRGF0ZSBkYXRlPSBEQVRFX0ZPUk1BVFNbaV0ucGFyc2UobGluZSk7Ci0JCQkJCXJldHVybiBkYXRlLmdldFRpbWUoKTsJCQotCQkJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oImNhbid0IHBhcnNlIGRhdGU6IDwiICsgbGluZSArICI+Iik7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgbnVsbCBpZiBmaWxlIG5hbWUgaXMgIi9kZXYvbnVsbCIuCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBleHRyYWN0UGF0aChTdHJpbmdbXSBhcmdzLCBpbnQgbiwgU3RyaW5nIHBhdGgyKSB7Ci0JCWlmIChuIDwgYXJncy5sZW5ndGgpIHsKLQkJCVN0cmluZyBwYXRoPSBhcmdzW25dOwotCQkJaWYgKERFVl9OVUxMLmVxdWFscyhwYXRoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCBwb3M9IHBhdGgubGFzdEluZGV4T2YoJzonKTsKLQkJCWlmIChwb3MgPj0gMCkKLQkJCQlwYXRoPSBwYXRoLnN1YnN0cmluZygwLCBwb3MpOwotCQkJaWYgKHBhdGgyICE9IG51bGwgJiYgIXBhdGgyLmVxdWFscyhwYXRoKSkgewotCQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJwYXRoIG1pc21hdGNoOiAiICsgcGF0aDIpOyAvLyROT04tTkxTLTEkCi0JCQkJcGF0aD0gcGF0aDI7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFBhdGgocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogVHJpZXMgdG8gZXh0cmFjdCB0d28gaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCi0JICogVGhlIHBhcnNpbmcgb2YgdGhlIGxpbmUgc3RhcnRzIGF0IHRoZSBwb3NpdGlvbiBhZnRlcgotCSAqIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc3RhcnQgYW4gZW5kcwotCSAqIGF0IHRoZSBmaXJzdCBibGFuayAob3IgdGhlIGVuZCBvZiB0aGUgbGluZSkuCi0JICogSWYgb25seSBhIHNpbmdsZSBudW1iZXIgaXMgZm91bmQgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlLgotCSAqIEluIHRoaXMgY2FzZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIGlzIHNldCB0byAxLgotCSAqIElmIGFuIGVycm9yIG9jY3VycyB0aGUgcmFuZ2UgLTEsLTEgaXMgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4dHJhY3RQYWlyKFN0cmluZyBsaW5lLCBjaGFyIHN0YXJ0LCBpbnRbXSBwYWlyKSB7Ci0JCXBhaXJbMF09IHBhaXJbMV09IC0xOwotCQlpbnQgc3RhcnRQb3M9IGxpbmUuaW5kZXhPZihzdGFydCk7Ci0JCWlmIChzdGFydFBvcyA8IDApIHsKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJwYXJzaW5nIGVycm9yIGluIGV4dHJhY3RQYWlyOiBjb3VsZG4ndCBmaW5kIFwnIiArIHN0YXJ0ICsgIlwnIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCWxpbmU9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0UG9zKzEpOwotCQlpbnQgZW5kUG9zPSBsaW5lLmluZGV4T2YoJyAnKTsKLQkJaWYgKGVuZFBvcyA8IDApIHsKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJwYXJzaW5nIGVycm9yIGluIGV4dHJhY3RQYWlyOiBjb3VsZG4ndCBmaW5kIGVuZCBibGFuayIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJbGluZT0gbGluZS5zdWJzdHJpbmcoMCwgZW5kUG9zKTsKLQkJaW50IGNvbW1hPSBsaW5lLmluZGV4T2YoJywnKTsKLQkJaWYgKGNvbW1hID49IDApIHsKLQkJCXBhaXJbMF09IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMCwgY29tbWEpKTsKLQkJCXBhaXJbMV09IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoY29tbWErMSkpOwotCQl9IGVsc2UgewotCQkJcGFpclswXT0gMTsKLQkJCXBhaXJbMV09IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoY29tbWErMSkpOwotCQl9Ci0JfQotCQotCS8vLS0tLSBhcHBseWluZyBhIHBhdGNoIGZpbGUKLQkKLQkvKgotCSAqIFRyaWVzIHRvIHBhdGNoIHRoZSBnaXZlbiBsaW5lcyB3aXRoIHRoZSBzcGVjaWZpZWQgRGlmZi4KLQkgKiBBbnkgaHVuayB0aGF0IGNvdWxkbid0IGJlIGFwcGxpZWQgaXMgcmV0dXJuZWQgaW4gdGhlIGxpc3QgZmFpbGVkSHVua3MuCi0JICovCi0JLyogcGFja2FnZSAqLyB2b2lkIHBhdGNoKERpZmYgZGlmZiwgTGlzdCBsaW5lcywgTGlzdCBmYWlsZWRIdW5rcykgewotCQkKLQkJaW50IHNoaWZ0PSAwOwotCQlJdGVyYXRvciBpdGVyPSBkaWZmLmZIdW5rcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUh1bmsgaHVuaz0gKEh1bmspIGl0ZXIubmV4dCgpOwotCQkJaHVuay5mTWF0Y2hlcz0gZmFsc2U7Ci0JCQlzaGlmdD0gcGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0LCBmYWlsZWRIdW5rcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRyaWVzIHRvIGFwcGx5IHRoZSBzcGVjaWZpZWQgaHVuayB0byB0aGUgZ2l2ZW4gbGluZXMuCi0JICogSWYgdGhlIGh1bmsgY2Fubm90IGJlIGFwcGxpZWQgYXQgdGhlIG9yaWdpbmFsIHBvc2l0aW9uCi0JICogdGhlIG1ldGhvZHMgdHJpZXMgRnV6eiBsaW5lcyBiZWZvcmUgYW5kIGFmdGVyLgotCSAqIElmIHRoaXMgZmFpbHMgdGhlIEh1bmsgaXMgYWRkZWQgdG8gdGhlIGdpdmVuIGxpc3Qgb2YgZmFpbGVkIGh1bmtzLgotCSAqLwotCXByaXZhdGUgaW50IHBhdGNoKEh1bmsgaHVuaywgTGlzdCBsaW5lcywgaW50IHNoaWZ0LCBMaXN0IGZhaWxlZEh1bmtzKSB7Ci0JCWlmICh0cnlQYXRjaChodW5rLCBsaW5lcywgc2hpZnQpKSB7Ci0JCQlpZiAoaHVuay5pc0VuYWJsZWQoKSkKLQkJCQlzaGlmdCs9IGRvUGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0KTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gZm91bmQ9IGZhbHNlOwotCQkJaW50IG9sZFNoaWZ0PSBzaGlmdDsKLQkJCQkJCQotCQkJZm9yIChpbnQgaT0gMTsgaSA8PSBmRnV6ejsgaSsrKSB7Ci0JCQkJaWYgKHRyeVBhdGNoKGh1bmssIGxpbmVzLCBzaGlmdC1pKSkgewotCQkJCQlpZiAoZkFkanVzdFNoaWZ0KQotCQkJCQkJc2hpZnQtPSBpOwotCQkJCQlmb3VuZD0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoISBmb3VuZCkgewotCQkJCWZvciAoaW50IGk9IDE7IGkgPD0gZkZ1eno7IGkrKykgewotCQkJCQlpZiAodHJ5UGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0K2kpKSB7Ci0JCQkJCQlpZiAoZkFkanVzdFNoaWZ0KQotCQkJCQkJCXNoaWZ0Kz0gaTsKLQkJCQkJCWZvdW5kPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChmb3VuZCkgewotCQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJwYXRjaGVkIGh1bmsgYXQgb2Zmc2V0OiAiICsgKHNoaWZ0LW9sZFNoaWZ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzaGlmdCs9IGRvUGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZhaWxlZEh1bmtzICE9IG51bGwpIHsKLQkJCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oImZhaWxlZCBodW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZmFpbGVkSHVua3MuYWRkKGh1bmspOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hpZnQ7Ci0JfQotCQotCS8qCi0JICogVHJpZXMgdG8gYXBwbHkgdGhlIGdpdmVuIGh1bmsgb24gdGhlIHNwZWNpZmllZCBsaW5lcy4KLQkgKiBUaGUgcGFyYW1ldGVyIHNoaWZ0IGlzIGFkZGVkIHRvIHRoZSBsaW5lIG51bWJlcnMgZ2l2ZW4KLQkgKiBpbiB0aGUgaHVuay4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdHJ5UGF0Y2goSHVuayBodW5rLCBMaXN0IGxpbmVzLCBpbnQgc2hpZnQpIHsKLQkJaW50IHBvcz0gaHVuay5mT2xkU3RhcnQgKyBzaGlmdDsKLQkJaW50IGRlbGV0ZU1hdGNoZXM9IDA7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBodW5rLmZMaW5lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHM9IGh1bmsuZkxpbmVzW2ldOwotCQkJQXNzZXJ0LmlzVHJ1ZShzLmxlbmd0aCgpID4gMCk7Ci0JCQlTdHJpbmcgbGluZT0gcy5zdWJzdHJpbmcoMSk7Ci0JCQljaGFyIGNvbnRyb2xDaGFyPSBzLmNoYXJBdCgwKTsKLQkJCWlmIChjb250cm9sQ2hhciA9PSAnICcpIHsJLy8gY29udGV4dCBsaW5lcwotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCWlmIChwb3MgPCAwIHx8IHBvcyA+PSBsaW5lcy5zaXplKCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWlmIChsaW5lc01hdGNoKGxpbmUsIChTdHJpbmcpIGxpbmVzLmdldChwb3MpKSkgewotCQkJCQkJcG9zKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjb250cm9sQ2hhciA9PSAnLScpIHsKLQkJCQkvLyBkZWxldGVkIGxpbmVzCi0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGxpbmVzLnNpemUoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKGxpbmVzTWF0Y2gobGluZSwgKFN0cmluZykgbGluZXMuZ2V0KHBvcykpKSB7Ci0JCQkJCQlkZWxldGVNYXRjaGVzKys7Ci0JCQkJCQlwb3MrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChkZWxldGVNYXRjaGVzIDw9IDApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCXBvcysrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY29udHJvbENoYXIgPT0gJysnKSB7Ci0JCQkJLy8gYWRkZWQgbGluZXMKLQkJCQkvLyB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhICd0cnknCi0JCQl9IGVsc2UKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAidHJ5UGF0Y2g6IHVua25vd24gY29udHJvbCBjaGFyYWN0ZXI6ICIgKyBjb250cm9sQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZG9QYXRjaChIdW5rIGh1bmssIExpc3QgbGluZXMsIGludCBzaGlmdCkgewotCQlpbnQgcG9zPSBodW5rLmZPbGRTdGFydCArIHNoaWZ0OwotCQlmb3IgKGludCBpPSAwOyBpIDwgaHVuay5mTGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzPSBodW5rLmZMaW5lc1tpXTsKLQkJCUFzc2VydC5pc1RydWUocy5sZW5ndGgoKSA+IDApOwotCQkJU3RyaW5nIGxpbmU9IHMuc3Vic3RyaW5nKDEpOwotCQkJY2hhciBjb250cm9sQ2hhcj0gcy5jaGFyQXQoMCk7Ci0JCQlpZiAoY29udHJvbENoYXIgPT0gJyAnKSB7CS8vIGNvbnRleHQgbGluZXMKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQlBc3NlcnQuaXNUcnVlKHBvcyA8IGxpbmVzLnNpemUoKSwgImRvUGF0Y2g6IGluY29uc2lzdGVuY3kgaW4gY29udGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChsaW5lc01hdGNoKGxpbmUsIChTdHJpbmcpIGxpbmVzLmdldChwb3MpKSkgewotCQkJCQkJcG9zKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwb3MrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2xDaGFyID09ICctJykgewotCQkJCS8vIGRlbGV0ZWQgbGluZXMJCQkJCi0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJQXNzZXJ0LmlzVHJ1ZShwb3MgPCBsaW5lcy5zaXplKCksICJkb1BhdGNoOiBpbmNvbnNpc3RlbmN5IGluIGRlbGV0ZWQgbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobGluZXNNYXRjaChsaW5lLCAoU3RyaW5nKSBsaW5lcy5nZXQocG9zKSkpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXBvcysrOwotCQkJCX0KLQkJCQlsaW5lcy5yZW1vdmUocG9zKTsKLQkJCX0gZWxzZSBpZiAoY29udHJvbENoYXIgPT0gJysnKSB7Ci0JCQkJLy8gYWRkZWQgbGluZXMKLQkJCQlsaW5lcy5hZGQocG9zLCAgbGluZSk7Ci0JCQkJcG9zKys7Ci0JCQl9IGVsc2UKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiZG9QYXRjaDogdW5rbm93biBjb250cm9sIGNoYXJhY3RlcjogIiArIGNvbnRyb2xDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWh1bmsuZk1hdGNoZXM9IHRydWU7Ci0JCXJldHVybiBodW5rLmZOZXdMZW5ndGggLSBodW5rLmZPbGRMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHlBbGwoSVJlc291cmNlIHRhcmdldCwgSVByb2dyZXNzTW9uaXRvciBwbSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJZmluYWwgaW50IFdPUktfVU5JVD0gMTA7Ci0JCQotCQlpbnQgaTsKLQkJCi0JCUlGaWxlIHNpbmdsZUZpbGU9IG51bGw7CS8vIGZpbGUgdG8gYmUgcGF0Y2hlZAotCQlJQ29udGFpbmVyIGNvbnRhaW5lcj0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0JCQljb250YWluZXI9IChJQ29udGFpbmVyKSB0YXJnZXQ7Ci0JCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlzaW5nbGVGaWxlPSAoSUZpbGUpIHRhcmdldDsKLQkJCWNvbnRhaW5lcj0gc2luZ2xlRmlsZS5nZXRQYXJlbnQoKTsKLQkJfSBlbHNlIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBnZXQgYWxsIGZpbGVzIHRvIGJlIG1vZGlmaWVkIGluIG9yZGVyIHRvIGNhbGwgdmFsaWRhdGVFZGl0Ci0JCUxpc3QgbGlzdD0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoc2luZ2xlRmlsZSAhPSBudWxsKQotCQkJbGlzdC5hZGQoc2luZ2xlRmlsZSk7Ci0JCWVsc2UgewotCQkJZm9yIChpPSAwOyBpIDwgZkRpZmZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRGlmZiBkaWZmPSBmRGlmZnNbaV07Ci0JCQkJaWYgKGRpZmYuaXNFbmFibGVkKCkpIHsKLQkJCQkJc3dpdGNoIChkaWZmLmdldFR5cGUoKSkgewotCQkJCQljYXNlIERpZmZlcmVuY2VyLkNIQU5HRToKLQkJCQkJCWxpc3QuYWRkKGNyZWF0ZVBhdGgoY29udGFpbmVyLCBnZXRQYXRoKGRpZmYpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoISBVdGlsaXRpZXMudmFsaWRhdGVSZXNvdXJjZXMobGlzdCwgc2hlbGwsIHRpdGxlKSkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChwbSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZT0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoZXIuVGFzay5tZXNzYWdlIik7CS8vJE5PTi1OTFMtMSQKLQkJCXBtLmJlZ2luVGFzayhtZXNzYWdlLCBmRGlmZnMubGVuZ3RoKldPUktfVU5JVCk7Ci0JCX0KLQkJCi0JCWZvciAoaT0gMDsgaSA8IGZEaWZmcy5sZW5ndGg7IGkrKykgewotCQkJCi0JCQlpbnQgd29ya1RpY2tzPSBXT1JLX1VOSVQ7Ci0JCQkKLQkJCURpZmYgZGlmZj0gZkRpZmZzW2ldOwotCQkJaWYgKGRpZmYuaXNFbmFibGVkKCkpIHsKLQkJCQkKLQkJCQlJUGF0aCBwYXRoPSBnZXRQYXRoKGRpZmYpOwotCQkJCWlmIChwbSAhPSBudWxsKQotCQkJCQlwbS5zdWJUYXNrKHBhdGgudG9TdHJpbmcoKSk7Ci0JCQkKLQkJCQlJRmlsZSBmaWxlPSBzaW5nbGVGaWxlICE9IG51bGwKLQkJCQkJCQkJPyBzaW5nbGVGaWxlCi0JCQkJCQkJCTogY3JlYXRlUGF0aChjb250YWluZXIsIHBhdGgpOwotCQkJCQkKLQkJCQlMaXN0IGZhaWxlZD0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgcmVzdWx0PSBudWxsOwotCQkJCQotCQkJCWludCB0eXBlPSBkaWZmLmdldFR5cGUoKTsKLQkJCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIERpZmZlcmVuY2VyLkFERElUSU9OOgotCQkJCQkvLyBwYXRjaCBpdCBhbmQgY29sbGVjdCByZWplY3RlZCBodW5rcwotCQkJCQlyZXN1bHQ9IGFwcGx5KGRpZmYsIGZpbGUsIHRydWUsIGZhaWxlZCk7Ci0JCQkJCXN0b3JlKGNyZWF0ZVN0cmluZyhyZXN1bHQpLCBmaWxlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCB3b3JrVGlja3MpKTsKLQkJCQkJd29ya1RpY2tzLT0gV09SS19VTklUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERpZmZlcmVuY2VyLkRFTEVUSU9OOgotCQkJCQlmaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCB3b3JrVGlja3MpKTsKLQkJCQkJd29ya1RpY2tzLT0gV09SS19VTklUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERpZmZlcmVuY2VyLkNIQU5HRToKLQkJCQkJLy8gcGF0Y2ggaXQgYW5kIGNvbGxlY3QgcmVqZWN0ZWQgaHVua3MKLQkJCQkJcmVzdWx0PSBhcHBseShkaWZmLCBmaWxlLCBmYWxzZSwgZmFpbGVkKTsKLQkJCQkJc3RvcmUoY3JlYXRlU3RyaW5nKHJlc3VsdCksIGZpbGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIHdvcmtUaWNrcykpOwotCQkJCQl3b3JrVGlja3MtPSBXT1JLX1VOSVQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChmYWlsZWQuc2l6ZSgpID4gMCkgewotCQkJCQlJUGF0aCBwcD0gbnVsbDsKLQkJCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCQlwcD0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJCQlwcD0gcHAuYXBwZW5kKHBhdGgubGFzdFNlZ21lbnQoKSArIFJFSkVDVF9GSUxFX0VYVEVOU0lPTik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcHA9IG5ldyBQYXRoKHBhdGgubGFzdFNlZ21lbnQoKSArIFJFSkVDVF9GSUxFX0VYVEVOU0lPTik7Ci0JCQkJCWZpbGU9IGNyZWF0ZVBhdGgoY29udGFpbmVyLCBwcCk7Ci0JCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJCXN0b3JlKGdldFJlamVjdGVkKGZhaWxlZCksIGZpbGUsIHBtKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSU1hcmtlciBtYXJrZXI9IGZpbGUuY3JlYXRlTWFya2VyKE1BUktFUl9UWVBFKTsKLQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoZXIuTWFya2VyLm1lc3NhZ2UiKSk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuUFJJT1JJVFksIElNYXJrZXIuUFJJT1JJVFlfSElHSCk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gTmVlZFdvcmsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQlpZiAocG0uaXNDYW5jZWxlZCgpKQotCQkJCQlicmVhazsKLQkJCQlpZiAod29ya1RpY2tzID4gMCkKLQkJCQkJcG0ud29ya2VkKHdvcmtUaWNrcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZWFkcyB0aGUgY29udGVudHMgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmV0dXJucyB0aGVtIGFzCi0JICogYSBMaXN0IG9mIGxpbmVzLgotCSAqLwotCUxpc3QgbG9hZChJRmlsZSBmaWxlLCBib29sZWFuIGNyZWF0ZSkgewotCQlMaXN0IGxpbmVzPSBudWxsOwotCQlpZiAoIWNyZWF0ZSAmJiBmaWxlICE9IG51bGwpIHsKLQkJCS8vIHJlYWQgY3VycmVudCBjb250ZW50cwotCQkJSW5wdXRTdHJlYW0gaXM9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlzPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCi0JCQkJUmVhZGVyIHN0cmVhbVJlYWRlcj0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW1SZWFkZXI9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgVXRpbGl0aWVzLmdldENoYXJzZXQoZmlsZSkpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geCkgewotCQkJCQkvLyB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQlzdHJlYW1SZWFkZXI9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7Ci0JCQkJfQotCQkJCQotCQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlcj0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHN0cmVhbVJlYWRlcik7Ci0JCQkJTGluZVJlYWRlciBscj0gbmV3IExpbmVSZWFkZXIocmVhZGVyKTsKLQkJCQlpZiAoISJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJbHIuaWdub3JlU2luZ2xlQ1IoKTsKLQkJCQlsaW5lcz0gbHIucmVhZExpbmVzKCk7Ci0JCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAobGluZXMgPT0gbnVsbCkKLQkJCWxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBsaW5lczsKLQl9Ci0JCi0JTGlzdCBhcHBseShEaWZmIGRpZmYsIElGaWxlIGZpbGUsIGJvb2xlYW4gY3JlYXRlLCBMaXN0IGZhaWxlZEh1bmtzKSB7Ci0JCUxpc3QgbGluZXM9IGxvYWQoZmlsZSwgY3JlYXRlKTsKLQkJcGF0Y2goZGlmZiwgbGluZXMsIGZhaWxlZEh1bmtzKTsKLQkJcmV0dXJuIGxpbmVzOwotCX0KLQkKLQkvKgotCSAqIENvbnZlcnRzIHRoZSBzdHJpbmcgaW50byBieXRlcyBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGdpdmVuIGZpbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlKFN0cmluZyBjb250ZW50cywgSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJYnl0ZVtdIGJ5dGVzOwotCQl0cnkgewotCQkJYnl0ZXM9IGNvbnRlbnRzLmdldEJ5dGVzKFV0aWxpdGllcy5nZXRDaGFyc2V0KGZpbGUpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB4KSB7Ci0JCQkvLyB1c2VzIGRlZmF1bHQgZW5jb2RpbmcKLQkJCWJ5dGVzPSBjb250ZW50cy5nZXRCeXRlcygpOwotCQl9Ci0JCQotCQlJbnB1dFN0cmVhbSBpcz0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJdHJ5IHsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5zZXRDb250ZW50cyhpcywgZmFsc2UsIHRydWUsIHBtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlsZS5jcmVhdGUoaXMsIGZhbHNlLCBwbSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQ29uY2F0ZW5hdGVzIGFsbCBzdHJpbmdzIGZvdW5kIGluIHRoZSBnaXZlbiBMaXN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0cmluZyhMaXN0IGxpbmVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJdGVyYXRvciBpdGVyPSBsaW5lcy5pdGVyYXRvcigpOwotCQlpZiAoZlByZXNlcnZlTGluZURlbGltaXRlcnMpIHsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkJCQlzYi5hcHBlbmQoKFN0cmluZylpdGVyLm5leHQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbGluZVNlcGFyYXRvcj0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgbGluZT0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCQlpbnQgbD0gbGVuZ3RoKGxpbmUpOwotCQkJCWlmIChsIDwgbGluZS5sZW5ndGgoKSkgewkvLyBsaW5lIGhhcyBkZWxpbWl0ZXIKLQkJCQkJc2IuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDAsIGwpKTsKLQkJCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChsaW5lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JU3RyaW5nIGdldFJlamVjdGVkKExpc3QgZmFpbGVkSHVua3MpIHsKLQkJaWYgKGZhaWxlZEh1bmtzLnNpemUoKSA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgbGluZVNlcGFyYXRvcj0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJdGVyYXRvciBpdGVyPSBmYWlsZWRIdW5rcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUh1bmsgaHVuaz0gKEh1bmspIGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGh1bmsuZ2V0UmVqZWN0ZWREZXNjcmlwdGlvbigpKTsKLQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCXNiLmFwcGVuZChodW5rLmdldENvbnRlbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogRW5zdXJlcyB0aGF0IGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBwYXRoIGV4aXN0cyBpbgotCSAqIHRoZSBnaXZlbiBjb250YWluZXIuIEZvbGRlciBhcmUgY3JlYXRlZCBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBjcmVhdGVQYXRoKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJSUZvbGRlciBmPSBjb250YWluZXIuZ2V0Rm9sZGVyKHBhdGgudXB0b1NlZ21lbnQoMSkpOwotCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCWYuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJCXJldHVybiBjcmVhdGVQYXRoKGYsIHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCX0KLQkJLy8gYSBsZWFmCi0JCXJldHVybiBjb250YWluZXIuZ2V0RmlsZShwYXRoKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcmVtb3ZlZC4KLQkgKiBXaGl0ZXNwYWNlIGlzIGRlZmluZWQgYnkgPGNvZGU+Q2hhcmFjdGVyLmlzV2hpdGVzcGFjZSguLi4pPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaXBXaGl0ZVNwYWNlKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbD0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGw7IGkrKykgewotCQkJY2hhciBjPSBzLmNoYXJBdChpKTsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogQ29tcGFyZXMgdHdvIHN0cmluZ3MuCi0JICogSWYgZklnbm9yZVdoaXRlc3BhY2UgaXMgdHJ1ZSB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxpbmVzTWF0Y2goU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLQkJaWYgKGZJZ25vcmVXaGl0ZXNwYWNlKQotCQkJcmV0dXJuIHN0cmlwV2hpdGVTcGFjZShsaW5lMSkuZXF1YWxzKHN0cmlwV2hpdGVTcGFjZShsaW5lMikpOwotCQlpZiAoZklnbm9yZUxpbmVEZWxpbWl0ZXIpIHsKLQkJCWludCBsMT0gbGVuZ3RoKGxpbmUxKTsKLQkJCWludCBsMj0gbGVuZ3RoKGxpbmUyKTsKLQkJCWlmIChsMSAhPSBsMikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gbGluZTEucmVnaW9uTWF0Y2hlcygwLCBsaW5lMiwgMCwgbDEpOwotCQl9Ci0JCXJldHVybiBsaW5lMS5lcXVhbHMobGluZTIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCAoZXhsdWRpbmcgYSBsaW5lIGRlbGltaXRlciBDUiwgTEYsIENSL0xGKQotCSAqIG9mIHRoZSBnaXZlbiBzdHJpbmcuCi0JICovCi0JLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGxlbmd0aChTdHJpbmcgcykgewotCQlpbnQgbD0gcy5sZW5ndGgoKTsKLQkJaWYgKGwgPiAwKSB7Ci0JCQljaGFyIGM9IHMuY2hhckF0KGwtMSk7Ci0JCQlpZiAoYyA9PSAnXHInKQotCQkJCXJldHVybiBsLTE7Ci0JCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJaWYgKGwgPiAxICYmIHMuY2hhckF0KGwtMikgPT0gJ1xyJykKLQkJCQkJcmV0dXJuIGwtMjsKLQkJCQlyZXR1cm4gbC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBsOwotCX0KLQotCWludCBjYWxjdWxhdGVGdXp6KEh1bmsgaHVuaywgTGlzdCBsaW5lcywgaW50IHNoaWZ0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBpbnRbXSBmdXp6KSB7Ci0JCQotCQlodW5rLmZNYXRjaGVzPSBmYWxzZTsKLQkJaWYgKHRyeVBhdGNoKGh1bmssIGxpbmVzLCBzaGlmdCkpIHsKLQkJCXNoaWZ0Kz0gZG9QYXRjaChodW5rLCBsaW5lcywgc2hpZnQpOwotCQkJZnV6elswXT0gMDsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gZm91bmQ9IGZhbHNlOwotCQkJaW50IGh1Z2VGdXp6PSBsaW5lcy5zaXplKCk7CS8vIHRoZSBtYXhpbXVtIHdlIG5lZWQgZm9yIHRoaXMgZmlsZQotCQkJZnV6elswXT0gLTI7CS8vIG5vdCBmb3VuZAotCQkJCi0JCQlmb3IgKGludCBpPSAxOyBpIDw9IGh1Z2VGdXp6OyBpKyspIHsKLQkJCQlpZiAocG0uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWZ1enpbMF09IC0xOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJaWYgKHRyeVBhdGNoKGh1bmssIGxpbmVzLCBzaGlmdC1pKSkgewotCQkJCQlmdXp6WzBdPSBpOwotCQkJCQlpZiAoZkFkanVzdFNoaWZ0KQotCQkJCQkJc2hpZnQtPSBpOwotCQkJCQlmb3VuZD0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoISBmb3VuZCkgewotCQkJCWZvciAoaW50IGk9IDE7IGkgPD0gaHVnZUZ1eno7IGkrKykgewotCQkJCQlpZiAocG0uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlmdXp6WzBdPSAtMTsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCQkJCWlmICh0cnlQYXRjaChodW5rLCBsaW5lcywgc2hpZnQraSkpIHsKLQkJCQkJCWZ1enpbMF09IGk7Ci0JCQkJCQlpZiAoZkFkanVzdFNoaWZ0KQotCQkJCQkJCXNoaWZ0Kz0gaTsKLQkJCQkJCWZvdW5kPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChmb3VuZCkKLQkJCQlzaGlmdCs9IGRvUGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0KTsKLQkJfQotCQlyZXR1cm4gc2hpZnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QcmV2aWV3UGF0Y2hQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1ByZXZpZXdQYXRjaFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1ZDViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1ByZXZpZXdQYXRjaFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuRGlmZkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSUNvbXBhcmVDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuKjsKLQotCi0vKioKLSAqIFNob3dzIHRoZSBwYXJzZWQgcGF0Y2ggZmlsZSBhbmQgYW55IG1pc21hdGNoZXMKLSAqIGJldHdlZW4gZmlsZXMsIGh1bmtzIGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gKiByZXNvdXJjZXMuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgUHJldmlld1BhdGNoUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQkKLQkvKioKLQkgKiBVc2VkIHdpdGggQ29tcGFyZUlucHV0Ci0JICovCi0Jc3RhdGljIGNsYXNzIEh1bmtJbnB1dCBpbXBsZW1lbnRzIElUeXBlZEVsZW1lbnQsIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yIHsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTY9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmQ29udGVudDsKLQkJU3RyaW5nIGZUeXBlOwotCQkKLQkJSHVua0lucHV0KFN0cmluZyB0eXBlLCBTdHJpbmcgcykgewotCQkJZlR5cGU9IHR5cGU7Ci0JCQlmQ29udGVudD0gczsKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuTm9OYW1lLnRleHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB7Ci0JCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFV0aWxpdGllcy5nZXRCeXRlcyhmQ29udGVudCwgVVRGXzE2KSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgewotCQkJcmV0dXJuIFVURl8xNjsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSBQYXRjaFdpemFyZCBmUGF0Y2hXaXphcmQ7Ci0JCi0JcHJpdmF0ZSBUcmVlIGZUcmVlOwotCXByaXZhdGUgQ29tYm8gZlN0cmlwUHJlZml4U2VnbWVudHM7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmSHVua1ZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBmSWdub3JlV2hpdGVzcGFjZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmUmV2ZXJzZVBhdGNoQnV0dG9uOwotCXByaXZhdGUgVGV4dCBmRnV6ekZpZWxkOwotCQotCXByaXZhdGUgSW1hZ2VbXSBmSW1hZ2VzPSBuZXcgSW1hZ2VbNl07CQotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCQotCQotCS8qIHBhY2thZ2UgKi8gUHJldmlld1BhdGNoUGFnZShQYXRjaFdpemFyZCBwdykgewotCQlzdXBlcigiUHJldmlld1BhdGNoUGFnZSIsCS8vJE5PTi1OTFMtMSQgCi0JCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS50aXRsZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJc2V0TWVzc2FnZShQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5tZXNzYWdlIikpOwkvLyROT04tTkxTLTEkCi0JCQotCQlmUGF0Y2hXaXphcmQ9IHB3OwotCQkvL3NldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQotCQlpbnQgdz0gMTY7Ci0JCQotCQlJbWFnZURlc2NyaXB0b3IgYWRkSWQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2FkZF9vdi5naWYiKTsJLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVsSWQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2RlbF9vdi5naWYiKTsJLy8kTk9OLU5MUy0xJAotCi0JCUltYWdlRGVzY3JpcHRvciBlcnJJZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvZXJyb3Jfb3YuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLQkJSW1hZ2UgZXJySW09IGVycklkLmNyZWF0ZUltYWdlKCk7Ci0JCQotCQlmSW1hZ2VzWzBdPSBuZXcgRGlmZkltYWdlKG51bGwsIG51bGwsIHcpLmNyZWF0ZUltYWdlKCk7Ci0JCWZJbWFnZXNbMV09IG5ldyBEaWZmSW1hZ2UobnVsbCwgYWRkSWQsIHcpLmNyZWF0ZUltYWdlKCk7Ci0JCWZJbWFnZXNbMl09IG5ldyBEaWZmSW1hZ2UobnVsbCwgZGVsSWQsIHcpLmNyZWF0ZUltYWdlKCk7Ci0KLQkJZkltYWdlc1szXT0gbmV3IERpZmZJbWFnZShlcnJJbSwgbnVsbCwgdykuY3JlYXRlSW1hZ2UoKTsKLQkJZkltYWdlc1s0XT0gbmV3IERpZmZJbWFnZShlcnJJbSwgYWRkSWQsIHcpLmNyZWF0ZUltYWdlKCk7Ci0JCWZJbWFnZXNbNV09IG5ldyBEaWZmSW1hZ2UoZXJySW0sIGRlbElkLCB3KS5jcmVhdGVJbWFnZSgpOwotCQkKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBuZXcgQ29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRMZWZ0RWRpdGFibGUoZmFsc2UpOwotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0TGVmdExhYmVsKFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkxlZnQudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRSaWdodEVkaXRhYmxlKGZhbHNlKTsKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldFJpZ2h0TGFiZWwoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuUmlnaHQudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBXaXphcmRQYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpCi0JCQlidWlsZFRyZWUoKTsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9Ci0KLQlJbWFnZSBnZXRJbWFnZShEaWZmIGRpZmYpIHsKLQkJaWYgKGRpZmYuZk1hdGNoZXMpIHsKLQkJCXN3aXRjaCAoZGlmZi5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgRGlmZmVyZW5jZXIuQURESVRJT046Ci0JCQkJcmV0dXJuIGZJbWFnZXNbMV07Ci0JCQljYXNlIERpZmZlcmVuY2VyLkRFTEVUSU9OOgotCQkJCXJldHVybiBmSW1hZ2VzWzJdOwotCQkJfQotCQkJcmV0dXJuIGZJbWFnZXNbMF07Ci0JCX0KLQkJc3dpdGNoIChkaWZmLmdldFR5cGUoKSkgewotCQljYXNlIERpZmZlcmVuY2VyLkFERElUSU9OOgotCQkJcmV0dXJuIGZJbWFnZXNbNF07Ci0JCWNhc2UgRGlmZmVyZW5jZXIuREVMRVRJT046Ci0JCQlyZXR1cm4gZkltYWdlc1s1XTsKLQkJfQotCQlyZXR1cm4gZkltYWdlc1szXTsKLQl9Ci0JCi0JSW1hZ2UgZ2V0SW1hZ2UoSHVuayBodW5rKSB7Ci0JCWlmIChodW5rLmZNYXRjaGVzKQotCQkJcmV0dXJuIGZJbWFnZXNbMF07Ci0JCXJldHVybiBmSW1hZ2VzWzNdOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIElDb21wYXJlQ29udGV4dElkcy5QQVRDSF9QUkVWSUVXX1dJWkFSRF9QQUdFKTsJCQotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0JCWJ1aWxkUGF0Y2hPcHRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCVNwbGl0dGVyIHNwbGl0dGVyPSBuZXcgU3BsaXR0ZXIoY29tcG9zaXRlLCBTV1QuVkVSVElDQUwpOwotCQlzcGxpdHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCi0JCQotCQkvLyB0b3AgcGFuZSBzaG93aW5nIGRpZmZzIGFuZCBodW5rcyBpbiBhIGNoZWNrIGJveCB0cmVlIAotCQlmVHJlZT0gbmV3IFRyZWUoc3BsaXR0ZXIsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJZlRyZWUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJCi0JCS8vIGJvdHRvbSBwYW5lIHNob3dpbmcgaHVua3MgaW4gY29tcGFyZSB2aWV3ZXIgCi0JCWZIdW5rVmlld2VyPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoc3BsaXR0ZXIsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCkgewotCQkJcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0JCQkJcmV0dXJuIENvbXBhcmVVSS5maW5kQ29udGVudFZpZXdlcihvbGRWaWV3ZXIsIChJQ29tcGFyZUlucHV0KWlucHV0LCB0aGlzLCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24pOwotCQkJfQotCQl9OwotCQlnZD0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJZkh1bmtWaWV3ZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyByZWdpc3RlciBsaXN0ZW5lcnMKLQkJCi0JCWZUcmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlUcmVlSXRlbSB0aT0gKFRyZWVJdGVtKSBlLml0ZW07Ci0JCQkJCU9iamVjdCBkYXRhPSBlLml0ZW0uZ2V0RGF0YSgpOwotCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJCQlib29sZWFuIGNoZWNrZWQ9IHRpLmdldENoZWNrZWQoKTsKLQkJCQkJCWlmIChkYXRhIGluc3RhbmNlb2YgSHVuaykgewotCQkJCQkJCUh1bmsgaHVuaz0gKEh1bmspIGRhdGE7Ci0JCQkJCQkJY2hlY2tlZD0gY2hlY2tlZCAmJiBodW5rLmZNYXRjaGVzOwotCQkJCQkJCS8vaHVuay5zZXRFbmFibGVkKGNoZWNrZWQpOwotCQkJCQkJCXRpLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JCQkJCQkJdXBkYXRlR3JheWVkU3RhdGUodGkpOwotCQkJCQkJfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRGlmZikgewotCQkJCQkJCXVwZGF0ZUNoZWNrZWRTdGF0ZSh0aSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEh1bmspCi0JCQkJCQkJUHJldmlld1BhdGNoUGFnZS50aGlzLmZIdW5rVmlld2VyLnNldElucHV0KGNyZWF0ZUlucHV0KChIdW5rKWRhdGEpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlQcmV2aWV3UGF0Y2hQYWdlLnRoaXMuZkh1bmtWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZUcmVlLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpZiAoZkltYWdlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCBmSW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoZkltYWdlc1tpXSA9PSBudWxsKQotCQkJCQkJCWZJbWFnZXNbaV0uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCWZJbWFnZXM9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJLy8gY3JlYXRpbmcgdHJlZSdzIGNvbnRlbnQKLQkJYnVpbGRUcmVlKCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsJCQotCX0KLQkKLQkvKgotCSAqCUNyZWF0ZSB0aGUgZ3JvdXAgZm9yIHNldHRpbmcgdmFyaW91cyBwYXRjaCBvcHRpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGF0Y2hPcHRpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJR3JpZExheW91dCBnbDsKLQkJR3JpZERhdGEgZ2Q7Ci0JCUxhYmVsIGw7Ci0JCQkJCi0JCWZpbmFsIFBhdGNoZXIgcGF0Y2hlcj0gZlBhdGNoV2l6YXJkLmdldFBhdGNoZXIoKTsKLQkJCi0JCUdyb3VwIGdyb3VwPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuUGF0Y2hPcHRpb25zLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCWdsPSBuZXcgR3JpZExheW91dCgpOyBnbC5udW1Db2x1bW5zPSA0OyBnbC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWdyb3VwLnNldExheW91dChnbCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQotCQkvLyAxc3Qgcm93Ci0JCQotCQlDb21wb3NpdGUgcGFpcj0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCQlnbD0gbmV3IEdyaWRMYXlvdXQoKTsgZ2wubnVtQ29sdW1ucz0gMjsgZ2wubWFyZ2luSGVpZ2h0PSBnbC5tYXJnaW5XaWR0aD0gMDsKLQkJcGFpci5zZXRMYXlvdXQoZ2wpOwotCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhaXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkJbD0gbmV3IExhYmVsKHBhaXIsIFNXVC5OT05FKTsKLQkJCWwuc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5JZ25vcmVTZWdtZW50cy50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUiB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWZTdHJpcFByZWZpeFNlZ21lbnRzPSBuZXcgQ29tYm8ocGFpciwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuU0lNUExFKTsKLQkJCWludCBwcmVmaXhDbnQ9IHBhdGNoZXIuZ2V0U3RyaXBQcmVmaXhTZWdtZW50cygpOwotCQkJU3RyaW5nIHByZWZpeD0gSW50ZWdlci50b1N0cmluZyhwcmVmaXhDbnQpOwotCQkJZlN0cmlwUHJlZml4U2VnbWVudHMuYWRkKHByZWZpeCk7Ci0JCQlmU3RyaXBQcmVmaXhTZWdtZW50cy5zZXRUZXh0KHByZWZpeCk7Ci0JCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUiB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWZTdHJpcFByZWZpeFNlZ21lbnRzLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJYWRkU3BhY2VyKGdyb3VwKTsKLQkJCi0JCWZSZXZlcnNlUGF0Y2hCdXR0b249IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZSZXZlcnNlUGF0Y2hCdXR0b24uc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5SZXZlcnNlUGF0Y2gudGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYWRkU3BhY2VyKGdyb3VwKTsKLQkJCi0JCS8vIDJuZCByb3cKLQkJcGFpcj0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCQlnbD0gbmV3IEdyaWRMYXlvdXQoKTsgZ2wubnVtQ29sdW1ucz0gMzsgZ2wubWFyZ2luSGVpZ2h0PSBnbC5tYXJnaW5XaWR0aD0gMDsKLQkJcGFpci5zZXRMYXlvdXQoZ2wpOwotCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhaXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCQlsPSBuZXcgTGFiZWwocGFpciwgU1dULk5PTkUpOwotCQkJbC5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkZ1enpGYWN0b3IudGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbC5zZXRUb29sVGlwVGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5GdXp6RmFjdG9yLnRvb2x0aXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQkJCQotCQkJZkZ1enpGaWVsZD0gbmV3IFRleHQocGFpciwgU1dULkJPUkRFUik7Ci0JCQlmRnV6ekZpZWxkLnNldFRleHQoIjIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7IGdkLndpZHRoSGludD0gMzA7Ci0JCQlmRnV6ekZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQotCQkJQnV0dG9uIGI9IG5ldyBCdXR0b24ocGFpciwgU1dULlBVU0gpOwotCQkJYi5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkd1ZXNzRnV6ei50ZXh0IikpOwkvLyROT04tTkxTLTEkCi0JCQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlpbnQgZnV6ej0gZ3Vlc3NGdXp6RmFjdG9yKHBhdGNoZXIpOwotCQkJCQkJaWYgKGZ1enogPj0gMCkKLQkJCQkJCQlmRnV6ekZpZWxkLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhmdXp6KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJYi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWFkZFNwYWNlcihncm91cCk7Ci0JCQotCQlmSWdub3JlV2hpdGVzcGFjZUJ1dHRvbj0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJZklnbm9yZVdoaXRlc3BhY2VCdXR0b24uc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5JZ25vcmVXaGl0ZXNwYWNlLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWFkZFNwYWNlcihncm91cCk7Ci0JCQkJCi0JCS8vIHJlZ2lzdGVyIGxpc3RlbmVycwotCQkJCi0JCWlmIChmU3RyaXBQcmVmaXhTZWdtZW50cyAhPSBudWxsKSAKLQkJCWZTdHJpcFByZWZpeFNlZ21lbnRzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlpZiAocGF0Y2hlci5zZXRTdHJpcFByZWZpeFNlZ21lbnRzKGdldFN0cmlwUHJlZml4U2VnbWVudHMoKSkpCi0JCQkJCQkJdXBkYXRlVHJlZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJZlJldmVyc2VQYXRjaEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKHBhdGNoZXIuc2V0UmV2ZXJzZWQoZlJldmVyc2VQYXRjaEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpCi0JCQkJCQl1cGRhdGVUcmVlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmSWdub3JlV2hpdGVzcGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKHBhdGNoZXIuc2V0SWdub3JlV2hpdGVzcGFjZShmSWdub3JlV2hpdGVzcGFjZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpCi0JCQkJCQl1cGRhdGVUcmVlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJZkZ1enpGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHBhdGNoZXIuc2V0RnV6eihnZXRGdXp6RmFjdG9yKCkpKQotCQkJCQkJdXBkYXRlVHJlZSgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ3Vlc3NGdXp6RmFjdG9yKGZpbmFsIFBhdGNoZXIgcGF0Y2hlcikgewotCQlmaW5hbCBpbnQgc3RyaXA9IGdldFN0cmlwUHJlZml4U2VnbWVudHMoKTsKLQkJZmluYWwgaW50W10gcmVzdWx0PSBuZXcgaW50WzFdOwotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgdHJ1ZSwKLQkJCS8vVGltZW91dENvbnRleHQucnVuKHRydWUsIEdVRVNTX1RJTUVPVVQsIGdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCW5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCXJlc3VsdFswXT0gZ3Vlc3MocGF0Y2hlciwgbW9uaXRvciwgc3RyaXApOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCXJldHVybiByZXN1bHRbMF07Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIE5lZWRXb3JrCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBOZWVkV29yawotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ3Vlc3MoUGF0Y2hlciBwYXRjaGVyLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBpbnQgc3RyaXApIHsKLQkJCi0JCURpZmZbXSBkaWZmcz0gcGF0Y2hlci5nZXREaWZmcygpOwotCQlpZiAoZGlmZnMgPT0gbnVsbCB8fCBkaWZmcy5sZW5ndGggPD0gMCkKLQkJCXJldHVybiAtMTsKLQkJCi0JCS8vIG5vdyBjb2xsZWN0IGZpbGVzIGFuZCBkZXRlcm1pbmUgIndvcmsiCi0JCUlGaWxlW10gZmlsZXM9IG5ldyBJRmlsZVtkaWZmcy5sZW5ndGhdOwotCQlpbnQgd29yaz0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpZmZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEaWZmIGRpZmY9IGRpZmZzW2ldOwotCQkJaWYgKGRpZmYgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChkaWZmLmdldFR5cGUoKSAhPSBEaWZmZXJlbmNlci5BRERJVElPTikgewotCQkJCUlQYXRoIHA9IGRpZmYuZk9sZFBhdGg7Ci0JCQkJaWYgKHN0cmlwID4gMCAmJiBzdHJpcCA8IHAuc2VnbWVudENvdW50KCkpCi0JCQkJCXA9IHAucmVtb3ZlRmlyc3RTZWdtZW50cyhzdHJpcCk7Ci0JCQkJSUZpbGUgZmlsZT0gZXhpc3RzSW5TZWxlY3Rpb24ocCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlmaWxlc1tpXT0gZmlsZTsKLQkJCQkJd29yays9IGRpZmYuZkh1bmtzLnNpemUoKTsKLQkJCQl9Ci0JCQl9CQotCQl9Ci0JCQotCQkvLyBkbyB0aGUgIndvcmsiCi0JCWludFtdIGZ1enpSZWY9IG5ldyBpbnRbMV07Ci0JCVN0cmluZyBmb3JtYXQ9IFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkd1ZXNzRnV6elByb2dyZXNzLmZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCXBtLmJlZ2luVGFzayhQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5HdWVzc0Z1enpQcm9ncmVzcy50ZXh0IiksIHdvcmspOwkvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpbnQgZnV6ej0gMDsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBkaWZmcy5sZW5ndGg7IGkrKykgewotCQkJCURpZmYgZD0gZGlmZnNbaV07Ci0JCQkJSUZpbGUgZmlsZT0gZmlsZXNbaV07Ci0JCQkJaWYgKGQgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwpIHsKLQkJCQkJTGlzdCBsaW5lcz0gcGF0Y2hlci5sb2FkKGZpbGUsIGZhbHNlKTsKLQkJCQkJU3RyaW5nIG5hbWU9IGQuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXI9IGQuZkh1bmtzLml0ZXJhdG9yKCk7Ci0JCQkJCWludCBzaGlmdD0gMDsKLQkJCQkJZm9yIChpbnQgaGNudD0gMTsgaXRlci5oYXNOZXh0KCk7IGhjbnQrKykgewotCQkJCQkJcG0uc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBTdHJpbmdbXSB7IG5hbWUsIEludGVnZXIudG9TdHJpbmcoaGNudCkgfSApKTsKLQkJCQkJCUh1bmsgaD0gKEh1bmspIGl0ZXIubmV4dCgpOwotCQkJCQkJc2hpZnQ9IHBhdGNoZXIuY2FsY3VsYXRlRnV6eihoLCBsaW5lcywgc2hpZnQsIHBtLCBmdXp6UmVmKTsKLQkJCQkJCWludCBmPSBmdXp6UmVmWzBdOwotCQkJCQkJaWYgKGYgPT0gLTEpCS8vIGNhbmNlbAotCQkJCQkJCXJldHVybiAtMTsKLQkJCQkJCWlmIChmID4gZnV6eikKLQkJCQkJCQlmdXp6PSBmOwotCQkJCQkJcG0ud29ya2VkKDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZ1eno7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JSUNvbXBhcmVJbnB1dCBjcmVhdGVJbnB1dChIdW5rIGh1bmspIHsKLQkJCi0JCVN0cmluZ1tdIGxpbmVzPSBodW5rLmZMaW5lczsKLQkJU3RyaW5nQnVmZmVyIGxlZnQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIHJpZ2h0PSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBsaW5lPSBsaW5lc1tpXTsKLQkJCVN0cmluZyByZXN0PSBsaW5lLnN1YnN0cmluZygxKTsKLQkJCXN3aXRjaCAobGluZS5jaGFyQXQoMCkpIHsKLQkJCWNhc2UgJyAnOgotCQkJCWxlZnQuYXBwZW5kKHJlc3QpOwotCQkJCXJpZ2h0LmFwcGVuZChyZXN0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJy0nOgotCQkJCWxlZnQuYXBwZW5kKHJlc3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnKyc6Ci0JCQkJcmlnaHQuYXBwZW5kKHJlc3QpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlEaWZmIGRpZmY9IGh1bmsuZlBhcmVudDsKLQkJSVBhdGggcGF0aD0gZGlmZi5nZXRQYXRoKCk7Ci0JCVN0cmluZyB0eXBlPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCi0JCXJldHVybiBuZXcgRGlmZk5vZGUobmV3IEh1bmtJbnB1dCh0eXBlLCBsZWZ0LnRvU3RyaW5nKCkpLCBuZXcgSHVua0lucHV0KHR5cGUsIHJpZ2h0LnRvU3RyaW5nKCkpKTsKLQl9CQkKLQkKLQkvKioKLQkgKiBCdWlsZHMgYSB0cmVlIGZyb20gbGlzdCBvZiBEaWZmcy4KLQkgKiBBcyBhIHNpZGUgZWZmZWN0IGl0IGNhbGN1bGF0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzCi0JICogaW4gYWxsIHBhdGhzLgotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZFRyZWUoKSB7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJaWYgKGZUcmVlICE9IG51bGwgJiYgIWZUcmVlLmlzRGlzcG9zZWQoKSkgewotCQkJZlRyZWUucmVtb3ZlQWxsKCk7Ci0JCQlmSHVua1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCQotCQkJaW50IGxlbmd0aD0gOTk7Ci0JCQkKLQkJCURpZmZbXSBkaWZmcz0gZlBhdGNoV2l6YXJkLmdldFBhdGNoZXIoKS5nZXREaWZmcygpOwkJCQotCQkJaWYgKGRpZmZzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgZGlmZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRGlmZiBkaWZmPSBkaWZmc1tpXTsKLQkJCQkJVHJlZUl0ZW0gZD0gbmV3IFRyZWVJdGVtKGZUcmVlLCBTV1QuTlVMTCk7Ci0JCQkJCWQuc2V0RGF0YShkaWZmKTsKLQkJCQkJZC5zZXRJbWFnZShnZXRJbWFnZShkaWZmKSk7Ci0JCQkJCQotCQkJCQlpZiAoZGlmZi5mT2xkUGF0aCAhPSBudWxsKQotCQkJCQkJbGVuZ3RoPSBNYXRoLm1pbihsZW5ndGgsIGRpZmYuZk9sZFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCQlpZiAoZGlmZi5mTmV3UGF0aCAhPSBudWxsKQotCQkJCQkJbGVuZ3RoPSBNYXRoLm1pbihsZW5ndGgsIGRpZmYuZk5ld1BhdGguc2VnbWVudENvdW50KCkpOwotCQkJCQkKLQkJCQkJamF2YS51dGlsLkxpc3QgaHVua3M9IGRpZmYuZkh1bmtzOwotCQkJCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcj0gaHVua3MuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlIdW5rIGh1bms9IChIdW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJCVRyZWVJdGVtIGg9IG5ldyBUcmVlSXRlbShkLCBTV1QuTlVMTCk7Ci0JCQkJCQloLnNldERhdGEoaHVuayk7Ci0JCQkJCQloLnNldFRleHQoaHVuay5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChmU3RyaXBQcmVmaXhTZWdtZW50cyAhPSBudWxsICYmIGxlbmd0aCAhPSA5OSkKLQkJCQlmb3IgKGludCBpPSAxOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJCWZTdHJpcFByZWZpeFNlZ21lbnRzLmFkZChJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKLQkJfQotCQkKLQkJdXBkYXRlVHJlZSgpOwotCX0KLQkKLQlwcml2YXRlIElGaWxlIGV4aXN0c0luU2VsZWN0aW9uKElQYXRoIHBhdGgpIHsKLQkJSVJlc291cmNlIHRhcmdldD0gZlBhdGNoV2l6YXJkLmdldFRhcmdldCgpOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsJLy8gc3BlY2lhbCBjYXNlCi0JCQlJRmlsZSBmaWxlPSAoSUZpbGUpIHRhcmdldDsKLQkJCWlmIChtYXRjaGVzKGZpbGUuZ2V0RnVsbFBhdGgoKSwgcGF0aCkpCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJSUNvbnRhaW5lciBjPSAoSUNvbnRhaW5lcikgdGFyZ2V0OwotCQkJaWYgKGMuZXhpc3RzKHBhdGgpKQotCQkJCXJldHVybiBjLmdldEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHBhdGggY29tcGxldGVseSBtYXRjaGVzIHRoZSBlbmQgb2YgZnVsbHBhdGgKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhJUGF0aCBmdWxscGF0aCwgSVBhdGggcGF0aCkgewotCQkKLQkJZm9yIChJUGF0aCBwPSBmdWxscGF0aDsgcGF0aC5zZWdtZW50Q291bnQoKSA8PSBwLnNlZ21lbnRDb3VudCgpOyBwPSBwLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpIHsKLQkJCWlmIChwLmVxdWFscyhwYXRoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgbGFiZWwgYW5kIGNoZWNrZWQgc3RhdGUgb2YgdHJlZSBpdGVtcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVHJlZSgpIHsKLQkJaWYgKGZUcmVlID09IG51bGwgfHwgZlRyZWUuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlpbnQgc3RyaXA9IGdldFN0cmlwUHJlZml4U2VnbWVudHMoKTsKLQkJVHJlZUl0ZW1bXSBjaGlsZHJlbj0gZlRyZWUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtPSBjaGlsZHJlbltpXTsKLQkJCURpZmYgZGlmZj0gKERpZmYpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJZGlmZi5mTWF0Y2hlcz0gZmFsc2U7Ci0JCQlTdHJpbmcgZXJyb3I9IG51bGw7Ci0JCQkKLQkJCWJvb2xlYW4gY3JlYXRlPSBmYWxzZTsJCi0JCQlJRmlsZSBmaWxlPSBudWxsOwotCQkJaWYgKGRpZmYuZ2V0VHlwZSgpID09IERpZmZlcmVuY2VyLkFERElUSU9OKSB7Ci0JCQkJSVBhdGggcD0gZGlmZi5mTmV3UGF0aDsKLQkJCQlpZiAoc3RyaXAgPiAwICYmIHN0cmlwIDwgcC5zZWdtZW50Q291bnQoKSkKLQkJCQkJcD0gcC5yZW1vdmVGaXJzdFNlZ21lbnRzKHN0cmlwKTsKLQkJCQlmaWxlPSBleGlzdHNJblNlbGVjdGlvbihwKTsKLQkJCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJCWRpZmYuZk1hdGNoZXM9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZmlsZSBhbHJlYWR5IGV4aXN0cwotCQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuRmlsZUV4aXN0cy5lcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNyZWF0ZT0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVBhdGggcD0gZGlmZi5mT2xkUGF0aDsKLQkJCQlpZiAoc3RyaXAgPiAwICYmIHN0cmlwIDwgcC5zZWdtZW50Q291bnQoKSkKLQkJCQkJcD0gcC5yZW1vdmVGaXJzdFNlZ21lbnRzKHN0cmlwKTsKLQkJCQlmaWxlPSBleGlzdHNJblNlbGVjdGlvbihwKTsKLQkJCQlkaWZmLmZNYXRjaGVzPSBmYWxzZTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJLy8gZmlsZSBpcyByZWFkb25seQotCQkJCQkJZXJyb3I9IFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkZpbGVJc1JlYWRPbmx5LmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGU9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkaWZmLmZNYXRjaGVzPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZmlsZSBkb2Vzbid0IGV4aXN0Ci0JCQkJCWVycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5GaWxlRG9lc05vdEV4aXN0LmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUFycmF5TGlzdCBmYWlsZWRIdW5rcz0gbmV3IEFycmF5TGlzdCgpOwotCQkJUGF0Y2hlciBwYXRjaGVyPSBmUGF0Y2hXaXphcmQuZ2V0UGF0Y2hlcigpOwotCQkJcGF0Y2hlci5zZXRGdXp6KGdldEZ1enpGYWN0b3IoKSk7Ci0JCQlwYXRjaGVyLmFwcGx5KGRpZmYsIGZpbGUsIGNyZWF0ZSwgZmFpbGVkSHVua3MpOwotCi0JCQlpZiAoZmFpbGVkSHVua3Muc2l6ZSgpID4gMCkKLQkJCQlkaWZmLmZSZWplY3RlZD0gZlBhdGNoV2l6YXJkLmdldFBhdGNoZXIoKS5nZXRSZWplY3RlZChmYWlsZWRIdW5rcyk7Ci0JCQkKLQkJCWludCBjaGVja2VkU3Vicz0gMDsJLy8gY291bnRzIGNoZWNrZWQgaHVuayBpdGVtcwotCQkJVHJlZUl0ZW1bXSBodW5rSXRlbXM9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGg9IDA7IGggPCBodW5rSXRlbXMubGVuZ3RoOyBoKyspIHsKLQkJCQlIdW5rIGh1bms9IChIdW5rKSBodW5rSXRlbXNbaF0uZ2V0RGF0YSgpOwotCQkJCWJvb2xlYW4gZmFpbGVkPSBmYWlsZWRIdW5rcy5jb250YWlucyhodW5rKTsKLQkJCQlTdHJpbmcgaHVua0Vycm9yPSBudWxsOwotCQkJCWlmIChmYWlsZWQpCi0JCQkJCWh1bmtFcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuTm9NYXRjaC5lcnJvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlib29sZWFuIGNoZWNrPSAhZmFpbGVkOwotCQkJCWh1bmtJdGVtc1toXS5zZXRDaGVja2VkKGNoZWNrKTsKLQkJCQlpZiAoY2hlY2spCi0JCQkJCWNoZWNrZWRTdWJzKys7Ci0KLQkJCQlTdHJpbmcgaHVua0xhYmVsPSBodW5rLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGh1bmtFcnJvciAhPSBudWxsKQotCQkJCQlodW5rTGFiZWwrPSAiICAgIiArIGh1bmtFcnJvcjsgLy8kTk9OLU5MUy0xJAotCQkJCWh1bmtJdGVtc1toXS5zZXRUZXh0KGh1bmtMYWJlbCk7Ci0JCQkJaHVua0l0ZW1zW2hdLnNldEltYWdlKGdldEltYWdlKGh1bmspKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGxhYmVsPSBkaWZmLmdldERlc2NyaXB0aW9uKHN0cmlwKTsKLQkJCWlmIChlcnJvciAhPSBudWxsKQotCQkJCWxhYmVsKz0gIiAgICAiICsgZXJyb3I7IC8vJE5PTi1OTFMtMSQKLQkJCWl0ZW0uc2V0VGV4dChsYWJlbCk7Ci0JCQlpdGVtLnNldEltYWdlKGdldEltYWdlKGRpZmYpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkU3VicyA+IDApOwotCQkJYm9vbGVhbiBncmF5PSAoY2hlY2tlZFN1YnMgPiAwICYmICBjaGVja2VkU3VicyA8IGh1bmtJdGVtcy5sZW5ndGgpOwotCQkJaXRlbS5zZXRHcmF5ZWQoZ3JheSk7Ci0JCQlpdGVtLnNldEV4cGFuZGVkKGdyYXkpOwotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZSh1cGRhdGVNb2RlbCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBncmF5IHN0YXRlIG9mIHRoZSBnaXZlbiBkaWZmIGFuZCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBpdHMgY2hpbGRyZW4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrZWRTdGF0ZShUcmVlSXRlbSBkaWZmSXRlbSkgewotCQlib29sZWFuIGNoZWNrZWQ9IGRpZmZJdGVtLmdldENoZWNrZWQoKTsKLQkJLy8gY2hlY2sgd2hldGhlciB3ZSBjYW4gZW5hYmxlIGFsbCBodW5rcwotCQlUcmVlSXRlbVtdIGh1bmtzPSBkaWZmSXRlbS5nZXRJdGVtcygpOwotCQlpbnQgY2hlY2tlZENvdW50PSAwOwotCQlmb3IgKGludCBpPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHsKLQkJCUh1bmsgaHVuaz0gKEh1bmspIGh1bmtzW2ldLmdldERhdGEoKTsKLQkJCWlmIChjaGVja2VkKSB7Ci0JCQkJaWYgKGh1bmsuZk1hdGNoZXMpIHsKLQkJCQkJaHVua3NbaV0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQkJY2hlY2tlZENvdW50Kys7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlodW5rc1tpXS5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlkaWZmSXRlbS5zZXRHcmF5ZWQoY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCBodW5rcy5sZW5ndGgpOwotCQlkaWZmSXRlbS5zZXRDaGVja2VkKGNoZWNrZWRDb3VudCA+IDApOwotCQkKLQkJc2V0UGFnZUNvbXBsZXRlKHVwZGF0ZU1vZGVsKCkpOwotCX0KLQkKLQkvKgotCSAqIFVwZGF0ZXMgdGhlIGdyYXkgc3RhdGUgb2YgdGhlIGdpdmVuIGl0ZW1zIHBhcmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JheWVkU3RhdGUoVHJlZUl0ZW0gaHVuaykgewotCQlUcmVlSXRlbSBkaWZmPSBodW5rLmdldFBhcmVudEl0ZW0oKTsKLQkJVHJlZUl0ZW1bXSBodW5rcz0gZGlmZi5nZXRJdGVtcygpOwotCQlpbnQgY2hlY2tlZD0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGh1bmtzW2ldLmdldENoZWNrZWQoKSkKLQkJCQljaGVja2VkKys7Ci0JCWRpZmYuc2V0Q2hlY2tlZChjaGVja2VkID4gMCk7Ci0JCWRpZmYuc2V0R3JheWVkKGNoZWNrZWQgPiAwICYmIGNoZWNrZWQgPCBodW5rcy5sZW5ndGgpOwotCQkKLQkJc2V0UGFnZUNvbXBsZXRlKHVwZGF0ZU1vZGVsKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU3BhY2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQ9IDIwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0U3RyaXBQcmVmaXhTZWdtZW50cygpIHsKLQkJaW50IHN0cmlwUHJlZml4U2VnbWVudHM9IDA7Ci0JCWlmIChmU3RyaXBQcmVmaXhTZWdtZW50cyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcz0gZlN0cmlwUHJlZml4U2VnbWVudHMuZ2V0VGV4dCgpOwotCQkJdHJ5IHsKLQkJCQlzdHJpcFByZWZpeFNlZ21lbnRzPSBJbnRlZ2VyLnBhcnNlSW50KHMpOwotCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cmlwUHJlZml4U2VnbWVudHM7Ci0JfQotCQotCXByaXZhdGUgaW50IGdldEZ1enpGYWN0b3IoKSB7Ci0JCWludCBmdXp6RmFjdG9yPSAwOwotCQlpZiAoZkZ1enpGaWVsZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcz0gZkZ1enpGaWVsZC5nZXRUZXh0KCk7Ci0JCQl0cnkgewotCQkJCWZ1enpGYWN0b3I9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZnV6ekZhY3RvcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlTW9kZWwoKSB7Ci0JCWJvb2xlYW4gYXRMZWFzdE9uZUlzRW5hYmxlZD0gZmFsc2U7Ci0JCWlmIChmVHJlZSAhPSBudWxsICYmICFmVHJlZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVRyZWVJdGVtIFtdIGRpZmZJdGVtcz0gZlRyZWUuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBkaWZmSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBkaWZmSXRlbT0gZGlmZkl0ZW1zW2ldOwotCQkJCU9iamVjdCBkYXRhPSBkaWZmSXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBEaWZmKSB7Ci0JCQkJCURpZmYgZGlmZj0gKERpZmYpIGRhdGE7Ci0JCQkJCWJvb2xlYW4gYj0gZGlmZkl0ZW0uZ2V0Q2hlY2tlZCgpOwotCQkJCQlkaWZmLnNldEVuYWJsZWQoYik7Ci0JCQkJCWlmIChiKSB7Ci0JCQkJCQlUcmVlSXRlbSBbXSBodW5rSXRlbXM9IGRpZmZJdGVtLmdldEl0ZW1zKCk7Ci0JCQkJCQlmb3IgKGludCBqPSAwOyBqIDwgaHVua0l0ZW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJVHJlZUl0ZW0gaHVua0l0ZW09IGh1bmtJdGVtc1tqXTsKLQkJCQkJCQlkYXRhPSBodW5rSXRlbS5nZXREYXRhKCk7Ci0JCQkJCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBIdW5rKSB7Ci0JCQkJCQkJCUh1bmsgaHVuaz0gKEh1bmspIGRhdGE7Ci0JCQkJCQkJCWI9IGh1bmtJdGVtLmdldENoZWNrZWQoKTsKLQkJCQkJCQkJaHVuay5zZXRFbmFibGVkKGIpOwotCQkJCQkJCQlpZiAoYikgewotCQkJCQkJCQkJYXRMZWFzdE9uZUlzRW5hYmxlZD0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXRMZWFzdE9uZUlzRW5hYmxlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmZmYjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5OVDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgcGVyZm9ybWluZyBzdHJ1Y3R1cmFsIGFuZCB0ZXh0dWFsCi1jb21wYXJlIG9wZXJhdGlvbnMgb24gYXJiaXRyYXJ5IGRhdGEgYW5kIGRpc3BsYXlpbmcgdGhlIHJlc3VsdHMuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotCi1UaGUgY2xhc3MgPGI+Q29tcGFyZVVJPC9iPiBkZWZpbmVzIHRoZSBlbnRyeSBwb2ludCB0byBpbml0aWF0ZSBhIGNvbmZpZ3VyYWJsZQotY29tcGFyZSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IHJlc291cmNlcy4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBpcwotb3BlbmVkIGludG8gYSBjb21wYXJlIGVkaXRvciB3aGVyZSB0aGUgZGV0YWlscyBjYW4gYmUgYnJvd3NlZCBhbmQgZWRpdGVkCi1pbiBkeW5hbWljYWxseSBzZWxlY3RlZCBzdHJ1Y3R1cmUgYW5kIGNvbnRlbnQgdmlld2Vycy4KLTxwPgotCi1BIGNvbXBhcmUgb3BlcmF0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgYXMgYSBzdWJjbGFzcyBvZiA8Yj5Db21wYXJlRWRpdG9ySW5wdXQ8L2I+LgotQSA8Yj5Db21wYXJlRWRpdG9ySW5wdXQ8L2I+IHJ1bnMgYSAocG90ZW50aWFsbHkgbGVuZ3RoeSkgY29tcGFyZSBvcGVyYXRpb24KLXVuZGVyIHByb2dyZXNzIG1vbml0b3IgY29udHJvbCwgY3JlYXRlcyBhIFVJIGZvciBkcmlsbGluZy1kb3duIGludG8gdGhlCi1jb21wYXJlIHJlc3VsdHMsIHRyYWNrcyB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIG1lcmdlLAotYW5kIHNhdmVzIGFueSBjaGFuZ2VzIHRoYXQgb2NjdXJlZCBkdXJpbmcgYSBtZXJnZS4KLTxwPgotCi1UaGUgPGI+TmF2aWdhdGlvbkFjdGlvbjwvYj4gaXMgdXNlZCB0byBuYXZpZ2F0ZSAoc3RlcCkgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbAotZGlmZmVyZW5jZXMgb2YgYSA8Yj5Db21wYXJlRWRpdG9ySW5wdXQ8L2I+LgotPHA+Ci0KLUFuIGluc3RhbmNlIG9mIDxiPkNvbXBhcmVDb25maWd1cmF0aW9uPC9iPiBjb25maWd1cmVzIHZhcmlvdXMgVUkgYXNwZWN0cwotb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzIGxpa2UgdGl0bGUgbGFiZWxzIGFuZCBpbWFnZXMsIG9yIHdoZXRoZXIgYSBzaWRlCi1vZiBhIG1lcmdlIHZpZXdlciBpcyBlZGl0YWJsZS4gSXQgaXMgcGFzc2VkIHRvIHRoZSA8Yj5Db21wYXJlRWRpdG9ySW5wdXQ8L2I+Ci1vbiBjcmVhdGlvbi4KLTxwPgotCi1XaGVuIGltcGxlbWVudGluZyBhIGhpZXJhcmNoaWNhbCBjb21wYXJlIG9wZXJhdGlvbiBhcyBhIHN1YmNsYXNzIG9mCi08Yj5Db21wYXJlRWRpdG9ySW5wdXQ8L2I+IGNsaWVudHMgaGF2ZSB0byBwcm92aWRlIGEgdHJlZSBvZiBvYmplY3RzIHdoZXJlIGVhY2gKLW5vZGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCi08Yj5vcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9iPi4KLVRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIGhpZXJhcmNoaWNhbCBkaWZmZXJlbmNpbmcgZW5naW5lCi0oPGI+b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmZXJlbmNlcjwvYj4pIHRvIHdhbGsgdGhlIHRyZWUuCi08YnI+Ci1JbiBhZGRpdGlvbiBldmVyeSBsZWFmIG9mIHRoZSB0cmVlIG11c3QgaW1wbGVtZW50IHRoZSA8Yj5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9iPgotb3IgPGI+SUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3I8L2I+Ci1pbnRlcmZhY2VzIGluIG9yZGVyIHRvIGdpdmUgdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUgYWNjZXNzIHRvIGl0cyBzdHJlYW0gY29udGVudAotYW5kIHRvIGl0cyBlbmNvZGluZyAod2l0aCBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvcikuCi08cD4KLQotVGhlIGFic3RyYWN0IGNsYXNzIDxiPkJ1ZmZlcmVkQ29udGVudDwvYj4gcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi1mb3IgdGhlIDxiPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2I+IGFuZCA8Yj5JQ29udGVudENoYW5nZU5vdGlmaWVyPC9iPiBpbnRlcmZhY2VzLgotSXRzIHN1YmNsYXNzIDxiPlJlc291cmNlTm9kZTwvYj4gYWRkcyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCi08Yj5JU3RydWN0dXJlQ29tcGFyYXRvcjwvYj4gYW5kIDxiPklUeXBlZEVsZW1lbnQ8L2I+IGludGVyZmFjZXMKLWJhc2VkIG9uIEVjbGlwc2Ugd29ya2JlbmNoIHJlc291cmNlcyAob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKS4gCi1JdCBjYW4gYmUgdXNlZCB3aXRob3V0IG1vZGlmaWNhdGlvbiBhcyB0aGUgaW5wdXQgdG8gdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUuCi08cD4KLQotVGhlIDxiPlppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yPC9iPiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLTxiPm9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNyZWF0b3I8L2I+IGludGVyZmFjZQotYW5kIG1ha2VzIHRoZSBjb250ZW50cyBvZiBhIHppcCBhcmNoaXZlIGF2YWlsYWJsZSBhcyBhCi1oaWVyYXJjaGljYWwgc3RydWN0dXJlIG9mIDxiPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9iPnMgd2hpY2ggY2FuIGJlIGVhc2lseSBjb21wYXJlZAotYnkgdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUgKDxiPm9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuRGlmZmVyZW5jZXI8L2I+KS4KLUl0IGlzIGEgZ29vZCBleGFtcGxlIGZvciBob3cgdG8gbWFrZSBzdHJ1Y3R1cmVkIGZpbGVzIGF2YWlsYWJsZSB0byB0aGUgaGllcmFyY2hpY2FsIAotY29tcGFyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBDb21wYXJlIHBsdWdpbi4KLTxwPgotCi1UaGUgPGI+RWRpdGlvblNlbGVjdGlvbkRpYWxvZzwvYj4gaXMgYSBzaW1wbGUgc2VsZWN0aW9uIGRpYWxvZyB3aGVyZQotb25lIGlucHV0IGVsZW1lbnQgY2FuIGJlIGNvbXBhcmVkIGFnYWluc3QgYSBsaXN0IG9mIGhpc3RvcmljIHZhcmlhbnRzICg8aT5lZGl0aW9uczwvaT4pCi1vZiB0aGUgc2FtZSBpbnB1dCBlbGVtZW50LiBUaGUgZGlhbG9nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBmdW5jdGlvbnMKLWxpa2UgPGk+IlJlcGxhY2Ugd2l0aCBWZXJzaW9uIjwvaT4gb3IgPGk+IlJlcGxhY2Ugd2l0aCBFZGl0aW9uIjwvaT4gb24gd29ya2JlbmNoIHJlc291cmNlcy4KLTxwPgotCi1JbiBhZGRpdGlvbiBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgc3Vic2VjdGlvbiBvZiB0aGUgaW5wdXQgZWxlbWVudAotKGUuZy4gYSBtZXRob2QgaW4gYSBKYXZhIHNvdXJjZSBmaWxlKSBieSBtZWFucyBvZiBhIDxpPnBhdGg8L2k+LiBJbiB0aGlzCi1jYXNlIHRoZSBkaWFsb2cgY29tcGFyZXMgb25seSB0aGUgc3Vic2VjdGlvbiAoYXMgc3BlY2lmaWVkIGJ5IHRoZSBwYXRoKQotd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzdWJzZWN0aW9uIGluIHRoZSBsaXN0IG9mIGVkaXRpb25zLiBUaGlzIGZ1bmN0aW9uYWxpdHkKLWNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCA8aT4iUmVwbGFjZSB3aXRoIE1ldGhvZCBFZGl0aW9uIjwvaT4gZm9yIHRoZSBKYXZhCi1sYW5ndWFnZS4KLTxwPgotCi1UaGUgPGI+RWRpdGlvblNlbGVjdGlvbkRpYWxvZzwvYj4gcmVxdWlyZXMgdGhhdCB0aGUgZWRpdGlvbnMgaW1wbGVtZW50Ci10aGUgPGI+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvYj4gYW5kIDxiPklNb2RpZmljYXRpb25EYXRlPC9iPiBpbnRlcmZhY2VzLgotVGhlIDxiPkhpc3RvcnlJdGVtPC9iPiBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGVzZSBpbnRlcmZhY2VzCi1mb3IgPGI+SUZpbGVTdGF0ZTwvYj4gb2JqZWN0cy4KLTxwPgotCi0KLVRoZSA8Yj5Db21wYXJlVmlld2VyUGFuZTwvYj4gaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGljaCBwcm92aWRlcwotYSBsYWJlbCBhbmQgbG9jYWwgdG9vbGJhciBmb3IgYSBjb21wYXJlIHZpZXdlciAob3IgYW55IG90aGVyIHN1YmNsYXNzIG9mIGEgCi1KRmFjZSA8Yj5WaWV3ZXI8L2I+KS4KLTxicj4KLUl0cyBhYnN0cmFjdCBzdWJjbGFzcyA8Yj5Db21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZTwvYj4gc3VwcG9ydHMgPGk+ZHluYW1pYwotdmlld2VyIHN3aXRjaGluZzwvaT4sIHRoYXQgaXMgdGhlIHZpZXdlciBpbnN0YWxsZWQgaW4gdGhlIHBhbmUgaXMgZHluYW1pY2FsbHkgCi1kZXRlcm1pbmVkIGJ5IHRoZSBwYW5lJ3MgaW5wdXQgb2JqZWN0LgotQm90aCBjbGFzc2VzIGFyZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gdXNlIGNvbXBhcmUgdmlld2VycyBvdXRzaWRlIHRoZSBjb250ZXh0IG9mCi1hIGNvbXBhcmUgZWRpdG9yLCBmb3IgZXhhbXBsZSBpbiBhIGRpYWxvZyBvciB3aXphcmQuCi08cD4KLQotQSA8Yj5TcGxpdHRlcjwvYj4gaXMgYW4gZXh0ZW5zaW9uIG9mIGEgU2FzaEZvcm0gdGhhdCBzdXBwb3J0cyBuZXN0aW5nLCBtYXhpbWl6aW5nIG9mIHBhbmVzLAotYW5kIHByb3BhZ2F0aW5nIHRoZSB2aXNpYmlsaXR5IHN0YXRlIG9mIHBhbmVzLgotPHA+Ci0KLVRoZSBpbnRlcmZhY2UgPGI+SVN0cmVhbU1lcmdlcjwvYj4gZGVmaW5lcyBhIHNpbmdsZSBvcGVyYXRpb24gZm9yIHBlcmZvcm1pbmcgYSB0aHJlZS13YXkgbWVyZ2Ugb24gdGhyZWUKLWlucHV0IHN0cmVhbXMuIFRoZSBtZXJnZWQgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLTxicj4KLUNsaWVudHMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2Ugd2hlbiBjb250cmlidXRpbmcgbmV3IG1lcmdlcnMgdG8gdGhlCi08Y29kZT5vcmcuZWNsaXBzZS5jb21wYXJlLnN0cmVhbU1lcmdlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLU5ldyA8Yj5JU3RyZWFtTWVyZ2VyPC9iPnMgY2FuIGJlIGNyZWF0ZWQgZm9yIHJlZ2lzdGVyZWQgdHlwZXMgd2l0aCB0aGUgY3JlYXRlU3RyZWFtTWVyZ2VyIG1ldGhvZHMgb2YgQ29tcGFyZVVJLgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9EaWZmZXJlbmNlc0l0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvRGlmZmVyZW5jZXNJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg2NmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9EaWZmZXJlbmNlc0l0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIGN1c3RvbSBpdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgYSBMaXN0IG9mIDxjb2RlPlJhbmdlRGlmZmVyZW5jZXM8L2NvZGU+LgotICogSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSA8Y29kZT5SYW5nZURpZmZlcmVuY2VyPC9jb2RlPi4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBEaWZmZXJlbmNlc0l0ZXJhdG9yIHsKLQotCUxpc3QgZlJhbmdlOwotCWludCBmSW5kZXg7Ci0JUmFuZ2VEaWZmZXJlbmNlW10gZkFycmF5OwkKLQlSYW5nZURpZmZlcmVuY2UgZkRpZmZlcmVuY2U7Ci0JCi0JLyoKLQkgKiBDcmVhdGVzIGEgZGlmZmVyZW5jZXMgaXRlcmF0b3Igb24gYW4gYXJyYXkgb2YgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPnMuCi0JICovCi0JRGlmZmVyZW5jZXNJdGVyYXRvcihSYW5nZURpZmZlcmVuY2VbXSBkaWZmZXJlbmNlUmFuZ2VzKSB7Ci0JCQotCQlmQXJyYXk9IGRpZmZlcmVuY2VSYW5nZXM7Ci0JCWZJbmRleD0gMDsKLQkJZlJhbmdlPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChmSW5kZXggPCBmQXJyYXkubGVuZ3RoKQotCQkJZkRpZmZlcmVuY2U9IGZBcnJheVtmSW5kZXgrK107Ci0JCWVsc2UKLQkJCWZEaWZmZXJlbmNlPSBudWxsOwotCX0KLQotCS8qCi0JICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBSYW5nZURpZmZlcmVuY2VzCi0JICAqLwotCWludCBnZXRDb3VudCgpIHsKLQkJcmV0dXJuIGZSYW5nZS5zaXplKCk7Ci0JfQotCi0JLyoKLQkgKiBBcHBlbmRzIHRoZSBlZGl0IHRvIGl0cyBsaXN0IGFuZCBtb3ZlcyB0byB0aGUgbmV4dCA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+LgotCSAqLwotCXZvaWQgbmV4dCgpIHsKLQkJZlJhbmdlLmFkZChmRGlmZmVyZW5jZSk7Ci0JCWlmIChmRGlmZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkluZGV4IDwgZkFycmF5Lmxlbmd0aCkKLQkJCQlmRGlmZmVyZW5jZT0gZkFycmF5W2ZJbmRleCsrXTsKLQkJCWVsc2UKLQkJCQlmRGlmZmVyZW5jZT0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogRGlmZmVyZW5jZSBpdGVyYXRvcnMgYXJlIHVzZWQgaW4gcGFpcnMuCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgb3RoZXIgaXRlcmF0b3IuCi0JICovCi0JRGlmZmVyZW5jZXNJdGVyYXRvciBvdGhlcihEaWZmZXJlbmNlc0l0ZXJhdG9yIHJpZ2h0LCBEaWZmZXJlbmNlc0l0ZXJhdG9yIGxlZnQpIHsKLQkJaWYgKHRoaXMgPT0gcmlnaHQpCi0JCQlyZXR1cm4gbGVmdDsKLQkJcmV0dXJuIHJpZ2h0OwotCX0KLQotCS8qCi0JICAqIFJlbW92ZXMgYWxsIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT5zCi0JICAqLwotCXZvaWQgcmVtb3ZlQWxsKCkgewotCQlmUmFuZ2UuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvSVJhbmdlQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL0lSYW5nZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1OWVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvSVJhbmdlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlcjsKLQotLyoqCi0gKiBGb3IgYnJlYWtpbmcgYW4gb2JqZWN0IHRvIGNvbXBhcmUgaW50byBhIHNlcXVlbmNlIG9mIGNvbXBhcmFibGUgZW50aXRpZXMuCi0gKiA8cD4KLSAqIEl0IGlzIHVzZWQgYnkgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlcjwvY29kZT4gdG8gZmluZCBsb25nZXN0IHNlcXVlbmNlcyBvZgotICogbWF0Y2hpbmcgYW5kIG5vbi1tYXRjaGluZyByYW5nZXMuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCB0byBjb21wYXJlIHR3byB0ZXh0IGRvY3VtZW50cyBhbmQgZmluZCBsb25nZXN0IGNvbW1vbiBzZXF1ZW5jZXMKLSAqIG9mIG1hdGNoaW5nIGFuZCBub24tbWF0Y2hpbmcgbGluZXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGJyZWFrIHRoZSBkb2N1bWVudAotICogaW50byBsaW5lcy4gPGNvZGU+Z2V0UmFuZ2VDb3VudDwvY29kZT4gd291bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIAotICogZG9jdW1lbnQsIGFuZCA8Y29kZT5yYW5nZXNFcXVhbDwvY29kZT4gd291bGQgY29tcGFyZSBhIHNwZWNpZmllZCBsaW5lIGdpdmVuIAotICogd2l0aCBvbmUgaW4gYW5vdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlOyB0aGVyZSBpcyBubyBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmFuZ2VDb21wYXJhdG9yIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb21wYXJhYmxlIGVudGl0aWVzLgotCSAqCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBhcmFibGUgZW50aXRpZXMgCi0JICovCi0JaW50IGdldFJhbmdlQ291bnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tcGFyYWJsZSBlbnRpdHkgZ2l2ZW4gYnkgdGhlIGZpcnN0IGluZGV4Ci0JICogbWF0Y2hlcyBhbiBlbnRpdHkgc3BlY2lmaWVkIGJ5IHRoZSBvdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPiBhbmQgaW5kZXguCi0JICoKLQkgKiBAcGFyYW0gdGhpc0luZGV4IHRoZSBpbmRleCBvZiB0aGUgY29tcGFyYWJsZSBlbnRpdHkgd2l0aGluIHRoaXMgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4KLQkgKiBAcGFyYW0gb3RoZXIgdGhlIElSYW5nZUNvbXBhcmF0b3IgdG8gY29tcGFyZSB0aGlzIHdpdGgKLQkgKiBAcGFyYW0gb3RoZXJJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNvbXBhcmFibGUgZW50aXR5IHdpdGhpbiB0aGUgb3RoZXIgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21wYXJhYmxlIGVudGl0aWVzIGFyZSBlcXVhbAotCSAqLwotCWJvb2xlYW4gcmFuZ2VzRXF1YWwoaW50IHRoaXNJbmRleCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlciwgaW50IG90aGVySW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGEgY29tcGFyaXNvbiBzaG91bGQgYmUgc2tpcHBlZCBiZWNhdXNlIGl0IHdvdWxkIGJlIHRvbyBjb3N0bHkgKG9yIGxlbmd0aHkpLgotCSAqIAotCSAqIEBwYXJhbSBsZW5ndGggYSBudW1iZXIgb24gd2hpY2ggdG8gYmFzZSB0aGUgZGVjaXNpb24gd2hldGhlciB0byByZXR1cm4KLQkgKiAJPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHBhcmFtIG1heExlbmd0aCBhbm90aGVyIG51bWJlciBvbiB3aGljaCB0byBiYXNlIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHRvIHJldHVybgotCSAqCTxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4gdG8gY29tcGFyZSB3aXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBhdm9pZCBhIHRvbyBsZW5ndGh5IHJhbmdlIGNvbXBhcmlzb24KLQkgKi8KLQlib29sZWFuIHNraXBSYW5nZUNvbXBhcmlzb24oaW50IGxlbmd0aCwgaW50IG1heExlbmd0aCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvTGlua2VkUmFuZ2VEaWZmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvTGlua2VkUmFuZ2VEaWZmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDVmMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL0xpbmtlZFJhbmdlRGlmZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlcjsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBMaW5rZWRSYW5nZURpZmZlcmVuY2UgZXh0ZW5kcyBSYW5nZURpZmZlcmVuY2UgewotCi0Jc3RhdGljIGZpbmFsIGludCBJTlNFUlQ9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBERUxFVEU9IDE7Ci0KLQlMaW5rZWRSYW5nZURpZmZlcmVuY2UgZk5leHQ7Ci0KLQkvKgotCSAqIENyZWF0ZXMgYSBMaW5rZWRSYW5nZURpZmZlcmVuY2UgYW4gaW5pdGlhbGl6ZXMgaXQgdG8gdGhlIGVycm9yIHN0YXRlCi0JICovCi0JTGlua2VkUmFuZ2VEaWZmZXJlbmNlKCkgewotCQlzdXBlcihFUlJPUik7Ci0JCWZOZXh0PSBudWxsOwotCX0KLQotCS8qCi0JICogQ29uc3RydWN0cyBhbmQgbGlua3MgYSBMaW5rZVJhbmdlRGlmZmVyZW5jZSB0byBhbm90aGVyIExpbmtlZFJhbmdlRGlmZmVyZW5jZQotCSAqLwotCUxpbmtlZFJhbmdlRGlmZmVyZW5jZShMaW5rZWRSYW5nZURpZmZlcmVuY2UgbmV4dCwgaW50IG9wZXJhdGlvbikgewotCQlzdXBlcihvcGVyYXRpb24pOwotCQlmTmV4dD0gbmV4dDsKLQl9Ci0KLQkvKgotCSAqIEZvbGxvd3MgdGhlIG5leHQgbGluawotCSAqLwotCUxpbmtlZFJhbmdlRGlmZmVyZW5jZSBnZXROZXh0KCkgewotCQlyZXR1cm4gZk5leHQ7Ci0JfQotCi0JYm9vbGVhbiBpc0RlbGV0ZSgpIHsKLQkJcmV0dXJuIGtpbmQoKSA9PSBERUxFVEU7Ci0JfQotCi0JYm9vbGVhbiBpc0luc2VydCgpIHsKLQkJcmV0dXJuIGtpbmQoKSA9PSBJTlNFUlQ7Ci0JfQotCi0JLyoKLQkgKiBTZXRzIHRoZSBuZXh0IGxpbmsgb2YgdGhpcyBMaW5rZWRSYW5nZURpZmZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldE5leHQoTGlua2VkUmFuZ2VEaWZmZXJlbmNlIG5leHQpIHsKLQkJZk5leHQ9IG5leHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQyZGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9SYW5nZURpZmZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyOwotCi0vKioKLSAqIERlc2NyaXB0aW9uIG9mIGEgY2hhbmdlIGJldHdlZW4gdHdvIG9yIHRocmVlIHJhbmdlcyBvZiBjb21wYXJhYmxlIGVudGl0aWVzLgotICogPHA+Ci0gKiA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+IG9iamVjdHMgYXJlIHRoZSBlbGVtZW50cyBvZiBhIGNvbXBhcmUgcmVzdWx0IHJldHVybmVkIGZyb20KLSAqIHRoZSA8Y29kZT5SYW5nZURpZmZlcmVuY2VyPC9jb2RlPiA8Y29kZT5maW5kKiA8L2NvZGU+IG1ldGhvZHMuCi0gKiBDbGllbnRzIHVzZSB0aGVzZSBvYmplY3RzIGFzIHRoZXkgYXJlIHJldHVybmVkIGZyb20gdGhlIGRpZmZlcmVuY2VyLgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQuCi0gKiA8cD4KLSAqIE5vdGU6IEEgcmFuZ2UgaW4gdGhlIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4gb2JqZWN0IGlzIGdpdmVuIGFzIGEgc3RhcnQgaW5kZXgKLSAqIGFuZCBsZW5ndGggaW4gdGVybXMgb2YgY29tcGFyYWJsZSBlbnRpdGllcy4gSG93ZXZlciwgdGhlc2UgZW50aXR5IGluZGljZXMgYW5kIGNvdW50cwotICogYXJlIG5vdCBuZWNlc3NhcmlseSBjaGFyYWN0ZXIgcG9zaXRpb25zLiBGb3IgZXhhbXBsZSwgaWYgYW4gZW50aXR5IHJlcHJlc2VudHMgYSBsaW5lCi0gKiBpbiBhIGRvY3VtZW50LCB0aGUgc3RhcnQgaW5kZXggd291bGQgYmUgYSBsaW5lIG51bWJlciBhbmQgdGhlIGNvdW50IHdvdWxkIGJlIGluIGxpbmVzLgotICogPC9wPgotICoKLSAqIEBzZWUgUmFuZ2VEaWZmZXJlbmNlcgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2VEaWZmZXJlbmNlIHsKLQotCS8qKiBUd28td2F5IGNoYW5nZSBjb25zdGFudCBpbmRpY2F0aW5nIG5vIGNoYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT0NIQU5HRT0gMDsKLQkvKiogVHdvLXdheSBjaGFuZ2UgY29uc3RhbnQgaW5kaWNhdGluZyB0d28td2F5IGNoYW5nZSAoc2FtZSBhcyA8Y29kZT5SSUdIVDwvY29kZT4pICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTkdFPSAyOwotCi0JLyoqIFRocmVlLXdheSBjaGFuZ2UgY29uc3RhbnQgaW5kaWNhdGluZyBhIGNoYW5nZSBpbiBib3RoIHJpZ2h0IGFuZCBsZWZ0LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTkZMSUNUPSAxOwotCS8qKiBUaHJlZS13YXkgY2hhbmdlIGNvbnN0YW50IGluZGljYXRpbmcgYSBjaGFuZ2UgaW4gcmlnaHQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUklHSFQ9IDI7Ci0JLyoqIFRocmVlLXdheSBjaGFuZ2UgY29uc3RhbnQgaW5kaWNhdGluZyBhIGNoYW5nZSBpbiBsZWZ0LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExFRlQ9IDM7Ci0JLyoqCi0JICogVGhyZWUtd2F5IGNoYW5nZSBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzYW1lIGNoYW5nZSBpbiBib3RoIHJpZ2h0IGFuZCBsZWZ0LAotCSAqIHRoYXQgaXMgb25seSB0aGUgYW5jZXN0b3IgaXMgZGlmZmVyZW50LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFOQ0VTVE9SPSA0OwotCQotCS8qKiBDb25zdGFudCBpbmRpY2F0aW5nIGFuIHVua25vd24gY2hhbmdlIGtpbmQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1I9IDU7Ci0KLQkvKiogdGhlIGtpbmQgb2YgY2hhbmdlOiBOT0NIQU5HRSwgQ0hBTkdFLCBMRUZULCBSSUdIVCwgQU5DRVNUT1IsIENPTkZMSUNULCBFUlJPUiAqLwotCWludCBmS2luZDsKLQotCWludCBmTGVmdFN0YXJ0OwotCWludCBmTGVmdExlbmd0aDsKLQlpbnQgZlJpZ2h0U3RhcnQ7Ci0JaW50IGZSaWdodExlbmd0aDsKLQlpbnQgbEFuY2VzdG9yU3RhcnQ7Ci0JaW50IGxBbmNlc3Rvckxlbmd0aDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJhbmdlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlIGtpbmQuCi0JICoKLQkgKiBAcGFyYW0gY2hhbmdlS2luZCB0aGUga2luZCBvZiBjaGFuZ2UKLQkgKi8KLQkvKiBwYWNrYWdlICovIFJhbmdlRGlmZmVyZW5jZShpbnQgY2hhbmdlS2luZCkgewotCQlmS2luZD0gY2hhbmdlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlIGtpbmQKLQkgKiBhbmQgbGVmdCBhbmQgcmlnaHQgcmFuZ2VzLgotCSAqCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgY2hhbmdlCi0JICogQHBhcmFtIHJpZ2h0U3RhcnQgc3RhcnQgaW5kZXggb2YgZW50aXR5IG9uIHJpZ2h0IHNpZGUKLQkgKiBAcGFyYW0gcmlnaHRMZW5ndGggbnVtYmVyIG9mIGVudGl0aWVzIG9uIHJpZ2h0IHNpZGUKLQkgKiBAcGFyYW0gbGVmdFN0YXJ0IHN0YXJ0IGluZGV4IG9mIGVudGl0eSBvbiBsZWZ0IHNpZGUKLQkgKiBAcGFyYW0gbGVmdExlbmd0aCBudW1iZXIgb2YgZW50aXRpZXMgb24gbGVmdCBzaWRlCi0JICovCi0JLyogcGFja2FnZSAqLyBSYW5nZURpZmZlcmVuY2UoaW50IGtpbmQsIGludCByaWdodFN0YXJ0LCBpbnQgcmlnaHRMZW5ndGgsIGludCBsZWZ0U3RhcnQsIGludCBsZWZ0TGVuZ3RoKSB7Ci0JCWZLaW5kPSBraW5kOwotCQlmUmlnaHRTdGFydD0gcmlnaHRTdGFydDsKLQkJZlJpZ2h0TGVuZ3RoPSByaWdodExlbmd0aDsKLQkJZkxlZnRTdGFydD0gbGVmdFN0YXJ0OwotCQlmTGVmdExlbmd0aD0gbGVmdExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlIGtpbmQKLQkgKiBhbmQgbGVmdCwgcmlnaHQsIGFuZCBhbmNlc3RvciByYW5nZXMuCi0JICoKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBjaGFuZ2UKLQkgKiBAcGFyYW0gcmlnaHRTdGFydCBzdGFydCBpbmRleCBvZiBlbnRpdHkgb24gcmlnaHQgc2lkZQotCSAqIEBwYXJhbSByaWdodExlbmd0aCBudW1iZXIgb2YgZW50aXRpZXMgb24gcmlnaHQgc2lkZQotCSAqIEBwYXJhbSBsZWZ0U3RhcnQgc3RhcnQgaW5kZXggb2YgZW50aXR5IG9uIGxlZnQgc2lkZQotCSAqIEBwYXJhbSBsZWZ0TGVuZ3RoIG51bWJlciBvZiBlbnRpdGllcyBvbiBsZWZ0IHNpZGUKLQkgKiBAcGFyYW0gYW5jZXN0b3JTdGFydCBzdGFydCBpbmRleCBvZiBlbnRpdHkgb24gYW5jZXN0b3Igc2lkZQotCSAqIEBwYXJhbSBhbmNlc3Rvckxlbmd0aCBudW1iZXIgb2YgZW50aXRpZXMgb24gYW5jZXN0b3Igc2lkZQotCSAqLwotCS8qIHBhY2thZ2UgKi8gUmFuZ2VEaWZmZXJlbmNlKGludCBraW5kLCBpbnQgcmlnaHRTdGFydCwgaW50IHJpZ2h0TGVuZ3RoLCBpbnQgbGVmdFN0YXJ0LCBpbnQgbGVmdExlbmd0aCwKLQkJCQkJCQkJCWludCBhbmNlc3RvclN0YXJ0LCBpbnQgYW5jZXN0b3JMZW5ndGgpIHsKLQkJdGhpcyhraW5kLCByaWdodFN0YXJ0LCByaWdodExlbmd0aCwgbGVmdFN0YXJ0LCBsZWZ0TGVuZ3RoKTsKLQkJbEFuY2VzdG9yU3RhcnQ9IGFuY2VzdG9yU3RhcnQ7Ci0JCWxBbmNlc3Rvckxlbmd0aD0gYW5jZXN0b3JMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiBkaWZmZXJlbmNlLgotCSAqCi0JICogQHJldHVybiB0aGUga2luZCBvZiBkaWZmZXJlbmNlLCBvbmUgb2YKLQkgKiA8Y29kZT5OT0NIQU5HRTwvY29kZT4sIDxjb2RlPkNIQU5HRTwvY29kZT4sIDxjb2RlPkxFRlQ8L2NvZGU+LCA8Y29kZT5SSUdIVDwvY29kZT4sCi0JICogPGNvZGU+QU5DRVNUT1I8L2NvZGU+LCA8Y29kZT5DT05GTElDVDwvY29kZT4sIDxjb2RlPkVSUk9SPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQga2luZCgpIHsKLQkJcmV0dXJuIGZLaW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGFuY2VzdG9yIHNpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSBhbmNlc3RvciBzaWRlCi0JICovCi0JcHVibGljIGludCBhbmNlc3RvclN0YXJ0KCkgewotCQlyZXR1cm4gbEFuY2VzdG9yU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIG9uIHRoZSBhbmNlc3RvciBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIG9uIHRoZSBhbmNlc3RvciBzaWRlCi0JICovCi0JcHVibGljIGludCBhbmNlc3Rvckxlbmd0aCgpIHsKLQkJcmV0dXJuIGxBbmNlc3Rvckxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgYW5jZXN0b3Igc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGVuZCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSBhbmNlc3RvciBzaWRlCi0JICovCi0JcHVibGljIGludCBhbmNlc3RvckVuZCgpIHsKLQkJcmV0dXJuIGxBbmNlc3RvclN0YXJ0ICsgbEFuY2VzdG9yTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIHJpZ2h0IHNpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSByaWdodCBzaWRlCi0JICovCi0JcHVibGljIGludCByaWdodFN0YXJ0KCkgewotCQlyZXR1cm4gZlJpZ2h0U3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIG9uIHRoZSByaWdodCBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIG9uIHRoZSByaWdodCBzaWRlCi0JICovCi0JcHVibGljIGludCByaWdodExlbmd0aCgpIHsKLQkJcmV0dXJuIGZSaWdodExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgcmlnaHQgc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGVuZCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSByaWdodCBzaWRlCi0JICovCi0JcHVibGljIGludCByaWdodEVuZCgpIHsKLQkJcmV0dXJuIGZSaWdodFN0YXJ0ICsgZlJpZ2h0TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGxlZnQgc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGxlZnQgc2lkZQotCSAqLwotCXB1YmxpYyBpbnQgbGVmdFN0YXJ0KCkgewotCQlyZXR1cm4gZkxlZnRTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgb24gdGhlIGxlZnQgc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbnRpdGllcyBvbiB0aGUgbGVmdCBzaWRlCi0JICovCi0JcHVibGljIGludCBsZWZ0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlZnRMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGxlZnQgc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGVuZCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IGxlZnRFbmQoKSB7Ci0JCXJldHVybiBmTGVmdFN0YXJ0ICsgZkxlZnRMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50aXRpZXMgaW4gdGhlIGxlZnQsIHJpZ2h0LCBhbmQgYW5jZXN0b3Igc2lkZXMgb2YgdGhpcyByYW5nZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudGl0aWVzIGluIHRoZSBsZWZ0LCByaWdodCwgYW5kIGFuY2VzdG9yIHNpZGVzIG9mIHRoaXMgcmFuZ2UKLQkgKi8KLQlwdWJsaWMgaW50IG1heExlbmd0aCgpIHsKLQkJcmV0dXJuIE1hdGgubWF4KGZSaWdodExlbmd0aCwgTWF0aC5tYXgoZkxlZnRMZW5ndGgsIGxBbmNlc3Rvckxlbmd0aCkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9SYW5nZURpZmZlcmVuY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmMzZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlcjwvY29kZT4gZmluZHMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIG9yIHRocmVlIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLSAqIDxwPgotICogVG8gdXNlIHRoZSBkaWZmZXJlbmNlciwgY2xpZW50cyBwcm92aWRlIGFuIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+Ci0gKiB0aGF0IGJyZWFrcyB0aGVpciBpbnB1dCBkYXRhIGludG8gYSBzZXF1ZW5jZSBvZiBjb21wYXJhYmxlIGVudGl0aWVzLiBUaGUgZGlmZmVyZW5jZXIKLSAqIHJldHVybnMgdGhlIGRpZmZlcmVuY2VzIGFtb25nIHRoZXNlIHNlcXVlbmNlcyBhcyBhbiBhcnJheSBvZiA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+IG9iamVjdHMKLSAqICg8Y29kZT5maW5kRGlmZmVyZW5jZXM8L2NvZGU+IG1ldGhvZHMpLgotICogRXZlcnkgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiByZXByZXNlbnRzIGEgc2luZ2xlIGtpbmQgb2YgZGlmZmVyZW5jZQotICogYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlcyBvZiB0aGUgdW5kZXJseWluZyBjb21wYXJhYmxlIGVudGl0aWVzIGluIHRoZQotICogbGVmdCwgcmlnaHQsIGFuZCBvcHRpb25hbGx5IGFuY2VzdG9yIHNpZGVzLgotICogPHA+Ci0gKiBBbHRlcm5hdGl2ZWx5LCB0aGUgPGNvZGU+ZmluZFJhbmdlczwvY29kZT4gbWV0aG9kcyBub3Qgb25seSByZXR1cm4gb2JqZWN0cyBmb3IKLSAqIHRoZSBkaWZmZXJpbmcgcmFuZ2VzIGJ1dCBmb3Igbm9uLWRpZmZlcmluZyByYW5nZXMgdG9vLgotICogPHA+Ci0gKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgYW4gb2JqZWN0aWZpZWQgdmVyc2lvbiBvZiBvbmUgZGVzY3JpYmVkIGluOgotICogPGl0PkEgRmlsZSBDb21wYXJpc29uIFByb2dyYW0sPC9pdD4gYnkgV2ViYiBNaWxsZXIgYW5kIEV1Z2VuZSBXLiBNeWVycywgCi0gKiBTb2Z0d2FyZSBQcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwgVm9sLiAxNSwgTm92LiAxOTg1LgotICoKLSAqIEBzZWUgSVJhbmdlQ29tcGFyYXRvcgotICogQHNlZSBSYW5nZURpZmZlcmVuY2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJhbmdlRGlmZmVyZW5jZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmdlRGlmZmVyZW5jZVtdIEVNUFRZX1JFU1VMVD0gbmV3IFJhbmdlRGlmZmVyZW5jZVswXTsKLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogTm9uIGluc3RhbnRpYXRpYWJsZSEKLQkgKi8KLQlwcml2YXRlIFJhbmdlRGlmZmVyZW5jZXIoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JLyoqCi0JICogRmluZHMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBUaGUgZGlmZmVyZW5jZXMgYXJlIHJldHVybmVkIGFzIGFuIGFycmF5IG9mIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT5zLgotCSAqIElmIG5vIGRpZmZlcmVuY2VzIGFyZSBkZXRlY3RlZCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZGlmZmVyZW5jZXMgd2VyZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlW10gZmluZERpZmZlcmVuY2VzKElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgSVJhbmdlQ29tcGFyYXRvciByaWdodCkgewotCQlyZXR1cm4gZmluZERpZmZlcmVuY2VzKChJUHJvZ3Jlc3NNb25pdG9yKW51bGwsIGxlZnQsIHJpZ2h0KTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZHMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBUaGUgZGlmZmVyZW5jZXMgYXJlIHJldHVybmVkIGFzIGFuIGFycmF5IG9mIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT5zLgotCSAqIElmIG5vIGRpZmZlcmVuY2VzIGFyZSBkZXRlY3RlZCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG0gaWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCi0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmFuZ2UgZGlmZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIGRpZmZlcmVuY2VzIHdlcmUgZm91bmQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBmaW5kRGlmZmVyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBwbSwgSVJhbmdlQ29tcGFyYXRvciBsZWZ0LCBJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0KSB7Ci0KLQkJLy8gYXNzZXJ0IHRoYXQgYm90aCBJUmFuZ2VDb21wYXJhdG9ycyBhcmUgb2YgdGhlIHNhbWUgY2xhc3MKLQkJQXNzZXJ0LmlzVHJ1ZShyaWdodC5nZXRDbGFzcygpLmVxdWFscyhsZWZ0LmdldENsYXNzKCkpKTsKLQotCQlpbnQgcmlnaHRTaXplPSByaWdodC5nZXRSYW5nZUNvdW50KCk7Ci0JCWludCBsZWZ0U2l6ZT0gbGVmdC5nZXRSYW5nZUNvdW50KCk7Ci0JCS8vCi0JCS8vIERpZmZlcmVuY2VzIG1hdHJpeDoKLQkJLy8gb25seSB0aGUgbGFzdCBkIG9mIGVhY2ggZGlhZ29uYWwgaXMgc3RvcmVkLCBpLmUuLCBsYXN0RGlhZ29uYWxba10gPSByb3cgb2YgZCAgICAKLQkJLy8KLQkJaW50IGRpYWdMZW49IDIgKiBNYXRoLm1heChyaWdodFNpemUsIGxlZnRTaXplKTsgLy8gYm91bmQgb24gdGhlIHNpemUgb2YgZWRpdCBzY3JpcHQKLQkJaW50IG1heERpYWdvbmFsPSBkaWFnTGVuOwotCQlpbnQgbGFzdERpYWdvbmFsW109IG5ldyBpbnRbZGlhZ0xlbiArIDFdOyAvLyB0aGUgcm93IGNvbnRhaW5pbmcgdGhlIGxhc3QgZAotCQkvLyBvbiBkaWFnb25hbCBrIChsYXN0RGlhZ29uYWxba10gPSByb3cpCi0JCWludCBvcmlnaW49IGRpYWdMZW4gLyAyOyAvLyBvcmlnaW4gb2YgZGlhZ29uYWwgMAotCi0JCS8vIHNjcmlwdCBjb3JyZXNwb25kaW5nIHRvIGRba10gCi0JCUxpbmtlZFJhbmdlRGlmZmVyZW5jZSBzY3JpcHRbXT0gbmV3IExpbmtlZFJhbmdlRGlmZmVyZW5jZVtkaWFnTGVuICsgMV07Ci0JCWludCByb3csIGNvbDsKLQotCQkvLyBmaW5kIGNvbW1vbiBwcmVmaXgKLQkJZm9yIChyb3c9IDA7IHJvdyA8IHJpZ2h0U2l6ZSAmJiByb3cgPCBsZWZ0U2l6ZSAmJiByYW5nZXNFcXVhbChyaWdodCwgcm93LCBsZWZ0LCByb3cpID09IHRydWU7KQotCQkJcm93Kys7Ci0KLQkJbGFzdERpYWdvbmFsW29yaWdpbl09IHJvdzsKLQkJc2NyaXB0W29yaWdpbl09IG51bGw7Ci0JCWludCBsb3dlcj0gKHJvdyA9PSByaWdodFNpemUpID8gb3JpZ2luICsgMSA6IG9yaWdpbiAtIDE7Ci0JCWludCB1cHBlcj0gKHJvdyA9PSBsZWZ0U2l6ZSkgPyBvcmlnaW4gLSAxIDogb3JpZ2luICsgMTsKLQotCQlpZiAobG93ZXIgPiB1cHBlcikKLQkJCXJldHVybiBFTVBUWV9SRVNVTFQ7Ci0JCQkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImZpbmREaWZmZXJlbmNlczogIiArIG1heERpYWdvbmFsICsgIiAiICsgbG93ZXIgKyAiICIgKyB1cHBlcik7Ci0JCQotCQkvLyBmb3IgZWFjaCB2YWx1ZSBvZiB0aGUgZWRpdCBkaXN0YW5jZQotCQlmb3IgKGludCBkPSAxOyBkIDw9IG1heERpYWdvbmFsOyArK2QpIHsgLy8gZCBpcyB0aGUgY3VycmVudCBlZGl0IGRpc3RhbmNlCi0JCQkKLQkJCWlmIChwbSAhPSBudWxsKQotCQkJCXBtLndvcmtlZCgxKTsKLQotCQkJaWYgKHJpZ2h0LnNraXBSYW5nZUNvbXBhcmlzb24oZCwgbWF4RGlhZ29uYWwsIGxlZnQpKQotCQkJCXJldHVybiBFTVBUWV9SRVNVTFQ7IC8vIHNob3VsZCBiZSBzb21ldGhpbmcgd2UgYWxyZWFkeSBmb3VuZAotCi0JCQkvLyBmb3IgZWFjaCByZWxldmFudCBkaWFnb25hbCAoLWQsIC1kKzIgLi4uLCBkLTIsIGQpCi0JCQlmb3IgKGludCBrPSBsb3dlcjsgayA8PSB1cHBlcjsgayArPSAyKSB7IC8vIGsgaXMgdGhlIGN1cnJlbnQgZGlhZ29uYWwKLQkJCQlMaW5rZWRSYW5nZURpZmZlcmVuY2UgZWRpdDsKLQotCQkJCWlmIChwbSAhPSBudWxsICYmIHBtLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuIEVNUFRZX1JFU1VMVDsKLQotCQkJCWlmIChrID09IG9yaWdpbiAtIGQgfHwgayAhPSBvcmlnaW4gKyBkICYmIGxhc3REaWFnb25hbFtrICsgMV0gPj0gbGFzdERpYWdvbmFsW2sgLSAxXSkgewotCQkJCQkvLwotCQkJCQkvLyBtb3ZlIGRvd24KLQkJCQkJLy8KLQkJCQkJcm93PSBsYXN0RGlhZ29uYWxbayArIDFdICsgMTsKLQkJCQkJZWRpdD0gbmV3IExpbmtlZFJhbmdlRGlmZmVyZW5jZShzY3JpcHRbayArIDFdLCBMaW5rZWRSYW5nZURpZmZlcmVuY2UuREVMRVRFKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLwotCQkJCQkvLyBtb3ZlIHJpZ2h0Ci0JCQkJCS8vCi0JCQkJCXJvdz0gbGFzdERpYWdvbmFsW2sgLSAxXTsKLQkJCQkJZWRpdD0gbmV3IExpbmtlZFJhbmdlRGlmZmVyZW5jZShzY3JpcHRbayAtIDFdLCBMaW5rZWRSYW5nZURpZmZlcmVuY2UuSU5TRVJUKTsKLQkJCQl9Ci0JCQkJY29sPSByb3cgKyBrIC0gb3JpZ2luOwotCQkJCWVkaXQuZlJpZ2h0U3RhcnQ9IHJvdzsKLQkJCQllZGl0LmZMZWZ0U3RhcnQ9IGNvbDsKLQkJCQlBc3NlcnQuaXNUcnVlKGsgPj0gMCAmJiBrIDw9IG1heERpYWdvbmFsKTsKLQkJCQlzY3JpcHRba109IGVkaXQ7Ci0KLQkJCQkvLyBzbGlkZSBkb3duIHRoZSBkaWFnb25hbCBhcyBmYXIgYXMgcG9zc2libGUgCi0JCQkJd2hpbGUgKHJvdyA8IHJpZ2h0U2l6ZSAmJiBjb2wgPCBsZWZ0U2l6ZSAmJiByYW5nZXNFcXVhbChyaWdodCwgcm93LCBsZWZ0LCBjb2wpID09IHRydWUpIHsKLQkJCQkJKytyb3c7Ci0JCQkJCSsrY29sOwotCQkJCX0KLQotCQkJCUFzc2VydC5pc1RydWUoayA+PSAwICYmIGsgPD0gbWF4RGlhZ29uYWwpOyAvLyBVbnJlYXNvbmFibGUgdmFsdWUgZm9yIGRpYWdvbmFsIGluZGV4Ci0JCQkJbGFzdERpYWdvbmFsW2tdPSByb3c7Ci0KLQkJCQlpZiAocm93ID09IHJpZ2h0U2l6ZSAmJiBjb2wgPT0gbGVmdFNpemUpIHsKLQkJCQkJLy9zaG93U2NyaXB0KHNjcmlwdFtrXSwgcmlnaHQsIGxlZnQpOwotCQkJCQlyZXR1cm4gY3JlYXRlRGlmZmVyZW5jZXNSYW5nZXMoc2NyaXB0W2tdKTsKLQkJCQl9Ci0JCQkJaWYgKHJvdyA9PSByaWdodFNpemUpCi0JCQkJCWxvd2VyPSBrICsgMjsKLQkJCQlpZiAoY29sID09IGxlZnRTaXplKQotCQkJCQl1cHBlcj0gayAtIDI7Ci0JCQl9Ci0JCQktLWxvd2VyOwotCQkJKyt1cHBlcjsKLQkJfQotCQkvLyB0b28gbWFueSBkaWZmZXJlbmNlcwotCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRpZmZlcmVuY2VzIGFtb25nIHRocmVlIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBUaGUgZGlmZmVyZW5jZXMgYXJlIHJldHVybmVkIGFzIGEgbGlzdCBvZiA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+cy4KLQkgKiBJZiBubyBkaWZmZXJlbmNlcyBhcmUgZGV0ZWN0ZWQgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KLQkgKiBJZiB0aGUgYW5jZXN0b3IgcmFuZ2UgY29tcGFyYXRvciBpcyA8Y29kZT5udWxsPC9jb2RlPiwgYSB0d28td2F5Ci0JICogY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQuCi0JICogCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmFuZ2UgZGlmZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIGRpZmZlcmVuY2VzIHdlcmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlRGlmZmVyZW5jZVtdIGZpbmREaWZmZXJlbmNlcyhJUmFuZ2VDb21wYXJhdG9yIGFuY2VzdG9yLCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIElSYW5nZUNvbXBhcmF0b3IgcmlnaHQpIHsKLQkJcmV0dXJuIGZpbmREaWZmZXJlbmNlcyhudWxsLCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdGhyZWUgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIFRoZSBkaWZmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgYSBsaXN0IG9mIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT5zLgotCSAqIElmIG5vIGRpZmZlcmVuY2VzIGFyZSBkZXRlY3RlZCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgotCSAqIElmIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBhIHR3by13YXkKLQkgKiBjb21wYXJpc29uIGlzIHBlcmZvcm1lZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG0gaWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmFuZ2UgZGlmZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIGRpZmZlcmVuY2VzIHdlcmUgZm91bmQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBmaW5kRGlmZmVyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBwbSwgSVJhbmdlQ29tcGFyYXRvciBhbmNlc3RvciwgSVJhbmdlQ29tcGFyYXRvciBsZWZ0LCBJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0KSB7Ci0KLQkJaWYgKGFuY2VzdG9yID09IG51bGwpCi0JCQlyZXR1cm4gZmluZERpZmZlcmVuY2VzKHBtLCBsZWZ0LCByaWdodCk7Ci0KLQkJUmFuZ2VEaWZmZXJlbmNlW10gbGVmdEFuY2VzdG9yU2NyaXB0PSBudWxsOwotCQlSYW5nZURpZmZlcmVuY2VbXSByaWdodEFuY2VzdG9yU2NyaXB0PSBmaW5kRGlmZmVyZW5jZXMocG0sIGFuY2VzdG9yLCByaWdodCk7Ci0JCWlmIChyaWdodEFuY2VzdG9yU2NyaXB0ICE9IG51bGwpCi0JCQlsZWZ0QW5jZXN0b3JTY3JpcHQ9IGZpbmREaWZmZXJlbmNlcyhwbSwgYW5jZXN0b3IsIGxlZnQpOwotCQlpZiAocmlnaHRBbmNlc3RvclNjcmlwdCA9PSBudWxsIHx8IGxlZnRBbmNlc3RvclNjcmlwdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRGlmZmVyZW5jZXNJdGVyYXRvciBteUl0ZXI9IG5ldyBEaWZmZXJlbmNlc0l0ZXJhdG9yKHJpZ2h0QW5jZXN0b3JTY3JpcHQpOwotCQlEaWZmZXJlbmNlc0l0ZXJhdG9yIHlvdXJJdGVyPSBuZXcgRGlmZmVyZW5jZXNJdGVyYXRvcihsZWZ0QW5jZXN0b3JTY3JpcHQpOwotCi0JCUxpc3QgZGlmZjM9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGlmZjMuYWRkKG5ldyBSYW5nZURpZmZlcmVuY2UoUmFuZ2VEaWZmZXJlbmNlLkVSUk9SKSk7IC8vIGFkZCBhIHNlbnRpbmVsCi0KLQkJaW50IGNoYW5nZVJhbmdlU3RhcnQ9IDA7Ci0JCWludCBjaGFuZ2VSYW5nZUVuZD0gMDsKLQkJLy8KLQkJLy8gQ29tYmluZSB0aGUgdHdvIHR3by13YXkgZWRpdCBzY3JpcHRzIGludG8gb25lCi0JCS8vCi0JCXdoaWxlIChteUl0ZXIuZkRpZmZlcmVuY2UgIT0gbnVsbCB8fCB5b3VySXRlci5mRGlmZmVyZW5jZSAhPSBudWxsKSB7Ci0KLQkJCURpZmZlcmVuY2VzSXRlcmF0b3Igc3RhcnRUaHJlYWQ7Ci0JCQlteUl0ZXIucmVtb3ZlQWxsKCk7Ci0JCQl5b3VySXRlci5yZW1vdmVBbGwoKTsKLQkJCS8vCi0JCQkvLyB0YWtlIHRoZSBuZXh0IGRpZmYgdGhhdCBpcyBjbG9zZXIgdG8gdGhlIHN0YXJ0Ci0JCQkvLwotCQkJaWYgKG15SXRlci5mRGlmZmVyZW5jZSA9PSBudWxsKQotCQkJCXN0YXJ0VGhyZWFkPSB5b3VySXRlcjsKLQkJCWVsc2UgaWYgKHlvdXJJdGVyLmZEaWZmZXJlbmNlID09IG51bGwpCi0JCQkJc3RhcnRUaHJlYWQ9IG15SXRlcjsKLQkJCWVsc2UgeyAvLyBub3QgYXQgZW5kIG9mIGJvdGggc2NyaXB0cyB0YWtlIHRoZSBsb3dlc3QgcmFuZ2UKLQkJCQlpZiAobXlJdGVyLmZEaWZmZXJlbmNlLmZMZWZ0U3RhcnQgPD0geW91ckl0ZXIuZkRpZmZlcmVuY2UuZkxlZnRTdGFydCkgLy8gMiAtPiBjb21tb24gKEFuY2VzdG9yKSBjaGFuZ2UgcmFuZ2UKLQkJCQkJc3RhcnRUaHJlYWQ9IG15SXRlcjsKLQkJCQllbHNlCi0JCQkJCXN0YXJ0VGhyZWFkPSB5b3VySXRlcjsKLQkJCX0KLQkJCWNoYW5nZVJhbmdlU3RhcnQ9IHN0YXJ0VGhyZWFkLmZEaWZmZXJlbmNlLmZMZWZ0U3RhcnQ7Ci0JCQljaGFuZ2VSYW5nZUVuZD0gc3RhcnRUaHJlYWQuZkRpZmZlcmVuY2UubGVmdEVuZCgpOwotCi0JCQlzdGFydFRocmVhZC5uZXh0KCk7Ci0JCQkvLwotCQkJLy8gY2hlY2sgZm9yIG92ZXJsYXBwaW5nIGNoYW5nZXMgd2l0aCBvdGhlciB0aHJlYWQKLQkJCS8vIG1lcmdlIG92ZXJsYXBwaW5nIGNoYW5nZXMgd2l0aCB0aGlzIHJhbmdlCi0JCQkvLwotCQkJRGlmZmVyZW5jZXNJdGVyYXRvciBvdGhlcj0gc3RhcnRUaHJlYWQub3RoZXIobXlJdGVyLCB5b3VySXRlcik7Ci0JCQl3aGlsZSAob3RoZXIuZkRpZmZlcmVuY2UgIT0gbnVsbCAmJiBvdGhlci5mRGlmZmVyZW5jZS5mTGVmdFN0YXJ0IDw9IGNoYW5nZVJhbmdlRW5kKSB7Ci0JCQkJaW50IG5ld01heD0gb3RoZXIuZkRpZmZlcmVuY2UubGVmdEVuZCgpOwotCQkJCW90aGVyLm5leHQoKTsKLQkJCQlpZiAobmV3TWF4ID49IGNoYW5nZVJhbmdlRW5kKSB7Ci0JCQkJCWNoYW5nZVJhbmdlRW5kPSBuZXdNYXg7Ci0JCQkJCW90aGVyPSBvdGhlci5vdGhlcihteUl0ZXIsIHlvdXJJdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaWZmMy5hZGQoY3JlYXRlUmFuZ2VEaWZmZXJlbmNlMyhteUl0ZXIsIHlvdXJJdGVyLCBkaWZmMywgcmlnaHQsIGxlZnQsIGNoYW5nZVJhbmdlU3RhcnQsIGNoYW5nZVJhbmdlRW5kKSk7Ci0JCX0KLQotCQkvLyByZW1vdmUgc2VudGluZWwKLQkJZGlmZjMucmVtb3ZlKDApOwotCQlyZXR1cm4gKFJhbmdlRGlmZmVyZW5jZVtdKSBkaWZmMy50b0FycmF5KEVNUFRZX1JFU1VMVCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRpZmZlcmVuY2VzIGFtb25nIHR3byA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPnMuCi0JICogSW4gY29udHJhc3QgdG8gPGNvZGU+ZmluZERpZmZlcmVuY2VzPC9jb2RlPiwgdGhlIHJlc3VsdAotCSAqIGNvbnRhaW5zIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4gZWxlbWVudHMgZm9yIG5vbi1kaWZmZXJpbmcgcmFuZ2VzIHRvby4KLQkgKiAKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlW10gZmluZFJhbmdlcyhJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIElSYW5nZUNvbXBhcmF0b3IgcmlnaHQpIHsKLQkJcmV0dXJuIGZpbmRSYW5nZXMoKElQcm9ncmVzc01vbml0b3IpbnVsbCwgbGVmdCwgcmlnaHQpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdHdvIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBJbiBjb250cmFzdCB0byA8Y29kZT5maW5kRGlmZmVyZW5jZXM8L2NvZGU+LCB0aGUgcmVzdWx0Ci0JICogY29udGFpbnMgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiBlbGVtZW50cyBmb3Igbm9uLWRpZmZlcmluZyByYW5nZXMgdG9vLgotCSAqIAotCSAqIEBwYXJhbSBwbSBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlRGlmZmVyZW5jZVtdIGZpbmRSYW5nZXMoSVByb2dyZXNzTW9uaXRvciBwbSwgSVJhbmdlQ29tcGFyYXRvciBsZWZ0LCBJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0KSB7Ci0JCVJhbmdlRGlmZmVyZW5jZVtdIGluPSBmaW5kRGlmZmVyZW5jZXMocG0sIGxlZnQsIHJpZ2h0KTsKLQkJTGlzdCBvdXQ9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlSYW5nZURpZmZlcmVuY2UgcmQ7Ci0KLQkJaW50IG1zdGFydD0gMDsKLQkJaW50IHlzdGFydD0gMDsKLQotCQlmb3IgKGludCBpPSAwOyBpIDwgaW4ubGVuZ3RoOyBpKyspIHsKLQkJCVJhbmdlRGlmZmVyZW5jZSBlcz0gaW5baV07Ci0KLQkJCXJkPSBuZXcgUmFuZ2VEaWZmZXJlbmNlKFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSwgbXN0YXJ0LCBlcy5yaWdodFN0YXJ0KCkgLSBtc3RhcnQsIHlzdGFydCwgZXMubGVmdFN0YXJ0KCkgLSB5c3RhcnQpOwotCQkJaWYgKHJkLm1heExlbmd0aCgpICE9IDApCi0JCQkJb3V0LmFkZChyZCk7Ci0KLQkJCW91dC5hZGQoZXMpOwotCi0JCQltc3RhcnQ9IGVzLnJpZ2h0RW5kKCk7Ci0JCQl5c3RhcnQ9IGVzLmxlZnRFbmQoKTsKLQkJfQotCQlyZD0gbmV3IFJhbmdlRGlmZmVyZW5jZShSYW5nZURpZmZlcmVuY2UuTk9DSEFOR0UsIG1zdGFydCwgcmlnaHQuZ2V0UmFuZ2VDb3VudCgpIC0gbXN0YXJ0LCB5c3RhcnQsIGxlZnQuZ2V0UmFuZ2VDb3VudCgpIC0geXN0YXJ0KTsKLQkJaWYgKHJkLm1heExlbmd0aCgpID4gMCkKLQkJCW91dC5hZGQocmQpOwotCi0JCXJldHVybiAoUmFuZ2VEaWZmZXJlbmNlW10pIG91dC50b0FycmF5KEVNUFRZX1JFU1VMVCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRpZmZlcmVuY2VzIGFtb25nIHRocmVlIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBJbiBjb250cmFzdCB0byA8Y29kZT5maW5kRGlmZmVyZW5jZXM8L2NvZGU+LCB0aGUgcmVzdWx0Ci0JICogY29udGFpbnMgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiBlbGVtZW50cyBmb3Igbm9uLWRpZmZlcmluZyByYW5nZXMgdG9vLgotCSAqIElmIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBhIHR3by13YXkKLQkgKiBjb21wYXJpc29uIGlzIHBlcmZvcm1lZC4KLQkgKiAKLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlW10gZmluZFJhbmdlcyhJUmFuZ2VDb21wYXJhdG9yIGFuY2VzdG9yLCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIElSYW5nZUNvbXBhcmF0b3IgcmlnaHQpIHsKLQkJcmV0dXJuIGZpbmRSYW5nZXMobnVsbCwgYW5jZXN0b3IsIGxlZnQsIHJpZ2h0KTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZHMgdGhlIGRpZmZlcmVuY2VzIGFtb25nIHRocmVlIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBJbiBjb250cmFzdCB0byA8Y29kZT5maW5kRGlmZmVyZW5jZXM8L2NvZGU+LCB0aGUgcmVzdWx0Ci0JICogY29udGFpbnMgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiBlbGVtZW50cyBmb3Igbm9uLWRpZmZlcmluZyByYW5nZXMgdG9vLgotCSAqIElmIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBhIHR3by13YXkKLQkgKiBjb21wYXJpc29uIGlzIHBlcmZvcm1lZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG0gaWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmFuZ2UgZGlmZmVyZW5jZXMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBmaW5kUmFuZ2VzKElQcm9ncmVzc01vbml0b3IgcG0sIElSYW5nZUNvbXBhcmF0b3IgYW5jZXN0b3IsIElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgSVJhbmdlQ29tcGFyYXRvciByaWdodCkgewotCi0JCWlmIChhbmNlc3RvciA9PSBudWxsKQotCQkJcmV0dXJuIGZpbmRSYW5nZXMocG0sIGxlZnQsIHJpZ2h0KTsKLQotCQlSYW5nZURpZmZlcmVuY2VbXSBpbj0gZmluZERpZmZlcmVuY2VzKHBtLCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCQlMaXN0IG91dD0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVJhbmdlRGlmZmVyZW5jZSByZDsKLQotCQlpbnQgbXN0YXJ0PSAwOwotCQlpbnQgeXN0YXJ0PSAwOwotCQlpbnQgYXN0YXJ0PSAwOwotCi0JCWZvciAoaW50IGk9IDA7IGkgPCBpbi5sZW5ndGg7IGkrKykgewotCQkJUmFuZ2VEaWZmZXJlbmNlIGVzPSBpbltpXTsKLQotCQkJcmQ9IG5ldyBSYW5nZURpZmZlcmVuY2UoUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFLCBtc3RhcnQsIGVzLnJpZ2h0U3RhcnQoKSAtIG1zdGFydCwgeXN0YXJ0LCBlcy5sZWZ0U3RhcnQoKSAtIHlzdGFydCwgYXN0YXJ0LCBlcy5hbmNlc3RvclN0YXJ0KCkgLSBhc3RhcnQpOwotCQkJaWYgKHJkLm1heExlbmd0aCgpID4gMCkKLQkJCQlvdXQuYWRkKHJkKTsKLQotCQkJb3V0LmFkZChlcyk7Ci0KLQkJCW1zdGFydD0gZXMucmlnaHRFbmQoKTsKLQkJCXlzdGFydD0gZXMubGVmdEVuZCgpOwotCQkJYXN0YXJ0PSBlcy5hbmNlc3RvckVuZCgpOwotCQl9Ci0JCXJkPSBuZXcgUmFuZ2VEaWZmZXJlbmNlKFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSwgbXN0YXJ0LCByaWdodC5nZXRSYW5nZUNvdW50KCkgLSBtc3RhcnQsIHlzdGFydCwgbGVmdC5nZXRSYW5nZUNvdW50KCkgLSB5c3RhcnQsIGFzdGFydCwgYW5jZXN0b3IuZ2V0UmFuZ2VDb3VudCgpIC0gYXN0YXJ0KTsKLQkJaWYgKHJkLm1heExlbmd0aCgpID4gMCkKLQkJCW91dC5hZGQocmQpOwotCi0JCXJldHVybiAoUmFuZ2VEaWZmZXJlbmNlW10pIG91dC50b0FycmF5KEVNUFRZX1JFU1VMVCk7Ci0JfQotCi0JLy8tLS0tIHByaXZhdGUgbWV0aG9kcwotCi0JLyoKLQkgKiBDcmVhdGVzIGEgVmVjdG9yIG9mIERpZmZlcmVuY2VzUmFuZ2VzIG91dCBvZiB0aGUgTGlua2VkUmFuZ2VEaWZmZXJlbmNlLgotCSAqIEl0IGNvYWxlc2NlcyBhZGphY2VudCBjaGFuZ2VzLgotCSAqIEluIGFkZGl0aW9uLCBpbmRpY2VzIGFyZSBjaGFuZ2VkIHN1Y2ggdGhhdCB0aGUgcmFuZ2VzIGFyZSAxKSBvcGVuLCBpLmUsCi0JICogdGhlIGVuZCBvZiB0aGUgcmFuZ2UgaXMgbm90IGluY2x1ZGVkLCBhbmQgMikgYXJlIHplcm8gYmFzZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlW10gY3JlYXRlRGlmZmVyZW5jZXNSYW5nZXMoTGlua2VkUmFuZ2VEaWZmZXJlbmNlIHN0YXJ0KSB7Ci0KLQkJTGlua2VkUmFuZ2VEaWZmZXJlbmNlIGVwPSByZXZlcnNlRGlmZmVyZW5jZXMoc3RhcnQpOwotCQlBcnJheUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJhbmdlRGlmZmVyZW5jZSBlcz0gbnVsbDsKLQotCQl3aGlsZSAoZXAgIT0gbnVsbCkgewotCQkJZXM9IG5ldyBSYW5nZURpZmZlcmVuY2UoUmFuZ2VEaWZmZXJlbmNlLkNIQU5HRSk7Ci0KLQkJCWlmIChlcC5pc0luc2VydCgpKSB7Ci0JCQkJZXMuZlJpZ2h0U3RhcnQ9IGVwLmZSaWdodFN0YXJ0ICsgMTsKLQkJCQllcy5mTGVmdFN0YXJ0PSBlcC5mTGVmdFN0YXJ0OwotCQkJCVJhbmdlRGlmZmVyZW5jZSBiPSBlcDsKLQkJCQlkbyB7Ci0JCQkJCWVwPSBlcC5nZXROZXh0KCk7Ci0JCQkJCWVzLmZMZWZ0TGVuZ3RoKys7Ci0JCQkJfSB3aGlsZSAoZXAgIT0gbnVsbCAmJiBlcC5pc0luc2VydCgpICYmIGVwLmZSaWdodFN0YXJ0ID09IGIuZlJpZ2h0U3RhcnQpOwotCQkJfSBlbHNlIHsKLQkJCQllcy5mUmlnaHRTdGFydD0gZXAuZlJpZ2h0U3RhcnQ7Ci0JCQkJZXMuZkxlZnRTdGFydD0gZXAuZkxlZnRTdGFydDsKLQotCQkJCVJhbmdlRGlmZmVyZW5jZSBhPSBlcDsKLQkJCQkvLwotCQkJCS8vIGRlbGV0ZWQgbGluZXMKLQkJCQkvLwotCQkJCWRvIHsKLQkJCQkJYT0gZXA7Ci0JCQkJCWVwPSBlcC5nZXROZXh0KCk7Ci0JCQkJCWVzLmZSaWdodExlbmd0aCsrOwotCQkJCX0gd2hpbGUgKGVwICE9IG51bGwgJiYgZXAuaXNEZWxldGUoKSAmJiBlcC5mUmlnaHRTdGFydCA9PSBhLmZSaWdodFN0YXJ0ICsgMSk7Ci0KLQkJCQlib29sZWFuIGNoYW5nZT0gKGVwICE9IG51bGwgJiYgZXAuaXNJbnNlcnQoKSAmJiBlcC5mUmlnaHRTdGFydCA9PSBhLmZSaWdodFN0YXJ0KTsKLQotCQkJCWlmIChjaGFuZ2UpIHsKLQkJCQkJUmFuZ2VEaWZmZXJlbmNlIGI9IGVwOwotCQkJCQkvLwotCQkJCQkvLyByZXBsYWNlbWVudCBsaW5lcwotCQkJCQkvLwotCQkJCQlkbyB7Ci0JCQkJCQllcD0gZXAuZ2V0TmV4dCgpOwotCQkJCQkJZXMuZkxlZnRMZW5ndGgrKzsKLQkJCQkJfSB3aGlsZSAoZXAgIT0gbnVsbCAmJiBlcC5pc0luc2VydCgpICYmIGVwLmZSaWdodFN0YXJ0ID09IGIuZlJpZ2h0U3RhcnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVzLmZMZWZ0TGVuZ3RoPSAwOwotCQkJCX0KLQkJCQllcy5mTGVmdFN0YXJ0Kys7IC8vIG1lYW5pbmcgb2YgcmFuZ2UgY2hhbmdlcyBmcm9tICJpbnNlcnQgYWZ0ZXIiLCB0byAicmVwbGFjZSB3aXRoIgotCi0JCQl9Ci0JCQkvLwotCQkJLy8gdGhlIHNjcmlwdCBjb21tYW5kcyBhcmUgMSBiYXNlZCwgc3VidHJhY3Qgb25lIHRvIG1ha2UgdGhlbSB6ZXJvIGJhc2VkCi0JCQkvLwotCQkJZXMuZlJpZ2h0U3RhcnQtLTsKLQkJCWVzLmZMZWZ0U3RhcnQtLTsKLQkJCXJlc3VsdC5hZGQoZXMpOwotCQl9Ci0JCXJldHVybiAoUmFuZ2VEaWZmZXJlbmNlW10pIHJlc3VsdC50b0FycmF5KEVNUFRZX1JFU1VMVCk7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGEgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlMzwvY29kZT4gZ2l2ZW4gdGhlCi0JICogc3RhdGUgb2YgdHdvIERpZmZlcmVuY2VJdGVyYXRvcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlIGNyZWF0ZVJhbmdlRGlmZmVyZW5jZTMoRGlmZmVyZW5jZXNJdGVyYXRvciBteUl0ZXIsIERpZmZlcmVuY2VzSXRlcmF0b3IgeW91ckl0ZXIsIExpc3QgZGlmZjMsIAotCQlJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0LCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIGludCBjaGFuZ2VSYW5nZVN0YXJ0LCAgaW50IGNoYW5nZVJhbmdlRW5kKSB7Ci0KLQkJaW50IHJpZ2h0U3RhcnQsIHJpZ2h0RW5kOwotCQlpbnQgbGVmdFN0YXJ0LCBsZWZ0RW5kOwotCQlpbnQga2luZD0gUmFuZ2VEaWZmZXJlbmNlLkVSUk9SOwotCQlSYW5nZURpZmZlcmVuY2UgbGFzdD0gKFJhbmdlRGlmZmVyZW5jZSkgZGlmZjMuZ2V0KGRpZmYzLnNpemUoKSAtIDEpOwotCi0JCUFzc2VydC5pc1RydWUoKG15SXRlci5nZXRDb3VudCgpICE9IDAgfHwgeW91ckl0ZXIuZ2V0Q291bnQoKSAhPSAwKSk7CS8vIEF0IGxlYXN0IG9uZSByYW5nZSBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eQotCQkvLwotCQkvLyBmaW5kIGNvcnJlc3BvbmRpbmcgbGluZXMgdG8gZkNoYW5nZVJhbmdlU3RhcnQvRW5kIGluIHJpZ2h0IGFuZCBsZWZ0Ci0JCS8vCi0JCWlmIChteUl0ZXIuZ2V0Q291bnQoKSA9PSAwKSB7IC8vIG9ubHkgbGVmdCBjaGFuZ2VkCi0JCQlyaWdodFN0YXJ0PSBjaGFuZ2VSYW5nZVN0YXJ0IC0gbGFzdC5hbmNlc3RvckVuZCgpICsgbGFzdC5yaWdodEVuZCgpOwotCQkJcmlnaHRFbmQ9IGNoYW5nZVJhbmdlRW5kIC0gbGFzdC5hbmNlc3RvckVuZCgpICsgbGFzdC5yaWdodEVuZCgpOwotCQkJa2luZD0gUmFuZ2VEaWZmZXJlbmNlLkxFRlQ7Ci0JCX0gZWxzZSB7Ci0JCQlSYW5nZURpZmZlcmVuY2UgZj0gKFJhbmdlRGlmZmVyZW5jZSkgbXlJdGVyLmZSYW5nZS5nZXQoMCk7Ci0JCQlSYW5nZURpZmZlcmVuY2UgbD0gKFJhbmdlRGlmZmVyZW5jZSkgbXlJdGVyLmZSYW5nZS5nZXQobXlJdGVyLmZSYW5nZS5zaXplKCkgLSAxKTsKLQkJCXJpZ2h0U3RhcnQ9IGNoYW5nZVJhbmdlU3RhcnQgLSBmLmZMZWZ0U3RhcnQgKyBmLmZSaWdodFN0YXJ0OwotCQkJcmlnaHRFbmQ9IGNoYW5nZVJhbmdlRW5kIC0gbC5sZWZ0RW5kKCkgKyBsLnJpZ2h0RW5kKCk7Ci0JCX0KLQotCQlpZiAoeW91ckl0ZXIuZ2V0Q291bnQoKSA9PSAwKSB7IC8vIG9ubHkgcmlnaHQgY2hhbmdlZAotCQkJbGVmdFN0YXJ0PSBjaGFuZ2VSYW5nZVN0YXJ0IC0gbGFzdC5hbmNlc3RvckVuZCgpICsgbGFzdC5sZWZ0RW5kKCk7Ci0JCQlsZWZ0RW5kPSBjaGFuZ2VSYW5nZUVuZCAtIGxhc3QuYW5jZXN0b3JFbmQoKSArIGxhc3QubGVmdEVuZCgpOwotCQkJa2luZD0gUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOwotCQl9IGVsc2UgewotCQkJUmFuZ2VEaWZmZXJlbmNlIGY9IChSYW5nZURpZmZlcmVuY2UpIHlvdXJJdGVyLmZSYW5nZS5nZXQoMCk7Ci0JCQlSYW5nZURpZmZlcmVuY2UgbD0gKFJhbmdlRGlmZmVyZW5jZSkgeW91ckl0ZXIuZlJhbmdlLmdldCh5b3VySXRlci5mUmFuZ2Uuc2l6ZSgpIC0gMSk7Ci0JCQlsZWZ0U3RhcnQ9IGNoYW5nZVJhbmdlU3RhcnQgLSBmLmZMZWZ0U3RhcnQgKyBmLmZSaWdodFN0YXJ0OwotCQkJbGVmdEVuZD0gY2hhbmdlUmFuZ2VFbmQgLSBsLmxlZnRFbmQoKSArIGwucmlnaHRFbmQoKTsKLQkJfQotCi0JCWlmIChraW5kID09IFJhbmdlRGlmZmVyZW5jZS5FUlJPUikgeyAvLyBvdmVybGFwcGluZyBjaGFuZ2UgKGNvbmZsaWN0KSAtPiBjb21wYXJlIHRoZSBjaGFuZ2VkIHJhbmdlcwotCQkJaWYgKHJhbmdlU3BhbnNFcXVhbChyaWdodCwgcmlnaHRTdGFydCwgcmlnaHRFbmQgLSByaWdodFN0YXJ0LCBsZWZ0LCBsZWZ0U3RhcnQsIGxlZnRFbmQgLSBsZWZ0U3RhcnQpKQotCQkJCWtpbmQ9IFJhbmdlRGlmZmVyZW5jZS5BTkNFU1RPUjsKLQkJCWVsc2UKLQkJCQlraW5kPSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1Q7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSYW5nZURpZmZlcmVuY2Uoa2luZCwgcmlnaHRTdGFydCwgcmlnaHRFbmQgLSByaWdodFN0YXJ0LCBsZWZ0U3RhcnQsIGxlZnRFbmQgLSBsZWZ0U3RhcnQsIGNoYW5nZVJhbmdlU3RhcnQsIGNoYW5nZVJhbmdlRW5kIC0gY2hhbmdlUmFuZ2VTdGFydCk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0cyBpZiB0d28gcmFuZ2VzIGFyZSBlcXVhbAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmFuZ2VzRXF1YWwoSVJhbmdlQ29tcGFyYXRvciBhLCBpbnQgYWksIElSYW5nZUNvbXBhcmF0b3IgYiwgaW50IGJpKSB7Ci0JCXJldHVybiBhLnJhbmdlc0VxdWFsKGFpLCBiLCBiaSk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0cyB3aGV0aGVyIDxjb2RlPnJpZ2h0PC9jb2RlPiBhbmQgPGNvZGU+bGVmdDwvbGVmdD4gY2hhbmdlZCBpbiB0aGUgc2FtZSB3YXkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJhbmdlU3BhbnNFcXVhbChJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0LCBpbnQgcmlnaHRTdGFydCwgaW50IHJpZ2h0TGVuLCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIGludCBsZWZ0U3RhcnQsIGludCBsZWZ0TGVuKSB7Ci0JCWlmIChyaWdodExlbiA9PSBsZWZ0TGVuKSB7Ci0JCQlpbnQgaT0gMDsKLQkJCWZvciAoaT0gMDsgaSA8IHJpZ2h0TGVuOyBpKyspIHsKLQkJCQlpZiAoIXJhbmdlc0VxdWFsKHJpZ2h0LCByaWdodFN0YXJ0ICsgaSwgbGVmdCwgbGVmdFN0YXJ0ICsgaSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGkgPT0gcmlnaHRMZW4pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogUmV2ZXJzZXMgdGhlIHJhbmdlIGRpZmZlcmVuY2VzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlua2VkUmFuZ2VEaWZmZXJlbmNlIHJldmVyc2VEaWZmZXJlbmNlcyhMaW5rZWRSYW5nZURpZmZlcmVuY2Ugc3RhcnQpIHsKLQkJTGlua2VkUmFuZ2VEaWZmZXJlbmNlIGVwLCBiZWhpbmQsIGFoZWFkOwotCi0JCWFoZWFkPSBzdGFydDsKLQkJZXA9IG51bGw7Ci0JCXdoaWxlIChhaGVhZCAhPSBudWxsKSB7Ci0JCQliZWhpbmQ9IGVwOwotCQkJZXA9IGFoZWFkOwotCQkJYWhlYWQ9IGFoZWFkLmdldE5leHQoKTsKLQkJCWVwLnNldE5leHQoYmVoaW5kKTsKLQkJfQotCQlyZXR1cm4gZXA7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4MDY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbk5UOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBmaW5kaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi10d28gb3IgdGhyZWUgc2VxdWVuY2VzIG9mIGNvbXBhcmFibGUgZW50aXRpZXMuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotCi1UaGUgY2xhc3MgPGI+UmFuZ2VEaWZmZXJlbmNlcjwvYj4gZmluZHMgbG9uZ2VzdCBzZXF1ZW5jZXMgb2YgbWF0Y2hpbmcgYW5kCi1ub24tbWF0Y2hpbmcgY29tcGFyYWJsZSBlbnRpdGllcy4gSXRzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uCi1hbiBvYmplY3RpZmllZCB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGluOgotPGk+QSBGaWxlIENvbXBhcmlzb24gUHJvZ3JhbSw8L2k+IGJ5IFdlYmIgTWlsbGVyIGFuZCBFdWdlbmUgVy4gTXllcnMsCi1Tb2Z0d2FyZSBQcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwgVm9sLiAxNSwgTm92LiAxOTg1LgotPHA+Ci0KLUNsaWVudHMgbXVzdCBzdXBwbHkgdGhlIGlucHV0IHRvIHRoZSBkaWZmZXJlbmNlciBhcyBhbiBpbXBsZW1lbnRhdGlvbgotb2YgdGhlIDxiPklSYW5nZUNvbXBhcmF0b3I8L2I+IGludGVyZmFjZS4KLUFuIDxiPklSYW5nZUNvbXBhcmF0b3I8L2I+IGJyZWFrcyB0aGUgaW5wdXQgZGF0YSBpbnRvIGEgc2VxdWVuY2UKLW9mIGVudGl0aWVzIGFuZCBwcm92aWRlcyBhIG1ldGhvZCBmb3IgY29tcGFyaW5nCi1vbmUgZW50aXR5IHdpdGggdGhlIGVudGl0eSBpbiBhbm90aGVyIDxiPklSYW5nZUNvbXBhcmF0b3I8L2I+LgotPHA+Ci0KLUZvciBleGFtcGxlLCB0byBjb21wYXJlIHR3byB0ZXh0IGRvY3VtZW50cyBhbmQgZmluZCBsb25nZXN0IGNvbW1vbgotc2VxdWVuY2VzIG9mIG1hdGNoaW5nIGFuZCBub24tbWF0Y2hpbmcgbGluZXMsCi10aGUgaW1wbGVtZW50YXRpb24gb2YgPGI+SVJhbmdlQ29tcGFyYXRvcjwvYj4gCi1tdXN0IGJyZWFrIHRoZSBkb2N1bWVudCBpbnRvIGxpbmVzIGFuZCBwcm92aWRlIGEgbWV0aG9kIGZvciB0ZXN0aW5nCi13aGV0aGVyIHR3byBsaW5lcyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KLVNlZSA8Yj5vcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkRvY0xpbmVDb21wYXJhdG9yPC9iPiBmb3IgaG93IHRoaXMgY2FuIGJlIGRvbmUuCi08cD4KLQotVGhlIGRpZmZlcmVuY2VyIHJldHVybnMgdGhlIGRpZmZlcmVuY2VzIGFtb25nIHRoZXNlIHNlcXVlbmNlcyBhcyBhbgotYXJyYXkgb2YgPGI+UmFuZ2VEaWZmZXJlbmNlPC9iPiBvYmplY3RzLgotRXZlcnkgc2luZ2xlIDxiPlJhbmdlRGlmZmVyZW5jZTwvYj4gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UKLShubyBjaGFuZ2UsIGNoYW5nZSwgYWRkaXRpb24sIGRlbGV0aW9uKSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmFuZ2VzCi1vZiB0aGUgdW5kZXJseWluZyBjb21wYXJhYmxlIGVudGl0aWVzIGluIHRoZSB0d28gb3IgdGhyZWUgaW5wdXRzLgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY1NWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBUaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgYSBkaWZmIGNvbnRhaW5lciBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQsIG9yIGZ1cnRoZXIgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpZmZDb250YWluZXIgZXh0ZW5kcyBEaWZmRWxlbWVudCBpbXBsZW1lbnRzIElEaWZmQ29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIElEaWZmRWxlbWVudFtdIGZnRW1wdHlBcnJheT0gbmV3IElEaWZmRWxlbWVudFswXTsKLQlwcml2YXRlIEFycmF5TGlzdCBmQ2hpbGRyZW47Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGtpbmQgdW5kZXIgdGhlIGdpdmVuIHBhcmVudC4gCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHVuZGVyIHdoaWNoIHRoZSBuZXcgY29udGFpbmVyIGlzIGFkZGVkIGFzIGEgY2hpbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGtpbmQgb2YgZGlmZmVyZW5jZSAoZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBEaWZmQ29udGFpbmVyKElEaWZmQ29udGFpbmVyIHBhcmVudCwgaW50IGtpbmQpIHsKLQkJc3VwZXIocGFyZW50LCBraW5kKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJpZXMgdG8gZmluZCB0aGUgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggY2hpbGQgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjaGlsZCB0byBmaW5kCi0JICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB3aXRoIGEgbWF0Y2hpbmcgbmFtZQotCSAqLwotCXB1YmxpYyBJRGlmZkVsZW1lbnQgZmluZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlEaWZmRWxlbWVudCBjaGlsZD0gKElEaWZmRWxlbWVudCkgY2hpbGRyZW5baV07Ci0JCQlpZiAobmFtZS5lcXVhbHMoY2hpbGQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRGlmZkNvbnRhaW5lci5hZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSURpZmZFbGVtZW50IGRpZmYpIHsKLQkJaWYgKGZDaGlsZHJlbiA9PSBudWxsKQotCQkJZkNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDaGlsZHJlbi5hZGQoZGlmZik7Ci0JCWRpZmYuc2V0UGFyZW50KHRoaXMpOwotCX0KLQotCS8qCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2hpbGQgZnJvbSB0aGlzIGNvbnRhaW5lci4KLQkgKiBJZiB0aGUgY29udGFpbmVyIGJlY29tZXMgZW1wdHkgaXQgaXMgcmVtb3ZlZCBmcm9tIGl0cyBjb250YWluZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVG9Sb290KElEaWZmRWxlbWVudCBjaGlsZCkgewotCQlpZiAoZkNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZDaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCQkJY2hpbGQuc2V0UGFyZW50KG51bGwpOwotCQkJaWYgKGZDaGlsZHJlbi5zaXplKCkgPT0gMCkgewotCQkJCUlEaWZmQ29udGFpbmVyIHA9IGdldFBhcmVudCgpOwotCQkJCWlmIChwICE9IG51bGwpCi0JCQkJCXAucmVtb3ZlVG9Sb290KHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2hpbGQgKG5vbi1yZWN1cnNpdmVseSkgZnJvbSB0aGlzIGNvbnRhaW5lci4KLQkgKgotCSAqIEBwYXJhbSBjaGlsZCB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSURpZmZFbGVtZW50IGNoaWxkKSB7Ci0JCWlmIChmQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZkNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRGlmZkNvbnRhaW5lci5oYXNDaGlsZHJlbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZkNoaWxkcmVuICE9IG51bGwgJiYgZkNoaWxkcmVuLnNpemUoKSA+IDA7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRGlmZkNvbnRhaW5lci5nZXRDaGlsZHJlbgotCSAqLwotCXB1YmxpYyBJRGlmZkVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGZDaGlsZHJlbiAhPSBudWxsKQotCQkJcmV0dXJuIChJRGlmZkVsZW1lbnRbXSkgZkNoaWxkcmVuLnRvQXJyYXkoZmdFbXB0eUFycmF5KTsKLQkJcmV0dXJuIGZnRW1wdHlBcnJheTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ZmY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklUeXBlZEVsZW1lbnQ7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SURpZmZFbGVtZW50PC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IGFkZCBiZWhhdmlvciBhbmQgc3RhdGUsIGFuZCBtYXkgb3ZlcnJpZGUgPGNvZGU+Z2V0SW1hZ2U8L2NvZGU+Ci0gKiBhbmQgPGNvZGU+Z2V0VHlwZTwvY29kZT4gdG8gc3VpdC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpZmZFbGVtZW50IGltcGxlbWVudHMgSURpZmZFbGVtZW50IHsKLQotCXByaXZhdGUgaW50IGZLaW5kOwotCXByaXZhdGUgSURpZmZDb250YWluZXIgZlBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlmZkVsZW1lbnQ8L2NvZGU+IGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudC4KLQkgKiBJZiBwYXJlbnQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZSBuZXcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgcGFyZW50LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG9mIHRoaXMgY2hpbGQ7IGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGlzIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcyBhIGNoaWxkCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgY2hhbmdlCi0JICovCi0JcHVibGljIERpZmZFbGVtZW50KElEaWZmQ29udGFpbmVyIHBhcmVudCwgaW50IGtpbmQpIHsKLQkJZlBhcmVudD0gcGFyZW50OwotCQlmS2luZD0ga2luZDsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcGFyZW50LmFkZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+RGlmZkVsZW1lbnQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVR5cGVkSW5wdXQ8L2NvZGU+Ci0JICogbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IHJlLWltcGxlbWVudCB0byBwcm92aWRlCi0JICogYW4gaW1hZ2UgZm9yIHRoaXMgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIDxjb2RlPkRpZmZFbGVtZW50PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+Ci0JICogbWV0aG9kIHJldHVybnMgPGNvZGU+SVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU8L2NvZGU+LiBTdWJjbGFzc2VzIG1heQotCSAqIHJlLWltcGxlbWVudCB0byBwcm92aWRlIGEgdHlwZSBmb3IgdGhpcyBlbGVtZW50LgotCSAqIEByZXR1cm4gPGNvZGU+SVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZSBmb3IgdGhpcyBlbGVtZW50LgotCSAqCi0JICogQHBhcmFtIGtpbmQgc2V0IHRoZSBraW5kIG9mIGRpZmZlcmVuY2UgdGhpcyBlbGVtZW50IHJlcHJlc2VudHMKLQkgKiBAc2VlIERpZmZlcmVuY2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChpbnQga2luZCkgewotCQlmS2luZD0ga2luZDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEaWZmRWxlbWVudC5nZXRLaW5kCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gZktpbmQ7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRGlmZkVsZW1lbnQuZ2V0UGFyZW50Ci0JICovCi0JcHVibGljIElEaWZmQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGZQYXJlbnQ7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRGlmZkVsZW1lbnQuc2V0UGFyZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElEaWZmQ29udGFpbmVyIHBhcmVudCkgewotCQlmUGFyZW50PSBwYXJlbnQ7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDMwYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxpc3RlbmVyTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlV0aWxpdGllczsKLQotLyoqCi0gKiBEaWZmIG5vZGUgYXJlIHVzZWQgYXMgdGhlIGNvbXBhcmUgcmVzdWx0IG9mIHRoZSBkaWZmZXJlbmNpbmcgZW5naW5lLgotICogU2luY2UgaXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+Ci0gKiBpbnRlcmZhY2VzIGl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IHRvIGRpc3BsYXkgdGhlCi0gKiBjb21wYXJlIHJlc3VsdCBpbiBhIDxjb2RlPkRpZmZUcmVlVmlld2VyPC9jb2RlPiBhbmQgYXMgdGhlIGlucHV0IHRvIGFueSBvdGhlcgotICogY29tcGFyZS9tZXJnZSB2aWV3ZXIuCi0gKiA8cD4KLSAqIDxjb2RlPkRpZmZOb2RlPC9jb2RlPnMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgcGVyZm9ybWluZwotICogYSBjb21wYXJlIHdpdGggdGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyB0eXBpY2FsbHkgdXNlIHRoaXMgY2xhc3MgYXMgaXMsIGJ1dCBtYXkgc3ViY2xhc3MgaWYgcmVxdWlyZWQuCi0gKiAKLSAqIEBzZWUgRGlmZlRyZWVWaWV3ZXIKLSAqIEBzZWUgRGlmZmVyZW5jZXIKLSAqLwotcHVibGljIGNsYXNzIERpZmZOb2RlIGV4dGVuZHMgRGlmZkNvbnRhaW5lciBpbXBsZW1lbnRzIElUeXBlZEVsZW1lbnQsIElDb21wYXJlSW5wdXQgewotCi0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZBbmNlc3RvcjsKLQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZkxlZnQ7Ci0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZSaWdodDsKLQlwcml2YXRlIGJvb2xlYW4gZkRvbnRFeHBhbmQ7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVyOwotCXByaXZhdGUgYm9vbGVhbiBmU3dhcFNpZGVzOwotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWZmTm9kZTwvY29kZT4gYW5kIGluaXRpYWxpemVzIHdpdGggdGhlIGdpdmVuIHZhbHVlcy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdW5kZXIgd2hpY2ggdGhlIG5ldyBjb250YWluZXIgaXMgYWRkZWQgYXMgYSBjaGlsZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBraW5kIG9mIGRpZmZlcmVuY2UgKGRlZmluZWQgaW4gPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+KQotCSAqIEBwYXJhbSBhbmNlc3RvciB0aGUgY29tbW9uIGFuY2VzdG9yIGlucHV0IHRvIGEgY29tcGFyZQotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IGlucHV0IHRvIGEgY29tcGFyZQotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgaW5wdXQgdG8gYSBjb21wYXJlCi0JICovCi0JcHVibGljIERpZmZOb2RlKElEaWZmQ29udGFpbmVyIHBhcmVudCwgaW50IGtpbmQsIElUeXBlZEVsZW1lbnQgYW5jZXN0b3IsIElUeXBlZEVsZW1lbnQgbGVmdCwgSVR5cGVkRWxlbWVudCByaWdodCkgewotCQl0aGlzKHBhcmVudCwga2luZCk7Ci0JCWZBbmNlc3Rvcj0gYW5jZXN0b3I7Ci0JCWZMZWZ0PSBsZWZ0OwotCQlmUmlnaHQ9IHJpZ2h0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlmZk5vZGU8L2NvZGU+IHdpdGggZGlmZiBraW5kIDxjb2RlPkRpZmZlcmVuY2VyLkNIQU5HRTwvY29kZT4KLQkgKiBhbmQgaW5pdGlhbGl6ZXMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotCSAqCi0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgaW5wdXQgdG8gYSBjb21wYXJlCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBpbnB1dCB0byBhIGNvbXBhcmUKLQkgKi8KLQlwdWJsaWMgRGlmZk5vZGUoSVR5cGVkRWxlbWVudCBsZWZ0LCBJVHlwZWRFbGVtZW50IHJpZ2h0KSB7Ci0JCXRoaXMobnVsbCwgRGlmZmVyZW5jZXIuQ0hBTkdFLCBudWxsLCBsZWZ0LCByaWdodCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWZmTm9kZTwvY29kZT4gYW5kIGluaXRpYWxpemVzIHdpdGggdGhlIGdpdmVuIHZhbHVlcy4KLQkgKgotCSAqIEBwYXJhbSBraW5kIG9mIGRpZmZlcmVuY2UgKGRlZmluZWQgaW4gPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+KQotCSAqIEBwYXJhbSBhbmNlc3RvciB0aGUgY29tbW9uIGFuY2VzdG9yIGlucHV0IHRvIGEgY29tcGFyZQotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IGlucHV0IHRvIGEgY29tcGFyZQotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgaW5wdXQgdG8gYSBjb21wYXJlCi0JICovCi0JcHVibGljIERpZmZOb2RlKGludCBraW5kLCBJVHlwZWRFbGVtZW50IGFuY2VzdG9yLCBJVHlwZWRFbGVtZW50IGxlZnQsIElUeXBlZEVsZW1lbnQgcmlnaHQpIHsKLQkJdGhpcyhudWxsLCBraW5kLCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlmZk5vZGU8L2NvZGU+IHdpdGggdGhlIGdpdmVuIGRpZmYga2luZC4KLQkgKgotCSAqIEBwYXJhbSBraW5kIG9mIGRpZmZlcmVuY2UgKGRlZmluZWQgaW4gPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+KQotCSAqLwotCXB1YmxpYyBEaWZmTm9kZShpbnQga2luZCkgewotCQlzdXBlcihudWxsLCBraW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpZmZOb2RlPC9jb2RlPiBhbmQgaW5pdGlhbGl6ZXMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB1bmRlciB3aGljaCB0aGUgbmV3IGNvbnRhaW5lciBpcyBhZGRlZCBhcyBhIGNoaWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGtpbmQgb2YgZGlmZmVyZW5jZSAoZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4pCi0JICovCi0JcHVibGljIERpZmZOb2RlKElEaWZmQ29udGFpbmVyIHBhcmVudCwgaW50IGtpbmQpIHsKLQkJc3VwZXIocGFyZW50LCBraW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyBvZiB0aGlzIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+LgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIoSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXIgPT0gbnVsbCkKLQkJCWZMaXN0ZW5lcj0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlmTGlzdGVuZXIuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYSA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPiBsaXN0ZW5lci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcihJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlmTGlzdGVuZXIucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWlmIChmTGlzdGVuZXIuaXNFbXB0eSgpKQotCQkJCWZMaXN0ZW5lcj0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZW5kcyBvdXQgbm90aWZpY2F0aW9uIHRoYXQgYSBjaGFuZ2UgaGFzIG9jY3VyZWQgb24gdGhlIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVDaGFuZ2UoKSB7Ci0JCWlmIChmTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXIuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQotCQkJCSgoSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmNvbXBhcmVJbnB1dENoYW5nZWQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvLy0tLS0gZ2V0dGVycyAmIHNldHRlcnMKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBub2RlIHNob3VsZG4ndCBhdXRvbWF0aWNhbGx5IGJlIGV4cGFuZGVkIGluCi0JICogYSA8L2NvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBub2RlIHNob3VsZG4ndCBhdXRvbWF0aWNhbGx5IGJlIGV4cGFuZGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9udEV4cGFuZCgpIHsKLQkJcmV0dXJuIGZEb250RXhwYW5kOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBub2RlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIHdoZW4gZGlzcGxheWVkIGluCi0JICogYSA8L2NvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGRvbnRFeHBhbmQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhpcyBub2RlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIGluIDwvY29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb250RXhwYW5kKGJvb2xlYW4gZG9udEV4cGFuZCkgewotCQlmRG9udEV4cGFuZD0gZG9udEV4cGFuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBub3QtPGNvZGU+bnVsbDwvY29kZT4gaW5wdXQgb2YgdGhpcyBub2RlLgotCSAqIE1ldGhvZCBjaGVja3MgdGhlIHRocmVlIGlucHV0cyBpbiB0aGUgb3JkZXI6IGFuY2VzdG9yLCByaWdodCwgbGVmdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vdC08Y29kZT5udWxsPC9jb2RlPiBpbnB1dCBvZiB0aGlzIG5vZGUKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCBnZXRJZCgpIHsKLQkJaWYgKGZBbmNlc3RvciAhPSBudWxsKQotCQkJcmV0dXJuIGZBbmNlc3RvcjsKLQkJaWYgKGZSaWdodCAhPSBudWxsKQotCQkJcmV0dXJuIGZSaWdodDsKLQkJcmV0dXJuIGZMZWZ0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIChub24tPGNvZGU+bnVsbDwvY29kZT4pIG5hbWUgb2YgdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpZiB0aGV5IGFyZSBpZGVudGljYWwuCi0JICogT3RoZXJ3aXNlIGJvdGggbmFtZXMgYXJlIGNvbmNhdGVuYXRlZCAoc2VwYXJhdGVkIHdpdGggYSBzbGFzaCAoJy8nKSkuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgcmUtaW1wbGVtZW50IHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhpcyBub2RlLgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBub2RlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHJpZ2h0PSBudWxsOwotCQlpZiAoZlJpZ2h0ICE9IG51bGwpCi0JCQlyaWdodD0gZlJpZ2h0LmdldE5hbWUoKTsKLQotCQlTdHJpbmcgbGVmdD0gbnVsbDsKLQkJaWYgKGZMZWZ0ICE9IG51bGwpCi0JCQlsZWZ0PSBmTGVmdC5nZXROYW1lKCk7Ci0KLQkJaWYgKHJpZ2h0ID09IG51bGwgJiYgbGVmdCA9PSBudWxsKSB7Ci0JCQlpZiAoZkFuY2VzdG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIGZBbmNlc3Rvci5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gVXRpbGl0aWVzLmdldFN0cmluZygiRGlmZk5vZGUubm9OYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChyaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIGxlZnQ7Ci0JCWlmIChsZWZ0ID09IG51bGwpCi0JCQlyZXR1cm4gcmlnaHQ7Ci0KLQkJaWYgKHJpZ2h0LmVxdWFscyhsZWZ0KSkKLQkJCXJldHVybiByaWdodDsKLQkJCQotCQlTdHJpbmcgczE7Ci0JCVN0cmluZyBzMjsKLQkJCi0JCWlmIChmU3dhcFNpZGVzKSB7Ci0JCQlzMT0gbGVmdDsKLQkJCXMyPSByaWdodDsKLQkJfSBlbHNlIHsKLQkJCXMxPSByaWdodDsKLQkJCXMyPSBsZWZ0OwotCQl9Ci0JCQotCQlTdHJpbmcgZm10PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJEaWZmTm9kZS5uYW1lRm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZtdCwgbmV3IFN0cmluZ1tdIHsgczEsIHMyIH0pOwotCX0KLQkKLQl2b2lkIHN3YXBTaWRlcyhib29sZWFuIHN3YXApIHsKLQkJZlN3YXBTaWRlcz0gc3dhcDsKLQl9Ci0JCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXRJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJSVR5cGVkRWxlbWVudCBpZD0gZ2V0SWQoKTsKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlyZXR1cm4gaWQuZ2V0SW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJVHlwZWRFbGVtZW50LmdldFR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCUlUeXBlZEVsZW1lbnQgaWQ9IGdldElkKCk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJcmV0dXJuIGlkLmdldFR5cGUoKTsKLQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFuY2VzdG9yIGlucHV0IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBhbmNlc3RvciB0aGUgbmV3IHZhbHVlIGZvciB0aGUgYW5jZXN0b3IgaW5wdXQKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5jZXN0b3IoSVR5cGVkRWxlbWVudCBhbmNlc3RvcikgewotCSAgICBmQW5jZXN0b3I9IGFuY2VzdG9yOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElDb21wYXJlSW5wdXQuZ2V0QW5jZXN0b3IKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCBnZXRBbmNlc3RvcigpIHsKLQkJcmV0dXJuIGZBbmNlc3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGVmdCBpbnB1dCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbmV3IHZhbHVlIGZvciB0aGUgbGVmdCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnQoSVR5cGVkRWxlbWVudCBsZWZ0KSB7Ci0JCWZMZWZ0PSBsZWZ0OwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElDb21wYXJlSW5wdXQuZ2V0TGVmdAotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IGdldExlZnQoKSB7Ci0JCXJldHVybiBmTGVmdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByaWdodCBpbnB1dCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHJpZ2h0IGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmlnaHQoSVR5cGVkRWxlbWVudCByaWdodCkgewotCQlmUmlnaHQ9IHJpZ2h0OwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElDb21wYXJlSW5wdXQuZ2V0UmlnaHQKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCBnZXRSaWdodCgpIHsKLQkJcmV0dXJuIGZSaWdodDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElDb21wYXJlSW5wdXQuY29weQotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoYm9vbGVhbiBsZWZ0VG9SaWdodCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiRGlmZk5vZGUuY29weTogIiArIGxlZnRUb1JpZ2h0KTsKLQkJCi0JCUlEaWZmQ29udGFpbmVyIHBhPSBnZXRQYXJlbnQoKTsKLQkJaWYgKHBhIGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJSUNvbXBhcmVJbnB1dCBwYXJlbnQ9IChJQ29tcGFyZUlucHV0KSBwYTsKLQkJCU9iamVjdCBkc3RQYXJlbnQ9IGxlZnRUb1JpZ2h0ID8gcGFyZW50LmdldFJpZ2h0KCkgOiBwYXJlbnQuZ2V0TGVmdCgpOwotCQkJCi0JCQlpZiAoZHN0UGFyZW50IGluc3RhbmNlb2YgSUVkaXRhYmxlQ29udGVudCkgewotCQkJCUlUeXBlZEVsZW1lbnQgZHN0PSBsZWZ0VG9SaWdodCA/IGdldFJpZ2h0KCkgOiBnZXRMZWZ0KCk7Ci0JCQkJSVR5cGVkRWxlbWVudCBzcmM9IGxlZnRUb1JpZ2h0ID8gZ2V0TGVmdCgpIDogZ2V0UmlnaHQoKTsKLQkJCQlkc3Q9ICgoSUVkaXRhYmxlQ29udGVudClkc3RQYXJlbnQpLnJlcGxhY2UoZHN0LCBzcmMpOwotCQkJCWlmIChsZWZ0VG9SaWdodCkKLQkJCQkJc2V0UmlnaHQoZHN0KTsKLQkJCQllbHNlCi0JCQkJCXNldExlZnQoZHN0KTsKLQkJCQkKLQkJCQkvL3NldEtpbmQoRGlmZmVyZW5jZXIuTk9fQ0hBTkdFKTsKLQkJCQkKLQkJCQlmaXJlQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBPYmplY3QuaGFzaENvZGUKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlTdHJpbmdbXSBwYXRoPSBnZXRQYXRoKHRoaXMsIDApOwotCQlpbnQgaGFzaENvZGU9IDE7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JICAgIAlTdHJpbmcgcz0gcGF0aFtpXTsKLQkgICAJIAloYXNoQ29kZT0gKDMxKmhhc2hDb2RlKSArIChzICE9IG51bGwgPyBzLmhhc2hDb2RlKCkgOiAwKTsKLQkJfQotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgT2JqZWN0LmVxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKG90aGVyICE9IG51bGwgJiYgZ2V0Q2xhc3MoKSA9PSBvdGhlci5nZXRDbGFzcygpKSB7Ci0JCQlTdHJpbmdbXSBwYXRoMT0gZ2V0UGF0aCh0aGlzLCAwKTsKLQkJCVN0cmluZ1tdIHBhdGgyPSBnZXRQYXRoKChEaWZmTm9kZSkgb3RoZXIsIDApOwotCQkJaWYgKHBhdGgxLmxlbmd0aCAhPSBwYXRoMi5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHBhdGgxLmxlbmd0aDsgaSsrKQotCQkJCWlmICghIHBhdGgxW2ldLmVxdWFscyhwYXRoMltpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob3RoZXIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXRoKElUeXBlZEVsZW1lbnQgZWwsIGludCBsZXZlbCkgewotCQlTdHJpbmdbXSBwYXRoPSBudWxsOwotCQlpZiAoZWwgaW5zdGFuY2VvZiBJRGlmZkNvbnRhaW5lcikgewotCQkJSURpZmZDb250YWluZXIgcGFyZW50PSAoKElEaWZmQ29udGFpbmVyKWVsKS5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQlwYXRoPSBnZXRQYXRoKHBhcmVudCwgbGV2ZWwrMSk7Ci0JCX0KLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXBhdGg9IG5ldyBTdHJpbmdbbGV2ZWwrMV07Ci0JCXBhdGhbKHBhdGgubGVuZ3RoLTEpLWxldmVsXT0gZWwuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZUcmVlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzg3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci0KLS8qKgotICogQSB0cmVlIHZpZXdlciB0aGF0IHdvcmtzIG9uIG9iamVjdHMgaW1wbGVtZW50aW5nCi0gKiB0aGUgPGNvZGU+SURpZmZDb250YWluZXI8L2NvZGU+IGFuZCA8Y29kZT5JRGlmZkVsZW1lbnQ8L2NvZGU+IGludGVyZmFjZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZQotICogdGhpcyBwYWNrYWdlLgotICogPC9wPgotICoKLSAqIEBzZWUgSURpZmZDb250YWluZXIKLSAqIEBzZWUgSURpZmZFbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCQotCXN0YXRpYyBjbGFzcyBEaWZmVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkKLQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcHVibGljIGludCBjYXRlZ29yeShPYmplY3Qgbm9kZSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBEaWZmTm9kZSkgewotCQkJCU9iamVjdCBvPSAoKERpZmZOb2RlKSBub2RlKS5nZXRJZCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgRG9jdW1lbnRSYW5nZU5vZGUpCi0JCQkJCXJldHVybiAoKERvY3VtZW50UmFuZ2VOb2RlKSBvKS5nZXRUeXBlQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9CQotCi0JY2xhc3MgRGlmZlZpZXdlckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJCQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaW5wdXRDaGFuZ2VkKERpZmZUcmVlVmlld2VyLnRoaXMsIGdldElucHV0KCksIG51bGwpOwotCQl9Ci0JCQkKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURpZmZFbGVtZW50KSAKLQkJCQlyZXR1cm4gKChJRGlmZkVsZW1lbnQpZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURpZmZDb250YWluZXIpIAotCQkJCXJldHVybiAoKElEaWZmQ29udGFpbmVyKWVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkNvbnRhaW5lcikKLQkJCQlyZXR1cm4gKChJRGlmZkNvbnRhaW5lcillbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQl9CQkJCQotCX0KLQkKLQkvKgotCSAqIFRha2VzIGNhcmUgb2Ygc3dhcHBpbmcgbGVmdCBhbmQgcmlnaHQgaWYgZkxlZnRJc0xvY2FsCi0JICogaXMgdHJ1ZS4KLQkgKi8KLQljbGFzcyBEaWZmVmlld2VyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURpZmZFbGVtZW50KQotCQkJCXJldHVybiAoKElEaWZmRWxlbWVudCllbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJCQkKLQkJCXJldHVybiBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkZWZhdWx0TGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkVsZW1lbnQpIHsKLQkJCQlJRGlmZkVsZW1lbnQgaW5wdXQ9IChJRGlmZkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCi0JCQkJaW50IGtpbmQ9IGlucHV0LmdldEtpbmQoKTsKLQkJCQlpZiAoZkxlZnRJc0xvY2FsKSB7Ci0JCQkJCXN3aXRjaCAoa2luZCAmIERpZmZlcmVuY2VyLkRJUkVDVElPTl9NQVNLKSB7Ci0JCQkJCWNhc2UgRGlmZmVyZW5jZXIuTEVGVDoKLQkJCQkJCWtpbmQ9IChraW5kICZ+IERpZmZlcmVuY2VyLkxFRlQpIHwgRGlmZmVyZW5jZXIuUklHSFQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEaWZmZXJlbmNlci5SSUdIVDoKLQkJCQkJCWtpbmQ9IChraW5kICZ+IERpZmZlcmVuY2VyLlJJR0hUKSB8IERpZmZlcmVuY2VyLkxFRlQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldEltYWdlKGlucHV0LmdldEltYWdlKCksIGtpbmQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRmlsdGVyU2FtZSBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURpZmZFbGVtZW50KQotCQkJCXJldHVybiAoKChJRGlmZkVsZW1lbnQpZWxlbWVudCkuZ2V0S2luZCgpICYgRGlmZmVyZW5jZXIuUFNFVURPX0NPTkZMSUNUKSA9PSAwOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmQnVuZGxlOwotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiBmTGVmdElzTG9jYWw7Ci0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgQWN0aW9uIGZDb3B5TGVmdFRvUmlnaHRBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZkNvcHlSaWdodFRvTGVmdEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBmRW1wdHlNZW51QWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIGZFeHBhbmRBbGxBY3Rpb247Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdmlld2VyIGZvciB0aGUgZ2l2ZW4gU1dUIHRyZWUgY29udHJvbCB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSB0cmVlIHRoZSB0cmVlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRGlmZlRyZWVWaWV3ZXIoVHJlZSB0cmVlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKHRyZWUpOwotCQlpbml0aWFsaXplKGNvbmZpZ3VyYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHZpZXdlciB1bmRlciB0aGUgZ2l2ZW4gU1dUIHBhcmVudCBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgY29udHJvbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZpZXdlcgotCSAqLwotCXB1YmxpYyBEaWZmVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKG5ldyBUcmVlKHBhcmVudCwgU1dULk1VTFRJKSk7Ci0JCWluaXRpYWxpemUoY29uZmlndXJhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCi0JCUNvbnRyb2wgdHJlZT0gZ2V0Q29udHJvbCgpOwotCQkKLQkJSU5hdmlnYXRhYmxlIG5hdj0gbmV3IElOYXZpZ2F0YWJsZSgpIHsKLQkJCXB1YmxpYyBib29sZWFuIGdvdG9EaWZmZXJlbmNlKGJvb2xlYW4gbmV4dCkgewotCQkJCS8vIEZpeCBmb3IgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNgotCQkJCXJldHVybiBpbnRlcm5hbE5hdmlnYXRlKG5leHQsIHRydWUpOwotCQkJfQotCQl9OwotCQl0cmVlLnNldERhdGEoSU5hdmlnYXRhYmxlLk5BVklHQVRPUl9QUk9QRVJUWSwgbmF2KTsKLQkJCi0JCS8vIEZpeCBmb3IgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNgotCQlJT3BlbmFibGUgb3BlbmFibGU9IG5ldyBJT3BlbmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuU2VsZWN0ZWQoKSB7Ci0JCQkJaW50ZXJuYWxPcGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCXRyZWUuc2V0RGF0YShJT3BlbmFibGUuT1BFTkFCTEVfUFJPUEVSVFksIG9wZW5hYmxlKTsKLQkJCi0JCWZMZWZ0SXNMb2NhbD0gVXRpbGl0aWVzLmdldEJvb2xlYW4oY29uZmlndXJhdGlvbiwgIkxFRlRfSVNfTE9DQUwiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cmVlLnNldERhdGEoQ29tcGFyZVVJLkNPTVBBUkVfVklFV0VSX1RJVExFLCBnZXRUaXRsZSgpKTsKLQotCQlDb21wb3NpdGUgcGFyZW50PSB0cmVlLmdldFBhcmVudCgpOwotCQkKLQkJZkJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZUcmVlVmlld2VyUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gd2l0aCB0aGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gY29uZmlndXJhdGlvbjsKLQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJRGlmZlRyZWVWaWV3ZXIudGhpcy5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQkJCQkKLQkKLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEaWZmVmlld2VyQ29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBEaWZmVmlld2VyTGFiZWxQcm92aWRlcigpKTsKLQkJCi0JCWFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlKSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQkJCQkJCQkJCi0JCXNldFNvcnRlcihuZXcgRGlmZlZpZXdlclNvcnRlcigpKTsKLQkJCi0JCVRvb2xCYXJNYW5hZ2VyIHRibT0gQ29tcGFyZVZpZXdlclBhbmUuZ2V0VG9vbEJhck1hbmFnZXIocGFyZW50KTsKLQkJaWYgKHRibSAhPSBudWxsKSB7Ci0JCQl0Ym0ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcigibWVyZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcigibW9kZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcigibmF2aWdhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQljcmVhdGVUb29sSXRlbXModGJtKTsKLQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQkJCQotCQkJdGJtLnVwZGF0ZSh0cnVlKTsKLQkJfQotCQkKLQkJTWVudU1hbmFnZXIgbW09IG5ldyBNZW51TWFuYWdlcigpOwotCQltbS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1tLmFkZE1lbnVMaXN0ZW5lcigKLQkJCW5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbW0yKSB7Ci0JCQkJCWZpbGxDb250ZXh0TWVudShtbTIpOwotCQkJCQlpZiAobW0yLmlzRW1wdHkoKSkgewotCQkJCQkJaWYgKGZFbXB0eU1lbnVBY3Rpb24gPT0gbnVsbCkgewotCQkJCQkJCWZFbXB0eU1lbnVBY3Rpb249IG5ldyBBY3Rpb24oVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZW1wdHlNZW51SXRlbSIpKSB7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJLy8gbGVmdCBlbXB0eQotCQkJCQkJCX07Ci0JCQkJCQkJZkVtcHR5TWVudUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCW1tMi5hZGQoZkVtcHR5TWVudUFjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCXRyZWUuc2V0TWVudShtbS5jcmVhdGVDb250ZXh0TWVudSh0cmVlKSk7Ci0JfQotCQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmlld2VyJ3MgbmFtZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHZpZXdlcidzIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRpdGxlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRpdGxlID09IG51bGwpCi0JCQl0aXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZygiRGlmZlRyZWVWaWV3ZXIudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHZpZXdlcidzIHJlc291cmNlIGJ1bmRsZQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCXJldHVybiBmQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbiBvZiB0aGlzIHZpZXdlci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbiBvZiB0aGlzIHZpZXdlcgotCSAqLwotCXB1YmxpYyBDb21wYXJlQ29uZmlndXJhdGlvbiBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQl9Ci0JCQkKLQkvKioKLQkgKiBDYWxsZWQgb24gdGhlIHZpZXdlciBkaXNwb3NhbC4KLQkgKiBVbnJlZ2lzdGVycyBmcm9tIHRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24uCi0JICogQ2xpZW50cyBtYXkgZXh0ZW5kIGlmIHRoZXkgaGF2ZSB0byBkbyBhZGRpdGlvbmFsIGNsZWFudXAuCi0JICogQHBhcmFtIGV2ZW50IGRpc3Bvc2UgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgY2FsbCB0byB0aGlzIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCWlmIChmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKQotCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gbnVsbDsKLQkJfQotCQlmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbnVsbDsKLQkJCi0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFja3MgcHJvcGVydHkgY2hhbmdlcyBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QuCi0JICogQ2xpZW50cyBtYXkgZXh0ZW5kIHRvIHRyYWNrIHRoZWlyIG93biBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqIEBwYXJhbSBldmVudCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgY2FsbCB0byB0aGlzIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoT2JqZWN0IGluLCBPYmplY3Qgb2xkSW5wdXQpIHsKLQkJc3VwZXIuaW5wdXRDaGFuZ2VkKGluLCBvbGRJbnB1dCk7Ci0JCQotCQlpZiAoaW4gIT0gb2xkSW5wdXQpIHsKLQkJCWluaXRpYWxTZWxlY3Rpb24oKTsKLQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGhvb2sgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiA8Y29kZT5pbnB1dENoYW5nZWQ8L2NvZGU+Ci0JICogYWZ0ZXIgYSBuZXcgaW5wdXQgaGFzIGJlZW4gc2V0IGJ1dCBiZWZvcmUgYW55IGNvbnRyb2xzIGFyZSB1cGRhdGVkLgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5uYXZpZ2F0ZSh0cnVlKTwvY29kZT4KLQkgKiB0byBzZWxlY3QgYW5kIGV4cGFuZCB0aGUgZmlyc3QgbGVhZiBub2RlLgotCSAqIENsaWVudHMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhcmUgZnJlZSB0byBkZWNpZGUgd2hldGhlcgotCSAqIHRoZXkgd2FudCB0byBjYWxsIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsU2VsZWN0aW9uKCkgewotCQluYXZpZ2F0ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGF2b2lkIGV4cGFuZGluZyA8Y29kZT5EaWZmTm9kZTwvY29kZT5zIHRoYXQgc2hvdWxkbid0IGV4cGFuZC4KLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBleHBhbmQKLSAgICAgKiBAcGFyYW0gbGV2ZWwgbm9uLW5lZ2F0aXZlIGxldmVsLCBvciA8Y29kZT5BTExfTEVWRUxTPC9jb2RlPiB0byBjb2xsYXBzZSBhbGwgbGV2ZWxzIG9mIHRoZSB0cmVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxFeHBhbmRUb0xldmVsKFdpZGdldCBub2RlLCBpbnQgbGV2ZWwpIHsKLQkJCQkKLQkJT2JqZWN0IGRhdGE9IG5vZGUuZ2V0RGF0YSgpOwotCQkKLQkJaWYgKGRvbnRFeHBhbmQoZGF0YSkpCi0JCQlyZXR1cm47Ci0JCQotCQlzdXBlci5pbnRlcm5hbEV4cGFuZFRvTGV2ZWwobm9kZSwgbGV2ZWwpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGhvb2sgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiA8Y29kZT5pbnRlcm5hbEV4cGFuZFRvTGV2ZWw8L2NvZGU+Ci0JICogdG8gY29udHJvbCB3aGV0aGVyIGEgZ2l2ZW4gbW9kZWwgbm9kZSBzaG91bGQgYmUgZXhwYW5kZWQgb3Igbm90LgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgb2JqZWN0IGlzIGEgPGNvZGU+RGlmZk5vZGU8L2NvZGU+IGFuZAotCSAqIGNhbGxzIDxjb2RlPmRvbnRFeHBhbmQoKTwvY29kZT4gb24gaXQuCi0JICogQ2xpZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFyZSBmcmVlIHRvIGRlY2lkZSB3aGV0aGVyCi0JICogdGhleSB3YW50IHRvIGNhbGwgdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIG8gdGhlIG1vZGVsIG9iamVjdCB0byBiZSBleHBhbmRlZAotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgbm9kZSBzaG91bGQgYmUgZXhwYW5kZWQsIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByZXZlbnQgZXhwYW5kaW5nCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRvbnRFeHBhbmQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBEaWZmTm9kZSAmJiAoKERpZmZOb2RlKW8pLmRvbnRFeHBhbmQoKTsKLQl9Ci0JCi0JLy8tLS0tIG1lcmdlIGFjdGlvbiBzdXBwb3J0Ci0KLQkvKioKLQkgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgdmlld2VyJ3MgY29udHJvbHMgaGF2ZSBiZWVuIGNyZWF0ZWQuCi0JICogSXQgaW5zdGFsbHMgZm91ciBhY3Rpb25zIGluIHRoZSBnaXZlbiA8Y29kZT5Ub29sQmFyTWFuYWdlcjwvY29kZT4uIFR3byBhY3Rpb25zCi0JICogYWxsb3cgZm9yIGNvcHlpbmcgb25lIHNpZGUgb2YgYSA8Y29kZT5EaWZmTm9kZTwvY29kZT4gdG8gdGhlIG90aGVyIHNpZGUuCi0JICogVHdvIG90aGVyIGFjdGlvbnMgYXJlIGZvciBuYXZpZ2F0aW5nIGZyb20gb25lIG5vZGUgdG8gdGhlIG5leHQgKHByZXZpb3VzKS4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYXJlIGZyZWUgdG8gZGVjaWRlIHdoZXRoZXIgdGhleSB3YW50IHRvIGNhbGwKLQkgKiB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSB0b29sYmFyTWFuYWdlciB0aGUgdG9vbGJhciBtYW5hZ2VyIGZvciB3aGljaCB0byBhZGQgdGhlIGFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sSXRlbXMoVG9vbEJhck1hbmFnZXIgdG9vbGJhck1hbmFnZXIpIHsKLQkJCi0vLwkJZkNvcHlMZWZ0VG9SaWdodEFjdGlvbj0gbmV3IEFjdGlvbigpIHsKLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJY29weVNlbGVjdGVkKHRydWUpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihmQ29weUxlZnRUb1JpZ2h0QWN0aW9uLCBmQnVuZGxlLCAiYWN0aW9uLlRha2VMZWZ0LiIpOwotLy8JCXRvb2xiYXJNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm1lcmdlIiwgZkNvcHlMZWZ0VG9SaWdodEFjdGlvbik7Ci0KLS8vCQlmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uPSBuZXcgQWN0aW9uKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQljb3B5U2VsZWN0ZWQoZmFsc2UpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uLCBmQnVuZGxlLCAiYWN0aW9uLlRha2VSaWdodC4iKTsKLS8vCQl0b29sYmFyTWFuYWdlci5hcHBlbmRUb0dyb3VwKCJtZXJnZSIsIGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24pOwotCQkKLS8vCQlmTmV4dEFjdGlvbj0gbmV3IEFjdGlvbigpIHsKLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJbmF2aWdhdGUodHJ1ZSk7Ci0vLwkJCX0KLS8vCQl9OwotLy8JCVV0aWxpdGllcy5pbml0QWN0aW9uKGZOZXh0QWN0aW9uLCBmQnVuZGxlLCAiYWN0aW9uLk5leHREaWZmLiIpOyAvLyROT04tTkxTLTEkCi0vLwkJdG9vbGJhck1hbmFnZXIuYXBwZW5kVG9Hcm91cCgibmF2aWdhdGlvbiIsIGZOZXh0QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0vLwkJZlByZXZpb3VzQWN0aW9uPSBuZXcgQWN0aW9uKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQluYXZpZ2F0ZShmYWxzZSk7Ci0vLwkJCX0KLS8vCQl9OwotLy8JCVV0aWxpdGllcy5pbml0QWN0aW9uKGZQcmV2aW91c0FjdGlvbiwgZkJ1bmRsZSwgImFjdGlvbi5QcmV2RGlmZi4iKTsgLy8kTk9OLU5MUy0xJAotLy8JCXRvb2xiYXJNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm5hdmlnYXRpb24iLCBmUHJldmlvdXNBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBhZGQgYWN0aW9ucyB0byB0aGUgdmlld2VyJ3MgY29udGV4dCBtZW51LgotCSAqIEl0IGluc3RhbGxzIGFjdGlvbnMgZm9yIGV4cGFuZGluZyB0cmVlIG5vZGVzLCBjb3B5aW5nIG9uZSBzaWRlIG9mIGEgPGNvZGU+RGlmZk5vZGU8L2NvZGU+IHRvIHRoZSBvdGhlciBzaWRlLgotCSAqIENsaWVudHMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhcmUgZnJlZSB0byBkZWNpZGUgd2hldGhlciB0aGV5IHdhbnQgdG8gY2FsbAotCSAqIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIG1hbmFnZXIgdGhlIG1lbnUgbWFuYWdlciBmb3Igd2hpY2ggdG8gYWRkIHRoZSBhY3Rpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChmRXhwYW5kQWxsQWN0aW9uID09IG51bGwpIHsKLQkJCWZFeHBhbmRBbGxBY3Rpb249IG5ldyBBY3Rpb24oKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlleHBhbmRTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oZkV4cGFuZEFsbEFjdGlvbiwgZkJ1bmRsZSwgImFjdGlvbi5FeHBhbmRBbGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJYm9vbGVhbiBlbmFibGU9IGZhbHNlOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgZWxlbWVudHM9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50PSBlbGVtZW50cy5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkNvbnRhaW5lcikgewotCQkJCQlpZiAoKChJRGlmZkNvbnRhaW5lcillbGVtZW50KS5oYXNDaGlsZHJlbigpKSB7Ci0JCQkJCQllbmFibGU9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmRXhwYW5kQWxsQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQotCQltYW5hZ2VyLmFkZChmRXhwYW5kQWxsQWN0aW9uKTsKLQkJCi0JCWlmIChmQ29weUxlZnRUb1JpZ2h0QWN0aW9uICE9IG51bGwpCi0JCQltYW5hZ2VyLmFkZChmQ29weUxlZnRUb1JpZ2h0QWN0aW9uKTsKLQkJaWYgKGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24gIT0gbnVsbCkKLQkJCW1hbmFnZXIuYWRkKGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEV4cGFuZHMgdG8gaW5maW5pdHkgYWxsIGl0ZW1zIGluIHRoZSBzZWxlY3Rpb24uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGFuZFNlbGVjdGlvbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbmV4dD0gZWxlbWVudHMubmV4dCgpOwotCQkJCWV4cGFuZFRvTGV2ZWwobmV4dCwgQUxMX0xFVkVMUyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgb25lIHNpZGUgb2YgYWxsIDxjb2RlPkRpZmZOb2RlPC9jb2RlPnMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBvdGhlciBzaWRlLgotCSAqIENhbGxlZCBmcm9tIHRoZSAoaW50ZXJuYWwpIGFjdGlvbnMgZm9yIGNvcHlpbmcgdGhlIHNpZGVzIG9mIGEgPGNvZGU+RGlmZk5vZGU8L2NvZGU+LgotCSAqIENsaWVudHMgbWF5IG92ZXJyaWRlLiAKLQkgKiAKLQkgKiBAcGFyYW0gbGVmdFRvUmlnaHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGxlZnQgc2lkZSBpcyBjb3BpZWQgdG8gdGhlIHJpZ2h0IHNpZGUuCi0JICogSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSByaWdodCBzaWRlIGlzIGNvcGllZCB0byB0aGUgbGVmdCBzaWRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVNlbGVjdGVkKGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUl0ZXJhdG9yIGU9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50PSBlLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCWNvcHlPbmUoKElDb21wYXJlSW5wdXQpIGVsZW1lbnQsIGxlZnRUb1JpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgdG8gY29weSBvbmUgc2lkZSBvZiB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgb3RoZXIuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlbGVnYXRlcyB0aGUgY2FsbCB0byA8Y29kZT5JQ29tcGFyZUlucHV0LmNvcHkoLi4uKTwvY29kZT4uCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUuIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGNvcHkKLQkgKiBAcGFyYW0gbGVmdFRvUmlnaHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGxlZnQgc2lkZSBpcyBjb3BpZWQgdG8gdGhlIHJpZ2h0IHNpZGUuCi0JICogSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSByaWdodCBzaWRlIGlzIGNvcGllZCB0byB0aGUgbGVmdCBzaWRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weU9uZShJQ29tcGFyZUlucHV0IG5vZGUsIGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJCi0JCW5vZGUuY29weShsZWZ0VG9SaWdodCk7Ci0JCQotCQkvLyB1cGRhdGUgbm9kZSdzIGltYWdlCi0JCXVwZGF0ZShuZXcgT2JqZWN0W10geyBub2RlIH0sIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBuZXh0IChvciBwcmV2aW91cykgbm9kZSBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICogSWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZWxlY3Rpb24gdGhlIGZpcnN0IChsYXN0KSBub2RlIGluIHRoZSB0cmVlIGlzIHNlbGVjdGVkLgotCSAqIFdyYXBzIGFyb3VuZCBhdCBlbmQgb3IgYmVnaW5uaW5nLgotCSAqIENsaWVudHMgbWF5IG92ZXJyaWRlLiAKLQkgKgotCSAqIEBwYXJhbSBuZXh0IGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBuZXh0IG5vZGUgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSB0aGUgcHJldmlvdXMgbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5hdmlnYXRlKGJvb2xlYW4gbmV4dCkgewkKLQkJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCWludGVybmFsTmF2aWdhdGUobmV4dCwgZmFsc2UpOwotCX0KLQkKLQkvLy0tLS0gcHJpdmF0ZQotCQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIG5leHQgKG9yIHByZXZpb3VzKSBub2RlIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlbGVjdGlvbiB0aGUgZmlyc3QgKGxhc3QpIG5vZGUgaW4gdGhlIHRyZWUgaXMgc2VsZWN0ZWQuCi0JICogV3JhcHMgYXJvdW5kIGF0IGVuZCBvciBiZWdpbm5pbmcuCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUuIAotCSAqCi0JICogQHBhcmFtIG5leHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG5leHQgbm9kZSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIHRoZSBwcmV2aW91cyBub2RlCi0JICogQHBhcmFtIGZpcmVPcGVuIGlmIDxjb2RlPnRydWU8L2NvZGU+IGFuIG9wZW4gZXZlbnQgaXMgZmlyZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBlbmQgKG9yIGJlZ2lubmluZykKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxOYXZpZ2F0ZShib29sZWFuIG5leHQsIGJvb2xlYW4gZmlyZU9wZW4pIHsKLQkJCi0JCUNvbnRyb2wgYz0gZ2V0Q29udHJvbCgpOwotCQlpZiAoIShjIGluc3RhbmNlb2YgVHJlZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJVHJlZSB0cmVlPSAoVHJlZSkgYzsKLQkJVHJlZUl0ZW0gaXRlbT0gbnVsbDsKLQkJVHJlZUl0ZW0gY2hpbGRyZW5bXT0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKLQkJCWl0ZW09IGNoaWxkcmVuWzBdOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbj0gdHJlZS5nZXRJdGVtcygpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCWl0ZW09IGNoaWxkcmVuWzBdOwotCQkJCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXRJdGVtQ291bnQoKSA8PSAwKSB7Ci0JCQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGl0ZW0sIGZpcmVPcGVuKTsJCQkJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaXRlbT0gZmluZE5leHRQcmV2KGl0ZW0sIG5leHQpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCWlmIChpdGVtLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWludGVybmFsU2V0U2VsZWN0aW9uKGl0ZW0sIGZpcmVPcGVuKTsJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlbSBmaW5kTmV4dFByZXYoVHJlZUl0ZW0gaXRlbSwgYm9vbGVhbiBuZXh0KSB7Ci0JCQotCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlUcmVlSXRlbSBjaGlsZHJlbltdPSBudWxsOwotCi0JCWlmICghbmV4dCkgewotCQkKLQkJCVRyZWVJdGVtIHBhcmVudD0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJY2hpbGRyZW49IHBhcmVudC5nZXRJdGVtcygpOwotCQkJZWxzZQotCQkJCWNoaWxkcmVuPSBpdGVtLmdldFBhcmVudCgpLmdldEl0ZW1zKCk7Ci0JCQkKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkvLyBnb3RvIHByZXZpb3VzIGNoaWxkCi0JCQkJaW50IGluZGV4PSAwOwotCQkJCWZvciAoOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykKLQkJCQkJaWYgKGNoaWxkcmVuW2luZGV4XSA9PSBpdGVtKQotCQkJCQkJYnJlYWs7Ci0JCQkJCi0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQkKLQkJCQkJaXRlbT0gY2hpbGRyZW5baW5kZXgtMV07Ci0JCQkJCQotCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJY3JlYXRlQ2hpbGRyZW4oaXRlbSk7Ci0JCQkJCQlpbnQgbj0gaXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJCQkJCWlmIChuIDw9IDApCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQkJCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQkJCQkJaXRlbT0gaXRlbS5nZXRJdGVtcygpW24tMV07Ci0JCQkJCX0KLQotCQkJCQkvLyBwcmV2aW91cwotCQkJCQlyZXR1cm4gaXRlbTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGdvIHVwCi0JCQlpdGVtPSBwYXJlbnQ7Ci0JCQkJCQotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWNyZWF0ZUNoaWxkcmVuKGl0ZW0pOwotCQkJCi0JCQlpZiAoaXRlbS5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCQkvLyBoYXMgY2hpbGRyZW46IGdvIGRvd24KLQkJCQljaGlsZHJlbj0gaXRlbS5nZXRJdGVtcygpOwotCQkJCXJldHVybiBjaGlsZHJlblswXTsKLQkJCX0KLQkJCQotCQkJd2hpbGUgKGl0ZW0gIT0gbnVsbCkgewotCQkJCWNoaWxkcmVuPSBudWxsOwotCQkJCVRyZWVJdGVtIHBhcmVudD0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCQljaGlsZHJlbj0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQkJZWxzZQotCQkJCQljaGlsZHJlbj0gaXRlbS5nZXRQYXJlbnQoKS5nZXRJdGVtcygpOwotCQkJCQotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJLy8gZ290byBuZXh0IGNoaWxkCi0JCQkJCWludCBpbmRleD0gMDsKLQkJCQkJZm9yICg7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKQotCQkJCQkJaWYgKGNoaWxkcmVuW2luZGV4XSA9PSBpdGVtKQotCQkJCQkJCWJyZWFrOwotCQkJCQkKLQkJCQkJaWYgKGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoLTEpIHsKLQkJCQkJCS8vIG5leHQKLQkJCQkJCXJldHVybiBjaGlsZHJlbltpbmRleCsxXTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBnbyB1cAotCQkJCWl0ZW09IHBhcmVudDsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0U2VsZWN0aW9uKFRyZWVJdGVtIHRpLCBib29sZWFuIGZpcmVPcGVuKSB7Ci0JCWlmICh0aSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZGF0YT0gdGkuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCS8vIEZpeCBmb3IgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNgotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkYXRhKTsKLQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJCQlJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb249IGdldFNlbGVjdGlvbigpOwotCQkJCWlmIChmaXJlT3BlbiAmJiBjdXJyZW50U2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmVxdWFscyhjdXJyZW50U2VsZWN0aW9uKSkgewotCQkJCQlmaXJlT3BlbihuZXcgT3BlbkV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkJCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VkaXRhYmxlKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGxlZnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlJQ29tcGFyZUlucHV0IGRpZmY9IChJQ29tcGFyZUlucHV0KSBlbGVtZW50OwotCQkJT2JqZWN0IHNpZGU9IGxlZnQgPyBkaWZmLmdldExlZnQoKSA6IGRpZmYuZ2V0UmlnaHQoKTsKLQkJCWlmIChzaWRlID09IG51bGwgJiYgZGlmZiBpbnN0YW5jZW9mIElEaWZmRWxlbWVudCkgewotCQkJCUlEaWZmQ29udGFpbmVyIGNvbnRhaW5lcj0gKChJRGlmZkVsZW1lbnQpZGlmZikuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCQkJSUNvbXBhcmVJbnB1dCBwYXJlbnQ9IChJQ29tcGFyZUlucHV0KSBjb250YWluZXI7Ci0JCQkJCXNpZGU9IGxlZnQgPyBwYXJlbnQuZ2V0TGVmdCgpIDogcGFyZW50LmdldFJpZ2h0KCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNpZGUgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50KQotCQkJCXJldHVybiAoKElFZGl0YWJsZUNvbnRlbnQpIHNpZGUpLmlzRWRpdGFibGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQWN0aW9ucygpIHsKLQkJaW50IGxlZnRUb1JpZ2h0PSAwOwotCQlpbnQgcmlnaHRUb0xlZnQ9IDA7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJdGVyYXRvciBlPSBzcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQ9IGUubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJCQlpZiAoaXNFZGl0YWJsZShlbGVtZW50LCBmYWxzZSkpCi0JCQkJCQlsZWZ0VG9SaWdodCsrOwotCQkJCQlpZiAoaXNFZGl0YWJsZShlbGVtZW50LCB0cnVlKSkKLQkJCQkJCXJpZ2h0VG9MZWZ0Kys7Ci0JCQkJCWlmIChsZWZ0VG9SaWdodCA+IDAgJiYgcmlnaHRUb0xlZnQgPiAwKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZFeHBhbmRBbGxBY3Rpb24gIT0gbnVsbCkKLQkJCQlmRXhwYW5kQWxsQWN0aW9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCX0KLQkJaWYgKGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24gIT0gbnVsbCkKLQkJCWZDb3B5TGVmdFRvUmlnaHRBY3Rpb24uc2V0RW5hYmxlZChsZWZ0VG9SaWdodCA+IDApOwotCQlpZiAoZkNvcHlSaWdodFRvTGVmdEFjdGlvbiAhPSBudWxsKQotCQkJZkNvcHlSaWdodFRvTGVmdEFjdGlvbi5zZXRFbmFibGVkKHJpZ2h0VG9MZWZ0ID4gMCk7Ci0JfQotCQotCS8qCi0JICogRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JICovIAotCXByaXZhdGUgdm9pZCBpbnRlcm5hbE9wZW4oKSAgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJZmlyZU9wZW4obmV3IE9wZW5FdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmVHJlZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmVHJlZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDEyNjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZlRyZWVWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBAKCMpRGlmZlRyZWVWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcwotIwotIyBSZXNvdXJjZSBzdHJpbmdzIGZvciBEaWZmVHJlZVZpZXdlci5qYXZhCi0KLXRpdGxlPSBTdHJ1Y3R1cmUgQ29tcGFyZQotZGVmYXVsdExhYmVsPSA8bm8gbmFtZT4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRHVtbXkgbWVudSBpdGVtIGZvciBlbXB0eSBjb250ZXh0IG1lbnUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWVtcHR5TWVudUl0ZW09IDxFbXB0eSBNZW51PgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBY3Rpb25zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1hY3Rpb24uU21hcnQubGFiZWw9U21hcnQKLWFjdGlvbi5TbWFydC50b29sdGlwPUd1ZXNzIFNpbWlsYXIgRWxlbWVudHMKLWFjdGlvbi5TbWFydC5pbWFnZT1zbWFydG1vZGVfY28uZ2lmCi0KLWFjdGlvbi5FeHBhbmRBbGwubGFiZWw9RXhwYW5kIEFsbAotYWN0aW9uLkV4cGFuZEFsbC50b29sdGlwPUV4cGFuZCBBbGwgTm9kZXMKLQotYWN0aW9uLkNvbXBhcmVDb250ZW50cy5sYWJlbD0gU2hvdyBDb250ZW50IENvbXBhcmlzb24KLWFjdGlvbi5Db21wYXJlQ29udGVudHMudG9vbHRpcD0gU2hvdyBDb250ZW50IENvbXBhcmlzb24KLQotYWN0aW9uLk5leHREaWZmLmxhYmVsPU5leHQKLWFjdGlvbi5OZXh0RGlmZi50b29sdGlwPVNlbGVjdCBOZXh0IENoYW5nZQotYWN0aW9uLk5leHREaWZmLmltYWdlPW5leHRfbmF2LmdpZgotCi1hY3Rpb24uUHJldkRpZmYubGFiZWw9UHJldmlvdXMKLWFjdGlvbi5QcmV2RGlmZi50b29sdGlwPVNlbGVjdCBQcmV2aW91cyBDaGFuZ2UKLWFjdGlvbi5QcmV2RGlmZi5pbWFnZT1wcmV2X25hdi5naWYKLQotYWN0aW9uLlRha2VMZWZ0LmxhYmVsPUNvcHkgTGVmdCB0byBSaWdodAotYWN0aW9uLlRha2VMZWZ0LnRvb2x0aXA9Q29weSBTZWxlY3RlZCBOb2RlcyBmcm9tIExlZnQgdG8gUmlnaHQKLWFjdGlvbi5UYWtlTGVmdC5pbWFnZT1jb3B5Y29udF9yX2NvLmdpZgotCi1hY3Rpb24uVGFrZVJpZ2h0LmxhYmVsPUNvcHkgUmlnaHQgdG8gTGVmdAotYWN0aW9uLlRha2VSaWdodC50b29sdGlwPUNvcHkgU2VsZWN0ZWQgTm9kZXMgZnJvbSBSaWdodCB0byBMZWZ0Ci1hY3Rpb24uVGFrZVJpZ2h0LmltYWdlPWNvcHljb250X2xfY28uZ2lmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZlcmVuY2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZlcmVuY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODVlNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmZXJlbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBIGdlbmVyaWMgdHdvLXdheSBvciB0aHJlZS13YXkgZGlmZmVyZW5jaW5nIGVuZ2luZS4KLSAqIDxwPgotICogVGhlIGVuZ2luZSBpcyB1c2VkIGJ5IGNhbGxpbmcgb25lIG9mIHRoZSA8Y29kZT5maW5kRGlmZmVyZW5jZXM8L2NvZGU+IG1ldGhvZHMgYW5kIHBhc3NpbmcKLSAqIGluIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuCi0gKiBUaGUgZW5naW5lIGNhbGxzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiB0aGUgaW5wdXQgb2JqZWN0cyB0byBwZXJmb3JtIHRoZSBjb21wYXJlOgotICogPFVMPgotICogPExJPjxjb2RlPmdldENoaWxkcmVuPC9jb2RlPjogZm9yIGVudW1lcmF0aW5nIHRoZSBjaGlsZHJlbiBvZiBhbiBvYmplY3QgKGlmIGFueSksCi0gKiA8TEk+PGNvZGU+Y29udGVudHNFcXVhbDwvY29kZT46IGZvciBjb21wYXJpbmcgdGhlIGNvbnRlbnQgb2YgbGVhZiBvYmplY3RzLCB0aGF0IGlzLCBvYmplY3RzIHdpdGhvdXQgY2hpbGRyZW4sCi0gKiA8TEk+PGNvZGU+dmlzaXQ8L2NvZGU+OiBmb3IgZXZlcnkgcGFpciBvZiBjb21wYXJlZCBvYmplY3QgdGhlIGNvbXBhcmUgcmVzdWx0IGlzIHBhc3NlZCBpbi4KLSAqIDwvVUw+Ci0gKiBDbGllbnRzIG1heSB1c2UgYXMgaXMsIG9yIHN1YmNsYXNzIHRvIHByb3ZpZGUgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIHRoZSB0aHJlZSBob29rcy4gCi0gKiBIb3dldmVyIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFscmVhZHkgZGVhbHMgd2l0aCB0aGUgdHlwaWNhbCBjYXNlOgotICogPFVMPgotICogPExJPjxjb2RlPmdldENoaWxkcmVuPC9jb2RlPjogdHJpZXMgdG8gYXBwbHkgdGhlIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPgotICogCWludGVyZmFjZSB0byBlbnVtZXJhdGUgdGhlIGNoaWxkcmVuLAotICogPExJPjxjb2RlPmNvbnRlbnRzRXF1YWw8L2NvZGU+OiB0cmllcyB0byBhcHBseSB0aGUgPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4gaW50ZXJmYWNlCi0gKgl0byBwZXJmb3JtIGEgYnl0ZS13aXNlIGNvbnRlbnQgY29tcGFyaXNvbiwKLSAqIDxMST48Y29kZT52aXNpdDwvY29kZT46IGNyZWF0ZXMgYSA8Y29kZT5EaWZmTm9kZTwvY29kZT4gZm9yIGFueSBkZXRlY3RlZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXBhcmVkIG9iamVjdHMgYW5kCi0gKglsaW5rcyBpdCB1bmRlciBhIHBhcmVudCBub2RlIGVmZmVjdGl2ZWx5IGNyZWF0aW5nIGEgdHJlZSBvZiBkaWZmZXJlbmNlcy4KLSAqIDwvVUw+Ci0gKiBUaGUgZGlmZmVyZW50IGtpbmQgb2YgY2hhbmdlcyBkZXRlY3RlZCBieSB0aGUgZW5naW5lIGFyZSBkZWNvZGVkIGFzIGZvbGxvd3M6Ci0gKiBJbiB0aGUgdHdvLXdheSBjYXNlIG9ubHkgTk9fQ0hBTkdFLCBBRERJVElPTiwgREVMRVRJT04sIGFuZCBDSEFOR0UgYXJlIHVzZWQuCi0gKiBJbiB0aGUgdGhyZWUtd2F5IGNhc2UgdGhlc2UgY29uc3RhbnRzIGFyZSBiaXR3aXNlIE9SZWQgd2l0aCBvbmUgb2YgZGlyZWN0aW9uYWwgY29uc3RhbnRzCi0gKiBMRUZULCBSSUdIVCwgYW5kIENPTkZMSUNUSU5HLgotICovCi1wdWJsaWMgY2xhc3MgRGlmZmVyZW5jZXIgewotCQotCS8vIFRoZSBraW5kIG9mIGRpZmZlcmVuY2VzLgotCS8qKgotCSAqIERpZmZlcmVuY2UgY29uc3RhbnQgKHZhbHVlIDApIGluZGljYXRpbmcgbm8gZGlmZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19DSEFOR0U9IDA7Ci0JLyoqCi0JICogRGlmZmVyZW5jZSBjb25zdGFudCAodmFsdWUgMSkgaW5kaWNhdGluZyBvbmUgc2lkZSB3YXMgYWRkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURESVRJT049IDE7Ci0JLyoqCi0JICogRGlmZmVyZW5jZSBjb25zdGFudCAodmFsdWUgMikgaW5kaWNhdGluZyBvbmUgc2lkZSB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVElPTj0gMjsKLQkvKioKLQkgKiBEaWZmZXJlbmNlIGNvbnN0YW50ICh2YWx1ZSAzKSBpbmRpY2F0aW5nIHNpZGUgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0U9IDM7Ci0KLQkvKioKLQkgKiBCaXQgbWFzayAodmFsdWUgMykgZm9yIGV4dHJhY3RpbmcgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfVFlQRV9NQVNLPSAzOwotCi0JLy8gVGhlIGRpcmVjdGlvbiBvZiBhIHRocmVlLXdheSBjaGFuZ2UuCi0JLyoqCi0JICogVGhyZWUtd2F5IGNoYW5nZSBjb25zdGFudCAodmFsdWUgNCkgaW5kaWNhdGluZyBhIGNoYW5nZSBvbiBsZWZ0IHNpZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVD0gNDsKLQkKLQkvKioKLQkgKiBUaHJlZS13YXkgY2hhbmdlIGNvbnN0YW50ICh2YWx1ZSA4KSBpbmRpY2F0aW5nIGEgY2hhbmdlIG9uIHJpZ2h0IHNpZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFQ9IDg7Ci0JCi0JLyoqCi0JICogVGhyZWUtd2F5IGNoYW5nZSBjb25zdGFudCAodmFsdWUgMTIpIGluZGljYXRpbmcgYSBjaGFuZ2Ugb24gbGVmdCBhbmQKLQkgKiByaWdodCBzaWRlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GTElDVElORz0gMTI7Ci0KLQkvKioKLQkgKiBCaXQgbWFzayAodmFsdWUgMTIpIGZvciBleHRyYWN0aW5nIHRoZSBkaXJlY3Rpb24gb2YgYSB0aHJlZS13YXkgY2hhbmdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9NQVNLPSAxMjsKLQotCS8qKgotCSAqIENvbnN0YW50ICh2YWx1ZSAxNikgaW5kaWNhdGluZyBhIGNoYW5nZSBvbiBsZWZ0IGFuZCAKLQkgKiByaWdodCBzaWRlICh3aXRoIHJlc3BlY3QgdG8gYW5jZXN0b3IpIGJ1dCBsZWZ0IGFuZCByaWdodCBhcmUgaWRlbnRpY2FsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBTRVVET19DT05GTElDVD0gMTY7Ci0KLQkKLQlzdGF0aWMgY2xhc3MgTm9kZSB7Ci0JCUxpc3QgZkNoaWxkcmVuOwotCQlpbnQgZkNvZGU7Ci0JCU9iamVjdCBmQW5jZXN0b3I7Ci0JCU9iamVjdCBmTGVmdDsKLQkJT2JqZWN0IGZSaWdodDsKLQkJCi0JCU5vZGUoKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQkJTm9kZShOb2RlIHBhcmVudCwgT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQlwYXJlbnQuYWRkKHRoaXMpOwotCQkJZkFuY2VzdG9yPSBhbmNlc3RvcjsKLQkJCWZMZWZ0PSBsZWZ0OwotCQkJZlJpZ2h0PSByaWdodDsKLQkJfQotCQl2b2lkIGFkZChOb2RlIGNoaWxkKSB7Ci0JCQlpZiAoZkNoaWxkcmVuID09IG51bGwpCi0JCQkJZkNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfQotCQlPYmplY3QgdmlzaXQoRGlmZmVyZW5jZXIgZCwgT2JqZWN0IHBhcmVudCwgaW50IGxldmVsKSB7Ci0JCQlpZiAoZkNvZGUgPT0gTk9fQ0hBTkdFKQotCQkJCXJldHVybiBudWxsOwotCQkJLy9kdW1wKGxldmVsKTsKLQkJCU9iamVjdCBkYXRhPSBkLnZpc2l0KHBhcmVudCwgZkNvZGUsIGZBbmNlc3RvciwgZkxlZnQsIGZSaWdodCk7Ci0JCQlpZiAoZkNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpPSBmQ2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJTm9kZSBuPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQkJCW4udmlzaXQoZCwgZGF0YSwgbGV2ZWwrMSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRhdGE7Ci0JCX0KLS8vCQlwcml2YXRlIHZvaWQgZHVtcChpbnQgbGV2ZWwpIHsKLS8vCQkJU3RyaW5nIG5hbWU9IG51bGw7Ci0vLwkJCWlmIChmQW5jZXN0b3IgaW5zdGFuY2VvZiBJVHlwZWRFbGVtZW50KQotLy8JCQkJbmFtZT0gKChJVHlwZWRFbGVtZW50KWZBbmNlc3RvcikuZ2V0TmFtZSgpOwotLy8JCQlpZiAobmFtZSA9PSBudWxsICYmIGZMZWZ0IGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkKLS8vCQkJCW5hbWU9ICgoSVR5cGVkRWxlbWVudClmTGVmdCkuZ2V0TmFtZSgpOwotLy8JCQlpZiAobmFtZSA9PSBudWxsICYmIGZSaWdodCBpbnN0YW5jZW9mIElUeXBlZEVsZW1lbnQpCi0vLwkJCQluYW1lPSAoKElUeXBlZEVsZW1lbnQpZlJpZ2h0KS5nZXROYW1lKCk7Ci0vLwkJCWlmIChuYW1lID09IG51bGwpCi0vLwkJCQluYW1lPSAiPz8/IjsgLy8kTk9OLU5MUy0xJAotLy8JCQkKLS8vCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxldmVsOyBpKyspCi0vLwkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0RGlmZlR5cGUoZkNvZGUpICsgbmFtZSk7Ci0vLwkJfQotCi0vLwkJcHJpdmF0ZSBTdHJpbmcgZ2V0RGlmZlR5cGUoaW50IGNvZGUpIHsKLS8vCQkJU3RyaW5nIGRpcj0gIiAiOyAvLyROT04tTkxTLTEkCi0vLwkJCXN3aXRjaCAoY29kZSAmIERJUkVDVElPTl9NQVNLKSB7Ci0vLwkJCWNhc2UgTEVGVDoKLS8vCQkJCWRpcj0gIj4iOyAvLyROT04tTkxTLTEkCi0vLwkJCQlicmVhazsKLS8vCQkJY2FzZSBSSUdIVDoKLS8vCQkJCWRpcj0gIjwiOyAvLyROT04tTkxTLTEkCi0vLwkJCQlicmVhazsKLS8vCQkJY2FzZSBDT05GTElDVElORzoKLS8vCQkJCWRpcj0gIiEiOyAvLyROT04tTkxTLTEkCi0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQlTdHJpbmcgY2hhbmdlPSAiPSI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJc3dpdGNoIChjb2RlICYgQ0hBTkdFX1RZUEVfTUFTSykgewotLy8JCQljYXNlIEFERElUSU9OOgotLy8JCQkJY2hhbmdlPSAiKyI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIERFTEVUSU9OOgotLy8JCQkJY2hhbmdlPSAiLSI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIENIQU5HRToKLS8vCQkJCWNoYW5nZT0gIiMiOyAvLyROT04tTkxTLTEkCi0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQlyZXR1cm4gZGlyICsgY2hhbmdlICsgIiAiOyAvLyROT04tTkxTLTEkCi0vLwkJfQotCX0gCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkaWZmZXJlbmNpbmcgZW5naW5lLgotCSAqLwotCXB1YmxpYyBEaWZmZXJlbmNlcigpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQkvKioKLQkgKiBTdGFydHMgdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUgb24gdGhlIHRocmVlIGlucHV0IG9iamVjdHMuIElmIHRocmVlV2F5IGlzIDxjb2RlPnRydWU8L2NvZGU+IGEgCi0JICogdGhyZWUtd2F5IGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkLCBvdGhlcndpc2UgYSB0d28td2F5IGNvbXBhcmUgKGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgYW5jZXN0b3IgYXJndW1lbnQgaXMgaWdub3JlZCkuCi0JICogVGhlIHByb2dyZXNzIG1vbml0b3IgaXMgcGFzc2VkIHRvIHRoZSBtZXRob2QgPGNvZGU+dXBkYXRlUHJvZ3Jlc3M8L2NvZGU+IHdoaWNoIGlzIGNhbGxlZCBmb3IgZXZlcnkgbm9kZSBvcgotCSAqIGxlYWYgY29tcGFyZS4gVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgdG9wLW1vc3QgY2FsbCB0byBtZXRob2QgPGNvZGU+dmlzaXQ8L2NvZGU+LgotCSAqIEF0IG1vc3QgdHdvIG9mIHRoZSBhbmNlc3RvciwgbGVmdCwgYW5kIHJpZ2h0IHBhcmFtZXRlcnMgYXJlIGFsbG93ZWQgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gdGhyZWVXYXkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gYSB0aHJlZS13YXkgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQsIG90aGVyd2lzZSBhIHR3by13YXkgY29tcGFyZQotCSAqIEBwYXJhbSBwbSBhIHByb2dyZXNzIG1vbml0b3Igd2hpY2ggaXMgcGFzc2VkIHRvIG1ldGhvZCA8Y29kZT51cGRhdGVQcm9ncmVzczwvY29kZT4KLQkgKiBAcGFyYW0gZGF0YSBhIGNsaWVudCBkYXRhIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB0b3AtbGV2ZWwgY2FsbCB0byA8Y29kZT52aXNpdDwvY29kZT4KLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGFuY2VzdG9yIG9iamVjdCBvZiB0aGUgY29tcGFyZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IG9iamVjdCBvZiB0aGUgY29tcGFyZSAKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IG9iamVjdCBvZiB0aGUgY29tcGFyZQotCSAqIEByZXR1cm4gdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSB0b3AgbW9zdCBjYWxsIHRvIG1ldGhvZCA8Y29kZT52aXNpdDwvY29kZT4sCi0JICogICBwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZmluZERpZmZlcmVuY2VzKGJvb2xlYW4gdGhyZWVXYXksIElQcm9ncmVzc01vbml0b3IgcG0sIE9iamVjdCBkYXRhLCBPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCi0JCU5vZGUgcm9vdD0gbmV3IE5vZGUoKTsKLQkJCi0JCWludCBjb2RlPSB0cmF2ZXJzZSh0aHJlZVdheSwgcm9vdCwgcG0sIHRocmVlV2F5ID8gYW5jZXN0b3IgOiBudWxsLCBsZWZ0LCByaWdodCk7Ci0JCQkJCi0JCWlmIChjb2RlICE9IE5PX0NIQU5HRSkgewotCQkJTGlzdCBsPSByb290LmZDaGlsZHJlbjsKLQkJCWlmIChsLnNpemUoKSA+IDApIHsKLQkJCQlOb2RlIGZpcnN0PSAoTm9kZSlsLmdldCgwKTsKLQkJCQlyZXR1cm4gZmlyc3QudmlzaXQodGhpcywgZGF0YSwgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogVHJhdmVyc2UgdHJlZSBpbiBwb3N0b3JkZXIuCi0JICovCi0JcHJpdmF0ZSBpbnQgdHJhdmVyc2UoYm9vbGVhbiB0aHJlZVdheSwgTm9kZSBwYXJlbnQsIElQcm9ncmVzc01vbml0b3IgcG0sIE9iamVjdCBhbmNlc3RvciwgT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQkJCQotCQlPYmplY3RbXSBhbmNlc3RvckNoaWxkcmVuPSBnZXRDaGlsZHJlbihhbmNlc3Rvcik7Ci0JCU9iamVjdFtdIHJpZ2h0Q2hpbGRyZW49IGdldENoaWxkcmVuKHJpZ2h0KTsKLQkJT2JqZWN0W10gbGVmdENoaWxkcmVuPSBnZXRDaGlsZHJlbihsZWZ0KTsKLQkJCi0JCWludCBjb2RlPSBOT19DSEFOR0U7Ci0JCQotCQlOb2RlIG5vZGU9IG5ldyBOb2RlKHBhcmVudCwgYW5jZXN0b3IsIGxlZnQsIHJpZ2h0KTsKLQkJCQotCQlib29sZWFuIGNvbnRlbnQ9IHRydWU7CS8vIHdlIHJlc2V0IHRoaXMgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2hpbGQKLQkJCi0JCWlmICgoKHRocmVlV2F5ICYmIGFuY2VzdG9yQ2hpbGRyZW4gIT0gbnVsbCkgfHwgIXRocmVlV2F5KQotCQkJCQkgJiYgcmlnaHRDaGlsZHJlbiAhPSBudWxsICYmIGxlZnRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkvLyB3ZSBvbmx5IHJlY3Vyc2UgZG93biBpZiBubyBsZWcgaXMgbnVsbAotCQkJLy8gYSBub2RlCi0JCQkKLQkJCVNldCBhbGxTZXQ9IG5ldyBIYXNoU2V0KDIwKTsKLQkJCU1hcCBhbmNlc3RvclNldD0gbnVsbDsKLQkJCU1hcCByaWdodFNldD0gbnVsbDsKLQkJCU1hcCBsZWZ0U2V0PSBudWxsOwotCQkJCQkJCi0JCQlpZiAoYW5jZXN0b3JDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJYW5jZXN0b3JTZXQ9IG5ldyBIYXNoTWFwKDEwKTsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgYW5jZXN0b3JDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgYW5jZXN0b3JDaGlsZD0gYW5jZXN0b3JDaGlsZHJlbltpXTsKLQkJCQkJYW5jZXN0b3JTZXQucHV0KGFuY2VzdG9yQ2hpbGQsIGFuY2VzdG9yQ2hpbGQpOwotCQkJCQlhbGxTZXQuYWRkKGFuY2VzdG9yQ2hpbGQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJpZ2h0Q2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCXJpZ2h0U2V0PSBuZXcgSGFzaE1hcCgxMCk7Ci0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IHJpZ2h0Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IHJpZ2h0Q2hpbGQ9IHJpZ2h0Q2hpbGRyZW5baV07Ci0JCQkJCXJpZ2h0U2V0LnB1dChyaWdodENoaWxkLCByaWdodENoaWxkKTsKLQkJCQkJYWxsU2V0LmFkZChyaWdodENoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsZWZ0Q2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWxlZnRTZXQ9IG5ldyBIYXNoTWFwKDEwKTsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgbGVmdENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBsZWZ0Q2hpbGQ9IGxlZnRDaGlsZHJlbltpXTsKLQkJCQkJbGVmdFNldC5wdXQobGVmdENoaWxkLCBsZWZ0Q2hpbGQpOwotCQkJCQlhbGxTZXQuYWRkKGxlZnRDaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJCQkJCi0JCQlJdGVyYXRvciBlPSBhbGxTZXQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBrZXlDaGlsZD0gZS5uZXh0KCk7Ci0JCQkJCi0JCQkJY29udGVudD0gZmFsc2U7Ci0JCQkJCi0JCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQkJCi0JCQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpCi0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJCQotCQkJCQl1cGRhdGVQcm9ncmVzcyhwbSwga2V5Q2hpbGQpOwotCQkJCX0KLQkJCQkKLQkJCQlPYmplY3QgYW5jZXN0b3JDaGlsZD0gYW5jZXN0b3JTZXQgIT0gbnVsbCA/IGFuY2VzdG9yU2V0LmdldChrZXlDaGlsZCkgOiBudWxsOwotCQkJCU9iamVjdCBsZWZ0Q2hpbGQ9IGxlZnRTZXQgIT0gbnVsbCA/IGxlZnRTZXQuZ2V0KGtleUNoaWxkKSA6IG51bGw7Ci0JCQkJT2JqZWN0IHJpZ2h0Q2hpbGQ9IHJpZ2h0U2V0ICE9IG51bGwgPyByaWdodFNldC5nZXQoa2V5Q2hpbGQpIDogbnVsbDsKLQkJCQkKLQkJCQlpbnQgYz0gdHJhdmVyc2UodGhyZWVXYXksIG5vZGUsIHBtLCBhbmNlc3RvckNoaWxkLCBsZWZ0Q2hpbGQsIHJpZ2h0Q2hpbGQpOwotCQkJCi0JCQkJaWYgKChjICYgQ0hBTkdFX1RZUEVfTUFTSykgIT0gTk9fQ0hBTkdFKSB7Ci0JCQkJCWNvZGV8PSBDSEFOR0U7CS8vIGRlbGV0aW9ucyBhbmQgYWRkaXRpb25zIG9mIGNoaWxkIHJlc3VsdCBpbiBhIGNoYW5nZSBvZiB0aGUgY29udGFpbmVyCi0JCQkJCWNvZGV8PSAoYyAmIERJUkVDVElPTl9NQVNLKTsJLy8gaW5jb21pbmcgJiBvdXRnb2luZyBhcmUganVzdCBvcmVkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRlbnQpCQkJLy8gYSBsZWFmCi0JCQljb2RlPSBjb21wYXJlKHRocmVlV2F5LCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCQkJCQkJCQkKLQkJbm9kZS5mQ29kZT0gY29kZTsKLQkJCQkJCQkKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBmb3IgZXZlcnkgbm9kZSBvciBsZWFmIGNvbXBhcmlzb24uCi0JICogVGhlIGRpZmZlcmVuY2luZyBlbmdpbmUgcGFzc2VzIGluIHRoZSBpbnB1dCBvYmplY3RzIG9mIHRoZSBjb21wYXJlIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJlLgotCSAqIFRoZSBkYXRhIG9iamVjdCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdGhlIDxjb2RlPnZpc2l0PC9jb2RlPiBtZXRob2Qgb24gdGhlIHBhcmVudCBpbnB1dC4KLQkgKiBJdCBjYW4gYmUgY29uc2lkZXJlZCB0aGUgInBhcmVudCIgcmVmZXJlbmNlIGFuZCBpcyB1c2VmdWwgd2hlbiBidWlsZGluZyBhIHRyZWUuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgbmV3Ci0JICogPGNvZGU+RGlmZk5vZGU8L2NvZGU+IHdoaWNoIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGRhdGEgb2JqZWN0IHJldHVybmVkIGZyb20gcGFyZW50IGNhbGwgdG8gPGNvZGU+dmlzaXQ8L2NvZGU+LAotCSAqICAgcG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGUgdGhyZWUgaW5wdXRzCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBjb21wYXJlIGFuY2VzdG9yIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBpbnB1dHMKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBpbnB1dCB0byB0aGUgY29tcGFyZQotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgaW5wdXQgdG8gdGhlIGNvbXBhcmUKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQsIHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB2aXNpdChPYmplY3QgZGF0YSwgaW50IHJlc3VsdCwgT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCXJldHVybiBuZXcgRGlmZk5vZGUoKElEaWZmQ29udGFpbmVyKSBkYXRhLCByZXN1bHQsIChJVHlwZWRFbGVtZW50KWFuY2VzdG9yLCAoSVR5cGVkRWxlbWVudClsZWZ0LCAoSVR5cGVkRWxlbWVudClyaWdodCk7Ci0JfQotCQotCS8qCi0JICogUGVyZm9ybXMgYSAyLXdheSBvciAzLXdheSBjb21wYXJlIG9mIHRoZSBnaXZlbiBsZWFmIGVsZW1lbnRzIGFuZCByZXR1cm5zIGFuIGludGVnZXIKLQkgKiBkZXNjcmliaW5nIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcGFyZShib29sZWFuIHRocmVld2F5LCBPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCi0JCWludCBkZXNjcmlwdGlvbj0gTk9fQ0hBTkdFOwotCQkKLQkJaWYgKHRocmVld2F5KSB7Ci0JCQlpZiAoYW5jZXN0b3IgPT0gbnVsbCkgewotCQkJCWlmIChsZWZ0ID09IG51bGwpIHsKLQkJCQkJaWYgKHJpZ2h0ID09IG51bGwpIHsKLQkJCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJCQkJLy8gc2hvdWxkbid0IGhhcHBlbgotCQkJCQl9IGVsc2UgewotCQkJCQkJZGVzY3JpcHRpb249IFJJR0hUIHwgQURESVRJT047Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmlnaHQgPT0gbnVsbCkgewotCQkJCQkJZGVzY3JpcHRpb249IExFRlQgfCBBRERJVElPTjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRlc2NyaXB0aW9uPSBDT05GTElDVElORyB8IEFERElUSU9OOwotCQkJCQkJaWYgKGNvbnRlbnRzRXF1YWwobGVmdCwgcmlnaHQpKQotCQkJCQkJCWRlc2NyaXB0aW9ufD0gUFNFVURPX0NPTkZMSUNUOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAobGVmdCA9PSBudWxsKSB7Ci0JCQkJCWlmIChyaWdodCA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbj0gQ09ORkxJQ1RJTkcgfCBERUxFVElPTiB8IFBTRVVET19DT05GTElDVDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChjb250ZW50c0VxdWFsKGFuY2VzdG9yLCByaWdodCkpCQkKLQkJCQkJCQlkZXNjcmlwdGlvbj0gTEVGVCB8IERFTEVUSU9OOwotCQkJCQkJZWxzZQotCQkJCQkJCWRlc2NyaXB0aW9uPSBDT05GTElDVElORyB8IENIQU5HRTsJCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmlnaHQgPT0gbnVsbCkgewotCQkJCQkJaWYgKGNvbnRlbnRzRXF1YWwoYW5jZXN0b3IsIGxlZnQpKQkKLQkJCQkJCQlkZXNjcmlwdGlvbj0gUklHSFQgfCBERUxFVElPTjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkZXNjcmlwdGlvbj0gQ09ORkxJQ1RJTkcgfCBDSEFOR0U7CQotCQkJCQl9IGVsc2UgewotCQkJCQkJYm9vbGVhbiBheT0gY29udGVudHNFcXVhbChhbmNlc3RvciwgbGVmdCk7Ci0JCQkJCQlib29sZWFuIGFtPSBjb250ZW50c0VxdWFsKGFuY2VzdG9yLCByaWdodCk7Ci0JCQkJCQkKLQkJCQkJCWlmIChheSAmJiBhbSkgewotCQkJCQkJCS8vIGVtcHR5Ci0JCQkJCQl9IGVsc2UgaWYgKGF5ICYmICFhbSkgewotCQkJCQkJCWRlc2NyaXB0aW9uPSBSSUdIVCB8IENIQU5HRTsKLQkJCQkJCX0gZWxzZSBpZiAoIWF5ICYmIGFtKSB7Ci0JCQkJCQkJZGVzY3JpcHRpb249IExFRlQgfCBDSEFOR0U7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRlc2NyaXB0aW9uPSBDT05GTElDVElORyB8IENIQU5HRTsKLQkJCQkJCQlpZiAoY29udGVudHNFcXVhbChsZWZ0LCByaWdodCkpCi0JCQkJCQkJCWRlc2NyaXB0aW9ufD0gUFNFVURPX0NPTkZMSUNUOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewkvLyB0d28gd2F5IGNvbXBhcmUgaWdub3JlcyBhbmNlc3RvcgotCQkJaWYgKGxlZnQgPT0gbnVsbCkgewotCQkJCWlmIChyaWdodCA9PSBudWxsKSB7Ci0JCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJfSBlbHNlIHsKLQkJCQkJZGVzY3JpcHRpb249IEFERElUSU9OOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJpZ2h0ID09IG51bGwpIHsKLQkJCQkJZGVzY3JpcHRpb249IERFTEVUSU9OOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghIGNvbnRlbnRzRXF1YWwobGVmdCwgcmlnaHQpKQotCQkJCQkJZGVzY3JpcHRpb249IENIQU5HRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkJCQkKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkJCi0JLyoqCi0JICogUGVyZm9ybXMgYSBjb250ZW50IGNvbXBhcmUgb24gdGhlIHR3byBnaXZlbiBpbnB1dHMuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbgotCSAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYm90aCBpbnB1dHMgaW1wbGVtZW50IDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+Ci0JICogYW5kIHRoZWlyIGJ5dGUgY29udGVudHMgaXMgaWRlbnRpY2FsLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBpbXBsZW1lbnQgCi0JICogYSBkaWZmZXJlbnQgY29udGVudCBjb21wYXJlIG9uIHRoZSBnaXZlbiBpbnB1dHMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGlucHV0MSBmaXJzdCBpbnB1dCB0byBjb250ZW50cyBjb21wYXJlCi0JICogQHBhcmFtIGlucHV0MiBzZWNvbmQgaW5wdXQgdG8gY29udGVudHMgY29tcGFyZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29udGVudCBpcyBlcXVhbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRlbnRzRXF1YWwoT2JqZWN0IGlucHV0MSwgT2JqZWN0IGlucHV0MikgewotCQkKLQkJaWYgKGlucHV0MSA9PSBpbnB1dDIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQlJbnB1dFN0cmVhbSBpczE9IGdldFN0cmVhbShpbnB1dDEpOwotCQlJbnB1dFN0cmVhbSBpczI9IGdldFN0cmVhbShpbnB1dDIpOwotCQkKLQkJaWYgKGlzMSA9PSBudWxsICYmIGlzMiA9PSBudWxsKQkvLyBubyBieXRlIGNvbnRlbnRzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAoaXMxID09IG51bGwgfHwgaXMyID09IG51bGwpCS8vIG9ubHkgb25lIGhhcyBjb250ZW50cwotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYzE9IGlzMS5yZWFkKCk7Ci0JCQkJaW50IGMyPSBpczIucmVhZCgpOwotCQkJCWlmIChjMSA9PSAtMSAmJiBjMiA9PSAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKGMxICE9IGMyKQotCQkJCQlicmVhazsKLQkJCQkKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vIE5lZWRXb3JrCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXMxICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpczEuY2xvc2UoKTsKLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXMyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpczIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIFRyaWVzIHRvIHJldHVybiBhbiBJbnB1dFN0cmVhbSBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvYmplY3Qgbm90IGFuIElTdHJlYW1Db250ZW50QWNjZXNzb3IKLQkgKiBvciBhbiBlcnJvciBvY2N1cmVkLgotCSAqLwotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChJU3RyZWFtQ29udGVudEFjY2Vzc29yKW8pLmdldENvbnRlbnRzKCk7Ci0JCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGlucHV0IAotCSAqIGltcGxlbWVudHMgdGhlIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPiBpbnRlcmZhY2UuIElmIHllcyBpdCBpcyB1c2VkCi0JICogdG8gcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGNoaWxkcmVuLiBPdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gaW1wbGVtZW50IGEgZGlmZmVyZW50IHN0cmF0ZWd5IHRvIGVudW1lcmF0ZSBjaGlsZHJlbi4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG9iamVjdCBmb3Igd2hpY2ggdG8gcmV0dXJuIGNoaWxkcmVuCi0JICogQHJldHVybiB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVDb21wYXJhdG9yKQotCQkJcmV0dXJuICgoSVN0cnVjdHVyZUNvbXBhcmF0b3IpaW5wdXQpLmdldENoaWxkcmVuKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgZm9yIGV2ZXJ5IGxlYWYgb3Igbm9kZSBjb21wYXJlIHRvIHVwZGF0ZSBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIHNob3dzIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBvYmplY3QKLQkgKiBhcyBhIHN1YnRhc2suIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlcG9ydGluZyBwcm9ncmVzcwotCSAqIEBwYXJhbSBub2RlIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIG5vbi08Y29kZT5udWxsPC9jb2RlPiBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvZ3Jlc3MoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkgewotCQkJU3RyaW5nIG5hbWU9ICgoSVR5cGVkRWxlbWVudClub2RlKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZm10PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJEaWZmZXJlbmNlci5wcm9ncmVzc0Zvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbXNnPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChmbXQsIG5ldyBTdHJpbmdbXSB7IG5hbWUgfSk7Ci0JCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJLy9wcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RvY3VtZW50UmFuZ2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RvY3VtZW50UmFuZ2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjJkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9Eb2N1bWVudFJhbmdlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuSURvY3VtZW50UmFuZ2U7Ci0KLQotLyoqCi0gKiBBIGRvY3VtZW50IHJhbmdlIG5vZGUgcmVwcmVzZW50cyBhIHN0cnVjdHVyYWwgZWxlbWVudAotICogd2hlbiBwZXJmb3JtaW5nIGEgc3RydWN0dXJlIGNvbXBhcmUgb2YgZG9jdW1lbnRzLgotICogPGNvZGU+RG9jdW1lbnRSYW5nZU5vZGVzPC9jb2RlPiBhcmUgY3JlYXRlZCB3aGlsZSBwYXJzaW5nIHRoZSBkb2N1bWVudCBhbmQgcmVwcmVzZW50Ci0gKiBhIHNlbWFudGljIGVudGl0eSAoZS5nLiBhIEphdmEgY2xhc3Mgb3IgbWV0aG9kKS4KLSAqIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHBhcnNpbmcgYSA8Y29kZT5Eb2N1bWVudFJhbmdlTm9kZTwvY29kZT4gbWFwcyB0byBhIHJhbmdlCi0gKiBvZiBjaGFyYWN0ZXJzIGluIHRoZSBkb2N1bWVudC4KLSAqIDxwPgotICogU2luY2UgYSA8Y29kZT5Eb2N1bWVudFJhbmdlTm9kZTwvY29kZT4gaW1wbGVtZW50cyB0aGUgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+Ci0gKiBhbmQgPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4gaW50ZXJmYWNlcyBpdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCB0byB0aGUKLSAqIGRpZmZlcmVuY2luZyBlbmdpbmUuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gcGVyZm9ybQotICogYSBzdHJ1Y3R1cmFsIGRpZmYgb24gYSBkb2N1bWVudCBhbmQgaGF2ZSB0aGUgbm9kZXMgYW5kIGxlYXZlcyBvZiB0aGUgY29tcGFyZSBlYXNpbHkgbWFwCi0gKiB0byBjaGFyYWN0ZXIgcmFuZ2VzIHdpdGhpbiB0aGUgZG9jdW1lbnQuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbWF5IGFkZCBhZGRpdGlvbmFsIHN0YXRlIGNvbGxlY3RlZCB3aGlsZSBwYXJzaW5nIHRoZSBkb2N1bWVudC4KLSAqIDwvcD4gCi0gKiBAc2VlIERpZmZlcmVuY2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJhbmdlTm9kZQotCQlpbXBsZW1lbnRzIElEb2N1bWVudFJhbmdlLCBJU3RydWN0dXJlQ29tcGFyYXRvciwgSUVkaXRhYmxlQ29udGVudCwgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQT1NfVVBEQVRFPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTY9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgSURvY3VtZW50IGZCYXNlRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQb3NpdGlvbiBmUmFuZ2U7IC8vIHRoZSByYW5nZSBpbiB0aGUgYmFzZSBkb2N1bWVudAotCXByaXZhdGUgaW50IGZUeXBlQ29kZTsKLQlwcml2YXRlIFN0cmluZyBmSUQ7Ci0JcHJpdmF0ZSBQb3NpdGlvbiBmQXBwZW5kUG9zaXRpb247IC8vIGEgcG9zaXRpb24gd2hlcmUgdG8gaW5zZXJ0IGEgY2hpbGQgdGV4dHVhbGx5Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZkNoaWxkcmVuOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Eb2N1bWVudFJhbmdlTm9kZTwvY29kZT4gZm9yIHRoZSBnaXZlbiByYW5nZSB3aXRoaW4gdGhlIHNwZWNpZmllZAotCSAqIGRvY3VtZW50LiBUaGUgPGNvZGU+dHlwZUNvZGU8L2NvZGU+IGlzIHVuaW50ZXJwcmV0ZWQgY2xpZW50IGRhdGEuIFRoZSBJRCBpcyB1c2VkIHdoZW4gY29tcGFyaW5nCi0JICogdHdvIG5vZGVzIHdpdGggZWFjaCBvdGhlcjogaS5lLiB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSBwZXJmb3JtcyBhIGNvbnRlbnQgY29tcGFyZSAKLQkgKiBvbiB0d28gbm9kZXMgaWYgdGhlaXIgSURzIGFyZSBlcXVhbC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlQ29kZSBhIHR5cGUgY29kZSBmb3IgdGhpcyBub2RlCi0JICogQHBhcmFtIGlkIGFuIGlkZW50aWZpZXIgZm9yIHRoaXMgbm9kZQotCSAqIEBwYXJhbSBkb2N1bWVudCBkb2N1bWVudCBvbiB3aGljaCB0aGlzIG5vZGUgaXMgYmFzZWQgb24KLQkgKiBAcGFyYW0gc3RhcnQgc3RhcnQgcG9zaXRpb24gb2YgcmFuZ2Ugd2l0aGluIGRvY3VtZW50Ci0JICogQHBhcmFtIGxlbmd0aCBsZW5ndGggb2YgcmFuZ2UKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSYW5nZU5vZGUoaW50IHR5cGVDb2RlLCBTdHJpbmcgaWQsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQotCQlmVHlwZUNvZGU9IHR5cGVDb2RlOwotCQlmSUQ9IGlkOwotCQkKLQkJZkJhc2VEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCWZCYXNlRG9jdW1lbnQuYWRkUG9zaXRpb25DYXRlZ29yeShSQU5HRV9DQVRFR09SWSk7Ci0JCWZSYW5nZT0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsZW5ndGgpOwotCQkKLQkJaWYgKFBPU19VUERBVEUpIHsKLQkJCXRyeSB7Ci0JCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24oUkFOR0VfQ0FURUdPUlksIGZSYW5nZSk7Ci0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEb2N1bWVudFJhbmdlLmdldERvY3VtZW50Ci0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZCYXNlRG9jdW1lbnQ7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSURvY3VtZW50UmFuZ2UuZ2V0UmFuZ2UKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UmFuZ2UoKSB7Ci0JCXJldHVybiBmUmFuZ2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgY29kZSBvZiB0aGlzIG5vZGUuCi0JICogVGhlIHR5cGUgY29kZSBpcyB1bmludGVycHJldGVkIGNsaWVudCBkYXRhIHdoaWNoIGNhbiBiZSBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLgotCSAqCi0JICogQHJldHVybiB0aGUgdHlwZSBjb2RlIG9mIHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZUNvZGUoKSB7Ci0JCXJldHVybiBmVHlwZUNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBub2RlJ3MgaWQuCi0JICogSXQgaXMgdXNlZCBpbiA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoY29kZTwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBub2RlJ3MgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyBub2RlJ3MgaWQuCi0JICogSXQgaXMgdXNlZCBpbiA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoY29kZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIG5ldyBpZCBmb3IgdGhpcyBub2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCWZJRD0gaWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gbm9kZSBhcyBhIGNoaWxkLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYWRkIGFzIGEgY2hpbGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChEb2N1bWVudFJhbmdlTm9kZSBub2RlKSB7Ci0JCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkKLQkJCWZDaGlsZHJlbj0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ2hpbGRyZW4uYWRkKG5vZGUpOwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVN0cnVjdHVyZUNvbXBhcmF0b3IuZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChmQ2hpbGRyZW4gIT0gbnVsbCkKLQkJCXJldHVybiBmQ2hpbGRyZW4udG9BcnJheSgpOyAKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBvZiB0aGlzIG5vZGUuCi0JICoKLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJZ2V0UmFuZ2UoKS5zZXRMZW5ndGgobGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgcG9zaXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCByYW5nZSB0aGF0IGNhbiBiZSB1c2VkIHRvIChsZWdhbGx5KSBpbnNlcnQKLQkgKiB0ZXh0IHdpdGhvdXQgYnJlYWtpbmcgdGhlIHN5bnRheCBvZiB0aGUgZG9jdW1lbnQuCi0JICogPHA+Ci0JICogRS5nLiB3aGVuIHBhcnNpbmcgYSBKYXZhIGRvY3VtZW50IHRoZSAiYXBwZW5kIHBvc2l0aW9uIiBvZiBhIDxjb2RlPkRvY3VtZW50UmFuZ2VOb2RlPC9jb2RlPgotCSAqIHJlcHJlc2VudGF0aW5nIGEgSmF2YSBjbGFzcyBjb3VsZCBiZSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNrZXQuCi0JICogSW5zZXJ0aW5nIHRoZSB0ZXh0IG9mIGEgbmV3IG1ldGhvZCB0aGVyZSB3b3VsZCBub3QgZGlzdHVyYiB0aGUgc3ludGF4IG9mIHRoZSBjbGFzcy4KLQkgKgotCSAqIEBwYXJhbSBwb3MgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiB3aXRoaW4gdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgd2hlcmUgdGV4dCBjYW4gYmUgbGVnYWxseSBpbnNlcnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGVuZFBvc2l0aW9uKGludCBwb3MpIHsKLQkJaWYgKFBPU19VUERBVEUpIHsKLQkJCWZCYXNlRG9jdW1lbnQucmVtb3ZlUG9zaXRpb24oZkFwcGVuZFBvc2l0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJUG9zaXRpb24gcD0gbmV3IFBvc2l0aW9uKHBvcyk7Ci0JCQkJZkJhc2VEb2N1bWVudC5hZGRQb3NpdGlvbihSQU5HRV9DQVRFR09SWSwgcCk7Ci0JCQkJZkFwcGVuZFBvc2l0aW9uPSBwOwotCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9IGVsc2UgewotCQkJZkFwcGVuZFBvc2l0aW9uPSBuZXcgUG9zaXRpb24ocG9zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIHRoYXQgaGFzIGJlZW4gc2V0IHdpdGggPGNvZGU+c2V0QXBwZW5kUG9zaXRpb248L2NvZGU+LgotCSAqIElmIDxjb2RlPnNldEFwcGVuZFBvc2l0aW9uPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIKLQkgKiBvZiB0aGlzIHJhbmdlIGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiBhIHBvc2l0aW9uIHdoZXJlIHRleHQgY2FuIGJlIGxlZ2FsbHkgaW5zZXJ0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb24gZ2V0QXBwZW5kUG9zaXRpb24oKSB7Ci0JCWlmIChmQXBwZW5kUG9zaXRpb24gPT0gbnVsbCkgewotCQkJaWYgKFBPU19VUERBVEUpIHsKLQkJCQl0cnkgewotCQkJCQlQb3NpdGlvbiBwPSBuZXcgUG9zaXRpb24oZkJhc2VEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCWZCYXNlRG9jdW1lbnQuYWRkUG9zaXRpb24oUkFOR0VfQ0FURUdPUlksIHApOwotCQkJCQlmQXBwZW5kUG9zaXRpb249IHA7Ci0JCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZkFwcGVuZFBvc2l0aW9uPSBuZXcgUG9zaXRpb24oZkJhc2VEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBcHBlbmRQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiA8Y29kZT5nZXRJRDwvY29kZT4uCi0gICAgICogQHBhcmFtIG90aGVyIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIDxjb2RlPkRvY3VtZW50UmFuZ2VOb2RlPC9jb2RlPiBhZ2FpbnN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPkRvY3VtZW50UmFuZ2VOb2RlczwvY29kZT5hcmUgZXF1YWw7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlci5nZXRDbGFzcygpID09IGdldENsYXNzKCkpIHsKLQkJCURvY3VtZW50UmFuZ2VOb2RlIHRuPSAoRG9jdW1lbnRSYW5nZU5vZGUpIG90aGVyOwotCQkJcmV0dXJuIGZUeXBlQ29kZSA9PSB0bi5mVHlwZUNvZGUgJiYgZklELmVxdWFscyh0bi5mSUQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob3RoZXIpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIDxjb2RlPmdldElEPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGEgaGFzaGNvZGUgZm9yIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmSUQuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKgotCSAqIEZpbmQgY29ycmVzcG9uZGluZyBwb3NpdGlvbgotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gZmluZENvcnJlc3BvbmRpbmdQb3NpdGlvbihEb2N1bWVudFJhbmdlTm9kZSBvdGhlclBhcmVudCwgRG9jdW1lbnRSYW5nZU5vZGUgY2hpbGQpIHsKLQotCQkvLyB3ZSB0cnkgdG8gZmluZCBhIHByZWRlY2Vzc29yIG9mIGxlZnQgTm9kZSB3aGljaCBleGlzdHMgb24gdGhlIHJpZ2h0IHNpZGUKLQotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBmQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IGl4PSBvdGhlclBhcmVudC5mQ2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7Ci0JCQlpZiAoaXggPj0gMCkgewotCi0JCQkJZm9yIChpbnQgaT0gaXggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlEb2N1bWVudFJhbmdlTm9kZSBjMT0gKERvY3VtZW50UmFuZ2VOb2RlKSBvdGhlclBhcmVudC5mQ2hpbGRyZW4uZ2V0KGkpOwotCQkJCQlpbnQgaTI9IGZDaGlsZHJlbi5pbmRleE9mKGMxKTsKLQkJCQkJaWYgKGkyID49IDApIHsKLQkJCQkJCURvY3VtZW50UmFuZ2VOb2RlIGM9IChEb2N1bWVudFJhbmdlTm9kZSkgZkNoaWxkcmVuLmdldChpMik7Ci0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICBmb3VuZCBjb3JyZXNwb25kaW5nOiAiICsgaTIgKyAiICIgKyBjKTsKLQkJCQkJCVBvc2l0aW9uIHA9IGMuZlJhbmdlOwotCi0JCQkJCQkvL3RyeSB7Ci0JCQkJCQlQb3NpdGlvbiBwbz0gbmV3IFBvc2l0aW9uKHAuZ2V0T2Zmc2V0KCkgKyBwLmdldExlbmd0aCgpICsgMSwgMCk7Ci0JCQkJCQkvL2MuZkJhc2VEb2N1bWVudC5hZGRQb3NpdGlvbihSQU5HRV9DQVRFR09SWSwgcG8pOwotCQkJCQkJcmV0dXJuIHBvOwotCQkJCQkJLy99IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy99Ci0JCQkJCQkvL2JyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaT0gaXg7IGkgPCBvdGhlclBhcmVudC5mQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJRG9jdW1lbnRSYW5nZU5vZGUgYzE9IChEb2N1bWVudFJhbmdlTm9kZSkgb3RoZXJQYXJlbnQuZkNoaWxkcmVuLmdldChpKTsKLQkJCQkJaW50IGkyPSBmQ2hpbGRyZW4uaW5kZXhPZihjMSk7Ci0JCQkJCWlmIChpMiA+PSAwKSB7Ci0JCQkJCQlEb2N1bWVudFJhbmdlTm9kZSBjPSAoRG9jdW1lbnRSYW5nZU5vZGUpIGZDaGlsZHJlbi5nZXQoaTIpOwotCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgY29ycmVzcG9uZGluZzogIiArIGkyICsgIiAiICsgYyk7Ci0JCQkJCQlQb3NpdGlvbiBwPSBjLmZSYW5nZTsKLQkJCQkJCS8vdHJ5IHsKLQkJCQkJCVBvc2l0aW9uIHBvPSBuZXcgUG9zaXRpb24ocC5nZXRPZmZzZXQoKSwgMCk7Ci0JCQkJCQkvL2MuZkJhc2VEb2N1bWVudC5hZGRQb3NpdGlvbihSQU5HRV9DQVRFR09SWSwgcG8pOwotCQkJCQkJcmV0dXJuIHBvOwotCQkJCQkJLy99IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy99Ci0JCQkJCQkvL2JyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEFwcGVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChTdHJpbmcgcywgRG9jdW1lbnRSYW5nZU5vZGUgcGFyZW50LCBEb2N1bWVudFJhbmdlTm9kZSBjaGlsZCkgewotCi0JCVBvc2l0aW9uIHA9IGZpbmRDb3JyZXNwb25kaW5nUG9zaXRpb24ocGFyZW50LCBjaGlsZCk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZkJhc2VEb2N1bWVudC5yZXBsYWNlKHAuZ2V0T2Zmc2V0KCksIHAuZ2V0TGVuZ3RoKCksIHMpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yLmdldENvbnRlbnRzCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgewotCQlTdHJpbmcgczsKLQkJdHJ5IHsKLQkJCXM9IGZCYXNlRG9jdW1lbnQuZ2V0KGZSYW5nZS5nZXRPZmZzZXQoKSwgZlJhbmdlLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXM9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFV0aWxpdGllcy5nZXRCeXRlcyhzLCBVVEZfMTYpKTsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElFZGl0YWJsZUNvbnRlbnQuaXNFZGl0YWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdGFibGVDb250ZW50LnJlcGxhY2UKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCByZXBsYWNlKElUeXBlZEVsZW1lbnQgY2hpbGQsIElUeXBlZEVsZW1lbnQgb3RoZXIpIHsKLQotCQlEb2N1bWVudFJhbmdlTm9kZSBzcmM9IG51bGw7Ci0JCVN0cmluZyBzcmNDb250ZW50cz0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChvdGhlciAhPSBudWxsKSB7Ci0JCQlzcmM9IChEb2N1bWVudFJhbmdlTm9kZSkgY2hpbGQ7Ci0JCQkKLQkJCWlmIChvdGhlciBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCQl0cnkgewotCQkJCQlzcmNDb250ZW50cz0gVXRpbGl0aWVzLnJlYWRTdHJpbmcoKElTdHJlYW1Db250ZW50QWNjZXNzb3Ipb3RoZXIpOwotCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBOZWVkV29yawotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjaGlsZCA9PSBudWxsKSAvLyBubyBkZXN0aW5hdGlvbjogd2UgaGF2ZSB0byBhZGQgdGhlIGNvbnRlbnRzIGludG8gdGhlIHBhcmVudAotCQkJYWRkKHNyY0NvbnRlbnRzLCBudWxsLCBzcmMpOwotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdGFibGVDb250ZW50LnNldENvbnRlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBjb250ZW50KSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1Db250ZW50QWNjZXNzb3IjZ2V0RW5jb2RpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIFVURl8xNjsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSUNvbXBhcmVJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JQ29tcGFyZUlucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjEyYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JQ29tcGFyZUlucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB1c2VkIGFzIGlucHV0IHRvIGEgdHdvLXdheSBvciB0aHJlZS13YXkgY29tcGFyZSB2aWV3ZXIuCi0gKiBJdCBkZWZpbmVzIEFQSSBmb3IgYWNjZXNzaW5nIHRoZSB0aHJlZSBzaWRlcyBmb3IgdGhlIGNvbXBhcmUsCi0gKiBhbmQgYSBuYW1lIGFuZCBpbWFnZSB3aGljaCBpcyB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGUgdGhyZWUgd2F5IGlucHV0Ci0gKiBpbiB0aGUgVUksIGZvciBleGFtcGxlLCBpbiBhIHRpdGxlIGJhci4KLSAqIDxwPgotICogTm90ZTogYXQgbW9zdCB0d28gc2lkZXMgb2YgYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LAotICogKGFzIGl0IGlzIG5vcm1hbCBmb3IgYWRkaXRpb25zIG9yIGRlbGV0aW9ucykgYnV0IG5vdCBhbGwgdGhyZWUuCi0gKiA8cD4KLSAqIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nCi0gKiA8Y29kZT5JQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXI8L2NvZGU+cwotICogdGhhdCBnZXQgaW5mb3JtZWQgaWYgb25lIChvciBtb3JlKQotICogb2YgdGhlIHRocmVlIHNpZGVzIG9mIGFuIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+IG9iamVjdCBjaGFuZ2VzIGl0cyB2YWx1ZS4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUgd2hlbiBhY2NlcHRpbmcgYW4gaW5jb21pbmcgYWRkaXRpb24KLSAqIHRoZSAobm9uLTxjb2RlPm51bGw8L2NvZGU+KSBsZWZ0IHNpZGUgb2YgYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4KLSAqIGlzIGNvcGllZCB0byB0aGUgcmlnaHQgc2lkZSBieSBtZWFucyBvZiBtZXRob2QgPGNvZGU+Y29weTwvY29kZT4uCi0gKiBUaGlzIHNob3VsZCB0cmlnZ2VyIGEgY2FsbCB0byA8Y29kZT5jb21wYXJlSW5wdXRDaGFuZ2VkPC9jb2RlPiBvZiByZWdpc3RlcmVkCi0gKiA8Y29kZT5JQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXI8L2NvZGU+cy4gCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgb3IgdXNlIHRoZSBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiAKLSAqIDxjb2RlPkRpZmZOb2RlPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBTdHJ1Y3R1cmVEaWZmVmlld2VyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLkNvbnRlbnRNZXJnZVZpZXdlcgotICogQHNlZSBEaWZmTm9kZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wYXJlSW5wdXQgewotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIG9mIGlucHV0LgotCSAqIFRoaXMgbmFtZSBpcyBkaXNwbGF5ZWQgd2hlbiB0aGlzIGlucHV0IGlzIHNob3duIGluIGEgdmlld2VyLgotCSAqIEluIG1hbnkgY2FzZXMgdGhpcyBuYW1lIGlzIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHNpZGVzIG9yIGEgY29tYmluYXRpb24KLQkgKiB0aGVyZW9mLgotCSAqCi0JICogQHJldHVybiBuYW1lIG9mIGlucHV0Ci0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHJlcHJlc2VudGluZyB0aGlzIGlucHV0LgotCSAqIFRoaXMgaW1hZ2UgaXMgdHlwaWNhbGx5IGRpc3BsYXllZCB3aGVuIHRoaXMgaW5wdXQgaXMgc2hvd24gaW4gYSB2aWV3ZXIuCi0JICogSW4gbWFueSBjYXNlcyB0aGlzIGltYWdlIGlzIHRoZSBpbWFnZSBvZiBvbmUgb2YgdGhlIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzaWRlcy4KLQkgKgotCSAqIEByZXR1cm4gaW1hZ2UgcmVwcmVzZW50aW5nIHRoaXMgaW5wdXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGljb24gc2hvdWxkIGJlIHNob3duCi0JICovCi0JSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQotCSAqIHRocmVlIHNpZGVzIGFuY2VzdG9yLCBsZWZ0IGFuZCByaWdodC4KLQkgKiBUaGlzIGZpZWxkIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4KLQkgKiBpcyB0aGUgcmVzdWx0IG9mIGFub3RoZXIgY29tcGFyZS4gSW4gdGhpcyBjYXNlIGl0IGlzIHVzZWQKLQkgKiB0b2dldGhlciB3aXRoIDxjb2RlPmdldEltYWdlPC9jb2RlPiB0byBjb21wb3NlIGEgaWNvbgotCSAqIHdoaWNoIHJlZmxlY3RzIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIG9yIHRocmVlIGVsZW1lbnRzLgotCSAqCi0JICogQHJldHVybiBraW5kIG9mIGRpZmZlcmVuY2UgKHNlZSA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4pCi0JICovCi0JaW50IGdldEtpbmQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhbmNlc3RvciBzaWRlIG9mIHRoaXMgaW5wdXQuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlucHV0IGhhcyBubyBhbmNlc3RvcgotCSAqIG9yIGluIHRoZSB0d28td2F5IGNvbXBhcmUgY2FzZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoaXMgaW5wdXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JSVR5cGVkRWxlbWVudCBnZXRBbmNlc3RvcigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlZnQgc2lkZSBvZiB0aGlzIGlucHV0LgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gbGVmdCBzaWRlIChkZWxldGlvbiBvciBhZGRpdGlvbikuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsZWZ0IHNpZGUgb2YgdGhpcyBpbnB1dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlJVHlwZWRFbGVtZW50IGdldExlZnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWdodCBzaWRlIG9mIHRoaXMgaW5wdXQuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyByaWdodCBzaWRlIChkZWxldGlvbiBvciBhZGRpdGlvbikuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSByaWdodCBzaWRlIG9mIHRoaXMgaW5wdXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JSVR5cGVkRWxlbWVudCBnZXRSaWdodCgpOwotCQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiBJZiB0aGUgaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB0aGUgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHJlZ2lzdGVyIGZvciBjaGFuZ2VzIG9mIHRoaXMgaW5wdXQKLQkgKi8KLQl2b2lkIGFkZENvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKElDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIGxpc3RlbmVyLgotCSAqIElmIHRoZSBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgdGhlIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byB1bnJlZ2lzdGVyCi0JICovCi0Jdm9pZCByZW1vdmVDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcihJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIENvcHkgb25lIHNpZGUgKHNvdXJjZSkgdG8gdGhlIG90aGVyIHNpZGUgKGRlc3RpbmF0aW9uKSBkZXBlbmRpbmcgb24gdGhlIAotCSAqIHZhbHVlIG9mIDxjb2RlPmxlZnRUb1JpZ2h0PC9jb2RlPi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20KLQkgKiBhIG1lcmdlIHZpZXdlciBpZiBhIGNvcnJlc3BvbmRpbmcgYWN0aW9uICgidGFrZSBsZWZ0IiBvciAidGFrZSByaWdodCIpCi0JICogaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGhhbmRsZSB0aGUgZm9sbG93aW5nIGNhc2VzOgotCSAqIDxVTD4KLQkgKiA8TEk+Ci0JICogaWYgdGhlIHNvdXJjZSBzaWRlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIGRlbGV0ZWQsCi0JICogPExJPgotCSAqIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgZGVzdGluYXRpb24gbXVzdCBiZSBjcmVhdGVkCi0JICogYW5kIGZpbGxlZCB3aXRoIHRoZSBjb250ZW50cyBmcm9tIHRoZSBzb3VyY2UsCi0JICogPExJPgotCSAqIGlmIGJvdGggc2lkZXMgYXJlIG5vbi08Y29kZT5udWxsPC9jb2RlPiB0aGUgY29udGVudHMgb2Ygc291cmNlIG11c3QgYmUgY29waWVkIHRvIGRlc3RpbmF0aW9uLgotCSAqIDwvVUw+Ci0JICogSW4gYWRkaXRpb24gdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBzZW5kIG91dCBub3RpZmljYXRpb24gdG8gdGhlIHJlZ2lzdGVyZWQKLQkgKiA8Y29kZT5JQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBsZWZ0VG9SaWdodCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgbGVmdCBzaWRlIGlzIGNvcGllZCB0byB0aGUgcmlnaHQgc2lkZS4KLQkgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIHJpZ2h0IHNpZGUgaXMgY29waWVkIHRvIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQl2b2lkIGNvcHkoYm9vbGVhbiBsZWZ0VG9SaWdodCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGUzNzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlcjsKLQotLyoqCi0gKiBMaXN0ZW5lciB0aGF0IGdldHMgaW5mb3JtZWQgaWYgb25lIChvciBtb3JlKQotICogb2YgdGhlIHRocmVlIHNpZGVzIG9mIGFuIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+IG9iamVjdCBjaGFuZ2VzIGl0cyB2YWx1ZS4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUgd2hlbiBhY2NlcHRpbmcgYW4gaW5jb21pbmcgYWRkaXRpb24KLSAqIHRoZSAobm9uLW51bGwpIGxlZnQgc2lkZSBvZiBhbiA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPgotICogaXMgY29waWVkIHRvIHRoZSByaWdodCBzaWRlICh3aGljaCB3YXMgPGNvZGU+bnVsbDwvY29kZT4pLgotICogVGhpcyB0cmlnZ2VycyBhIGNhbGwgdG8gPGNvZGU+Y29tcGFyZUlucHV0Q2hhbmdlZDwvY29kZT4gb2YgcmVnaXN0ZXJlZAotICogPGNvZGU+SUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyPC9jb2RlPi4gCi0gKiA8cD4KLSAqIE5vdGUgaG93ZXZlciwgdGhhdCBsaXN0ZW5lciBhcmUgbm90IGluZm9ybWVkIGlmIHRoZSBjb250ZW50IG9mIG9uZSBvZiB0aGUgc2lkZXMgY2hhbmdlcy4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBJdCBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHZpZXdlcnMgdGhhdCB0YWtlIAotICogYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4gYXMgaW5wdXQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIHZhbHVlIChub3QgdGhlIGNvbnRlbnQpIG9mIG9uZSBvciBtb3JlIG9mIHRoZSB0aHJlZSBzaWRlcyAKLSAJICogb2YgYSA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPiBoYXMgY2hhbmdlZC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgdGhlIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+IHRoYXQgaGFzIGNoYW5nZWQKLQkgKi8KLQl2b2lkIGNvbXBhcmVJbnB1dENoYW5nZWQoSUNvbXBhcmVJbnB1dCBzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JRGlmZkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JRGlmZkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVmOGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSURpZmZDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi0vKioKLSAqIDxjb2RlPklEaWZmQ29udGFpbmVyPC9jb2RlPiBpcyBhIDxjb2RlPklEaWZmRWxlbWVudDwvY29kZT4gd2l0aCBjaGlsZHJlbi4KLSAqIDxwPgotICogPGNvZGU+SURpZmZDb250YWluZXI8L2NvZGU+IGFyZSB0aGUgaW5uZXIgbm9kZXMgZGlzcGxheWVkCi0gKiBieSB0aGUgPGNvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+LgotICogPGNvZGU+SURpZmZDb250YWluZXI8L2NvZGU+IGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBhcyB0aGUgcmVzdWx0IG9mIHBlcmZvcm1pbmcKLSAqIGEgY29tcGFyZSB3aXRoIHRoZSA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgb3IgdXNlIG9uZSBvZiB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zLAotICogPGNvZGU+RGlmZkNvbnRhaW5lcjwvY29kZT4gb3IgPGNvZGU+RGlmZk5vZGU8L2NvZGU+LgotICoKLSAqIEBzZWUgRGlmZmVyZW5jZXIKLSAqIEBzZWUgRGlmZlRyZWVWaWV3ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlmZkNvbnRhaW5lciBleHRlbmRzIElEaWZmRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb250YWluZXIgaGFzIGF0IGxlYXN0IG9uZSBjaGlsZC4KLQkgKiBJbiBzb21lIGNhc2VzIHRoaXMgbWV0aG9kcyBhdm9pZHMgaGF2aW5nIHRvIGNhbGwgdGhlCi0JICogcG90ZW50aWFsIG1vcmUgY29zdGx5IDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRhaW5lciBoYXMgYXQgbGVhc3Qgb25lIGNoaWxkIAotCSAqLwotCWJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29udGFpbmVyLgotCSAqIElmIHRoaXMgY29udGFpbmVyIGhhcyBubyBjaGlsZHJlbiBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZCAobm90IDxjb2RlPm51bGw8L2NvZGU+KS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGNvbnRhaW5lciBhcyBhbiBhcnJheQotCSAqLwotCUlEaWZmRWxlbWVudFtdIGdldENoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCB0byB0aGlzIGNvbnRhaW5lci4KLQkgKiBJZiB0aGUgY2hpbGQgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gdGhpcyBjb250YWluZXIsIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0JICoKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29udGFpbmVyCi0JICovCi0Jdm9pZCBhZGQoSURpZmZFbGVtZW50IGNoaWxkKTsKLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIHRoaXMgY29udGFpbmVyLgotCSAqIElmIHRoZSBjb250YWluZXIgYmVjb21lcyBlbXB0eSBpdCBpcyByZW1vdmVkIGZyb20gaXRzIGNvbnRhaW5lci4KLQkgKiBJZiB0aGUgY2hpbGQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIGNvbnRhaW5lciwgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQkgKgotCSAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGFpbmVyCi0JICovCi0Jdm9pZCByZW1vdmVUb1Jvb3QoSURpZmZFbGVtZW50IGNoaWxkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSURpZmZFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lEaWZmRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2U0NTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSURpZmZFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVR5cGVkRWxlbWVudDsKLQotLyoqCi0gKiBBbiA8Y29kZT5JRGlmZkVsZW1lbnQ8L2NvZGU+IGlzIHVzZWQgaW4gdGhlIDxjb2RlPkRpZmZUcmVlVmlld2VyPC9jb2RlPgotICogdG8gZGlzcGxheSB0aGUga2luZCBvZiBjaGFuZ2UgZGV0ZWN0ZWQgYXMgdGhlIHJlc3VsdCBvZiBhIHR3by13YXkgb3IgdGhyZWUtd2F5IGNvbXBhcmUuCi0gKiA8cD4KLSAqIFRoZSBiYXNlIGludGVyZmFjZSA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPiBwcm92aWRlcyBhIG5hbWUsIGEgdHlwZSwgYW5kIGFuIGltYWdlLgotICogPGNvZGU+SURpZmZFbGVtZW50PC9jb2RlPiBhZGRzIEFQSSBmb3IgbWFpbnRhaW5pbmcgYSBwYXJlbnQgcmVsYXRpb25zaGlwLgotICogPHA+Ci0gKiA8Y29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4gd29ya3Mgb24gYSB0cmVlIG9mIDxjb2RlPklEaWZmRWxlbWVudHM8L2NvZGU+LgotICogTGVhZiBlbGVtZW50cyBtdXN0IGltcGxlbWVudCB0aGUKLSAqIDxjb2RlPklEaWZmRWxlbWVudDwvY29kZT4gaW50ZXJmYWNlLCBpbm5lciBub2RlcyB0aGUgPGNvZGU+SURpZmZDb250YWluZXI8L2NvZGU+IGludGVyZmFjZS4KLSAqIDxwPgotICogPGNvZGU+SURpZmZFbGVtZW50PC9jb2RlPnMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgcGVyZm9ybWluZwotICogYSBjb21wYXJlIHdpdGggdGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBvciB1c2Ugb25lIG9mIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMsCi0gKiA8Y29kZT5EaWZmRWxlbWVudDwvY29kZT4sIDxjb2RlPkRpZmZDb250YWluZXI8L2NvZGU+LCBvciA8Y29kZT5EaWZmTm9kZTwvY29kZT4uCi0gKgotICogQHNlZSBEaWZmVHJlZVZpZXdlcgotICogQHNlZSBEaWZmRWxlbWVudAotICogQHNlZSBEaWZmQ29udGFpbmVyCi0gKiBAc2VlIERpZmZOb2RlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpZmZFbGVtZW50IGV4dGVuZHMgSVR5cGVkRWxlbWVudCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiBkaWZmZXJlbmNlIGFzIGRlZmluZWQgaW4gPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiB0aGUga2luZCBvZiBkaWZmZXJlbmNlIGFzIGRlZmluZWQgaW4gPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+Ci0JICovCi0JaW50IGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIGVsZW1lbnQuCi0JICogSWYgdGhlIG9iamVjdCBpcyB0aGUgcm9vdCBvZiBhIGhpZXJhcmNoeSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGhhcyBubyBwYXJlbnQKLQkgKi8KLQlJRGlmZkNvbnRhaW5lciBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIGVsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBuZXcgcGFyZW50IG9mIHRoaXMgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotCSAqICAgZWxlbWVudCBpcyB0byBoYXZlIG5vIHBhcmVudAotCSAqLwotCXZvaWQgc2V0UGFyZW50KElEaWZmQ29udGFpbmVyIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDViZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JU3RydWN0dXJlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gY29tcGFyZSBoaWVyYXJjaGljYWwgc3RydWN0dXJlcy4KLSAqIEl0IGlzIHVzZWQgYnkgdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUuCi0gKiA8cD4KLSAqIENsaWVudHMgdHlwaWNhbGx5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBhbiBhZGFwdG9yIGNsYXNzIHdoaWNoIAotICogd3JhcHBlcnMgdGhlIG9iamVjdHMgdG8gYmUgY29tcGFyZWQuCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLlJlc291cmNlTm9kZQotICogQHNlZSBEaWZmZXJlbmNlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIHsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCBhbGwgY2hpbGRyZW4gb2YgdGhpcyBvYmplY3QsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbgotCSAqLwotCU9iamVjdFtdIGdldENoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgc29tZSBvdGhlciBvYmplY3QgaXMgImVxdWFsIHRvIiB0aGlzIG9uZQotCSAqIHdpdGggcmVzcGVjdCB0byBhIHN0cnVjdHVyYWwgY29tcGFyaXNvbi4gRm9yIGV4YW1wbGUsIHdoZW4gY29tcGFyaW5nCi0JICogSmF2YSBjbGFzcyBtZXRob2RzLCA8Y29kZT5lcXVhbHM8L2NvZGU+IHdvdWxkIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHR3byBtZXRob2RzIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlICh0aGUgYXJndW1lbnQgbmFtZXMgYW5kIHRoZSAKLQkgKiBtZXRob2QgYm9keSBtaWdodCBkaWZmZXIpLgotCSAqCi0JICogQHBhcmFtIG90aGVyIHRoZSByZWZlcmVuY2Ugb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIG90aGVyIGFyZ3VtZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscwotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTBmYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JU3RydWN0dXJlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGNyZWF0ZSBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgb2YKLSAqIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPnMgZm9yIGEgZ2l2ZW4gaW5wdXQgb2JqZWN0LgotICogSW4gYWRkaXRpb24sIGl0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIGxvY2F0aW5nIGEgcGF0aCBpbiB0aGUgaGllcmFyY2hpY2FsIHN0cnVjdHVyZQotICogYW5kIHRvIG1hcCBhIG5vZGUgb2YgdGhpcyBzdHJ1Y3R1cmUgYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBvYmplY3QuCi0gKiA8cD4KLSAqIFN0cnVjdHVyZSBjcmVhdG9ycyBhcmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIGNvbnRleHRzOgotICogPHVsPgotICogPGxpPgotICogdGhlIDxjb2RlPlN0cnVjdHVyZURpZmZWaWV3ZXI8L2NvZGU+IHVzZXMgYW4gPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+IHRvCi0gKiBidWlsZCB0d28gKG9yIHRocmVlKSB0cmVlIHN0cnVjdHVyZXMgb2YgaXRzIGlucHV0IGVsZW1lbnRzIChtZXRob2QgPGNvZGU+Z2V0U3RydWN0dXJlPC9jb2RlPikuCi0gKiBUaGVzZSB0cmVlcyBhcmUgdGhlbiBjb21wYXJlZCB3aXRoIGVhY2ggb3RoZXIgYnkgbWVhbnMgb2YgdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUgYW5kIGRpc3BsYXllZAotICogd2l0aCB0aGUgPGNvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+LAotICogPC9saT4KLSAqIDxsaT4KLSAqIHRoZSA8Y29kZT5SZXBsYWNlV2l0aEVkaXRpb25EaWFsb2c8L2NvZGU+IHVzZXMgYW4gPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+Ci0gKiB0byBtYXAgYSBwYXRoIGJhY2sgdG8gYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGluIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiBBIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPiBwcm92aWRlcyBtZXRob2RzIGZvciByZXdyaXRpbmcgdGhlIHRyZWUgcHJvZHVjZWQgYnkgdGhlIGRpZmZlcmVuY2luZwotICogZW5naW5lIHRvIHN1cHBvcnQgInNtYXJ0IiBzdHJ1Y3R1cmFsIGRpZmZlcmVuY2luZy4gRS5nLiBjZXJ0YWluIHBhdHRlcm5zIG9mIHBhaXJzIG9mICJhZGRpdGlvbiIKLSAqIGFuZCAiZGVsZXRpb24iIG5vZGVzIGNhbiBiZSBkZXRlY3RlZCBhcyByZW5hbWVzIGFuZCBtZXJnZWQgaW50byBhIHNpbmdsZSBub2RlLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2U7IHRoZXJlIGlzIG5vIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uLgotICogPC9wPgotICoKLSAqIEBzZWUgU3RydWN0dXJlRGlmZlZpZXdlcgotICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLkVkaXRpb25TZWxlY3Rpb25EaWFsb2cKLSAqIEBzZWUgRGlmZmVyZW5jZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlQ3JlYXRvciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVzY3JpcHRpdmUgbmFtZSB3aGljaCBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgb2YgdGhlIDxjb2RlPlN0cnVjdHVyZURpZmZWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoaXMgPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0cmVlIHN0cnVjdHVyZSBjb25zaXN0aW5nIG9mIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPnMKLQkgKiBmcm9tIHRoZSBnaXZlbiBvYmplY3QgYW5kIHJldHVybnMgaXRzIHJvb3Qgb2JqZWN0LgotCSAqIEltcGxlbWVudGluZyB0aGlzIG1ldGhvZCB0eXBpY2FsbHkgaW52b2x2ZXMgcGFyc2luZyB0aGUgaW5wdXQgb2JqZWN0LgotCSAqIEluIGNhc2Ugb2YgYW4gZXJyb3IgKGUuZy4gYSBwYXJzaW5nIGVycm9yKSB0aGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdHJlZSBvZiA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSByb290IG5vZGUgb2YgdGhlIHN0cnVjdHVyZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpbiBjYXNlIG9mIGVycm9yCi0JICovCi0JSVN0cnVjdHVyZUNvbXBhcmF0b3IgZ2V0U3RydWN0dXJlKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzaW5nbGUgbm9kZSBzcGVjaWZpZWQgYnkgcGF0aCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBvYmplY3QuCi0JICogSW4gY2FzZSBvZiBhbiBlcnJvciAoZS5nLiBhIHBhcnNpbmcgZXJyb3IpIHRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIDxjb2RlPmdldFN0cnVjdHVyZTwvY29kZT4gYnV0IGluCi0JICogY29udHJhc3QgdG8gPGNvZGU+Z2V0U3RydWN0dXJlPC9jb2RlPiBvbmx5IGEgc2luZ2xlIG5vZGUgd2l0aG91dCBhbnkgY2hpbGRyZW4gbXVzdCBiZSByZXR1cm5lZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSA8Y29kZT5SZXBsYWNlV2l0aEVkaXRpb25EaWFsb2c8L2NvZGU+IHRvIGxvY2F0ZSBhIHN1YiBlbGVtZW50Ci0JICogKGUuZy4gYSBtZXRob2QpIHdpdGhpbiBhbiBpbnB1dCBvYmplY3QgKGUuZy4gYSBmaWxlIGNvbnRhaW5pbmcgc291cmNlIGNvZGUpLgotCSAqIDxwPgotCSAqIE9uZSAobm90IG9wdGltaXplZCkgYXBwcm9hY2ggdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlzIGNhbGxpbmcgPGNvZGU+Z2V0U3RydWN0dXJlKGlucHV0KTwvY29kZT4KLQkgKiB0byBidWlsZCB0aGUgZnVsbCB0cmVlLCBhbmQgdGhlbiBmaW5kaW5nIHRoYXQgbm9kZSB3aXRoaW4gdGhlIHRyZWUgdGhhdCBpcyBzcGVjaWZpZWQKLQkgKiBieSA8Y29kZT5wYXRoPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGUgc3ludGF4IG9mIDxjb2RlPnBhdGg8L2NvZGU+IGlzIG5vdCBzcGVjaWZpZWQsIGJlY2F1c2UgaXQgaXMgdHJlYXRlZCBieSB0aGUgY29tcGFyZSBzdWJzeXN0ZW0KLQkgKiBhcyBhbiBvcGFxdWUgZW50aXR5IGFuZCBpcyBub3QgZnVydGhlciBpbnRlcnByZXRlZC4gQ2xpZW50cyB1c2luZyB0aGlzIGZ1bmN0aW9uYWxpdHkKLQkgKiB3aWxsIHBhc3MgYSB2YWx1ZSBvZiA8Y29kZT5wYXRoPC9jb2RlPiB0byB0aGUgPGNvZGU+c2VsZWN0RWRpdGlvbjwvY29kZT4KLQkgKiBtZXRob2Qgb2YgPGNvZGU+UmVwbGFjZVdpdGhFZGl0aW9uRGlhbG9nPC9jb2RlPiBhbmQgd2lsbCByZWNlaXZlIHRoaXMgdmFsdWUgdW5jaGFuZ2VkCi0JICogYXMgYW4gYXJndW1lbnQgdG8gPGNvZGU+bG9jYXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHNwZWNpZmllcyBhIHN1YiBvYmplY3Qgd2l0aGluIHRoZSBpbnB1dCBvYmplY3QKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgc2luZ2xlIG5vZGUgc3BlY2lmaWVkIGJ5IDxjb2RlPnBhdGg8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuRWRpdGlvblNlbGVjdGlvbkRpYWxvZyNzZWxlY3RFZGl0aW9uCi0JICovCi0JSVN0cnVjdHVyZUNvbXBhcmF0b3IgbG9jYXRlKE9iamVjdCBwYXRoLCBPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIG5vZGUgYXMgYSBzdHJpbmcgZm9yIHRoZSBwdXJwb3NlCi0JICogb2YgcGVyZm9ybWluZyBhIGNvbnRlbnQgY29tcGFyaXNvbiBvbmx5ICh0aGF0IGlzIHRoZSBzdHJpbmcgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgVUkpLgotCSAqIElmIDxjb2RlPmlnbm9yZVdoaXRlc3BhY2U8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+IGFsbCBjaGFyYWN0ZXIgc2VxdWVuY2VzIGNvbnNpZGVyZWQKLQkgKiB3aGl0ZXNwYWNlIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHJldHVybmVkIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gaWdub3JlV2hpdGVzcGFjZSBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgcmV0dXJuZWQgc3RyaW5nIHNob3VsZCBub3QgY29udGFpbiB3aGl0ZXNwYWNlCi0JICogQHJldHVybiB0aGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBub2RlCi0JICovCi0JU3RyaW5nIGdldENvbnRlbnRzKE9iamVjdCBub2RlLCBib29sZWFuIGlnbm9yZVdoaXRlc3BhY2UpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW5ldmVyIGEgY29weSBvcGVyYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIG9uIGEgdHJlZSBub2RlLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgZm9yIHdoaWNoIHRvIHNhdmUgdGhlIG5ldyBjb250ZW50Ci0JICogQHBhcmFtIGlucHV0IHRoZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgc3RydWN0dXJlIHRyZWUgd2FzIGNyZWF0ZWQgaW4gPGNvZGU+Z2V0U3RydWN0dXJlPC9jb2RlPgotCSAqLwotCXZvaWQgc2F2ZShJU3RydWN0dXJlQ29tcGFyYXRvciBub2RlLCBPYmplY3QgaW5wdXQpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL1N0cnVjdHVyZURpZmZWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvU3RydWN0dXJlRGlmZlZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2JjNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvU3RydWN0dXJlRGlmZlZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC4qOwotCi0KLS8qKgotICogQSBkaWZmIHRyZWUgdmlld2VyIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPgotICogdG8gcmV0cmlldmUgYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGZyb20gdGhlIGlucHV0IG9iamVjdCAoYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4pCi0gKiBhbmQgcGVyZm9ybSBhIHR3by13YXkgb3IgdGhyZWUtd2F5IGNvbXBhcmUgb24gaXQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZQotICogdGhpcyBwYWNrYWdlLgotICogPC9wPgotICoKLSAqIEBzZWUgSVN0cnVjdHVyZUNyZWF0b3IKLSAqIEBzZWUgSUNvbXBhcmVJbnB1dAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRGlmZlZpZXdlciBleHRlbmRzIERpZmZUcmVlVmlld2VyIHsKLQkJCi0JcHJpdmF0ZSBEaWZmZXJlbmNlciBmRGlmZmVyZW5jZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZUaHJlZVdheT0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZBbmNlc3RvcklucHV0OwotCXByaXZhdGUgSVR5cGVkRWxlbWVudCBmTGVmdElucHV0OwotCXByaXZhdGUgSVR5cGVkRWxlbWVudCBmUmlnaHRJbnB1dDsKLQkKLQlwcml2YXRlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGZBbmNlc3RvclN0cnVjdHVyZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGZMZWZ0U3RydWN0dXJlOwotCXByaXZhdGUgSVN0cnVjdHVyZUNvbXBhcmF0b3IgZlJpZ2h0U3RydWN0dXJlOwotCQotCXByaXZhdGUgSVN0cnVjdHVyZUNyZWF0b3IgZlN0cnVjdHVyZUNyZWF0b3I7Ci0JcHJpdmF0ZSBJRGlmZkNvbnRhaW5lciBmUm9vdDsKLQlwcml2YXRlIElDb250ZW50Q2hhbmdlTGlzdGVuZXIgZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXI7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmUGFyZW50OwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHZpZXdlciBmb3IgdGhlIGdpdmVuIFNXVCB0cmVlIGNvbnRyb2wgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gdHJlZSB0aGUgdHJlZSBjb250cm9sCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmlld2VyCi0JICovCi0JcHVibGljIFN0cnVjdHVyZURpZmZWaWV3ZXIoVHJlZSB0cmVlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKHRyZWUsIGNvbmZpZ3VyYXRpb24pOwotCQlDb21wb3NpdGUgYz0gdHJlZS5nZXRQYXJlbnQoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSkKLQkJCWZQYXJlbnQ9IChDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSkgYzsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHZpZXdlciB1bmRlciB0aGUgZ2l2ZW4gU1dUIHBhcmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBjb250cm9sIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdmlld2VyCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmlld2VyCi0JICovCi0JcHVibGljIFN0cnVjdHVyZURpZmZWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUpCi0JCQlmUGFyZW50PSAoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUpIHBhcmVudDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCi0JCXNldEF1dG9FeHBhbmRMZXZlbCgzKTsKLQkJCi0JCWZDb250ZW50Q2hhbmdlZExpc3RlbmVyPSBuZXcgSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRlbnRDaGFuZ2VkKElDb250ZW50Q2hhbmdlTm90aWZpZXIgY2hhbmdlZCkgewotCQkJCVN0cnVjdHVyZURpZmZWaWV3ZXIudGhpcy5jb250ZW50Q2hhbmdlZChjaGFuZ2VkKTsKLQkJCX0KLQkJfTsKLQkJbmV3IElDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbXBhcmVJbnB1dENoYW5nZWQoSUNvbXBhcmVJbnB1dCBpbnB1dCkgewotCQkJCVN0cnVjdHVyZURpZmZWaWV3ZXIudGhpcy5jb21wYXJlSW5wdXRDaGFuZ2VkKGlucHV0KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgPGNvZGU+U3RydWN0dXJlRGlmZlZpZXdlcjwvY29kZT4gd2l0aCBhIHN0cnVjdHVyZSBjcmVhdG9yLgotCSAqIFRoZSBzdHJ1Y3R1cmUgY3JlYXRvciBpcyB1c2VkIHRvIGNyZWF0ZSBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUKLQkgKiBmb3IgZWFjaCBzaWRlIG9mIHRoZSB2aWV3ZXIncyBpbnB1dCBlbGVtZW50IG9mIHR5cGUgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3RydWN0dXJlQ3JlYXRvciB0aGUgbmV3IHN0cnVjdHVyZSBjcmVhdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlQ3JlYXRvcihJU3RydWN0dXJlQ3JlYXRvciBzdHJ1Y3R1cmVDcmVhdG9yKSB7Ci0JCWlmIChmU3RydWN0dXJlQ3JlYXRvciAhPSBzdHJ1Y3R1cmVDcmVhdG9yKSB7Ci0JCQlmU3RydWN0dXJlQ3JlYXRvcj0gc3RydWN0dXJlQ3JlYXRvcjsKLQkJCUNvbnRyb2wgdHJlZT0gZ2V0Q29udHJvbCgpOwotCQkJaWYgKHRyZWUgIT0gbnVsbCAmJiAhdHJlZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJdHJlZS5zZXREYXRhKENvbXBhcmVVSS5DT01QQVJFX1ZJRVdFUl9USVRMRSwgZ2V0VGl0bGUoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlIGNyZWF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiBzdHJ1Y3R1cmUgY3JlYXRvciBoYXMgYmVlbiBzZXQgd2l0aCA8Y29kZT5zZXRTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZSBjcmVhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVDcmVhdG9yIGdldFN0cnVjdHVyZUNyZWF0b3IoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlQ3JlYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmVpbXBsZW1lbnRlZCB0byBnZXQgdGhlIGRlc2NyaXB0aXZlIHRpdGxlIGZvciB0aGlzIHZpZXdlciBmcm9tIHRoZSA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvcjwvY29kZT4uCi0JICogQHJldHVybiB0aGUgdmlld2VyJ3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCWlmIChmU3RydWN0dXJlQ3JlYXRvciAhPSBudWxsKQotCQkJcmV0dXJuIGZTdHJ1Y3R1cmVDcmVhdG9yLmdldE5hbWUoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFRpdGxlKCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRkZW4gYmVjYXVzZSB0aGUgaW5wdXQgb2YgdGhpcyB2aWV3ZXIgaXMgbm90IGlkZW50aWNhbCB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KLQkgKiBUaGUgdHJlZSdzIHJvb3QgaXMgYSBJRGlmZkNvbnRhaW5lciB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBtZXRob2QgPGNvZGU+ZGlmZjwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBvZiB0aGUgZGlmZiB0cmVlIHByb2R1Y2VkIGJ5IG1ldGhvZCA8Y29kZT5kaWZmPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIGZSb290OwotCX0KLQkKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuCi0gICAgICogT3ZlcnJpZGRlbiB0byBjcmVhdGUgdGhlIGNvbXBhcmFibGUgc3RydWN0dXJlcyBmcm9tIHRoZSBpbnB1dCBvYmplY3QKLQkgKiBhbmQgdG8gZmVlZCB0aGVtIHRocm91Z2ggdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUuIE5vdGU6IGZvciB0aGlzIHZpZXdlcgotCSAqIHRoZSB2YWx1ZSBmcm9tIDxjb2RlPmdldElucHV0PC9jb2RlPiBpcyBub3QgaWRlbnRpY2FsIHRvIDxjb2RlPmdldFJvb3Q8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgaW5wdXQsIE9iamVjdCBvbGRJbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQljb21wYXJlSW5wdXRDaGFuZ2VkKChJQ29tcGFyZUlucHV0KSBpbnB1dCk7Ci0JCQlpZiAoaW5wdXQgIT0gb2xkSW5wdXQpCi0JCQkJaW5pdGlhbFNlbGVjdGlvbigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxTZWxlY3Rpb24oKSB7Ci0JCWV4cGFuZFRvTGV2ZWwoMik7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIE92ZXJyaWRkZW4gdG8gdW5yZWdpc3RlciBhbGwgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQotCQljb21wYXJlSW5wdXRDaGFuZ2VkKG51bGwpOwotCQkKLQkJZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXI9IG51bGw7Ci0JCQkJCi0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZXMgdGhlIGNvbXBhcmFibGUgc3RydWN0dXJlcyBmb3IgdGhlIGlucHV0IHNpZGVzLgotCSAqIEBwYXJhbSBpbnB1dCB0aGlzIHZpZXdlcidzIG5ldyBpbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBhcmVJbnB1dENoYW5nZWQoSUNvbXBhcmVJbnB1dCBpbnB1dCkgewotCQlJVHlwZWRFbGVtZW50IHQ9IG51bGw7Ci0JCWJvb2xlYW4gY2hhbmdlZD0gZmFsc2U7Ci0JCQotCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCXQ9IGlucHV0LmdldEFuY2VzdG9yKCk7Ci0JCQkKLQkJZlRocmVlV2F5PSAodCAhPSBudWxsKTsKLQkJCi0JCWlmICh0ICE9IGZBbmNlc3RvcklucHV0KSB7Ci0JCQlpZiAoZkFuY2VzdG9ySW5wdXQgaW5zdGFuY2VvZiBJQ29udGVudENoYW5nZU5vdGlmaWVyKQotCQkJCSgoSUNvbnRlbnRDaGFuZ2VOb3RpZmllcilmQW5jZXN0b3JJbnB1dCkucmVtb3ZlQ29udGVudENoYW5nZUxpc3RlbmVyKGZDb250ZW50Q2hhbmdlZExpc3RlbmVyKTsKLQkJCWZBbmNlc3RvcklucHV0PSB0OwotCQkJaWYgKGZBbmNlc3RvcklucHV0ICE9IG51bGwpIHsKLQkJCQlmQW5jZXN0b3JTdHJ1Y3R1cmU9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldFN0cnVjdHVyZShmQW5jZXN0b3JJbnB1dCk7Ci0JCQkJY2hhbmdlZD0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCWZBbmNlc3RvclN0cnVjdHVyZT0gbnVsbDsKLQkJCWlmIChmQW5jZXN0b3JJbnB1dCBpbnN0YW5jZW9mIElDb250ZW50Q2hhbmdlTm90aWZpZXIpCi0JCQkJKChJQ29udGVudENoYW5nZU5vdGlmaWVyKWZBbmNlc3RvcklucHV0KS5hZGRDb250ZW50Q2hhbmdlTGlzdGVuZXIoZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCXQ9IGlucHV0LmdldExlZnQoKTsKLQkJaWYgKHQgIT0gZkxlZnRJbnB1dCkgewotCQkJaWYgKGZMZWZ0SW5wdXQgaW5zdGFuY2VvZiBJQ29udGVudENoYW5nZU5vdGlmaWVyKQotCQkJCSgoSUNvbnRlbnRDaGFuZ2VOb3RpZmllcilmTGVmdElucHV0KS5yZW1vdmVDb250ZW50Q2hhbmdlTGlzdGVuZXIoZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXIpOwotCQkJZkxlZnRJbnB1dD0gdDsKLQkJCWlmIChmTGVmdElucHV0ICE9IG51bGwpIHsKLQkJCQlmTGVmdFN0cnVjdHVyZT0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0U3RydWN0dXJlKGZMZWZ0SW5wdXQpOwotCQkJCWNoYW5nZWQ9IHRydWU7Ci0JCQl9IGVsc2UKLQkJCQlmTGVmdFN0cnVjdHVyZT0gbnVsbDsKLQkJCWlmIChmTGVmdElucHV0IGluc3RhbmNlb2YgSUNvbnRlbnRDaGFuZ2VOb3RpZmllcikKLQkJCQkoKElDb250ZW50Q2hhbmdlTm90aWZpZXIpZkxlZnRJbnB1dCkuYWRkQ29udGVudENoYW5nZUxpc3RlbmVyKGZDb250ZW50Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCQkKLQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQl0PSBpbnB1dC5nZXRSaWdodCgpOwotCQlpZiAodCAhPSBmUmlnaHRJbnB1dCkgewotCQkJaWYgKGZSaWdodElucHV0IGluc3RhbmNlb2YgSUNvbnRlbnRDaGFuZ2VOb3RpZmllcikKLQkJCQkoKElDb250ZW50Q2hhbmdlTm90aWZpZXIpZlJpZ2h0SW5wdXQpLnJlbW92ZUNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihmQ29udGVudENoYW5nZWRMaXN0ZW5lcik7Ci0JCQlmUmlnaHRJbnB1dD0gdDsKLQkJCWlmIChmUmlnaHRJbnB1dCAhPSBudWxsKSB7Ci0JCQkJZlJpZ2h0U3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZlJpZ2h0SW5wdXQpOwotCQkJCWNoYW5nZWQ9IHRydWU7Ci0JCQl9IGVsc2UKLQkJCQlmUmlnaHRTdHJ1Y3R1cmU9IG51bGw7Ci0JCQlpZiAoZlJpZ2h0SW5wdXQgaW5zdGFuY2VvZiBJQ29udGVudENoYW5nZU5vdGlmaWVyKQotCQkJCSgoSUNvbnRlbnRDaGFuZ2VOb3RpZmllcilmUmlnaHRJbnB1dCkuYWRkQ29udGVudENoYW5nZUxpc3RlbmVyKGZDb250ZW50Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCQkKLQkJaWYgKGNoYW5nZWQpCi0JCQlkaWZmKCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmRpZmY8L2NvZGU+IHdoZW5ldmVyIHRoZSBieXRlIGNvbnRlbnRzIGNoYW5nZXMuCi0JICogQHBhcmFtIGNoYW5nZWQgdGhlIG9iamVjdCB0aGF0IHNlbnQgb3V0IHRoZSBub3RpZmljYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250ZW50Q2hhbmdlZChJQ29udGVudENoYW5nZU5vdGlmaWVyIGNoYW5nZWQpIHsKLQkJCi0JCWlmIChmU3RydWN0dXJlQ3JlYXRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWlmIChjaGFuZ2VkICE9IG51bGwpIHsKLQkJCWlmIChjaGFuZ2VkID09IGZBbmNlc3RvcklucHV0KSB7Ci0JCQkJZkFuY2VzdG9yU3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZkFuY2VzdG9ySW5wdXQpOwotCQkJfSBlbHNlIGlmIChjaGFuZ2VkID09IGZMZWZ0SW5wdXQpIHsKLQkJCQlmTGVmdFN0cnVjdHVyZT0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0U3RydWN0dXJlKGZMZWZ0SW5wdXQpOwotCQkJfSBlbHNlIGlmIChjaGFuZ2VkID09IGZSaWdodElucHV0KSB7Ci0JCQkJZlJpZ2h0U3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZlJpZ2h0SW5wdXQpOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJZkFuY2VzdG9yU3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZkFuY2VzdG9ySW5wdXQpOwotCQkJZkxlZnRTdHJ1Y3R1cmU9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldFN0cnVjdHVyZShmTGVmdElucHV0KTsKLQkJCWZSaWdodFN0cnVjdHVyZT0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0U3RydWN0dXJlKGZSaWdodElucHV0KTsKLQkJfQotCQkKLQkJZGlmZigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiA8Y29kZT5kaWZmKCk8L2NvZGU+IGJlZm9yZSB0aGUgZGlmZmVyZW5jZQotCSAqIHRyZWUgaXMgYmVpbmcgYnVpbHQuCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gcHJlLXByb2Nlc3NpbmcuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGFuY2VzdG9yIGlucHV0IHRvIHRoZSBkaWZmZXJlbmNpbmcgb3BlcmF0aW9uCi0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgaW5wdXQgdG8gdGhlIGRpZmZlcmVuY2luZyBvcGVyYXRpb24KLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGlucHV0IHRvIHRoZSBkaWZmZXJlbmNpbmcgb3BlcmF0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZURpZmZIb29rKElTdHJ1Y3R1cmVDb21wYXJhdG9yIGFuY2VzdG9yLCBJU3RydWN0dXJlQ29tcGFyYXRvciBsZWZ0LCBJU3RydWN0dXJlQ29tcGFyYXRvciByaWdodCkgewotCQkvLyB3ZSBkbyBub3RoaW5nIGhlcmUKLQl9Ci0JCi0JLyoqCi0JICogUnVucyB0aGUgZGlmZmVyZW5jZSBlbmdpbmUgYW5kIHJlZnJlc2hlcyB0aGUgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaWZmKCkgewotCQkKLQkJcHJlRGlmZkhvb2soZkFuY2VzdG9yU3RydWN0dXJlLCBmTGVmdFN0cnVjdHVyZSwgZlJpZ2h0U3RydWN0dXJlKTsKLQkJCQkJCQkKLQkJU3RyaW5nIG1lc3NhZ2U9IG51bGw7Ci0JCQotCQlpZiAoKGZUaHJlZVdheSAmJiBmQW5jZXN0b3JTdHJ1Y3R1cmUgPT0gbnVsbCkgfHwgZkxlZnRTdHJ1Y3R1cmUgPT0gbnVsbCB8fCBmUmlnaHRTdHJ1Y3R1cmUgPT0gbnVsbCkgewotCQkJLy8gY291bGQgbm90IGdldCBzdHJ1Y3R1cmUgb2Ygb25lIChvciBtb3JlKSBvZiB0aGUgbGVncwotCQkJZlJvb3Q9IG51bGw7Ci0JCQltZXNzYWdlPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdHJ1Y3R1cmVEaWZmVmlld2VyLlN0cnVjdHVyZUVycm9yIik7CS8vJE5PTi1OTFMtMSQKLQkJCQotCQl9IGVsc2UgewkvLyBjYWxjdWxhdGUgZGlmZmVyZW5jZSBvZiB0aGUgdHdvIChvciB0aHJlZSkgc3RydWN0dXJlcwotCi0JCQlpZiAoZkRpZmZlcmVuY2VyID09IG51bGwpCi0JCQkJZkRpZmZlcmVuY2VyPSBuZXcgRGlmZmVyZW5jZXIoKSB7Ci0JCQkJCXByb3RlY3RlZCBib29sZWFuIGNvbnRlbnRzRXF1YWwoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJCXJldHVybiBTdHJ1Y3R1cmVEaWZmVmlld2VyLnRoaXMuY29udGVudHNFcXVhbChvMSwgbzIpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCBPYmplY3QgdmlzaXQoT2JqZWN0IGRhdGEsIGludCByZXN1bHQsIE9iamVjdCBhbmNlc3RvciwgT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQkJCQkJT2JqZWN0IG89IHN1cGVyLnZpc2l0KGRhdGEsIHJlc3VsdCwgYW5jZXN0b3IsIGxlZnQsIHJpZ2h0KTsKLQkJCQkJCWlmIChmTGVmdElzTG9jYWwgJiYgbyBpbnN0YW5jZW9mIERpZmZOb2RlKQotCQkJCQkJCSgoRGlmZk5vZGUpbykuc3dhcFNpZGVzKGZMZWZ0SXNMb2NhbCk7Ci0JCQkJCQlyZXR1cm4gbzsKLQkJCQkJfQotCQkJCX07Ci0JCQkKLQkJCWZSb290PSAoSURpZmZDb250YWluZXIpIGZEaWZmZXJlbmNlci5maW5kRGlmZmVyZW5jZXMoZlRocmVlV2F5LCBudWxsLCBudWxsLAotCQkJCQlmQW5jZXN0b3JTdHJ1Y3R1cmUsIGZMZWZ0U3RydWN0dXJlLCBmUmlnaHRTdHJ1Y3R1cmUpOwotCQkJCQkKLQkJCWlmIChmUm9vdCA9PSBudWxsIHx8IGZSb290LmdldENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKLQkJCQltZXNzYWdlPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdHJ1Y3R1cmVEaWZmVmlld2VyLk5vU3RydWN0dXJhbERpZmZlcmVuY2VzIik7CS8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcG9zdERpZmZIb29rKGZEaWZmZXJlbmNlciwgZlJvb3QpOwotCQkJfQotCQl9Ci0JCWlmIChmUGFyZW50ICE9IG51bGwpCi0JCQlmUGFyZW50LnNldFRpdGxlQXJndW1lbnQobWVzc2FnZSk7Ci0JCQkKLQkJcmVmcmVzaChnZXRSb290KCkpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gPGNvZGU+ZGlmZigpPC9jb2RlPiBhZnRlciB0aGUgZGlmZmVyZW5jZQotCSAqIHRyZWUgaGFzIGJlZW4gYnVpbHQuCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gcG9zdC1wcm9jZXNzaW5nLgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0JICogQHBhcmFtIGRpZmZlcmVuY2VyIHRoZSBkaWZmZXJlbmNlciB1c2VkIHRvIHBlcmZvcm0gdGhlIGRpZmZlcmVuY2luZwotCSAqIEBwYXJhbSByb290IHRoZSBub24tPGNvZGU+bnVsbDwvY29kZT4gcm9vdCBub2RlIG9mIHRoZSBkaWZmZXJlbmNlIHRyZWUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdERpZmZIb29rKERpZmZlcmVuY2VyIGRpZmZlcmVuY2VyLCBJRGlmZkNvbnRhaW5lciByb290KSB7Ci0JCS8vIHdlIGRvIG5vdGhpbmcgaGVyZQotCX0KLQkKLQkvKgotCSAqIFBlcmZvcm1zIGEgYnl0ZSBjb21wYXJlIG9uIHRoZSBnaXZlbiBvYmplY3RzLgotCSAqIENhbGxlZCBmcm9tIHRoZSBkaWZmZXJlbmNlIGVuZ2luZS4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN0cnVjdHVyZSBjcmVhdG9yIGhhcyBiZWVuIHNldC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGVudHNFcXVhbChPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpZiAoZlN0cnVjdHVyZUNyZWF0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBpZ25vcmVXaGl0ZVNwYWNlPSBVdGlsaXRpZXMuZ2V0Qm9vbGVhbihnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpLCBDb21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV0hJVEVTUEFDRSwgZmFsc2UpOwkJCi0JCQlTdHJpbmcgczE9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldENvbnRlbnRzKG8xLCBpZ25vcmVXaGl0ZVNwYWNlKTsKLQkJCVN0cmluZyBzMj0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0Q29udGVudHMobzIsIGlnbm9yZVdoaXRlU3BhY2UpOwotCQkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gczEuZXF1YWxzKHMyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNrcyBwcm9wZXJ0eSBjaGFuZ2VzIG9mIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdC4KLQkgKiBDbGllbnRzIG1heSBvdmVycmlkZSB0byB0cmFjayB0aGVpciBvd24gcHJvcGVydHkgY2hhbmdlcy4KLQkgKiBJbiB0aGlzIGNhc2UgdGhleSBtdXN0IGNhbGwgdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICogQHBhcmFtIGV2ZW50IHRoZSBwcm9wZXJ0eSBjaGFuZ2VkIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjYWxsIHRvIHRoaXMgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcga2V5PSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQlpZiAoa2V5LmVxdWFscyhDb21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV0hJVEVTUEFDRSkpCi0JCQlkaWZmKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQl9Ci0JCQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gY2FsbCB0aGUgPGNvZGU+c2F2ZTwvY29kZT4gbWV0aG9kIG9uIHRoZSBzdHJ1Y3R1cmUgY3JlYXRvciBhZnRlcgotCSAqIG5vZGVzIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSBvbmUgc2lkZSB0byB0aGUgb3RoZXIgc2lkZSBvZiBhbiBpbnB1dCBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gbGVmdFRvUmlnaHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGxlZnQgc2lkZSBpcyBjb3BpZWQgdG8gdGhlIHJpZ2h0IHNpZGUuCi0JICogSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSByaWdodCBzaWRlIGlzIGNvcGllZCB0byB0aGUgbGVmdCBzaWRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVNlbGVjdGVkKGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJc3VwZXIuY29weVNlbGVjdGVkKGxlZnRUb1JpZ2h0KTsKLQkJCi0JCWlmIChmU3RydWN0dXJlQ3JlYXRvciAhPSBudWxsKQotCQkJZlN0cnVjdHVyZUNyZWF0b3Iuc2F2ZSgKLQkJCQkJCQlsZWZ0VG9SaWdodCA/IGZSaWdodFN0cnVjdHVyZSA6IGZMZWZ0U3RydWN0dXJlLAotCQkJCQkJCWxlZnRUb1JpZ2h0ID8gZlJpZ2h0SW5wdXQgOiBmTGVmdElucHV0KTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjU3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luTlQ7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIGZpbmRpbmcgYW5kIGRpc3BsYXlpbmcgdGhlIGRpZmZlcmVuY2VzCi1iZXR3ZWVuIGhpZXJhcmNoaWNhbGx5IHN0cnVjdHVyZWQgZGF0YS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci0KLVRoZSBjbGFzcyA8Yj5EaWZmZXJlbmNlcjwvYj4gaXMgYSBkaWZmZXJlbmNpbmcgZW5naW5lIGZvciBoaWVyYXJjaGljYWxseQotc3RydWN0dXJlZCBkYXRhLiBJdCB0YWtlcyB0d28gb3IgdGhyZWUgaW5wdXRzIGFuZCBwZXJmb3JtcyBhIHR3by13YXkgb3IKLXRocmVlLXdheSBjb21wYXJlIG9uIHRoZW0uCi08cD4KLQotSWYgdGhlIGlucHV0IGVsZW1lbnRzIHRvIHRoZSBkaWZmZXJlbmNpbmcgZW5naW5lIGltcGxlbWVudCB0aGUgPGI+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2I+Ci1pbnRlcmZhY2UgdGhlIGVuZ2luZSByZWN1cnNpdmVseSBhcHBsaWVzIGl0c2VsZiB0byB0aGUgY2hpbGRyZW4gb2YKLXRoZSBpbnB1dCBlbGVtZW50LiBMZWFmIGVsZW1lbnRzIG11c3QgaW1wbGVtZW50IHRoZSA8Yj5vcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2I+Ci1pbnRlcmZhY2Ugc28gdGhhdCB0aGUgZGlmZmVyZW5jZXIgY2FuIHBlcmZvcm0gYSBieXRld2lzZSBjb21wYXJpc29uIG9uIHRoZWlyIGNvbnRlbnRzLgotPHA+Ci0KLU9uZSBnb29kIGV4YW1wbGUgZm9yIHRoaXMgaXMgPGI+b3JnLmVjbGlwc2UuY29tcGFyZS5SZXNvdXJjZU5vZGU8L2I+IHdoaWNoIGltcGxlbWVudHMgYm90aCBpbnRlcmZhY2VzCi0oYW5kIG1vcmUpIGZvciBFY2xpcHNlIHdvcmtzcGFjZSByZXNvdXJjZXMgKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSkuCi08cD4KLQotQW5vdGhlciBleGFtcGxlIGlzIHRoZSA8Yj5Eb2N1bWVudFJhbmdlTm9kZTwvYj4gd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29tcGFyZSBoaWVyYXJjaGljYWwgc3RydWN0dXJlcwotdGhhdCBhcmUgc3VwZXJpbXBvc2VkIG9uIGEgZG9jdW1lbnQsIHRoYXQgaXMgd2hlcmUgbm9kZXMgYW5kIGxlYWZzIGNvcnJlc3BvbmQgdG8gcmFuZ2VzIGluIGEgZG9jdW1lbnQKLSg8Yj5vcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5JRG9jdW1lbnRSYW5nZTwvYj4pLgotPGJyPgotVHlwaWNhbGx5IDxiPkRvY3VtZW50UmFuZ2VOb2RlPC9iPnMgYXJlIGNyZWF0ZWQgd2hpbGUgcGFyc2luZyBhIGRvY3VtZW50IGFuZCB0aGV5IHJlcHJlc2VudAotdGhlIHNlbWFudGljIGVudGl0aWVzIG9mIHRoZSBkb2N1bWVudCAoZS5nLiBhIEphdmEgY2xhc3MsIG1ldGhvZCBvciBmaWVsZCkuCi1UaGUgdHdvIHN1YmNsYXNzZXMgPGI+SmF2YU5vZGU8L2I+IChpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuY29tcGFyZSkKLWFuZCA8Yj5Qcm9wZXJ0eU5vZGU8L2I+IChpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuY29tcGFyZSkgYXJlIGdvb2QgZXhhbXBsZXMgZm9yIHRoaXMuCi08cD4KLQotQnkgZGVmYXVsdCB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uCi1hcyBhIHRyZWUgb2YgPGI+RGlmZk5vZGU8L2I+IG9iamVjdHMuIEhvd2V2ZXIsIHRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgb3ZlcnJpZGluZwotYSBzaW5nbGUgbWV0aG9kIG9mIHRoZSBlbmdpbmUuCi08cD4KLQotRXZlcnkgPGI+RGlmZk5vZGU8L2I+IGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBhbW9uZyB0aGUgdHdvIG9yIHRocmVlIGlucHV0cy4KLTxwPgotCi1BIHRyZWUgb2YgPGI+RGlmZk5vZGVzPC9iPiBjYW4gYmUgZGlzcGxheWVkIGluIGEgPGI+RGlmZlRyZWVWaWV3ZXI8L2I+LgotVGhlIDxiPkRpZmZUcmVlVmlld2VyPC9iPiByZXF1aXJlcyB0aGF0IGlubmVyIG5vZGVzIG9mIHRoZSB0cmVlIGltcGxlbWVudAotdGhlIDxiPklEaWZmQ29udGFpbmVyPC9iPiBpbnRlcmZhY2UgYW5kIGxlYWZzIHRoZSA8Yj5JRGlmZkVsZW1lbnQ8L2I+IGludGVyZmFjZS4KLTxwPgotCi1UaGUgdHlwaWNhbCBzdGVwcyB0byBjb21wYXJlIGhpZXJhcmNoaWNhbGx5IHN0cnVjdHVyZWQgZGF0YSBhbmQgdG8gZGlzcGxheQotdGhlIGRpZmZlcmVuY2VzIHdvdWxkIGJlIHRvOgotPHVsPgotPGxpPgotbWFwIHRoZSBpbnB1dCBkYXRhIGludG8gYSB0cmVlIG9mIDxiPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9iPiBhbmQgPGI+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvYj5zLDwvbGk+Ci0KLTxsaT4KLXBlcmZvcm0gdGhlIGNvbXBhcmUgb3BlcmF0aW9uIGJ5IG1lYW5zIG9mIHRoZSA8Yj5EaWZmZXJlbmNlcjwvYj4sIGFuZDwvbGk+Ci0KLTxsaT4KLWZlZWQgdGhlIGRpZmZlcmVuY2luZyByZXN1bHQgaW50byB0aGUgPGI+RGlmZlRyZWVWaWV3ZXI8L2I+LjwvbGk+Ci0KLTwvdWw+Ci0KLVRoZSA8Yj5TdHJ1Y3R1cmVEaWZmVmlld2VyPC9iPiBpcyBhIHNwZWNpYWxpemVkIDxiPkRpZmZUcmVlVmlld2VyPC9iPgotdGhhdCBhdXRvbWF0ZXMgdGhlIHRocmVlIHN0ZXBzIGZyb20gYWJvdmUuIEl0IHRha2VzIGEgc2luZ2xlIGlucHV0IG9iamVjdAotb2YgdHlwZSA8Yj5JQ29tcGFyZUlucHV0PC9iPiBmcm9tIHdoaWNoIGl0IHJldHJpZXZlcyB0aGUgdHdvIG9yIHRocmVlCi1pbnB1dCBlbGVtZW50cyB0byBjb21wYXJlLiBUaGVuIGl0IHVzZXMgYSA8Yj5JU3RydWN0dXJlQ3JlYXRvcjwvYj4gdG8KLWV4dHJhY3QgYSB0cmVlIG9mIDxiPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9iPiBhbmQgPGI+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvYj4KLWZyb20gdGhlbS4gVGhlc2UgdHJlZXMgYXJlIHRoZW4gY29tcGFyZWQgd2l0aCB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSBhbmQKLXRoZSByZXN1bHQgaXMgZGlzcGxheWVkIGluIHRoZSB0cmVlIHZpZXdlci4KLTxwPgotCi0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvYW5jZXN0b3JwYW5lX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyMTgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvYW5jZXN0b3JwYW5lX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHlfbF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MmUyYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHlfbF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvY29weV9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5X3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I0MmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5X3JfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHljb250X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHljb250X2xfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjUzOWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5Y29udF9sX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5Y29udF9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5Y29udF9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2YWJlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvY29weWNvbnRfcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvbmV4dF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L25leHRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhY2Y5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvbmV4dF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3ByZXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9wcmV2X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODQxYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3ByZXZfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9zbWFydG1vZGVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3NtYXJ0bW9kZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGFjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3NtYXJ0bW9kZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvc3luY3BhbmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNwYW5lX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhNDgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvc3luY3BhbmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2RlZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi90d293YXljb21wYXJlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2R0b29sMTYvY29uZmxpY3RfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbmZsaWN0X2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThjNzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2R0b29sMTYvY29uZmxpY3RfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kdG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZHRvb2wxNi9pZ25vcmV3c19lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyZjBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kdG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvYW5jZXN0b3JwYW5lX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwNjg1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvYW5jZXN0b3JwYW5lX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHlfbF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjk5NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHlfbF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvY29weV9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5X3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU5ODEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5X3JfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHljb250X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHljb250X2xfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjJiMWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5Y29udF9sX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5Y29udF9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5Y29udF9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViZDUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvY29weWNvbnRfcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvbmV4dF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L25leHRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyYjE4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvbmV4dF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3ByZXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9wcmV2X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MWU4ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3ByZXZfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9zbWFydG1vZGVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3NtYXJ0bW9kZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmRkZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3NtYXJ0bW9kZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvc3luY3BhbmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNwYW5lX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NGMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvc3luY3BhbmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjc4OGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi90d293YXljb21wYXJlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V0b29sMTYvY29uZmxpY3RfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbmZsaWN0X2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGE3ZDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V0b29sMTYvY29uZmxpY3RfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9ldG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXRvb2wxNi9pZ25vcmV3c19lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyMmU0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9ldG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXZpZXcxNi9jb21wYXJlX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXZpZXcxNi9jb21wYXJlX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzU0OWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V2aWV3MTYvY29tcGFyZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL29iajE2L2RheV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb2JqMTYvZGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb2JqMTYvZGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vYmoxNi9yZXNvdXJjZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb2JqMTYvcmVzb3VyY2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkNGUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vYmoxNi9yZXNvdXJjZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvYWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2FkZF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjNhMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvYWRkX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jaGdfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiOGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NoZ19vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jb25mYWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NvbmZhZGRfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEwMWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NvbmZhZGRfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY29uZmNoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jb25mY2hnX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4MDVmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jb25mY2hnX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NvbmZkZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY29uZmRlbF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MGMwZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY29uZmRlbF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9kZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvZGVsX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMjA3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9kZWxfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQzYTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2luYWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2luYWRkX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhOWY1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9pbmFkZF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9pbmNoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9pbmNoZ19vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZDRhOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvaW5jaGdfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvaW5kZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvaW5kZWxfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzNhNjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2luZGVsX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L291dGFkZF9vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9vdXRhZGRfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZiMjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L291dGFkZF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9vdXRjaGdfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvb3V0Y2hnX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzMjFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9vdXRjaGdfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvb3V0ZGVsX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L291dGRlbF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODJlNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvb3V0ZGVsX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3JfaW5hZGRfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9pbmFkZF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzBjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9pbmFkZF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX2luY2hnX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3JfaW5jaGdfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzMwYzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3JfaW5jaGdfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9pbmRlbF9vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX2luZGVsX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjYWI2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX2luZGVsX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3Jfb3V0YWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3Jfb3V0YWRkX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2MDc2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX291dGFkZF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX291dGNoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX291dGNoZ19vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YmExYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9vdXRjaGdfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9vdXRkZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9vdXRkZWxfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjZiOGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3Jfb3V0ZGVsX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL3dpemJhbi9hcHBseXBhdGNoX3dpemJhbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC93aXpiYW4vYXBwbHlwYXRjaF93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2YwYzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL3dpemJhbi9hcHBseXBhdGNoX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvb2xkX2J1aWxkbm90ZXNfY29tcGFyZV8zXzAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9vbGRfYnVpbGRub3Rlc19jb21wYXJlXzNfMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM0M2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9vbGRfYnVpbGRub3Rlc19jb21wYXJlXzNfMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luTlQ7IFUpIFtOZXRzY2FwZV0iPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPHRpdGxlPkVjbGlwc2UgUGxhdGZvcm0gUmVsZWFzZSBOb3RlcyAtIERlc2t0b3A8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+IAotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQ29tcGFyZTwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgMTd0aCAyMDA0IChSQzMpCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3NjQ4Ij4zNzY0ODwvYT46IEV4Y2VwdGlvbnMgYWZ0ZXIgb25lIG9mIHRoZSBjb21wYXJlIHZpZXdlciBpbnB1dHMgZ290IGRlbGV0ZWQ8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAxMXRoIDIwMDQgKFJDMikKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NjAiPjY1NDYwPC9hPjogSW1wcm92ZSBlbmNvZGluZyBmYWxsIGJhY2sgYmVoYXZpb3IgZm9yIEhpc3RvcnlJdGVtczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE5OTgiPjYxOTk4PC9hPjogYmFkIGlkZWEgdG8gc3ViY2xhc3MgRXJyb3IgZm9yIG9yZGluYXJ5IGV4Y2VwdGlvbnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5MjMyIj41OTIzMjwvYT46IERCQ1M6IGNvbXBhcmUgaW1wcm9wZXJseSBpbiBFVUMtSlAgZW5jb2RpbmcgcHJvamVjdCBvbiB3b3JrYmVuY2ggZW5jb2RpbmcgTVM5MzI8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1NTE1Ij42NTUxNTwvYT46IExvY2FsIEhpc3RvcnkgYWx3YXlzIHNheXMgIlBhcnNpbmcgRXJyb3I7IG5vIHN0cnVjdHVyZWQgUmVwbGFjZSBBdmFpbGFibGUiPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTMzMyI+NTUzMzM8L2E+OiBOUEUgaW4gVGV4dE1lcmdlVmlld2VyLmludGVycG9sYXRlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTg3NiI+NTU4NzY8L2E+OiBWaWV3ZXI6IFRleHQgbm90IHJlcGFpbnRlZCB3aGVuIG1vdmluZyBzYXNoIGFuZCB0aGVuIGNsaWNraW5nIG9uIHNjcm9sbCBiYXJzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTIwNSI+NjUyMDU8L2E+OiBDb21wYXJlIGVkaXRvciBkb2Vzbid0IHVwZGF0ZSBjb3JyZWN0bHkgd2hpbGUgc2Nyb2xsaW5nPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjU0NSI+NjI1NDU8L2E+OiBiaW5hcnkgY29tcGFyZSB0ZXh0IGluc2VydGlvbiBjdXJzb3IgaXMgdmVyeSBsYXJnZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTY4NzUiPjU2ODc1PC9hPjogUmVzaXppbmcgQXBwbHkgUGF0Y2ggZGlhbG9nIGRvZXNuJ3QgcmVzaXplIHRyZWU8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ3NjQwIj40NzY0MDwvYT46IE1vdmUgcmlnaHQgdG8gbGVmdCBtaXNwbGFjZWQgdGhlIG1vdmVkIHRleHQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2MjcyIj42NjI3MjwvYT46IHJlbW92ZSBwYWNrYWdlcyBwcmVmaXhlcyB0YWcgZnJvbSBwbHVnaW4ueG1sPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDYxNyI+NjQ2MTc8L2E+OiBOb3QgcHJvbXB0ZWQgdG8gc2F2ZSBkaXJ0eSBjb21wYXJlIGVkaXRvcjxicj4KLQotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1heSAyOHRoIDIwMDQgKFJDMSkKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNTYiPiM2MjM1NjwvYT46IFVzZSBwcm9ncmVzcyBzZXJ2aWNlIHdoZW4gcnVubmluZyBjb21wYXJlIGlucHV0PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDUwNSI+IzY0NTA1PC9hPjogUmVtb3ZlIHVudXNlZCBjbGFzcyBDb2xvckVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM2MTAiPiM2MzYxMDwvYT46IENvbG9ycyBhbmQgRm9udHM6IFRleHQgQ29tcGFyZSBBcHBlYXJhbmNlIC0mZ3Q7IFRleHQgQ29tcGFyZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE5OTYiPiM2MTk5NjwvYT46IGJhZCBpZGVhIHRvIHN1YmNsYXNzIEVycm9yIGZvciBvcmRpbmFyeSBleGNlcHRpb25zPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzYwOCI+IzYzNjA4PC9hPjogTWlncmF0ZSB0byBpbXByb3ZlZCBtb2RhbCBwcm9ncmVzcyBzdXBwb3J0PGJyPgotCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDExdGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotYWRkZWQgMy4wIHRhZyB0byBzdHJlYW1NZXJnZXJzIHNjaGVtYSBmaWxlPGJyPgotdXBkYXRlZCBhcnR3b3JrPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1heSA0dGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDM4MyI+IzYwMzgzPC9hPjogQ29weSBBbGwgbm9uLWNvbmZsaWN0aW5nIGNoYW5nZXMgZnJvbSByaWdodC10by1sZWZ0IGVyYXNlIGxlZnQtdG8tcmlnaHQgY2hhbmdlcyEhITxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkyNzMiPiM1OTI3MzwvYT46IHRhcmdldCBUZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yIG5vdCBmb3VuZDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBBcHJpbCAyN3RoIDIwMDQKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA5MTQiPiM1MDkxNDwvYT46IEFwcGx5IFBhdGNoIGRpYWxvZyBkb2Vzbid0IGluaXRpYWxpemUgZmlsZSBicm93c2UgZGlhbG9nPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEFwcmlsIDIwdGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDA5MSI+IzU0MDkxPC9hPjogQWxsb3cgaGVhZGxlc3MgZGlmZiBhbmQgbWVyZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNzkxIj4jNTE3OTE8L2E+OiBBbGxvdyBiaW5kaW5nIGZpbGVuYW1lcyB0byBjb21wYXJlIGV4dGVuc2lvbnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMjYxIj4jNTIyNjE8L2E+OiBEaWZmTm9kZSBpcyBtaXNzaW5nIHNldEFuY2VzdG9yKCk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5MjA0Ij4jNTkyMDQ8L2E+OiBOUEUgaW4gQ29tcGFyZVVJUGx1Z2luJENvbXBhcmVSZWdpc3RyeS5zZWFyY2goLi4uKTxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBBcHJpbCAxM3RoIDIwMDQKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLW5ldyBhcnR3b3JrCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggMjNyZCAyMDA0IChNOCkKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5MTQiPiMyMDkxNDwvYT46IENvbG9yaXplZCBEaWZmL2NvbXBhcmUgb3V0cHV0PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTM0OCI+IzU1MzQ4PC9hPjogTlBFIGluIFRleHRNZXJnZVZpZXdlci5pbnRlcnBvbGF0ZTxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCA5dGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mzc1NCI+IzUzNzU0PC9hPjogUHJvdmlkZSBhIHJlc2l6ZSBhZmZvcmRhbmNlIGluIHRoZSBzaWRlIGJ5IHNpZGUgY29tcGFyZSBwYXJ0PGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDJ0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQyNzMxIj4jNDI3MzE8L2E+OiBTeW5jaHJvbml6ZSBob3Jpem9udGFsIHNjcm9sbGluZyBpbiBjb21wYXJlIGVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3OCI+IzIyNzg8L2E+OiBEQ1I6IFdvdWxkIGxpa2UgY291cGxlZCBob3Jpem9udGFsIHNjcm9sbGluZyBpbiBjb21wYXJlIGJyb3dzZXIgKDFHRUpOSE8pPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzM2OCI+IzUzMzY4PC9hPjogTGF5b3V0IHByb2JsZW0gd2l0aCBmb2N1cyByaW5nPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDE3dGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTU5MyI+IzUxNTkzPC9hPjogQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGF0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2guUGF0Y2hXaXphcmQuc2V0VGFyZ2V0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTIwNTUiPiM1MjA1NTwvYT46IE1ldGhvZCBjb21wYXJlIGlzIGJyb2tlbjxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSAxMHRoIDIwMDQgKE03KQotCi08aDI+Ci1BUEkgQWRkaXRpb25zPC9oMj4KLUFkZGVkIG5ldyBpbnRlcmZhY2UgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3I7IGRlcHJlY2F0ZWQgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvckV4dGVuc2lvbjI8YnI+Ci1BZGRlZCBmaXJzdCBjdXQgb2Ygb3V0bGluZSB2aWV3IHN1cHBvcnQuCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSAyN3RoIDIwMDQKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NjUiPiM1MDU2NTwvYT46IFtQcmVmZXJlbmNlc10gUHJlZiBwYWdlIFdvcmtiZW5jaC9Db21wYXJlL1BhdGNoOyBubyBtbmVtb25pYyBmb3IgIkZpbHRlcmVkIE1lbWJlcnMiPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgMTN0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5Njk1Ij4jNDk2OTU8L2E+OiBBcHBseSBQYXRjaCB3aXphcmQgaXMgbGVha2luZyA3IEltYWdlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk4MDMiPiM0OTgwMzwvYT46IFJlcGxhY2Ugd2l0aCBsb2NhbCBoaXN0b3J5IGxlYWtzIDIgaW1hZ2VzPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgNnRoIDIwMDQKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMjkiPiMzMjMyOTwvYT46IFN1cHBvcnQgZmlsdGVycyBmb3IgY29tcGFyZTxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBEZWNlbWJlciAxOHRoIChNNikgMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00Nzg2NiI+IzQ3ODY2PC9hPjogSW50ZXJuYWwgZXJyb3IgaW4gc3luY2hyb25pemUgcGVyc3BlY3RpdmU8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ1MjM5Ij4jNDUyMzk8L2E+OiBTaG93IGFuY2VzdG9yIGZvciBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY2hhbmdlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDE4MTUiPiM0MTgxNTwvYT46IEludGVybmFsIGVycm9yIGNvbXBhcmluZyB3aXRoIHJlcG9zaXRvcnk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ2NzA5Ij4jNDY3MDk8L2E+OiBQYXRjaFdpemFyZCBzaG91bGQgdXNlIHNjaGVkdWxpbmcgcnVsZSBvbiBwcm9qZWN0PGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE5vdmVtYmVyIDI1dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotcmVtb3ZlZCB1c2Ugb2YgZGVwcmVjYXRlZCBzeW1ib2xzCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTm92ZW1iZXIgMTl0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ2ODA1Ij4jNDY4MDU8L2E+OiBwcmVwYXJlIENvbXBhcmUgZm9yIGVuY29kaW5nIHN1cHBvcnQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ2ODc3Ij4jNDY4Nzc8L2E+OiBSZW1vdmUgZGVwZW5kYW5jaWVzIG9uIFhlcmNlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDY5NzciPiM0Njk3NzwvYT46IENvbXBhcmluZy9tZXJnaW5nIHR3byBsb2NhbCBmaWxlcyBzY3Jld3MgdXAgdGhlIGNvbnRlbnQ8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgQXVndXN0IDI2dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00MDcyNyI+IzQwNzI3PC9hPjogQWxsb3cgbmF2aWdhdGlvbiB3b3JrZmxvdyBjb250cm9sIGZyb20gb3RoZXIgdmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3NzAiPiMzODc3MDwvYT46IENvbXBhcmVFZGl0b3Igc2hvdWxkIGltcGxlbWVudCBJUmV1c2FibGVFZGl0b3I8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM5NzU3Ij4jMzk3NTc8L2E+OiBTb21lIGNvbXBhcmUgb3BlcmF0aW9ucyBmYWlsIG9uIHJlc291cmNlcyB0aGF0IGRvIG5vdCBleGlzdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUzODAiPiMzNTM4MDwvYT46IFJlcGxhY2Ugd2l0aCBMb2NhbCBIaXN0b3J5IGFuZCByZWFkLW9ubHkgcmVzb3VyY2VzPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bHkgMTV0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4ODM2Ij4jMzg4MzY8L2E+OiBDb21wYXJlRWRpdG9ySW5wdXQgY2xlYXJzIGRpcnR5IHN0YXRlIHRvbyBxdWlja2x5PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODc3MCI+IzM4NzcwPC9hPjogQ29tcGFyZUVkaXRvciBzaG91bGQgaW1wbGVtZW50IElSZXVzYWJsZUVkaXRvcjxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdWx5IDFzdCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4ODA4Ij4jMzg4MDg8L2E+OiBOUEUgaW4gbG9nIGZpbGUgd2hlbiByZXN0b3JpbmcgZmlsZXMgZnJvbSBoaXN0b3J5Ljxicj4KLWZpeGVkIG1pbm9yIGVycm9yIGluIHNjaGVtYSBmaWxlcwotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgMjR0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NzcwIj4jMzg3NzA8L2E+OiBDb21wYXJlRWRpdG9yIHNob3VsZCBpbXBsZW1lbnQgSVJldXNhYmxlRWRpdG9yPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgMTB0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NzEzIj4jMzg3MTM8L2E+OiBDb21wYXJlIHdpdGggLT4gRWFjaCBvdGhlciBpcyBub3QgZW5hYmxlZDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDNyZCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3NTMxIj4jMzc1MzE8L2E+OiB0aGUgamF2YWRvYyBvZiBDb21wYXJlVmlld2VyUGFuZS5zZXRJbWFnZShJbWFnZSk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4MjYyIj4jMzgyNjI8L2E+OiBBcHBseSBwYXRjaCBhcHBsaWVzIHVuY2hlY2tlZCBjaGFuZ2VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNjM5OSI+IzM2Mzk5PC9hPjogQ29tcGFyZSBkaWQgcmV0cmlldmUgZW50aXJlIHJlbW90ZSBaSVAgY29udGVudHMgb24gc2VsZWN0aW9uIGNoYW5nZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzgxOTgiPiMzODE5ODwvYT46IFRWVDIxOiAgU3RyaW5ncyBhcmUgbm90IGV4dGVybmFsaXplZDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYWkgMjd0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3ODQ5Ij4jMzc4NDk8L2E+OiAiSWdub3JlIHdoaXRlc3BhY2UiIGlnbm9yZXMgYWxzbyBjbG9zaW5nIGJyYWNrZXRzPyE/PGJyPgotCi1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzc1ODIiPiMzNzU4MjwvYT46IElnbm9yZSB3aGl0ZXNwYWNlIG9wdGlvbiBzaG91bGQgYmUgYSBidXR0b24gaW4gdGhlIGNvbXBhcmUgZWRpdG9yPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDI3dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotRml4ZWQgNSBKYXZhZG9jIHdhcm5pbmdzCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggMjR0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1VcGRhdGVkIHNjaGVtYSBjb3B5cmlnaHQgbm90aWNlczxicj4KLXVwZGF0ZWQgamF2YWRvYwotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDE5dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotRml4ZWQgd29yZGluZyBpbiBwcm9wZXJ0aWVzIGZpbGVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTEzMCI+IzM1MTMwPC9hPjogRGlhbG9ncyBkbyBub3Qgc2V0IHRoZSBkaWFsb2cgZm9udDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCAxNHRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MzIiPiMzNDczMjwvYT46IENvbXBhcmUvUGF0Y2ggcHJlZmVyZW5jZSBwYWdlIG1uZW1vbmljPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDY5NiI+IzM0Njk2PC9hPjogVGl0bGUgY2FzaW5nIGlzc3Vlczxicj4KLQotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDZ0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDA1Ij4jMjc0MDU8L2E+OiBTaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIG5ldyBmb250IHByb3BvZ2F0aW9uIHN1cHBvcnQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjU1Ij4jMjQyNTU8L2E+OiBJbnRlcm5hbCBlcnJvciB3aGVuIGludm9raW5nICJSZXN0b3JlIGZyb20gTG9jYWwgSGlzdG9yeSIgaW4gT3V0bGluZSB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjczNyI+IzMyNzM3PC9hPjogTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb246IENvbXBhcmUvcGF0Y2ggcHJlZmVyZW5jZSBwYWdlPGJyPgotCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggNHRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3NjkiPiMzMjc2OTwvYT46IE1pc3NpbmcgbW5ldW1vbmljIGluIGNvbXBhcmUgcHJlZmVyZW5jZSBwYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjc5OCI+IzMyNzk4PC9hPjogTm8gbW5lbW9uaWMgZm9yIENvbXBhcmVQcmVmZXJlbmNlUGFnZS51c2VTaW5nbGVMaW5lLmxhYmVsPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIwNyI+IzMyMjA3PC9hPjogV29yZGluZzogIk9wZW4gd2l0aCBDb21wYXJlIEVkaXRvciIgYWN0aW9uIGluIHN5bmMgdmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgxOTAiPiMyODE5MDwvYT46IE1pZGRsZSBhcmVhIHNob3VsZCBhY3QgbGlrZSBzYXNoPGJyPgotYWRkZWQgcmVxdWlyZWQgSURzIGZvciBjb21wYXJlIHZpZXdlcnMgaW4gcGx1Z2luLnhtbDxicj4KLQotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDIwdGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDI0OCI+IzIwMjQ4PC9hPjogW0NvbXBhcmVdIEhhdmUgdG8gcGVyZm9ybSB0d28gYWN0aW9ucyB0byBzZWUgZGlmZjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQxNjUiPiMyNDE2NTwvYT46IFNob3VsZCBoYXZlIG1lbnUgYWN0aW9uIGZvciBzaG93aW5nIGNvbXBhcmUgY29udGVudHM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzMyIj4jMTMzMzI8L2E+OiBhdXRvc2F2ZSBiZWZvcmUgcGF0Y2hpbmc6IGNhbiBpIHVuZG8/PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDA3NyI+IzI0MDc3PC9hPjogQ29tcGFyaW5nIGZpbGUgbmFtZWQgJ3BsYXRmb3JtT3B0aW9uJyBkb2VzIG5vdCB1c2UgdGV4dCBlZGl0b3I8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTU4Ij4jMjM5NTg8L2E+OiBOUEUgaW4gY29tcGFyZSB3aXRoIHBhdGNoPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODQwMiI+IzI4NDAyPC9hPjogQ29tcGFyZUNvbmZpZ3VyYXRpb24gbGVha3MgSW1hZ2VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg0NCI+IzEzODQ0PC9hPjogVGV4dE1lcmdlVmlld2VyIHNob3VsZCBrZWVwIHRyYWNrIG9mIGl0cyBwb3N0ZWQgcnVubmFibGVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM1MyI+IzE0MzUzPC9hPjogQ2Fubm90IHBlcmZvcm0gbWVyZ2Ugd2l0aCBrZXlib2FyZCBhY2NlbGVyYXRvcnMvbW5lbW9uaWNzPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDE4dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzIzIj4jNTMyMzwvYT46IENvbXBhcmUgZG9lcyBub3QgaGFuZGxlIGNvcnJlY3RseSBjb25mbGljdHMgYXQgc2FtZSBsb2NhdGlvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwMzUiPiMyNjAzNTwvYT46IExvY2FsIGhpc3RvcnkgdXNlcyB3cm9uZyBjaGFyYWN0ZXIgZW5jb2Rpbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjU0Ij4jMTU2NTQ8L2E+OiBDYW4ndCBtYXhpbWl6ZSBDb21wYXJlIHdpdGggTG9jYWwgSGlzdG9yeSB3aW5kb3c8YnI+Ci0KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSAxM3RoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExMzYiPiMzMTEzNjwvYT46IFJlZCBpY29uIHRvbyBpbnRydXNpdmU8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzU3Ij4jMzEzNTc8L2E+OiBDb21wYXJlIFZpZXcgLS0gQ29tcGFyZS1zdHlsZSBvcHRpb24gcmVxdWlyZWQuPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTYzMyI+IzMxNjMzPC9hPjogQ2Fubm90IGFwcGx5IHBhdGNoIHN1Y2Nlc3NmdWxseTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3NTQiPiMxMDc1NDwvYT46IENvbXBhcmUgYWN0aW9ucyBzaG91bGQgdGFyZ2V0IHNvdXJjZSB3aW5kb3c8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgMTF0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTA3Ij4jMjU1MDc8L2E+OiBDb21wYXJlIHZpZXcgcHJldmVudHMgQ3RybCArIEY2IHdvcmtpbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTcxIj4jMTg1NzE8L2E+OiBwYXRjaDogc2NhcnkgZXJyb3IgZGlhbG9nIHdoZW4gbm8gcGF0Y2ggaW4gY2xpcGJvYXJkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODg0MCI+IzI4ODQwPC9hPjogU3RyYW5nZSBiZWhhdmlvdXMgYXBwbHlpbmcgcGF0Y2g8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgNnRoIDIwMDMgKE01IGFrYSBSQzApCi0KLTxoMj4KLUFQSSBBZGRpdGlvbnM8L2gyPgotQWRkZWQgbmV3IG1ldGhvZCBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nLmdldFNlbGVjdGlvbigpCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTI1Ij4jMzA1MjU8L2E+OiAiVGVhbSIgbWVudSBpdGVtIG1pc3NpbmcgYWNjZWxlcmF0b3I8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MjAyIj4jMjgyMDI8L2E+OiBjb250ZW50bWVyZ2V2aWV3ZXJzIGRvIG5vdCB3b3JrIHdpdGggbWl4ZWQtY2FzZSBleHRlbnNpb25zPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTExNCI+IzE5MTE0PC9hPjogUmVzdG9yZSBKYXZhIEVsZW1lbnQgZnJvbSBMb2NhbCBIaXN0b3J5IHNob3VsZCBhbHNvIHByb3ZpZGUgY2hlY2sgYm94ZXMgW2NvbXBhcmVdPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODQzNiI+IzI4NDM2PC9hPjogT3ZlcnZpZXcgcnVsZSBncmVlbiBvbmx5IGFmdGVyIGZvY3VzIGNoYW5nZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk3OTMiPiMyOTc5MzwvYT46IEF1dG9tYXRpY2FsbHkgc3VnZ2VzdCBhIGZ1enogZmFjdG9yIHdoZW4gYXBwbHlpbmcgYSBwYXRjaDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDI4dGggMjAwMwotCi08aDI+Ci1BUEkgQWRkaXRpb25zPC9oMj4KLUFkZGVkIG5ldyBtZXRob2QgQ29tcGFyZVVJLmZpbmRDb250ZW50Vmlld2VyKC4uLiwgT2JqZWN0IGlucHV0LCAuLi4pCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1SZW1vY2VkIGRvYyBmb2xkZXIuPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU5NyI+IzI0NTk3PC9hPjogQ29tcGFyZSBVSSBBUEkgaXNzdWVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg4MyI+IzIzODgzPC9hPjogQ29tcGFyZURpYWxvZy5jb21taXRBY3Rpb24ubGFiZWwgc3RyaW5nIHJlc291cmNlIG5hbWUgaXMgd3Jvbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NzkxIj4jMjk3OTE8L2E+OiBSZW5hbWUgJ0NvbXBhcmUgdG8gUGF0Y2gnIHRvICdBcHBseSBQYXRjaCc8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSAxNHRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLUV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZmlsZXMgYWRkZWQuPGJyPgotUmVzb2x2ZSBzdGF0dXMgaW5kaWNhdG9yIGlzIG9ubHkgc2hvd24gaWYgdGhlcmUgYXJlIGluY29taW5nIGNoYW5nZXMuCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSA3dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODI3OCI+IzI4Mjc4PC9hPjogVGV4dE1lcmdlVmlld2VyIGxlYWtzIENvbG9yIG9iamVjdHM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODY0Ij4jMjc4NjQ8L2E+OiBMb2FkIG9mIENvbXBhcmVVSSBmYWlscyB3aGVuIG5vdCB0cmlnZ2VyZWQgaW4gVUkgdGhyZWFkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODM4OCI+IzI4Mzg4PC9hPjogSWxsZWdhbCBBcmd1bWVudCBFeGNlcHRpb25zIGluIGNvbXBhcmUgdmlld2VyPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDE3dGggMjAwMgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODM4OCI+IzI4Mzg4PC9hPjogSWxsZWdhbCBBcmd1bWVudCBFeGNlcHRpb25zIGluIGNvbXBhcmUgdmlld2VyPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDE2dGggMjAwMgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotRml4ZWQgYSBwcm9ibGVtIHdpdGggdHJpbSBpbiBjb21wYXJlIHZpZXdlciBvbiBNYWMgT1MgWC48YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mjc4Ij4jMjgyNzg8L2E+OiBUZXh0TWVyZ2VWaWV3ZXIgbGVha3MgQ29sb3Igb2JqZWN0czxicj4KLQotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBEZWNlbWJlciAxM3RoIDIwMDIKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwMTIiPiMyODAxMjwvYT46IERvdWJsZS1jbGljayBiZWhhdmluZyBzdHJhbmdlbHkgaW4gU3luY2hyb25pemUgVmlldzxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBEZWNlbWJlciAxMHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotVGhlIFRleHRtZXJnZXZpZXdlciBzcG9ydHMgYSBmaXJzdCBjdXQgb2YgYSBuZXcgVUkgZm9yIGxlZnQvcmlnaHQgY29weWluZywKLXNob3dpbmcgdGhlICdyZXNvbHZlZCcgc3RhdHVzIG9mIGEgY2hhbmdlLCBhbmQgdXNlcyBzbW9vdGggbGluZXMgdG8KLWNvbm5lY3QgdGhlIGRpZmZlcmluZyByYW5nZXMgaW4gdGhlIGxlZnQgYW5kIHJpZ2h0IHBhbmVzLgotVGhlIG5ldyBVSSBvcHRpb25zIGFyZSBvZmYgYnkgZGVmYXVsdC4gWW91IGNhbiB0dXJuIHRoZW0gb24KLXdpdGggdGhlIHRocmVlICdleHBlcmltZW50YWwnIG9wdGlvbnMgb24gdGhlIENvbXBhcmUgcHJlZmVyZW5jZSBwYWdlLgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzk5MyI+IzI3OTkzPC9hPjogSW5jb3JyZWN0IHN0cnVjdHVyZSBjb21wYXJpc29uPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDNyZCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci1NYWRlIGludGVybmFsIGNsYXNzIFNwbGl0dGVyIHB1YmxpYyBBUEkuCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODA3Ij4jMjQ1OTc8L2E+OiBDb21wYXJlIFVJIEFQSSBpc3N1ZXM8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTm92ZW1iZXIgMjZ0aCAyMDAyCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODA3Ij4jMjA5NzU8L2E+OiBDb21wYXJlIHByZWZlcmVuY2UgcGFnZSBoYXMgbm8gRjEgaGVscDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDI3dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1VcGRhdGVkIEphdmFEb2MgcGFja2FnZS5odG1sIGZpbGVzCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAyNXRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotVXBkYXRlZCBKYXZhRG9jCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAxMnRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi1UaGVyZSB3ZXJlIHNldmVyYWwgY29tcGxhaW5zIHRoYXQgY2xpY2tpbmcgb24gYSB6aXAgZmlsZSBpbiB0aGUgbGVmdCBwYW5lIChzdHJ1Y3R1cmUgaW5wdXQgcGFuZSkgZmVlZHMgYWxsIG90aGVyCi1jb21wYXJlIHBhbmVzIChzZWUgYnVnIDEzNzMwKS4gVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoaXMgaXMgZXhwZW5zaXZlIChmb3IgZXhhbXBsZSBhIGxhcmdlIHppcCBmaWxlIHRoYXQgaGFzIAotdG8gYmUgcmVhZCBmcm9tIGEgcmVwb3NpdG9yeSkuIFRvIGF2b2lkIHRob3NlIHNpdHVhdGlvbnMgdGhlIGxlZnQgcGFuZSBub3cgaG9ub3JzIHNpbmdsZSBvciBkb3VibGUgY2xpY2sgbW9kZSBhcyAKLXNldCBpbiBQcmVmZXJlbmNlcy0+V29ya2JlbmNoLiBTbyBpZiB0aGlzIHByZWZlcmVuY2UgaXMgc2V0IHRvIGRvdWJsZSBjbGljayB0aGUgdXNlciBoYXMgdG8gZG91YmxlIGNsaWNrIG9uIGEgZmlsZQotaW4gdGhlIGxlZnQgcGFuZSB0byBhY3R1YWxseSBmZWVkIGFsbCBvdGhlciBjb21wYXJlIHBhbmVzLgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgOHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MDciPiMxODgwNzwvYT46IENvbXBhcmUgd2l0aCBwYXRjaCBmYWlscyBkdWUgdG8gbWlzc2luZyBMRjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzAiPiMxMzczMDwvYT46IEVudGlyZSB6aXBmaWxlcyBjb250ZW50IHNlbnQgcHJpb3Igd2hlbiBjb21wdXRpbmcgc3luY2hyb25pemF0aW9uIHZpZXcgY29udGVudDxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSA3dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzczMCI+IzEzNzMwPC9hPjogRW50aXJlIHppcGZpbGVzIGNvbnRlbnQgc2VudCBwcmlvciB3aGVuIGNvbXB1dGluZyBzeW5jaHJvbml6YXRpb24gdmlldyBjb250ZW50PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1MiI+IzE0OTUyPC9hPjogRGlmZiBCcm93c2VyIE9wZW5zIFRvbyBTbWFsbCAvIE5vdCBFYXNpbHkgUmVzaXphYmxlPGJyPgotCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgNnRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotTmV3IGNvbnN0YW50IENvbXBhcmVVSS5QTFVHSU5fSUQKLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTQ5Ij4jMTM5NDk8L2E+OiBEQkNTOiBib2d1cyBhdCB0ZXh0IGNvbXBhcmU8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDEzIj4jMTkwMTM8L2E+OiBiYWNrZ3JvbnVkIGNvbG9yOiBpcyBpdCBob25vcmVkPzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyMTYiPiMxOTIxNjwvYT46IEFjY2Vzc2liaWxpdHkgaW4gV29ya2JlbmNoID4gQ29tcGFyZSA+IFRleHQgQ29tcGFyZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkzNzEiPiMxOTM3MTwvYT46IEphdmEgJiBDb21wYXJlIGVkaXRvcidzIE5leHQvUHJldmlvdXMgdG9vbGJhciBidXR0b25zIHNob3VsZG4ndCBiZSByZXRhcmdldGFibGU8YnI+Ci0KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAxc3QgMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci1NYWRlIGNsYXNzIE5hdmlnYXRpb25BY3Rpb24gcHVibGljLgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODAwNCI+IzgwMDQ8L2E+OiBDdHJsK0UgYmVlcHMgZXZlcnkgdGltZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MDAiPiMxNDgwMDwvYT46IENvbXBhcmUgVmlldyBlYXRzIHRhYnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjAwIj4jMTgyMDA8L2E+OiBCb3RoIHNldHMgb2YgYXJyb3dzIHNheSAiU2VsZWN0IE5leHQgQ2hhbmdlIjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyMDYiPiMxODIwNjwvYT46IENhc2luZywgd29yZGluZyBpc3N1ZSBvbiAiTGFzdCBSZXNvdXJjZSByZWFjaGVkIiBwcm9tcHQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjg1Ij4jMTYyODU8L2E+OiBBZGQgZnJvbSBMb2NhbCBIaXN0b3J5IG5lZWRzIGEgZGVzY3JpcHRpb24gbGFiZWw8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDMxIj4jMTc0MzE8L2E+OiBBY2Nlc3NpYmlsaXR5IGlzc3Vlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNDgiPiMxODE0ODwvYT46IFVzaW5nIGNvbWJpbmF0aW9ucyBvZiBObyBhbmQgTmV4dCBmaWxlIGJ1dHRvbiBicmVhayB3cmFwcGluZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNTEiPiMxODE1MTwvYT46IE5leHQgRmlsZSBidXR0b24gZG9lcyBub3QgZGluZyB3aGVuIG9uIGxhc3QgZmlsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NzAiPiMxNjU3MDwvYT46IENvbXBhcmUgcmVmdXNlcyB0byBzaG93IGZ1cnRoZXIgZGlmZmVyZW5jZXMgaWYgbm90IGlnbm9yaW5nIHdoaXRlc3BhY2VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc5MCI+IzEwNzkwPC9hPjogUGF0Y2ggZG9lcyBub3QgYXBwbHkgaWYgZmlsZSBub3QgZm91bmQgbG9jYWxseTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2NDMiPiMxMjY0MzwvYT46IEV4cGFuZCBhbGwgZG9lcyBub3QgZGlzYWJsZSB3aGVuIHRoZXJlIGlzIG5vIHNlbGVjdGlvbjxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDMxc3QgMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODExNiI+IzE4MTE2PC9hPjogQ29tcGFyZSB2aWV3IGRvZXMgbm90IGluaGVyaXQgSmF2YSBlZGl0b3IgYmFja2dyb3VuZCBjb2xvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMxOTAiPiMxMzE5MDwvYT46IENvbXBhcmUgd2l0aCBQYXRjaCBkb2VzIG5vdCBhcHBseSBQYXRjaCwgaWYgc2luZ2xlIGZpbGUgc2VsZWN0ZWQ8YnI+Ci0KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDMwdGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzY5OSI+IzE3Njk5PC9hPjogSmF2YSBFZGl0b3I6IExvY2FsIEhpc3Ryb3kgbWVudSBlbnRyaWVzIGFyZSBlbmFibGVkIGZvciByZWFkLW9ubHkgZmlsZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjgzIj4jMTYyODM8L2E+OiBBZGQgZnJvbSBMb2NhbCBIaXN0b3J5IGl0ZW1zIGFyZSB1bnNvcnRlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyODgiPiMxNjI4ODwvYT46IEFkZCBmcm9tIExvY2FsIEhpc3Rvcnk6IGxpc3Qgb2YgYXZhaWxhYmxlIGVkaXRpb25zIGZsYXNoZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjY0Ij4jMTc2NjQ8L2E+OiBBcHBseWluZyBhIHBhdGNoIHdpdGggZGVsZXRlZCBwYWNrYWdlIGZhaWxzPGJyPgotCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1heSAyOXRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNDAiPiMxNDA0MDwvYT46IFBsYXRmb3JtIGludGVyb3BlcmFiaWxpdHkgaXNzdWUgdy5yLnQuIENvbXBhcmUgV2l0aCBQYXRjaDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3OTAiPiMxNzc5MDwvYT46IE1pc3NpbmcgbW5lbW9uaWNzIGluIHBhdGNoIHNlbGVjdGlvbiBkaWFsb2c8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTE3Ij4jMTA5MTc8L2E+OiBQYXRjaCBzdXBwb3J0IGRvZXMgbm90IHVzZSBtbmVtb25pY3M8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1heSAyOHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4ODkiPiMxNzg4OTwvYT46IFNob3VsZCBub3QgYXNzdW1lIHR5cGUgb2YgUHJvcGVydHlDaGFuZ2VFdmVudCB2YWx1ZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Njc4Ij4jMTc2Nzg8L2E+OiBBcHBseWluZyBhIHBhdGNoIGRvZXMgbWFueSBjb21waWxlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1MzYiPiMxNzUzNjwvYT46IE5QRSBpbiBjb21wYXJlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzEyMSI+IzE3MTIxPC9hPjogQ2FzaW5nIG9mIG1lc3NhZ2Ugd2hlbiBlbmQgb2YgY2hhbmdlcyBuZWVkcyB0byBiZSBzZW50ZW5jZSBzdHlsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NDgiPiMxNzY0ODwvYT46IENhbid0IGFwcGx5IHBhdGNoIHcvbyBpZ25vcmluZyB3aGl0ZXNwYWNlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjkzNiI+IzE2OTM2PC9hPjogQ29tcGFyZSB3aXRoIHBhdGNoIHJlcXVpcmVzICJJZ25vcmUgV2hpdGVzcGFjZSIgdG8gYmUgdHVybmVkIG9mZjxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDE4dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3MSI+IzE0MzcxPC9hPjogVGV4dE1lcmdlVmlld2VyLnNhbWVEb2MoKSBpcyBicm9rZW48YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzc4Ij4jMTQzNzg8L2E+OiBDb21wYXJlRWRpdG9ySW5wdXQgbmV2ZXIgcmVzZXRzIGRpcnR5bmVzcyBmbGFnIChkZXRhaWxlZCk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjgwIj4jMTQ2ODA8L2E+OiBDb21wYXJlIHVucmVhZGFibGUgaW4gaGlnaCBjb250cmFzdCBibGFjazxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NTIiPiMxNDk1MjwvYT46IERpZmYgQnJvd3NlciBPcGVucyBUb28gU21hbGwgLyBOb3QgRWFzaWx5IFJlc2l6YWJsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NDIiPiMxNDc0MjwvYT46IElnbm9yZSB3aGl0ZXNwYWNlIHByZWZlcmVuY2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjI0Ij4jMTQ2MjQ8L2E+OiBObyB2aXN1YWwgY3VlIHdoZW4gY29tcGFyZWQgZmlsZSB3cmFwczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MDYiPiMxMzYwNjwvYT46IFN1cHBvcnQgbXVsdGlwbGUgc2VsZWN0aW9uIGluIEFkZCBmcm9tIGxvY2FsIGhpc3Rvcnk8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1heSAxNnRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotQnVtcGVkIHBsdWdpbiB2ZXJzaW9uIG51bWJlciB0byAyLjAuMDxicj4KLUFkYXB0ZWQgdG8gbmV3IGZpbmRFZGl0b3IgbWV0aG9kczxicj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNzMiPiM4MzczPC9hPjogQ29tcGFyZSBXaXRoLT5QYXRjaC4uLiBtaXNzaW5nIG1uZW1vbmljPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjcxOSI+IzEyNzE5PC9hPjogIlNob3cgUHNldWRvLUNvbmZsaWN0cyIgc2V0dGluZyBpcyBwcm9ibGVtYXRpYzxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgQXByaWwgMzB0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLUFsbCBzdHJpbmdzIE5MU2VkLgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1MTUiPiMxNDUxNTwvYT46IGphdmEgY29tcGFyZSB1c2VzIGludGVybmFsIGpjb3JlIHNjYW5uZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzgyIj4jMTQ3ODI8L2E+OiBBZGQgZnJvbSBMb2NhbCBIaXN0b3J5IG1pc3NpbmcgbW5lbW9uaWM8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEFwcmlsIDE4dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1BbGwgc3RyaW5ncyBOTFNlZC4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMTUyIj4jMTMxNTI8L2E+OiBJbnRlcm5hbCBlcnJvciBpbiAiQWRkIGZyb20gTG9jYWwgSGlzdG9yeS4uLiIgb24gcGFja2FnZXM8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEFwcmlsIDl0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLU5ldyBjb250ZXh0IG1lbnUgYWN0aW9uICdBZGQgRnJvbSBMb2NhbCBIaXN0b3J5Jy4gSnVzdCBzZWxlY3QgYW55IHJlc291cmNlIGNvbnRhaW5lciBhbmQKLSdBZGQgRnJvbSBMb2NhbCBIaXN0b3J5JyBwcmVzZW50cyBhbGwgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgZnJvbSB0aGUgd29ya3NwYWNlIGJ1dCBhcmUKLXN0aWxsIGluIHRoZSBsb2NhbCBoaXN0b3J5LiAKLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci1UaGUgbmV3ICdBZGQgRnJvbSBMb2NhbCBIaXN0b3J5JyBzdWZmZXJzIGZyb20gIzEyOTE1LiBJdCB3b3JrcyBpZiB0aGUgZmlsZXMgd2VyZSBkZWxldGVkCi13aXRoaW4gdGhlIHNhbWUgc2Vzc2lvbi4gSG93ZXZlciBpZiB5b3Ugc2h1dCBkb3duIGFuZCByZXN0YXJ0IGEgd29ya3NwYWNlIHNvbWUgZGVsZXRlZAotZmlsZXMgYXJlIG5vciBsaXN0ZWQuCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTc4Ij4jMTE1Nzg8L2E+OiBQYXRjaDogTWlzc2luZyByZXNvdXJjZSBvbiBkaWFsb2c8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTc5Ij4jMTE1Nzk8L2E+OiBDb21wYXJlIHdpdGggUGF0Y2ggc2hvdWxkIGJlIGRpc2FibGVkIG9uIGNsb3NlZCBwcm9qZWN0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDciPiMxMTkwNzwvYT46IGNsaWNraW5nIGluIGJpcmQncyBleWUgdmlldyBzcG90cyBkb2VzIG5vdGhpbmcgaWYgcGFuZXMgbm90IHN5bmNoZWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTM2Ij4jMTE1MzY8L2E+OiBPcHRpb24gdG8gdHVybiBvZmYgc3RydWN0dXJlZCBjb21wYXJpc29uPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY4MiI+IzEwNjgyPC9hPjogTmVlZCBiZXR0ZXIgVUkgZm9yIHJlY292ZXJpbmcgZGVsZXRpb25zIGZyb20gbG9jYWwgaGlzdG9yeTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0NDYiPiMxMTQ0NjwvYT46IHByb3ZpZGUgImFkZCBmcm9tIGxvY2FsIGhpc3RvcnkiIGZvciBjb21waWxhdGlvbiB1bml0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODYxNSI+Izg2MTU8L2E+OiBTdHlsZWQgVGV4dCB3aWRnZXQgZG9lcyBub3QgcmVzcG9uZCB0byBzeXN0ZW0gY29sb3IgY2hhbmdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjczIj4jOTY3MzwvYT46IGVkaXRvciBiYWNrZ3JvdW5kIGNvbG9yIC0gbm8gZWZmZWN0IG9uIG90aGVyIHZpZXdlcnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjQyIj4jMTE2NDI8L2E+OiBDb21wYXJlIGVkaXRvcnMgbm90IHVzaW5nIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvcnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDM0Ij4jMTA0MzQ8L2E+OiBDb21wYXJlIGJyb3dzZXIgZmFpbHMgc2lsZW50bHkgYW5kIGRvZXMgbm90IGdpdmUgcmVzdWx0PGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCAxOHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotRmlyc3QgY3V0IG9mIGEgYmlyZHNleWV2aWV3IGZvciB0aGUgdGV4dCBjb21wYXJlIHZpZXdlci48YnI+Ci0nQ29tcGFyZSB3aGljaCBFYWNoIG90aGVyJyBmb3IgSmF2YSBlbGVtZW50cy4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2NDEiPiMzNjQxPC9hPjogRENSOiBDYW4ndCBjb21wYXJlIGZyb20gb3V0bGluZXIgKDFHREhKS0spPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCAxNHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzMDUiPiMxMTMwNTwvYT46IENhbid0IGNvbXBhcmUgYSAiQyIgZmlsZTxicj4KLQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCAxMnRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotU3RydWN0dXJlIENvbXBhcmUgdmlld2VycyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0Ljxicj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzc5Ij4jMTAzNzk8L2E+OiBDb21wYXJlIHdpdGggTG9jYWwgSGlzdG9yeSBEaWFsb2c6IGxvd2VyIHBhbmUgaXMgbWlzc2luZyBhIGJvcmRlZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3NjgiPiM5NzY4PC9hPjogKGVtcHR5LW1lbnUpIGluIGNvbXBhcmUgdmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTg0MiI+Izk4NDI8L2E+OiBFeHBhbmQgQWxsIGFjdGlvbiBuZWVkZWQgaW4gc3RydWN0dXJlIGNvbXBhcmUgdmlldzxicj4KLQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCA1dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODY5Ij4jOTg2OTwvYT46IE5lZWQgbW9yZSBzdXBwb3J0IGZvciBjcmVhdGluZy9kZWxldGluZyByZXNvdXJjZXM8YnI+Ci0KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgMjZ0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLVBhdGNoOiBmb3IgZXZlcnkgcmVqZWN0ZWQgZmlsZSBhIHRhc2sgbWFya2VyIGlzIGFkZGVkPGJyPgotQ29tcGFyZSBwcmVmZXJlbmNlIHBhZ2Ugc2hvd3Mgb3B0aW9ucyBpbiBhIHByZXZpZXc8YnI+Ci1OZXcgcHJlZmVyZW5jZSBvcHRpb24gZm9yIGFkZGl0aW9uYWwgY29tcGFyZSBzdGF0dXMgbGluZSBpbmZvcm1hdGlvbgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU0MCI+Izk1NDA8L2E+OiBDb21wYXJlIHdpdGggcGF0Y2g6IGl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gY2hlY2sgaXRlbXMgdGhhdCBjb3VsZCBub3QgYmUgYXBwbGllZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUzMiI+Izk1MzI8L2E+OiBDb21wYXJlIHdpdGggcGF0Y2g6IG5leHQgZGlzYWJsZWQgYWx0aG91Z2ggY2xpcGJvYXJkIHNwZWNpZmllZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzY4MSI+Izc2ODE8L2E+OiBTdHJ1Y3R1cmVkIHJlc3VsdHMgZXhwYW5kcyBpbXBvcnQgc3RhdGVtZW50czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU3MiI+Izk1NzI8L2E+OiBEZWJ1Z2dpbmcgdHJhY2UgbGVmdCBpbiBzdGF0dXMgYmFyPGJyPgotCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDEydGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1UaGUgcGF0Y2ggd2l6YXJkIG5vIGxvbmdlciBvcGVucyBhIENvbXBhcmUgRWRpdG9yIGJ1dCBhcHBsaWVzIHRoZQotcGF0Y2ggZGlyZWN0bHkgdG8gdGhlIHdvcmtzcGFjZS4gVGhpcyB3aWxsIGJlIHRoZSBkZWZhdWx0LgotSW4gdGhlIGZ1dHVyZSB0aGUgb2xkIGJlaGF2aW9yIG9mIG9wZW5pbmcgdGhlIENvbXBhcmUgRWRpdG9yIHdpbGwgYmUKLWFuIGFkZGl0aW9uYWwgb3B0aW9uIHdoZW4gZmluaXNoaW5nIHRoZSB3aXphcmQuCi08YnI+Ci1QYXRjaCB3aXphcmQgaGFzIGEgJ1JldmVyc2UnIG9wdGlvbiBmb3IgYXBwbHlpbmcgYSAicmV2ZXJzZWQiIHBhdGNoLgotVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gJ3VuZG8nIGEgcGF0Y2guCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTUzIj4jOTE1MzwvYT46IE5QRSB3aGVuIGNsb3Npbmcgc3luY2hyb25pemUgdmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTMzMSI+IzkzMzE8L2E+OiBOUEUgZHVyaW5nIGNvbXBhcmUgd2l0aCBzdHJlYW0gdmVyc2lvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM0NiI+IzYzNDY8L2E+OiBQcm9ibGVtcyB3aXRoIFBhdGNoPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzI3Ij4jNjcyNzwvYT46IFBhdGNoOiAqLnJlaiBmaWxlIG11c3QgYmUgc2F2ZWQgaW4gd29ya3NwYWNlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzU4Ij4jNzM1ODwvYT46IEludGVybmFsIEVycm9yIGluIENvbXBhcmUgd2l0aCBQYXRjaCB3aXRoIG5ldyBmaWxlczxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgNXRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotVGhlIHN0cnVjdHVyZSBjb21wYXJlIHBhbmUgb3BlbnMgd2hlbiBhIHJlc291cmNlIGlzIHNlbGVjdGVkLgotSW4gcHJldmlvdXMgdmVyc2lvbiBhIGRvdWJsZSBjbGljayB3YXMgcmVxdWlyZWQuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDYzIj4jNTA2MzwvYT46IFNob3VsZCBub3QgaGF2ZSB0byBkb3VibGUtY2xpY2sgdG8gb3BlbiBTdHJ1Y3R1cmUgQ29tcGFyZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwMiI+IzI2MDI8L2E+OiBDb21wYXJlIEZXIGFjY2Vzc2liaWxpdHkgaXNzdWVzICgxR0s3OVVCKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwNyI+IzI3MDc8L2E+OiBNZXJnZSB2aWV3ZXIgc2hvdWxkIGFzayBmb3Igc2F2ZSBiZWZvcmUgcmVsZWFzaW5nICgxR0k5SlhTKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3MiI+IzI3NzI8L2E+OiBEQ1I6IEF1dG9tYXRpYyBzdHJ1Y3R1cmUgY29tcGFyZSAoMUdKNkVVWSk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4MjkiPiMzODI5PC9hPjogU21hcnQgcmVuYW1lIGJ1dHRvbiBlbmFibGVkIHdoZW4gbm8gc21hcnRuZXNzIGlzIGF2YWlsYWJsZSAoMUdFVVZITik8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwODkiPiM5MDg5PC9hPjogTG9jYWwgaGlzdG9yeSAtIFNlbGVjdGluZyBpdGVtIGluIHN0cnVjdHVyZWQgY29tcGFyZSBoYXMgbm8gZWZmZWN0PGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDI5dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjcxIj4jNjI3MTwvYT46IENhbid0IHRlbGwgd2hpY2ggZmlsZSBpcyB3aGljaCBpbiBDb21wYXJlIGJyb3dzZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTkiPiMyNTE5PC9hPjogbmV4dC9wcmV2IGFycm93cyBhY3RpdmUgd2hlbiBvbmx5IG9uZSBkaWZmZXJlbmNlIGluIGNvbXBhcmUgKDFHRklRWDMpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzYzIj4jODM2MzwvYT46IE5QRSBjb21wYXJpbmcgdHdvIHJlc291cmNlcyBpbiB0aGUgbmF2aWdhdG9yLjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMSI+IzI1MDE8L2E+OiBFbXB0eSBtZW51IGluIGNvbXBhcmUgYnJvd3NlciAoMUdGQlFLRSk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTQiPiMyODU0PC9hPjogQ29tcGFyZTogU2F2ZSBjb2RlIHBhdGggcHJvYmxlbWF0aWMgKDFHSllHQVgpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTc0Ij4jODU3NDwvYT46IE5vdCBzdHJ1Y3R1cmUgY29tcGFyZSBpbiBjb21wYXJlIHdpdGggbG9jYWwgaGlzdG9yeTxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSAyM3RoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA4OSI+IzgwODk8L2E+OiBSZXBsYWNlIGZyb20gbG9jYWwgaGlzdG9yeTogcGFyc2UgZXJyb3I8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgMjJ0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLUZpeGVkIGFuIGluY29uc2lzdGVuY3kgaW4gdGhlIGJpbmFyeSBjb21wYXJlIHZpZXdlcjoKLWluZm8gbWVzc2FnZSBkaWRuJ3QgbWF0Y2ggKy8taWNvbiBpbiB0aGUgcmVzb3VyY2UgY29tcGFyZSBwYW5lLgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg1OSI+IzM4NTk8L2E+OiByZXBsYWNlIGZyb20gaGlzdG9yeSBkb2VzIG5vdCB3b3JrIGZvciBlbGVtZW50cyB3aXRoIGVycm9yICgxR0VZSVo2KTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE3NyI+IzYxNzc8L2E+OiBEb3VibGUgY2xpY2sgYWN0aW9uIGRhbmdlcm91cyBpbiAnUmVzdG9yZSBmcm9tIExvY2FsIEhpc3RvcnknPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODIxIj4jNzgyMTwvYT46IFRlYW0gMi4wIENWUyBzeW5jaHJvbnplIGJ1ZyAnbm8tbmFtZScgZGlycy4uPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzczIj4jMjc3MzwvYT46IEphdmEgc3RydWN0dXJlIGNvbXBhcmUgc2hvdWxkIGdpdmUgYmV0dGVyIGluZGljYXRpb24gd2hlbiBubyBjaGFuZ2VzICgxR0o2RU5FKTxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSAxNXRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotRml4ZWQgYSBwcm9ibGVtIGluIERpZmZOb2RlLmdldE5hbWUoKWFuZCB0aGUgRGlmZlRyZWVWaWV3ZXIncyBsYWJlbCBwcm92aWRlcgotd2hlcmUgdGhlIGxlZnQgYW5kIHJpZ2h0IGhhbGYgb2YgYSBEaWZmTm9kZSBsYWJlbCB3b3VsZCBiZSByZXZlcnNlZCBiZWNhdXNlCi10aGUgImxlZnRJc0xvY2FsIiBwcm9wZXJ0eSBvZiBhIENvbXBhcmVDb25maWd1cmF0aW9uIHdhc24ndCBvYmV5ZWQuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODkzIj4jMTg5MzwvYT46IENvbXBhcmUgVmlld2VyIGRvZXNuJ3Qgc2Nyb2xsIHRvIGxhc3QgbGluZSAoMUdCQjM0Tik8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MzkiPiM1ODM5PC9hPjogVXNhYmlsaXR5OiBJbml0aWFsIGRpZmYgaXMgc29tZXRpbWVzIG5vdCBob3Jpem9udGFsbHkgYWxpZ25lZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTMyNSI+IzUzMjU8L2E+OiBDb21wYXJlIGFsd2F5cyBzY3JvbGwgdGhlIHRleHQgcGFuZSB0byB0aGUgZXh0cmVtZSBsaW1pdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA0OCI+IzcwNDg8L2E+OiBGaXJzdCBlbGVtZW50IG5vdCBzZWxlY3RlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0OCI+IzI1NDg8L2E+OiBQcm9qZWN0IGNvbXBhcmUgc2hvdWxkIG9wZW4gdmlld2luZyBzZWxlY3RlZCBmaWxlICgxR0ZNUlA2KTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzOCI+IzI5Mzg8L2E+OiBSZXBsYWNlIGZyb20gbG9jYWwgaGlzdG9yeSBzaG91bGQgc2hvdyBidXN5IGN1cnNvciAoMUdLVTBQMyk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1OTQiPiM3NTk0PC9hPjogTWVudSBlbnRyeSAiUmVwbGFjZSB3aXRoIFByZXZpb3VzIiBzaG91bGRuJ3QgaGF2ZSBhICIuLi4iPGJyPgotV29ya2Fyb3VuZCBhZGRlZCBmb3I6PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzIwIj4jNzMyMDwvYT46IE5leHQgZGlmZiBzY3JvbGxzIHdoZW4gZ29pbmcgaW50byBjdXJyZW50IGRpZmY8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgOHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotQWRkZWQgbWV0aG9kcyB0byBDb21wYXJlVUkgcGx1Z2luIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGFsaWFzZXMKLWZvciB0aGUgZmlsZSBleHRlbnNpb24gdG8gU3RydWN0dXJlQ29tcGFyZVZpZXdlciBtYXBwaW5nCi0oYWRkU3RydWN0dXJlVmlld2VyQWxpYXMsIHJlbW92ZVN0cnVjdHVyZVZpZXdlckFsaWFzKS4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4MjgiPiM2ODI4PC9hPjogU3VwcG9ydCB3aXRoIHJlcGxhY2Ugd2l0aCBwcmV2aW91czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NiI+IzIzOTY8L2E+OiBTYXZlIGluIGNvbXBhcmUgZWRpdG9ycyBuZWVkcyBwcm9ncmVzcyBiYXIgKDFHRVlGNTgpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjcxIj4jNTI3MTwvYT46IEpBUnMgY29tcGFyZWQgYXMgc291cmNlIGluIHJlbGVhc2UgYnJvd3Nlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTEyMSI+IzUxMjE8L2E+OiBSZXBsYWNlIHdpdGggUHJldmlvdXMgKGZyb20gbG9jYWwgaGlzdG9yeSk8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDExdGggMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1LZXlib2FyZCBzaG9ydGN1dHMgZm9yICdHb3RvIG5leHQgRGlmZmVyZW5jZScgYW5kICdHb3RvIHByZXZpb3VzIERpZmZlcmVuY2UnCi1jaGFuZ2VkIHRvIENvbnRyb2wtRSBhbmQgQ29udHJvbC1TaGlmdC1FLjxicj4KLUJldHRlciBOTFMgc3VwcG9ydC48YnI+Ci1VcGRhdGVkIGZpbGUgImFib3V0Lmh0bWwiLgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRGVjZW1iZXIgNHRoIDIwMDEKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4MSI+IzQzODE8L2E+OiBSZXBsYWNlIGZyb20gbG9jYWwgaGlzdHJveSAtIHdvcmtzcGFjZSBlbGVtZW50IGluY2x1ZGVkIDxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTm92ZW1iZXIgMjd0aCAyMDAxCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyOTgiPiM2Mjk4PC9hPjogUmVwbGFjZSB3aXRoIExvY2FsIEhpc3Rvcnk6IFdvcmtiZW5jaCAtPiBXb3Jrc3BhY2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMzgiPiM1MjM4PC9hPjogQ29tcGFyZSBmYWlscyBpZiB0YWtlcyBtb3JlIHRoYW4gMjAgc2Vjb25kczxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIxMCwgTm92ZW1iZXIgMTJ0aCwgMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1GaXJzdCBjdXQgZm9yICdyZWplY3RlZCBodW5rJyBzdXBwb3J0LgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotbmV3IGNsYXNzZXMgQ29tcGFyZVZpZXdlclBhbmUgYW5kIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lPGJyPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLUltcHJvdmVkIFBhdGNoIHdpemFyZC48YnI+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3MjMiPiM1NzIzPC9hPjogQXBwbHkgUGF0Y2ggZGlhbG9nIGhhcyBubyByYWRpbyBzZWxlY3Rpb248YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDcsIE5vdmVtYmVyIDFzdCwgMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzM0Ij4jNTMzNDogSW50ZXJuYWwgZXJyb3JzIHVzaW5nIHBhdGNoIHRvb2w8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTUwIj4jNTE1MDogQ29tcGFyZSB3aXRoIHBhdGNoIGNhbm5vdCByZWFkIFZDTSdzIENWUyBwYXRjaCBmaWxlPC9hPjxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwNCwgT2N0b2JlciAxMnRoLCAyMDAxCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLUZpcnN0IGN1dCBvZiBwYXRjaCBzdXBwb3J0LgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMiwgU2VwdGVtYmVyIDI3dGgsIDIwMDEKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTFHS0tVQTU6IElUUFVJOldJTk5UIC0gU2V2ZXJlOiBtZW1vcnkgbGVhayBpbiBzeW5jIHZpZXc8YnI+Ci0xR0tLR0dTOiBJVFBKVUk6V0lOMjAwMCAtICgxMzYpIGNvbXBhcmVzIHppcHMgYXMgc291cmNlPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAxLCBTZXB0ZW1iZXIgMjFzdCwgMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1yZW1vdmVkIGRpcmVjdGlvbiBpY29uIGluIFRleHRNZXJnZVZpZXdlciBmb3IgdHdvLXdheSBjb21wYXJlCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotMUdKVVJXSjogSVRQVUk6V0lOMjAwMCAtIEhlYnJldyArIEphcGFuZXNlOiBjb21wYXJlIHZpZXcgZGVmYXVsdHMgdG8gYmluYXJ5PGJyPgotMUdLMDM4ODogSVRQSkNPUkU6V0lOMjAwMCAtIHJlcGxhY2Ugd2l0aCBsb2NhbCBoaXN0b3J5OiBzZWxlY3RpbmcgKHdvcmtzcGFjZSkgZGVsZXRlcyBzb3VyY2U8YnI+Ci0xR0lURzJWOiBJVFBVSTpXSU4yMDAwIC0gQ29tcGFyaW5nIGh0bWwgZmlsZXMgdXNlcyBiaW5hcnkgY29tcGFyZTxicj4KLTFHSlcyVFA6IElUUEpVSTpXSU4yMDAwIC0gamF2YSBjb21wYXJlOiB3aHkgYmVlcCBldmVyeSB0aW1lPzxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMCwgU2VwdGVtYmVyIDEzdGgsIDIwMDEKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotSWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UgQ29tcGFyZSB2aWV3ZXIgZm9udCBpcyB0YWtlbiBmcm9tIHdvcmtiZW5jaCB0ZXh0IGZvbnQ8YnI+Ci1UaGUgc2hvcnRjdXQgZm9yICJHb3RvIE5leHQvUHJldmlvdXMgRGlmZmVyZW5jZSIgaXMgQ3RybC1EL0N0cmwtU2hpZnQtRAotdG8gYXZvaWQgYSBjbGFzaCB3aXRoIEN0cmwtUCBvZiB0aGUgUHJpbnQgY29tbWFuZC4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLW5ldyBtZXRob2QgRWRpdGlvblNlbGVjdGlvbkRpYWxvZy5zZXRIaWRlSWRlbnRpY2FsRW50cmllcyhib29sZWFuKTxicj4KLW5ldyBtZXRob2QgRWRpdGlvblNlbGVjdGlvbkRpYWxvZy5zZXRUYXJnZXRJc1JpZ2h0KGJvb2xlYW4pPGJyPgotbmV3IG1ldGhvZCBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nLnNldEFkZE1vZGUoYm9vbGVhbik8YnI+Ci1uZXcgbWV0aG9kIENvbXBhcmVFZGl0b3JJbnB1dC5zYXZlQ2hhbmdlcyguLi4pPGJyPgotbmV3IG1ldGhvZCBUZXh0TWVyZ2VWaWV3ZXIuY3JlYXRlTGluZUNvbXBhcmF0b3IoSURvY3VtZW50IGRvY3VtZW50LCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBpZ25vcmVXaGl0ZVNwYWNlKTxicj4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci0xR0ZNTEZCOiBJVFBVSTpXSU4yMDAwIC0gZmlsZXMgdGhhdCBhcmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYXBwZWFyIGFzIGVtcHR5PGJyPgotMUdHMEVMTTogSVRQVkNNOkFMTCAtIExvY2FsIGhpc3RvcnkgZGlzcGxheWVkIHNvbWUgb2YgVG9kYXkncyBpdGVtcyBhcyBZZXN0ZXJkYXk8YnI+Ci0xR0dOS0hOOiBJVFBKVUk6QUxMIC0gTm8gcHJvZ3Jlc3MgZHVyaW5nIHJlcGxhY2Ugd2l0aCBsb2NhbCBoaXN0b3J5PGJyPgotMUdGMkpOSTogSVRQVUk6QUxMIC0gKG1pbm9yKUNvbXBhcmUgZmFpbGVkIHRpdGxlIHNob3VsZCBiZSB0aXRsZSBjYXNlPGJyPgotMUdIQlBBMTogSVRQVkNNOldJTk5UIC0gQ29tcGFyZSAtIG5leHQgY2hhbmdlIGFycm93IHN3aXRjaGVzIHRvIHdyb25nIGZpbGU8YnI+Ci0xR0dRUUgzOiBJVFBKVUk6V0lOTlQgLSBDb21wYXJlIGhpZ2h0bGlnaHRzIGEgbm9uLWNoYW5nZSBpbnN0ZWFkIG9mIHRoZSBjaGFuZ2U8YnI+Ci0xR0k1RE45OiBJVFBVSTpXSU4yMDAwIC0gQ29uZmxpY3RpbmcgdG9rZW4gZGVsZXRpb25zIGRvbid0IHNob3cgdXAgaW4gdGV4dCBjb21wYXJlIHZpZXdlcjxicj4KLTFHSTNLVVI6IElUUEpVSTpXSU4yMDAwIC0gQ29tcGFyZTogZG91YmxlLWNsaWNrIGluIHZlcnNpb25zIGxpc3QgY2xvc2VzIHZpZXc8YnI+Ci0xR0ZGUjRCOiBJVFBVSTpXSU45OCAtIGxvY2FsIGhpc3RvcnkgaXMgbWlzbGVhZGluZzxicj4KLTFHQk0wSUw6IElUUFVJOldJTk5UIC0gQ29tcGFyZUVkaXRvcklucHV0I3NhdmUgc2hvdWxkIHRocm93IENvcmVFeGNlcHRpb248YnI+Ci0xR0k5OUxFOiBJVFBVSTpBTEwgLSBDb21wYXJlIHZpZXdlciBkb2VzIG5vdCBzaG93IGxhc3QgbGluZSB3aGVuIGhvcml6b250YWwgc2Nyb2xsIGJhciBpcyBwcmVzZW50PGJyPgotMUdCQjM0TjogSVRQSlVJOldJTjIwMDAgLSBDb21wYXJlIFZpZXdlciBkb2Vzbid0IHNjcm9sbCB0byBsYXN0IGxpbmU8YnI+Ci0xR0daOERPOiBJVFBKVUk6V0lOIC0gTWVyZ2VWaWV3ZXIgaW52YWxpZCBzZWxlY3Rpb24gcmFuZ2U8YnI+Ci0xR0lJQkhNOiBJVFBVSTpXSU4yMDAwIC0gUHJvYmxlbXMgd2hlbiBjb21wYXJpbmcgemlwIGZpbGVzPGJyPgotMUdJS0tPWjogSVRQVUk6QUxMIC0gYWx0IGNvcHlyaWdodCB0ZXh0IGluIGh0bWwgZG9jIG5lZWRzIHVwZGF0ZTxicj4KLTFHSVVSTkI6IElUUFVJOkFMTCAtIHByb3BlcnR5IGZpbGUgb2YgRWRpdGlvblNlbGVjdGlvbkRpYWxvZyBjb250YWlucyBjb25maWd1cmF0aW9uIG9wdGlvbnM8YnI+Ci0xR0lVUzZMOiBJVFBVSTpBTEwgLSBUZXh0TWVyZ2VWaWV3ZXIgdXNlcyBkZXByZWNhdGVkIFRocmVhZC5zdG9wKCk8YnI+Ci0xR0kzSERaOiBJVFBKVUk6QUxMIC0gQ29tcGFyZTogY29uZmxpY3RzIHdpdGggbm8gYW5jZXN0b3IgZG9lcyBub3Qgc2hvdyBkaWZmZXJlbmNlczxicj4KLTFHRVVYMEQ6IElUUEpVSTpBTEwgLSBub3Qgc3RhdGUgYXdhcmUgdG9vbGJhciBidXR0b24gaW4gY29tcGFyZTxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0xR0Y5WTlDOiBJVFBVSTpXSU4yMDAwIC0gRENSOiBvbmx5IGdldCBhbmNlc3RvciBwYW5lIGNvbnRlbnRzIGlmIHBhbmUgaXMgdmlzaWJsZTxicj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjJmZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFJlc291cmNlIHN0cmluZ3MgZm9yIENvbXBhcmUgUGx1Zy1pbgotIwotcGx1Z2luTmFtZT0gQ29tcGFyZSBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIwotIyBFeHRlbnNpb24gcG9pbnQgbmFtZXMKLSMKLXN0cmVhbU1lcmdlcnM9IFN0cmVhbSBNZXJnZXIKLXN0cnVjdHVyZUNyZWF0b3JzPSBTdHJ1Y3R1cmUgQ3JlYXRvcgotc3RydWN0dXJlTWVyZ2VWaWV3ZXJzPSBTdHJ1Y3R1cmUgTWVyZ2UgVmlld2VyCi1jb250ZW50TWVyZ2VWaWV3ZXJzPSBDb250ZW50IE1lcmdlIFZpZXdlcgotY29udGVudFZpZXdlcnM9IENvbnRlbnQgVmlld2VyCi0KLSMKLSMgQ29tcGFyZVVJUGx1Z2luCi0jCi1Db21wYXJlVUlQbHVnaW4uZGlhbG9nVGl0bGU9Q29tcGFyZQotQ29tcGFyZVVJUGx1Z2luLm5vQWN0aXZlV29ya2JlbmNoUGFnZT1DYW5ub3QgZmluZCBhY3RpdmUgd29ya2JlbmNoIHBhZ2UKLUNvbXBhcmVVSVBsdWdpbi5jb21wYXJlRmFpbGVkPUNvbXBhcmUgRmFpbGVkCi1Db21wYXJlVUlQbHVnaW4ub3BlbkVkaXRvckVycm9yPVByb2JsZW1zIE9wZW5pbmcgRWRpdG9yCi1Db21wYXJlVUlQbHVnaW4ubm9EaWZmZXJlbmNlcz1UaGVyZSBhcmUgbm8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgaW5wdXRzLgotCi1Db21wYXJlVUlQbHVnaW4udGFyZ2V0SWRBdHRyaWJ1dGVNaXNzaW5nPXRhcmdldCBpZCBhdHRyaWJ1dGUgJyd7MH0nJyBtaXNzaW5nCi1Db21wYXJlVUlQbHVnaW4uY29udGVudFR5cGVOb3RGb3VuZD1jb250ZW50IHR5cGUgJyd7MH0nJyBub3QgZm91bmQKLUNvbXBhcmVVSVBsdWdpbi50YXJnZXROb3RGb3VuZD10YXJnZXQgJyd7MH0nJyBub3QgZm91bmQKLUNvbXBhcmVVSVBsdWdpbi51bmV4cGVjdGVkVGFnPWV4cGVjdGVkIHRhZyAnJ3sxfScnLCBnb3QgJyd7MH0nJwotCi0jCi0jIENvbXBhcmUgRWRpdG9yCi0jCi1kZWZhdWx0Q29tcGFyZUVkaXRvci5uYW1lPSBEZWZhdWx0IENvbXBhcmUgRWRpdG9yCi1Db21wYXJlRWRpdG9yLnNhdmVFcnJvci50aXRsZT0gU2F2ZSBFcnJvcgotQ29tcGFyZUVkaXRvci5jYW50U2F2ZUVycm9yPSBDYW5ub3Qgc2F2ZSBjb250ZW50cyAoezB9KQotQ29tcGFyZUVkaXRvci5pbnZhbGlkSW5wdXQ9SW52YWxpZCBpbnB1dDogbm90IGEgQ29tcGFyZUVkaXRvcklucHV0Ci1Db21wYXJlRWRpdG9yLmVycm9yLnNldGlucHV0LnRpdGxlPVByb2JsZW0gb3BlbmluZyBpbnB1dAotQ29tcGFyZUVkaXRvci5lcnJvci5zZXRpbnB1dC5tZXNzYWdlPUNhbm5vdCBvcGVuIGlucHV0OgotCi0jCi0jIENvbW1hbmRzCi0jCi1jb21wYXJlQ2F0ZWdvcnkubmFtZT0gQ29tcGFyZQotY29tcGFyZUNhdGVnb3J5LmRlc2NyaXB0aW9uPSBDb21wYXJlIGNvbW1hbmQgY2F0ZWdvcnkKLQotQ29tbWFuZC5jb3B5UmlnaHRUb0xlZnQubmFtZT0gQ29weSBmcm9tIFJpZ2h0IHRvIExlZnQKLUNvbW1hbmQuY29weVJpZ2h0VG9MZWZ0LmRlc2NyaXB0aW9uPSBDb3B5IEN1cnJlbnQgQ2hhbmdlIGZyb20gUmlnaHQgdG8gTGVmdAotCi1Db21tYW5kLmNvcHlMZWZ0VG9SaWdodC5uYW1lPSBDb3B5IGZyb20gTGVmdCB0byBSaWdodAotQ29tbWFuZC5jb3B5TGVmdFRvUmlnaHQuZGVzY3JpcHRpb249IENvcHkgQ3VycmVudCBDaGFuZ2UgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci0KLUNvbW1hbmQuY29weUFsbFJpZ2h0VG9MZWZ0Lm5hbWU9IENvcHkgQWxsIGZyb20gUmlnaHQgdG8gTGVmdAotQ29tbWFuZC5jb3B5QWxsUmlnaHRUb0xlZnQuZGVzY3JpcHRpb249IENvcHkgQWxsIENoYW5nZXMgZnJvbSBSaWdodCB0byBMZWZ0Ci0KLUNvbW1hbmQuY29weUFsbExlZnRUb1JpZ2h0Lm5hbWU9IENvcHkgQWxsIGZyb20gTGVmdCB0byBSaWdodAotQ29tbWFuZC5jb3B5QWxsTGVmdFRvUmlnaHQuZGVzY3JpcHRpb249IENvcHkgQWxsIENoYW5nZXMgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci0KLUNvbW1hbmQuc2VsZWN0TmV4dENoYW5nZS5uYW1lPSBTZWxlY3QgTmV4dCBDaGFuZ2UKLUNvbW1hbmQuc2VsZWN0TmV4dENoYW5nZS5kZXNjcmlwdGlvbj0gU2VsZWN0IE5leHQgQ2hhbmdlCi0KLUNvbW1hbmQuc2VsZWN0UHJldmlvdXNDaGFuZ2UubmFtZT0gU2VsZWN0IFByZXZpb3VzIENoYW5nZQotQ29tbWFuZC5zZWxlY3RQcmV2aW91c0NoYW5nZS5kZXNjcmlwdGlvbj0gU2VsZWN0IFByZXZpb3VzIENoYW5nZQotCi0KLSMKLSMgQ29udGV4dCBtZW51ICYgYWN0aW9ucwotIwotQ29tcGFyZVdpdGhNZW51LmxhYmVsPSBDb21wJmFyZSBXaXRoCi0KLUNvbXBhcmVXaXRoRWFjaE90aGVyQWN0aW9uLmxhYmVsPSAmRWFjaCBPdGhlcgotQ29tcGFyZVdpdGhFYWNoT3RoZXJBY3Rpb24udG9vbHRpcD0gQ29tcGFyZSB0aGUgU2VsZWN0ZWQgUmVzb3VyY2VzCi0KLVRlYW1NZW51LmxhYmVsPSBUJmVhbQotCi1Db21wYXJlV2l0aFBhdGNoQWN0aW9uLmxhYmVsPSAmQXBwbHkgUGF0Y2guLi4KLUNvbXBhcmVXaXRoUGF0Y2hBY3Rpb24udG9vbHRpcD0gQXBwbHkgYSBQYXRjaCB0byB0aGUgU2VsZWN0ZWQgUmVzb3VyY2VzCi0KLUNvbXBhcmVXaXRoSGlzdG9yeUFjdGlvbi5sYWJlbD0gJkxvY2FsIEhpc3RvcnkuLi4KLUNvbXBhcmVXaXRoSGlzdG9yeUFjdGlvbi50b29sdGlwPSBDb21wYXJlIHRoZSBTZWxlY3RlZCBSZXNvdXJjZSB3aXRoIExvY2FsIEhpc3RvcnkKLQotUmVwbGFjZVdpdGhNZW51LmxhYmVsPSBSZXAmbGFjZSBXaXRoCi0KLVJlcGxhY2VGcm9tSGlzdG9yeUFjdGlvbi5sYWJlbD0gJkxvY2FsIEhpc3RvcnkuLi4KLVJlcGxhY2VGcm9tSGlzdG9yeUFjdGlvbi50b29sdGlwPSBSZXBsYWNlIHRoZSBTZWxlY3RlZCBSZXNvdXJjZSB3aXRoIExvY2FsIEhpc3RvcnkKLQotUmVwbGFjZVdpdGhQcmV2aW91c0Zyb21IaXN0b3J5QWN0aW9uLmxhYmVsPSAmUHJldmlvdXMgZnJvbSBMb2NhbCBIaXN0b3J5Ci1SZXBsYWNlV2l0aFByZXZpb3VzRnJvbUhpc3RvcnlBY3Rpb24udG9vbHRpcD0gUmVwbGFjZSB0aGUgU2VsZWN0ZWQgUmVzb3VyY2Ugd2l0aCB0aGUgUHJldmlvdXMgZnJvbSBMb2NhbCBIaXN0b3J5Ci0KLWFkZEZyb21IaXN0b3J5QWN0aW9uLmxhYmVsPSBSZXN0b3JlIGZyb20gTG9jYWwgSGlzdG9yJnkuLi4KLWFkZEZyb21IaXN0b3J5QWN0aW9uLnRvb2x0aXA9IFJlc3RvcmUgRGVsZXRlZCBGaWxlcyBmcm9tIExvY2FsIEhpc3RvcnkKLQotIwotIyBQcmVmZXJlbmNlIFBhZ2UKLSMKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5uYW1lPSBDb21wYXJlL1BhdGNoCi0KLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5nZW5lcmFsVGFiLmxhYmVsPSAmR2VuZXJhbAotCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2Uuc3RydWN0dXJlQ29tcGFyZS5sYWJlbD0gJk9wZW4gc3RydWN0dXJlIGNvbXBhcmUgYXV0b21hdGljYWxseQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnNob3dNb3JlSW5mby5sYWJlbD0gJlNob3cgYWRkaXRpb25hbCBjb21wYXJlIGluZm9ybWF0aW9uIGluIHRoZSBzdGF0dXMgbGluZQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmlnbm9yZVdoaXRlc3BhY2UubGFiZWw9IElnbm9yZSAmd2hpdGUgc3BhY2UKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zYXZlQmVmb3JlUGF0Y2hpbmcubGFiZWw9IEEmdXRvbWF0aWNhbGx5IHNhdmUgZGlydHkgZWRpdG9ycyBiZWZvcmUgcGF0Y2hpbmcKLQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmZpbHRlci5kZXNjcmlwdGlvbj0gRW50ZXIgbWVtYmVyIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gJ0NvbXBhcmUgV2l0aCBFYWNoIE90aGVyJy5cbkxpc3QgaXMgY29tbWEgc2VwYXJhdGVkIChlLmcuICcqLmNsYXNzLCAucHJvamVjdCwgYmluLycpCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UuZmlsdGVyLmxhYmVsPSAmRmlsdGVyZWQgTWVtYmVyczoKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5maWx0ZXIuaW52YWxpZHNlZ21lbnQuZXJyb3I9IEZpbHRlciBpcyBpbnZhbGlkOiB7MH0KLQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnRleHRDb21wYXJlVGFiLmxhYmVsPSAmVGV4dCBDb21wYXJlCi0KLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5pbml0aWFsbHlTaG93QW5jZXN0b3JQYW5lLmxhYmVsPSBJbml0aWFsbHkgc2hvdyBhJm5jZXN0b3IgcGFuZQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnNob3dQc2V1ZG9Db25mbGljdHMubGFiZWw9IFNob3cgJnBzZXVkbyBjb25mbGljdHMKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zeW5jaHJvbml6ZVNjcm9sbGluZy5sYWJlbD0gU3luY2hyb25pemUgJnNjcm9sbGluZyBiZXR3ZWVuIHBhbmVzIGluIGNvbXBhcmUgdmlld2VycwotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnVzZVNpbmdsZUxpbmUubGFiZWw9IENvbm5lY3QgJnJhbmdlcyB3aXRoIHNpbmdsZSBsaW5lCi0KLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5wcmV2aWV3LmxhYmVsPSBQcmV2aWV3OgotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmFuY2VzdG9yLmxhYmVsPSBDb21tb24gQW5jZXN0b3IKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5sZWZ0LmxhYmVsPSBMb2NhbAotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnJpZ2h0LmxhYmVsPSBSZW1vdGUKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5iYWNrZ3JvdW5kQ29sb3IxLmxhYmVsPSBCYWMma2dyb3VuZCBDb2xvcjoKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5iYWNrZ3JvdW5kQ29sb3IyLmxhYmVsPSBTJnlzdGVtIERlZmF1bHQKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5iYWNrZ3JvdW5kQ29sb3IzLmxhYmVsPSBDJnVzdG9tCi0KLSMgQ29tcGFyZSBlZGl0b3IgY29udGVudHMgZm9yIENvbXBhcmUgcHJldmlldyBwYWdlCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UucHJldmlld0FuY2VzdG9yPSAxXG4yXG4zXG5jb25mbGljdFxuNFxuNQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnByZXZpZXdMZWZ0PSAxXG4yXG5vdXRnb2luZyBhZGRpdGlvblxuM1xub3V0Z29pbmcgY2hhbmdlXG40XG5wc2V1ZG8gY29uZmxpY3RcbjUKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5wcmV2aWV3UmlnaHQ9IDFcbmluY29taW5nIGFkZGl0aW9uXG5pbmNvbWluZyBhZGRpdGlvblxuMlxuM1xuaW5jb21pbmcgY2hhbmdlXG40XG5wc2V1ZG8gY29uZmxpY3RcbjUKLQotdGV4dENvbXBhcmVBcHBlYXJhbmNlLmxhYmVsPVRleHQgQ29tcGFyZQotCi1jb21wYXJlSW5jb21pbmdDb2xvci5sYWJlbD0gSW5jb21pbmcgY2hhbmdlIGNvbG9yCi1jb21wYXJlSW5jb21pbmdDb2xvci5kZXNjcmlwdGlvbj0gVGhlIGNvbG9yIHVzZWQgdG8gaW5kaWNhdGUgYW4gaW5jb21pbmcgY2hhbmdlIGluIGNvbXBhcmUgYW5kIG1lcmdlIHRvb2xzLgotY29tcGFyZU91dGdvaW5nQ29sb3IubGFiZWw9IE91dGdvaW5nIGNoYW5nZSBjb2xvcgotY29tcGFyZU91dGdvaW5nQ29sb3IuZGVzY3JpcHRpb249IFRoZSBjb2xvciB1c2VkIHRvIGluZGljYXRlIGFuIG91dGdvaW5nIGNoYW5nZSBpbiBjb21wYXJlIGFuZCBtZXJnZSB0b29scy4KLWNvbXBhcmVDb25mbGljdENvbG9yLmxhYmVsPSBDb25mbGljdGluZyBjaGFuZ2UgY29sb3IKLWNvbXBhcmVDb25mbGljdENvbG9yLmRlc2NyaXB0aW9uPSBUaGUgY29sb3IgdXNlZCB0byBpbmRpY2F0ZSBhIGNvbmZsaWN0aW5nIGNoYW5nZSBpbiBjb21wYXJlIGFuZCBtZXJnZSB0b29scy4KLWNvbXBhcmVSZXNvbHZlZENvbG9yLmxhYmVsPSBSZXNvbHZlZCBjaGFuZ2UgY29sb3IKLWNvbXBhcmVSZXNvbHZlZENvbG9yLmRlc2NyaXB0aW9uPSBUaGUgY29sb3IgdXNlZCB0byBpbmRpY2F0ZSBhIHJlc29sdmVkIGNoYW5nZSBpbiBtZXJnZSB0b29scy4KLQotY29tcGFyZUZvbnREZWZpbml0b24ubGFiZWw9IENvbXBhcmUgdGV4dCBmb250Ci1jb21wYXJlRm9udERlZmluaXRvbi5kZXNjcmlwdGlvbj0gVGhlIGNvbXBhcmUgdGV4dCBmb250IGlzIHVzZWQgYnkgdGV4dHVhbCBjb21wYXJlL21lcmdlIHRvb2xzLgotCi0jIE5ldyBVSQotI0NvbXBhcmVQcmVmZXJlbmNlUGFnZS51c2VTcGxpbmVzLmxhYmVsPSBVc2Ugc3BsaW5lcyBpbiBjZW50ZXIgcGFuZWwKLSNDb21wYXJlUHJlZmVyZW5jZVBhZ2UudXNlUmVzb2x2ZVVJLmxhYmVsPSBVc2UgbmV3IHJlc29sdmUgVUkKLQotQ29tcGFyZUVkaXRvcklucHV0LmRlZmF1bHRUaXRsZT0gQ29tcGFyZQotCi0jCi0jIFRvb2xiYXIgYWN0aW9ucwotIwotYWN0aW9uLklnbm9yZVdoaXRlU3BhY2UubGFiZWw9SWdub3JlIFdoaXRlIFNwYWNlCi1hY3Rpb24uSWdub3JlV2hpdGVTcGFjZS50b29sdGlwPUlnbm9yZSBXaGl0ZSBTcGFjZSBXaGVyZSBBcHBsaWNhYmxlCi1hY3Rpb24uSWdub3JlV2hpdGVTcGFjZS5pbWFnZT1ldG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmCi0KLWFjdGlvbi5OZXh0LmxhYmVsPU5leHQgRGlmZmVyZW5jZQotYWN0aW9uLk5leHQudG9vbHRpcD1HbyB0byBOZXh0IERpZmZlcmVuY2UKLWFjdGlvbi5OZXh0LmltYWdlPWVsY2wxNi9uZXh0X25hdi5naWYKLQotYWN0aW9uLlByZXZpb3VzLmxhYmVsPVByZXZpb3VzIERpZmZlcmVuY2UKLWFjdGlvbi5QcmV2aW91cy50b29sdGlwPUdvIHRvIFByZXZpb3VzIERpZmZlcmVuY2UKLWFjdGlvbi5QcmV2aW91cy5pbWFnZT1lbGNsMTYvcHJldl9uYXYuZ2lmCi0KLSMKLSMgQnVpbHQgaW4gU3RydWN0dXJlIENyZWF0b3JzCi0jCi1aaXBTdHJ1Y3R1cmVDcmVhdG9yLm5hbWU9WmlwIEFyY2hpdmUgQ29tcGFyZQotCi0jCi0jIENvbXBhcmUgRGlhbG9nCi0jCi1Db21wYXJlRGlhbG9nLmNvbW1pdEFjdGlvbi5sYWJlbD1Db21taXQKLUNvbXBhcmVEaWFsb2cuc2F2ZUVycm9yVGl0bGU9U2F2ZSBFcnJvciAKLUNvbXBhcmVEaWFsb2cuc2F2ZUVycm9yTWVzc2FnZT1DYW5ub3Qgc2F2ZQotCi0jCi0jIENvbXBhcmUgV2l0aCBFYWNoIE90aGVyCi0jCi1SZXNvdXJjZUNvbXBhcmUudGFza05hbWU9T3BlcmF0aW9uIGluIFByb2dyZXNzLi4uCi1SZXNvdXJjZUNvbXBhcmUudHdvV2F5LnRpdGxlPUNvbXBhcmUgKHswfS17MX0pCi1SZXNvdXJjZUNvbXBhcmUudHdvV2F5LnRvb2x0aXA9VHdvLXdheSBjb21wYXJlIG9mIHswfSB3aXRoIHsxfQotUmVzb3VyY2VDb21wYXJlLnRocmVlV2F5LnRpdGxlPUNvbXBhcmUgKHswfS17MX0tezJ9KQotUmVzb3VyY2VDb21wYXJlLnRocmVlV2F5LnRvb2x0aXA9VGhyZWUtd2F5IGNvbXBhcmUgb2YgezF9IGFuZCB7Mn0gcmVsYXRpdmUgdG8gY29tbW9uIGFuY2VzdG9yIHswfQotCi0jCi0jIERpZmZUcmVlVmlld2VyICYgRGlmZk5vZGVzCi0jCi1EaWZmVHJlZVZpZXdlci50aXRsZT0gU3RydWN0dXJlIENvbXBhcmUKLURpZmZOb2RlLm5vTmFtZT0gPG5vIG5hbWU+Ci1EaWZmTm9kZS5uYW1lRm9ybWF0PSB7MH0gLyB7MX0KLQotIwotIyBEaWZmZXJlbmNpbmcgZW5naW5lCi0jCi1EaWZmZXJlbmNlci5wcm9ncmVzc0Zvcm1hdD0gQ29tcGFyaW5nIHswfQotCi0jCi0jIFBhdGNoOiByZWplY3RlZCBwYXRjaCBtYXJrZXJzCi0jCi1yZWplY3RlZFBhdGNoTWFya2VyLm5hbWU9IFJlamVjdGVkIFBhdGNoCi0KLSMKLSMgVmFsaWRhdGVFZGl0Ci0jCi1WYWxpZGF0ZUVkaXQuZXJyb3IudW5hYmxlX3RvX3BlcmZvcm09IE9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkLgotVmFsaWRhdGVFZGl0LmVycm9yLmZpbGVNb2RpZmllZD0gRmlsZSAnJ3swfScnIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wZXJhdGlvbi4KLVZhbGlkYXRlRWRpdC5lcnJvci5zdGlsbFJlYWRvbmx5PSBGaWxlICcnezB9JycgaXMgcmVhZC1vbmx5LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzNWQ3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVVSVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iY29tcGFyZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gQ29tcGFyZSBleHRlbnNpb24gcG9pbnQgZGVmaW5pdGlvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzdHJlYW1NZXJnZXJzIiBuYW1lPSIlc3RyZWFtTWVyZ2VycyIgc2NoZW1hPSJzY2hlbWEvc3RyZWFtTWVyZ2Vycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzdHJ1Y3R1cmVDcmVhdG9ycyIgbmFtZT0iJXN0cnVjdHVyZUNyZWF0b3JzIiBzY2hlbWE9InNjaGVtYS9zdHJ1Y3R1cmVDcmVhdG9ycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzdHJ1Y3R1cmVNZXJnZVZpZXdlcnMiIG5hbWU9IiVzdHJ1Y3R1cmVNZXJnZVZpZXdlcnMiIHNjaGVtYT0ic2NoZW1hL3N0cnVjdHVyZU1lcmdlVmlld2Vycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb250ZW50TWVyZ2VWaWV3ZXJzIiBuYW1lPSIlY29udGVudE1lcmdlVmlld2VycyIgc2NoZW1hPSJzY2hlbWEvY29udGVudE1lcmdlVmlld2Vycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb250ZW50Vmlld2VycyIgbmFtZT0iJWNvbnRlbnRWaWV3ZXJzIiBzY2hlbWE9InNjaGVtYS9jb250ZW50Vmlld2Vycy5leHNkIi8+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotICAgICAgPHRoZW1lRWxlbWVudENhdGVnb3J5Ci0gICAgICAgICAgICBsYWJlbD0iJXRleHRDb21wYXJlQXBwZWFyYW5jZS5sYWJlbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXIiPgotICAgICAgPC90aGVtZUVsZW1lbnRDYXRlZ29yeT4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlY29tcGFyZUluY29taW5nQ29sb3IubGFiZWwiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXIiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfQkxVRSIKLSAgICAgICAgICAgIGlkPSJJTkNPTUlOR19DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY29tcGFyZUluY29taW5nQ29sb3IuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlY29tcGFyZU91dGdvaW5nQ29sb3IubGFiZWwiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXIiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfQkxBQ0siCi0gICAgICAgICAgICBpZD0iT1VUR09JTkdfQ09MT1IiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNvbXBhcmVPdXRnb2luZ0NvbG9yLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Y29sb3JEZWZpbml0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJWNvbXBhcmVDb25mbGljdENvbG9yLmxhYmVsIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyIgotICAgICAgICAgICAgdmFsdWU9IkNPTE9SX1JFRCIKLSAgICAgICAgICAgIGlkPSJDT05GTElDVElOR19DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY29tcGFyZUNvbmZsaWN0Q29sb3IuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlY29tcGFyZVJlc29sdmVkQ29sb3IubGFiZWwiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXIiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfR1JFRU4iCi0gICAgICAgICAgICBpZD0iUkVTT0xWRURfQ09MT1IiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNvbXBhcmVSZXNvbHZlZENvbG9yLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb2xvckRlZmluaXRpb24+Ci0gICAgICA8Zm9udERlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlY29tcGFyZUZvbnREZWZpbml0b24ubGFiZWwiCi0gICAgICAgICAgICBkZWZhdWx0c1RvPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Zm9udCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXIiPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb21wYXJlRm9udERlZmluaXRvbi5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZm9udERlZmluaXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InJlamVjdGVkUGF0Y2hNYXJrZXIiCi0gICAgICAgICBuYW1lPSIlcmVqZWN0ZWRQYXRjaE1hcmtlci5uYW1lIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSIlZGVmYXVsdENvbXBhcmVFZGl0b3IubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXZpZXcxNi9jb21wYXJlX3ZpZXcuZ2lmIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlRWRpdG9yQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5uYW1lIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwhLS0gY29tbWFuZHMgYW5kIHRoZWlyIGJpbmRpbmdzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNvbXBhcmVDYXRlZ29yeS5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb21wYXJlQ2F0ZWdvcnkuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS51aS5jYXRlZ29yeS5jb21wYXJlIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJUNvbW1hbmQuY29weVJpZ2h0VG9MZWZ0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbW1hbmQuY29weVJpZ2h0VG9MZWZ0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS51aS5jYXRlZ29yeS5jb21wYXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29weVJpZ2h0VG9MZWZ0Ij4KLSAgICAgIDwvY29tbWFuZD4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlQ29tbWFuZC5jb3B5TGVmdFRvUmlnaHQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQ29tbWFuZC5jb3B5TGVmdFRvUmlnaHQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnVpLmNhdGVnb3J5LmNvbXBhcmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb3B5TGVmdFRvUmlnaHQiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVDb21tYW5kLmNvcHlBbGxSaWdodFRvTGVmdC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVDb21tYW5kLmNvcHlBbGxSaWdodFRvTGVmdC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUudWkuY2F0ZWdvcnkuY29tcGFyZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvcHlBbGxSaWdodFRvTGVmdCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJUNvbW1hbmQuY29weUFsbExlZnRUb1JpZ2h0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbW1hbmQuY29weUFsbExlZnRUb1JpZ2h0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS51aS5jYXRlZ29yeS5jb21wYXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29weUFsbExlZnRUb1JpZ2h0Ij4KLSAgICAgIDwvY29tbWFuZD4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlQ29tbWFuZC5zZWxlY3ROZXh0Q2hhbmdlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbW1hbmQuc2VsZWN0TmV4dENoYW5nZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUudWkuY2F0ZWdvcnkuY29tcGFyZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnNlbGVjdE5leHRDaGFuZ2UiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVDb21tYW5kLnNlbGVjdFByZXZpb3VzQ2hhbmdlLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbW1hbmQuc2VsZWN0UHJldmlvdXNDaGFuZ2UuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnVpLmNhdGVnb3J5LmNvbXBhcmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5zZWxlY3RQcmV2aW91c0NoYW5nZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuTWVudUdyb3VwcyI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVSZXBsYWNlV2l0aE1lbnUubGFiZWwiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0icmVwbGFjZVdpdGhNZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9InJlcGxhY2VXaXRoR3JvdXAiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVDb21wYXJlV2l0aE1lbnUubGFiZWwiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0iY29tcGFyZVdpdGhNZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbXBhcmVXaXRoR3JvdXAiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVUZWFtTWVudS5sYWJlbCIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJ0ZWFtLm1haW4iPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAxIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUFjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUNvbXBhcmVXaXRoRWFjaE90aGVyQWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJUNvbXBhcmVXaXRoRWFjaE90aGVyQWN0aW9uLnRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbXBhcmVXaXRoTWVudS9jb21wYXJlV2l0aEdyb3VwIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMisiCi0gICAgICAgICAgICAgICBpZD0iY29tcGFyZVdpdGhFYWNoT3RoZXIiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUNvbXBhcmVXaXRoUGF0Y2hBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlQ29tcGFyZVdpdGhQYXRjaEFjdGlvbi50b29sdGlwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwucGF0Y2guQ29tcGFyZVdpdGhQYXRjaEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJ0ZWFtLm1haW4vZ3JvdXAxIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJjb21wYXJlV2l0aFBhdGNoIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5SZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24iPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlUmVwbGFjZVdpdGhNZW51LmxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9InJlcGxhY2VXaXRoTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJyZXBsYWNlV2l0aEdyb3VwIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVSZXBsYWNlRnJvbUhpc3RvcnlBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlUmVwbGFjZUZyb21IaXN0b3J5QWN0aW9uLnRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5SZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0icmVwbGFjZVdpdGhNZW51L3JlcGxhY2VXaXRoR3JvdXAiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9InJlcGxhY2VGcm9tSGlzdG9yeSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUmVwbGFjZVdpdGhQcmV2aW91c0Zyb21IaXN0b3J5QWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJVJlcGxhY2VXaXRoUHJldmlvdXNGcm9tSGlzdG9yeUFjdGlvbi50b29sdGlwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuUmVwbGFjZVdpdGhQcmV2aW91c0VkaXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0icmVwbGFjZVdpdGhNZW51L3JlcGxhY2VXaXRoR3JvdXAiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9InJlcGxhY2VXaXRoUHJldmlvdXNGcm9tSGlzdG9yeSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJUNvbXBhcmVXaXRoTWVudS5sYWJlbCIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJjb21wYXJlV2l0aE1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iY29tcGFyZVdpdGhHcm91cCI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ29tcGFyZVdpdGhIaXN0b3J5QWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJUNvbXBhcmVXaXRoSGlzdG9yeUFjdGlvbi50b29sdGlwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbXBhcmVXaXRoTWVudS9jb21wYXJlV2l0aEdyb3VwIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJjb21wYXJlV2l0aEhpc3RvcnkiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuQWRkRnJvbUhpc3RvcnlBY3Rpb24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhZGRGcm9tSGlzdG9yeUFjdGlvbi5sYWJlbCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhZGRGcm9tSGlzdG9yeUFjdGlvbi50b29sdGlwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQWRkRnJvbUhpc3RvcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0icmVwbGFjZVdpdGhNZW51IgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJhZGRGcm9tSGlzdG9yeUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLnN0cmVhbU1lcmdlcnMiPgotICAgICAgPHN0cmVhbU1lcmdlcgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0idHh0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuVGV4dFN0cmVhbU1lcmdlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLm1lcmdlLlRleHRTdHJlYW1NZXJnZXIiPgotICAgICAgPC9zdHJlYW1NZXJnZXI+Ci0gICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotICAgICAgCQlzdHJlYW1NZXJnZXJJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZS5UZXh0U3RyZWFtTWVyZ2VyIj4KLSAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZUNyZWF0b3JzIj4KLSAgICAgIDxzdHJ1Y3R1cmVDcmVhdG9yCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ6aXAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5aaXBGaWxlU3RydWN0dXJlQ3JlYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLlppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yIj4KLSAgICAgIDwvc3RydWN0dXJlQ3JlYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIj4KLSAgICAgIDx2aWV3ZXIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9ImNsYXNzLGV4ZSxkbGwsYmluYXJ5LHppcCxqYXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5CaW5hcnlDb21wYXJlVmlld2VyQ3JlYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLkJpbmFyeUNvbXBhcmVWaWV3ZXJDcmVhdG9yIj4KLSAgICAgIDwvdmlld2VyPgotICAgICAgPHZpZXdlcgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0idHh0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVGV4dE1lcmdlVmlld2VyQ3JlYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLlRleHRNZXJnZVZpZXdlckNyZWF0b3IiPgotICAgICAgPC92aWV3ZXI+Ci0gICAgICA8dmlld2VyCi0gICAgICAgICAgICBleHRlbnNpb25zPSJnaWYsanBnIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSW1hZ2VNZXJnZVZpZXdlckNyZWF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5JbWFnZU1lcmdlVmlld2VyQ3JlYXRvciI+Ci0gICAgICA8L3ZpZXdlcj4KLSAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotICAgICAgICAgICAgY29udGVudE1lcmdlVmlld2VySWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuVGV4dE1lcmdlVmlld2VyQ3JlYXRvciI+Ci0JICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50Vmlld2VycyI+Ci0gICAgICA8dmlld2VyCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ0eHQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5UZXh0Vmlld2VyQ3JlYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLlRleHRWaWV3ZXJDcmVhdG9yIj4KLSAgICAgIDwvdmlld2VyPgotICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiCi0gICAgICAgICAgICBjb250ZW50Vmlld2VySWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuVGV4dFZpZXdlckNyZWF0b3IiPgotCSAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjU2ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21wYXJlLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMWU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuY29tcGFyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZmFjZS50ZXh0PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuaWRlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS52aWV3czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTczNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jVHVlIE5vdiAzMCAxNTo1MTo0NyBDRVQgMjAwNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA0NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5jb21wYXJlLmphciA9IGNvbXBhcmUvCi1iaW4uaW5jbHVkZXMgPSBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvYnVpbGRub3Rlc19jb21wYXJlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2J1aWxkbm90ZXNfY29tcGFyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBhYTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvYnVpbGRub3Rlc19jb21wYXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbk5UOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDx0aXRsZT5FY2xpcHNlIFBsYXRmb3JtIFJlbGVhc2UgTm90ZXMgLSBEZXNrdG9wPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PiAKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUNvbXBhcmU8L2gxPgotCi1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDIybmQgMjAwNQotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc0MzQiPjg3NDM0PC9hPjogYWRkIGEgbGluayBpbiBTeW5jaHJvbml6ZS9Db21wYXJlIHRvIENvbXBhcmUvUGF0Y2g8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSA4dGggMjAwNQotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ0ODciPjg0NDg3PC9hPjogUGF0Y2ggdG8gcHV0IG1lbnUgcGF0aCBjb250cmlidXRpb25zIG9uIFJlc291cmNlTWFwcGluZ3M8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDExdGggMjAwNQotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE4NTMiPjgxODUzPC9hPjogcXVvdGUgcHJvYmxlbXMgaW4gcHJvcGVydHkgZmlsZXMgKGNvbXBhcmUpPGJyPgotCi0KLTxoMT48aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci0KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSA0dGggMjAwNQotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODAzODciPjgwMzg3PC9hPjogTlBFIG9wZW5pbmcgY29tcGFyZSBlZGl0b3I8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBEZWNlbWJlciA3dGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLUVsaW1pbmF0ZWQgYWxsIGNvbXBpbGVyIHdhcm5pbmdzPGJyPgotUmVtb3ZlZCBkZXBlbmRlbmN5IG9uIGNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAzMHRoIDIwMDQKLQotPGgyPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5NDE0Ij43OTQxNDwvYT46IHN0YXRlcyB3aXRoIHNhbWUgdGltZSBzdGFtcHMgbWF5IGFwcGVhciBpbiB0aGUgd3Jvbmcgb3JkZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5NTY2Ij43OTU2NjwvYT46IE5QRSB3aGVuIGNsb3NpbmcgSlVuaXQgY29tcGFyZSB2aWV3PGJyPgotCi0KLTxoMT48aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci0KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTm92ZW1iZXIgMjNyZCAyMDA0Ci0KLTxoMj5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00Nzc4NiI+NDc3ODY8L2E+OiBQb3NzaWJsZSBsZWFrIGluIFRleHRNZXJnZVZpZXdlcjxicj4KLUFkZGVkIHRyYW5zbGF0YWJsZSBhdHRyaWJ1dGUgdG8gZXh0ZW5zaW9uIHBvaW50IHNjaGVtYXMuCi0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAxNnRoIDIwMDQKLQotPGgyPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci0gPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODY3OSI+Nzg2Nzk8L2E+OiBQcmVmcyBGaWx0ZXJlZCBNZW1iZXJzIGZpZWxkIGRvZXMgbm90IHJlc3RvcmUgZGVmYXVsdHM8YnI+Ci0KLTxoMT48aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci0KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTm92ZW1iZXIgOXRoIDIwMDQKLQotPGgyPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci0gKHBhcnRpYWwgZml4OyBhd2FpdHMgZml4IGluIGpkdC51aSk6Ci0gPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzU5OSI+Nzc1OTk8L2E+OiBbNS4wXSBTdHJ1Y3R1cmUgY29tcGFyaW5nIG9mIGVudW1zIGRvZXMgbm90IHdvcms8YnI+Ci0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLQotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAxc3QgMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjU5ODEiPjY1OTgxPC9hPjogZW1wdHkgY29tcGFyZSB2aWV3ZXIgaGFzIG5vIGZvY3VzPGJyPgotCi0KLTxoMT48aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci0KLUVjbGlwc2UgQnVpbGQgSW5wdXQgU2VwdGVtYmVyIDIxdGggMjAwNAotCi08aDI+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NTAiPjc0NDUwPC9hPjogQWJzdHJhY3RVSVBsdWdpbi5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzIG5vIGxvbmdlciBjYWxsZWQ/PGJyPgotCi0KLTxoMT48aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEF1Z3VzdCAyNHRoIDIwMDQKLQotPGgyPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1FbGltaW5hdGVkIGNvbXBpbGVyIHdhcm5pbmdzCi0KLQotPGgxPjxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVseSAyN3RoIDIwMDQKLQotPGgyPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1VcGRhdGVkIHZlcnNpb24gbnVtYmVyIGluIHBsdWdpbi54bWwgYW5kIGV4cG9ydCBzY3JpcHQgdG8gMy4xCi0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQnVmZmVyZWRDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9CdWZmZXJlZENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwMWMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9CdWZmZXJlZENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlV0aWxpdGllczsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBidWZmZXJlZCA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPi4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgPGNvZGU+Y3JlYXRlU3RyZWFtPC9jb2RlPiBtZXRob2QKLSAqIHRvIGNvbm5lY3QgdGhlIGJ1ZmZlcmVkIGNvbnRlbnQgd2l0aCBhIHN0cmVhbWFibGUgc291cmNlIChlLmcuLCBhIGZpbGUpLgotICogPHA+Ci0gKiBBcyBsb25nIGFzIHRoZSBjb250ZW50cyBvZiA8Y29kZT5CdWZmZXJlZENvbnRlbnQ8L2NvZGU+IGlzIG9ubHkgcmV0cmlldmVkIGFzIGFuIGlucHV0IHN0cmVhbQotICogKGJ5IG1lYW5zIG9mIDxjb2RlPmdldENvbnRlbnRzPC9jb2RlPikgYW5kIHRoZSA8Y29kZT5CdWZmZXJlZENvbnRlbnQ8L2NvZGU+IGlzIG5vdCBtb2RpZmllZCAod2l0aAotICogPGNvZGU+c2V0Q29udGVudDwvY29kZT4pIG5vIGJ1ZmZlcmluZyB0YWtlcyBwbGFjZS4KLSAqIEJ1ZmZlcmluZyBzdGFydHMgd2hlbiBlaXRoZXIgbWV0aG9kIDxjb2RlPmdldENvbnRlbnQ8L2NvZGU+IG9yIDxjb2RlPnNldENvbnRlbnQ8L2NvZGU+IGlzIGNhbGxlZC4KLSAqIAotICogQHNlZSBJQ29udGVudENoYW5nZU5vdGlmaWVyCi0gKiBAc2VlIElTdHJlYW1Db250ZW50QWNjZXNzb3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1ZmZlcmVkQ29udGVudCBpbXBsZW1lbnRzIElDb250ZW50Q2hhbmdlTm90aWZpZXIsIElTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCQotCWJ5dGVbXSBmQ29udGVudDsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJMaXN0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBidWZmZXJlZCBzdHJlYW0gY29udGVudCBhY2Nlc3Nvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQnVmZmVyZWRDb250ZW50KCkgewotCQkvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIHNlZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yLmdldENvbnRlbnRzCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZkNvbnRlbnQpOwotCQlyZXR1cm4gY3JlYXRlU3RyZWFtKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHN0cmVhbSBmb3IgcmVhZGluZyB0aGUgY29udGVudHMuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgY29udGVudCBpcyByZWFkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgYWNjZXNzZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW5wdXRTdHJlYW0gY3JlYXRlU3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudHMuIFJlZ2lzdGVyZWQgY29udGVudCBjaGFuZ2UgbGlzdGVuZXJzIGFyZSBub3RpZmllZC4KLQkgKgotCSAqIEBwYXJhbSBjb250ZW50cyB0aGUgbmV3IGNvbnRlbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gY29udGVudHMpIHsKLQkJZkNvbnRlbnQ9IGNvbnRlbnRzOwotCQlmaXJlQ29udGVudENoYW5nZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudHMgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBhcyBhbiBhcnJheSBvZiBieXRlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgYWNjZXNzZWQKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB7Ci0JCWlmIChmQ29udGVudCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlzPSBjcmVhdGVTdHJlYW0oKTsKLQkJCQlmQ29udGVudD0gVXRpbGl0aWVzLnJlYWRCeXRlcyhpcyk7Ci0JCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNjYXJkcyB0aGUgYnVmZmVyZWQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjYXJkQnVmZmVyKCkgewotCQlmQ29udGVudD0gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIHNlZSBJQ29udGVudENoYW5nZU5vdGlmaWVyLmFkZENoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29udGVudENoYW5nZUxpc3RlbmVyKElDb250ZW50Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lckxpc3QgPT0gbnVsbCkKLQkJCWZMaXN0ZW5lckxpc3Q9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJZkxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogc2VlIElDb250ZW50Q2hhbmdlTm90aWZpZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZW50Q2hhbmdlTGlzdGVuZXIoSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVyTGlzdCAhPSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlpZiAoZkxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpCi0JCQkJZkxpc3RlbmVyTGlzdD0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5JQ29udGVudENoYW5nZUxpc3RlbmVyPC9jb2RlPnMgb2YgYSBjb250ZW50IGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ29udGVudENoYW5nZWQoKSB7Ci0JCWlmIChmTGlzdGVuZXJMaXN0ICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGxpc3RlbmVycz0gZkxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspCi0JCQkJKChJQ29udGVudENoYW5nZUxpc3RlbmVyKWxpc3RlbmVyc1tpXSkuY29udGVudENoYW5nZWQodGhpcyk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY4OWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmZXJlbmNlcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBhcmVDb25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QKLSAqIGNvbnRyb2xzIHZhcmlvdXMgVUkgYXNwZWN0cyBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMgbGlrZQotICogdGl0bGUgbGFiZWxzIGFuZCBpbWFnZXMsIG9yIHdoZXRoZXIgYSBzaWRlIG9mIGEgbWVyZ2Ugdmlld2VyIGlzIGVkaXRhYmxlLgotICogSW4gYWRkaXRpb24gdG8gdGhlc2UgZml4ZWQgcHJvcGVydGllcyA8Y29kZT5JQ29tcGFyZUNvbmZpZ3VyYXRpb248L2NvZGU+IHByb3ZpZGVzCi0gKiBBUEkgZm9yIGFuIG9wZW4gZW5kZWQgc2V0IG9mIHByb3BlcnRpZXMuIERpZmZlcmVudCB2aWV3ZXJzIHdoaWNoIHNoYXJlIHRoZSBzYW1lCi0gKiBjb25maWd1cmF0aW9uIGNhbiBjb21tdW5pY2F0ZSB2aWEgdGhpcyBtZWNoYW5pc20uIEUuZy4gaWYgYSBjb21wYXJlIGVkaXRvcgotICogaGFzIGEgYnV0dG9uIGZvciBjb250cm9sbGluZyB3aGV0aGVyIGNvbXBhcmUgdmlld2VycyBpZ25vcmUgd2hpdGUgc3BhY2UsCi0gKiB0aGUgYnV0dG9uIHdvdWxkIHRyaWdnZXIgYSBjaGFuZ2Ugb2YgdGhlIGJvb2xlYW4gPGNvZGU+SUdOT1JFX1dISVRFU1BBQ0U8L2NvZGU+IHByb3BlcnR5Ci0gKiBhbmQgYWxsIGludGVyZXN0ZWQgdmlld2VycyB3b3VsZCByZWNlaXZlIG5vdGlmaWNhdGlvbi4KLSAqIDxwPgotICogU3VpdGFibGUgZGVmYXVsdCBsYWJlbHMgYXJlIHByb3ZpZGVkICh3aXRob3V0IGltYWdlcyk7IGJvdGggdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzCi0gKiBhcmUgZWRpdGFibGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IHVzZSB0aGlzIGNsYXNzIGFzIGlzLCBvciBzdWJjbGFzcyB0byBhZGQgbmV3IHN0YXRlIGFuZCBiZWhhdmlvci4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVDb25maWd1cmF0aW9uIHsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGlnbm9yZSB3aGl0ZXNwYWNlIHByb3BlcnR5ICh2YWx1ZSA8Y29kZT4iSUdOT1JFX1dISVRFU1BBQ0UiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX1dISVRFU1BBQ0U9ICJJR05PUkVfV0hJVEVTUEFDRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBzaG93IHBzZXVkbyBjb25mbGljdHMgcHJvcGVydHkgKHZhbHVlIDxjb2RlPiJTSE9XX1BTRVVET19DT05GTElDVFMiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19QU0VVRE9fQ09ORkxJQ1RTPSAiU0hPV19QU0VVRE9fQ09ORkxJQ1RTIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgdGhlIHVzZSBvdXRsaW5lIHZpZXcgcHJvcGVydHkgKHZhbHVlIDxjb2RlPiJVU0VfT1VUTElORV9WSUVXIjwvY29kZT4pLgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfT1VUTElORV9WSUVXPSAiVVNFX09VVExJTkVfVklFVyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIPSAyMjsKLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3JbXSBmZ0ltYWdlcz0gbmV3IEltYWdlRGVzY3JpcHRvclsxNl07Ci0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGZnRHVtbXk9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGZnTWFwPSBuZXcgSGFzaE1hcCgyMCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmTGVmdElzTG9jYWw9IHRydWU7Ci0KLQlzdGF0aWMgewotCQlpZiAoZkxlZnRJc0xvY2FsKSB7Ci0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5BRERJVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2RlbF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuTEVGVCArIERpZmZlcmVuY2VyLkFERElUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvcl9pbmFkZF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuUklHSFQgKyBEaWZmZXJlbmNlci5BRERJVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L3Jfb3V0YWRkX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLkRFTEVUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvYWRkX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5MRUZUICsgRGlmZmVyZW5jZXIuREVMRVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9yX2luZGVsX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5SSUdIVCArIERpZmZlcmVuY2VyLkRFTEVUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvcl9vdXRkZWxfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuTEVGVCArIERpZmZlcmVuY2VyLkNIQU5HRV09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L3JfaW5jaGdfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLlJJR0hUICsgRGlmZmVyZW5jZXIuQ0hBTkdFXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvcl9vdXRjaGdfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLkFERElUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvYWRkX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5MRUZUICsgRGlmZmVyZW5jZXIuQURESVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9pbmFkZF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuUklHSFQgKyBEaWZmZXJlbmNlci5BRERJVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L291dGFkZF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5ERUxFVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2RlbF9vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuTEVGVCArIERpZmZlcmVuY2VyLkRFTEVUSU9OXT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvaW5kZWxfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZnSW1hZ2VzW0RpZmZlcmVuY2VyLlJJR0hUICsgRGlmZmVyZW5jZXIuREVMRVRJT05dPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9vdXRkZWxfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuTEVGVCArIERpZmZlcmVuY2VyLkNIQU5HRV09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2luY2hnX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlmZ0ltYWdlc1tEaWZmZXJlbmNlci5SSUdIVCArIERpZmZlcmVuY2VyLkNIQU5HRV09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L291dGNoZ19vdi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuQ09ORkxJQ1RJTkcgKyBEaWZmZXJlbmNlci5BRERJVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2NvbmZhZGRfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuQ09ORkxJQ1RJTkcgKyBEaWZmZXJlbmNlci5ERUxFVElPTl09IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIm92cjE2L2NvbmZkZWxfb3YuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdJbWFnZXNbRGlmZmVyZW5jZXIuQ09ORkxJQ1RJTkcgKyBEaWZmZXJlbmNlci5DSEFOR0VdPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9jb25mY2hnX292LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVycz0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgSGFzaE1hcCBmUHJvcGVydGllcz0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGJvb2xlYW4gZkxlZnRFZGl0YWJsZT0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZlJpZ2h0RWRpdGFibGU9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkFuY2VzdG9yTGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxlZnRMYWJlbDsKLQlwcml2YXRlIFN0cmluZyBmUmlnaHRMYWJlbDsKLQlwcml2YXRlIEltYWdlIGZBbmNlc3RvckltYWdlOwotCXByaXZhdGUgSW1hZ2UgZlJpZ2h0SW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmTGVmdEltYWdlOwotCXByaXZhdGUgSW1hZ2VbXSBmSW1hZ2VzPSBuZXcgSW1hZ2VbMTZdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIGVkaXRhYmxlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzLAotCSAqIHN1aXRhYmxlIGRlZmF1bHQgbGFiZWxzLCBhbmQgbm8gaW1hZ2VzLgotCSAqIFRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0b3JlIGlzIHVzZWQgdG8gY29ubmVjdCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiB3aXRoIHRoZSBDb21wYXJlIHByZWZlcmVuY2UgcGFnZSBwcm9wZXJ0aWVzIDxjb2RlPkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5JTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FPC9jb2RlPiwKLQkgKiBhbmQgPGNvZGU+Q29tcGFyZUNvbmZpZ3VyYXRpb24uSUdOT1JFX1dISVRFU1BBQ0U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUgd2hpY2ggdGhpcyBjb25maWd1cmF0aW9uIGhvbGRzIG9udG8uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBDb21wYXJlQ29uZmlndXJhdGlvbihJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSkgewotCQkKLQkJc2V0UHJvcGVydHkoIkxFRlRfSVNfTE9DQUwiLCBuZXcgQm9vbGVhbihmTGVmdElzTG9jYWwpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZlByZWZlcmVuY2VTdG9yZT0gcHJlZlN0b3JlOwotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGI9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSk7Ci0JCQlzZXRQcm9wZXJ0eShDb21wYXJlUHJlZmVyZW5jZVBhZ2UuSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSwgbmV3IEJvb2xlYW4oYikpOwotCQkJCi0JCQliPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tcGFyZVByZWZlcmVuY2VQYWdlLklHTk9SRV9XSElURVNQQUNFKTsKLQkJCXNldFByb3BlcnR5KENvbXBhcmVDb25maWd1cmF0aW9uLklHTk9SRV9XSElURVNQQUNFLCBuZXcgQm9vbGVhbihiKSk7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIGVkaXRhYmxlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzLAotCSAqIHN1aXRhYmxlIGRlZmF1bHQgbGFiZWxzLCBhbmQgbm8gaW1hZ2VzLgotCSAqIFRoaXMgY29uZmlndXJhdGlvbiB1c2VzIHRoZSBwcmVmZXJlbmNlIHN0b3JlIG9mIHRoZSBDb21wYXJlIHBsdWdpbgotCSAqICg8Y29kZT5Db21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpPC9jb2RlPikuCi0JICovCi0JcHVibGljIENvbXBhcmVDb25maWd1cmF0aW9uKCkgewotCQl0aGlzKENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmVmZXJlbmNlIHN0b3JlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHN0b3JlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBzaG93aW5nIHRoZSBzcGVjaWZpZWQgY2hhbmdlIGtpbmQuCi0JICogVGhlIGRpZmZlcmVudCBraW5kIG9mIGNoYW5nZXMgYXJlIGRlZmluZWQgaW4gdGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPi4KLQkgKiBOZXdseSBjcmVhdGVkIGltYWdlcyBhcmUgcmVtZW1iZXJlZCBieSB0aGlzIGNsYXNzIGFuZAotCSAqIGRpc3Bvc2VkIHdoZW4gdGhlIDxjb2RlPmRpc3Bvc2U8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCi0JICoKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBjaGFuZ2UgYXMgZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4uCi0JICogQHJldHVybiBhbiBtb2RpZmljYXRpb24gb2YgdGhlIGJhc2UgaW1hZ2UgcmVmbGVjdGluZyB0aGUga2luZCBvZiBjaGFuZ2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShpbnQga2luZCkgewotCQlJbWFnZSBpbWFnZT0gZkltYWdlc1traW5kICYgMTVdOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSBmZ0ltYWdlc1traW5kICYgMTVdOwotCQkJaWYgKGlkICE9IG51bGwpCQkJCQotCQkJCWltYWdlPSBpZC5jcmVhdGVJbWFnZSgpOwotCQkJZkltYWdlc1traW5kICYgMTVdPSBpbWFnZTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2Ugc2hvd2luZyB0aGUgc3BlY2lmaWVkIGNoYW5nZSBraW5kIGFwcGxpZWQgdG8gYQotCSAqIGdpdmVuIGJhc2UgaW1hZ2UuIFRoZSBkaWZmZXJlbnQga2luZCBvZiBjaGFuZ2VzIGFyZSBkZWZpbmVkIGluIHRoZSA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4uCi0JICogVHlwaWNhbGx5IGFuIGltcGxlbWVudGF0aW9uIHdvdWxkIGJ1aWxkIGEgY29tcG9zaXRlIGltYWdlIAotCSAqIGZyb20gdGhlIGdpdmVuIGJhc2UgaW1hZ2UgYW5kIGFuIGltYWdlIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIGtpbmQuCi0JICogTmV3bHkgY3JlYXRlZCBpbWFnZXMgYXJlIHJlbWVtYmVyZWQgYnkgdGhpcyBjbGFzcyBhbmQKLQkgKiBkaXNwb3NlZCB3aGVuIHRoZSA8Y29kZT5kaXNwb3NlPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqCi0JICogQHBhcmFtIGJhc2UgdGhlIGltYWdlIHdoaWNoIGlzIG1vZGlmaWVkIHRvIHJlZmxlY3QgdGhlIGtpbmQgb2YgY2hhbmdlCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgY2hhbmdlIGFzIGRlZmluZWQgaW4gPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+LgotCSAqIEByZXR1cm4gYW4gbW9kaWZpY2F0aW9uIG9mIHRoZSBiYXNlIGltYWdlIHJlZmxlY3RpbmcgdGhlIGtpbmQgb2YgY2hhbmdlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmZXJlbmNlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShJbWFnZSBiYXNlLCBpbnQga2luZCkgewotCi0JCU9iamVjdCBrZXk9IGJhc2U7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCWtleT0gZmdEdW1teTsKLQotCQlraW5kICY9IDE1OwotCi0JCUltYWdlW10gYT0gKEltYWdlW10pIGZnTWFwLmdldChrZXkpOwotCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQlhPSBuZXcgSW1hZ2VbMTZdOwotCQkJZmdNYXAucHV0KGtleSwgYSk7Ci0JCX0KLQkJSW1hZ2UgYj0gYVtraW5kXTsKLQkJaWYgKGIgPT0gbnVsbCkgewotCQkJYj0gbmV3IERpZmZJbWFnZShiYXNlLCBmZ0ltYWdlc1traW5kXSwgV0lEVEgsICFmTGVmdElzTG9jYWwpLmNyZWF0ZUltYWdlKCk7Ci0JCQlDb21wYXJlVUkuZGlzcG9zZU9uU2h1dGRvd24oYik7Ci0JCQlhW2tpbmRdPSBiOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoaXMgY29tcGFyZSBjb25maWd1cmF0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciB1c2VkLgotCSAqIEFuIGltcGxlbWVudGF0aW9uIG11c3QgZGlzcG9zZSBvZiBhbGwgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmSW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmSW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCQlJbWFnZSBpbWFnZT0gZkltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKQotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZkltYWdlcz0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhIDxjb2RlPlByb3BlcnR5Q2hhbmdlRXZlbnQ8L2NvZGU+IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZAotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgcHJvcGVydHkncyBvbGQgdmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudD0gbnVsbDsKLQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsPSAoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQkJZXZlbnQ9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQlsLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24gamF2YWRvYykKLQkgKiBzZWUgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uIGphdmFkb2MpCi0JICogc2VlIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiBJZiB0aGUgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgb2xkIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4KLQkgKiBpcyBzZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ci0JICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZT0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCWZQcm9wZXJ0aWVzLnB1dChrZXksIG5ld1ZhbHVlKTsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpCi0JCQlmaXJlQ2hhbmdlKGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHN1Y2ggcHJvcGVydHkgZXhpc3RzLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCX0KLQotCS8vLS0tLSBhbmNlc3RvcgotCQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsIHRvIHVzZSBmb3IgdGhlIGFuY2VzdG9yIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2Vycy4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbmV3IGxhYmVsIGZvciB0aGUgYW5jZXN0b3Igb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5jZXN0b3JMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJZkFuY2VzdG9yTGFiZWw9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgYW5jZXN0b3Igc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhpcyBsYWJlbCBpcyB0eXBpY2FsbHkgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSBhbmNlc3RvciBhcmVhIGluIGEgY29tcGFyZSB2aWV3ZXIuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgaW5wdXQgb2JqZWN0IG9mIGEgY29tcGFyZS9tZXJnZSB2aWV3ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFuY2VzdG9yTGFiZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZBbmNlc3RvckxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byB1c2UgZm9yIHRoZSBhbmNlc3RvciBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhlIENvbXBhcmVDb25maWd1cmF0aW9uIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZGlzcG9zZSB0aGUgb2xkIGltYWdlLgotCSAqCi0JICogQHBhcmFtIGltYWdlIHRoZSBuZXcgaW1hZ2UgZm9yIHRoZSBhbmNlc3RvciBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbmNlc3RvckltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWZBbmNlc3RvckltYWdlPSBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqIFRoaXMgaW1hZ2UgaXMgdHlwaWNhbGx5IHNob3duIGluIHRoZSB0aXRsZSBvZiB0aGUgYW5jZXN0b3IgYXJlYSBpbiBhIGNvbXBhcmUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGlucHV0IG9iamVjdCBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSBhbmNlc3RvciBzaWRlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCQotCXB1YmxpYyBJbWFnZSBnZXRBbmNlc3RvckltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmQW5jZXN0b3JJbWFnZTsKLQl9Ci0KLQkvLy0tLS0gbGVmdCBzaWRlCi0JCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciB0aGUgbGVmdCBzaWRlIG9mIGEgbWVyZ2Ugdmlld2VyIGlzIGVkaXRhYmxlLgotCSAqCi0JICogQHBhcmFtIGVkaXRhYmxlIGlmIHRoZSB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBsZWZ0IHNpZGUgaXMgZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlmTGVmdEVkaXRhYmxlPSBlZGl0YWJsZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhIG1lcmdlIHZpZXdlciBpcyBlZGl0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsZWZ0IGhhbmQgc2lkZSBpcyBlZGl0YWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVmdEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZkxlZnRFZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqCi0JICogQHBhcmFtIGxhYmVsIHRoZSBuZXcgbGFiZWwgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVmdExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlmTGVmdExhYmVsPSBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhpcyBsYWJlbCBpcyB0eXBpY2FsbHkgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSBsZWZ0IHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlci4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBpbnB1dCBvYmplY3Qgb2YgYSBjb21wYXJlL21lcmdlIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgbGVmdCBoYW5kIHNpZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExlZnRMYWJlbChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZkxlZnRMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byB1c2UgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqIFRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBkaXNwb3NlIHRoZSBvbGQgaW1hZ2UuCi0JICoKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIG5ldyBpbWFnZSBmb3IgdGhlIGxlZnQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJZkxlZnRJbWFnZT0gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMuCi0JICogVGhpcyBpbWFnZSBpcyB0eXBpY2FsbHkgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSBsZWZ0IHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlci4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBpbnB1dCBvYmplY3Qgb2YgYSBjb21wYXJlL21lcmdlIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgbGVmdCBoYW5kIHNpZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8JCi0JcHVibGljIEltYWdlIGdldExlZnRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZkxlZnRJbWFnZTsKLQl9Ci0JCi0JLy8tLS0tIHJpZ2h0IHNpZGUKLQotCS8qKgotCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHJpZ2h0IHNpZGUgb2YgYSBtZXJnZSB2aWV3ZXIgaXMgZWRpdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gZWRpdGFibGUgaWYgdGhlIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+IHJpZ2h0IHNpZGUgaXMgZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJZlJpZ2h0RWRpdGFibGU9IGVkaXRhYmxlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhIG1lcmdlIHZpZXdlciBpcyBlZGl0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JpZ2h0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBmUmlnaHRFZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSByaWdodCBzaWRlIG9mIGNvbXBhcmUvbWVyZ2Ugdmlld2Vycy4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbmV3IGxhYmVsIGZvciB0aGUgcmlnaHQgc2lkZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlmUmlnaHRMYWJlbD0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqIFRoaXMgbGFiZWwgaXMgdHlwaWNhbGx5IHNob3duIGluIHRoZSB0aXRsZSBvZiB0aGUgcmlnaHQgc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGlucHV0IG9iamVjdCBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSByaWdodCBoYW5kIHNpZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpZ2h0TGFiZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZSaWdodExhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIHRvIHVzZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqIFRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBkaXNwb3NlIHRoZSBvbGQgaW1hZ2UuCi0JICoKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIG5ldyBpbWFnZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmlnaHRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlmUmlnaHRJbWFnZT0gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXJzLgotCSAqIFRoaXMgaW1hZ2UgaXMgdHlwaWNhbGx5IHNob3duIGluIHRoZSB0aXRsZSBvZiB0aGUgcmlnaHQgc2lkZSBvZiBhIGNvbXBhcmUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGlucHV0IG9iamVjdCBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSByaWdodCBoYW5kIHNpZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0UmlnaHRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZlJpZ2h0SW1hZ2U7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2IyY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOyAKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotCi0KLS8qKgotICogQSBjb21wYXJlIG9wZXJhdGlvbiB3aGljaCBjYW4gcHJlc2VudCBpdHMgcmVzdWx0cyBpbiBhIHNwZWNpYWwgZWRpdG9yLgotICogUnVubmluZyB0aGUgY29tcGFyZSBvcGVyYXRpb24gYW5kIHByZXNlbnRhdGluZyB0aGUgcmVzdWx0cyBpbiBhIGNvbXBhcmUgZWRpdG9yCi0gKiBhcmUgY29tYmluZWQgaW4gb25lIGNsYXNzIGJlY2F1c2UgaXQgYWxsb3dzIGEgY2xpZW50IHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBhbGwgaW4gb25lIHBsYWNlIHdoaWxlIHNlcGFyYXRpbmcgaXQgZnJvbSB0aGUgaW5uYXJkcyBvZiBhIHNwZWNpZmljIFVJIGltcGxlbWVudGF0aW9uIG9mIGNvbXBhcmUvbWVyZ2UuCi0gKiA8cD4gCi0gKiBBIDxjb2RlPkNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4gZGVmaW5lcyBtZXRob2RzIGZvciB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIHN0ZXBzOgotICogPFVMPgotICogPExJPnJ1bm5pbmcgYSBsZW5ndGh5IGNvbXBhcmUgb3BlcmF0aW9uIHVuZGVyIHByb2dyZXNzIG1vbml0b3IgY29udHJvbCwKLSAqIDxMST5jcmVhdGluZyBhIFVJIGZvciBkaXNwbGF5aW5nIHRoZSBtb2RlbCBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzb21lIHdpZGdldHMgd2l0aCB0aGUgY29tcGFyZSByZXN1bHQsCi0gKiA8TEk+dHJhY2tpbmcgdGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBtb2RlbCBpbiBjYXNlIG9mIG1lcmdlLAotICogPExJPnNhdmluZyB0aGUgbW9kZWwuCi0gKiA8L1VMPgotICogVGhlIENvbXBhcmUgcGx1Zy1pbidzIDxjb2RlPm9wZW5Db21wYXJlRWRpdG9yPC9jb2RlPiBtZXRob2QgdGFrZXMgYW4gPGNvZGU+SUNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4KLSAqIGFuZCBzdGFydHMgc2VxdWVuY2luZyB0aHJvdWdoIHRoZSBhYm92ZSBzdGVwcy4gSWYgdGhlIGNvbXBhcmUgcmVzdWx0IGlzIG5vdCBlbXB0eSBhIG5ldyBjb21wYXJlIGVkaXRvcgotICogaXMgb3BlbmVkIGFuZCB0YWtlcyBvdmVyIHRoZSBzZXF1ZW5jZSB1bnRpbCBldmVudHVhbGx5IGNsb3NlZC4KLSAqIDxwPgotICogVGhlIDxjb2RlPnByZXBhcmVJbnB1dDwvY29kZT4gbWV0aG9kIHNob3VsZCBjb250YWluIHRoZQotICogY29kZSBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24uIEl0IGlzIGV4ZWN1dGVkIHVuZGVyIGNvbnRyb2wgb2YgYSBwcm9ncmVzcyBtb25pdG9yCi0gKiBhbmQgY2FuIGJlIGNhbmNlbGVkLiBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJlIGlzIG5vdCBlbXB0eSwgdGhhdCBpcyBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMKLSAqIHRoYXQgbmVlZHMgdG8gYmUgcHJlc2VudGVkLCB0aGUgPGNvZGU+SUNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4gc2hvdWxkIGhvbGQgb250byB0aGVtIGFuZCByZXR1cm4gdGhlbSB3aXRoCi0gKiB0aGUgPGNvZGU+Z2V0Q29tcGFyZVJlc3VsdDwvY29kZT4gbWV0aG9kLgotICogSWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gPGNvZGU+Z2V0Q29tcGFyZVJlc3VsdDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0gKiBhIGNvbXBhcmUgZWRpdG9yIGlzIG9wZW5lZCBvbiB0aGUgPGNvZGU+SUNvbXBhcmVFZGl0b3JJbnB1dDwvY29kZT4gd2l0aCB0aXRsZSBhbmQgdGl0bGUgaW1hZ2UgaW5pdGlhbGl6ZWQgYnkgdGhlCi0gKiBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb2YgdGhlIDxjb2RlPklDb21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+LgotICogPHA+Ci0gKiBDcmVhdGlvbiBvZiB0aGUgZWRpdG9yJ3MgU1dUIGNvbnRyb2xzIGlzIGRlbGVnYXRlZCB0byB0aGUgPGNvZGU+Y3JlYXRlQ29udGVudHM8L2NvZGU+IG1ldGhvZC4KLSAqIEhlcmUgdGhlIFNXVCBjb250cm9scyBtdXN0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkICB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uLgotICogPHA+Ci0gKiBJZiBtZXJnaW5nIGlzIGFsbG93ZWQsIHRoZSBtb2RpZmljYXRpb24gc3RhdGUgb2YgdGhlIGNvbXBhcmVkIGNvbnN0aXR1ZW50cyBtdXN0IGJlIHRyYWNrZWQgYW5kIHRoZSBkaXJ0eQotICogc3RhdGUgcmV0dXJuZWQgZnJvbSBtZXRob2QgPGNvZGU+aXNTYXZlTmVlZGVkPC9jb2RlPi4gVGhlIHZhbHVlIDxjb2RlPnRydWU8L2NvZGU+IHRyaWdnZXJzIGEgc3Vic2VxdWVudCBjYWxsCi0gKiB0byA8Y29kZT5zYXZlPC9jb2RlPiB3aGVyZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzIGNhbiBiZSBzYXZlZC4KLSAqIDxwPgotICogVGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgc2V0dXAgb2YgdGhlIGNvbXBhcmUvbWVyZ2UgVUkuCi0gKiBUaGUgVUkgdXNlcyBhIHNpbXBsZSBicm93c2VyIG1ldGFwaG9yIHRvIHByZXNlbnQgY29tcGFyZSByZXN1bHRzLgotICogVGhlIHRvcCBoYWxmIG9mIHRoZSBsYXlvdXQgc2hvd3MgdGhlIHN0cnVjdHVyYWwgY29tcGFyZSByZXN1bHRzIChlLmcuIGFkZGVkLCBkZWxldGVkLCBhbmQgY2hhbmdlZCBmaWxlcyksCi0gKiB0aGUgYm90dG9tIGhhbGYgdGhlIGNvbnRlbnQgY29tcGFyZSByZXN1bHRzIChlLmcuIHRleHR1YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gZmlsZXMpLgotICogQSBzZWxlY3Rpb24gaW4gdGhlIHRvcCBwYW5lIGlzIGZlZCB0byB0aGUgYm90dG9tIHBhbmUuIElmIGEgY29udGVudCB2aWV3ZXIgaXMgcmVnaXN0ZXJlZAotICogZm9yIHRoZSB0eXBlIG9mIHRoZSBzZWxlY3RlZCBvYmplY3QsIHRoaXMgdmlld2VyIGlzIGluc3RhbGxlZCBpbiB0aGUgcGFuZS4KLSAqIEluIGFkZGl0aW9uIGlmIGEgc3RydWN0dXJlIHZpZXdlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgc2VsZWN0aW9uIHR5cGUgdGhlIHRvcCBwYW5lCi0gKiBpcyBzcGxpdCBob3Jpem9udGFsbHkgdG8gbWFrZSByb29tIGZvciBhbm90aGVyIHBhbmUgYW5kIHRoZSBzdHJ1Y3R1cmUgdmlld2VyIGlzIGluc3RhbGxlZAotICogaW4gaXQuIFdoZW4gY29tcGFyaW5nIEphdmEgZmlsZXMgdGhpcyBzZWNvbmQgc3RydWN0dXJlIHZpZXdlciB3b3VsZCBzaG93IHRoZSBzdHJ1Y3R1cmFsCi0gKiBkaWZmZXJlbmNlcyB3aXRoaW4gYSBKYXZhIGZpbGUsIGUuZy4gYWRkZWQsIGRlbGV0ZWQgb3IgY2hhbmdlZCBtZXRob2RzIGFuZCBmaWVsZHMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgcHJvdmlkZSBjdXN0b20gc2V0dXBzLCBlLmcuIGZvciBhIENhdGNodXAvUmVsZWFzZSBvcGVyYXRpb24KLSAqIGJ5IHBhc3NpbmcgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wYXJlQ29uZmlndXJhdGlvbjwvY29kZT4gYW5kIGJ5IGltcGxlbWVudGluZyB0aGUgPGNvZGU+cHJlcGFyZUlucHV0PC9jb2RlPiBtZXRob2QuCi0gKiBJZiBhIHN1YmNsYXNzIGNhbm5vdCB1c2UgdGhlIDxjb2RlPkRpZmZUcmVlVmlld2VyPC9jb2RlPiB3aGljaCBpcyBpbnN0YWxsZWQgYnkgZGVmYXVsdCBpbiB0aGUKLSAqIHRvcCBsZWZ0IHBhbmUsIG1ldGhvZCA8Y29kZT5jcmVhdGVEaWZmVmlld2VyPC9jb2RlPiBjYW4gYmUgb3ZlcnJpZGRlbi4KLSAqIAotICogQHNlZSBDb21wYXJlVUkKLSAqIEBzZWUgQ29tcGFyZUVkaXRvcklucHV0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wYXJlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlICJkaXJ0eSIgcHJvcGVydHkgKHZhbHVlIDxjb2RlPiJESVJUWV9TVEFURSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJUWV9TVEFURT0gIkRJUlRZX1NUQVRFIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRV9FRElUT1JfSU1BR0VfTkFNRT0gImV2aWV3MTYvY29tcGFyZV92aWV3LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBmZ1RpdGxlSW1hZ2U7Ci0JCi0JcHJpdmF0ZSBTcGxpdHRlciBmQ29tcG9zaXRlOwotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZlN0cnVjdHVyZUlucHV0UGFuZTsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZTdHJ1Y3R1cmVQYW5lMTsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZTdHJ1Y3R1cmVQYW5lMjsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZDb250ZW50SW5wdXRQYW5lOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZkZvY3VzUGFuZTsKLQlwcml2YXRlIFN0cmluZyBmTWVzc2FnZTsKLQlwcml2YXRlIE9iamVjdCBmSW5wdXQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRpdGxlOwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lckxpc3Q9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIENvbXBhcmVOYXZpZ2F0b3IgZk5hdmlnYXRvcjsKLQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5PSBmYWxzZTsKLQlwcml2YXRlIEFycmF5TGlzdCBmRGlydHlWaWV3ZXJzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmRGlydHlTdGF0ZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJZ25vcmVXaGl0ZVNwYWNlQWN0aW9uIGZJZ25vcmVXaGl0ZXNwYWNlOwotCXByaXZhdGUgU2hvd1BzZXVkb0NvbmZsaWN0cyBmU2hvd1BzZXVkb0NvbmZsaWN0czsKLQkKLQlib29sZWFuIGZTdHJ1Y3R1cmVDb21wYXJlT25TaW5nbGVDbGljaz0gdHJ1ZTsKLQlib29sZWFuIGZVc2VPdXRsaW5lVmlldz0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0PC9jb2RlPiB3aGljaCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbXBhcmUgY29uZmlndXJhdGlvbi4KLQkgKiBUaGUgY29tcGFyZSBjb25maWd1cmF0aW9uIGlzIHBhc3NlZCB0byBzdWJzZXF1ZW50bHkgY3JlYXRlZCB2aWV3ZXJzLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQ29tcGFyZUVkaXRvcklucHV0KENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBjb25maWd1cmF0aW9uOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbmZpZ3VyYXRpb24pOwotCQkKLQkJT2JqZWN0IG9iamVjdD0gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldFByb3BlcnR5KENvbXBhcmVDb25maWd1cmF0aW9uLlVTRV9PVVRMSU5FX1ZJRVcpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCWZVc2VPdXRsaW5lVmlldz0gKChCb29sZWFuKSBvYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZT0gQ29tcGFyZVVJLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCWZJZ25vcmVXaGl0ZXNwYWNlPSBuZXcgSWdub3JlV2hpdGVTcGFjZUFjdGlvbihidW5kbGUsIGNvbmZpZ3VyYXRpb24pOwotCQlmU2hvd1BzZXVkb0NvbmZsaWN0cz0gbmV3IFNob3dQc2V1ZG9Db25mbGljdHMoYnVuZGxlLCBjb25maWd1cmF0aW9uKTsKLQotCQlmRGlydHlTdGF0ZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lPSBlLmdldFByb3BlcnR5KCk7Ci0JCQkJaWYgKENvbXBhcmVFZGl0b3JJbnB1dC5ESVJUWV9TVEFURS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCQlib29sZWFuIGNoYW5nZWQ9IGZhbHNlOwotCQkJCQlPYmplY3QgbmV3VmFsdWU9IGUuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCQkJCWNoYW5nZWQ9ICgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCXNldERpcnR5KGUuZ2V0U291cmNlKCksIGNoYW5nZWQpOwotCQkJCX0JCQkKLQkJCX0KLQkJfTsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHBzPSBjb25maWd1cmF0aW9uLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAocHMgIT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVDb21wYXJlT25TaW5nbGVDbGljaz0gcHMuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuT1BFTl9TVFJVQ1RVUkVfQ09NUEFSRSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzdHJ1Y3R1cmVDb21wYXJlT25TaW5nbGVDbGljaygpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVDb21wYXJlT25TaW5nbGVDbGljazsKLQl9Ci0JCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUFkYXB0YWJsZS5nZXRBZGFwdGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElDb21wYXJlTmF2aWdhdG9yLmNsYXNzLmVxdWFscyhhZGFwdGVyKSB8fCBDb21wYXJlTmF2aWdhdG9yLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJaWYgKGZOYXZpZ2F0b3IgPT0gbnVsbCkKLQkJCQlmTmF2aWdhdG9yPSBuZXcgQ29tcGFyZU5hdmlnYXRvcigKLQkJCQkJbmV3IENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lW10gewotCQkJCQkJZlN0cnVjdHVyZUlucHV0UGFuZSwKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMSwKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMiwKLQkJCQkJCWZDb250ZW50SW5wdXRQYW5lCi0JCQkJCX0KLQkJCQkpOwotCQkJcmV0dXJuIGZOYXZpZ2F0b3I7Ci0JCX0KLQkJaWYgKElGaWxlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkgICAgSVByb2dyZXNzTW9uaXRvciBwbT0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCS8vIGZsdXNoIGNoYW5nZXMgaW4gYW55IGRpcnR5IHZpZXdlcgotCQkJdHJ5IHsKLQkgICAgICAgICAgICBmbHVzaFZpZXdlcihmU3RydWN0dXJlSW5wdXRQYW5lLCBwbSk7Ci0JICAgICAgICAgICAgZmx1c2hWaWV3ZXIoZlN0cnVjdHVyZVBhbmUxLCBwbSk7Ci0JICAgICAgICAgICAgZmx1c2hWaWV3ZXIoZlN0cnVjdHVyZVBhbmUyLCBwbSk7Ci0JICAgICAgICAgICAgZmx1c2hWaWV3ZXIoZkNvbnRlbnRJbnB1dFBhbmUsIHBtKTsKLQkgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCSAgICAgICAgICAgIENvbXBhcmVVSVBsdWdpbi5sb2coZSk7Ci0JICAgICAgICB9Ci0JCSAgICBJRmlsZVtdIGZpbGVzPSAoSUZpbGVbXSkgZ2V0QWRhcHRlcihJRmlsZVtdLmNsYXNzKTsKLQkJICAgIGlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApCi0JCSAgICAgICAgcmV0dXJuIGZpbGVzWzBdOwkvLyBjYW4gb25seSByZXR1cm4gb25lOiBsaW1pdGF0aW9uIG9uIElERS5zYXZlQWxsRWRpdG9yczsgc2VlICM2NDYxNwotCQkgICAgcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUVkaXRvcklucHV0LmdldEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdG9ySW5wdXQuZ2V0VG9vbFRpcFRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGl0bGUoKTsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRWRpdG9ySW5wdXQuZ2V0TmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFRpdGxlKCk7Ci0JfQotCQkJCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBzaW5jZSB0aGlzIGVkaXRvciBjYW5ub3QgYmUgcGVyc2lzdGVkLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBiZWNhdXNlIHRoaXMgZWRpdG9yIGNhbm5vdCBiZSBwZXJzaXN0ZWQKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaW5wdXQKLQkgKiBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgIkZpbGUgTW9zdCBSZWNlbnRseSBVc2VkIiBtZW51LgotCSAqCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBGSVhNRSEKLSAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlmTWVzc2FnZT0gbWVzc2FnZTsKLQl9Ci0JCi0JLyoKLQkgKiBGSVhNRSEKLSAJICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZk1lc3NhZ2U7Ci0JfQotCQkJCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGUgY29tcGFyZSBlZGl0b3IncyB0aXRsZSBiYXIuCi0JICogSXQgY2FuIGJlIHNldCB3aXRoIDxjb2RlPnNldFRpdGxlPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRpdGxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKGZUaXRsZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVFZGl0b3JJbnB1dC5kZWZhdWx0VGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZlRpdGxlOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB3aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBjb21wYXJlIHJlc3VsdC4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGVkaXRvciBpcyBvcGVuZWQuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoZSBDb21wYXJlRWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCWZUaXRsZT0gdGl0bGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIGltYWdlIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGUgY29tcGFyZSBlZGl0b3IncyB0aXRsZSBiYXIuCi0JICogUmV0dXJucyB0aGUgdGl0bGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSB1c2VkIHdoZW4gcHJlc2VudGluZyB0aGUgY29tcGFyZSByZXN1bHQuCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgZ2VuZXJpYyBjb21wYXJlIGljb24uCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRUaXRsZUltYWdlKCkgewotCQlpZiAoZmdUaXRsZUltYWdlID09IG51bGwpIHsKLQkJCWZnVGl0bGVJbWFnZT0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihDT01QQVJFX0VESVRPUl9JTUFHRV9OQU1FKS5jcmVhdGVJbWFnZSgpOwotCQkJQ29tcGFyZVVJLmRpc3Bvc2VPblNodXRkb3duKGZnVGl0bGVJbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGZnVGl0bGVJbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSB2aWV3ZXJzIHdpdGhpbiB0aGUgY29tcGFyZSBlZGl0b3IuCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb21wYXJlQ29uZmlndXJhdGlvbiBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHN0YW5kYXJkIGFjdGlvbnMgdG8gdGhlIGdpdmVuIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBhZGQgdGhlaXIgb3duIGFjdGlvbnMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyIHRoZSA8Y29kZT5Ub29sQmFyTWFuYWdlcjwvY29kZT4gdG8gd2hpY2ggdG8gY29udHJpYnV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZklnbm9yZVdoaXRlc3BhY2UpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZlNob3dQc2V1ZG9Db25mbGljdHMpOwotCX0KLQkKLQkvKioKLQkgKiBSdW5zIHRoZSBjb21wYXJlIG9wZXJhdGlvbiBhbmQgc3RvcmVzIHRoZSBjb21wYXJlIHJlc3VsdC4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0JICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLQkgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnByZXBhcmVJbnB1dDwvY29kZT4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0JICogCWl0IHNob3VsZCB3cmFwIGl0IGluc2lkZSBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5Ci0JICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotCSAqICB1c2luZyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nIAotCSAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlmSW5wdXQ9IHByZXBhcmVJbnB1dChtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBjb21wYXJlIG9wZXJhdGlvbiBhbmQgcmV0dXJucyB0aGUgY29tcGFyZSByZXN1bHQuCi0JICogSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgbm8gZGlmZmVyZW5jZXMgd2VyZSBmb3VuZCBhbmQgbm8gY29tcGFyZSBlZGl0b3IgbmVlZHMgdG8gYmUgb3BlbmVkLgotCSAqIFByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBBIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGhvbm9yZWQgYW5kIGFja25vd2xlZGdlZCAKLQkgKiBieSB0aHJvd2luZyA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4uCi0JICogPHA+Ci0JICogTm90ZTogdGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBpbiBhIG1vZGFsIGNvbnRleHQgdGhyZWFkIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIERpc3BsYXkgYXNzaWduZWQuCi0JICogSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIHNob3VsZG4ndCB0aGVyZWZvcmUgYWxsb2NhdGVkIGFueSBTV1QgcmVzb3VyY2VzIGluIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0JICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gZGlmZmVyZW5jZXMKLQkgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnByZXBhcmVJbnB1dDwvY29kZT4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0JICogCWl0IHNob3VsZCB3cmFwIGl0IGluc2lkZSBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5Ci0JICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotCSAqICB1c2luZyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nIAotCSAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHByZXBhcmVJbnB1dChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOwotCSAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wYXJlIHJlc3VsdCBjb21wdXRlZCBieSB0aGUgbW9zdCByZWNlbnQgY2FsbCB0byB0aGUKLQkgKiA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqIGRpZmZlcmVuY2VzIHdlcmUgZm91bmQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIHJlc3VsdCBwcmVwYXJlZCBpbiBtZXRob2QgPGNvZGU+cHJlcGFyZUlucHV0PC9jb2RlPgotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29tcGFyZVJlc3VsdCgpIHsKLQkJcmV0dXJuIGZJbnB1dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBTV1QgY29udHJvbHMgdGhhdCBhcmUgdXNlZCB0byBkaXNwbGF5IHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uLgotCSAqIENyZWF0ZXMgdGhlIFNXVCBDb250cm9scyBhbmQgc2V0cyB1cCB0aGUgd2lyaW5nIGJldHdlZW4gdGhlIGluZGl2aWR1YWwgcGFuZXMuCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGFsbCBmb3VyIHBhbmVzIGJ1dCBtYWtlcyBvbmx5IHRoZSBuZWNlc3Nhcnkgb25lcyB2aXNpYmxlLgotCSAqIEZpbmFsbHkgaXQgZmVlZHMgdGhlIGNvbXBhcmUgcmVzdWx0IGludG8gdGhlIHRvcCBsZWZ0IHN0cnVjdHVyZSB2aWV3ZXIKLQkgKiBhbmQgdGhlIGNvbnRlbnQgdmlld2VyLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIHRoZXkgbmVlZCB0byBjaGFuZ2UgdGhlIGxheW91dCBvciB3aXJpbmcgYmV0d2VlbiBwYW5lcy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIG11c3QgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gdGhlIFNXVCBjb250cm9sIGhpZXJhcmNoeSBmb3IgdGhlIGNvbXBhcmUgZWRpdG9yCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWZDb21wb3NpdGU9IG5ldyBTcGxpdHRlcihwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCWZDb21wb3NpdGUuc2V0RGF0YSh0aGlzKTsKLQkJCQkKLQkJQ29udHJvbCBvdXRsaW5lPSBudWxsOwotCQlpZiAoIWZVc2VPdXRsaW5lVmlldykKLQkJCW91dGxpbmU9IGNyZWF0ZU91dGxpbmVDb250ZW50cyhmQ29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQkJCQotCQlmQ29udGVudElucHV0UGFuZT0gbmV3IENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lKGZDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCkgewotCQkJcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkJcmV0dXJuIGZpbmRDb250ZW50Vmlld2VyKG9sZFZpZXdlciwgKElDb21wYXJlSW5wdXQpaW5wdXQsIHRoaXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlpZiAoZkZvY3VzUGFuZSA9PSBudWxsKQotCQkJZkZvY3VzUGFuZT0gZkNvbnRlbnRJbnB1dFBhbmU7Ci0JCWlmIChvdXRsaW5lICE9IG51bGwpCi0JCQlmQ29tcG9zaXRlLnNldFZpc2libGUob3V0bGluZSwgZmFsc2UpOwotCQlmQ29tcG9zaXRlLnNldFZpc2libGUoZkNvbnRlbnRJbnB1dFBhbmUsIHRydWUpOwotCQkKLQkJaWYgKGZTdHJ1Y3R1cmVJbnB1dFBhbmUgIT0gbnVsbCkKLQkJCWZDb21wb3NpdGUuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAzMCwgNzAgfSk7Ci0JCQotCQlmQ29tcG9zaXRlLmxheW91dCgpOwotCi0JCWlmIChmU3RydWN0dXJlSW5wdXRQYW5lICE9IG51bGwgJiYgZklucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJZlN0cnVjdHVyZUlucHV0UGFuZS5zZXRJbnB1dChmSW5wdXQpOwotCQkJSVNlbGVjdGlvbiBzZWw9IGZTdHJ1Y3R1cmVJbnB1dFBhbmUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsID09IG51bGwgfHwgc2VsLmlzRW1wdHkoKSkKLQkJCQlmZWVkMShzZWwpOwkvLyB3ZSBvbmx5IGZlZWQgZG93bnN0cmVhbSB2aWV3ZXJzIGlmIHRoZSB0b3AgbGVmdCBwYW5lIGlzIGVtcHR5Ci0JCX0KLQkJCi0JCWZDb21wb3NpdGUuc2V0RGF0YSgiTmF2IiwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lW10gewotCQkJCWZTdHJ1Y3R1cmVJbnB1dFBhbmUsCi0JCQkJZlN0cnVjdHVyZVBhbmUxLAotCQkJCWZTdHJ1Y3R1cmVQYW5lMiwKLQkJCQlmQ29udGVudElucHV0UGFuZQotCQkJfQotCQkpOwotCQotCQlyZXR1cm4gZkNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wgdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgbXVzdCBiZSBjcmVhdGVkCi0JICogQHBhcmFtIGRpcmVjdGlvbiB0aGUgbGF5b3V0IGRpcmVjdGlvbiBvZiB0aGUgY29udGVudHMsIGVpdGhlciA8L2NvZGU+U1dULkhPUklaT05UQUw8Y29kZT4gb3IgPC9jb2RlPlNXVC5WRVJUSUNBTDxjb2RlPiAKLQkgKiBAcmV0dXJuIHRoZSBTV1QgY29udHJvbCBoaWVyYXJjaHkgZm9yIHRoZSBvdXRsaW5lIHBhcnQgb2YgdGhlIGNvbXBhcmUgZWRpdG9yCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZU91dGxpbmVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50LCBpbnQgZGlyZWN0aW9uKSB7Ci0JCWZpbmFsIFNwbGl0dGVyIGg9IG5ldyBTcGxpdHRlcihwYXJlbnQsIGRpcmVjdGlvbik7Ci0KLQkJZlN0cnVjdHVyZUlucHV0UGFuZT0gbmV3IENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lKGgsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCwgdHJ1ZSkgewotCQkJcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlmZk5vZGUpIHsKLQkJCQkJRGlmZk5vZGUgZG49IChEaWZmTm9kZSkgaW5wdXQ7Ci0JCQkJCWlmIChkbi5oYXNDaGlsZHJlbigpKQotCQkJCQkJcmV0dXJuIGNyZWF0ZURpZmZWaWV3ZXIodGhpcyk7Ci0JCQkJfQotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCXJldHVybiBmaW5kU3RydWN0dXJlVmlld2VyKG9sZFZpZXdlciwgKElDb21wYXJlSW5wdXQpaW5wdXQsIHRoaXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlmRm9jdXNQYW5lPSBmU3RydWN0dXJlSW5wdXRQYW5lOwotCQkKLQkJZlN0cnVjdHVyZVBhbmUxPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoaCwgU1dULkJPUkRFUiB8IFNXVC5GTEFULCB0cnVlKSB7Ci0JCQlwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpIHsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCQlyZXR1cm4gZmluZFN0cnVjdHVyZVZpZXdlcihvbGRWaWV3ZXIsIChJQ29tcGFyZUlucHV0KWlucHV0LCB0aGlzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJaC5zZXRWaXNpYmxlKGZTdHJ1Y3R1cmVQYW5lMSwgZmFsc2UpOwotCQkKLQkJZlN0cnVjdHVyZVBhbmUyPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoaCwgU1dULkJPUkRFUiB8IFNXVC5GTEFULCB0cnVlKSB7Ci0JCQlwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpIHsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCQlyZXR1cm4gZmluZFN0cnVjdHVyZVZpZXdlcihvbGRWaWV3ZXIsIChJQ29tcGFyZUlucHV0KWlucHV0LCB0aGlzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJaC5zZXRWaXNpYmxlKGZTdHJ1Y3R1cmVQYW5lMiwgZmFsc2UpOwotCQkKLQkJLy8gc2V0dXAgdGhlIHdpcmluZyBmb3IgdG9wIGxlZnQgcGFuZQotCQlmU3RydWN0dXJlSW5wdXRQYW5lLmFkZE9wZW5MaXN0ZW5lcigKLQkJCW5ldyBJT3Blbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IG9lKSB7Ci0JCQkJCWZlZWQxKG9lLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZTdHJ1Y3R1cmVJbnB1dFBhbmUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCQlJU2VsZWN0aW9uIHM9IGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzID09IG51bGwgfHwgcy5pc0VtcHR5KCkpCi0JCQkJCQlmZWVkMShzKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZTdHJ1Y3R1cmVJbnB1dFBhbmUuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcigKLQkJCW5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWZlZWREZWZhdWx0MShldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJZlN0cnVjdHVyZVBhbmUxLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQkJZmVlZDIoZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCi0JCWZTdHJ1Y3R1cmVQYW5lMi5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJCWZlZWQzKGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJKTsJCQotCi0JCWlmIChmVXNlT3V0bGluZVZpZXcpIHsKLQkJCWlmIChmSW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQkJZlN0cnVjdHVyZUlucHV0UGFuZS5zZXRJbnB1dChmSW5wdXQpOwotCQkJCUlTZWxlY3Rpb24gc2VsPSBmU3RydWN0dXJlSW5wdXRQYW5lLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWwgPT0gbnVsbCB8fCBzZWwuaXNFbXB0eSgpKQotCQkJCQlmZWVkMShzZWwpOwkvLyB3ZSBvbmx5IGZlZWQgZG93bnN0cmVhbSB2aWV3ZXJzIGlmIHRoZSB0b3AgbGVmdCBwYW5lIGlzIGVtcHR5Ci0JCQl9Ci0JCQkKLQkJCWZDb21wb3NpdGUuc2V0RGF0YSgiTmF2IiwgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZVtdIHsKLQkJCQkJZlN0cnVjdHVyZUlucHV0UGFuZSwKLQkJCQkJZlN0cnVjdHVyZVBhbmUxLAotCQkJCQlmU3RydWN0dXJlUGFuZTIsCi0JCQkJCWZDb250ZW50SW5wdXRQYW5lCi0JCQkJfQotCQkJKTsKLQkJfQotCi0JCXJldHVybiBoOwotCX0KLQotCXByaXZhdGUgdm9pZCBmZWVkMShmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmQ29tcG9zaXRlLmdldERpc3BsYXkoKSwKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlPYmplY3QgaW5wdXQ9IGZTdHJ1Y3R1cmVJbnB1dFBhbmUuZ2V0SW5wdXQoKTsKLQkJCQkJCWZDb250ZW50SW5wdXRQYW5lLnNldElucHV0KGlucHV0KTsKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMi5zZXRJbnB1dChudWxsKTsgLy8gY2xlYXIgZG93bnN0cmVhbSBwYW5lCi0JCQkJCQlmU3RydWN0dXJlUGFuZTEuc2V0SW5wdXQobnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlPYmplY3QgaW5wdXQ9IGdldEVsZW1lbnQoc2VsZWN0aW9uKTsKLQkJCQkJCWZDb250ZW50SW5wdXRQYW5lLnNldElucHV0KGlucHV0KTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmVDb21wYXJlT25TaW5nbGVDbGljaygpKQotCQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMS5zZXRJbnB1dChpbnB1dCk7Ci0JCQkJCQlmU3RydWN0dXJlUGFuZTIuc2V0SW5wdXQobnVsbCk7IC8vIGNsZWFyIGRvd25zdHJlYW0gcGFuZQotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVQYW5lMS5nZXRJbnB1dCgpICE9IGlucHV0KQotCQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMS5zZXRJbnB1dChudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZlZWREZWZhdWx0MShmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmQ29tcG9zaXRlLmdldERpc3BsYXkoKSwKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMS5zZXRJbnB1dChnZXRFbGVtZW50KHNlbGVjdGlvbikpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZlZWQyKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZDb21wb3NpdGUuZ2V0RGlzcGxheSgpLAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCU9iamVjdCBpbnB1dD0gZlN0cnVjdHVyZVBhbmUxLmdldElucHV0KCk7Ci0JCQkJCQlmQ29udGVudElucHV0UGFuZS5zZXRJbnB1dChpbnB1dCk7Ci0JCQkJCQlmU3RydWN0dXJlUGFuZTIuc2V0SW5wdXQobnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlPYmplY3QgaW5wdXQ9IGdldEVsZW1lbnQoc2VsZWN0aW9uKTsKLQkJCQkJCWZDb250ZW50SW5wdXRQYW5lLnNldElucHV0KGlucHV0KTsKLQkJCQkJCWZTdHJ1Y3R1cmVQYW5lMi5zZXRJbnB1dChpbnB1dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmZWVkMyhmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmQ29tcG9zaXRlLmdldERpc3BsYXkoKSwKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCQkJZkNvbnRlbnRJbnB1dFBhbmUuc2V0SW5wdXQoZlN0cnVjdHVyZVBhbmUyLmdldElucHV0KCkpOwotCQkJCQllbHNlCi0JCQkJCQlmQ29udGVudElucHV0UGFuZS5zZXRJbnB1dChnZXRFbGVtZW50KHNlbGVjdGlvbikpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNlbGVjdGlvbiBpZiB0aGUgc2VsZWN0aW9uIAotCSAqIGlzIGEgPGNvZGU+SVN0cnVjdHVyZWRTZWxlY3Rpb248L2NvZGU+IHdpdGggZXhhY3RseSBvbmUgZWxlbWVudC4gUmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHNlbGVjdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0RWxlbWVudChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzcy5zaXplKCkgPT0gMSkKLQkJCQlyZXR1cm4gc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFza3MgdGhpcyBpbnB1dCB0byB0YWtlIGZvY3VzIHdpdGhpbiBpdHMgY29udGFpbmVyIChlZGl0b3IpLgotCSAqIDxwPgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGJ1dCB0aGV5IG1heQotCSAqIG92ZXJyaWRlIGlmIHRoZXkgaW1wbGVtZW50IGEgZGlmZmVyZW50IGxheW91dCB3aXRoIGRpZmZlcmVudCB2aXN1YWwKLQkgKiBjb21wb25lbnRzLiBDbGllbnRzIGFyZSBmcmVlIHRvIGNhbGwgdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoZkZvY3VzUGFuZSAhPSBudWxsKSB7Ci0JCQlWaWV3ZXIgdj0gZkZvY3VzUGFuZS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2ICE9IG51bGwpIHsKLQkJCQlDb250cm9sIGM9IHYuZ2V0Q29udHJvbCgpOwotCQkJCWlmIChjICE9IG51bGwpCi0JCQkJCWMuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmQ29tcG9zaXRlICE9IG51bGwpCi0JCQlmQ29tcG9zaXRlLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIGRpZmZlcmVuY2VzIHZpZXdlciBmb3IgdGhlIHRvcCBsZWZ0IHBhbmUuCi0JICogSXQgaXMgY2FsbGVkIGZyb20gPGNvZGU+Y3JlYXRlQ29udGVudHM8L2NvZGU+IGFuZCByZXR1cm5zIGEgPGNvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIHRoZXkgbmVlZCBhIGRpZmZlcmVudCB2aWV3ZXIuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb250cm9sIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdmlld2VyJ3MgU1dUIGNvbnRyb2xzCi0JICogQHJldHVybiBhIGNvbXBhcmUgdmlld2VyIGZvciB0aGUgdG9wIGxlZnQgcGFuZQotCSAqLwotCXB1YmxpYyBWaWV3ZXIgY3JlYXRlRGlmZlZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRGlmZlRyZWVWaWV3ZXIocGFyZW50LCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudHMgdGhlIGR5bmFtaWMgdmlld2VyIHN3aXRjaGluZyBmb3Igc3RydWN0dXJlIHZpZXdlcnMuCi0JICogVGhlIG1ldGhvZCBtdXN0IHJldHVybiBhIGNvbXBhcmUgdmlld2VyIGJhc2VkIG9uIHRoZSBvbGQgKG9yIGN1cnJlbnQpIHZpZXdlcgotCSAqIGFuZCBhIG5ldyBpbnB1dCBvYmplY3QuIElmIHRoZSBvbGQgdmlld2VyIGlzIHN1aXRhYmxlIGZvciBzaG93aW5nIHRoZSBuZXcgaW5wdXQgdGhlIG9sZCB2aWV3ZXIKLQkgKiBjYW4gYmUgcmV0dXJuZWQuIE90aGVyd2lzZSBhIG5ldyB2aWV3ZXIgbXVzdCBiZSBjcmVhdGVkIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gY2FuIGJlIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgbm8gdmlld2VyIGNvdWxkIGJlIGZvdW5kLgotCSAqIDxwPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gPGNvZGU+Q29tcGFyZVVJLmZpbmRTdHJ1Y3R1cmVWaWV3ZXI8L2NvZGU+LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGltcGxlbWVudCBhIGRpZmZlcmVudCBzdHJhdGVneS4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9sZFZpZXdlciBhIG5ldyB2aWV3ZXIgaXMgb25seSBjcmVhdGVkIGlmIHRoaXMgb2xkIHZpZXdlciBjYW5ub3Qgc2hvdyB0aGUgZ2l2ZW4gaW5wdXQKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cnVjdHVyZSB2aWV3ZXIKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgcGFyZW50IGNvbXBvc2l0ZSB1bmRlciB3aGljaCB0aGUgbmV3IHZpZXdlciBpcyBjcmVhdGVkCi0JICogQHJldHVybiBhIGNvbXBhcmUgdmlld2VyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFZpZXdlciBmaW5kU3RydWN0dXJlVmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIElDb21wYXJlSW5wdXQgaW5wdXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIENvbXBhcmVVSS5maW5kU3RydWN0dXJlVmlld2VyKG9sZFZpZXdlciwgaW5wdXQsIHBhcmVudCwgZkNvbXBhcmVDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRzIHRoZSBkeW5hbWljIHZpZXdlciBzd2l0Y2hpbmcgZm9yIGNvbnRlbnQgdmlld2Vycy4KLQkgKiBUaGUgbWV0aG9kIG11c3QgcmV0dXJuIGEgY29tcGFyZSB2aWV3ZXIgYmFzZWQgb24gdGhlIG9sZCAob3IgY3VycmVudCkgdmlld2VyCi0JICogYW5kIGEgbmV3IGlucHV0IG9iamVjdC4gSWYgdGhlIG9sZCB2aWV3ZXIgaXMgc3VpdGFibGUgZm9yIHNob3dpbmcgdGhlIG5ldyBpbnB1dCB0aGUgb2xkIHZpZXdlcgotCSAqIGNhbiBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlIGEgbmV3IHZpZXdlciBtdXN0IGJlIGNyZWF0ZWQgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBjYW4gYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBubyB2aWV3ZXIgY291bGQgYmUgZm91bmQuCi0JICogPHA+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkcyB0aGUgcmVxdWVzdCB0byA8Y29kZT5Db21wYXJlVUkuZmluZENvbnRlbnRWaWV3ZXI8L2NvZGU+LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGltcGxlbWVudCBhIGRpZmZlcmVudCBzdHJhdGVneS4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9sZFZpZXdlciBhIG5ldyB2aWV3ZXIgaXMgb25seSBjcmVhdGVkIGlmIHRoaXMgb2xkIHZpZXdlciBjYW5ub3Qgc2hvdyB0aGUgZ2l2ZW4gaW5wdXQKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cnVjdHVyZSB2aWV3ZXIKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgcGFyZW50IGNvbXBvc2l0ZSB1bmRlciB3aGljaCB0aGUgbmV3IHZpZXdlciBpcyBjcmVhdGVkCi0JICogQHJldHVybiBhIGNvbXBhcmUgdmlld2VyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFZpZXdlciBmaW5kQ29udGVudFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBJQ29tcGFyZUlucHV0IGlucHV0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJVmlld2VyIG5ld1ZpZXdlcj0gQ29tcGFyZVVJLmZpbmRDb250ZW50Vmlld2VyKG9sZFZpZXdlciwgaW5wdXQsIHBhcmVudCwgZkNvbXBhcmVDb25maWd1cmF0aW9uKTsKLQkJCi0JCWJvb2xlYW4gaXNOZXdWaWV3ZXI9IG5ld1ZpZXdlciAhPSBvbGRWaWV3ZXI7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJlRWRpdG9ySW5wdXQuZmluZENvbnRlbnRWaWV3ZXI6ICIgKyBpc05ld1ZpZXdlcik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChpc05ld1ZpZXdlciAmJiBuZXdWaWV3ZXIgaW5zdGFuY2VvZiBJUHJvcGVydHlDaGFuZ2VOb3RpZmllcikgewotCQkJZmluYWwgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIgZHNwPSAoSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIpIG5ld1ZpZXdlcjsKLQkJCWRzcC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZEaXJ0eVN0YXRlTGlzdGVuZXIpOwotCQkJCi0JCQlDb250cm9sIGM9IG5ld1ZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQljLmFkZERpc3Bvc2VMaXN0ZW5lcigKLQkJCQluZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCQkJZHNwLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkRpcnR5U3RhdGVMaXN0ZW5lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3Vmlld2VyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMuCi0JICogVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+RElSVFlfU1RBVEU8L2NvZGU+IHByb3BlcnR5IG9mIHRoaXMgaW5wdXQgb2JqZWN0LgotCSAKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaW5wdXQgaGFzIHVuc2F2ZWQgY2hhbmdlcywKLQkgKiB0aGF0IGlzIGlmIDxjb2RlPnNldERpcnR5KHRydWUpPC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQuCi0JICogU3ViY2xhc3NlcyBkb24ndCBoYXZlIHRvIG92ZXJyaWRlIGlmIHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IDxkb2NlPnNldERpcnR5PC9jb2RlPgotCSAqIGlzIHN1ZmZpY2llbnQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSBzYXZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIGZEaXJ0eSB8fCBmRGlydHlWaWV3ZXJzLnNpemUoKSA+IDA7Ci0JfQotCQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGlzIGlucHV0IHRvIHRoZSBnaXZlbgotCSAqIHZhbHVlIGFuZCBzZW5kcyBvdXQgYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiBpZiB0aGUgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgb2xkIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGRpcnR5IHRoZSBkaXJ0eSBzdGF0ZSBmb3IgdGhpcyBjb21wYXJlIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCi0JCWJvb2xlYW4gY29uZmlybVNhdmU9IHRydWU7Ci0JCU9iamVjdCBvPSBmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoQ29tcGFyZUVkaXRvci5DT05GSVJNX1NBVkVfUFJPUEVSVFkpOwotCQlpZiAobyBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQljb25maXJtU2F2ZT0gKChCb29sZWFuKW8pLmJvb2xlYW5WYWx1ZSgpOwotCi0JCWlmICghY29uZmlybVNhdmUpIHsKLQkJCWZEaXJ0eT0gZGlydHk7Ci0JCQlpZiAoIWZEaXJ0eSkKLQkJCQlmRGlydHlWaWV3ZXJzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldERpcnR5KE9iamVjdCBzb3VyY2UsIGJvb2xlYW4gZGlydHkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzb3VyY2UpOwotCQlib29sZWFuIG9sZERpcnR5PSBmRGlydHlWaWV3ZXJzLnNpemUoKSA+IDA7Ci0JCWlmIChkaXJ0eSkKLQkJCWZEaXJ0eVZpZXdlcnMuYWRkKHNvdXJjZSk7Ci0JCWVsc2UKLQkJCWZEaXJ0eVZpZXdlcnMucmVtb3ZlKHNvdXJjZSk7Ci0JCWJvb2xlYW4gbmV3RGlydHk9IGZEaXJ0eSB8fCBmRGlydHlWaWV3ZXJzLnNpemUoKSA+IDA7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJzZXREaXJ0eSgiK3NvdXJjZSsiLCAiK2RpcnR5KyIpOiAiICsgbmV3RGlydHkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpZiAob2xkRGlydHkgIT0gbmV3RGlydHkpCi0JCQlVdGlsaXRpZXMuZmlyZVByb3BlcnR5Q2hhbmdlKGZMaXN0ZW5lckxpc3QsIHRoaXMsIERJUlRZX1NUQVRFLCBuZXcgQm9vbGVhbihvbGREaXJ0eSksIG5ldyBCb29sZWFuKG5ld0RpcnR5KSk7Ci0JfQkKLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCWZMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCWZMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIGFueSB1bnNhdmVkIGNoYW5nZXMuCi0JICogRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRvIHNhdmUgYW55IGNoYW5nZXMuCi0JICoKLQkgKiBAcGFyYW0gcG0gYW4gPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4gdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc2F2ZSBtYXkgdXNlIHRvIHNob3cgcHJvZ3Jlc3MKLQkgKiBAZGVwcmVjYXRlZCBPdmVycmlkZSBtZXRob2Qgc2F2ZUNoYW5nZXMgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLQkKLQkvKioKLQkgKiBTYXZlIGFueSB1bnNhdmVkIGNoYW5nZXMuCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRvIHNhdmUgYW55IGNoYW5nZXMuCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byBmbHVzaCBjaGFuZ2VzIGluIGFsbCB2aWV3ZXJzIGJ5Ci0JICogY2FsbGluZyA8Y29kZT5JU2F2YWJsZS5zYXZlPC9jb2RlPiBvbiB0aGVtLgotCSAqCi0JICogQHBhcmFtIHBtIGFuIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+IHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHNhdmUgbWF5IHVzZSB0byBzaG93IHByb2dyZXNzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDaGFuZ2VzKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCS8vIGZsdXNoIGNoYW5nZXMgaW4gYW55IGRpcnR5IHZpZXdlcgotCQlmbHVzaFZpZXdlcihmU3RydWN0dXJlSW5wdXRQYW5lLCBwbSk7Ci0JCWZsdXNoVmlld2VyKGZTdHJ1Y3R1cmVQYW5lMSwgcG0pOwotCQlmbHVzaFZpZXdlcihmU3RydWN0dXJlUGFuZTIsIHBtKTsKLQkJZmx1c2hWaWV3ZXIoZkNvbnRlbnRJbnB1dFBhbmUsIHBtKTsKLQotCQlzYXZlKHBtKTsKLQl9Ci0JCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2hWaWV3ZXIoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgcGFuZSwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocGFuZSAhPSBudWxsKSB7Ci0JCQlWaWV3ZXIgdj0gcGFuZS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgSVNhdmFibGUpCi0JCQkJKChJU2F2YWJsZSl2KS5zYXZlKHBtKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZVVJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0ZTk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUmV1c2FibGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklDb21wYXJlSW5wdXQ7Ci0KLQotLyoqCi0gKiBUaGUgY2xhc3MgPGNvZGU+Q29tcGFyZVVJPC9jb2RlPiBkZWZpbmVzIHRoZSBlbnRyeSBwb2ludCB0byBpbml0aWF0ZSBhIGNvbmZpZ3VyYWJsZQotICogY29tcGFyZSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IHJlc291cmNlcy4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZQotICogaXMgb3BlbmVkIGludG8gYSBjb21wYXJlIGVkaXRvciB3aGVyZSB0aGUgZGV0YWlscyBjYW4gYmUgYnJvd3NlZCBhbmQKLSAqIGVkaXRlZCBpbiBkeW5hbWljYWxseSBzZWxlY3RlZCBzdHJ1Y3R1cmUgYW5kIGNvbnRlbnQgdmlld2Vycy4KLSAqIDxwPgotICogVGhlIENvbXBhcmUgVUkgcHJvdmlkZXMgYSByZWdpc3RyeSBmb3IgY29udGVudCBhbmQgc3RydWN0dXJlIGNvbXBhcmUgdmlld2VycywKLSAqIHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gZXh0ZW5zaW9ucyBjb250cmlidXRlZCB0byBleHRlbnNpb24gcG9pbnRzCi0gKiBkZWNsYXJlZCBieSB0aGlzIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXJlVUkgewotCQotCS8qKgotCSAqIENvbXBhcmUgUGx1Zy1pbiBJRCAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmNvbXBhcmUiPC9jb2RlPikuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRD0gIm9yZy5lY2xpcHNlLmNvbXBhcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGlkIG9mIHRoZSBDb21wYXJlIFByZWZlcmVuY2UgUGFnZQotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlUHJlZmVyZW5jZVBhZ2UiPC9jb2RlPikuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfUEFHRV9JRD0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVByZWZlcmVuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGRpc2FibGVkIGljb24gb2YgdGhlICdOZXh0JyB0b29sIGJhciBidXR0b24uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRFRPT0xfTkVYVD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihDb21wYXJlVUlQbHVnaW4uRFRPT0xfTkVYVCk7Ci0JLyoqCi0JICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5vcm1hbCBpY29uIG9mIHRoZSAnTmV4dCcgdG9vbCBiYXIgYnV0dG9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NUT09MX05FWFQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcGFyZVVJUGx1Z2luLkNUT09MX05FWFQpOwotCS8qKgotCSAqIEltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSByb2xsLW92ZXIgaWNvbiBvZiB0aGUgJ05leHQnIHRvb2wgYmFyIGJ1dHRvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FVE9PTF9ORVhUPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXBhcmVVSVBsdWdpbi5FVE9PTF9ORVhUKTsKLQkKLQkvKioKLQkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZGlzYWJsZWQgaWNvbiBvZiB0aGUgJ1ByZXZpb3VzJyB0b29sIGJhciBidXR0b24uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRFRPT0xfUFJFVj0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihDb21wYXJlVUlQbHVnaW4uRFRPT0xfUFJFVik7Ci0JLyoqCi0JICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5vcm1hbCBpY29uIG9mIHRoZSAnUHJldmlvdXMnIHRvb2wgYmFyIGJ1dHRvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DVE9PTF9QUkVWPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXBhcmVVSVBsdWdpbi5DVE9PTF9QUkVWKTsKLQkvKioKLQkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgcm9sbC1vdmVyIGljb24gb2YgdGhlICdQcmV2aW91cycgdG9vbCBiYXIgYnV0dG9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VUT09MX1BSRVY9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcGFyZVVJUGx1Z2luLkVUT09MX1BSRVYpOwotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgdGl0bGUgcHJvcGVydHkgb2YgYSBjb21wYXJlIHZpZXdlci4KLSAJICogSWYgYSBwcm9wZXJ0eSB3aXRoIHRoaXMgbmFtZSBpcyBzZXQKLSAJICogb24gdGhlIHRvcCBsZXZlbCBTV1QgY29udHJvbCBvZiBhIHZpZXdlciwgaXQgaXMgdXNlZCBhcyBhIHRpdGxlIGluIHRoZSBwYW5lJ3MKLSAJICogdGl0bGUgYmFyLgotIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFX1ZJRVdFUl9USVRMRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZVVJLkNvbXBhcmVWaWV3ZXJUaXRsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIENvbXBhcmVVSSgpIHsKLQkJLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBYnN0cmFjdFVJUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwbHVnLWluJ3MgcmVzb3VyY2UgYnVuZGxlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBhbmQgb3BlbnMgYQotCSAqIGNvbXBhcmUgZWRpdG9yIG9uIHRoZSByZXN1bHQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgd29ya2JlbmNoIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9uIHdoaWNoIHRvIG9wZW4gdGhlIGNvbXBhcmUgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5Db21wYXJlRWRpdG9yKENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlvcGVuQ29tcGFyZUVkaXRvck9uUGFnZShpbnB1dCwgbnVsbCk7Ci0JfQotCQkJCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBhbmQgb3BlbnMgYQotCSAqIGNvbXBhcmUgZWRpdG9yIG9uIHRoZSByZXN1bHQgaW4gdGhlIGdpdmVuIHdvcmtiZW5jaCBwYWdlLgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvbiB3aGljaCB0byBvcGVuIHRoZSBjb21wYXJlIGVkaXRvcgotCSAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZSBpbiB3aGljaCB0byBvcGVuIHRoZSBjb21wYXJlIGVkaXRvcgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkNvbXBhcmVFZGl0b3JPblBhZ2UoQ29tcGFyZUVkaXRvcklucHV0IGlucHV0LCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCUNvbXBhcmVVSVBsdWdpbiBwbHVnaW49IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkKLQkJCXBsdWdpbi5vcGVuQ29tcGFyZUVkaXRvcihpbnB1dCwgcGFnZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21wYXJpc29uIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gaW5wdXQgYW5kCi0JICogc2hvd3MgdGhlIHJlc3VsdCBpbiB0aGUgZ2l2ZW4gZWRpdG9yLgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvbiB3aGljaCB0byBvcGVuIHRoZSBjb21wYXJlIGVkaXRvcgotCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGNvbXBhcmUgZWRpdG9yIHRvIHJldXNlIG9yIG51bGwgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmV1c2VDb21wYXJlRWRpdG9yKENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCwgSVJldXNhYmxlRWRpdG9yIGVkaXRvcikgewotCQlDb21wYXJlVUlQbHVnaW4gcGx1Z2luPSBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlpZiAocGx1Z2luICE9IG51bGwpCi0JCQlwbHVnaW4ub3BlbkNvbXBhcmVFZGl0b3IoaW5wdXQsIG51bGwsIGVkaXRvcik7Ci0JfQotCQkJCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBhbmQgb3BlbnMgYQotCSAqIG1vZGFsIGNvbXBhcmUgZGlhbG9nIG9uIHRoZSByZXN1bHQuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9uIHdoaWNoIHRvIG9wZW4gdGhlIGNvbXBhcmUgZGlhbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5Db21wYXJlRGlhbG9nKENvbXBhcmVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlDb21wYXJlVUlQbHVnaW4gcGx1Z2luPSBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlpZiAocGx1Z2luICE9IG51bGwpCi0JCQlwbHVnaW4ub3BlbkNvbXBhcmVEaWFsb2coaW5wdXQpOwotCX0KLQkJCQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHR5cGUsIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUNvbXBhcmVVSVBsdWdpbi5yZWdpc3RlckltYWdlRGVzY3JpcHRvcih0eXBlLCBkZXNjcmlwdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYXJlZCBpbWFnZSBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIGEgZ2VuZXJpYyBpbWFnZSBpZiBub25lCi0JICogaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZTogSW1hZ2VzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkCi0JICogb2Ygd2hlbiB0aGlzIHBsdWctaW4gc2h1dHMgZG93bi4gQ2FsbGVycyBtdXN0IG5vdCBkaXNwb3NlIG9mIHRoZXNlCi0JICogaW1hZ2VzIHRoZW1zZWx2ZXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZSh0eXBlKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gaW1hZ2UgZm9yIGJlaW5nIGRpc3Bvc2VkIHdoZW4gdGhpcyBwbHVnLWluIGlzIHNodXRkb3duLgotCSAqCi0JICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byByZWdpc3RlciBmb3IgZGlzcG9zYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZU9uU2h1dGRvd24oSW1hZ2UgaW1hZ2UpIHsKLQkJQ29tcGFyZVVJUGx1Z2luLmRpc3Bvc2VPblNodXRkb3duKGltYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYXJlZCBpbWFnZSBmb3IgdGhlIGdpdmVuIGFkYXB0YWJsZS4KLQkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBxdWVyaWVzIHRoZSBnaXZlbiBhZGFwdGFibGUKLQkgKiBmb3IgaXRzIDxjb2RlPklXb3JrYmVuY2hBZGFwdGVyLmdldEltYWdlRGVzY3JpcHRvcjwvY29kZT4sIHdoaWNoIGl0Ci0JICogdXNlcyB0byBjcmVhdGUgYW4gaW1hZ2UgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIG9uZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBJbWFnZXMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGlzcG9zZWQKLQkgKiBvZiB3aGVuIHRoaXMgcGx1Zy1pbiBzaHV0cyBkb3duLiBDYWxsZXJzIG11c3Qgbm90IGRpc3Bvc2Ugb2YgdGhlc2UKLQkgKiBpbWFnZXMgdGhlbXNlbHZlcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRhcHRhYmxlIHRoZSBhZGFwdGFibGUgZm9yIHdoaWNoIHRvIGZpbmQgYW4gaW1hZ2UKLQkgKiBAcmV0dXJuIGFuIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotCQlyZXR1cm4gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlKGFkYXB0YWJsZSk7Ci0JfQotCQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZS4KLQkgKiBJZiBubyBzdHJlYW0gbWVyZ2VyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cmVhbSBtZXJnZXIKLQkgKiBAcmV0dXJuIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICBzdHJlYW0gbWVyZ2VyIGhhcyBiZWVuIHJlZ2lzdGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJlYW1NZXJnZXIgY3JlYXRlU3RyZWFtTWVyZ2VyKElDb250ZW50VHlwZSB0eXBlKSB7Ci0JICAgIHJldHVybiBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmNyZWF0ZVN0cmVhbU1lcmdlcih0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIGZpbGUgZXh0ZW5zaW9uLgotCSAqIElmIG5vIHN0cmVhbSBtZXJnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIGZpbGUgZXh0ZW5zaW9uIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgZm9yIHdoaWNoIHRvIGZpbmQgYSBzdHJlYW0gbWVyZ2VyCi0JICogQHJldHVybiBhIHN0cmVhbSBtZXJnZXIgZm9yIHRoZSBnaXZlbiB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgc3RyZWFtIG1lcmdlciBoYXMgYmVlbiByZWdpc3RlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RyZWFtTWVyZ2VyIGNyZWF0ZVN0cmVhbU1lcmdlcihTdHJpbmcgdHlwZSkgewotCSAgICByZXR1cm4gQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5jcmVhdGVTdHJlYW1NZXJnZXIodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZSBjb21wYXJlIHZpZXdlciBiYXNlZCBvbiBhbiBvbGQgdmlld2VyIGFuZCBhbiBpbnB1dCBvYmplY3QuCi0JICogSWYgdGhlIG9sZCB2aWV3ZXIgaXMgc3VpdGFibGUgZm9yIHNob3dpbmcgdGhlIGlucHV0LCB0aGUgb2xkIHZpZXdlcgotCSAqIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBpbnB1dCdzIHR5cGUgaXMgdXNlZCB0byBmaW5kIGEgdmlld2VyIGRlc2NyaXB0b3IgaW4gdGhlIHJlZ2lzdHJ5Ci0JICogd2hpY2ggaW4gdHVybiBpcyB1c2VkIHRvIGNyZWF0ZSBhIHN0cnVjdHVyZSBjb21wYXJlIHZpZXdlciB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBJZiBubyB2aWV3ZXIgZGVzY3JpcHRvciBjYW4gYmUgZm91bmQgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gb2xkVmlld2VyIGEgbmV3IHZpZXdlciBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhpcyBvbGQgdmlld2VyIGNhbm5vdCBzaG93IHRoZSBnaXZlbiBpbnB1dAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IGZvciB3aGljaCB0byBmaW5kIGEgc3RydWN0dXJlIHZpZXdlcgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29tcG9zaXRlIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgcGFzc2VkIHRvIGEgbmV3bHkgY3JlYXRlZCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIHZpZXdlciB3aGljaCBpcyBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIGlucHV0IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlld2VyIGZpbmRTdHJ1Y3R1cmVWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgSUNvbXBhcmVJbnB1dCBpbnB1dCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLQkJcmV0dXJuIENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZmluZFN0cnVjdHVyZVZpZXdlcihvbGRWaWV3ZXIsIGlucHV0LCBwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgY29udGVudCBjb21wYXJlIHZpZXdlciBiYXNlZCBvbiBhbiBvbGQgdmlld2VyIGFuZCBhbiBpbnB1dCBvYmplY3QuCi0JICogSWYgdGhlIG9sZCB2aWV3ZXIgaXMgc3VpdGFibGUgZm9yIHNob3dpbmcgdGhlIGlucHV0IHRoZSBvbGQgdmlld2VyCi0JICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgaW5wdXQncyB0eXBlIGlzIHVzZWQgdG8gZmluZCBhIHZpZXdlciBkZXNjcmlwdG9yIGluIHRoZSByZWdpc3RyeQotCSAqIHdoaWNoIGluIHR1cm4gaXMgdXNlZCB0byBjcmVhdGUgYSBjb250ZW50IGNvbXBhcmUgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIElmIG5vIHZpZXdlciBkZXNjcmlwdG9yIGNhbiBiZSBmb3VuZCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBvbGRWaWV3ZXIgYSBuZXcgdmlld2VyIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGlzIG9sZCB2aWV3ZXIgY2Fubm90IHNob3cgdGhlIGdpdmVuIGlucHV0Ci0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3QgZm9yIHdoaWNoIHRvIGZpbmQgYSBjb250ZW50IHZpZXdlcgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29tcG9zaXRlIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgcGFzc2VkIHRvIGEgbmV3bHkgY3JlYXRlZCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIHZpZXdlciB3aGljaCBpcyBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIGlucHV0IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlld2VyIGZpbmRDb250ZW50Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIElDb21wYXJlSW5wdXQgaW5wdXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXJldHVybiBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbmRDb250ZW50Vmlld2VyKG9sZFZpZXdlciwgaW5wdXQsIHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBjb250ZW50IGNvbXBhcmUgdmlld2VyIGJhc2VkIG9uIGFuIG9sZCB2aWV3ZXIgYW5kIGFuIGlucHV0Ci0JICogb2JqZWN0LiBJZiB0aGUgb2xkIHZpZXdlciBpcyBzdWl0YWJsZSBmb3Igc2hvd2luZyB0aGUgaW5wdXQgdGhlIG9sZAotCSAqIHZpZXdlciBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBpbnB1dCdzIHR5cGUgaXMgdXNlZCB0byBmaW5kIGEgdmlld2VyCi0JICogZGVzY3JpcHRvciBpbiB0aGUgcmVnaXN0cnkgd2hpY2ggaW4gdHVybiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGNvbnRlbnQKLQkgKiBjb21wYXJlIHZpZXdlciB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4gSW4gb3JkZXIgdG8gZGV0ZXJtaW5lCi0JICogdGhlIGlucHV0J3MgdHlwZSwgdGhlIGlucHV0IG11c3QgZWl0aGVyIGltcGxlbWVudCBJU3RyZWFtQ29udGVudEFjY2Vzc29yCi0JICogYW5kIElUeXBlZEVsZW1lbnQgb3IgSUNvbXBhcmVJbnB1dC4gSWYgbm8gdmlld2VyIGRlc2NyaXB0b3IgY2FuIGJlIGZvdW5kCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gb2xkVmlld2VyIGEgbmV3IHZpZXdlciBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhpcyBvbGQgdmlld2VyIGNhbm5vdCBzaG93IHRoZSBnaXZlbiBpbnB1dAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IGZvciB3aGljaCB0byBmaW5kIGEgY29udGVudCB2aWV3ZXIuIE11c3QKLQkgKiBpbXBsZW1lbnQgZWl0aGVyIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+IGFuZDxjb2RlPgotCSAqIElUeXBlZEVsZW1lbnQ8L2NvZGU+IG9yIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+LgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29tcG9zaXRlIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgcGFzc2VkIHRvIGEgbmV3bHkgY3JlYXRlZCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIHZpZXdlciB3aGljaCBpcyBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIGlucHV0IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlld2VyIGZpbmRDb250ZW50Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIE9iamVjdCBpbnB1dCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCUNvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCi0JCXJldHVybiBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbmRDb250ZW50Vmlld2VyKG9sZFZpZXdlciwgaW5wdXQsIHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBhbGlhcyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0JICogU3Vic2VxdWVudCBjYWxscyB0byA8Y29kZT5maW5kU3RydWN0dXJlVmlld2VyPC9jb2RlPgotCSAqIHRyZWF0IGFsaWFzIGFzIGEgc3lub255bSBmb3IgdHlwZSBhbmQgcmV0dXJuIHRoZSBzYW1lIHZpZXdlci4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiAKLQkgKiBAcGFyYW0gdHlwZSBhIHR5cGUgbmFtZSBmb3Igd2hpY2ggYSB2aWV3ZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZAotCSAqIEBwYXJhbSBhbGlhcyBhIHR5cGUgbmFtZSB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN5bm9ueW0gb2YgdHlwZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkU3RydWN0dXJlVmlld2VyQWxpYXMoU3RyaW5nIHR5cGUsIFN0cmluZyBhbGlhcykgewotCQlDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZFN0cnVjdHVyZVZpZXdlckFsaWFzKHR5cGUsIGFsaWFzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBhbGlhc2VzIGZvciB0aGUgZ2l2ZW4gdHlwZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgYWZmZWN0Ci0JICogdGhlIGluaXRpYWwgYmluZGluZyBiZXR3ZWVuIHR5cGUgYW5kIHZpZXdlci4gSWYgbm8gYWxpYXNlcyBleGlzdCBmb3IgdGhlCi0JICogZ2l2ZW4gdHlwZSB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogPHA+Ci0JICogTm90ZTogdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4gCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgbmFtZSBmb3Igd2hpY2ggYWxsIHN5bm9ueW1lcyBhcmUgcmVtb3ZlZC4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFN0cnVjdHVyZVZpZXdlckFsaWFzZXMoU3RyaW5nIHR5cGUpIHsKLQkJQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVBbGxTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzKHR5cGUpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZVZpZXdlclBhbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0NvbXBhcmVWaWV3ZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOWE0OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZVZpZXdlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4gaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGljaCBpbnN0YWxscyBhCi0gKiA8Y29kZT5DTGFiZWw8L2NvZGU+IGFuZCBhIDxjb2RlPlRvb2xiYXI8L2NvZGU+IGluIGEgPGNvZGU+Vmlld0Zvcm08L2NvZGU+LgotICogPFA+Ci0gKiBEb3VibGUgY2xpY2tpbmcgb250byB0aGUgPGNvZGU+Q29tcGFyZVZpZXdlclBhbmU8L2NvZGU+J3MgdGl0bGUgYmFyIG1heGltaXplcwotICogdGhlIDxjb2RlPkNvbXBhcmVWaWV3ZXJQYW5lPC9jb2RlPiB0byB0aGUgc2l6ZSBvZiBhbiBlbmNsb3NpbmcgPGNvZGU+U3BsaXR0ZXI8L2NvZGU+Ci0gKiAoaWYgdGhlcmUgaXMgb25lKS4KLSAqIElmIG1vcmUgPGNvZGU+U3BsaXR0ZXJzPC9jb2RlPiBhcmUgbmVzdGVkIG1heGltaXppbmcgd2Fsa3MgdXAgYW5kCi0gKiBtYXhpbWl6ZXMgdG8gdGhlIG91dGVybW9zdCA8Y29kZT5TcGxpdHRlcjwvY29kZT4uCi0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVWaWV3ZXJQYW5lIGV4dGVuZHMgVmlld0Zvcm0gewotCQotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgZlRvb2xCYXJNYW5hZ2VyOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGdpdmVuIGl0cyBwYXJlbnQKLQkgKiBhbmQgYSBzdHlsZSB2YWx1ZSBkZXNjcmliaW5nIGl0cyBiZWhhdmlvciBhbmQgYXBwZWFyYW5jZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgYSB3aWRnZXQgd2hpY2ggd2lsbCBiZSB0aGUgY29udGFpbmVyIG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotCSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2Ygd2lkZ2V0IHRvIGNvbnN0cnVjdAotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLQkgKiA8L3VsPgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLQkgKiA8L3VsPgotCSAqLwkJCi0JcHVibGljIENvbXBhcmVWaWV3ZXJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzdHlsZSkgewotCQlzdXBlcihjb250YWluZXIsIHN0eWxlKTsKLQkJCi0JCW1hcmdpbldpZHRoPSAwOwotCQltYXJnaW5IZWlnaHQ9IDA7Ci0JCQotCQlDTGFiZWwgbGFiZWw9IG5ldyBDTGFiZWwodGhpcywgU1dULk5PTkUpIHsKLQkJCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVTaXplKHdIaW50LCBNYXRoLm1heCgyNCwgaEhpbnQpLCBjaGFuZ2VkKTsKLQkJCX0KLQkJfTsKLQkJc2V0VG9wTGVmdChsYWJlbCk7Ci0JCQotCQlNb3VzZUFkYXB0ZXIgbWw9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJCUNvbnRyb2wgY29udGVudD0gZ2V0Q29udGVudCgpOwotCQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudC5nZXRCb3VuZHMoKS5jb250YWlucyhlLngsIGUueSkpCi0JCQkJCXJldHVybjsKLQkJCQlDb250cm9sIHBhcmVudD0gZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNwbGl0dGVyKQotCQkJCQkoKFNwbGl0dGVyKXBhcmVudCkuc2V0TWF4aW1pemVkQ29udHJvbChDb21wYXJlVmlld2VyUGFuZS50aGlzKTsKLQkJCX0KLQkJfTsJCi0JCQkJCi0JCWFkZE1vdXNlTGlzdGVuZXIobWwpOwotCQlsYWJlbC5hZGRNb3VzZUxpc3RlbmVyKG1sKTsKLQkJCi0JCWFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpZiAoZlRvb2xCYXJNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZlRvb2xCYXJNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJCQlmVG9vbEJhck1hbmFnZXI9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBwYW5lJ3MgdGl0bGUgdGV4dC4KLQkgKiBUaGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gY2xlYXJzIGl0LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhbmUgb3IgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIGxhYmVsKSB7Ci0JCUNMYWJlbCBjbD0gKENMYWJlbCkgZ2V0VG9wTGVmdCgpOwotCQlpZiAoY2wgIT0gbnVsbCkKLQkJCWNsLnNldFRleHQobGFiZWwpOwkJCi0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgcGFuZSdzIHRpdGxlIEltYWdlLgotCSAqIFRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBjbGVhcnMgaXQuCi0JICogCi0JICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhbmUgb3IgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCUNMYWJlbCBjbD0gKENMYWJlbCkgZ2V0VG9wTGVmdCgpOwotCQlpZiAoY2wgIT0gbnVsbCkKLQkJCWNsLnNldEltYWdlKGltYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFyZW50IGlzIGEKLQkgKiA8Y29kZT5Db21wYXJlVmlld2VyUGFuZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFyZW50IGlzIGEgPGNvZGU+Q29tcGFyZVZpZXdlclBhbmU8L2NvZGU+IG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbEJhck1hbmFnZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29tcGFyZVZpZXdlclBhbmUpIHsKLQkJCUNvbXBhcmVWaWV3ZXJQYW5lIHBhbmU9IChDb21wYXJlVmlld2VyUGFuZSkgcGFyZW50OwotCQkJcmV0dXJuIHBhbmUuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdG9vbCBpdGVtcyBpbiB0aGUgPGNvZGU+Q29tcGFyZVZpZXdlclBhbmU8L2NvZGU+J3MgY29udHJvbCBiYXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJUb29sQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVG9vbEJhck1hbmFnZXIgdGJtPSBnZXRUb29sQmFyTWFuYWdlcihwYXJlbnQpOwotCQlpZiAodGJtICE9IG51bGwpIHsKLQkJCXRibS5yZW1vdmVBbGwoKTsKLQkJCXRibS51cGRhdGUodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLy8tLS0tIHByaXZhdGUgc3R1ZmYKLQkKLQlwcml2YXRlIFRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgewotCQlpZiAoZlRvb2xCYXJNYW5hZ2VyID09IG51bGwpIHsKLQkJCVRvb2xCYXIgdGI9IG5ldyBUb29sQmFyKHRoaXMsIFNXVC5GTEFUKTsKLQkJCXNldFRvcENlbnRlcih0Yik7Ci0JCQlmVG9vbEJhck1hbmFnZXI9IG5ldyBUb29sQmFyTWFuYWdlcih0Yik7Ci0JCX0KLQkJcmV0dXJuIGZUb29sQmFyTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlOGQxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9Db21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JQ29tcGFyZUlucHV0OwotCi0KLS8qKgotICogQSBjdXN0b20gPGNvZGU+Q29tcGFyZVZpZXdlclBhbmU8L2NvZGU+IHRoYXQgc3VwcG9ydHMgZHluYW1pYyB2aWV3ZXIgc3dpdGNoaW5nLgotICogCi0gKiA8cD4KLSAqIENsaWVudHMgbXVzdCBpbXBsZW1lbnQgdGhlIHZpZXdlciBzd2l0Y2hpbmcgc3RyYXRlZ3kgYnkgaW1wbGVtZW50aW5nCi0gKiB0aGUgPGNvZGU+Z2V0Vmlld2VyKFZpZXdlciwgT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotICogPHA+Ci0gKiBJZiBhIHByb3BlcnR5IHdpdGggdGhlIG5hbWUgPGNvZGU+Q29tcGFyZVVJLkNPTVBBUkVfVklFV0VSX1RJVExFPC9jb2RlPiBpcyBzZXQKLSAqIG9uIHRoZSB0b3AgbGV2ZWwgU1dUIGNvbnRyb2wgb2YgYSB2aWV3ZXIsIGl0IGlzIHVzZWQgYXMgYSB0aXRsZSBpbiB0aGUgPGNvZGU+Q29tcGFyZVZpZXdlclBhbmU8L2NvZGU+J3MKLSAqIHRpdGxlIGJhci4KLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZXh0ZW5kcyBDb21wYXJlVmlld2VyUGFuZQotCQkJCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBWaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIE9iamVjdCBmSW5wdXQ7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZlNlbGVjdGlvbkxpc3RlbmVycz0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZEb3VibGVDbGlja0xpc3RlbmVyPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZk9wZW5MaXN0ZW5lcj0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBmQ29udHJvbFZpc2liaWxpdHk9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZUaXRsZTsKLQlwcml2YXRlIFN0cmluZyBmVGl0bGVBcmd1bWVudDsKLQkKLQlwcml2YXRlIElPcGVuTGlzdGVuZXIgZk9wZW5IYW5kbGVyPSBuZXcgSU9wZW5MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpIHsKLQkJCU9iamVjdFtdIGxpc3RlbmVycz0gZk9wZW5MaXN0ZW5lci5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspCi0JCQkJKChJT3Blbkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLm9wZW4oZXZlbnQpOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+Q29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmU8L2NvZGU+IGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudCBhbmQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgU1dUIHN0eWxlIGJpdHMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IGEgd2lkZ2V0IHdoaWNoIHdpbGwgYmUgdGhlIHBhcmVudCBvZiB0aGUgbmV3IGluc3RhbmNlIChjYW5ub3QgYmUgbnVsbCkKLQkgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLQkgKgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLQkgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0JICogPC91bD4KLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0JICogPC91bD4KLQkgKi8JCQotCXB1YmxpYyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5Db21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZTwvY29kZT4gYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50IGFuZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBTV1Qgc3R5bGUgYml0cy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgYSB3aWRnZXQgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotCSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2Ygd2lkZ2V0IHRvIGNvbnN0cnVjdAotCSAqIEBwYXJhbSB2aXNpYmlsaXR5IHRoZSBpbml0aWFsIHZpc2liaWxpdHkgb2YgdGhlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lCi0JICoKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFyZW50IGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLQkgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotCSAqIDwvdWw+Ci0JICovCQkKLQlwdWJsaWMgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBib29sZWFuIHZpc2liaWxpdHkpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLQkJZkNvbnRyb2xWaXNpYmlsaXR5PSB2aXNpYmlsaXR5OwotCQkKLQkJc2V0Vmlld2VyKG5ldyBOdWxsVmlld2VyKHRoaXMpKTsKLQkJCi0JCWFkZERpc3Bvc2VMaXN0ZW5lcigKLQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCkKLQkJCQkJCWZWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lLnRoaXMpOwotCQkJCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQkJCVN0cnVjdHVyZWRWaWV3ZXIgc3Y9IChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyOwotCQkJCQkJc3YucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZS50aGlzKTsKLQkJCQkJCXN2LnJlbW92ZU9wZW5MaXN0ZW5lcihmT3BlbkhhbmRsZXIpOwotCQkJCQl9Ci0JCQkJCWZWaWV3ZXI9IG51bGw7Ci0JCQkJCWZJbnB1dD0gbnVsbDsKLQkJCQkJZlNlbGVjdGlvbkxpc3RlbmVycz0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmlld2VyCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiBmVmlld2VyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Vmlld2VyKFZpZXdlciBuZXdWaWV3ZXIpIHsKLQkJCi0JCWlmIChuZXdWaWV3ZXIgPT0gZlZpZXdlcikKLQkJCXJldHVybjsKLQkJCQkKLQkJYm9vbGVhbiBvbGRFbXB0eT0gaXNFbXB0eSgpOwotCi0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCQotCQkJZlZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQkJIAotCQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJU3RydWN0dXJlZFZpZXdlciBzdj0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQkJc3YucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJCQlzdi5yZW1vdmVPcGVuTGlzdGVuZXIoZk9wZW5IYW5kbGVyKTsKLQkJCX0KLQotCQkJQ29udHJvbCBjb250ZW50PSBnZXRDb250ZW50KCk7Ci0JCQlzZXRDb250ZW50KG51bGwpOwotCQkJCi0JCQlmVmlld2VyLnNldElucHV0KG51bGwpOwotCQkJCQkJCQkKLQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgIWNvbnRlbnQuaXNEaXNwb3NlZCgpKQotCQkJCWNvbnRlbnQuZGlzcG9zZSgpOwotCi0JCX0gZWxzZQotCQkJb2xkRW1wdHk9IGZhbHNlOwkJCQotCQlzZXRDb250ZW50KG51bGwpOwotCi0JCWZWaWV3ZXI9IG5ld1ZpZXdlcjsKLQotCQlpZiAoZlZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyB3ZSBoYXZlIHRvIHJlbWVtYmVyIGFuZCByZXN0b3JlIHRoZSBvbGQgdmlzaWJpbGl0eSBvZiB0aGUgQ3VzdG9tUGFuZQotCQkJLy8gc2luY2Ugc2V0Q29udGVudCBjaGFuZ2VzIHRoZSB2aXNpYmlsaXR5Ci0JCQlib29sZWFuIG9sZD0gZ2V0VmlzaWJsZSgpOwotCQkJc2V0Q29udGVudChmVmlld2VyLmdldENvbnRyb2woKSk7Ci0JCQlzZXRWaXNpYmxlKG9sZCk7CS8vIHJlc3RvcmUgb2xkIHZpc2liaWxpdHkKLQotCQkJYm9vbGVhbiBuZXdFbXB0eT0gaXNFbXB0eSgpOwotCi0JCQlmVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJU3RydWN0dXJlZFZpZXdlciBzdj0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQkJc3YuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJCQlzdi5hZGRPcGVuTGlzdGVuZXIoZk9wZW5IYW5kbGVyKTsKLQkJCX0KLQkJCQotCQkJaWYgKG9sZEVtcHR5ICE9IG5ld0VtcHR5KSB7CS8vIHJlbGF5b3V0IG15IGNvbnRhaW5lcgotCQkJCUNvbXBvc2l0ZSBwYXJlbnQ9IGdldFBhcmVudCgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTcGxpdHRlcikKLQkJCQkJKChTcGxpdHRlcilwYXJlbnQpLnNldFZpc2libGUodGhpcywgZkNvbnRyb2xWaXNpYmlsaXR5ID8gIW5ld0VtcHR5IDogdHJ1ZSk7Ci0JCQl9Ci0JCQkJCi0JCQlsYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCB0aXRsZSBhcmd1bWVudCB0aGF0IGhhcyBiZWVuIHNldCB3aXRoIDxjb2RlPnNldFRpdGVsQXJndW1lbnQ8L2NvZGU+Ci0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb3B0aW9uYWwgdGl0bGUgYXJndW1lbnQgaGFzIGJlZW4gc2V0LgotCSAqIDxwPgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHJldHVybiB0aGUgb3B0aW9uYWwgdGl0bGUgYXJndW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlQXJndW1lbnQoKSB7Ci0JCXJldHVybiBmVGl0bGVBcmd1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5vIHZpZXdlciBpcyBpbnN0YWxsZWQgb3IgaWYgdGhlIGN1cnJlbnQgdmlld2VyCi0JICogaXMgYSA8Y29kZT5OdWxsVmlld2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5vIHZpZXdlciBpcyBpbnN0YWxsZWQgb3IgaWYgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGEgPGNvZGU+TnVsbFZpZXdlcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZlZpZXdlciA9PSBudWxsIHx8IGZWaWV3ZXIgaW5zdGFuY2VvZiBOdWxsVmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwpIHsKLQkJZlNlbGVjdGlvbkxpc3RlbmVycy5hZGQobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCkgewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLnJlbW92ZShsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIGwpIHsKLQkJZkRvdWJsZUNsaWNrTGlzdGVuZXIuYWRkKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbCkgewotCQlmRG91YmxlQ2xpY2tMaXN0ZW5lci5yZW1vdmUobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3Blbkxpc3RlbmVyKElPcGVuTGlzdGVuZXIgbCkgewotCQlmT3Blbkxpc3RlbmVyLmFkZChsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVPcGVuTGlzdGVuZXIoSU9wZW5MaXN0ZW5lciBsKSB7Ci0JCWZPcGVuTGlzdGVuZXIucmVtb3ZlKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmRG91YmxlQ2xpY2tMaXN0ZW5lci5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKLQkJCSgoSURvdWJsZUNsaWNrTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkuZG91YmxlQ2xpY2soZXZlbnQpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzKSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwpCi0JCQkgZlZpZXdlci5zZXRTZWxlY3Rpb24ocyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXYpIHsKLQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmU2VsZWN0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQotCQkJKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLnNlbGVjdGlvbkNoYW5nZWQoZXYpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzRm9jdXMyKCkgewotCQkvLyBkbyB3ZSBoYXZlIGZvY3VzPwotCQlEaXNwbGF5IGRpc3BsYXk9IGdldERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkKLQkJCWZvciAoQ29udHJvbCBmb2N1cz0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsgZm9jdXMgIT0gbnVsbDsgZm9jdXM9IGZvY3VzLmdldFBhcmVudCgpKQotCQkJCWlmIChmb2N1cyA9PSB0aGlzKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoaXMgcGFuZS4gCi0JICogRm9yIHRoaXMgaW5wdXQgb2JqZWN0IGEgc3VpdGFibGUgdmlld2VyIGlzIGRldGVybWluZWQgYnkgY2FsbGluZyB0aGUgYWJzdHJhY3QKLQkgKiBtZXRob2QgPGNvZGU+Z2V0Vmlld2VyKFZpZXdlciwgT2JqZWN0KTwvY29kZT4uCi0JICogSWYgdGhlIHJldHVybmVkIHZpZXdlciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgb25lLCB0aGUgb2xkIHZpZXdlcgotCSAqIGlzIGRpc3Bvc2VkIGFuZCB0aGUgbmV3IG9uZSBpbnN0YWxsZWQuIFRoZW4gdGhlIGlucHV0IG9iamVjdCBpcyBmZWQKLQkgKiBpbnRvIHRoZSBuZXdseSBpbnN0YWxsZWQgdmlld2VyIGJ5IGNhbGxpbmcgaXRzIDxjb2RlPnNldElucHV0KE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KLQkgKiBJZiBuZXcgYW5kIG9sZCB2aWV3ZXIgZG9uJ3QgZGlmZmVyIG5vIG5ldyB2aWV3ZXIgaXMgaW5zdGFsbGVkIGJ1dCBqdXN0Ci0JICogPGNvZGU+c2V0SW5wdXQoT2JqZWN0KTwvY29kZT4gaXMgY2FsbGVkLgotCSAqIElmIHRoZSBpbnB1dCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgcGFuZSBpcyBjbGVhcmVkLAotCSAqIHRoYXQgaXMgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgbmV3IGlucHV0IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLyAKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQotCQlpZiAoZklucHV0ID09IGlucHV0KQotCQkJcmV0dXJuOwotCQkJCi0JCWJvb2xlYW4gaGFkRm9jdXM9IGhhc0ZvY3VzMigpOwotCQkKLQkJZklucHV0PSBpbnB1dDsKLQotCQkvLyB2aWV3ZXIgc3dpdGNoaW5nCi0JCVZpZXdlciBuZXdWaWV3ZXI9IG51bGw7Ci0JCWlmIChpbnB1dCAhPSBudWxsKQotCQkJbmV3Vmlld2VyPSBnZXRWaWV3ZXIoZlZpZXdlciwgaW5wdXQpOwotCi0JCWlmIChuZXdWaWV3ZXIgPT0gbnVsbCkgewotCQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBOdWxsVmlld2VyKQotCQkJCXJldHVybjsKLQkJCW5ld1ZpZXdlcj0gbmV3IE51bGxWaWV3ZXIodGhpcyk7Ci0JCX0KLQkJCi0JCXNldFZpZXdlcihuZXdWaWV3ZXIpOwotCi0JCS8vIHNldCBpbnB1dAotCQlmVmlld2VyLnNldElucHV0KGlucHV0KTsKLQotCQlJbWFnZSBpbWFnZT0gbnVsbDsKLQkJaWYgKCEoZlZpZXdlciBpbnN0YW5jZW9mIE51bGxWaWV3ZXIpICYmIGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCWltYWdlPSAoKElDb21wYXJlSW5wdXQpaW5wdXQpLmdldEltYWdlKCk7Ci0JCXNldEltYWdlKGltYWdlKTsKLQkJCi0JCVN0cmluZyB0aXRsZT0gbnVsbDsJCi0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgYz0gZlZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGRhdGE9IGMuZ2V0RGF0YShDb21wYXJlVUkuQ09NUEFSRV9WSUVXRVJfVElUTEUpOwotCQkJCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCQl0aXRsZT0gKFN0cmluZykgZGF0YTsKLQkJCQlpZiAoaGFkRm9jdXMpCi0JCQkJCWMuc2V0Rm9jdXMoKTsKLQkJCX0JCi0JCX0KLQkJCQotCQlmVGl0bGU9IHRpdGxlOwotCQl1cGRhdGVUaXRsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGFuIGFkZGl0aW9uYWwgYW5kIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGUgcGFuZSdzIHRpdGxlLgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogIAotCSAqIEBwYXJhbSBhcmd1bWVudCBhbiBvcHRpb25hbCBhcmd1bWVudCBmb3IgdGhlIHBhbmUncyB0aXRsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50KSB7Ci0JCWZUaXRsZUFyZ3VtZW50PSBhcmd1bWVudDsKLQkJdXBkYXRlVGl0bGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0JCWlmIChmVGl0bGUgIT0gbnVsbCkgewotCQkJaWYgKGZUaXRsZUFyZ3VtZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZm9ybWF0PSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZS5UaXRsZWZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgZlRpdGxlLCBmVGl0bGVBcmd1bWVudCB9ICk7Ci0JCQkJc2V0VGV4dCh0KTsKLQkJCX0gZWxzZQotCQkJCXNldFRleHQoZlRpdGxlKTsJCQkKLQkJfSBlbHNlIHsKLQkJCXNldFRleHQoIiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGlucHV0IG9mIHRoaXMgcGFuZSBvciBudWxsIGlmIHRoZSBwYW5lIGhhcyBubyBpbnB1dC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdGhhdCBpcyB0aGUgaW5wdXQgdG8gdGhpcyBwYW5lIG9yIG51bGwgaWYgdGhlIHBhbmUgaGFzIG5vIGlucHV0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZpZXdlciB3aGljaCBpcyBhYmxlIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGlucHV0LgotCSAqIElmIG5vIHZpZXdlciBjYW4gYmUgZm91bmQsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIFRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50IG9sZFZpZXdlciByZXByZXNlbnRzIHRoZSB2aWV3ZXIgY3VycmVudGx5IGluc3RhbGxlZAotCSAqIGluIHRoZSBwYW5lIChvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB2aWV3ZXIgaXMgaW5zdGFsbGVkKS4KLQkgKiBJdCBjYW4gYmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBpZiB0aGUgY3VycmVudCB2aWV3ZXIgY2FuIGRlYWwgd2l0aCB0aGUKLQkgKiBpbnB1dCAoYW5kIG5vIG5ldyB2aWV3ZXIgbXVzdCBiZSBjcmVhdGVkKS4KLQkgKgotCSAqIEBwYXJhbSBvbGRWaWV3ZXIgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgdmlld2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3QgZm9yIHdoaWNoIGEgdmlld2VyIG11c3QgYmUgZGV0ZXJtaW5lZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gYSB2aWV3ZXIgZm9yIHRoZSBnaXZlbiBpbnB1dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmlld2VyIGNhbiBiZSBkZXRlcm1pbmVkCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0VkaXRpb25TZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0VkaXRpb25TZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMjA2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9FZGl0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudGV4dC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB3aGVyZSBvbmUgaW5wdXQgZWxlbWVudCBjYW4gYmUgY29tcGFyZWQgYWdhaW5zdAotICogYSBsaXN0IG9mIGhpc3RvcmljIHZhcmlhbnRzIChlZGl0aW9ucykgb2YgdGhlIHNhbWUgaW5wdXQgZWxlbWVudC4KLSAqIFRoZSBkaWFsb2cgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZ1bmN0aW9ucyBsaWtlICJDb21wYXJlL1JlcGxhY2Ugd2l0aCBWZXJzaW9uIiBvcgotICogIkNvbXBhcmUvUmVwbGFjZSBmcm9tIExvY2FsIEhpc3RvcnkiIG9uIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBzdWJzZWN0aW9uIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gKiAoZS5nLiBhIG1ldGhvZCBpbiBhIEphdmEgc291cmNlIGZpbGUpIGJ5IG1lYW5zIG9mIGEgInBhdGgiLgotICogSW4gdGhpcyBjYXNlIHRoZSBkaWFsb2cgY29tcGFyZXMgb25seSB0aGUgc3Vic2VjdGlvbiAoYXMgc3BlY2lmaWVkIGJ5IHRoZSBwYXRoKQotICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzdWJzZWN0aW9uIGluIHRoZSBsaXN0IG9mIGVkaXRpb25zLgotICogT25seSB0aG9zZSBlZGl0aW9ucyBhcmUgc2hvd24gd2hlcmUgdGhlIHN1YnNlY3Rpb24gZGlmZmVycyBmcm9tIHRoZSBzYW1lIHN1YnNlY3Rpb24gaW4KLSAqIGFub3RoZXIgZWRpdGlvbiB0aGVyZWJ5IG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBwcmVzZW50ZWQgdmFyaWFudHMuCi0gKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50ICJSZXBsYWNlIGZyb20gTG9jYWwgSGlzdG9yeSIKLSAqIGZvciB0aGUgSmF2YSBsYW5ndWFnZS4KLSAqIDxwPgotICogU3Vic2VjdGlvbnMgb2YgYW4gaW5wdXQgZWxlbWVudCBhcmUgZGV0ZXJtaW5lZCBieSBmaXJzdCBmaW5kaW5nIGFuCi0gKiA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvcjwvY29kZT4gZm9yIHRoZSBpbnB1dCdzIHR5cGUuCi0gKiBUaGVuIHRoZSBtZXRob2QgPGNvZGU+bG9jYXRlPC9jb2RlPiBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIHN1YnNlY3Rpb24uCi0gKiA8cD4KLSAqIEVhY2ggZWRpdGlvbiAodmFyaWFudCBpbiB0aGUgbGlzdCBvZiB2YXJpYW50cykgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPklNb2RpZmljYXRpb25EYXRlPC9jb2RlPiBpbnRlcmZhY2UKLSAqIHNvIHRoYXQgdGhlIGRpYWxvZyBjYW4gc29ydCB0aGUgZWRpdGlvbnMgYW5kIHByZXNlbnQgdGhlbSBpbiBhIHRyZWUgc3RydWN0dXJlIHdoZXJlIGV2ZXJ5Ci0gKiBub2RlIGNvcnJlc3BvbmRzIG9uZSBkYXkuCi0gKiA8cD4KLSAqIFRoZSBmdW5jdGlvbmFsaXR5IGlzIHN1cmZhY2VkIGluIGEgc2luZ2xlIGZ1bmN0aW9uIDxjb2RlPnNlbGVjdEVkaXRpb248L2NvZGU+LgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIElNb2RpZmljYXRpb25EYXRlCi0gKiBAc2VlIElUeXBlZEVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIEVkaXRpb25TZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBSZXNpemFibGVEaWFsb2cgewotCQkKLQkvKioKLQkgKiBBbiBpdGVtIGluIGFuIHVuZGVybHlpbmcgZWRpdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYWlyIHsKLQkJCi0JCXByaXZhdGUgSVR5cGVkRWxlbWVudCBmRWRpdGlvbjsKLQkJcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZJdGVtOwotCQlwcml2YXRlIFN0cmluZyBmQ29udGVudDsKLQkJcHJpdmF0ZSBJU3RydWN0dXJlQ3JlYXRvciBmU3RydWN0dXJlQ3JlYXRvcjsKLQkJcHJpdmF0ZSBib29sZWFuIGZIYXNFcnJvcj0gZmFsc2U7Ci0JCQkJCi0JCVBhaXIoSVN0cnVjdHVyZUNyZWF0b3Igc3RydWN0dXJlQ3JlYXRvciwgSVR5cGVkRWxlbWVudCBlZGl0aW9uLCBJVHlwZWRFbGVtZW50IGl0ZW0pIHsKLQkJCWZTdHJ1Y3R1cmVDcmVhdG9yPSBzdHJ1Y3R1cmVDcmVhdG9yOwotCQkJZkVkaXRpb249IGVkaXRpb247Ci0JCQlmSXRlbT0gaXRlbTsKLQkJfQotCQkKLQkJUGFpcihJU3RydWN0dXJlQ3JlYXRvciBzdHJ1Y3R1cmVDcmVhdG9yLCBJVHlwZWRFbGVtZW50IGVkaXRpb24pIHsKLQkJCXRoaXMoc3RydWN0dXJlQ3JlYXRvciwgZWRpdGlvbiwgZWRpdGlvbik7Ci0JCX0KLQkJCi0JCUlUeXBlZEVsZW1lbnQgZ2V0RWRpdGlvbigpIHsKLQkJCXJldHVybiBmRWRpdGlvbjsKLQkJfQotCi0JCUlUeXBlZEVsZW1lbnQgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBmSXRlbTsKLQkJfQotCQkKLQkJLyoKLQkJICogVGhlIGNvbnRlbnQgaXMgbGF6aWx5IGxvYWRlZAotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudCgpIHsKLQkJCWlmIChmQ29udGVudCA9PSBudWxsKSB7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwpCi0JCQkJCWZDb250ZW50PSBmU3RydWN0dXJlQ3JlYXRvci5nZXRDb250ZW50cyhmSXRlbSwgZmFsc2UpOwotCQkJCWVsc2UgewotCQkJCQlpZiAoZkl0ZW0gaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQkJCQlJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNjYT0gKElTdHJlYW1Db250ZW50QWNjZXNzb3IpIGZJdGVtOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmQ29udGVudD0gVXRpbGl0aWVzLnJlYWRTdHJpbmcoc2NhKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBOZWVkV29yawotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmQ29udGVudCA9PSBudWxsKQotCQkJCQlmQ29udGVudD0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmQ29udGVudDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQkJaWYgKG90aGVyICE9IG51bGwgJiYgb3RoZXIuZ2V0Q2xhc3MoKSA9PSBnZXRDbGFzcygpKSB7Ci0JCQkJaWYgKGdldENvbnRlbnQoKS5lcXVhbHMoKChQYWlyKW90aGVyKS5nZXRDb250ZW50KCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5lcXVhbHMob3RoZXIpOwotCQl9Ci0JfQotCQotCS8vIENvbmZpZ3VyYXRpb24gb3B0aW9ucwotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCXByaXZhdGUgQXJyYXlMaXN0IGZBcnJheUxpc3Q9IG5ldyBBcnJheUxpc3QoKTsKLQkvKiogdXNlIGEgc2lkZS1ieS1zaWRlIGNvbXBhcmUgdmlld2VyICovCi0JcHJpdmF0ZSBib29sZWFuIGZDb21wYXJlPSB0cnVlOwotCS8qKiBzaG93IHRhcmdldCBvbiByaWdodCBoYW5kIHNpZGUgKi8KLQlwcml2YXRlIGJvb2xlYW4gZlRhcmdldElzUmlnaHQ9IGZhbHNlOwotCS8qKiBoaWRlIGVudHJpZXMgd2hpY2ggaGF2ZSBpZGVudGljYWwgY29udGVudCAqLwotCXByaXZhdGUgYm9vbGVhbiBmSGlkZUlkZW50aWNhbD0gdHJ1ZTsKLQkvKiogYWRkIG1vZGUgaWYgdHJ1ZSwgb3RoZXJ3aXNlIHJlcGxhY2UgbW9kZSAqLwotCXByaXZhdGUgYm9vbGVhbiBmQWRkTW9kZT0gZmFsc2U7Ci0JLyoqIGNvbXBhcmUgbW9kZSBpZiB0cnVlLCBvdGhlcndpc2UgcmVwbGFjZS9hZGQgbW9kZSAqLwotCXByaXZhdGUgYm9vbGVhbiBmQ29tcGFyZU1vZGU9IGZhbHNlOwotCS8qKiBwZXJmb3JtIHN0cnVjdHVyZSBjb21wYXJlIG9uIGVkaXRpb25zICovCi0JcHJpdmF0ZSBib29sZWFuIGZTdHJ1Y3R1cmVDb21wYXJlPSBmYWxzZTsKLQkvKiogYWxsb3cgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiAqLwotCXByaXZhdGUgYm9vbGVhbiBmTXVsdGlTZWxlY3Q9IGZhbHNlOwotCQotCS8qKgotCSAqIE1hcHMgZnJvbSBtZW1iZXJzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWRpdGlvbnMuCi0JICogSGFzIG9ubHkgYSBzaW5nbGUgZW50cnkgaWYgZGlhbG9nIGlzIHVzZWQgaW4gIlJlcGxhY2UiIChhbmQgbm90ICJBZGQiKSBtb2RlLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmTWVtYmVyRWRpdGlvbnM7Ci0JLyoqCi0JICogTWFwcyBmcm9tIG1lbWJlcnMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzZWxlY3RlZCBlZGl0aW9uLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmTWVtYmVyU2VsZWN0aW9uOwotCS8qKiBUaGUgZWRpdGlvbnMgb2YgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbWVtYmVyICovCi0JcHJpdmF0ZSBMaXN0IGZDdXJyZW50RWRpdGlvbnM7Ci0JcHJpdmF0ZSBUaHJlYWQgZlRocmVhZDsKLQlwcml2YXRlIFBhaXIgZlRhcmdldFBhaXI7Ci0JLyoqIFRoZSBzZWxlY3RlZCBlZGl0aW9uIGluIHRoZSBlZGl0aW9uIHZpZXdlciAqLwotCXByaXZhdGUgSVR5cGVkRWxlbWVudCBmU2VsZWN0ZWRJdGVtOwotCXByaXZhdGUgU3RyaW5nIGZUaXRsZUFyZzsKLQlwcml2YXRlIEltYWdlIGZUaXRsZUltYWdlOwotCQotCS8vIFNXVCBjb250cm9scwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgZkNvbnRlbnRQYW5lOwotCXByaXZhdGUgQnV0dG9uIGZDb21taXRCdXR0b247Ci0JcHJpdmF0ZSBUYWJsZSBmTWVtYmVyVGFibGU7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyUGFuZSBmTWVtYmVyUGFuZTsKLQlwcml2YXRlIFRyZWUgZkVkaXRpb25UcmVlOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclBhbmUgZkVkaXRpb25QYW5lOwotCXByaXZhdGUgSW1hZ2UgZkRhdGVJbWFnZTsKLQlwcml2YXRlIEltYWdlIGZUaW1lSW1hZ2U7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmU3RydWN0dXJlZENvbXBhcmVQYW5lOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbW9kYWwsIHJlc2l6YWJsZSBkaWFsb2cuCi0JICogVmFyaW91cyB0aXRsZXMsIGljb25zLCBhbmQgbGFiZWxzIGFyZSBjb25maWd1cmVkIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBUaGUgZm9sbG93aW5nIHJlc291cmNlIGtleXMgYXJlIHVzZWQ6Ci0JICogPHByZT4KLQkgKglrZXkgICAgICAgICB0eXBlICAgICAgICAgIGRlc2NyaXB0aW9uCi0JICoJdGl0bGUgICAgICAgU3RyaW5nICAgICAgICBkaWFsb2cgdGl0bGUKLQkgKgl3aWR0aCAgICAgICBJbnRlZ2VyICAgICAgIGluaXRpYWwgd2lkdGggb2YgZGlhbG9nCi0JICoJaGVpZ2h0ICAgICAgSW50ZWdlciAgICAgICBpbml0aWFsIGhlaWdodCBvZiBkaWFsb2cKLQkgKgl0cmVlVGl0bGVGb3JtYXQgICBNZXNzYWdlRm9ybWF0IHBhbmUgdGl0bGUgZm9yIGVkaXRpb24gdHJlZTsgYXJnIDAgaXMgdGhlIHRhcmdldAotCSAqCWRhdGVJY29uICAgIFN0cmluZyAgICAgICAgaWNvbiBmb3Igbm9kZSBpbiBlZGl0aW9uIHRyZWU7IHBhdGggcmVsYXRpdmUgdG8gcGx1Z2luCi0JICoJdGltZUljb24gICAgU3RyaW5nICAgICAgICBpY29uIGZvciBsZWFmIGluIGVkaXRpb24gdHJlZTsgcGF0aCByZWxhdGl2ZSB0byBwbHVnaW4KLQkgKgl0b2RheUZvcm1hdCBNZXNzYWdlRm9ybWF0IGZvcm1hdCBzdHJpbmcgaWYgZGF0ZSBpcyB0b2RheXMgZGF0ZTsgYXJnIDAgaXMgZGF0ZQotCSAqCXllc3RlcmRheUZvcm1hdCBNZXNzYWdlRm9ybWF0IGZvcm1hdCBzdHJpbmcgaWYgZGF0ZSBpcyB5ZXN0ZXJkYXlzIGRhdGU7IGFyZyAwIGlzIGRhdGUKLQkgKglkYXlGb3JtYXQgICBNZXNzYWdlRm9ybWF0IGZvcm1hdCBzdHJpbmcgaWYgZGF0ZSBpcyBhbnkgb3RoZXIgZGF0ZTsgYXJnIDAgaXMgZGF0ZQotCSAqCWVkaXRpb25MYWJlbCBTdHJpbmcgICAgICAgbGFiZWwgZm9yIGVkaXRpb25zIHNpZGUgb2YgY29tcGFyZSB2aWV3ZXI7IGFyZyAwIGlzIHRoZSBkYXRlCi0JICoJdGFyZ2V0TGFiZWwgIFN0cmluZyAgICAgICBsYWJlbCBmb3IgdGFyZ2V0IHNpZGUgb2YgY29tcGFyZSB2aWV3ZXIgCi0JICogIGJ1dHRvbkxhYmVsICBTdHJpbmcgICAgICAgbGFiZWwgZm9yIE9LIGJ1dHRvbjsgZGVmYXVsdCBpcyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMCi0JICogPC9wcmU+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGUgbmV3IGRpYWxvZyBzdGF5cyBvbiB0b3Agb2YgdGhpcyBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gYnVuZGxlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPiB0byBjb25maWd1cmUgdGhlIGRpYWxvZwotCSAqLwotCXB1YmxpYyBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYnVuZGxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb249IG5ldyBDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldExlZnRFZGl0YWJsZShmYWxzZSk7Ci0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UmlnaHRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQl9Ci0JCQotCS8qKgotCSAqIFNldHMgYW4gYWRkaXRpb25hbCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgZm9yIHRoZSBlZGl0aW9uIHBhbmUncyB0aXRsZS4KLQkgKiAgCi0JICogQHBhcmFtIHRpdGxlQXJndW1lbnQgYW4gb3B0aW9uYWwgYXJndW1lbnQgZm9yIHRoZSBlZGl0aW9uIHBhbmUncyB0aXRsZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW9uVGl0bGVBcmd1bWVudChTdHJpbmcgdGl0bGVBcmd1bWVudCkgewotCQlmVGl0bGVBcmc9IHRpdGxlQXJndW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgYW4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSBlZGl0aW9uIHBhbmUncyB0aXRsZS4KLQkgKiAgCi0JICogQHBhcmFtIHRpdGxlSW1hZ2UgYW4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSBlZGl0aW9uIHBhbmUncyB0aXRsZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW9uVGl0bGVJbWFnZShJbWFnZSB0aXRsZUltYWdlKSB7Ci0JCWZUaXRsZUltYWdlPSB0aXRsZUltYWdlOwotCX0KLQkKLQkvKioKLQkgKiBTZWxlY3QgdGhlIHByZXZpb3VzIGVkaXRpb24gKHByZXNlbnRpbmcgYSBVSSkuCi0JICoKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBpbnB1dCBvYmplY3QgYWdhaW5zdCB3aGljaCB0aGUgZWRpdGlvbnMgYXJlIGNvbXBhcmVkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBpbnB1dEVkaXRpb25zIHRoZSBsaXN0IG9mIGVkaXRpb25zIChlbGVtZW50IHR5cGU6IDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+cykKLQkgKiBAcGFyYW0gcHBhdGggSWYgPGNvZGU+bnVsbDwvY29kZT4gZGlhbG9nIHNob3dzIGZ1bGwgaW5wdXQ7IGlmIG5vbiA8Y29kZT5udWxsPC9jb2RlPiBpdCBleHRyYWN0cyBhIHN1YnNlY3Rpb24KLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIHNlbGVjdGVkIGVkaXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZXJyb3Igb2NjdXJyZWQuCi0JICogVGhlIHJldHVybmVkIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+IGlzIG9uZSBvZiB0aGUgb3JpZ2luYWwgZWRpdGlvbnMKLQkgKiBpZiA8Y29kZT5wYXRoPC9jb2RlPiB3YXMgPGNvZGU+bnVsbDwvY29kZT47IG90aGVyd2lzZQotCSAqIGl0IGlzIGFuIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+IHJldHVybmVkIGZyb20gPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3IubG9jYXRlKHBhdGgsIGl0ZW0pPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVR5cGVkRWxlbWVudCBzZWxlY3RQcmV2aW91c0VkaXRpb24oZmluYWwgSVR5cGVkRWxlbWVudCB0YXJnZXQsIElUeXBlZEVsZW1lbnRbXSBpbnB1dEVkaXRpb25zLCBPYmplY3QgcHBhdGgpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0YXJnZXQpOwotCQlmVGFyZ2V0UGFpcj0gbmV3IFBhaXIobnVsbCwgdGFyZ2V0KTsKLQkJCi0JCS8vIHNvcnQgaW5wdXQgZWRpdGlvbnMKLQkJZmluYWwgaW50IGNvdW50PSBpbnB1dEVkaXRpb25zLmxlbmd0aDsKLQkJZmluYWwgSU1vZGlmaWNhdGlvbkRhdGVbXSBlZGl0aW9ucz0gbmV3IElNb2RpZmljYXRpb25EYXRlW2NvdW50XTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQllZGl0aW9uc1tpXT0gKElNb2RpZmljYXRpb25EYXRlKSBpbnB1dEVkaXRpb25zW2ldOwotCQlpZiAoY291bnQgPiAxKQotCQkJaW50ZXJuYWxTb3J0KGVkaXRpb25zKTsKLQkJCQotCQkvLyBmaW5kIFN0cnVjdHVyZUNyZWF0b3IgaWYgcHBhdGggaXMgbm90IG51bGwKLQkJSVN0cnVjdHVyZUNyZWF0b3Igc3RydWN0dXJlQ3JlYXRvcj0gbnVsbDsKLQkJaWYgKHBwYXRoICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlPSB0YXJnZXQuZ2V0VHlwZSgpOwotCQkJU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3Igc2NkPSBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cnVjdHVyZUNyZWF0b3IodHlwZSk7Ci0JCQlpZiAoc2NkICE9IG51bGwpCi0JCQkJc3RydWN0dXJlQ3JlYXRvcj0gc2NkLmNyZWF0ZVN0cnVjdHVyZUNyZWF0b3IoKTsKLQkJfQotCi0JCWlmIChmQWRkTW9kZSkgewotCQkJLy8gZG9lcyBub3Qgd29yayBpbiBhZGQgbW9kZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCQotCQlpZiAoc3RydWN0dXJlQ3JlYXRvciAhPSBudWxsKSB7Ci0JCQlQYWlyIHBhaXI9IGNyZWF0ZVBhaXIoc3RydWN0dXJlQ3JlYXRvciwgcHBhdGgsIHRhcmdldCk7Ci0JCQlpZiAocGFpciAhPSBudWxsKQotCQkJCWZUYXJnZXRQYWlyPSBwYWlyOwotCQkJZWxzZQotCQkJCXBwYXRoPSBudWxsOwkvLyBjb3VsZG4ndCBleHRyYWN0IGl0ZW0gYmVjYXVzZSBvZiBlcnJvcgotCQl9Ci0JCQkJCQotCQkvLyBmcm9tIGZyb250IChuZXdlc3QpIHRvIGJhY2sgKG9sZGVzdCkKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkKLQkJCUlUeXBlZEVsZW1lbnQgZWRpdGlvbj0gKElUeXBlZEVsZW1lbnQpIGVkaXRpb25zW2ldOwotCQkJUGFpciBwYWlyPSBudWxsOwotCQkJCi0JCQlpZiAoc3RydWN0dXJlQ3JlYXRvciAhPSBudWxsICYmIHBwYXRoICE9IG51bGwpIHsKLQkJCQkvLyBleHRyYWN0IHN1YiBlbGVtZW50IGZyb20gZWRpdGlvbgotCQkJCXBhaXI9IGNyZWF0ZVBhaXIoc3RydWN0dXJlQ3JlYXRvciwgcHBhdGgsIGVkaXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlwYWlyPSBuZXcgUGFpcihudWxsLCBlZGl0aW9uKTsKLQkJCX0KLQkJCQotCQkJaWYgKHBhaXIgIT0gbnVsbCAmJiBwYWlyLmZIYXNFcnJvcikKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCWlmIChwYWlyICE9IG51bGwgJiYgIWZUYXJnZXRQYWlyLmVxdWFscyhwYWlyKSkgewotCQkJCXJldHVybiBwYWlyLmZJdGVtOwotCQkJfQotCQl9Ci0JCQotCQkvLyBub3RoaW5nIGZvdW5kCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBQcmVzZW50cyB0aGlzIG1vZGFsIGRpYWxvZyB3aXRoIHRoZSBmdW5jdGlvbmFsaXR5IGRlc2NyaWJlZCBpbiB0aGUgY2xhc3MgY29tbWVudCBhYm92ZS4KLQkgKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIGlucHV0IG9iamVjdCBhZ2FpbnN0IHdoaWNoIHRoZSBlZGl0aW9ucyBhcmUgY29tcGFyZWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGlucHV0RWRpdGlvbnMgdGhlIGxpc3Qgb2YgZWRpdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT5zKQotCSAqIEBwYXJhbSBwcGF0aCBJZiA8Y29kZT5udWxsPC9jb2RlPiBkaWFsb2cgc2hvd3MgZnVsbCBpbnB1dDsgaWYgbm9uIDxjb2RlPm51bGw8L2NvZGU+IGl0IGV4dHJhY3RzIGEgc3Vic2VjdGlvbgotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgc2VsZWN0ZWQgZWRpdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBkaWFsb2cgd2FzIGNhbmNlbGxlZC4KLQkgKiBUaGUgcmV0dXJuZWQgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gaXMgb25lIG9mIHRoZSBvcmlnaW5hbCBlZGl0aW9ucwotCSAqIGlmIDxjb2RlPnBhdGg8L2NvZGU+IHdhcyA8Y29kZT5udWxsPC9jb2RlPjsgb3RoZXJ3aXNlCi0JICogaXQgaXMgYW4gPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gcmV0dXJuZWQgZnJvbSA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvci5sb2NhdGUocGF0aCwgaXRlbSk8L2NvZGU+Ci0JICovCi0JcHVibGljIElUeXBlZEVsZW1lbnQgc2VsZWN0RWRpdGlvbihmaW5hbCBJVHlwZWRFbGVtZW50IHRhcmdldCwgSVR5cGVkRWxlbWVudFtdIGlucHV0RWRpdGlvbnMsIE9iamVjdCBwcGF0aCkgewotCQkKLQkJQXNzZXJ0LmlzTm90TnVsbCh0YXJnZXQpOwotCQlmVGFyZ2V0UGFpcj0gbmV3IFBhaXIobnVsbCwgdGFyZ2V0KTsKLQkJCi0JCS8vIHNvcnQgaW5wdXQgZWRpdGlvbnMKLQkJZmluYWwgaW50IGNvdW50PSBpbnB1dEVkaXRpb25zLmxlbmd0aDsKLQkJZmluYWwgSU1vZGlmaWNhdGlvbkRhdGVbXSBlZGl0aW9ucz0gbmV3IElNb2RpZmljYXRpb25EYXRlW2NvdW50XTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQllZGl0aW9uc1tpXT0gKElNb2RpZmljYXRpb25EYXRlKSBpbnB1dEVkaXRpb25zW2ldOwotCQlpZiAoY291bnQgPiAxKQotCQkJaW50ZXJuYWxTb3J0KGVkaXRpb25zKTsKLQkJCQotCQkvLyBmaW5kIFN0cnVjdHVyZUNyZWF0b3IgaWYgcHBhdGggaXMgbm90IG51bGwKLQkJSVN0cnVjdHVyZUNyZWF0b3Igc3RydWN0dXJlQ3JlYXRvcj0gbnVsbDsKLQkJaWYgKHBwYXRoICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlPSB0YXJnZXQuZ2V0VHlwZSgpOwotCQkJU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3Igc2NkPSBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cnVjdHVyZUNyZWF0b3IodHlwZSk7Ci0JCQlpZiAoc2NkICE9IG51bGwpCi0JCQkJc3RydWN0dXJlQ3JlYXRvcj0gc2NkLmNyZWF0ZVN0cnVjdHVyZUNyZWF0b3IoKTsKLQkJfQotCi0JCWlmICghZkFkZE1vZGUpIHsKLQkJCS8vIHJlcGxhY2UgbW9kZQotCQkJCi0JCQlpZiAoc3RydWN0dXJlQ3JlYXRvciAhPSBudWxsKSB7Ci0JCQkJUGFpciBwYWlyPSBjcmVhdGVQYWlyKHN0cnVjdHVyZUNyZWF0b3IsIHBwYXRoLCB0YXJnZXQpOwotCQkJCWlmIChwYWlyICE9IG51bGwpCi0JCQkJCWZUYXJnZXRQYWlyPSBwYWlyOwotCQkJCWVsc2UKLQkJCQkJcHBhdGg9IG51bGw7CS8vIGNvdWxkbid0IGV4dHJhY3QgaXRlbSBiZWNhdXNlIG9mIGVycm9yCi0JCQl9Ci0JCQkKLQkJCS8vIHNldCB0aGUgbGVmdCBhbmQgcmlnaHQgbGFiZWxzIGZvciB0aGUgY29tcGFyZSB2aWV3ZXIKLQkJCVN0cmluZyB0YXJnZXRMYWJlbD0gZ2V0VGFyZ2V0TGFiZWwodGFyZ2V0LCBmVGFyZ2V0UGFpci5nZXRJdGVtKCkpOwotCQkJaWYgKGZUYXJnZXRJc1JpZ2h0KQotCQkJCWdldENvbXBhcmVDb25maWd1cmF0aW9uKCkuc2V0UmlnaHRMYWJlbCh0YXJnZXRMYWJlbCk7Ci0JCQllbHNlCi0JCQkJZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKS5zZXRMZWZ0TGFiZWwodGFyZ2V0TGFiZWwpOwotCQkJCi0JCQlpZiAoc3RydWN0dXJlQ3JlYXRvciAhPSBudWxsICYmIHBwYXRoICE9IG51bGwpIHsJLy8gZXh0cmFjdCBzdWIgZWxlbWVudAotCQkJCQotCQkJCWZpbmFsIElTdHJ1Y3R1cmVDcmVhdG9yIHNjPSBzdHJ1Y3R1cmVDcmVhdG9yOwotCQkJCWZpbmFsIE9iamVjdCBwYXRoPSBwcGF0aDsKLQkJCQkKLQkJCQkvLyBjb25zdHJ1Y3QgdGhlIGNvbXBhcmVyIHRocmVhZAotCQkJCS8vIGFuZCBwZXJmb3JtIHRoZSBiYWNrZ3JvdW5kIGV4dHJhY3QKLQkJCQlmVGhyZWFkPSBuZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJLy8gZnJvbSBmcm9udCAobmV3ZXN0KSB0byBiYWNrIChvbGRlc3QpCi0JCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQkJCQkKLQkJCQkJCQlpZiAoZkVkaXRpb25UcmVlID09IG51bGwgfHwgZkVkaXRpb25UcmVlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJSVR5cGVkRWxlbWVudCBlZGl0aW9uPSAoSVR5cGVkRWxlbWVudCkgZWRpdGlvbnNbaV07Ci0JCQkJCQkJCi0JCQkJCQkJLy8gZXh0cmFjdCBzdWIgZWxlbWVudCBmcm9tIGVkaXRpb24KLQkJCQkJCQlQYWlyIHBhaXI9IGNyZWF0ZVBhaXIoc2MsIHBhdGgsIGVkaXRpb24pOwotCQkJCQkJCWlmIChwYWlyICE9IG51bGwpCi0JCQkJCQkJCXNlbmRQYWlyKHBhaXIpOwotCQkJCQkJfQotCQkJCQkJc2VuZFBhaXIobnVsbCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjcmVhdGUgdHJlZSB3aWRnZXQKLQkJCQljcmVhdGUoKTsKLQkJCQkKLQkJCQkvLyBmcm9tIGZyb250IChuZXdlc3QpIHRvIGJhY2sgKG9sZGVzdCkKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCQkJYWRkTWVtYmVyRWRpdGlvbihuZXcgUGFpcihudWxsLCAoSVR5cGVkRWxlbWVudCkgZWRpdGlvbnNbaV0pKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJLy8gYWRkIG1vZGUKLQkJCWZpbmFsIE9iamVjdCBjb250YWluZXI9IHBwYXRoOwotCQkJQXNzZXJ0LmlzTm90TnVsbChjb250YWluZXIpOwotCQkJCQkJCQkKLQkJCWlmIChzdHJ1Y3R1cmVDcmVhdG9yID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7CS8vIGVycm9yCi0JCQotCQkJLy8gZXh0cmFjdCBhbGwgZWxlbWVudHMgb2YgY29udGFpbmVyCi0JCQlmaW5hbCBIYXNoU2V0IGN1cnJlbnQ9IG5ldyBIYXNoU2V0KCk7Ci0JCQlJU3RydWN0dXJlQ29tcGFyYXRvciBzY289IHN0cnVjdHVyZUNyZWF0b3IubG9jYXRlKGNvbnRhaW5lciwgdGFyZ2V0KTsKLQkJCWlmIChzY28gIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGNoaWxkcmVuPSBzY28uZ2V0Q2hpbGRyZW4oKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCQkJY3VycmVudC5hZGQoY2hpbGRyZW5baV0pOwotCQkJfQotCQkJCi0JCQlmaW5hbCBJU3RydWN0dXJlQ3JlYXRvciBzYz0gc3RydWN0dXJlQ3JlYXRvcjsKLQkJCQotCQkJLy8gY29uc3RydWN0IHRoZSBjb21wYXJlciB0aHJlYWQKLQkJCS8vIGFuZCBwZXJmb3JtIHRoZSBiYWNrZ3JvdW5kIGV4dHJhY3QKLQkJCWZUaHJlYWQ9IG5ldyBUaHJlYWQoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkKLQkJCQkJLy8gZnJvbSBmcm9udCAobmV3ZXN0KSB0byBiYWNrIChvbGRlc3QpCi0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCQkJCi0JCQkJCQlpZiAoZkVkaXRpb25UcmVlID09IG51bGwgfHwgZkVkaXRpb25UcmVlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlicmVhazsKLQkJCQkJCUlUeXBlZEVsZW1lbnQgZWRpdGlvbj0gKElUeXBlZEVsZW1lbnQpIGVkaXRpb25zW2ldOwotCQkJCQkJCi0JCQkJCQlJU3RydWN0dXJlQ29tcGFyYXRvciBzY28yPSBzYy5sb2NhdGUoY29udGFpbmVyLCBlZGl0aW9uKTsKLQkJCQkJCWlmIChzY28yICE9IG51bGwpIHsKLQkJCQkJCQlPYmplY3RbXSBjaGlsZHJlbj0gc2NvMi5nZXRDaGlsZHJlbigpOwotCQkJCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWZvciAoaW50IGkyPSAwOyBpMiA8IGNoaWxkcmVuLmxlbmd0aDsgaTIrKykgewotCQkJCQkJCQkJSVR5cGVkRWxlbWVudCBjaGlsZD0gKElUeXBlZEVsZW1lbnQpIGNoaWxkcmVuW2kyXTsKLQkJCQkJCQkJCWlmICghY3VycmVudC5jb250YWlucyhjaGlsZCkpCi0JCQkJCQkJCQkJc2VuZFBhaXIobmV3IFBhaXIoc2MsIGVkaXRpb24sIGNoaWxkKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2VuZFBhaXIobnVsbCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJb3BlbigpOwotCQkKLQkJaWYgKGdldFJldHVybkNvZGUoKSA9PSBPSykKLQkJCXJldHVybiBmU2VsZWN0ZWRJdGVtOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBQYWlyIGNyZWF0ZVBhaXIoSVN0cnVjdHVyZUNyZWF0b3Igc2MsIE9iamVjdCBwYXRoLCBJVHlwZWRFbGVtZW50IGlucHV0KSB7Ci0JCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIHNjbXA9IHNjLmxvY2F0ZShwYXRoLCBpbnB1dCk7Ci0JCWlmIChzY21wID09IG51bGwgJiYgc2MuZ2V0U3RydWN0dXJlKGlucHV0KSA9PSBudWxsKSB7CS8vIHBhcnNlIGVycm9yCi0JCQlQYWlyIHA9IG5ldyBQYWlyKHNjLCBpbnB1dCk7Ci0JCQlwLmZIYXNFcnJvcj0gdHJ1ZTsKLQkJCXJldHVybiBwOwotCQl9Ci0JCWlmIChzY21wIGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkKLQkJCXJldHVybiBuZXcgUGFpcihzYywgaW5wdXQsIChJVHlwZWRFbGVtZW50KSBzY21wKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciBpZGVudGljYWwgZW50cmllcyBhcmUgc2hvd24gb3Igbm90IChkZWZhdWx0KS4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgPGNvZGU+c2VsZWN0RWRpdGlvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaGlkZSBpZiB0cnVlIGlkZW50aWNhbCBlbnRyaWVzIGFyZSBoaWRkZW47IG90aGVyd2lzZSB0aGV5IGFyZSBzaG93bi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGlkZUlkZW50aWNhbEVudHJpZXMoYm9vbGVhbiBoaWRlKSB7Ci0JCWZIaWRlSWRlbnRpY2FsPSBoaWRlOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2xzIHdoZXRoZXIgd29ya3NwYWNlIHRhcmdldCBpcyBvbiB0aGUgbGVmdCAodGhlIGRlZmF1bHQpIG9yIHJpZ2h0IGhhbmQgc2lkZS4KLQkgKgotCSAqIEBwYXJhbSBpc1JpZ2h0IGlmIHRydWUgdGFyZ2V0IGlzIHNob3duIG9uIHJpZ2h0IGhhbmQgc2lkZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0SXNSaWdodChib29sZWFuIGlzUmlnaHQpIHsKLQkJZlRhcmdldElzUmlnaHQ9IGlzUmlnaHQ7Ci0JfQotCQkKLQkvKioKLQkgKiBDb250cm9scyB3aGV0aGVyIHRoZSA8Y29kZT5FZGl0aW9uU2VsZWN0aW9uRGlhbG9nPC9jb2RlPiBpcyBpbiAnYWRkJyBtb2RlCi0JICogb3IgJ3JlcGxhY2UnIG1vZGUgKHRoZSBkZWZhdWx0KS4KLQkgKgotCSAqIEBwYXJhbSBhZGRNb2RlIGlmIHRydWUgZGlhbG9nIGlzIGluICdhZGQnIG1vZGUuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZE1vZGUoYm9vbGVhbiBhZGRNb2RlKSB7Ci0JCWZBZGRNb2RlPSBhZGRNb2RlOwotCQlmTXVsdGlTZWxlY3Q9IGFkZE1vZGU7Ci0JfQotCQotCS8qKgotCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIDxjb2RlPkVkaXRpb25TZWxlY3Rpb25EaWFsb2c8L2NvZGU+IGlzIGluICdjb21wYXJlJyBtb2RlCi0JICogb3IgJ2FkZC9yZXBsYWNlJyAodGhlIGRlZmF1bHQpIG1vZGUuIAotCSAqCi0JICogQHBhcmFtIGNvbXBhcmVNb2RlIGlmIHRydWUgZGlhbG9nIGlzIGluICdhZGQnIG1vZGUuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBhcmVNb2RlKGJvb2xlYW4gY29tcGFyZU1vZGUpIHsKLQkJZkNvbXBhcmVNb2RlPSBjb21wYXJlTW9kZTsKLQkJZlN0cnVjdHVyZUNvbXBhcmU9IGZDb21wYXJlTW9kZSAmJiAhZkFkZE1vZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlucHV0IHRhcmdldCB0aGF0IGhhcyBiZWVuIHNwZWNpZmllZCB3aXRoIHRoZSBtb3N0IHJlY2VudCBjYWxsCi0JICogdG8gPGNvZGU+c2VsZWN0RWRpdGlvbjwvY29kZT4uIElmIGEgbm90IDxjb2RlPm51bGw8L2NvZGU+IHBhdGggd2FzIHNwZWNpZmllZCB0aGlzIG1ldGhvZAotCSAqIHJldHVybnMgYSBzdWJzZWN0aW9uIG9mIHRoaXMgdGFyZ2V0ICg8Y29kZT5JU3RydWN0dXJlQ3JlYXRvci5sb2NhdGUocGF0aCwgdGFyZ2V0KTwvY29kZT4pCi0JICogaW5zdGVhZCBvZiB0aGUgaW5wdXQgdGFyZ2V0LgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlIGlmIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+IGlzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IGFuZCA8Y29kZT5wYXRoPC9jb2RlPiBzcGVjaWZpZXMKLQkgKiBhIG1ldGhvZCwgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gPGNvZGU+Z2V0VGFyZ2V0PC9jb2RlPiB3aWxsIGJlIHRoZSBtZXRob2Qgbm90IHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqCi0JICogQHJldHVybiB0aGUgbGFzdCBzcGVjaWZpZWQgdGFyZ2V0IG9yIGEgc3Vic2VjdGlvbiB0aGVyZW9mLgotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGZUYXJnZXRQYWlyLmdldEl0ZW0oKTsKLQl9Ci0gCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRpb25zIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIHdpdGggdGhlIG1vc3QKLQkgKiByZWNlbnQgY2FsbCB0byA8Y29kZT5zZWxlY3RFZGl0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCBlZGl0aW9ucyBhcyBhbiBhcnJheS4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIElUeXBlZEVsZW1lbnRbXSBnZXRTZWxlY3Rpb24oKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGZNZW1iZXJTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcj0gZkFycmF5TGlzdC5pdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaT0gMDsgaXRlci5oYXNOZXh0KCk7IGkrKykgewotCQkJCU9iamVjdCBlZGl0aW9uPSBpdGVyLm5leHQoKTsJCQotCQkJCU9iamVjdCBpdGVtPSBmTWVtYmVyU2VsZWN0aW9uLmdldChlZGl0aW9uKTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJCQlyZXN1bHQuYWRkKGl0ZW0pOwotCQkJfQotCQl9IGVsc2UgaWYgKGZTZWxlY3RlZEl0ZW0gIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGQoZlNlbGVjdGVkSXRlbSk7Ci0JCXJldHVybiAoSVR5cGVkRWxlbWVudFtdKSByZXN1bHQudG9BcnJheShuZXcgSVR5cGVkRWxlbWVudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQkKLSAJLyoqCi0gCSAqIFJldHVybnMgYSBsYWJlbCBmb3IgaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBzaWRlIG9mIGEgY29tcGFyZSB2aWV3ZXIuCi0gCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZXh0cmFjdHMgdGhlIHZhbHVlIGZvciB0aGUga2V5ICJ0YXJnZXRMYWJlbCIgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gCSAqIGFuZCBwYXNzZXMgaXQgYXMgdGhlIGZvcm1hdCBhcmd1bWVudCB0byA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4uCi0gCSAqIFRoZSBzaW5nbGUgZm9ybWF0IGFyZ3VtZW50IGZvciA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4gKCJ7MH0iIGluIHRoZSBmb3JtYXQgc3RyaW5nKQotIAkgKiBpcyB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gaW5wdXQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBjcmVhdGUgdGhlaXIgb3duIGxhYmVsLgotCSAqIDwvcD4KLSAJICoKLSAJICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IGVsZW1lbnQgZm9yIHdoaWNoIGEgbGFiZWwgbXVzdCBiZSByZXR1cm5lZAotIAkgKiBAcGFyYW0gaXRlbSBpZiBhIHBhdGggaGFzIGJlZW4gc3BlY2lmaWVkIGluIDxjb2RlPnNlbGVjdEVkaXRpb248L2NvZGU+IGEgc3ViIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHRhcmdldDsgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIHRhcmdldAotIAkgKiBAcmV0dXJuIGEgbGFiZWwgdGhlIHRhcmdldCBzaWRlIG9mIGEgY29tcGFyZSB2aWV3ZXIKLSAgCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0TGFiZWwoSVR5cGVkRWxlbWVudCB0YXJnZXQsIElUeXBlZEVsZW1lbnQgaXRlbSkgewotCQlTdHJpbmcgZm9ybWF0PSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgUmVzb3VyY2VOb2RlKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ3b3Jrc3BhY2VUYXJnZXRMYWJlbCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmb3JtYXQgPT0gbnVsbCkKLQkJCWZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAidGFyZ2V0TGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlmb3JtYXQ9ICJ4ezB9IjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgdGFyZ2V0LmdldE5hbWUoKSB9KTsKLQl9Ci0JCi0gCS8qKgotIAkgKiBSZXR1cm5zIGEgbGFiZWwgZm9yIGlkZW50aWZ5aW5nIHRoZSBlZGl0aW9uIHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlci4KLSAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBleHRyYWN0cyB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgImVkaXRpb25MYWJlbCIgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gCSAqIGFuZCBwYXNzZXMgaXQgYXMgdGhlIGZvcm1hdCBhcmd1bWVudCB0byA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4uCi0gCSAqIFRoZSBzaW5nbGUgZm9ybWF0IGFyZ3VtZW50IGZvciA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4gKCJ7MH0iIGluIHRoZSBmb3JtYXQgc3RyaW5nKQotIAkgKiBpcyB0aGUgZm9ybWF0dGVkIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBnaXZlbiBpbnB1dCBlbGVtZW50LgotIAkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBjcmVhdGUgdGhlaXIgb3duIGxhYmVsLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3RlZEVkaXRpb24gdGhlIHNlbGVjdGVkIGVkaXRpb24gZm9yIHdoaWNoIGEgbGFiZWwgbXVzdCBiZSByZXR1cm5lZAotIAkgKiBAcGFyYW0gaXRlbSBpZiBhIHBhdGggaGFzIGJlZW4gc3BlY2lmaWVkIGluIDxjb2RlPnNlbGVjdEVkaXRpb248L2NvZGU+IGEgc3ViIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNlbGVjdGVkRWRpdGlvbjsgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIHNlbGVjdGVkRWRpdGlvbgotIAkgKiBAcmV0dXJuIGEgbGFiZWwgZm9yIHRoZSBlZGl0aW9uIHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlcgotICAJICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0aW9uTGFiZWwoSVR5cGVkRWxlbWVudCBzZWxlY3RlZEVkaXRpb24sIElUeXBlZEVsZW1lbnQgaXRlbSkgewotCQlTdHJpbmcgZm9ybWF0PSBudWxsOwotCQlpZiAoc2VsZWN0ZWRFZGl0aW9uIGluc3RhbmNlb2YgUmVzb3VyY2VOb2RlKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ3b3Jrc3BhY2VFZGl0aW9uTGFiZWwiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChzZWxlY3RlZEVkaXRpb24gaW5zdGFuY2VvZiBIaXN0b3J5SXRlbSkKLQkJCWZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiaGlzdG9yeUVkaXRpb25MYWJlbCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCWlmIChmb3JtYXQgPT0gbnVsbCkKLQkJCWZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZWRpdGlvbkxhYmVsIik7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJZm9ybWF0PSAieHswfSI7CS8vJE5PTi1OTFMtMSQKLQkJCi0KLQkJU3RyaW5nIGRhdGU9ICIiOwkvLyROT04tTkxTLTEkCi0JCWlmIChzZWxlY3RlZEVkaXRpb24gaW5zdGFuY2VvZiBJTW9kaWZpY2F0aW9uRGF0ZSkgewotCQkJbG9uZyBtb2REYXRlPSAoKElNb2RpZmljYXRpb25EYXRlKXNlbGVjdGVkRWRpdGlvbikuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpOwotCQkJZGF0ZT0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKCkuZm9ybWF0KG5ldyBEYXRlKG1vZERhdGUpKTsKLQkJfQotCQkKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgZGF0ZSB9KTsKLQl9Ci0JCi0gCS8qKgotIAkgKiBSZXR1cm5zIGEgbGFiZWwgZm9yIGlkZW50aWZ5aW5nIGEgbm9kZSBpbiB0aGUgZWRpdGlvbiB0cmVlIHZpZXdlci4KLSAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBleHRyYWN0cyB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgIndvcmtzcGFjZVRyZWVGb3JtYXQiIG9yCi0gCSAqICJ0cmVlRm9ybWF0IiAoaW4gdGhhdCBvcmRlcikgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gCSAqIGFuZCBwYXNzZXMgaXQgYXMgdGhlIGZvcm1hdCBhcmd1bWVudCB0byA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4uCi0gCSAqIFRoZSBzaW5nbGUgZm9ybWF0IGFyZ3VtZW50IGZvciA8Y29kZT5NZXNzYWdlRm9ybWF0LmZvcm1hdDwvY29kZT4gKCJ7MH0iIGluIHRoZSBmb3JtYXQgc3RyaW5nKQotIAkgKiBpcyB0aGUgZm9ybWF0dGVkIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBnaXZlbiBpbnB1dCBlbGVtZW50LgotIAkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBjcmVhdGUgdGhlaXIgb3duIGxhYmVsLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlZGl0aW9uIHRoZSBlZGl0aW9uIGZvciB3aGljaCBhIGxhYmVsIG11c3QgYmUgcmV0dXJuZWQKLSAJICogQHBhcmFtIGl0ZW0gaWYgYSBwYXRoIGhhcyBiZWVuIHNwZWNpZmllZCBpbiA8Y29kZT5lZGl0aW9uPC9jb2RlPiBhIHN1YiBlbGVtZW50IG9mIHRoZSBnaXZlbiBlZGl0aW9uOyBvdGhlcndpc2UgdGhlIHNhbWUgYXMgZWRpdGlvbgotIAkgKiBAcGFyYW0gZGF0ZSB0aGlzIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nCi0gCSAqIEByZXR1cm4gYSBsYWJlbCBvZiBhIG5vZGUgaW4gdGhlIGVkaXRpb24gdHJlZSB2aWV3ZXIKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaG9ydEVkaXRpb25MYWJlbChJVHlwZWRFbGVtZW50IGVkaXRpb24sIElUeXBlZEVsZW1lbnQgaXRlbSwgRGF0ZSBkYXRlKSB7Ci0JCVN0cmluZyBmb3JtYXQ9IG51bGw7Ci0JCWlmIChlZGl0aW9uIGluc3RhbmNlb2YgUmVzb3VyY2VOb2RlKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ3b3Jrc3BhY2VUcmVlRm9ybWF0IiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0cmVlRm9ybWF0IiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJZm9ybWF0PSAieHswfSI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgZHM9IERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpOwotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyBkcyB9KTsKLQl9Ci0JCi0gCS8qKgotIAkgKiBSZXR1cm5zIGFuIGltYWdlIGZvciBpZGVudGlmeWluZyB0aGUgZWRpdGlvbiBzaWRlIG9mIGEgY29tcGFyZSB2aWV3ZXIuCi0gCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZXh0cmFjdHMgdGhlIHZhbHVlIGZvciB0aGUga2V5ICJlZGl0aW9uTGFiZWwiIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZQotIAkgKiBhbmQgcGFzc2VzIGl0IGFzIHRoZSBmb3JtYXQgYXJndW1lbnQgdG8gPGNvZGU+TWVzc2FnZUZvcm1hdC5mb3JtYXQ8L2NvZGU+LgotIAkgKiBUaGUgc2luZ2xlIGZvcm1hdCBhcmd1bWVudCBmb3IgPGNvZGU+TWVzc2FnZUZvcm1hdC5mb3JtYXQ8L2NvZGU+ICgiezB9IiBpbiB0aGUgZm9ybWF0IHN0cmluZykKLSAJICogaXMgdGhlIGZvcm1hdHRlZCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZ2l2ZW4gaW5wdXQgZWxlbWVudC4KLSAJICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gY3JlYXRlIHRoZWlyIG93biBsYWJlbC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gc2VsZWN0ZWRFZGl0aW9uIHRoZSBzZWxlY3RlZCBlZGl0aW9uIGZvciB3aGljaCBhIGxhYmVsIG11c3QgYmUgcmV0dXJuZWQKLSAJICogQHBhcmFtIGl0ZW0gaWYgYSBwYXRoIGhhcyBiZWVuIHNwZWNpZmllZCBpbiA8Y29kZT5zZWxlY3RFZGl0aW9uPC9jb2RlPiBhIHN1YiBlbGVtZW50IG9mIHRoZSBnaXZlbiBzZWxlY3RlZEVkaXRpb247IG90aGVyd2lzZSB0aGUgc2FtZSBhcyBzZWxlY3RlZEVkaXRpb24KLSAJICogQHJldHVybiBhIGxhYmVsIHRoZSBlZGl0aW9uIHNpZGUgb2YgYSBjb21wYXJlIHZpZXdlcgotICAJICogQHNpbmNlIDIuMAotIAkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RWRpdGlvbkltYWdlKElUeXBlZEVsZW1lbnQgc2VsZWN0ZWRFZGl0aW9uLCBJVHlwZWRFbGVtZW50IGl0ZW0pIHsKLQkJaWYgKHNlbGVjdGVkRWRpdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlTm9kZSkKLQkJCXJldHVybiBzZWxlY3RlZEVkaXRpb24uZ2V0SW1hZ2UoKTsKLQkJaWYgKHNlbGVjdGVkRWRpdGlvbiBpbnN0YW5jZW9mIEhpc3RvcnlJdGVtKSB7Ci0JCQlpZiAoZlRpbWVJbWFnZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGljb25OYW1lPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0aW1lSWNvbiIsICJvYmoxNi9yZXNvdXJjZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUltYWdlRGVzY3JpcHRvciBpZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihpY29uTmFtZSk7Ci0JCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJCWZUaW1lSW1hZ2U9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZlRpbWVJbWFnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gCS8qIChub24gSmF2YWRvYykKLSAJICogQ3JlYXRlcyBTV1QgY29udHJvbCB0cmVlLgotIAkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50MikgewotCQkKLQkJQ29tcG9zaXRlIHBhcmVudD0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQyKTsKLQotCQlnZXRTaGVsbCgpLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAidGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVNwbGl0dGVyIHZzcGxpdHRlcj0gbmV3IFNwbGl0dGVyKHBhcmVudCwgIFNXVC5WRVJUSUNBTCk7Ci0JCXZzcGxpdHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCi0JCXZzcGxpdHRlci5hZGREaXNwb3NlTGlzdGVuZXIoCi0JCQluZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLmRpc3Bvc2UoKTsKLQkJCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoZkRhdGVJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQlmRGF0ZUltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCWZEYXRlSW1hZ2U9IG51bGw7Ci0JCQkJCX0KLQkJCQkJaWYgKGZUaW1lSW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJZlRpbWVJbWFnZS5kaXNwb3NlKCk7CQkJCQkJCi0JCQkJCQlmVGltZUltYWdlPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJaWYgKGZBZGRNb2RlKSB7Ci0JCQkvLyB3ZSBuZWVkIHR3byBwYW5lczogdGhlIGxlZnQgZm9yIHRoZSBlbGVtZW50cywgdGhlIHJpZ2h0IG9uZSBmb3IgdGhlIGVkaXRpb25zCi0JCQlTcGxpdHRlciBoc3BsaXR0ZXI9IG5ldyBTcGxpdHRlcih2c3BsaXR0ZXIsICBTV1QuSE9SSVpPTlRBTCk7Ci0JCQkKLQkJCWZNZW1iZXJQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclBhbmUoaHNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCQkJZk1lbWJlclBhbmUuc2V0VGV4dChVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJtZW1iZXJQYW5lVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaW50IGZsYWdzPSBTV1QuSF9TQ1JPTEwgKyBTV1QuVl9TQ1JPTEw7Ci0JCQlpZiAoZk11bHRpU2VsZWN0KQotCQkJCWZsYWdzfD0gU1dULkNIRUNLOwotCQkJZk1lbWJlclRhYmxlPSBuZXcgVGFibGUoZk1lbWJlclBhbmUsIGZsYWdzKTsKLQkJCWZNZW1iZXJUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5DSEVDSykgewotCQkJCQkJCWlmIChlLml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJCQkJVGFibGVJdGVtIHRpPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0JCQkJCQkJCU9iamVjdCBkYXRhPSB0aS5nZXREYXRhKCk7Ci0JCQkJCQkJCWlmICh0aS5nZXRDaGVja2VkKCkpCi0JCQkJCQkJCQlmQXJyYXlMaXN0LmFkZChkYXRhKTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJZkFycmF5TGlzdC5yZW1vdmUoZGF0YSk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJaWYgKGZDb21taXRCdXR0b24gIT0gbnVsbCkKLQkJCQkJCQkJCWZDb21taXRCdXR0b24uc2V0RW5hYmxlZChmQXJyYXlMaXN0LnNpemUoKSA+IDApOwotCQkJCQkJCQkJCi0JCQkJCQkJCWZNZW1iZXJUYWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHsgdGkgfSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaGFuZGxlTWVtYmVyU2VsZWN0KGUuaXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkJZk1lbWJlclBhbmUuc2V0Q29udGVudChmTWVtYmVyVGFibGUpOwotCQkJZk1lbWJlclRhYmxlLnNldEZvY3VzKCk7Ci0JCQkJCQkKLQkJCWZFZGl0aW9uUGFuZT0gbmV3IENvbXBhcmVWaWV3ZXJQYW5lKGhzcGxpdHRlciwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmU3RydWN0dXJlQ29tcGFyZSkgewotCQkJCS8vIHdlIG5lZWQgdHdvIHBhbmVzOiB0aGUgbGVmdCBmb3IgdGhlIGVsZW1lbnRzLCB0aGUgcmlnaHQgb25lIGZvciB0aGUgc3RydWN0dXJlZCBkaWZmCi0JCQkJU3BsaXR0ZXIgaHNwbGl0dGVyPSBuZXcgU3BsaXR0ZXIodnNwbGl0dGVyLCAgU1dULkhPUklaT05UQUwpOwotCQkJCQotCQkJCWZFZGl0aW9uUGFuZT0gbmV3IENvbXBhcmVWaWV3ZXJQYW5lKGhzcGxpdHRlciwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQkJCQlmU3RydWN0dXJlZENvbXBhcmVQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUoaHNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQsIHRydWUpIHsKLQkJCQkJcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoVmlld2VyIG9sZFZpZXdlciwgT2JqZWN0IGlucHV0KSB7Ci0JCQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCQkJCXJldHVybiBDb21wYXJlVUkuZmluZFN0cnVjdHVyZVZpZXdlcihvbGRWaWV3ZXIsIChJQ29tcGFyZUlucHV0KWlucHV0LCB0aGlzLCBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmU3RydWN0dXJlZENvbXBhcmVQYW5lLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJCQkJZmVlZElucHV0MihlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG9ubHkgYSBzaW5nbGUgcGFuZSBzaG93aW5nIHRoZSBlZGl0aW9ucwotCQkJCWZFZGl0aW9uUGFuZT0gbmV3IENvbXBhcmVWaWV3ZXJQYW5lKHZzcGxpdHRlciwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQkJCX0KLQkJCWlmIChmVGl0bGVBcmcgPT0gbnVsbCkKLQkJCQlmVGl0bGVBcmc9IGZUYXJnZXRQYWlyLmdldEl0ZW0oKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdGl0bGVGb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRyZWVUaXRsZUZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdGl0bGU9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRpdGxlRm9ybWF0LCBuZXcgU3RyaW5nW10geyBmVGl0bGVBcmcgfSk7Ci0JCQlmRWRpdGlvblBhbmUuc2V0VGV4dCh0aXRsZSk7Ci0JCQlpZiAoZlRpdGxlSW1hZ2UgIT0gbnVsbCkKLQkJCQlmRWRpdGlvblBhbmUuc2V0SW1hZ2UoZlRpdGxlSW1hZ2UpOwotCQl9Ci0JCQotCQlmRWRpdGlvblRyZWU9IG5ldyBUcmVlKGZFZGl0aW9uUGFuZSwgU1dULkhfU0NST0xMICsgU1dULlZfU0NST0xMKTsKLQkJZkVkaXRpb25UcmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotLy8JCQkJCWhhbmRsZURlZmF1bHRTZWxlY3RlZCgpOwotLy8JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZmVlZElucHV0KGUuaXRlbSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmRWRpdGlvblBhbmUuc2V0Q29udGVudChmRWRpdGlvblRyZWUpOwkJCi0JCQotCQkvLyBub3cgc3RhcnQgdGhlIHRocmVhZCAoYW5kIGZvcmdldCBhYm91dCBpdCkKLQkJaWYgKGZUaHJlYWQgIT0gbnVsbCkgewotCQkJZlRocmVhZC5zdGFydCgpOwotCQkJZlRocmVhZD0gbnVsbDsKLQkJfQotCQkKLQkJZkNvbnRlbnRQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUodnNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpIHsKLQkJCXByb3RlY3RlZCBWaWV3ZXIgZ2V0Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIE9iamVjdCBpbnB1dCkgewotCQkJCXJldHVybiBDb21wYXJlVUkuZmluZENvbnRlbnRWaWV3ZXIob2xkVmlld2VyLCBpbnB1dCwgdGhpcywgZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKSk7CQotCQkJfQotCQl9OwotCQl2c3BsaXR0ZXIuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAzMCwgNzAgfSk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7CQkJCQotCQlyZXR1cm4gcGFyZW50OwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBidXR0b25MYWJlbD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiYnV0dG9uTGFiZWwiLCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZkNvbXBhcmVNb2RlKSB7Ci0JCQkvLyBvbmx5IGEgJ0RvbmUnIGJ1dHRvbgotCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIGJ1dHRvbkxhYmVsLCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhICdDYW5jZWwnIGFuZCBhICdBZGQvUmVwbGFjZScgYnV0dG9uCi0JCQlmQ29tbWl0QnV0dG9uPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBidXR0b25MYWJlbCwgdHJ1ZSk7Ci0JCQlmQ29tbWl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVyaWRkZW4gdG8gZGlzYWJsZSBkaXNtaXNzIG9uIGRvdWJsZSBjbGljayBpbiBjb21wYXJlIG1vZGUuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJaWYgKGZDb21wYXJlTW9kZSkgewotCQkJLy8gZG9uJ3QgZGlzbWlzcyBkaWFsb2cKLQkJfSBlbHNlCi0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvLy0tLS0gcHJpdmF0ZSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJCi0JLyoKLQkgKiBBc3luY2hyb25lb3VzbHkgc2VuZHMgYSBQYWlyIChvciBudWxsKSB0byB0aGUgVUkgdGhyZWFkLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZW5kUGFpcihmaW5hbCBQYWlyIHBhaXIpIHsJCQotCQlpZiAoZkVkaXRpb25UcmVlICE9IG51bGwgJiYgIWZFZGl0aW9uVHJlZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCURpc3BsYXkgZGlzcGxheT0gZkVkaXRpb25UcmVlLmdldERpc3BsYXkoKTsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJYWRkTWVtYmVyRWRpdGlvbihwYWlyKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnRlcm5hbFNvcnQoSU1vZGlmaWNhdGlvbkRhdGVbXSBrZXlzKSB7IAotCQlBcnJheXMuc29ydChrZXlzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCUlNb2RpZmljYXRpb25EYXRlIGQxPSAoSU1vZGlmaWNhdGlvbkRhdGUpIG8xOwotCQkJCUlNb2RpZmljYXRpb25EYXRlIGQyPSAoSU1vZGlmaWNhdGlvbkRhdGUpIG8yOwotCQkJCWxvbmcgZD0gZDIuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpIC0gZDEuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpOwotCQkJCWlmIChkIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWlmIChkID4gMCkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKgotCSAqIEFkZHMgdGhlIGdpdmVuIFBhaXIgdG8gdGhlIG1lbWJlciBlZGl0aW9ucy4KLQkgKiBJZiBISURFX0lERU5USUNBTCBpcyB0cnVlIHRoZSBuZXcgUGFpciBpcyBvbmx5IGFkZGVkIGlmIGl0cyBjb250ZW50cwotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwcmVjZWVkaW5nIFBhaXIuCi0JICogSWYgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBtZXNzYWdlICJObyBFZGl0aW9ucyBmb3VuZCIgaXMgc2hvd24KLQkgKiBpbiB0aGUgbWVtYmVyIG9yIGVkaXRpb24gdmlld2VyLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRNZW1iZXJFZGl0aW9uKFBhaXIgcGFpcikgewotCQkKLQkJaWYgKHBhaXIgPT0gbnVsbCkgewkvLyBlbmQgb2YgbGlzdCBvZiBwYWlycwotCQkJaWYgKGZNZW1iZXJUYWJsZSAhPSBudWxsKSB7CQotCQkJCWlmICghZk1lbWJlclRhYmxlLmlzRGlzcG9zZWQoKSAmJiBmTWVtYmVyVGFibGUuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCQlpZiAoZk11bHRpU2VsZWN0KSB7Ci0JCQkJCQlmTWVtYmVyVGFibGUuZGlzcG9zZSgpOwotCQkJCQkJZk1lbWJlclRhYmxlPSBuZXcgVGFibGUoZk1lbWJlclBhbmUsIFNXVC5OT05FKTsKLQkJCQkJCWZNZW1iZXJQYW5lLnNldENvbnRlbnQoZk1lbWJlclRhYmxlKTsKLQkJCQkJfQotCQkJCQlUYWJsZUl0ZW0gdGk9IG5ldyBUYWJsZUl0ZW0oZk1lbWJlclRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCXRpLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAibm9BZGRpdGlvbmFsTWVtYmVyc01lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGZFZGl0aW9uVHJlZSAhPSBudWxsICYmICFmRWRpdGlvblRyZWUuaXNEaXNwb3NlZCgpICYmIGZFZGl0aW9uVHJlZS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJVHJlZUl0ZW0gdGk9IG5ldyBUcmVlSXRlbShmRWRpdGlvblRyZWUsIFNXVC5OT05FKTsKLQkJCQl0aS5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgIm5vdEZvdW5kSW5Mb2NhbEhpc3RvcnlNZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChmTWVtYmVyRWRpdGlvbnMgPT0gbnVsbCkKLQkJCWZNZW1iZXJFZGl0aW9ucz0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKGZNdWx0aVNlbGVjdCAmJiBmTWVtYmVyU2VsZWN0aW9uID09IG51bGwpCi0JCQlmTWVtYmVyU2VsZWN0aW9uPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJSVR5cGVkRWxlbWVudCBpdGVtPSBwYWlyLmdldEl0ZW0oKTsKLQkJTGlzdCBlZGl0aW9ucz0gKExpc3QpIGZNZW1iZXJFZGl0aW9ucy5nZXQoaXRlbSk7Ci0JCWlmIChlZGl0aW9ucyA9PSBudWxsKSB7Ci0JCQllZGl0aW9ucz0gbmV3IEFycmF5TGlzdCgpOwotCQkJZk1lbWJlckVkaXRpb25zLnB1dChpdGVtLCBlZGl0aW9ucyk7Ci0JCQlpZiAoZk1lbWJlclRhYmxlICE9IG51bGwgJiYgIWZNZW1iZXJUYWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlJVHlwZWRFbGVtZW50IHRlPSBpdGVtOwotCQkJCVN0cmluZyBuYW1lPSB0ZS5nZXROYW1lKCk7Ci0JCQkJCi0JCQkJLy8gZmluZCBwb3NpdGlvbgotCQkJCVRhYmxlSXRlbVtdIGl0ZW1zPSBmTWVtYmVyVGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlpbnQgd2hlcmU9IGl0ZW1zLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgd2hlcmU7IGkrKykgewotCQkJCQlTdHJpbmcgbj0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCQlpZiAobi5jb21wYXJlVG8obmFtZSkgPiAwKSB7Ci0JCQkJCQl3aGVyZT0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVRhYmxlSXRlbSB0aT0gbmV3IFRhYmxlSXRlbShmTWVtYmVyVGFibGUsIHdoZXJlLCBTV1QuTlVMTCk7Ci0JCQkJdGkuc2V0SW1hZ2UodGUuZ2V0SW1hZ2UoKSk7Ci0JCQkJdGkuc2V0VGV4dChuYW1lKTsKLQkJCQl0aS5zZXREYXRhKGVkaXRpb25zKTsKLQkJCX0KLQkJfQotCQlpZiAoZkhpZGVJZGVudGljYWwpIHsKLQkJCVBhaXIgbGFzdD0gZlRhcmdldFBhaXI7Ci0JCQlpbnQgc2l6ZT0gZWRpdGlvbnMuc2l6ZSgpOwotCQkJaWYgKHNpemUgPiAwKQotCQkJCWxhc3Q9IChQYWlyKSBlZGl0aW9ucy5nZXQoc2l6ZS0xKTsKLQkJCWlmIChsYXN0ICE9IG51bGwgJiYgbGFzdC5lcXVhbHMocGFpcikpCi0JCQkJcmV0dXJuOwkvLyBkb24ndCBhZGQgc2luY2UgdGhlIG5ldyBvbmUgaXMgZXF1YWwgdG8gb2xkCi0JCX0KLQkJZWRpdGlvbnMuYWRkKHBhaXIpOwotCQkKLQkJaWYgKCFmQWRkTW9kZSB8fCBlZGl0aW9ucyA9PSBmQ3VycmVudEVkaXRpb25zKQotCQkJYWRkRWRpdGlvbihwYWlyKTsKLQl9Ci0JCQotCS8qCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHMgc2luY2UgSmFuIDFzdCwgMTk3MC4KLQkgKiBUaGUgZ2l2ZW4gZGF0ZSBpcyBjb252ZXJ0ZWQgdG8gR01UIGFuZCBkYXlsaWdodCBzYXZpbmcgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvby4KLQkgKi8KLQlwcml2YXRlIGxvbmcgZGF5TnVtYmVyKGxvbmcgZGF0ZSkgewotCQlpbnQgT05FX0RBWV9NUz0gMjQqNjAqNjAgKiAxMDAwOyAvLyBvbmUgZGF5IGluIG1pbGxpIHNlY29uZHMKLQkJCi0JCUNhbGVuZGFyIGNhbGVuZGFyPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQlsb25nIGxvY2FsVGltZU9mZnNldD0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKLQkJCi0JCXJldHVybiAoZGF0ZSArIGxvY2FsVGltZU9mZnNldCkgLyBPTkVfREFZX01TOwotCX0KLQkKLQkvKgotCSAqIEFkZHMgdGhlIGdpdmVuIFBhaXIgdG8gdGhlIGVkaXRpb24gdHJlZS4KLQkgKiBJdCB0YWtlcyBjYXJlIG9mIGNyZWF0aW5nIHRyZWUgbm9kZXMgZm9yIGRpZmZlcmVudCBkYXRlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRWRpdGlvbihQYWlyIHBhaXIpIHsKLQkJaWYgKGZFZGl0aW9uVHJlZSA9PSBudWxsIHx8IGZFZGl0aW9uVHJlZS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBmaW5kIGxhc3QgZGF5Ci0JCVRyZWVJdGVtW10gZGF5cz0gZkVkaXRpb25UcmVlLmdldEl0ZW1zKCk7Ci0JCVRyZWVJdGVtIGxhc3REYXk9IG51bGw7Ci0JCWlmIChkYXlzLmxlbmd0aCA+IDApCi0JCQlsYXN0RGF5PSBkYXlzW2RheXMubGVuZ3RoLTFdOwotCQkKLQkJYm9vbGVhbiBmaXJzdD0gbGFzdERheSA9PSBudWxsOwotCQkKLQkJSVR5cGVkRWxlbWVudCBlZGl0aW9uPSBwYWlyLmdldEVkaXRpb24oKTsKLQkJSVR5cGVkRWxlbWVudCBpdGVtPSBwYWlyLmdldEl0ZW0oKTsKLQkJCi0JCWxvbmcgbGRhdGU9ICgoSU1vZGlmaWNhdGlvbkRhdGUpZWRpdGlvbikuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpOwkJCi0JCWxvbmcgZGF5PSBkYXlOdW1iZXIobGRhdGUpOwotCQlEYXRlIGRhdGU9IG5ldyBEYXRlKGxkYXRlKTsKLQkJaWYgKGxhc3REYXkgPT0gbnVsbCB8fCBkYXkgIT0gZGF5TnVtYmVyKCgoRGF0ZSlsYXN0RGF5LmdldERhdGEoKSkuZ2V0VGltZSgpKSkgewotCQkJbGFzdERheT0gbmV3IFRyZWVJdGVtKGZFZGl0aW9uVHJlZSwgU1dULk5PTkUpOwotCQkJaWYgKGZEYXRlSW1hZ2UgPT0gbnVsbCkgewotCQkJCVN0cmluZyBpY29uTmFtZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZGF0ZUljb24iLCAib2JqMTYvZGF5X29iai5naWYiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGljb25OYW1lKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQkJZkRhdGVJbWFnZT0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJCX0KLQkJCWxhc3REYXkuc2V0SW1hZ2UoZkRhdGVJbWFnZSk7Ci0JCQlTdHJpbmcgZGY9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpOwotCQkJbG9uZyB0b2RheT0gZGF5TnVtYmVyKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQotCQkJU3RyaW5nIGZvcm1hdEtleTsKLQkJCWlmIChkYXkgPT0gdG9kYXkpCi0JCQkJZm9ybWF0S2V5PSAidG9kYXlGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChkYXkgPT0gdG9kYXktMSkKLQkJCQlmb3JtYXRLZXk9ICJ5ZXN0ZXJkYXlGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJZm9ybWF0S2V5PSAiZGF5Rm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBhdHRlcm49IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgZm9ybWF0S2V5KTsKLQkJCWlmIChwYXR0ZXJuICE9IG51bGwpCi0JCQkJZGY9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIG5ldyBTdHJpbmdbXSB7IGRmIH0pOwotCQkJbGFzdERheS5zZXRUZXh0KGRmKTsKLQkJCWxhc3REYXkuc2V0RGF0YShkYXRlKTsKLQkJfQotCQlUcmVlSXRlbSB0aT0gbmV3IFRyZWVJdGVtKGxhc3REYXksIFNXVC5OT05FKTsKLQkJdGkuc2V0SW1hZ2UoZ2V0RWRpdGlvbkltYWdlKGVkaXRpb24sIGl0ZW0pKTsKLQkJCi0JCVN0cmluZyBzPSBnZXRTaG9ydEVkaXRpb25MYWJlbChlZGl0aW9uLCBpdGVtLCBkYXRlKTsKLQkJaWYgKHBhaXIuZkhhc0Vycm9yKSB7Ci0JCQlTdHJpbmcgcGF0dGVybj0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAicGFyc2VFcnJvckZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCQlzPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBuZXcgU3RyaW5nW10geyBzIH0gKTsKLQkJfQotCQl0aS5zZXRUZXh0KHMpOwotCQkKLQkJdGkuc2V0RGF0YShwYWlyKTsKLQkJCi0JCS8vIGRldGVybWluZSBzZWxlY3RlZCBUcmVlSXRlbQotCQlUcmVlSXRlbSBzZWxlY3Rpb249IGZpcnN0ID8gdGkgOiBudWxsOwotCQlpZiAoZk1lbWJlclNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWQ9IGZNZW1iZXJTZWxlY3Rpb24uZ2V0KGZDdXJyZW50RWRpdGlvbnMpOwotCQkJaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCQlpZiAoc2VsZWN0ZWQgPT0gcGFpci5nZXRJdGVtKCkpCi0JCQkJCXNlbGVjdGlvbj0gdGk7Ci0JCQkJZWxzZQotCQkJCQlzZWxlY3Rpb249IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlmRWRpdGlvblRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgc2VsZWN0aW9uIH0pOwotCQkJaWYgKCFmQWRkTW9kZSkKLQkJCQlmRWRpdGlvblRyZWUuc2V0Rm9jdXMoKTsKLQkJCWZlZWRJbnB1dChzZWxlY3Rpb24pOwotCQl9Ci0JCQotCQlpZiAoZmlyc3QpIC8vIGV4cGFuZCBmaXJzdCBub2RlCi0JCQlsYXN0RGF5LnNldEV4cGFuZGVkKHRydWUpOwotCX0KLQkJCQkJCQotCS8qCi0JICogRmVlZHMgc2VsZWN0aW9uIGZyb20gbWVtYmVyIHZpZXdlciB0byBlZGl0aW9uIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlTWVtYmVyU2VsZWN0KFdpZGdldCB3KSB7Ci0JCU9iamVjdCBkYXRhPSB3LmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGVkaXRpb25zPSAoTGlzdCkgZGF0YTsKLQkJCWlmIChlZGl0aW9ucyAhPSBmQ3VycmVudEVkaXRpb25zKSB7Ci0JCQkJZkN1cnJlbnRFZGl0aW9ucz0gZWRpdGlvbnM7Ci0JCQkJZkVkaXRpb25UcmVlLnJlbW92ZUFsbCgpOwotCQkJCQotCQkJCVN0cmluZyBwYXR0ZXJuPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0cmVlVGl0bGVGb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aXRsZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgbmV3IE9iamVjdFtdIHsgKChJdGVtKXcpLmdldFRleHQoKSB9KTsKLQkJCQlmRWRpdGlvblBhbmUuc2V0VGV4dCh0aXRsZSk7Ci0JCQkJCQkJCQotCQkJCUl0ZXJhdG9yIGl0ZXI9IGVkaXRpb25zLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBpdGVtPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQYWlyKQotCQkJCQkJYWRkRWRpdGlvbigoUGFpcikgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKCFmQ29tcGFyZSAmJiBpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCUlDb21wYXJlSW5wdXQgY2k9IChJQ29tcGFyZUlucHV0KSBpbnB1dDsKLQkJCWlmIChmVGFyZ2V0SXNSaWdodCkKLQkJCQlpbnB1dD0gY2kuZ2V0TGVmdCgpOwotCQkJZWxzZQotCQkJCWlucHV0PSBjaS5nZXRSaWdodCgpOwotCQl9Ci0JCWZDb250ZW50UGFuZS5zZXRJbnB1dChpbnB1dCk7Ci0JCWlmIChmU3RydWN0dXJlZENvbXBhcmVQYW5lICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZENvbXBhcmVQYW5lLnNldElucHV0KGlucHV0KTsKLQl9Ci0JCi0JLyoKLQkgKiBGZWVkcyBzZWxlY3Rpb24gZnJvbSBlZGl0aW9uIHZpZXdlciB0byBjb250ZW50IChhbmQgc3RydWN0dXJlKSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZlZWRJbnB1dChXaWRnZXQgdykgewotCQlPYmplY3QgaW5wdXQ9IHcuZ2V0RGF0YSgpOwotCQlib29sZWFuIGlzT0s9IGZhbHNlOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYWlyKSB7Ci0JCQlQYWlyIHBhaXI9IChQYWlyKSBpbnB1dDsKLQkJCWZTZWxlY3RlZEl0ZW09IHBhaXIuZ2V0SXRlbSgpOwotCQkJaXNPSz0gIXBhaXIuZkhhc0Vycm9yOwotCQkJCi0JCQlJVHlwZWRFbGVtZW50IGVkaXRpb249IHBhaXIuZ2V0RWRpdGlvbigpOwotCQkJU3RyaW5nIGVkaXRpb25MYWJlbD0gZ2V0RWRpdGlvbkxhYmVsKGVkaXRpb24sIGZTZWxlY3RlZEl0ZW0pOwotCQkJSW1hZ2UgZWRpdGlvbkltYWdlPSBnZXRFZGl0aW9uSW1hZ2UoZWRpdGlvbiwgZlNlbGVjdGVkSXRlbSk7Ci0JCQkJCQotCQkJaWYgKGZBZGRNb2RlKSB7Ci0JCQkJaWYgKGZNZW1iZXJTZWxlY3Rpb24gIT0gbnVsbCkKLQkJCQkJZk1lbWJlclNlbGVjdGlvbi5wdXQoZkN1cnJlbnRFZGl0aW9ucywgZlNlbGVjdGVkSXRlbSk7Ci0JCQkJc2V0SW5wdXQoZlNlbGVjdGVkSXRlbSk7Ci0JCQkJZkNvbnRlbnRQYW5lLnNldFRleHQoZWRpdGlvbkxhYmVsKTsKLQkJCQlmQ29udGVudFBhbmUuc2V0SW1hZ2UoZWRpdGlvbkltYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoZlRhcmdldElzUmlnaHQpIHsKLQkJCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldExlZnRMYWJlbChlZGl0aW9uTGFiZWwpOwotCQkJCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0TGVmdEltYWdlKGVkaXRpb25JbWFnZSk7Ci0JCQkJCXNldElucHV0KG5ldyBEaWZmTm9kZShmU2VsZWN0ZWRJdGVtLCBmVGFyZ2V0UGFpci5nZXRJdGVtKCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UmlnaHRMYWJlbChlZGl0aW9uTGFiZWwpOwotCQkJCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UmlnaHRJbWFnZShlZGl0aW9uSW1hZ2UpOwotCQkJCQlzZXRJbnB1dChuZXcgRGlmZk5vZGUoZlRhcmdldFBhaXIuZ2V0SXRlbSgpLCBmU2VsZWN0ZWRJdGVtKSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZlNlbGVjdGVkSXRlbT0gbnVsbDsKLQkJCXNldElucHV0KG51bGwpOwotCQl9Ci0JCWlmIChmQ29tbWl0QnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChmTXVsdGlTZWxlY3QpCi0JCQkJZkNvbW1pdEJ1dHRvbi5zZXRFbmFibGVkKGlzT0sgJiYgZlNlbGVjdGVkSXRlbSAhPSBudWxsICYmIGZBcnJheUxpc3Quc2l6ZSgpID4gMCk7Ci0JCQllbHNlCi0JCQkJZkNvbW1pdEJ1dHRvbi5zZXRFbmFibGVkKGlzT0sgJiYgZlNlbGVjdGVkSXRlbSAhPSBudWxsICYmIGZUYXJnZXRQYWlyLmdldEl0ZW0oKSAhPSBmU2VsZWN0ZWRJdGVtKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEZlZWRzIHNlbGVjdGlvbiBmcm9tIHN0cnVjdHVyZSB2aWV3ZXIgdG8gY29udGVudCB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZlZWRJbnB1dDIoSVNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7Ci0JCQlpZiAoc3Muc2l6ZSgpID09IDEpCi0JCQkJZkNvbnRlbnRQYW5lLnNldElucHV0KHNzLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0hpc3RvcnlJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9IaXN0b3J5SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDNhY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0hpc3RvcnlJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSVJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUVuY29kZWRTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQSBjb21iaW5hdGlvbiA8Y29kZT5JRmlsZVN0YXRlPC9jb2RlPiBhbmQgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4gdGhhdCBjYW4gYmUgdXNlZCBhcwotICogYW4gaW5wdXQgdG8gYSBjb21wYXJlIHZpZXdlciBvciBvdGhlciBwbGFjZXMgd2hlcmUgYW4gPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4KLSAqIGlzIG5lZWRlZC4KLSAqIDxwPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEhpc3RvcnlJdGVtIGltcGxlbWVudHMgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IsIElUeXBlZEVsZW1lbnQsIElNb2RpZmljYXRpb25EYXRlLCBJUmVzb3VyY2VQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZCYXNlOwotCXByaXZhdGUgSUZpbGVTdGF0ZSBmRmlsZVN0YXRlOyAKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5IaXN0b3J5SXRlbTwvY29kZT4gb2JqZWN0IHdoaWNoIGNvbWJpbmVzIHRoZSBnaXZlbiA8Y29kZT5JRmlsZVN0YXRlPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPiBpbnRvIGFuIG9iamVjdAotCSAqIHdoaWNoIGlzIHN1aXRhYmxlIGFzIGlucHV0IGZvciBhIGNvbXBhcmUgdmlld2VyIG9yIDxjb2RlPlJlcGxhY2VXaXRoRWRpdGlvbkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYmFzZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+IGludGVyZmFjZSBkZWxlZ2F0ZXMgdG8gdGhpcyBiYXNlIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+Ci0JICogQHBhcmFtIGZpbGVTdGF0ZSB0aGUgPGNvZGU+SUZpbGVTdGF0ZTwvY29kZT4gZnJvbSB3aGljaCB0aGUgc3RyZWFtYWJsZSBjb250ZW50cyBhbmQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIGRlcml2ZWQgZnJvbQotCSAqLwotCXB1YmxpYyBIaXN0b3J5SXRlbShJVHlwZWRFbGVtZW50IGJhc2UsIElGaWxlU3RhdGUgZmlsZVN0YXRlKSB7Ci0JCWZCYXNlPSBiYXNlOwotCQlmRmlsZVN0YXRlPSBmaWxlU3RhdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXROYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkJhc2UuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogc2VlIElUeXBlZEVsZW1lbnQuZ2V0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBmQmFzZS5nZXRJbWFnZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogc2VlIElUeXBlZEVsZW1lbnQuZ2V0VHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZCYXNlLmdldFR5cGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogc2VlIElNb2RpZmljYXRpb25EYXRlLmdldE1vZGlmaWNhdGlvbkRhdGUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25EYXRlKCkgewotCQlyZXR1cm4gZkZpbGVTdGF0ZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBzZWUgSVN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5nZXRDb250ZW50cwotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZGaWxlU3RhdGUuZ2V0Q29udGVudHMoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5JRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciNnZXRDaGFyc2V0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIFN0cmluZyBjaGFyc2V0PSBmRmlsZVN0YXRlLmdldENoYXJzZXQoKTsgCi0JICAgIGlmIChjaGFyc2V0ID09IG51bGwpIHsKLQkJICAgIElSZXNvdXJjZSByZXNvdXJjZT0gZ2V0UmVzb3VyY2UoKTsKLQkJICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElFbmNvZGVkU3RvcmFnZSkKLQkJICAgIAljaGFyc2V0PSAoKElFbmNvZGVkU3RvcmFnZSlyZXNvdXJjZSkuZ2V0Q2hhcnNldCgpOwotCSAgICB9Ci0JCXJldHVybiBjaGFyc2V0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSVJlc291cmNlUHJvdmlkZXIjZ2V0UmVzb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JICAgIElQYXRoIGZ1bGxQYXRoPSBmRmlsZVN0YXRlLmdldEZ1bGxQYXRoKCk7Ci0JICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZnVsbFBhdGgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUNvbXBhcmVOYXZpZ2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb21wYXJlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTljMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUNvbXBhcmVOYXZpZ2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi0vKioKLSAqIEEgPGNvZGU+SUNvbXBhcmVOYXZpZ2F0b3I8L2NvZGU+IGlzIHVzZWQgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbAotICogZGlmZmVyZW5jZXMgb2YgYSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+LgotICogPHA+Ci0gKiBQbGVhc2Ugbm90ZTogdGhlIGZvbGxvd2luZyBtaWdodCBjaGFuZ2UgYmVmb3JlIHRoZSBmaW5hbCByZWxlYXNlIG9mIEVjbGlwc2UgMy4wLgotICogWW91IGNhbiByZXRyaWV2ZSBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSA8Y29kZT5JQ29tcGFyZU5hdmlnYXRvcjwvY29kZT4gZnJvbSBhCi0gKiA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+IGJ5IGNhbGxpbmcgPGNvZGU+Z2V0QWRhcHRlcihJQ29tcGFyZU5hdmlnYXRvcik8L2NvZGU+Ci0gKiBvbiB0aGUgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0PC9jb2RlPi4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tcGFyZU5hdmlnYXRvciB7Ci0JCi0JLyoqCi0JICogU3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCBzZWxlY3Rpb24gPGNvZGU+c2VsZWN0Q2hhbmdlPC9jb2RlPiBzZWxlY3RzIGFuZCByZXZlYWxzIHRoZSBuZXh0IChwcmV2aW91cykgY2hhbmdlLgotCSAqIElmIHRoZSBlbmQgKG9yIGJlZ2lubmluZykgaXMgcmVhY2hlZCwgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBuZXh0IGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBuZXh0IGNoYW5nZSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIHRoZSBwcmV2aW91cyBjaGFuZ2UKLQkgKiBAcmV0dXJuIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5kIChiZWdpbm5pbmcpIGlzIHJlYWNoZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RDaGFuZ2UoYm9vbGVhbiBuZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyNjBmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotLyoqCi0gKiBBbiA8Y29kZT5JQ29udGVudENoYW5nZUxpc3RlbmVyPC9jb2RlPiBpcyBpbmZvcm1lZCBhYm91dCBjb250ZW50IGNoYW5nZXMgb2YgYSAKLSAqIDxjb2RlPklDb250ZW50Q2hhbmdlTm90aWZpZXI8L2NvZGU+LgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBJQ29udGVudENoYW5nZU5vdGlmaWVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHNvdXJjZSBoYXMgY2hhbmdlZC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB3aG9zZSBjb250ZW50cyBoYXMgY2hhbmdlZAotCSAqLwotCXZvaWQgY29udGVudENoYW5nZWQoSUNvbnRlbnRDaGFuZ2VOb3RpZmllciBzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUNvbnRlbnRDaGFuZ2VOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUNvbnRlbnRDaGFuZ2VOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY2ODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lDb250ZW50Q2hhbmdlTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi0vKioKLSAqIEludGVyZmFjZSBjb21tb24gdG8gYWxsIG9iamVjdHMgdGhhdCBwcm92aWRlIGEgbWVhbnMgZm9yIHJlZ2lzdGVyaW5nCi0gKiBmb3IgY29udGVudCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBJQ29udGVudENoYW5nZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRDaGFuZ2VOb3RpZmllciB7Ci0JCi0JLyoqCi0JICogQWRkcyBhIGNvbnRlbnQgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgbm90aWZpZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgY29udGVudCBjaGFuZ2VkIGxpc3RlbmVyCi0JICovCi0Jdm9pZCBhZGRDb250ZW50Q2hhbmdlTGlzdGVuZXIoSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29udGVudCBjaGFuZ2VkIGxpc3RlbmVyIGZyb20gdGhpcyBub3RpZmllci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGNvbnRlbnQgY2hhbmdlZCBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29udGVudENoYW5nZUxpc3RlbmVyKElDb250ZW50Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVkaXRhYmxlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVkaXRhYmxlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzZDhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lFZGl0YWJsZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgd2l0aCBlZGl0YWJsZSBjb250ZW50cy4KLSAqIFR5cGljYWxseSBpdCBpcyBpbXBsZW1lbnRlZCBieSBvYmplY3RzIHRoYXQgYWxzbyBpbXBsZW1lbnQKLSAqIHRoZSA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IGltcGxlbWVudGluZyA8Y29kZT5JRWRpdGFibGVDb250ZW50PC9jb2RlPiBkb2VzIG5vdAotICogYXV0b21hdGljYWxseSBtZWFuIHRoYXQgaXQgaXMgZWRpdGFibGUuIEFuIG9iamVjdCBpcyBvbmx5IGVkaXRhYmxlIGlmCi0gKiBpdCBpbXBsZW1lbnRzIDxjb2RlPklFZGl0YWJsZUNvbnRlbnQ8L2NvZGU+IGFuZCB0aGUgPGNvZGU+aXNFZGl0YWJsZTwvY29kZT4gbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gKgotICogQHNlZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRhYmxlQ29udGVudCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBjYW4gYmUgbW9kaWZpZWQuCi0JICogSWYgaXQgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIG90aGVyIG1ldGhvZHMgb2YgdGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgY2FuIGJlIG1vZGlmaWVkCi0JICovCi0JYm9vbGVhbiBpc0VkaXRhYmxlKCk7Ci0JCQkKLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBjb250ZW50IHdpdGggdGhlIGdpdmVuIG5ldyBieXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q29udGVudCB0aGlzIG5ldyBjb250ZW50cyByZXBsYWNlcyB0aGUgb2xkIGNvbnRlbnRzCi0JICovCi0Jdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBuZXdDb250ZW50KTsgCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSBwYXJlbnQgdG8gYWRkIG9yIHJlbW92ZSBhIGNoaWxkLAotCSAqIG9yIHRvIGNvcHkgdGhlIGNvbnRlbnRzIG9mIGEgY2hpbGQuCi0JICogCi0JICogV2hhdCB0byBkbyBpcyBlbmNvZGVkIGluIHRoZSB0d28gYXJndW1lbnRzIGFzIGZvbGxvd3M6Ci0JICogPFRBQkxFPgotCSAqIDxUUj4KLQkgKiAJPFREPmFkZDo8L1REPgotCSAqICA8VEQ+ZGVzdCA9PSBudWxsPC9URD4KLQkgKiAgPFREPnNyYyAhPSBudWxsPC9URD4KLQkgKiA8L1RSPgotCSAqIDxUUj4KLQkgKiAJPFREPnJlbW92ZTo8L1REPgotCSAqICA8VEQ+ZGVzdCAhPSBudWxsPC9URD4KLQkgKiAgPFREPnNyYyA9PSBudWxsPC9URD4KLQkgKiA8L1RSPgotCSAqIDxUUj4KLQkgKiAJPFREPmNvcHk6PC9URD4KLQkgKiAgPFREPmRlc3QgIT0gbnVsbDwvVEQ+Ci0JICogIDxURD5zcmMgIT0gbnVsbDwvVEQ+Ci0JICogPC9UUj4KLQkgKiA8L1RBQkxFPgotCSAqIEBwYXJhbSBkZXN0IHRoZSBleGlzdGluZyBjaGlsZCBvZiB0aGlzIG9iamVjdCB0byBiZSByZXBsYWNlZDsgaWYgPGNvZGU+bnVsbDwvbnVsbD4gYSBuZXcgY2hpbGQgY2FuIGJlIGFkZGVkLgotCSAqIEBwYXJhbSBzcmMgdGhlIG5ldyBjaGlsZCB0byBiZSBhZGRlZCBvciByZXBsYWNlZDsgaWYgPGNvZGU+bnVsbDwvY29kZT4gYW4gZXhpc3RpbmcgY2hpbGQgY2FuIGJlIHJlbW92ZWQuCi0JICogQHJldHVybiB0aGUgYXJndW1lbnQgPGNvZGU+ZGVzdDwvY29kZT4KLQkgKi8KLQlJVHlwZWRFbGVtZW50IHJlcGxhY2UoSVR5cGVkRWxlbWVudCBkZXN0LCBJVHlwZWRFbGVtZW50IHNyYyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiYzI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeHRlbnNpb24gZm9yIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+LiBFeHRlbmRzIHRoZSBvcmlnaW5hbAotICogY29uY2VwdCBvZiBhIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+IHRvIGFuc3dlciB0aGUgQ2hhcnNldCAoZW5jb2RpbmcpIHVzZWQgZm9yIHRoZSBzdHJlYW0uCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciBleHRlbmRzIElTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSBjaGFyc2V0IGVuY29kaW5nIHRvIGJlIHVzZWQgd2hlbiBkZWNvZGluZyB0aGlzIAotCSAqIHN0cmVhbSBhY2Nlc3NvcidzIGNvbnRlbnRzIGludG8gY2hhcmFjdGVycy4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBhIHByb3BlciAKLQkgKiBlbmNvZGluZyBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlPC9iPjogIHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBhIHN1cHBvcnRlZAotCSAqIGNoYXJzZXQgbmFtZS4gQ2FsbGVycyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIAotCSAqIDxjb2RlPlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb248L2NvZGU+IHdoZXJlIHRoaXMgY2hhcnNldCBpcyB1c2VkLiAKLQkgKiA8L3A+Ci0JICogQHJldHVybiB0aGUgbmFtZSBvZiBhIGNoYXJzZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIGhhcHBlbnMgd2hpbGUgZGV0ZXJtaW5pbmcgCi0JICogdGhlIGNoYXJzZXQuIFNlZSBhbnkgcmVmaW5lbWVudHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0JICogQHNlZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yI2dldENvbnRlbnRzCi0JICogQHNpbmNlIDMuMAotCSAqLwotCVN0cmluZyBnZXRDaGFyc2V0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JTW9kaWZpY2F0aW9uRGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSU1vZGlmaWNhdGlvbkRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JTW9kaWZpY2F0aW9uRGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3Igb2JqZWN0cyB3aXRoIGEgbW9kaWZpY2F0aW9uIGRhdGUuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQotICogY2FuIGJlIHVzZWQgaW4gdGhlIFVJIHRvIGdpdmUgdGhlIHVzZXIgYSBnZW5lcmFsIGlkZWEgb2YgaG93IG9sZCBhbiBvYmplY3QgaXMuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZpY2F0aW9uRGF0ZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhpcyBvYmplY3QuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgdmFsdWUgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBnaXZlIHRoZSB1c2VyIGEgZ2VuZXJhbCBpZGVhIG9mIGhvdwotCSAqIG9sZCB0aGUgb2JqZWN0IGlzLgotCSAqCi0JICogQHJldHVybiB0aGUgdGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCwgMDA6MDA6MDAgR01UCi0JICovCi0JbG9uZyBnZXRNb2RpZmljYXRpb25EYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JUHJvcGVydHlDaGFuZ2VOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlYjU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JUHJvcGVydHlDaGFuZ2VOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSBjb21tb24gdG8gYWxsIG9iamVjdHMgdGhhdCBwcm92aWRlIGEgbWVhbnMgZm9yIHJlZ2lzdGVyaW5nCi0gKiBmb3IgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyIHsKLQkKLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBub3RpZmllci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRlbnQgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBub3RpZmllci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVN0cmVhbUNvbnRlbnRBY2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY4ZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL0lTdHJlYW1Db250ZW50QWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+IG9iamVjdCByZXByZXNlbnRzIGEgc2V0IG9mIGJ5dGVzIHdoaWNoIGNhbiBiZQotICogYWNjZXNzZWQgYnkgbWVhbnMgb2YgYSBzdHJlYW0uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgb3IgdXNlIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiwKLSAqIDxjb2RlPkJ1ZmZlcmVkQ29udGVudDwvY29kZT4uCi0gKgotICogQHNlZSBCdWZmZXJlZENvbnRlbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RyZWFtQ29udGVudEFjY2Vzc29yIHsKLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9wZW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGZvciB0aGlzIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgb2JqZWN0J3MgY29udGVudC4KLQkgKiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSBzdHJlYW0gd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGhhcyBubyBzdHJlYW1hYmxlIGNvbnRlbnRzLgotCSAqCi0JICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0IGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAotCSAqLwotCUlucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JU3RyZWFtTWVyZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JU3RyZWFtTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODFhMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVN0cmVhbU1lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIHNpbmdsZSBvcGVyYXRpb24gZm9yIHBlcmZvcm1pbmcgYSB0aHJlZS13YXkgbWVyZ2Ugb24gdGhyZWUKLSAqIGlucHV0IHN0cmVhbXMuIFRoZSBtZXJnZWQgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLSAqIDxwPgotICogQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aGVuIGNvbnRyaWJ1dGluZyBuZXcgbWVyZ2VycyB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmNvbXBhcmUuc3RyZWFtTWVyZ2VyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cmVhbU1lcmdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgbWVyZ2Ugb3BlcmF0aW9uICh2YWx1ZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSz0gSVN0YXR1cy5PSzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGNoYW5nZSBjb25mbGljdCBwcmV2ZW50ZWQgdGhlIG1lcmdlIGZyb20gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uICh2YWx1ZSA8Y29kZT4xPC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GTElDVD0gMTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTdGF0dXMgY29kZSBkZXNjcmliaW5nIGFuIGludGVybmFsIGVycm9yICh2YWx1ZSA8Y29kZT4yPC9jb2RlPikKLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX0VSUk9SPSAyOwotCQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgbWVyZ2Ugb3BlcmF0aW9uIG9uIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW1zIGFuZCB3cml0ZXMgdGhlIG1lcmdlIHJlc3VsdCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICAgKiBPbiBzdWNjZXNzIGEgc3RhdHVzIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlzIHJldHVybmVkLCBvbiBlcnJvciBhIHN0YXR1cyA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4gCi0gICAgICogSWYgdGhlIG1lcmdlIG9wZXJhdGlvbiBjYW5ub3QgZGVhbCB3aXRoIGNvbmZsaWN0cywgdGhlIGNvZGUgb2YgdGhlIGVycm9yIHN0YXR1cyBoYXMgdGhlIHZhbHVlIDxjb2RlPklTdHJlYW1NZXJnZXIuQ09ORkxJQ1Q8L2NvZGU+LgotICAgICAqIEZvciB0ZXh0IG9yaWVudGVkIG1lcmdlcnMgdGhlIGVuY29kaW5nIGZvciB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGlzIGhvbm9yZWQuCi0gICAgICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGNhbGxlcnMgdG8gY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBieXRlIHN0cmVhbSB0byB3aGljaCB0aGUgbWVyZ2UgcmVzdWx0IGlzIHdyaXR0ZW47IHRoZSBtZXJnZXIgd2lsbCBub3QgY2xvc2UgdGhlIHN0cmVhbQotICAgICAqIEBwYXJhbSBvdXRwdXRFbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBhbmNlc3RvciB0aGUgYnl0ZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgY29tbW9uIGFuY2VzdG9yIGlzIHJlYWQKLSAgICAgKiBAcGFyYW0gYW5jZXN0b3JFbmNvZGluZyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGFuY2VzdG9yIGlucHV0IGJ5dGUgc3RyZWFtCi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgYnl0ZSBzdHJlYW0gY29udGFpbmluZyB0aGUgdGFyZ2V0IG9mIHRoZSBtZXJnZQotICAgICAqIEBwYXJhbSB0YXJnZXRFbmNvZGluZyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHRhcmdldCBpbnB1dCBieXRlIHN0cmVhbQotICAgICAqIEBwYXJhbSBvdGhlciB0aGUgYnl0ZSBzdHJlYW0gY29udGFpbmluZyB0aGUgdGFyZ2V0IG9mIHRoZSBtZXJnZQotICAgICAqIEBwYXJhbSBvdGhlckVuY29kaW5nIHRoZSBlbmNvZGluZyBvZiB0aGUgb3RoZXIgaW5wdXQgYnl0ZSBzdHJlYW0KLSAgICAgKiBAcGFyYW0gbW9uaXRvciByZXBvcnRzIHByb2dyZXNzIG9mIHRoZSBtZXJnZSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNvbXBsZXRpb24gc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLSAgICAgKi8KLQlJU3RhdHVzIG1lcmdlKE91dHB1dFN0cmVhbSBvdXRwdXQsIFN0cmluZyBvdXRwdXRFbmNvZGluZywKLQkJCUlucHV0U3RyZWFtIGFuY2VzdG9yLCBTdHJpbmcgYW5jZXN0b3JFbmNvZGluZywKLQkJCUlucHV0U3RyZWFtIHRhcmdldCwgU3RyaW5nIHRhcmdldEVuY29kaW5nLAotCQkJSW5wdXRTdHJlYW0gb3RoZXIsIFN0cmluZyBvdGhlckVuY29kaW5nLAotCSAgICAgICAgCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JVHlwZWRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JVHlwZWRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWM4NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVR5cGVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSBuYW1lLCBpbWFnZSwgYW5kIHR5cGUgZm9yIGFuIG9iamVjdC4KLSAqIDxwPgotICogVGhlc2UgbWV0aG9kcyBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gcHJlc2VudCBhbiBpbnB1dCBvYmplY3QgaW4gdGhlIGNvbXBhcmUgVUkKLSAqICg8Y29kZT5nZXROYW1lPC9jb2RlPiBhbmQgPGNvZGU+Z2V0SW1hZ2U8L2NvZGU+KQotICogYW5kIGZvciBmaW5kaW5nIGEgdmlld2VyIGZvciBhIGdpdmVuIGlucHV0IHR5cGUgKDxjb2RlPmdldFR5cGU8L2NvZGU+KS4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlZEVsZW1lbnQgewotCi0JLyoqCi0JICogVHlwZSBmb3IgYSBmb2xkZXIgaW5wdXQgKHZhbHVlIDxjb2RlPiJGT0xERVIiPC9jb2RlPikuCi0JICogRm9sZGVycyBhcmUgY29tcGFyaXNvbiBlbGVtZW50cyB0aGF0IGhhdmUgbm8gY29udGVudHMsIG9ubHkgYSBuYW1lIGFuZCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfVFlQRT0gIkZPTERFUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFR5cGUgZm9yIGFuIGVsZW1lbnQgd2hvc2UgYWN0dWFsIHR5cGUgaXMgdGV4dCAgKHZhbHVlIDxjb2RlPiJ0eHQiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UWVBFPSAidHh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVHlwZSBmb3IgYW4gZWxlbWVudCB3aG9zZSBhY3R1YWwgdHlwZSBjb3VsZCBub3QKLQkgKiBiZSBkZXRlcm1pbmVkLiAodmFsdWUgPGNvZGU+Ij8/PyI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX1RZUEU9ICI/Pz8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgb2JqZWN0LgotCSAqIFRoZSBuYW1lIGlzIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoaXMgb2JqZWN0IGluIHRoZSBVSS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBvYmplY3QKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhpcyBvYmplY3QuCi0JICogVGhpcyBpbWFnZSBpcyB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGlzIG9iamVjdCBpbiB0aGUgVUkuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBvZiB0aGlzIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2YgaW5wdXQgaGFzIG5vIGltYWdlCi0JICovCi0JSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBvYmplY3QuIEZvciBvYmplY3RzIHdpdGggYSBmaWxlIG5hbWUKLQkgKiB0aGlzIGlzIHR5cGljYWxseSB0aGUgZmlsZSBleHRlbnNpb24uIEZvciBmb2xkZXJzIGl0cyB0aGUgY29uc3RhbnQKLQkgKiA8Y29kZT5GT0xERVJfVFlQRTwvY29kZT4uCi0JICogVGhlIHR5cGUgaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgYSBzdWl0YWJsZSB2aWV3ZXIgZm9yIHRoaXMgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG9iamVjdAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JVmlld2VyQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvSVZpZXdlckNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YjI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9JVmlld2VyQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBBIGZhY3Rvcnkgb2JqZWN0IGZvciA8Y29kZT5WaWV3ZXI8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gY3JlYXRpbmcgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+IGZyb20gYSBwbHVnaW4ueG1sIGZpbGUuCi0gKiBTaW5jZSA8Y29kZT5WaWV3ZXI8L2NvZGU+cyBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IgdGhleSBjYW5ub3QgYmUKLSAqIGluc3RhbnRpYXRlZCBkaXJlY3RseSB3aXRoIDxjb2RlPkNsYXNzLmZvck5hbWU8L2NvZGU+LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWaWV3ZXJDcmVhdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBTV1QgcGFyZW50IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgcGFyZW50IGNvbnRyb2wgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoZSB2aWV3ZXIncyBTV1QgY29udHJvbAotCSAqIEBwYXJhbSBjb25maWcgYSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gdGhlIG5ld2x5IGNyZWF0ZWQgdmlld2VyIG1pZ2h0IHdhbnQgdG8gdXNlCi0JICogQHJldHVybiBhIG5ldyB2aWV3ZXIKLQkgKi8KLQlWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9OYXZpZ2F0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9OYXZpZ2F0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGEwN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvTmF2aWdhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotCi0KLS8qKgotICogQSA8Y29kZT5OYXZpZ2F0aW9uQWN0aW9uPC9jb2RlPiBpcyB1c2VkIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGluZGl2aWR1YWwKLSAqIGRpZmZlcmVuY2VzIG9mIGEgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0PC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGUgdGhpcyBjbGFzczsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZk5leHQ7Ci0JcHJpdmF0ZSBDb21wYXJlRWRpdG9ySW5wdXQgZkNvbXBhcmVFZGl0b3JJbnB1dDsKLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+TmF2aWdhdGlvbkFjdGlvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmV4dCBpZiA8Y29kZT50cnVlPC9jb2RlPiBhY3Rpb24gZ29lcyB0byB0aGUgbmV4dCBkaWZmZXJlbmNlOyBvdGhlcndpc2UgdG8gdGhlIHByZXZpb3VzIGRpZmZlcmVuY2UuCi0JICovCi0JcHVibGljIE5hdmlnYXRpb25BY3Rpb24oYm9vbGVhbiBuZXh0KSB7Ci0JCXRoaXMoQ29tcGFyZVVJLmdldFJlc291cmNlQnVuZGxlKCksIG5leHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5OYXZpZ2F0aW9uQWN0aW9uPC9jb2RlPiB0aGF0IGluaXRpYWxpemVzIGl0cyBhdHRyaWJ1dGVzCi0JICogZnJvbSB0aGUgZ2l2ZW4gPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJ1bmRsZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBuZXh0IGlmIDxjb2RlPnRydWU8L2NvZGU+IGFjdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGRpZmZlcmVuY2U7IG90aGVyd2lzZSB0byB0aGUgcHJldmlvdXMgZGlmZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgTmF2aWdhdGlvbkFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIGJvb2xlYW4gbmV4dCkgewotCQlVdGlsaXRpZXMuaW5pdEFjdGlvbih0aGlzLCBidW5kbGUsIG5leHQgPyAiYWN0aW9uLk5leHQuIiA6ICJhY3Rpb24uUHJldmlvdXMuIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmTmV4dD0gbmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChmQ29tcGFyZUVkaXRvcklucHV0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBhZGFwdGVyPSBmQ29tcGFyZUVkaXRvcklucHV0LmdldEFkYXB0ZXIoSUNvbXBhcmVOYXZpZ2F0b3IuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29tcGFyZU5hdmlnYXRvcikgewotCQkJCWJvb2xlYW4gYXRFbmQ9ICgoSUNvbXBhcmVOYXZpZ2F0b3IpYWRhcHRlcikuc2VsZWN0Q2hhbmdlKGZOZXh0KTsKLQkJCQlTaGVsbCBzaGVsbD0gQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCk7Ci0JCQkJaWYgKGF0RW5kICYmIHNoZWxsICE9IG51bGwpIHsKLQkJCQkJCi0JCQkJCURpc3BsYXkgZGlzcGxheT0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCQkJCQlpZiAoZGlzcGxheSAhPSBudWxsKQotCQkJCQkJZGlzcGxheS5iZWVwKCk7Ci0KLQkJCQkJU3RyaW5nIHRpdGxlOwotCQkJCQlTdHJpbmcgbWVzc2FnZTsKLQkJCQkJaWYgKGZOZXh0KSB7Ci0JCQkJCQl0aXRsZT0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiQ29tcGFyZU5hdmlnYXRvci5hdEVuZC50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltZXNzYWdlPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb21wYXJlTmF2aWdhdG9yLmF0RW5kLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJdGl0bGU9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbXBhcmVOYXZpZ2F0b3IuYXRCZWdpbm5pbmcudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWVzc2FnZT0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiQ29tcGFyZU5hdmlnYXRvci5hdEJlZ2lubmluZy5tZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSA8Y29kZT5Db21wYXJlRWRpdG9ySW5wdXQ8L2NvZGU+IG9uIHdoaWNoIHRoaXMgYWN0aW9uIG9wZXJhdGVzLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0PC9jb2RlPiBvbiB3aGljaCB0aGlzIGFjdGlvbiBvcGVyYXRlczsgaWYgPGNvZGU+bnVsbDwvY29kZT4gYWN0aW9uIGRvZXMgbm90aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBhcmVFZGl0b3JJbnB1dChDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJZkNvbXBhcmVFZGl0b3JJbnB1dD0gaW5wdXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvUmVzb3VyY2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9SZXNvdXJjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNGNjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9SZXNvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLklSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNvbXBhcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SZXNvdXJjZU5vZGU8L2NvZGU+IHdyYXBwZXJzIGFuIDxjb2RlPklSZXNvdXJjZXM8L2NvZGU+IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQKLSAqIGFzIGlucHV0IGZvciB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSAoaW50ZXJmYWNlcyA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4gYW5kIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+KQotICogYW5kIHRoZSA8Y29kZT5SZXBsYWNlV2l0aEVkaXRpb25EaWFsb2c8L2NvZGU+IChpbnRlcmZhY2VzIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+IGFuZCA8Y29kZT5JTW9kaWZpY2F0aW9uRGF0ZTwvY29kZT4pLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIEVkaXRpb25TZWxlY3Rpb25EaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlTm9kZSBleHRlbmRzIEJ1ZmZlcmVkQ29udGVudAotCQkJaW1wbGVtZW50cyBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciwgSVN0cnVjdHVyZUNvbXBhcmF0b3IsIElUeXBlZEVsZW1lbnQsCi0JCQkJCQkJSUVkaXRhYmxlQ29udGVudCwgSU1vZGlmaWNhdGlvbkRhdGUsIElSZXNvdXJjZVByb3ZpZGVyIHsKLQkJCQotCXByaXZhdGUgSVJlc291cmNlIGZSZXNvdXJjZTsKLQlwcml2YXRlIEFycmF5TGlzdCBmQ2hpbGRyZW47Ci0JCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5SZXNvdXJjZU5vZGU8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlCi0JICovCi0JcHVibGljIFJlc291cmNlTm9kZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZlJlc291cmNlPSByZXNvdXJjZTsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZXNvdXJjZSk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIGZvciB0aGlzIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gZlJlc291cmNlOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElTdHJlYW1Db250ZW50QWNjZXNzb3IuZ2V0Q29udGVudHMKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmUmVzb3VyY2UgaW5zdGFuY2VvZiBJU3RvcmFnZSkKLQkJCXJldHVybiBzdXBlci5nZXRDb250ZW50cygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJTW9kaWZpY2F0aW9uRGF0ZS5nZXRNb2RpZmljYXRpb25EYXRlCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpIHsKLQkJSVBhdGggcGF0aD0gZlJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCUZpbGUgZmlsZT0gcGF0aC50b0ZpbGUoKTsKLQkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVR5cGVkRWxlbWVudC5nZXROYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZlJlc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZlJlc291cmNlLmdldE5hbWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElUeXBlZEVsZW1lbnQuZ2V0VHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJaWYgKGZSZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpCi0JCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5GT0xERVJfVFlQRTsKLQkJaWYgKGZSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcz0gZlJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChzICE9IG51bGwpCi0JCQkJcmV0dXJuIHM7Ci0JCX0KLQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElUeXBlZEVsZW1lbnQuZ2V0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBDb21wYXJlVUkuZ2V0SW1hZ2UoZlJlc291cmNlKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG90aGVyIG9iamVjdCBpcyBvZiB0eXBlIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+Ci0JICogYW5kIHRoZWlyIG5hbWVzIGFyZSBpZGVudGljYWwuIFRoZSBjb250ZW50IGlzIG5vdCBjb25zaWRlcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKG90aGVyIGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkgewotCQkJU3RyaW5nIG90aGVyTmFtZT0gKChJVHlwZWRFbGVtZW50KW90aGVyKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhvdGhlck5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob3RoZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhlIG5hbWUuCi0gICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElTdHJ1Y3R1cmVDb21wYXJhdG9yLmdldENoaWxkcmVuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQlpZiAoZkNoaWxkcmVuID09IG51bGwpIHsKLQkJCWZDaGlsZHJlbj0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGZSZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2UgbWVtYmVyc1tdPSAoKElDb250YWluZXIpZlJlc291cmNlKS5tZW1iZXJzKCk7Ci0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJU3RydWN0dXJlQ29tcGFyYXRvciBjaGlsZD0gY3JlYXRlQ2hpbGQobWVtYmVyc1tpXSk7Ci0JCQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJCQlmQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gTmVlZFdvcmsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaG9vayBtZXRob2QgaXMgY2FsbGVkIGZyb20gPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IG9uY2UgZm9yIGV2ZXJ5Ci0JICogbWVtYmVyIG9mIGEgY29udGFpbmVyIHJlc291cmNlLiBUaGlzIGltcGxlbWVudGF0aW9uCi0JICogY3JlYXRlcyBhIG5ldyA8Y29kZT5SZXNvdXJjZU5vZGU8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gY2hpbGQgcmVzb3VyY2UuCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgZGlmZmVyZW50IHR5cGUgb2YKLQkgKiA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4gb3IgdG8gZmlsdGVyIGNoaWxkcmVuIGJ5IHJldHVybmluZyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgcmVzb3VyY2UgZm9yIHdoaWNoIGEgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+IG11c3QgYmUgcmV0dXJuZWQKLQkgKiBAcmV0dXJuIGEgPGNvZGU+UmVzb3VyY2VOb2RlPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGNoaWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGNyZWF0ZUNoaWxkKElSZXNvdXJjZSBjaGlsZCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlTm9kZShjaGlsZCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9wZW4gc3RyZWFtIGlmIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIGltcGxlbWVudHMgdGhlCi0JICogPGNvZGU+SVN0b3JhZ2U8L2NvZGU+IGludGVyZmFjZS4gT3RoZXJ3aXNlIHRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gYSBidWZmZXJlZCBpbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhpcyBzdG9yYWdlCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JhZ2UgY291bGQgbm90IGJlIGFjY2Vzc2VkCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGNyZWF0ZVN0cmVhbSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZSZXNvdXJjZSBpbnN0YW5jZW9mIElTdG9yYWdlKSB7Ci0JCQlJbnB1dFN0cmVhbSBpcz0gbnVsbDsKLQkJCUlTdG9yYWdlIHN0b3JhZ2U9IChJU3RvcmFnZSkgZlJlc291cmNlOwotCQkJdHJ5IHsKLQkJCQlpcz0gc3RvcmFnZS5nZXRDb250ZW50cygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5PVVRfT0ZfU1lOQ19MT0NBTCkgewotCQkJCQlmUmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCWlzPSBzdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUVkaXRhYmxlQ29udGVudC5pc0VkaXRhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUVkaXRhYmxlQ29udGVudC5yZXBsYWNlCi0JICovCi0JcHVibGljIElUeXBlZEVsZW1lbnQgcmVwbGFjZShJVHlwZWRFbGVtZW50IGNoaWxkLCBJVHlwZWRFbGVtZW50IG90aGVyKSB7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLklFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yI2dldENoYXJzZXQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIFV0aWxpdGllcy5nZXRDaGFyc2V0KGZSZXNvdXJjZSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9TcGxpdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvU3BsaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxYzE3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9TcGxpdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotCi0vKioKLSAqIFRoZSBTcGxpdHRlciBhZGRzIHN1cHBvcnQgZm9yIG5lc3RpbmcgdG8gYSBTYXNoRm9ybS4KLSAqIDxQPgotICogSWYgU3BsaXR0ZXJzIGFyZSBuZXN0ZWQgZGlyZWN0bHk6Ci0gKiA8VUw+Ci0gKiA8TEk+Y2hhbmdpbmcgdGhlIHZpc2liaWxpdHkgb2YgYSBjaGlsZCBtYXkgcHJvcGFnYXRlIHVwd2FyZCB0byB0aGUgcGFyZW50IFNwbGl0dGVyIGlmIHRoZSBjaGlsZAotICogaXMgdGhlIGxhc3QgY2hpbGQgdG8gYmVjb21lIGludmlzaWJsZSBvciB0aGUgZmlyc3QgdG8gYmVjb21lIHZpc2libGUuPC9MST4KLSAqIDxMST5tYXhpbWl6aW5nIGEgY2hpbGQgbWFrZXMgaXQgYXMgbGFyZ2UgYXMgdGhlIHRvcG1vc3QgZW5jbG9zaW5nIFNwbGl0dGVyPC9MST4KLSAqIDwvVUw+Ci0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIFNwbGl0dGVyIGV4dGVuZHMgU2FzaEZvcm0gewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJQklMSVRZPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC52aXNpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBpdHMgcGFyZW50Ci0JICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0JICogPHA+Ci0JICogVGhlIHN0eWxlIHZhbHVlIGlzIGVpdGhlciBvbmUgb2YgdGhlIHN0eWxlIGNvbnN0YW50cyBkZWZpbmVkIGluCi0JICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0JICogY2xhc3MsIG9yIG11c3QgYmUgYnVpbHQgYnkgPGVtPmJpdHdpc2UgT1I8L2VtPidpbmcgdG9nZXRoZXIKLQkgKiAodGhhdCBpcywgdXNpbmcgdGhlIDxjb2RlPmludDwvY29kZT4gInwiIG9wZXJhdG9yKSB0d28gb3IgbW9yZQotCSAqIG9mIHRob3NlIDxjb2RlPlNXVDwvY29kZT4gc3R5bGUgY29uc3RhbnRzLiBUaGUgY2xhc3MgZGVzY3JpcHRpb24KLQkgKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotCSAqIFN0eWxlIGJpdHMgYXJlIGFsc28gaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgYSB3aWRnZXQgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotCSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2Ygd2lkZ2V0IHRvIGNvbnN0cnVjdAotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLQkgKiA8L3VsPgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBTcGxpdHRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBnaXZlbiBjaGlsZCBpbiB0aGlzIFNwbGl0dGVyLiBJZiB0aGlzIGNoYW5nZQotCSAqIGFmZmVjdHMgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgdGhlIHdob2xlIFNwbGl0dGVyLCBhbmQgaWYgdGhlIFNwbGl0dGVyCi0JICogaXMgZGlyZWN0bHkgbmVzdGVkIGluIG9uZSBvciBtb3JlIFNwbGl0dGVycywgdGhpcyBtZXRob2QgcmVjdXJzaXZlbHkKLQkgKiBwcm9wYWdhdGVzIHRoZSBuZXcgc3RhdGUgdXB3YXJkLgotCSAqCi0JICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCBjb250cm9sIGZvciB3aGljaCB0aGUgdmlzaWJpbGl0eSBpcyBjaGFuZ2VkCi0JICogQHBhcmFtIHZpc2libGUgdGhlIG5ldyB2aXNpYmlsaXR5IHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShDb250cm9sIGNoaWxkLCBib29sZWFuIHZpc2libGUpIHsKLQkJCi0JCWJvb2xlYW4gd2FzRW1wdHk9IGlzRW1wdHkoKTsKLQkJCQkKLQkJY2hpbGQuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJY2hpbGQuc2V0RGF0YShWSVNJQklMSVRZLCBuZXcgQm9vbGVhbih2aXNpYmxlKSk7Ci0JCQotCQlpZiAod2FzRW1wdHkgIT0gaXNFbXB0eSgpKSB7Ci0JCQkvLyByZWN1cnNpdmVseSB3YWxrIHVwCi0JCQlDb21wb3NpdGUgcGFyZW50PSBnZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTcGxpdHRlcikgewotCQkJCVNwbGl0dGVyIHNwPSAoU3BsaXR0ZXIpIHBhcmVudDsKLQkJCQlzcC5zZXRWaXNpYmxlKHRoaXMsIHZpc2libGUpOwotCQkJCXNwLmxheW91dCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbGF5b3V0KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmVjdXJzaXZlbHkgY2FsbHMgc2V0TWF4aW1pemVkQ29udHJvbCBmb3IgYWxsIGRpcmVjdCBwYXJlbnRzIHRoYXQgYXJlCi0JICogaXRzZWxmIFNwbGl0dGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhpbWl6ZWRDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQlpZiAoY29udHJvbCA9PSBudWxsIHx8IGNvbnRyb2wgPT0gZ2V0TWF4aW1pemVkQ29udHJvbCgpKQotCQkJc3VwZXIuc2V0TWF4aW1pemVkQ29udHJvbChudWxsKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0TWF4aW1pemVkQ29udHJvbChjb250cm9sKTsKLQotCQkvLyByZWN1cnNpdmVseSB3YWxrIHVwd2FyZAotCQlDb21wb3NpdGUgcGFyZW50PSBnZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNwbGl0dGVyKQotCQkJKChTcGxpdHRlcikgcGFyZW50KS5zZXRNYXhpbWl6ZWRDb250cm9sKHRoaXMpOwotCQllbHNlCi0JCQlsYXlvdXQodHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFJldHVybnMgdHJ1ZSBpZiBTcGxpdHRlciBoYXMgbm8gY2hpbGRyZW4gb3IgaWYgYWxsIGNoaWxkcmVuIGFyZSBpbnZpc2libGUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCUNvbnRyb2xbXSBjb250cm9scz0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGlzVmlzaWJsZShjb250cm9sc1tpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFJldHVybnMgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgdGhlIGdpdmVuIGNoaWxkIGNvbnRyb2wuIElmIHRoZQotCSAqIGNvbnRyb2wgaXMgYSBTYXNoLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWaXNpYmxlKENvbnRyb2wgY2hpbGQpIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2FzaCkKLQkJCXJldHVybiBmYWxzZTsKLQkJT2JqZWN0IGRhdGE9IGNoaWxkLmdldERhdGEoVklTSUJJTElUWSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCXJldHVybiAoKEJvb2xlYW4pZGF0YSkuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL1ppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9aaXBGaWxlU3RydWN0dXJlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZjYTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL1ppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci0KLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvcjwvY29kZT4gaW50ZXJmYWNlCi0gKiBtYWtlcyB0aGUgY29udGVudHMgb2YgYSB6aXAgYXJjaGl2ZSBhdmFpbGFibGUgYXMgYQotICogaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBvZiA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT5zLgotICogPHA+Ci0gKiBJdCBpcyB1c2VkIHdoZW4gY29tcGFyaW5nIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSB6aXAgYXJjaGl2ZS4KLSAqCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBGaWxlU3RydWN0dXJlQ3JlYXRvciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVDcmVhdG9yIHsKLQotCS8qKgotCSAqIENvbW1vbiBiYXNlIGNsYXNzIGZvciBaaXBGb2xkZXIgYW5kIFppcEZpbGUKLQkgKi8KLQlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgWmlwUmVzb3VyY2UgaW1wbGVtZW50cyBJU3RydWN0dXJlQ29tcGFyYXRvciwgSVR5cGVkRWxlbWVudCB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0KLQkJWmlwUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQkJCWZOYW1lPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJcmV0dXJuIENvbXBhcmVVSS5nZXRJbWFnZShnZXRUeXBlKCkpOwotCQl9Ci0KLQkJLyoKLQkJICogUmV0dXJucyB0cnVlIGlmIG90aGVyIGlzIElUeXBlZEVsZW1lbnQgYW5kIG5hbWVzIGFyZSBlcXVhbC4KLQkJICogQHNlZSBJQ29tcGFyYXRvciNlcXVhbHMKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJCWlmIChvdGhlciBpbnN0YW5jZW9mIElUeXBlZEVsZW1lbnQpCi0JCQkJcmV0dXJuIGZOYW1lLmVxdWFscygoKElUeXBlZEVsZW1lbnQpIG90aGVyKS5nZXROYW1lKCkpOwotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcik7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIGZOYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgWmlwRm9sZGVyIGV4dGVuZHMgWmlwUmVzb3VyY2UgewotCi0JCXByaXZhdGUgSGFzaE1hcCBmQ2hpbGRyZW49IG5ldyBIYXNoTWFwKDEwKTsKLQotCQlaaXBGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuRk9MREVSX1RZUEU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbj0gbmV3IE9iamVjdFtmQ2hpbGRyZW4uc2l6ZSgpXTsKLQkJCUl0ZXJhdG9yIGl0ZXI9IGZDaGlsZHJlbi52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaT0gMDsgaXRlci5oYXNOZXh0KCk7IGkrKykKLQkJCQljaGlsZHJlbltpXT0gaXRlci5uZXh0KCk7Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQlaaXBGaWxlIGNyZWF0ZUNvbnRhaW5lcihTdHJpbmcgcGF0aCkgewotCQkJU3RyaW5nIGVudHJ5PSBwYXRoOwotCQkJaW50IHBvcz0gcGF0aC5pbmRleE9mKCcvJyk7Ci0JCQlpZiAocG9zIDwgMCkKLQkJCQlwb3M9IHBhdGguaW5kZXhPZignXFwnKTsKLQkJCWlmIChwb3MgPj0gMCkgewotCQkJCWVudHJ5PSBwYXRoLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCXBhdGg9IHBhdGguc3Vic3RyaW5nKHBvcyArIDEpOwotCQkJfSBlbHNlIGlmIChlbnRyeS5sZW5ndGgoKSA+IDApIHsKLQkJCQlpZiAoQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5maWx0ZXIocGF0aCwgZmFsc2UsIHRydWUpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlaaXBGaWxlIHplPSBuZXcgWmlwRmlsZShlbnRyeSk7Ci0JCQkJZkNoaWxkcmVuLnB1dChlbnRyeSwgemUpOwotCQkJCXJldHVybiB6ZTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBudWxsOwotCi0JCQlaaXBGb2xkZXIgZm9sZGVyPSBudWxsOwotCQkJaWYgKGZDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG89IGZDaGlsZHJlbi5nZXQoZW50cnkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgWmlwRm9sZGVyKQotCQkJCQlmb2xkZXI9IChaaXBGb2xkZXIpIG87Ci0JCQl9Ci0KLQkJCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJCWlmIChwYXRoLmxlbmd0aCgpID4gMCAmJiBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbHRlcihwYXRoLCB0cnVlLCB0cnVlKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJZm9sZGVyPSBuZXcgWmlwRm9sZGVyKGVudHJ5KTsKLQkJCQlmQ2hpbGRyZW4ucHV0KGVudHJ5LCBmb2xkZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gZm9sZGVyLmNyZWF0ZUNvbnRhaW5lcihwYXRoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBaaXBGaWxlIGV4dGVuZHMgWmlwUmVzb3VyY2UgaW1wbGVtZW50cyBJU3RyZWFtQ29udGVudEFjY2Vzc29yIHsKLQotCQlwcml2YXRlIGJ5dGVbXSBmQ29udGVudHM7Ci0KLQkJWmlwRmlsZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlTdHJpbmcgcz0gdGhpcy5nZXROYW1lKCk7Ci0JCQlpbnQgcG9zPSBzLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAocG9zID49IDApCi0JCQkJcmV0dXJuIHMuc3Vic3RyaW5nKHBvcyArIDEpOwotCQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuVU5LTk9XTl9UWVBFOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHsKLQkJCWlmIChmQ29udGVudHMgPT0gbnVsbCkKLQkJCQlmQ29udGVudHM9IG5ldyBieXRlWzBdOwotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmQ29udGVudHMpOwotCQl9Ci0KLQkJYnl0ZVtdIGdldEJ5dGVzKCkgewotCQkJcmV0dXJuIGZDb250ZW50czsKLQkJfQotCi0JCXZvaWQgc2V0Qnl0ZXMoYnl0ZVtdIGJ1ZmZlcikgewotCQkJZkNvbnRlbnRzPSBidWZmZXI7Ci0JCX0KLQotCQl2b2lkIGFwcGVuZEJ5dGVzKGJ5dGVbXSBidWZmZXIsIGludCBsZW5ndGgpIHsKLQkgICAgCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJaW50IG9sZExlbj0gMDsKLQkJCQlpZiAoZkNvbnRlbnRzICE9IG51bGwpCi0JCQkJCW9sZExlbj0gZkNvbnRlbnRzLmxlbmd0aDsKLQkJCQlieXRlW10gbmV3QnVmPSBuZXcgYnl0ZVtvbGRMZW4gKyBsZW5ndGhdOwotCQkJCWlmIChvbGRMZW4gPiAwKQotCQkgICAgCQlTeXN0ZW0uYXJyYXljb3B5KGZDb250ZW50cywgMCwgbmV3QnVmLCAwLCBvbGRMZW4pOwotCSAgICAJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdCdWYsIG9sZExlbiwgbGVuZ3RoKTsKLQkgICAgCQlmQ29udGVudHM9IG5ld0J1ZjsKLQkgICAgCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmVGl0bGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3IuCi0JICovCi0JcHVibGljIFppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yKCkgewotCQl0aGlzKFV0aWxpdGllcy5nZXRTdHJpbmcoIlppcFN0cnVjdHVyZUNyZWF0b3IubmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3Igd2l0aCB0aGUgZ2l2ZW4gdGl0bGUuCi0JICogVGhlIHRpdGxlIGlzIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgPGNvZGU+Z2V0TmFtZSgpPC9jb2RlPi4KLQkgKiBAcGFyYW0gdGl0bGUgdGhlIHRpdGxlIG9mIHRoaXMgc3RyY3V0dXJlIGNyZWF0b3IKLQkgKi8KLQlwdWJsaWMgWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3IoU3RyaW5nIHRpdGxlKSB7Ci0JCWZUaXRsZT0gdGl0bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZlRpdGxlOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlQ29tcGFyYXRvciBnZXRTdHJ1Y3R1cmUoT2JqZWN0IGlucHV0KSB7Ci0KLQkJSW5wdXRTdHJlYW0gaXM9IG51bGw7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQlJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNjYT0gKElTdHJlYW1Db250ZW50QWNjZXNzb3IpIGlucHV0OwotCQkJdHJ5IHsKLQkJCQlpcz0gc2NhLmdldENvbnRlbnRzKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0KLQkJfQotCi0JCWlmIChpcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJWmlwSW5wdXRTdHJlYW0gemlwPSBuZXcgWmlwSW5wdXRTdHJlYW0oaXMpOwotCQlaaXBGb2xkZXIgcm9vdD0gbmV3IFppcEZvbGRlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWZvciAoOzspIHsKLQkJCQlaaXBFbnRyeSBlbnRyeT0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCQlicmVhazsKLQotCQkJCVppcEZpbGUgemU9IHJvb3QuY3JlYXRlQ29udGFpbmVyKGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJaWYgKHplICE9IG51bGwpIHsKLQkJCQkJaW50IGxlbmd0aD0gKGludCkgZW50cnkuZ2V0U2l6ZSgpOwotCQkJCQlpZiAobGVuZ3RoID49IDApIHsKLQkJCQkJCWJ5dGVbXSBidWZmZXI9IG5ldyBieXRlW2xlbmd0aF07Ci0JCQkJCQlpbnQgb2Zmc2V0PSAwOwotCQotCQkJCQkJZG8gewotCQkJCQkJCWludCBuPSB6aXAucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbjsKLQkJCQkJCQlsZW5ndGggLT0gbjsKLQkJCQkJCX0gd2hpbGUgKGxlbmd0aCA+IDApOwotCQotCQkJCQkJemUuc2V0Qnl0ZXMoYnVmZmVyKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJ5dGVbXSBidWZmZXI9IG5ldyBieXRlWzEwMjRdOwkJCi0JCQkJCQlpbnQgbjsKLQkJCQkJCWRvIHsKLQkJCQkJCQluPSB6aXAucmVhZChidWZmZXIsIDAsIDEwMjQpOwotCQkJCQkJCXplLmFwcGVuZEJ5dGVzKGJ1ZmZlciwgbik7Ci0JCQkJCQl9IHdoaWxlIChuID49IDApOwotCQkJCQl9Ci0JCQkJfQotCQkJCXppcC5jbG9zZUVudHJ5KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJemlwLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCi0JCWlmIChyb290LmZDaGlsZHJlbi5zaXplKCkgPT0gMSkgewotCQkJSXRlcmF0b3IgaXRlcj0gcm9vdC5mQ2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXJldHVybiAoSVN0cnVjdHVyZUNvbXBhcmF0b3IpIGl0ZXIubmV4dCgpOwotCQl9Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoT2JqZWN0IG8sIGJvb2xlYW4gaWdub3JlV2hpdGVzcGFjZSkgewotCQlpZiAobyBpbnN0YW5jZW9mIFppcEZpbGUpIHsKLQkJCWJ5dGVbXSBieXRlcz0gKChaaXBGaWxlKW8pLmdldEJ5dGVzKCk7Ci0JCQlpZiAoYnl0ZXMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFN0cmluZyhieXRlcyk7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBzaW5jZSB3ZSBjYW5ub3QgdXBkYXRlIGEgemlwIGFyY2hpdmUuCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TYXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW5ldmVyIGEgY29weSBvcGVyYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIG9uIGEgdHJlZSBub2RlLgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdGhyb3dzIGFuIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKiBzaW5jZSB3ZSBjYW5ub3QgdXBkYXRlIGEgemlwIGFyY2hpdmUuCi0JICoKLQkgKiBAcGFyYW0gc3RydWN0dXJlIHRoZSBub2RlIGZvciB3aGljaCB0byBzYXZlIHRoZSBuZXcgY29udGVudAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHN0cnVjdHVyZSB0cmVlIHdhcyBjcmVhdGVkIGluIDxjb2RlPmdldFN0cnVjdHVyZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElTdHJ1Y3R1cmVDb21wYXJhdG9yIHN0cnVjdHVyZSwgT2JqZWN0IGlucHV0KSB7Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UpOyAvLyBDYW5ub3QgdXBkYXRlIHppcCBhcmNoaXZlCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlQ29tcGFyYXRvciBsb2NhdGUoT2JqZWN0IHBhdGgsIE9iamVjdCBzb3VyY2UpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBzaW5jZSB0aGlzIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPgotCSAqIGNhbm5vdCByZXdyaXRlIHRoZSBkaWZmIHRyZWUgaW4gb3JkZXIgdG8gZm9sZCBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZgotCSAqIGFkZGl0b25zIGFuZCBkZWxldGlvbnMuCi0JICogPHA+Ci0JICogTm90ZTogdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4gCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXdyaXRlVHJlZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiBzaW5jZSB0aGlzIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPgotCSAqIGNhbm5vdCByZXdyaXRlIHRoZSBkaWZmIHRyZWUgaW4gb3JkZXIgdG8gZm9sZCBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZgotCSAqIGFkZGl0b25zIGFuZCBkZWxldGlvbnMuCi0JICogPHA+Ci0JICogTm90ZTogdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4gCi0JICogQHBhcmFtIGRpZmZlcmVuY2VyCi0JICogQHBhcmFtIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXdyaXRlVHJlZShEaWZmZXJlbmNlciBkaWZmZXJlbmNlciwgSURpZmZDb250YWluZXIgcm9vdCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvQ29udGVudE1lcmdlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvQ29udGVudE1lcmdlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTgyMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0NvbnRlbnRNZXJnZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklLZXlCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjb21wYXJlIGFuZCBtZXJnZSB2aWV3ZXIgd2l0aCB0d28gc2lkZS1ieS1zaWRlIGNvbnRlbnQgYXJlYXMKLSAqIGFuZCBhbiBvcHRpb25hbCBjb250ZW50IGFyZWEgZm9yIHRoZSBhbmNlc3Rvci4gVGhlIGltcGxlbWVudGF0aW9uIG1ha2VzIG5vCi0gKiBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY29udGVudCB0eXBlLgotICogPHA+Ci0gKiA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0gKiA8dWw+Ci0gKiA8bGk+aW1wbGVtZW50cyB0aGUgb3ZlcmFsbCBsYXlvdXQgYW5kIGRlZmluZXMgaG9va3Mgc28gdGhhdCBzdWJjbGFzc2VzCi0gKgljYW4gZWFzaWx5IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgY29udGVudCB0eXBlLAotICogPGxpPmltcGxlbWVudHMgdGhlIFVJIGZvciBtYWtpbmcgdGhlIGFyZWFzIHJlc2l6YWJsZSwKLSAqIDxsaT5oYXMgYW4gYWN0aW9uIGZvciBjb250cm9sbGluZyB3aGV0aGVyIHRoZSBhbmNlc3RvciBhcmVhIGlzIHZpc2libGUgb3Igbm90LAotICogPGxpPmhhcyBhY3Rpb25zIGZvciBjb3B5aW5nIG9uZSBzaWRlIG9mIHRoZSBpbnB1dCB0byB0aGUgb3RoZXIgc2lkZSwKLSAqIDxsaT50cmFja3MgdGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBhbmQgc2VuZCBvdXQgbm90aWZpY2F0aW9uCi0gKglvbiBzdGF0ZSBjaGFuZ2VzLgotICogPC91bD4KLSAqIEEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBhY2Nlc3NlcyBpdHMKLSAqIG1vZGVsIGJ5IG1lYW5zIG9mIGEgY29udGVudCBwcm92aWRlciB3aGljaCBtdXN0IGltcGxlbWVudCB0aGUKLSAqIDxjb2RlPklNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcjwvY29kZT4gaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIG1heSB3aXNoIHRvIHVzZSB0aGUgc3RhbmRhcmQgY29uY3JldGUgc3ViY2xhc3MgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPiwKLSAqIG9yIGRlZmluZSB0aGVpciBvd24gc3ViY2xhc3MuCi0gKiAKLSAqIEBzZWUgSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyCi0gKiBAc2VlIFRleHRNZXJnZVZpZXdlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudE1lcmdlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlcgotCQkJCQlpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyLCBJU2F2YWJsZSB7Ci0JCi0JY2xhc3MgU2F2ZUFjdGlvbiBleHRlbmRzIE1lcmdlVmlld2VyQWN0aW9uIHsKLQkJCQkKLQkJU2F2ZUFjdGlvbihib29sZWFuIGxlZnQpIHsKLQkJCXN1cGVyKHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCQlVdGlsaXRpZXMuaW5pdEFjdGlvbih0aGlzLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCAiYWN0aW9uLnNhdmUuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXNhdmVDb250ZW50KGdldElucHV0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByb3BlcnR5IG5hbWVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTkNFU1RPUl9FTkFCTEVEPSBDb21wYXJlUHJlZmVyZW5jZVBhZ2UuSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORTsJCi0JCi0JLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUw9IDE7Ci0JLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFZFUlRJQ0FMPSAyOwotCQotCXN0YXRpYyBmaW5hbCBkb3VibGUgSFNQTElUPSAwLjU7Ci0Jc3RhdGljIGZpbmFsIGRvdWJsZSBWU1BMSVQ9IDAuMzsKLQkKLQlwcml2YXRlIGNsYXNzIENvbnRlbnRNZXJnZVZpZXdlckxheW91dCBleHRlbmRzIExheW91dCB7Ci0JCQotCQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGMsIGludCB3LCBpbnQgaCwgYm9vbGVhbiBmb3JjZSkgewotCQkJcmV0dXJuIG5ldyBQb2ludCgxMDAsIDEwMCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZvcmNlKSB7Ci0JCQkKLQkJCS8vIGRldGVybWluZSBzb21lIGRlcml2ZWQgc2l6ZXMKLQkJCWludCBoZWFkZXJIZWlnaHQ9IGZMZWZ0TGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS55OwotCQkJUmVjdGFuZ2xlIHI9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkKLQkJCWludCBjZW50ZXJXaWR0aD0gZ2V0Q2VudGVyV2lkdGgoKTsJCi0JCQlpbnQgd2lkdGgxPSAoaW50KSgoci53aWR0aC1jZW50ZXJXaWR0aCkqZkhTcGxpdCk7Ci0JCQlpbnQgd2lkdGgyPSByLndpZHRoLXdpZHRoMS1jZW50ZXJXaWR0aDsKLQkJCQotCQkJaW50IGhlaWdodDE9IDA7Ci0JCQlpbnQgaGVpZ2h0Mj0gMDsKLQkJCWlmIChmQW5jZXN0b3JFbmFibGVkICYmIGZTaG93QW5jZXN0b3IpIHsKLQkJCQloZWlnaHQxPSAoaW50KSgoci5oZWlnaHQtKDIqaGVhZGVySGVpZ2h0KSkqZlZTcGxpdCk7Ci0JCQkJaGVpZ2h0Mj0gci5oZWlnaHQtKDIqaGVhZGVySGVpZ2h0KS1oZWlnaHQxOwotCQkJfSBlbHNlIHsKLQkJCQloZWlnaHQxPSAwOwotCQkJCWhlaWdodDI9IHIuaGVpZ2h0LWhlYWRlckhlaWdodDsKLQkJCX0JCQotCQkJCQkJCQotCQkJaW50IHk9IDA7Ci0JCQkKLQkJCWlmIChmQW5jZXN0b3JFbmFibGVkICYmIGZTaG93QW5jZXN0b3IpIHsKLQkJCQlmQW5jZXN0b3JMYWJlbC5zZXRCb3VuZHMoMCwgeSwgci53aWR0aCwgaGVhZGVySGVpZ2h0KTsKLQkJCQlmQW5jZXN0b3JMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCXkrPSBoZWFkZXJIZWlnaHQ7Ci0JCQkJaGFuZGxlUmVzaXplQW5jZXN0b3IoMCwgeSwgci53aWR0aCwgaGVpZ2h0MSk7Ci0JCQkJeSs9IGhlaWdodDE7Ci0JCQl9IGVsc2UgewotCQkJCWZBbmNlc3RvckxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCWhhbmRsZVJlc2l6ZUFuY2VzdG9yKDAsIDAsIDAsIDApOwotCQkJfQotCQkJCi0JCQlmTGVmdExhYmVsLmdldFNpemUoKTsJLy8gd2l0aG91dCB0aGlzIHJlc2l6aW5nIHdvdWxkIG5vdCBhbHdheXMgd29yawotCQkJCi0JCQlpZiAoY2VudGVyV2lkdGggPiAzKSB7Ci0JCQkJZkxlZnRMYWJlbC5zZXRCb3VuZHMoMCwgeSwgd2lkdGgxKzEsIGhlYWRlckhlaWdodCk7Ci0JCQkJZkRpcmVjdGlvbkxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJZkRpcmVjdGlvbkxhYmVsLnNldEJvdW5kcyh3aWR0aDErMSwgeSwgY2VudGVyV2lkdGgtMSwgaGVhZGVySGVpZ2h0KTsKLQkJCQlmUmlnaHRMYWJlbC5zZXRCb3VuZHMod2lkdGgxK2NlbnRlcldpZHRoLCB5LCB3aWR0aDIsIGhlYWRlckhlaWdodCk7Ci0JCQl9IGVsc2UgewotCQkJCWZMZWZ0TGFiZWwuc2V0Qm91bmRzKDAsIHksIHdpZHRoMSwgaGVhZGVySGVpZ2h0KTsKLQkJCQlmRGlyZWN0aW9uTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJZlJpZ2h0TGFiZWwuc2V0Qm91bmRzKHdpZHRoMSwgeSwgci53aWR0aC13aWR0aDEsIGhlYWRlckhlaWdodCk7Ci0JCQl9Ci0JCQkKLQkJCXkrPSBoZWFkZXJIZWlnaHQ7Ci0JCQkKLQkJCWlmIChmQ2VudGVyICE9IG51bGwgJiYgIWZDZW50ZXIuaXNEaXNwb3NlZCgpKQotCQkJCWZDZW50ZXIuc2V0Qm91bmRzKHdpZHRoMSwgeSwgY2VudGVyV2lkdGgsIGhlaWdodDIpOwotCQkJCQkKLQkJCWhhbmRsZVJlc2l6ZUxlZnRSaWdodCgwLCB5LCB3aWR0aDEsIGNlbnRlcldpZHRoLCB3aWR0aDIsIGhlaWdodDIpOwotCQl9Ci0JfQotCi0JY2xhc3MgUmVzaXplciBleHRlbmRzIE1vdXNlQWRhcHRlciBpbXBsZW1lbnRzIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkJCQkKLQkJQ29udHJvbCBmQ29udHJvbDsKLQkJaW50IGZYLCBmWTsKLQkJaW50IGZXaWR0aDEsIGZXaWR0aDI7Ci0JCWludCBmSGVpZ2h0MSwgZkhlaWdodDI7Ci0JCWludCBmRGlyZWN0aW9uOwotCQlib29sZWFuIGZMaXZlUmVzaXplOwotCQlib29sZWFuIGZJc0Rvd247Ci0JCQotCQlwdWJsaWMgUmVzaXplcihDb250cm9sIGMsIGludCBkaXIpIHsKLQkJCWZEaXJlY3Rpb249IGRpcjsKLQkJCWZDb250cm9sPSBjOwotCQkJZkxpdmVSZXNpemU9ICEoZkNvbnRyb2wgaW5zdGFuY2VvZiBTYXNoKTsKLQkJCXVwZGF0ZUN1cnNvcihjLCBkaXIpOwotCQkJZkNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZDb250cm9sLmFkZE1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJZkNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJCQlmQ29udHJvbD0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCQkKLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCWlmICgoZkRpcmVjdGlvbiAmIEhPUklaT05UQUwpICE9IDApCi0JCQkJZkhTcGxpdD0gSFNQTElUOwotCQkJaWYgKChmRGlyZWN0aW9uICYgVkVSVElDQUwpICE9IDApCi0JCQkJZlZTcGxpdD0gVlNQTElUOwotCQkJZkNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCUNvbXBvc2l0ZSBwYXJlbnQ9IGZDb250cm9sLmdldFBhcmVudCgpOwotCQkJCi0JCQlQb2ludCBzPSBwYXJlbnQuZ2V0U2l6ZSgpOwotCQkJUG9pbnQgYXM9IGZBbmNlc3RvckxhYmVsLmdldFNpemUoKTsKLQkJCVBvaW50IHlzPSBmTGVmdExhYmVsLmdldFNpemUoKTsKLQkJCVBvaW50IG1zPSBmUmlnaHRMYWJlbC5nZXRTaXplKCk7Ci0JCQkKLQkJCWZXaWR0aDE9IHlzLng7Ci0JCQlmV2lkdGgyPSBtcy54OwotCQkJZkhlaWdodDE9IGZMZWZ0TGFiZWwuZ2V0TG9jYXRpb24oKS55LWFzLnk7Ci0JCQlmSGVpZ2h0Mj0gcy55LShmTGVmdExhYmVsLmdldExvY2F0aW9uKCkueSt5cy55KTsKLQkJCQotCQkJZlg9IGUueDsKLQkJCWZZPSBlLnk7Ci0JCQlmSXNEb3duPSB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJZklzRG93bj0gZmFsc2U7Ci0JCQlpZiAoIWZMaXZlUmVzaXplKQotCQkJCXJlc2l6ZShlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGZJc0Rvd24gJiYgZkxpdmVSZXNpemUpCi0JCQkJcmVzaXplKGUpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcmVzaXplKE1vdXNlRXZlbnQgZSkgewotCQkJaW50IGR4PSBlLngtZlg7Ci0JCQlpbnQgZHk9IGUueS1mWTsKLQkJCi0JCQlpbnQgY2VudGVyV2lkdGg9IGZDZW50ZXIuZ2V0U2l6ZSgpLng7Ci0KLQkJCWlmIChmV2lkdGgxICsgZHggPiBjZW50ZXJXaWR0aCAmJiBmV2lkdGgyIC0gZHggPiBjZW50ZXJXaWR0aCkgewotCQkJCWZXaWR0aDErPSBkeDsKLQkJCQlmV2lkdGgyLT0gZHg7Ci0JCQkJaWYgKChmRGlyZWN0aW9uICYgSE9SSVpPTlRBTCkgIT0gMCkKLQkJCQkJZkhTcGxpdD0gKGRvdWJsZSlmV2lkdGgxLyhkb3VibGUpKGZXaWR0aDErZldpZHRoMik7Ci0JCQl9Ci0JCQlpZiAoZkhlaWdodDEgKyBkeSA+IGNlbnRlcldpZHRoICYmIGZIZWlnaHQyIC0gZHkgPiBjZW50ZXJXaWR0aCkgewotCQkJCWZIZWlnaHQxKz0gZHk7Ci0JCQkJZkhlaWdodDItPSBkeTsKLQkJCQlpZiAoKGZEaXJlY3Rpb24gJiBWRVJUSUNBTCkgIT0gMCkKLQkJCQkJZlZTcGxpdD0gKGRvdWJsZSlmSGVpZ2h0MS8oZG91YmxlKShmSGVpZ2h0MStmSGVpZ2h0Mik7Ci0JCQl9Ci0KLQkJCWZDb21wb3NpdGUubGF5b3V0KHRydWUpOwotCQkJZkNvbnRyb2wuZ2V0RGlzcGxheSgpLnVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqIFN0eWxlIGJpdHMgZm9yIHRvcCBsZXZlbCBjb21wb3NpdGUgKi8KLQlwcml2YXRlIGludCBmU3R5bGVzOwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZkJ1bmRsZTsKLQlwcml2YXRlIENvbXBhcmVDb25maWd1cmF0aW9uIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyIGZDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcjsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJMaXN0OwotCWJvb2xlYW4gZkNvbmZpcm1TYXZlPSB0cnVlOwotCQotCXByaXZhdGUgZG91YmxlIGZIU3BsaXQ9IEhTUExJVDsJCS8vIHdpZHRoIHJhdGlvIG9mIGxlZnQgYW5kIHJpZ2h0IHBhbmVzCi0JcHJpdmF0ZSBkb3VibGUgZlZTcGxpdD0gVlNQTElUOwkJLy8gaGVpZ2h0IHJhdGlvIG9mIGFuY2VzdG9yIGFuZCBib3R0b20gcGFuZXMKLQkKLQlwcml2YXRlIGJvb2xlYW4gZkFuY2VzdG9yRW5hYmxlZD0gdHJ1ZTsJLy8gc2hvdyBhbmNlc3RvciBpbiBjYXNlIG9mIGNvbmZsaWN0cwotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiBmU2hvd0FuY2VzdG9yPSBmYWxzZTsJLy8gaWYgY3VycmVudCBpbnB1dCBoYXMgY29uZmxpY3RzCi0JcHJpdmF0ZSBib29sZWFuIGZJc1RocmVlV2F5PSBmYWxzZTsKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZkFuY2VzdG9ySXRlbTsKLQkKLQlwcml2YXRlIEFjdGlvbiBmQ29weUxlZnRUb1JpZ2h0QWN0aW9uOwkvLyBjb3B5IGZyb20gbGVmdCB0byByaWdodAotCXByaXZhdGUgQWN0aW9uIGZDb3B5UmlnaHRUb0xlZnRBY3Rpb247CS8vIGNvcHkgZnJvbSByaWdodCB0byBsZWZ0Ci0KLQlNZXJnZVZpZXdlckFjdGlvbiBmTGVmdFNhdmVBY3Rpb247Ci0JTWVyZ2VWaWV3ZXJBY3Rpb24gZlJpZ2h0U2F2ZUFjdGlvbjsKLQkKLQlwcml2YXRlIElLZXlCaW5kaW5nU2VydmljZSBmS2V5QmluZGluZ1NlcnZpY2U7Ci0KLQkvLyBTV1Qgd2lkZ2V0cwotCS8qIHBhY2thZ2UgKi8gQ29tcG9zaXRlIGZDb21wb3NpdGU7Ci0JcHJpdmF0ZSBDTGFiZWwgZkFuY2VzdG9yTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgZkxlZnRMYWJlbDsKLQlwcml2YXRlIENMYWJlbCBmUmlnaHRMYWJlbDsKLQkvKiBwYWNrYWdlICovIENMYWJlbCBmRGlyZWN0aW9uTGFiZWw7Ci0JLyogcGFja2FnZSAqLyBDb250cm9sIGZDZW50ZXI7Ci0JCQotCS8vLS0tLSBTV1QgcmVzb3VyY2VzIHRvIGJlIGRpc3Bvc2VkCi0JcHJpdmF0ZSBJbWFnZSBmUmlnaHRBcnJvdzsKLQlwcml2YXRlIEltYWdlIGZMZWZ0QXJyb3c7Ci0JcHJpdmF0ZSBJbWFnZSBmQm90aEFycm93OwotCUN1cnNvciBmTm9ybWFsQ3Vyc29yOwotCXByaXZhdGUgQ3Vyc29yIGZIU2FzaEN1cnNvcjsKLQlwcml2YXRlIEN1cnNvciBmVlNhc2hDdXJzb3I7Ci0JcHJpdmF0ZSBDdXJzb3IgZkhWU2FzaEN1cnNvcjsKLQotCS8vLS0tLSBlbmQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgbWVyZ2Ugdmlld2VyIGFuZCBpbml0aWFsaXplcyB3aXRoIGEgcmVzb3VyY2UgYnVuZGxlIGFuZCBhCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGUgU1dUIHN0eWxlIGJpdHMKLQkgKiBAcGFyYW0gYnVuZGxlIHRoZSByZXNvdXJjZSBidW5kbGUKLQkgKiBAcGFyYW0gY2MgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRNZXJnZVZpZXdlcihpbnQgc3R5bGUsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MpIHsKLQkJZlN0eWxlcz0gc3R5bGU7Ci0JCWZCdW5kbGU9IGJ1bmRsZTsKLQkJCi0JCWZBbmNlc3RvckVuYWJsZWQ9IFV0aWxpdGllcy5nZXRCb29sZWFuKGNjLCBBTkNFU1RPUl9FTkFCTEVELCBmQW5jZXN0b3JFbmFibGVkKTsKLQkJZkNvbmZpcm1TYXZlPSBVdGlsaXRpZXMuZ2V0Qm9vbGVhbihjYywgQ29tcGFyZUVkaXRvci5DT05GSVJNX1NBVkVfUFJPUEVSVFksIGZDb25maXJtU2F2ZSk7Ci0KLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcihjYykpOwotCQkKLQkJZkNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyPSBuZXcgSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tcGFyZUlucHV0Q2hhbmdlZChJQ29tcGFyZUlucHV0IGlucHV0KSB7Ci0JCQkJQ29udGVudE1lcmdlVmlld2VyLnRoaXMuaW50ZXJuYWxSZWZyZXNoKGlucHV0KTsKLQkJCX0KLQkJfTsKLQkJCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbj0gY2M7Ci0JCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUNvbnRlbnRNZXJnZVZpZXdlci50aGlzLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCQkKLQkJZkxlZnRTYXZlQWN0aW9uPSBuZXcgU2F2ZUFjdGlvbih0cnVlKTsKLQkJZkxlZnRTYXZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmUmlnaHRTYXZlQWN0aW9uPSBuZXcgU2F2ZUFjdGlvbihmYWxzZSk7Ci0JCWZSaWdodFNhdmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCQotCS8vLS0tLSBob29rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2aWV3ZXIncyBuYW1lLgotCSAqCi0JICogQHJldHVybiB0aGUgdmlld2VyJ3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBVdGlsaXRpZXMuZ2V0U3RyaW5nKGdldFJlc291cmNlQnVuZGxlKCksICJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhlIGFuY2VzdG9yLCBsZWZ0LCBhbmQgcmlnaHQKLQkgKiBjb250ZW50IGFyZWFzIG9mIHRoaXMgY29tcGFyZSB2aWV3ZXIuCi0JICogSW1wbGVtZW50YXRpb25zIHR5cGljYWxseSBob2xkIG9udG8gdGhlIGNvbnRyb2xzCi0JICogc28gdGhhdCB0aGV5IGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnB1dCBvYmplY3RzIGluIG1ldGhvZAotCSAqIDxjb2RlPnVwZGF0ZUNvbnRlbnQ8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgY29udGFpbmVyIGZvciB0aGUgdGhyZWUgYXJlYXMKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotCS8qKgotCSAqIExheXMgb3V0IHRoZSBhbmNlc3RvciBhcmVhIG9mIHRoZSBjb21wYXJlIHZpZXdlci4KLQkgKiBJdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHZpZXdlciBpcyByZXNpemVkIG9yIHdoZW4gdGhlIHNhc2hlcyBiZXR3ZWVuCi0JICogdGhlIGFyZWFzIGFyZSBtb3ZlZCB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGFyZWFzLgotCSAqCi0JICogQHBhcmFtIHggdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGFuY2VzdG9yIGFyZWEgd2l0aGluIGl0cyBjb250YWluZXIKLQkgKiBAcGFyYW0geSB0aGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGFuY2VzdG9yIGFyZWEgd2l0aGluIGl0cyBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBhbmNlc3RvciBhcmVhCi0JICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBhbmNlc3RvciBhcmVhCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzaXplQW5jZXN0b3IoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCQotCS8qKgotCSAqIExheXMgb3V0IHRoZSBsZWZ0IGFuZCByaWdodCBhcmVhcyBvZiB0aGUgY29tcGFyZSB2aWV3ZXIuCi0JICogSXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSB2aWV3ZXIgaXMgcmVzaXplZCBvciB3aGVuIHRoZSBzYXNoZXMgYmV0d2VlbgotCSAqIHRoZSBhcmVhcyBhcmUgbW92ZWQgdG8gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBhcmVhcy4KLQkgKgotCSAqIEBwYXJhbSB4IHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBsZWZ0IGFyZWEgd2l0aGluIGl0cyBjb250YWluZXIKLQkgKiBAcGFyYW0geSB0aGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGFyZWEgd2l0aGluIGl0cyBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgbGVmdCBhcmVhCi0JICogQHBhcmFtIGNlbnRlcldpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZ2FwIGJldHdlZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGFyZWFzCi0JICogQHBhcmFtIHJpZ2h0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSByaWdodCBhcmVhCi0JICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWZ0IGFuZCByaWdodCBhcmVhcwotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc2l6ZUxlZnRSaWdodChpbnQgeCwgaW50IHksIGludCBsZWZ0V2lkdGgsIGludCBjZW50ZXJXaWR0aCwKLQkJCWludCByaWdodFdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotCS8qKgotCSAqIENvbnRyaWJ1dGVzIGl0ZW1zIHRvIHRoZSBnaXZlbiA8Y29kZT5Ub29sQmFyTWFuYWdlcjwvY29kZT4uCi0JICogSXQgaXMgY2FsbGVkIHdoZW4gdGhpcyB2aWV3ZXIgaXMgaW5zdGFsbGVkIGluIGl0cyBjb250YWluZXIgYW5kIGlmIHRoZSBjb250YWluZXIKLQkgKiBoYXMgYSA8Y29kZT5Ub29sQmFyTWFuYWdlcjwvY29kZT4uCi0JICogVGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqCi0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyIHRoZSB0b29sYmFyIG1hbmFnZXIgdG8gY29udHJpYnV0ZSB0bwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRvb2xJdGVtcyhUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQkvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyBvZiB0aGUgdGhyZWUgY29udGVudCBhcmVhcyB3aXRoIHRoZSBnaXZlbiBpbnB1dCBvYmplY3RzLgotCSAqCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBpbnB1dCBmb3IgdGhlIGFuY2VzdG9yIGFyZWEKLQkgKiBAcGFyYW0gbGVmdCB0aGUgaW5wdXQgZm9yIHRoZSBsZWZ0IGFyZWEKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIGlucHV0IGZvciB0aGUgcmlnaHQgYXJlYQotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnQoT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KTsKLQkJCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIG9uZSBzaWRlIHRvIHRoZSBvdGhlciBzaWRlLgotCSAqIENhbGxlZCBmcm9tIHRoZSAoaW50ZXJuYWwpIGFjdGlvbnMgZm9yIGNvcHlpbmcgdGhlIHNpZGVzIG9mIHRoZSB2aWV3ZXIncyBpbnB1dCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGxlZnRUb1JpZ2h0IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgbGVmdCBzaWRlIGlzIGNvcGllZCB0byB0aGUgcmlnaHQgc2lkZTsKLQkgKiBpZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSByaWdodCBzaWRlIGlzIGNvcGllZCB0byB0aGUgbGVmdCBzaWRlCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgY29weShib29sZWFuIGxlZnRUb1JpZ2h0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ5dGUgY29udGVudHMgb2YgdGhlIGxlZnQgb3IgcmlnaHQgc2lkZS4gSWYgdGhlIHZpZXdlcgotCSAqIGhhcyBubyBlZGl0YWJsZSBjb250ZW50IDxjb2RlPm51bGw8L2NvZGU+IGNhbiBiZSByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBsZWZ0IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgYnl0ZSBjb250ZW50cyBvZiB0aGUgbGVmdCBhcmVhIGlzIHJldHVybmVkOwotCSAqIAlpZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBieXRlIGNvbnRlbnRzIG9mIHRoZSByaWdodCBhcmVhCi0JICogQHJldHVybiB0aGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBieXRlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgYnl0ZVtdIGdldENvbnRlbnRzKGJvb2xlYW4gbGVmdCk7Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgb2YgdGhpcyB2aWV3ZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiBmQnVuZGxlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyB2aWV3ZXIsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB2aWV3ZXIgZG9lcyBub3QgeWV0IGhhdmUgYSBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHJldHVybiB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIENvbXBhcmVDb25maWd1cmF0aW9uIGdldENvbXBhcmVDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotCSAqIDxjb2RlPkNvbnRlbnRWaWV3ZXI8L2NvZGU+IG1ldGhvZAotCSAqIGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBwcm92aWRlciBpcyBhbiA8Y29kZT5JTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXI8L2NvZGU+LgotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIgdGhlIGNvbnRlbnRwcm92aWRlciB0byBzZXQuIE11c3QgaW1wbGVtZW50IElNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCUFzc2VydC5pc1RydWUoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJc3VwZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyogcGFja2FnZSAqLyBJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotCSAqIDxjb2RlPlZpZXdlcjwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGVtcHR5IHNlbGVjdGlvbi4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogQHJldHVybiBlbXB0eSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb24oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKgotCSAqIFRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0JICogPGNvZGU+Vmlld2VyPC9jb2RlPiBtZXRob2QgZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKSB7Ci0JCS8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0JfQotCi0JLyogcGFja2FnZSAqLyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCi0JCVN0cmluZyBrZXk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLQkJaWYgKGtleS5lcXVhbHMoQU5DRVNUT1JfRU5BQkxFRCkpIHsKLQkJCWZBbmNlc3RvckVuYWJsZWQ9IFV0aWxpdGllcy5nZXRCb29sZWFuKGdldENvbXBhcmVDb25maWd1cmF0aW9uKCksIEFOQ0VTVE9SX0VOQUJMRUQsIGZBbmNlc3RvckVuYWJsZWQpOwotCQkJZkNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JCQkKLQkJCXVwZGF0ZUN1cnNvcihmTGVmdExhYmVsLCBWRVJUSUNBTCk7Ci0JCQl1cGRhdGVDdXJzb3IoZkRpcmVjdGlvbkxhYmVsLCBIT1JJWk9OVEFMIHwgVkVSVElDQUwpOwotCQkJdXBkYXRlQ3Vyc29yKGZSaWdodExhYmVsLCBWRVJUSUNBTCk7Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQl2b2lkIHVwZGF0ZUN1cnNvcihDb250cm9sIGMsIGludCBkaXIpIHsKLQkJaWYgKCEoYyBpbnN0YW5jZW9mIFNhc2gpKSB7Ci0JCQlDdXJzb3IgY3Vyc29yPSBudWxsOwotCQkJc3dpdGNoIChkaXIpIHsKLQkJCWNhc2UgVkVSVElDQUw6Ci0JCQkJaWYgKGZBbmNlc3RvckVuYWJsZWQpIHsKLQkJCQkJaWYgKGZWU2FzaEN1cnNvciA9PSBudWxsKSBmVlNhc2hDdXJzb3I9IG5ldyBDdXJzb3IoYy5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfU0laRU5TKTsKLQkJCQkJY3Vyc29yPSBmVlNhc2hDdXJzb3I7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGZOb3JtYWxDdXJzb3IgPT0gbnVsbCkgZk5vcm1hbEN1cnNvcj0gbmV3IEN1cnNvcihjLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9BUlJPVyk7Ci0JCQkJCWN1cnNvcj0gZk5vcm1hbEN1cnNvcjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhPUklaT05UQUw6Ci0JCQkJaWYgKGZIU2FzaEN1cnNvciA9PSBudWxsKSBmSFNhc2hDdXJzb3I9IG5ldyBDdXJzb3IoYy5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfU0laRVdFKTsKLQkJCQljdXJzb3I9IGZIU2FzaEN1cnNvcjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVkVSVElDQUwgKyBIT1JJWk9OVEFMOgotCQkJCWlmIChmQW5jZXN0b3JFbmFibGVkKSB7Ci0JCQkJCWlmIChmSFZTYXNoQ3Vyc29yID09IG51bGwpIGZIVlNhc2hDdXJzb3I9IG5ldyBDdXJzb3IoYy5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfU0laRUFMTCk7Ci0JCQkJCWN1cnNvcj0gZkhWU2FzaEN1cnNvcjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZkhTYXNoQ3Vyc29yID09IG51bGwpIGZIU2FzaEN1cnNvcj0gbmV3IEN1cnNvcihjLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCQkJCQljdXJzb3I9IGZIU2FzaEN1cnNvcjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY3Vyc29yICE9IG51bGwpCi0JCQkJYy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJfQotCX0KLQotCXZvaWQgc2V0QW5jZXN0b3JWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChmQW5jZXN0b3JJdGVtICE9IG51bGwpIHsKLQkJCUFjdGlvbiBhY3Rpb249IChBY3Rpb24pIGZBbmNlc3Rvckl0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCQlhY3Rpb24uc2V0Q2hlY2tlZCh2aXNpYmxlKTsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCX0KLQkJfQotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQU5DRVNUT1JfRU5BQkxFRCwgbmV3IEJvb2xlYW4odmlzaWJsZSkpOwotCX0KLQotCS8vLS0tLSBpbnB1dAotCQkJIAotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1RocmVlV2F5KCkgewotCQlyZXR1cm4gZklzVGhyZWVXYXk7Ci0JfQotCQotCS8qKgotCSAqIEludGVybmFsIGhvb2sgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBpbnB1dCB0byB0aGlzIHZpZXdlciBpcwotCSAqIGluaXRpYWxseSBzZXQgb3Igc3Vic2VxdWVudGx5IGNoYW5nZWQuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5WaWV3ZXI8L2NvZGU+Ci0JICogbWV0aG9kIHRyaWVzIHRvIHNhdmUgdGhlIG9sZCBpbnB1dCBieSBjYWxsaW5nIDxjb2RlPmRvU2F2ZSguLi4pPC9jb2RlPiBhbmQKLQkgKiB0aGVuIGNhbGxzIDxjb2RlPmludGVybmFsUmVmcmVzaCguLi4pPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgbmV3IGlucHV0IG9mIHRoaXMgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBuZXcgaW5wdXQKLQkgKiBAcGFyYW0gb2xkSW5wdXQgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgcHJldmlvdXNseSBubyBpbnB1dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgaW5wdXQsIE9iamVjdCBvbGRJbnB1dCkgewotCQkKLQkJaWYgKGlucHV0ICE9IG9sZElucHV0KQotCQkJaWYgKG9sZElucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkoKElDb21wYXJlSW5wdXQpb2xkSW5wdXQpLnJlbW92ZUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKGZDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlib29sZWFuIHN1Y2Nlc3M9IGRvU2F2ZShpbnB1dCwgb2xkSW5wdXQpOwotCQkKLQkJaWYgKGlucHV0ICE9IG9sZElucHV0KQotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkoKElDb21wYXJlSW5wdXQpaW5wdXQpLmFkZENvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKGZDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlpZiAoc3VjY2VzcykgewotCQkJc2V0TGVmdERpcnR5KGZhbHNlKTsKLQkJCXNldFJpZ2h0RGlydHkoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKGlucHV0ICE9IG9sZElucHV0KQotCQkJaW50ZXJuYWxSZWZyZXNoKGlucHV0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIDxjb2RlPlZpZXdlcjwvY29kZT4gbWV0aG9kIDxjb2RlPmlucHV0Q2hhbmdlZDwvY29kZT4KLQkgKiB0byBzYXZlIGFueSB1bnNhdmVkIGNoYW5nZXMgb2YgdGhlIG9sZCBpbnB1dC4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICogbWV0aG9kIGNhbGxzIDxjb2RlPnNhdmVDb250ZW50KC4uLik8L2NvZGU+LiBJZiBjb25maXJtYXRpb24gaGFzIGJlZW4gdHVybmVkIG9uCi0JICogd2l0aCA8Y29kZT5zZXRDb25maXJtU2F2ZSh0cnVlKTwvY29kZT4sIGEgY29uZmlybWF0aW9uIGFsZXJ0IGlzIHBvc3RlZCBiZWZvcmUgc2F2aW5nLgotCSAqIDwvcD4KLQkgKiBDbGllbnRzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYXJlIGZyZWUgdG8gZGVjaWRlIHdoZXRoZXIKLQkgKiB0aGV5IHdhbnQgdG8gY2FsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKiBAcGFyYW0gbmV3SW5wdXQgdGhlIG5ldyBpbnB1dCBvZiB0aGlzIHZpZXdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gbmV3IGlucHV0Ci0JICogQHBhcmFtIG9sZElucHV0IHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2FzIHByZXZpb3VzbHkgbm8gaW5wdXQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNhdmluZyB3YXMgc3VjY2Vzc2Z1bCwgb3IgaWYgdGhlIHVzZXIgZGlkbid0IHdhbnQgdG8gc2F2ZSAoYnkgcHJlc3NpbmcgJ05PJyBpbiB0aGUgY29uZmlybWF0aW9uIGRpYWxvZykuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRvU2F2ZShPYmplY3QgbmV3SW5wdXQsIE9iamVjdCBvbGRJbnB1dCkgewotCQkKLQkJLy8gYmVmb3JlIHNldHRpbmcgdGhlIG5ldyBpbnB1dCB3ZSBoYXZlIHRvIHNhdmUgdGhlIG9sZAotCQlpZiAoZkxlZnRTYXZlQWN0aW9uLmlzRW5hYmxlZCgpIHx8IGZSaWdodFNhdmVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQotCQkJLy8gcG9zdCBhbGVydAotCQkJaWYgKGZDb25maXJtU2F2ZSkgewotCQkJCVNoZWxsIHNoZWxsPSBmQ29tcG9zaXRlLmdldFNoZWxsKCk7Ci0JCQkJCi0JCQkJTWVzc2FnZURpYWxvZyBkaWFsb2c9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLAotCQkJCQlVdGlsaXRpZXMuZ2V0U3RyaW5nKGdldFJlc291cmNlQnVuZGxlKCksICJzYXZlRGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgCS8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgotCQkJCQlVdGlsaXRpZXMuZ2V0U3RyaW5nKGdldFJlc291cmNlQnVuZGxlKCksICJzYXZlRGlhbG9nLm1lc3NhZ2UiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotCQkJCQl9LAotCQkJCQkwKTsJCS8vIGRlZmF1bHQgYnV0dG9uIGluZGV4Ci0JCQkJCQkJCQkKLQkJCQlzd2l0Y2ggKGRpYWxvZy5vcGVuKCkpIHsJLy8gb3BlbiByZXR1cm5zIGluZGV4IG9mIHByZXNzZWQgYnV0dG9uCi0JCQkJY2FzZSAwOgotCQkJCQlzYXZlQ29udGVudChvbGRJbnB1dCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJc2V0TGVmdERpcnR5KGZhbHNlKTsKLQkJCQkJc2V0UmlnaHREaXJ0eShmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJdGhyb3cgbmV3IFZpZXdlclN3aXRjaGluZ0NhbmNlbGxlZCgpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXNhdmVDb250ZW50KG9sZElucHV0KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8qKgotCSAqIENvbnRyb2xzIHdoZXRoZXIgPGNvZGU+ZG9TYXZlKE9iamVjdCwgT2JqZWN0KTwvY29kZT4gYXNrcyBmb3IgY29uZmlybWF0aW9uIGJlZm9yZSBzYXZpbmcKLQkgKiB0aGUgb2xkIGlucHV0IHdpdGggPGNvZGU+c2F2ZUNvbnRlbnQoT2JqZWN0KTwvY29kZT4uCi0JICogQHBhcmFtIGVuYWJsZSBhIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGVuYWJsZXMgY29uZmlybWF0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpcm1TYXZlKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWZDb25maXJtU2F2ZT0gZW5hYmxlOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIFZpZXdlci5yZWZyZXNoCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaW50ZXJuYWxSZWZyZXNoKGdldElucHV0KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWZyZXNoKE9iamVjdCBpbnB1dCkgewotCQkKLQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNvbnRlbnQ9IGdldE1lcmdlQ29udGVudFByb3ZpZGVyKCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCU9iamVjdCBhbmNlc3Rvcj0gY29udGVudC5nZXRBbmNlc3RvckNvbnRlbnQoaW5wdXQpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkJCi0JCQkJZklzVGhyZWVXYXk9ICgoKElDb21wYXJlSW5wdXQpaW5wdXQpLmdldEtpbmQoKSAmIERpZmZlcmVuY2VyLkRJUkVDVElPTl9NQVNLKSAhPSAwOwotCQkJZWxzZQotCQkJCWZJc1RocmVlV2F5PSBhbmNlc3RvciAhPSBudWxsOwotCQkJCQotCQkJaWYgKGZBbmNlc3Rvckl0ZW0gIT0gbnVsbCkKLQkJCQlmQW5jZXN0b3JJdGVtLnNldFZpc2libGUoZklzVGhyZWVXYXkpOwotCQkJCQotCQkJYm9vbGVhbiBvbGRGbGFnPSBmU2hvd0FuY2VzdG9yOwotCQkJZlNob3dBbmNlc3Rvcj0gZklzVGhyZWVXYXkgJiYgY29udGVudC5zaG93QW5jZXN0b3IoaW5wdXQpOwotCQkJCi0JCQlpZiAoZkFuY2VzdG9yRW5hYmxlZCAmJiBvbGRGbGFnICE9IGZTaG93QW5jZXN0b3IpCi0JCQkJZkNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JCQkKLQkJCVRvb2xCYXJNYW5hZ2VyIHRibT0gQ29tcGFyZVZpZXdlclBhbmUuZ2V0VG9vbEJhck1hbmFnZXIoZkNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0JCQlpZiAodGJtICE9IG51bGwpIHsKLQkJCQl1cGRhdGVUb29sSXRlbXMoKTsKLQkJCQl0Ym0udXBkYXRlKHRydWUpOwotCQkJCXRibS5nZXRDb250cm9sKCkuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkJfQotCQkJCi0JCQl1cGRhdGVIZWFkZXIoKTsKLQkJCQkJCQkJCQotCQkJT2JqZWN0IGxlZnQ9IGNvbnRlbnQuZ2V0TGVmdENvbnRlbnQoaW5wdXQpOwotCQkJT2JqZWN0IHJpZ2h0PSBjb250ZW50LmdldFJpZ2h0Q29udGVudChpbnB1dCk7Ci0JCQl1cGRhdGVDb250ZW50KGFuY2VzdG9yLCBsZWZ0LCByaWdodCk7Ci0JCX0KLQl9Ci0JCi0JLy8tLS0tIGxheW91dCAmIFNXVCBjb250cm9sIGNyZWF0aW9uCi0JCQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGUgdGhyZWUgYXJlYXMgb2YgYSBjb21wYXJlL21lcmdlIHZpZXdlci4KLQkgKiA8cD4KLQkgKiBDYWxscyB0aGUgaG9va3MgPGNvZGU+Y3JlYXRlQ29udHJvbHM8L2NvZGU+IGFuZCA8Y29kZT5jcmVhdGVUb29sSXRlbXM8L2NvZGU+Ci0JICogdG8gbGV0IHN1YmNsYXNzZXMgYnVpbGQgdGhlIHNwZWNpZmljIGNvbnRlbnQgYXJlYXMgYW5kIHRvIGFkZCBpdGVtcyB0bwotCSAqIGFuIGVuY2xvc2luZyB0b29sYmFyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHN1YmNsYXNzZXMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRyb2wgYnVpbGRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJCQkJCQkJCi0JCWZDb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBmU3R5bGVzKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLQkJCQlyZXR1cm4gaW50ZXJuYWxTZXRGb2N1cygpOwotCQkJfQotCQl9OwotCQlmQ29tcG9zaXRlLnNldERhdGEoQ29tcGFyZVVJLkNPTVBBUkVfVklFV0VSX1RJVExFLCBnZXRUaXRsZSgpKTsKLQkJCi0JCWhvb2tDb250cm9sKGZDb21wb3NpdGUpOwkvLyBob29rIGhlbHAgJiBkaXNwb3NlIGxpc3RlbmVyCi0JCQotCQlmQ29tcG9zaXRlLnNldExheW91dChuZXcgQ29udGVudE1lcmdlVmlld2VyTGF5b3V0KCkpOwotCQkKLQkJaW50IHN0eWxlPSBTV1QuU0hBRE9XX09VVDsKLQkJZkFuY2VzdG9yTGFiZWw9IG5ldyBDTGFiZWwoZkNvbXBvc2l0ZSwgc3R5bGUpOwotCQkKLQkJZkxlZnRMYWJlbD0gbmV3IENMYWJlbChmQ29tcG9zaXRlLCBzdHlsZSk7Ci0JCW5ldyBSZXNpemVyKGZMZWZ0TGFiZWwsIFZFUlRJQ0FMKTsKLQkJCi0JCWZEaXJlY3Rpb25MYWJlbD0gbmV3IENMYWJlbChmQ29tcG9zaXRlLCBzdHlsZSk7Ci0JCWZEaXJlY3Rpb25MYWJlbC5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JCW5ldyBSZXNpemVyKGZEaXJlY3Rpb25MYWJlbCwgSE9SSVpPTlRBTCB8IFZFUlRJQ0FMKTsKLQkJCi0JCWZSaWdodExhYmVsPSBuZXcgQ0xhYmVsKGZDb21wb3NpdGUsIHN0eWxlKTsKLQkJbmV3IFJlc2l6ZXIoZlJpZ2h0TGFiZWwsIFZFUlRJQ0FMKTsKLQkJCi0JCWlmIChmQ2VudGVyID09IG51bGwgfHwgZkNlbnRlci5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ2VudGVyPSBjcmVhdGVDZW50ZXIoZkNvbXBvc2l0ZSk7Ci0JCQkJCi0JCWNyZWF0ZUNvbnRyb2xzKGZDb21wb3NpdGUpOwotCQkKLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHBzPSBVdGlsaXRpZXMuZmluZFNpdGUoZkNvbXBvc2l0ZSk7Ci0JCWZLZXlCaW5kaW5nU2VydmljZT0gcHMgIT0gbnVsbCA/IHBzLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkgOiBudWxsOwotCQkJCQkJCi0JCVRvb2xCYXJNYW5hZ2VyIHRibT0gQ29tcGFyZVZpZXdlclBhbmUuZ2V0VG9vbEJhck1hbmFnZXIocGFyZW50KTsKLQkJaWYgKHRibSAhPSBudWxsKSB7Ci0JCQl0Ym0ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCS8vIGRlZmluZSBncm91cHMKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcigibW9kZXMiKSk7CS8vJE5PTi1OTFMtMSQKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcigibWVyZ2UiKSk7CS8vJE5PTi1OTFMtMSQKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcigibmF2aWdhdGlvbiIpKTsJLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYz0gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCQlpZiAoY2MuaXNSaWdodEVkaXRhYmxlKCkpIHsKLQkJCQlmQ29weUxlZnRUb1JpZ2h0QWN0aW9uPQotCQkJCQluZXcgQWN0aW9uKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWNvcHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oZkNvcHlMZWZ0VG9SaWdodEFjdGlvbiwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgImFjdGlvbi5Db3B5TGVmdFRvUmlnaHQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0Ym0uYXBwZW5kVG9Hcm91cCgibWVyZ2UiLCBmQ29weUxlZnRUb1JpZ2h0QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCVV0aWxpdGllcy5yZWdpc3RlckFjdGlvbihmS2V5QmluZGluZ1NlcnZpY2UsIGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24sICJvcmcuZWNsaXBzZS5jb21wYXJlLmNvcHlBbGxMZWZ0VG9SaWdodCIpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWlmIChjYy5pc0xlZnRFZGl0YWJsZSgpKSB7Ci0JCQkJZkNvcHlSaWdodFRvTGVmdEFjdGlvbj0KLQkJCQkJbmV3IEFjdGlvbigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljb3B5KGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCAiYWN0aW9uLkNvcHlSaWdodFRvTGVmdC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRibS5hcHBlbmRUb0dyb3VwKCJtZXJnZSIsIGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJVXRpbGl0aWVzLnJlZ2lzdGVyQWN0aW9uKGZLZXlCaW5kaW5nU2VydmljZSwgZkNvcHlSaWdodFRvTGVmdEFjdGlvbiwgIm9yZy5lY2xpcHNlLmNvbXBhcmUuY29weUFsbFJpZ2h0VG9MZWZ0Iik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJQWN0aW9uIGE9IG5ldyBDaGFuZ2VQcm9wZXJ0eUFjdGlvbihmQnVuZGxlLCBmQ29tcGFyZUNvbmZpZ3VyYXRpb24sICJhY3Rpb24uRW5hYmxlQW5jZXN0b3IuIiwgQU5DRVNUT1JfRU5BQkxFRCk7IC8vJE5PTi1OTFMtMSQKLQkJCWEuc2V0Q2hlY2tlZChmQW5jZXN0b3JFbmFibGVkKTsKLQkJCWZBbmNlc3Rvckl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGEpOwotCQkJZkFuY2VzdG9ySXRlbS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXRibS5hcHBlbmRUb0dyb3VwKCJtb2RlcyIsIGZBbmNlc3Rvckl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWNyZWF0ZVRvb2xJdGVtcyh0Ym0pOwotCQkJdXBkYXRlVG9vbEl0ZW1zKCk7Ci0JCQkKLQkJCXRibS51cGRhdGUodHJ1ZSk7Ci0JCX0KLQkKLQkJcmV0dXJuIGZDb21wb3NpdGU7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpbnRlcm5hbFNldEZvY3VzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gaW50IGdldENlbnRlcldpZHRoKCkgewotCQlyZXR1cm4gMzsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBib29sZWFuIGdldEFuY2VzdG9yRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZBbmNlc3RvckVuYWJsZWQ7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gQ29udHJvbCBjcmVhdGVDZW50ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTYXNoIHNhc2g9IG5ldyBTYXNoKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJbmV3IFJlc2l6ZXIoc2FzaCwgSE9SSVpPTlRBTCk7Ci0JCXJldHVybiBzYXNoOwotCX0KLQkKLQkvKiBwYWNrYWdlICovIENvbnRyb2wgZ2V0Q2VudGVyKCkgewotCQlyZXR1cm4gZkNlbnRlcjsKLQl9Ci0JCQotCS8qIAotCSAqIEBzZWUgVmlld2VyLmdldENvbnRyb2woKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29tcG9zaXRlOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCBvbiB0aGUgdmlld2VyIGRpc3Bvc2FsLgotCSAqIFVucmVnaXN0ZXJzIGZyb20gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbi4KLQkgKiBDbGllbnRzIG1heSBleHRlbmQgaWYgdGhleSBoYXZlIHRvIGRvIGFkZGl0aW9uYWwgY2xlYW51cC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkKLQkJaWYgKGZLZXlCaW5kaW5nU2VydmljZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkNvcHlMZWZ0VG9SaWdodEFjdGlvbiAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS51bnJlZ2lzdGVyQWN0aW9uKGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24pOwotCQkJaWYgKGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24gIT0gbnVsbCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uKTsKLQkJCWZLZXlCaW5kaW5nU2VydmljZT0gbnVsbDsKLQkJfQotCQkKLQkJT2JqZWN0IGlucHV0PSBnZXRJbnB1dCgpOwkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCSgoSUNvbXBhcmVJbnB1dClpbnB1dCkucmVtb3ZlQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIoZkNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbnVsbDsKLQkJfQotCi0JCWZBbmNlc3RvckxhYmVsPSBudWxsOwotCQlmTGVmdExhYmVsPSBudWxsOwotCQlmRGlyZWN0aW9uTGFiZWw9IG51bGw7Ci0JCWZSaWdodExhYmVsPSBudWxsOwotCQlmQ2VudGVyPSBudWxsOwotCQkJCQotCQlpZiAoZlJpZ2h0QXJyb3cgIT0gbnVsbCkgewotCQkJZlJpZ2h0QXJyb3cuZGlzcG9zZSgpOwotCQkJZlJpZ2h0QXJyb3c9IG51bGw7Ci0JCX0KLQkJaWYgKGZMZWZ0QXJyb3cgIT0gbnVsbCkgewotCQkJZkxlZnRBcnJvdy5kaXNwb3NlKCk7Ci0JCQlmTGVmdEFycm93PSBudWxsOwotCQl9Ci0JCWlmIChmQm90aEFycm93ICE9IG51bGwpIHsKLQkJCWZCb3RoQXJyb3cuZGlzcG9zZSgpOwotCQkJZkJvdGhBcnJvdz0gbnVsbDsKLQkJfQotCi0JCWlmIChmTm9ybWFsQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZOb3JtYWxDdXJzb3IuZGlzcG9zZSgpOwotCQkJZk5vcm1hbEN1cnNvcj0gbnVsbDsKLQkJfQotCQlpZiAoZkhTYXNoQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZIU2FzaEN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmSFNhc2hDdXJzb3I9IG51bGw7Ci0JCX0KLQkJaWYgKGZWU2FzaEN1cnNvciAhPSBudWxsKSB7Ci0JCQlmVlNhc2hDdXJzb3IuZGlzcG9zZSgpOwotCQkJZlZTYXNoQ3Vyc29yPSBudWxsOwotCQl9Ci0JCWlmIChmSFZTYXNoQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZIVlNhc2hDdXJzb3IuZGlzcG9zZSgpOwotCQkJZkhWU2FzaEN1cnNvcj0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuaGFuZGxlRGlzcG9zZShldmVudCk7Ci0gIAl9Ci0gIAkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSB0b29sYmFyIGl0ZW1zLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RhdGUgb2YgdGhlIGl0ZW1zIG5lZWRzIHVwZGF0aW5nLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCwgYWx0aG91Z2ggdGhpcyBpcyBnZW5lcmFsbHkgbm90IHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRvb2xJdGVtcygpIHsKLQkJCQkJCQkJCQkKLQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNvbnRlbnQ9IGdldE1lcmdlQ29udGVudFByb3ZpZGVyKCk7Ci0JCQotCQlPYmplY3QgaW5wdXQ9IGdldElucHV0KCk7Ci0JCQotCQlpZiAoZkNvcHlMZWZ0VG9SaWdodEFjdGlvbiAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGVuYWJsZT0gY29udGVudC5pc1JpZ2h0RWRpdGFibGUoaW5wdXQpOwotLy8JCQlpZiAoZW5hYmxlICYmIGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotLy8JCQkJSVR5cGVkRWxlbWVudCBlPSAoKElDb21wYXJlSW5wdXQpIGlucHV0KS5nZXRMZWZ0KCk7Ci0vLwkJCQlpZiAoZSA9PSBudWxsKQotLy8JCQkJCWVuYWJsZT0gZmFsc2U7Ci0vLwkJCX0KLQkJCWZDb3B5TGVmdFRvUmlnaHRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotCQl9Ci0JCQotCQlpZiAoZkNvcHlSaWdodFRvTGVmdEFjdGlvbiAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGVuYWJsZT0gY29udGVudC5pc0xlZnRFZGl0YWJsZShpbnB1dCk7Ci0vLwkJCWlmIChlbmFibGUgJiYgaW5wdXQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0vLwkJCQlJVHlwZWRFbGVtZW50IGU9ICgoSUNvbXBhcmVJbnB1dCkgaW5wdXQpLmdldFJpZ2h0KCk7Ci0vLwkJCQlpZiAoZSA9PSBudWxsKQotLy8JCQkJCWVuYWJsZT0gZmFsc2U7Ci0vLwkJCX0KLQkJCWZDb3B5UmlnaHRUb0xlZnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGhlYWRlcnMgb2YgdGhlIHRocmVlIGFyZWFzCi0JICogYnkgcXVlcnlpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGEgbmFtZSBhbmQgaW1hZ2UgZm9yCi0JICogdGhlIHRocmVlIHNpZGVzIG9mIHRoZSBpbnB1dCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBoZWFkZXIgbXVzdCBiZSB1cGRhdGVkLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCwgYWx0aG91Z2ggdGhpcyBpcyBnZW5lcmFsbHkgbm90IHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhlYWRlcigpIHsKLQkJCQkJCQotCQlJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIgY29udGVudD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0IGlucHV0PSBnZXRJbnB1dCgpOwotCi0JCWlmIChmQW5jZXN0b3JMYWJlbCAhPSBudWxsKSB7Ci0JCQlmQW5jZXN0b3JMYWJlbC5zZXRJbWFnZShjb250ZW50LmdldEFuY2VzdG9ySW1hZ2UoaW5wdXQpKTsKLQkJCWZBbmNlc3RvckxhYmVsLnNldFRleHQoY29udGVudC5nZXRBbmNlc3RvckxhYmVsKGlucHV0KSk7Ci0JCX0KLQkJaWYgKGZMZWZ0TGFiZWwgIT0gbnVsbCkgewotCQkJZkxlZnRMYWJlbC5zZXRJbWFnZShjb250ZW50LmdldExlZnRJbWFnZShpbnB1dCkpOwotCQkJZkxlZnRMYWJlbC5zZXRUZXh0KGNvbnRlbnQuZ2V0TGVmdExhYmVsKGlucHV0KSk7Ci0JCX0KLQkJaWYgKGZSaWdodExhYmVsICE9IG51bGwpIHsKLQkJCWZSaWdodExhYmVsLnNldEltYWdlKGNvbnRlbnQuZ2V0UmlnaHRJbWFnZShpbnB1dCkpOwotCQkJZlJpZ2h0TGFiZWwuc2V0VGV4dChjb250ZW50LmdldFJpZ2h0TGFiZWwoaW5wdXQpKTsKLQkJfQotCX0KLQkKLS8vCXByaXZhdGUgSW1hZ2UgbG9hZEltYWdlKFN0cmluZyBuYW1lKSB7Ci0vLwkJSW1hZ2VEZXNjcmlwdG9yIGlkPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoQ29udGVudE1lcmdlVmlld2VyLmNsYXNzLCBuYW1lKTsKLS8vCQlpZiAoaWQgIT0gbnVsbCkKLS8vCQkJcmV0dXJuIGlkLmNyZWF0ZUltYWdlKCk7Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCQotCS8qCi0JICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBoZWFkZXIuCi0JICovCi0JLyogcGFja2FnZSAqLyBpbnQgZ2V0SGVhZGVySGVpZ2h0KCkgewotCQlpbnQgaGVhZGVySGVpZ2h0PSBmTGVmdExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueTsKLQkJaGVhZGVySGVpZ2h0PSBNYXRoLm1heChoZWFkZXJIZWlnaHQsIGZEaXJlY3Rpb25MYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLnkpOwkJCi0JCXJldHVybiBoZWFkZXJIZWlnaHQ7Ci0JfQotCi0JLy8tLS0tIG1lcmdlIGRpcmVjdGlvbgotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggc2lkZXMgYXJlIGVkaXRhYmxlLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiBjYW5Ub2dnbGVNZXJnZURpcmVjdGlvbigpIHsKLQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNvbnRlbnQ9IGdldE1lcmdlQ29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdCBpbnB1dD0gZ2V0SW5wdXQoKTsKLQkJcmV0dXJuIGNvbnRlbnQuaXNMZWZ0RWRpdGFibGUoaW5wdXQpICYmIGNvbnRlbnQuaXNSaWdodEVkaXRhYmxlKGlucHV0KTsKLQl9Ci0JCi0JLy8tLS0tIGRpcnR5IHN0YXRlICYgc2F2aW5nIHN0YXRlCi0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJUHJvcGVydHlDaGFuZ2VOb3RpZmllci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVyTGlzdCA9PSBudWxsKQotCQkJZkxpc3RlbmVyTGlzdD0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlmTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lckxpc3QgIT0gbnVsbCkgewotCQkJZkxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCQkJaWYgKGZMaXN0ZW5lckxpc3QuaXNFbXB0eSgpKQotCQkJCWZMaXN0ZW5lckxpc3Q9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyogcGFja2FnZSAqLyB2b2lkIGZpcmVEaXJ0eVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJVXRpbGl0aWVzLmZpcmVQcm9wZXJ0eUNoYW5nZShmTGlzdGVuZXJMaXN0LCB0aGlzLCBDb21wYXJlRWRpdG9ySW5wdXQuRElSVFlfU1RBVEUsIG51bGwsIG5ldyBCb29sZWFuKHN0YXRlKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBsZWZ0IHNpZGUgb2YgdGhpcyB2aWV3ZXIuCi0JICogSWYgdGhlIG5ldyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG9sZAotCSAqIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVyIGFyZSBub3RpZmllZCB3aXRoCi0JICogYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiB3aXRoIHRoZQotCSAqIHByb3BlcnR5IG5hbWUgPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0LkRJUlRZX1NUQVRFPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBkaXJ0eSB0aGUgc3RhdGUgb2YgdGhlIGxlZnQgc2lkZSBkaXJ0eSBmbGFnCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGVmdERpcnR5KGJvb2xlYW4gZGlydHkpIHsKLQkJaWYgKGZMZWZ0U2F2ZUFjdGlvbi5pc0VuYWJsZWQoKSAhPSBkaXJ0eSkgewotCQkJZkxlZnRTYXZlQWN0aW9uLnNldEVuYWJsZWQoZGlydHkpOwotCQkJZmlyZURpcnR5U3RhdGUoZGlydHkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRpcnR5IHN0YXRlIG9mIHRoZSByaWdodCBzaWRlIG9mIHRoaXMgdmlld2VyLgotCSAqIElmIHRoZSBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBvbGQKLQkgKiBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lciBhcmUgbm90aWZpZWQgd2l0aAotCSAqIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gd2l0aCB0aGUKLQkgKiBwcm9wZXJ0eSBuYW1lIDxjb2RlPkNvbXBhcmVFZGl0b3JJbnB1dC5ESVJUWV9TVEFURTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZGlydHkgdGhlIHN0YXRlIG9mIHRoZSByaWdodCBzaWRlIGRpcnR5IGZsYWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSaWdodERpcnR5KGJvb2xlYW4gZGlydHkpIHsKLQkJaWYgKGZSaWdodFNhdmVBY3Rpb24uaXNFbmFibGVkKCkgIT0gZGlydHkpIHsKLQkJCWZSaWdodFNhdmVBY3Rpb24uc2V0RW5hYmxlZChkaXJ0eSk7Ci0JCQlmaXJlRGlydHlTdGF0ZShkaXJ0eSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBTYXZlIHRoZSB2aWV3ZXJzJ3MgY29udGVudC4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmVDb250ZW50KGdldElucHV0KCkpOwotCX0KLQkKLQkvKgotCSAqIFNhdmUgbW9kaWZpZWQgY29udGVudCBiYWNrIHRvIGlucHV0IGVsZW1lbnRzIHZpYSB0aGUgY29udGVudCBwcm92aWRlci4KLQkgKi8KLQkvKiBwYWNrYWdlICovIHZvaWQgc2F2ZUNvbnRlbnQoT2JqZWN0IG9sZElucHV0KSB7Ci0JCQkJCi0JCS8vIHdyaXRlIGJhY2sgbW9kaWZpZWQgY29udGVudHMKLQkJSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGNvbnRlbnQ9IChJTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpOwotCQkKLQkJYm9vbGVhbiBsZWZ0RW1wdHk9IGNvbnRlbnQuZ2V0TGVmdENvbnRlbnQob2xkSW5wdXQpID09IG51bGw7Ci0JCWJvb2xlYW4gcmlnaHRFbXB0eT0gY29udGVudC5nZXRSaWdodENvbnRlbnQob2xkSW5wdXQpID09IG51bGw7Ci0KLQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbi5pc0xlZnRFZGl0YWJsZSgpICYmIGZMZWZ0U2F2ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJYnl0ZVtdIGJ5dGVzPSBnZXRDb250ZW50cyh0cnVlKTsKLQkJCWlmIChsZWZ0RW1wdHkgJiYgYnl0ZXMgIT0gbnVsbCAmJiBieXRlcy5sZW5ndGggPT0gMCkKLQkJCQlieXRlcz0gbnVsbDsKLQkJCXNldExlZnREaXJ0eShmYWxzZSk7Ci0JCQljb250ZW50LnNhdmVMZWZ0Q29udGVudChvbGRJbnB1dCwgYnl0ZXMpOwotCQl9Ci0JCQotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uLmlzUmlnaHRFZGl0YWJsZSgpICYmIGZSaWdodFNhdmVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCWJ5dGVbXSBieXRlcz0gZ2V0Q29udGVudHMoZmFsc2UpOwotCQkJaWYgKHJpZ2h0RW1wdHkgJiYgYnl0ZXMgIT0gbnVsbCAmJiBieXRlcy5sZW5ndGggPT0gMCkKLQkJCQlieXRlcz0gbnVsbDsKLQkJCXNldFJpZ2h0RGlydHkoZmFsc2UpOwotCQkJY29udGVudC5zYXZlUmlnaHRDb250ZW50KG9sZElucHV0LCBieXRlcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvSURvY3VtZW50UmFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JRG9jdW1lbnRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIzNmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JRG9jdW1lbnRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotCi0vKioKLSAqIERlZmluZXMgYSBzdWJyYW5nZSBpbiBhIGRvY3VtZW50LgotICogPHA+Ci0gKiBJdCBpcyB1c2VkIGJ5IHRleHQgdmlld2VycyB0aGF0IGNhbiB3b3JrIG9uIGEgc3VicmFuZ2Ugb2YgYSBkb2N1bWVudC4gRm9yIGV4YW1wbGUsCi0gKiBhIHRleHQgdmlld2VyIGZvciBKYXZhIGNvbXBpbGF0aW9uIHVuaXRzIG1pZ2h0IHVzZSB0aGlzIHRvIHJlc3RyaWN0IHRoZSB2aWV3Ci0gKiB0byBhIHNpbmdsZSBtZXRob2QuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIFRleHRNZXJnZVZpZXdlcgotICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRvY3VtZW50UmFuZ2VOb2RlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50UmFuZ2UgewotCQotCS8qKgotCSAqIFRoZSBwb3NpdGlvbiBjYXRlZ29yeSB0eXBpY2FsbHkgdXNlZCBmb3IgYW4gPGNvZGU+SURvY3VtZW50UmFuZ2U8L2NvZGU+IHBvc2l0aW9uCi0JICogKHZhbHVlIDxjb2RlPiJEb2N1bWVudFJhbmdlQ2F0ZWdvcnkiPC9jb2RlPikuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX0NBVEVHT1JZPSAiRG9jdW1lbnRSYW5nZUNhdGVnb3J5IjsJLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50Ci0JICovCi0JSURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHBvc2l0aW9uIHRoYXQgc3BlY2lmaWVzIGEgc3VicmFuZ2UgaW4gdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBkb2N1bWVudCByYW5nZSBzcGFucyB0aGUgd2hvbGUgdW5kZXJseWluZyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zaXRpb24gdGhhdCBzcGVjaWZpZXMgYSBzdWJyYW5nZSBpbiB0aGUgdW5kZXJseWluZyBkb2N1bWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlQb3NpdGlvbiBnZXRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL0lNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVjNTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotCi0KLS8qKiAKLSAqIEEgY29udGVudCBwcm92aWRlciB0aGF0IG1lZGlhdGVzIGJldHdlZW4gYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+J3MgbW9kZWwKLSAqIGFuZCB0aGUgdmlld2VyIGl0c2VsZi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogCi0gKiBAc2VlIENvbnRlbnRNZXJnZVZpZXdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBleHRlbmRzIElDb250ZW50UHJvdmlkZXIgewotCQotCS8vLS0tLSBhbmNlc3RvciBzaWRlCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldEFuY2VzdG9yTGFiZWwoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSBhbmNlc3RvciBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSBhbmNlc3RvciBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiwKLQkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlJbWFnZSBnZXRBbmNlc3RvckltYWdlKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBmb3IgdGhlIGFuY2VzdG9yIHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGRlcGVuZHMgb24gdGhlIGNvbmNyZXRlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZm9yIHRoZSBhbmNlc3RvciBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiwKLQkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlPYmplY3QgZ2V0QW5jZXN0b3JDb250ZW50KE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFuY2VzdG9yIHNpZGUgb2YgdGhlIGdpdmVuIGlucHV0IGVsZW1lbnQgc2hvdWxkIGJlIHNob3duLgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgbWVyZ2Ugdmlld2VyJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbmNlc3RvciBzaWRlIG9mIHRoZSBnaXZlbiBpbnB1dCBlbGVtZW50IHNob3VsZCBiZSBzaG93bgotCSAqLwotCWJvb2xlYW4gc2hvd0FuY2VzdG9yKE9iamVjdCBpbnB1dCk7Ci0JCi0JLy8tLS0tIGxlZnQgc2lkZQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIGxlZnQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0TGVmdExhYmVsKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIGltYWdlIGZvciB0aGUgbGVmdCBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LAotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCUltYWdlIGdldExlZnRJbWFnZShPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudHMgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGRlcGVuZHMgb24gdGhlIGNvbmNyZXRlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZm9yIHRoZSBsZWZ0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LAotCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCU9iamVjdCBnZXRMZWZ0Q29udGVudChPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsZWZ0IHNpZGUgaXMgZWRpdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxlZnQgc2lkZSBvZiBhIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gaXMgZWRpdGFibGUJIAotCSAqLwotCWJvb2xlYW4gaXNMZWZ0RWRpdGFibGUoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFNhdmVzIG5ldyBjb250ZW50cyBmb3IgdGhlIGxlZnQgc2lkZSBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHBhcmFtIGJ5dGVzIHRoZSBuZXcgY29udGVudHMgdG8gc2F2ZSBmb3IgdGhlIGxlZnQgc2lkZQotCSAqLwotCXZvaWQgc2F2ZUxlZnRDb250ZW50KE9iamVjdCBpbnB1dCwgYnl0ZVtdIGJ5dGVzKTsKLQotCS8vLS0tLSByaWdodCBzaWRlCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3Qgb2YgdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldFJpZ2h0TGFiZWwoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSByaWdodCBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSByaWdodCBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiwKLQkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlJbWFnZSBnZXRSaWdodEltYWdlKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+LgotCSAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGRlcGVuZHMgb24gdGhlIGNvbmNyZXRlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZm9yIHRoZSByaWdodCBzaWRlIG9mIGEgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPiwKLQkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlPYmplY3QgZ2V0UmlnaHRDb250ZW50KE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJpZ2h0IHNpZGUgaXMgZWRpdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9iamVjdCBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJpZ2h0IHNpZGUgb2YgYSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+IGlzIGVkaXRhYmxlCSAKLQkgKi8KLQlib29sZWFuIGlzUmlnaHRFZGl0YWJsZShPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogU2F2ZXMgbmV3IGNvbnRlbnRzIGZvciB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgPGNvZGU+Q29udGVudE1lcmdlVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2JqZWN0IG9mIHRoZSA8Y29kZT5Db250ZW50TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0JICogQHBhcmFtIGJ5dGVzIHRoZSBuZXcgY29udGVudHMgdG8gc2F2ZSBmb3IgdGhlIHJpZ2h0IHNpZGUKLQkgKi8KLQl2b2lkIHNhdmVSaWdodENvbnRlbnQoT2JqZWN0IGlucHV0LCBieXRlW10gYnl0ZXMpOwotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JVG9rZW5Db21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvSVRva2VuQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdkOTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9JVG9rZW5Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuSVJhbmdlQ29tcGFyYXRvcjsKLQotCi0vKioKLSAqIEZvciBwZXJmb3JtaW5nIGEgc28tY2FsbGVkICJ0b2tlbiBjb21wYXJlIiBvbiBhIGxpbmUgb2YgdGV4dC4KLSAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+IGludGVyZmFjZQotICogc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSB0aGUgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPi4KLSAqIDxwPgotICogPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPiBhY3RpdmF0ZXMgdGhlIHRva2VuIGNvbXBhcmUgd2hlbiBuYXZpZ2F0aW5nIGludG8KLSAqIGEgcmFuZ2Ugb2YgZGlmZmVyaW5nIGxpbmVzLiBBdCBmaXJzdCB0aGUgbGluZXMgYXJlIHNlbGVjdGVkIGFzIGEgYmxvY2suCi0gKiBXaGVuIG5hdmlnYXRpbmcgaW50byB0aGlzIGJsb2NrIHRoZSB0b2tlbiBjb21wYXJlIHNob3dzIGZvciBldmVyeSBsaW5lIAotICogdGhlIGRpZmZlcmluZyB0b2tlbiBieSBzZWxlY3RpbmcgdGhlbS4KLSAqIDxwPgotICogPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPidzIGRlZmF1bHQgdG9rZW4gY29tcGFyYXRvciB3b3JrcyBvbiBjaGFyYWN0ZXJzIHNlcGFyYXRlZAotICogYnkgd2hpdGVzcGFjZS4gSWYgYSBkaWZmZXJlbnQgc3RyYXRlZ3kgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSwgdG8gdXNlIEphdmEgdG9rZW5zIGluCi0gKiBhIEphdmEtYXdhcmUgbWVyZ2Ugdmlld2VyKSwgY2xpZW50cyBtYXkgY3JlYXRlIHRoZWlyIG93biB0b2tlbgotICogY29tcGFyYXRvcnMgYnkgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIChhbmQgb3ZlcnJpZGluZyB0aGUKLSAqIDxjb2RlPlRleHRNZXJnZVZpZXdlci5jcmVhdGVUb2tlbkNvbXBhcmF0b3I8L2NvZGU+IGZhY3RvcnkgbWV0aG9kKS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIFRleHRNZXJnZVZpZXdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb2tlbkNvbXBhcmF0b3IgZXh0ZW5kcyBJUmFuZ2VDb21wYXJhdG9yIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUgdG9rZW4gd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCi0JICogSWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSAoYnV0IG5vdCBuZWdhdGl2ZSkgdGhlIGNoYXJhY3RlciBwb3NpdGlvbgotCSAqIGJlaGluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgKHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmluZykgaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIHRva2VuIGZvciB3aGljaCB0byByZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHRva2VuIHdpdGggdGhlIGdpdmVuIGluZGV4Ci0JICogQHRocm93cyBqYXZhLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCBpcyBuZWdhdGl2ZQotCSAqLwotCWludCBnZXRUb2tlblN0YXJ0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIHRoZSB0b2tlbiB3aXRoIHRoZSBnaXZlbiBpbmRleC4KLQkgKiBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlIChidXQgbm90IG5lZ2F0aXZlKSB0aGUgdmFsdWUgMCBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgdG9rZW4gZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIHRoZSB0b2tlbiB3aXRoIHRoZSBnaXZlbiBpbmRleAotCSAqIEB0aHJvd3MgamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggaXMgbmVnYXRpdmUKLQkgKi8KLQlpbnQgZ2V0VG9rZW5MZW5ndGgoaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9UZXh0TWVyZ2VWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9UZXh0TWVyZ2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0NTg2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvVGV4dE1lcmdlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBjaGFubmluZ3dhbHRvbkBtYWMuY29tIC0gY3VydmVkIGxpbmUgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSUNvbXBhcmVDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuTWVyZ2VTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5CdWZmZXJlZENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLk1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVG9rZW5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuRG9jTGluZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JTmF2aWdhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlTmF2aWdhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuKjsKLQotLyoqCi0gKiBBIHRleHQgbWVyZ2Ugdmlld2VyIHVzZXMgdGhlIDxjb2RlPlJhbmdlRGlmZmVyZW5jZXI8L2NvZGU+IHRvIHBlcmZvcm0gYQotICogdGV4dHVhbCwgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gb2YgdHdvIChvciB0aHJlZSkgaW5wdXQgZG9jdW1lbnRzLgotICogSXQgaXMgYmFzZWQgb24gdGhlIDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gYW5kIHVzZXMgPGNvZGU+VGV4dFZpZXdlcjwvY29kZT5zCi0gKiB0byBpbXBsZW1lbnQgdGhlIGFuY2VzdG9yLCBsZWZ0LCBhbmQgcmlnaHQgY29udGVudCBhcmVhcy4KLSAqIDxwPgotICogSW4gdGhlIHRocmVlLXdheSBjb21wYXJlIGNhc2UgcmFuZ2VzIG9mIGRpZmZlcmluZyBsaW5lcyBhcmUgaGlnaGxpZ2h0ZWQgYW5kIGZyYW1lZAotICogd2l0aCBkaWZmZXJlbnQgY29sb3JzIHRvIHNob3cgd2hldGhlciB0aGUgZGlmZmVyZW5jZSBpcyBhbiBpbmNvbWluZywgb3V0Z29pbmcsIG9yIGNvbmZsaWN0aW5nIGNoYW5nZS4KLSAqIFRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+IHN1cHBvcnRzIHRoZSBub3Rpb24gb2YgYSBjdXJyZW50ICJkaWZmZXJpbmcgcmFuZ2UiCi0gKiBhbmQgcHJvdmlkZXMgdG9vbGJhciBidXR0b25zIHRvIG5hdmlnYXRlIGZyb20gb25lIHJhbmdlIHRvIHRoZSBuZXh0IChvciBwcmV2aW91cykuCi0gKiA8cD4KLSAqIElmIHRoZXJlIGlzIGEgY3VycmVudCAiZGlmZmVyaW5nIHJhbmdlIiBhbmQgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgaXMgZWRpdGFibGUKLSAqIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+IGVuYWJsZXMgYWN0aW9ucyBpbiBjb250ZXh0IG1lbnUgYW5kIHRvb2xiYXIgdG8KLSAqIGNvcHkgYSByYW5nZSBmcm9tIG9uZSBzaWRlIHRvIHRoZSBvdGhlciBzaWRlLCB0aGVyZWJ5IHBlcmZvcm1pbmcgYSBtZXJnZSBvcGVyYXRpb24uCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uIHRvIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gdGhlIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4KLSAqIHVzZXMgYSB0b2tlbiBiYXNlZCBjb21wYXJlIG9uIGRpZmZlcmluZyBsaW5lcy4KLSAqIFRoZSB0b2tlbiBjb21wYXJlIGlzIGFjdGl2YXRlZCB3aGVuIG5hdmlnYXRpbmcgaW50bwotICogYSByYW5nZSBvZiBkaWZmZXJpbmcgbGluZXMuIEF0IGZpcnN0IHRoZSBsaW5lcyBhcmUgc2VsZWN0ZWQgYXMgYSBibG9jay4KLSAqIFdoZW4gbmF2aWdhdGluZyBpbnRvIHRoaXMgYmxvY2sgdGhlIHRva2VuIGNvbXBhcmUgc2hvd3MgZm9yIGV2ZXJ5IGxpbmUgCi0gKiB0aGUgZGlmZmVyaW5nIHRva2VuIGJ5IHNlbGVjdGluZyB0aGVtLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPidzIGRlZmF1bHQgdG9rZW4gY29tcGFyZSB3b3JrcyBvbiBjaGFyYWN0ZXJzIHNlcGFyYXRlZAotICogYnkgd2hpdGVzcGFjZS4gSWYgYSBkaWZmZXJlbnQgc3RyYXRlZ3kgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSwgSmF2YSB0b2tlbnMgaW4KLSAqIGEgSmF2YS1hd2FyZSBtZXJnZSB2aWV3ZXIpLCBjbGllbnRzIGNhbiBjcmVhdGUgdGhlaXIgb3duIHRva2VuCi0gKiBjb21wYXJhdG9ycyBieSBpbXBsZW1lbnRpbmcgdGhlIDxjb2RlPklUb2tlbkNvbXBhcmF0b3I8L2NvZGU+IGludGVyZmFjZSBhbmQgb3ZlcnJpZGluZyB0aGUKLSAqIDxjb2RlPlRleHRNZXJnZVZpZXdlci5jcmVhdGVUb2tlbkNvbXBhcmF0b3I8L2NvZGU+IGZhY3RvcnkgbWV0aG9kKS4KLSAqIDxwPgotICogQWNjZXNzIHRvIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+J3MgbW9kZWwgaXMgYnkgbWVhbnMgb2YgYW4KLSAqIDxjb2RlPklNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcjwvY29kZT4uIEl0cyA8Y29kZT5nZXQ8aXQ+WDwvaXQ+PC9jb2RlPkNvbnRlbnQ8L2NvZGU+IG1ldGhvZHMgbXVzdCByZXR1cm4KLSAqIGVpdGhlciBhbiA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+LCBhbiA8Y29kZT5JRG9jdW1lbnRSYW5nZTwvY29kZT4sIG9yIGFuIDxjb2RlPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2NvZGU+LgotICogSW4gdGhlIDxjb2RlPklEb2N1bWVudFJhbmdlPC9jb2RlPiBjYXNlIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+Ci0gKiB3b3JrcyBvbiBhIHN1YnJhbmdlIG9mIGEgZG9jdW1lbnQuIEluIHRoZSA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPiBjYXNlCi0gKiBhIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW50ZXJuYWxseSBhbmQgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3RyZWFtLgotICogPHA+Ci0gKiBBIDxjb2RlPlRleHRNZXJnZVZpZXdlcjwvY29kZT4gY2FuIGJlIHVzZWQgYXMgaXMuIEhvd2V2ZXIgY2xpZW50cyBtYXkgc3ViY2xhc3MKLSAqIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3IuIEZvciBleGFtcGxlIGEgPGNvZGU+TWVyZ2VUZXh0Vmlld2VyPC9jb2RlPiBmb3IgSmF2YSB3b3VsZCBvdmVycmlkZQotICogdGhlIDxjb2RlPmNvbmZpZ3VyZVRleHRWaWV3ZXI8L2NvZGU+IG1ldGhvZCB0byBjb25maWd1cmUgdGhlIDxjb2RlPlRleHRWaWV3ZXI8L2NvZGU+IGZvciBKYXZhIHNvdXJjZSBjb2RlLAotICogdGhlIDxjb2RlPmNyZWF0ZVRva2VuQ29tcGFyYXRvcjwvY29kZT4gbWV0aG9kIHRvIGNyZWF0ZSBhIEphdmEgc3BlY2lmaWMgdG9rZW5pemVyLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLlJhbmdlRGlmZmVyZW5jZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyCi0gKiBAc2VlIElUb2tlbkNvbXBhcmF0b3IKLSAqIEBzZWUgSURvY3VtZW50UmFuZ2UKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5JU3RyZWFtQ29udGVudEFjY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0TWVyZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50TWVyZ2VWaWV3ZXIgIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJWF80NzY0MD0gdHJ1ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHTE9CQUxfQUNUSU9OUz0gewotCQlBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCUFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCUFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQlBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCUFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCUFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotCQlBY3Rpb25GYWN0b3J5LlNBVkUuZ2V0SWQoKQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVYVF9BQ1RJT05TPSB7Ci0JCU1lcmdlU291cmNlVmlld2VyLlVORE9fSUQsCi0JCU1lcmdlU291cmNlVmlld2VyLlJFRE9fSUQsCi0JCU1lcmdlU291cmNlVmlld2VyLkNVVF9JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuQ09QWV9JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuUEFTVEVfSUQsCi0JCU1lcmdlU291cmNlVmlld2VyLkRFTEVURV9JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuU0VMRUNUX0FMTF9JRCwKLQkJTWVyZ2VTb3VyY2VWaWV3ZXIuU0FWRV9JRAotCX07Ci0JCQkJCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlclJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyB0aGUgZm9sbG93aW5nIHN5bWJvbGljIGNvbnN0YW50cyBtdXN0IG1hdGNoIHRoZSBJRHMgaW4gQ29tcGFyZSdzIHBsdWdpbi54bWwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DT01JTkdfQ09MT1I9ICJJTkNPTUlOR19DT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUR09JTkdfQ09MT1I9ICJPVVRHT0lOR19DT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORkxJQ1RJTkdfQ09MT1I9ICJDT05GTElDVElOR19DT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT0xWRURfQ09MT1I9ICJSRVNPTFZFRF9DT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBjb25zdGFudHMKLQkvKiogV2lkdGggb2YgbGVmdCBhbmQgcmlnaHQgdmVydGljYWwgYmFyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9XSURUSD0gNjsKLQkvKiogV2lkdGggb2YgY2VudGVyIGJhciAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDRU5URVJfV0lEVEg9IDM0OwotCS8qKiBXaWR0aCBvZiBiaXJkcyBleWUgdmlldyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVJEU19FWUVfVklFV19XSURUSD0gMTI7Ci0JLyoqIFdpZHRoIG9mIGJpcmRzIGV5ZSB2aWV3ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJUkRTX0VZRV9WSUVXX0lOU0VUPSAyOwotCS8qKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZFX1NJWkU9IDU7Ci0JLyoqIGlmIHRydWUgY29weWluZyBjb25mbGljdHMgZnJvbSBvbmUgc2lkZSB0byBvdGhlciBjb25jYXRlbmF0ZXMgYm90aCBzaWRlcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVBQRU5EX0NPTkZMSUNUPSB0cnVlOwotCi0JLyoqIGxpbmUgd2lkdGggb2YgY2hhbmdlIGJvcmRlcnMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFc9IDE7Ci0JLyoqIFNlbGVjdHMgYmV0d2VlbiBzbWFydFRva2VuRGlmZiBhbmQgbWVyZ2luZ1Rva2VuRGlmZiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX01FUkdJTkdfVE9LRU5fRElGRj0gZmFsc2U7Ci0JCQotCS8vIGRldGVybWluZXMgd2hldGhlciBhIGNoYW5nZSBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IGlzIGNvbnNpZGVyZWQgaW5jb21pbmcgb3Igb3V0Z29pbmcKLQlwcml2YXRlIGJvb2xlYW4gZkxlZnRJc0xvY2FsOwotCXByaXZhdGUgYm9vbGVhbiBmU2hvd0N1cnJlbnRPbmx5PSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNob3dDdXJyZW50T25seTI9IGZhbHNlOwotCXByaXZhdGUgaW50IGZNYXJnaW5XaWR0aD0gTUFSR0lOX1dJRFRIOwotCXByaXZhdGUgaW50IGZUb3BJbnNldDsKLQkKLQkvLyBDb2xvcnMKLQlwcml2YXRlIFJHQiBmQmFja2dyb3VuZDsKLQlwcml2YXRlIFJHQiBmRm9yZWdyb3VuZDsKLQlwcml2YXRlIGJvb2xlYW4gZlBvbGxTeXN0ZW1Gb3JlZ3JvdW5kPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmUG9sbFN5c3RlbUJhY2tncm91bmQ9IHRydWU7Ci0JCi0JcHJpdmF0ZSBSR0IgU0VMRUNURURfSU5DT01JTkc7Ci0JcHJpdmF0ZSBSR0IgSU5DT01JTkc7Ci0JcHJpdmF0ZSBSR0IgSU5DT01JTkdfRklMTDsKLQkKLQlwcml2YXRlIFJHQiBTRUxFQ1RFRF9DT05GTElDVDsKLQlwcml2YXRlIFJHQiBDT05GTElDVDsKLQlwcml2YXRlIFJHQiBDT05GTElDVF9GSUxMOwotCQotCXByaXZhdGUgUkdCIFNFTEVDVEVEX09VVEdPSU5HOwotCXByaXZhdGUgUkdCIE9VVEdPSU5HOwotCXByaXZhdGUgUkdCIE9VVEdPSU5HX0ZJTEw7Ci0JCi0JcHJpdmF0ZSBSR0IgUkVTT0xWRUQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuZE9mRG9jUmVhY2hlZDsKLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlOwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkvKiogQWxsIGRpZmZzIGZvciBjYWxjdWxhdGluZyBzY3JvbGxpbmcgcG9zaXRpb24gKGluY2x1ZGVzIGxpbmUgcmFuZ2VzIHdpdGhvdXQgY2hhbmdlcykgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmQWxsRGlmZnM7Ci0JLyoqIFN1YnNldCBvZiBhYm92ZToganVzdCByZWFsIGRpZmZlcmVuY2VzLiAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGZDaGFuZ2VEaWZmczsKLQkvKiogVGhlIGN1cnJlbnQgZGlmZiAqLwotCXByaXZhdGUgRGlmZiBmQ3VycmVudERpZmY7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGZOZXdBbmNlc3RvclJhbmdlcz0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgZk5ld0xlZnRSYW5nZXM9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZOZXdSaWdodFJhbmdlcz0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIE1lcmdlU291cmNlVmlld2VyIGZBbmNlc3RvcjsKLQlwcml2YXRlIE1lcmdlU291cmNlVmlld2VyIGZMZWZ0OwotCXByaXZhdGUgTWVyZ2VTb3VyY2VWaWV3ZXIgZlJpZ2h0OwotCQotCXByaXZhdGUgaW50IGZMZWZ0TGluZUNvdW50OwotCXByaXZhdGUgaW50IGZSaWdodExpbmVDb3VudDsKLQkKLQlwcml2YXRlIFN0cmluZyBmTGVmdEVuY29kaW5nOwotCXByaXZhdGUgU3RyaW5nIGZSaWdodEVuY29kaW5nOwotCQotCXByaXZhdGUgYm9vbGVhbiBmSW5TY3JvbGxpbmc7Ci0JCi0JcHJpdmF0ZSBpbnQgZlB0c1tdPSBuZXcgaW50WzhdOwkvLyBzY3JhdGNoIGFyZWEgZm9yIHBvbHlnb24gZHJhd2luZwotCQotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQW5jZXN0b3I9IGZhbHNlOwotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBmSWdub3JlQW5jZXN0b3JJdGVtOwotCXByaXZhdGUgYm9vbGVhbiBmSGlnaGxpZ2h0UmFuZ2VzOwotCQotCXByaXZhdGUgYm9vbGVhbiBmU2hvd1BzZXVkb0NvbmZsaWN0cz0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZVc2VTcGxpbmVzPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmVXNlU2luZ2xlTGluZT0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVzZVJlc29sdmVVST0gdHJ1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZTeW1ib2xpY0ZvbnROYW1lOwotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGZOZXh0SXRlbTsJLy8gZ290byBuZXh0IGRpZmZlcmVuY2UKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZlByZXZpb3VzSXRlbTsJLy8gZ290byBwcmV2aW91cyBkaWZmZXJlbmNlCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbTsKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZkNvcHlEaWZmUmlnaHRUb0xlZnRJdGVtOwotCQotCXByaXZhdGUgSUtleUJpbmRpbmdTZXJ2aWNlIGZLZXlCaW5kaW5nU2VydmljZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZlN5bmNocm9uaXplZFNjcm9sbGluZz0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNob3dNb3JlSW5mbz0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNZXJnZVNvdXJjZVZpZXdlciBmRm9jdXNQYXJ0OwotCQotCXByaXZhdGUgYm9vbGVhbiBmU3ViRG9jPSB0cnVlOwotCXByaXZhdGUgSVBvc2l0aW9uVXBkYXRlciBmUG9zaXRpb25VcGRhdGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSXNNb3RpZjsJCi0JcHJpdmF0ZSBib29sZWFuIGZJc0NhcmJvbjsJCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZIYXNFcnJvcnM7Ci0JCQotCi0JLy8gU1dUIHdpZGdldHMKLQlwcml2YXRlIEJ1ZmZlcmVkQ2FudmFzIGZBbmNlc3RvckNhbnZhczsKLQlwcml2YXRlIEJ1ZmZlcmVkQ2FudmFzIGZMZWZ0Q2FudmFzOwotCXByaXZhdGUgQnVmZmVyZWRDYW52YXMgZlJpZ2h0Q2FudmFzOwotCXByaXZhdGUgQ2FudmFzIGZTY3JvbGxDYW52YXM7Ci0JcHJpdmF0ZSBTY3JvbGxCYXIgZlZTY3JvbGxCYXI7Ci0JcHJpdmF0ZSBDYW52YXMgZkJpcmRzRXllQ2FudmFzOwotCXByaXZhdGUgQ2FudmFzIGZTdW1tYXJ5SGVhZGVyOwotCXByaXZhdGUgSGVhZGVyUGFpbnRlciBmSGVhZGVyUGFpbnRlcjsKLQkKLQkvLyBTV1QgcmVzb3VyY2VzIHRvIGJlIGRpc3Bvc2VkCi0JcHJpdmF0ZSBNYXAgZkNvbG9yczsKLQlwcml2YXRlIEN1cnNvciBmQmlyZHNFeWVDdXJzb3I7Ci0JCQkJCi0JLy8gcG9pbnRzIGZvciBjZW50ZXIgY3VydmVzCi0JcHJpdmF0ZSBkb3VibGVbXSBmQmFzaWNDZW50ZXJDdXJ2ZTsKLQkKLQlwcml2YXRlIEJ1dHRvbiBmQ2VudGVyQnV0dG9uOwotCXByaXZhdGUgRGlmZiBmQnV0dG9uRGlmZjsKLQkJCQkJCi0JY2xhc3MgSGVhZGVyUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIgewotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOU0VUPSBCSVJEU19FWUVfVklFV19JTlNFVDsKLQotCQlwcml2YXRlIFJHQiBmSW5kaWNhdG9yQ29sb3I7Ci0JCXByaXZhdGUgQ29sb3IgZlNlcGFyYXRvckNvbG9yOwotCQkKLQkJcHVibGljIEhlYWRlclBhaW50ZXIoKSB7Ci0JCQlmU2VwYXJhdG9yQ29sb3I9IGZTdW1tYXJ5SGVhZGVyLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBSZXR1cm5zIHRydWUgb24gY29sb3IgY2hhbmdlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzZXRDb2xvcihSR0IgY29sb3IpIHsKLQkJCVJHQiBvbGRDb2xvcj0gZkluZGljYXRvckNvbG9yOwotCQkJZkluZGljYXRvckNvbG9yPSBjb2xvcjsKLQkJCWlmIChjb2xvciA9PSBudWxsKQotCQkJCXJldHVybiBvbGRDb2xvciAhPSBudWxsOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpCi0JCQkJcmV0dXJuICFjb2xvci5lcXVhbHMob2xkQ29sb3IpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBkcmF3QmV2ZWxSZWN0KEdDIGdjLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3IgdG9wTGVmdCwgQ29sb3IgYm90dG9tUmlnaHQpIHsKLQkJCWdjLnNldEZvcmVncm91bmQodG9wTGVmdCk7Ci0JCQlnYy5kcmF3TGluZSh4LCB5LCB4ICsgdyAtMSwgeSk7Ci0JCQlnYy5kcmF3TGluZSh4LCB5LCB4LCB5ICsgaCAtMSk7Ci0JCQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChib3R0b21SaWdodCk7Ci0JCQlnYy5kcmF3TGluZSh4ICsgdywgeSwgeCArIHcsIHkgKyBoKTsKLQkJCWdjLmRyYXdMaW5lKHgsIHkgKyBoLCB4ICsgdywgeSArIGgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkKLQkJCVBvaW50IHM9IGZTdW1tYXJ5SGVhZGVyLmdldFNpemUoKTsKLQkJCQotCQkJaWYgKGZJbmRpY2F0b3JDb2xvciAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkPSBmU3VtbWFyeUhlYWRlci5nZXREaXNwbGF5KCk7Ci0JCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKGdldENvbG9yKGQsIGZJbmRpY2F0b3JDb2xvcikpOwotCQkJCWludCBtaW49IE1hdGgubWluKHMueCwgcy55KS0yKklOU0VUOwotCQkJCVJlY3RhbmdsZSByPSBuZXcgUmVjdGFuZ2xlKChzLngtbWluKS8yLCAocy55LW1pbikvMiwgbWluLCBtaW4pOwotCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShyKTsKLQkJCQlpZiAoZCAhPSBudWxsKQotCQkJCQlkcmF3QmV2ZWxSZWN0KGUuZ2MsIHIueCwgci55LCByLndpZHRoIC0xLCByLmhlaWdodCAtMSwgZC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpLCBkLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVykpOwotCi0JCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKGZTZXBhcmF0b3JDb2xvcik7Ci0JCQkJZS5nYy5zZXRMaW5lV2lkdGgoMSk7Ci0JCQkJZS5nYy5kcmF3TGluZSgwKzEsIHMueS0xLCBzLngtMS0xLCBzLnktMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBwb3NpdGlvbiB1cGRhdGVyIHVzZWQgdG8gYWRhcHQgdGhlIHBvc2l0aW9ucyByZXByZXNlbnRpbmcKLQkgKiB0aGUgY2hpbGQgZG9jdW1lbnQgcmFuZ2VzIHRvIGNoYW5nZXMgb2YgdGhlIHBhcmVudCBkb2N1bWVudC4KLQkgKi8KLQljbGFzcyBDaGlsZFBvc2l0aW9uVXBkYXRlciBleHRlbmRzIERlZmF1bHRQb3NpdGlvblVwZGF0ZXIgewotCQkKLQkJLyoKLQkJICogQ3JlYXRlcyB0aGUgcG9zaXRpb24gdXBkYXRlZC4KLQkJICovCi0JCXByb3RlY3RlZCBDaGlsZFBvc2l0aW9uVXBkYXRlcihTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJCXN1cGVyKGNhdGVnb3J5KTsKLQkJfQotCQkKLQkJLyoKLQkJICogQ2hpbGQgZG9jdW1lbnQgcmFuZ2VzIGNhbm5vdCBiZSBkZWxldGVkIG90aGVyIHRoZW4gYnkgY2FsbGluZwotCQkgKiBmcmVlQ2hpbGREb2N1bWVudC4KLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIG5vdERlbGV0ZWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLyoKLQkJICogSWYgYW4gaW5zZXJ0aW9uIGhhcHBlbnMgYXQgYSBjaGlsZCBkb2N1bWVudCdzIHN0YXJ0IG9mZnNldCwgdGhlCi0JCSAqIHBvc2l0aW9uIGlzIGV4dGVuZGVkIHJhdGhlciB0aGFuIHNoaWZ0ZWQuIEFsc28sIGlmIHNvbWV0aGluZyBpcyBhZGRlZCAKLQkJICogcmlnaHQgYmVoaW5kIHRoZSBlbmQgb2YgdGhlIHBvc2l0aW9uLCB0aGUgcG9zaXRpb24gaXMgZXh0ZW5kZWQgcmF0aGVyCi0JCSAqIHRoYW4ga2VwdCBzdGFibGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRvSW5zZXJ0KCkgewotCQkJCi0JCQlpZiAoZlBvc2l0aW9uID09IGZMZWZ0LmdldFJlZ2lvbigpIHx8IGZQb3NpdGlvbiA9PSBmUmlnaHQuZ2V0UmVnaW9uKCkpIHsKLQkJCQlpbnQgbXlTdGFydD0gZlBvc2l0aW9uLm9mZnNldDsKLQkJCQlpbnQgbXlFbmQ9ICAgZlBvc2l0aW9uLm9mZnNldCArIGZQb3NpdGlvbi5sZW5ndGg7Ci0JCQkJbXlFbmQ9IE1hdGgubWF4KG15U3RhcnQsIG15RW5kKTsKLQkJCQkKLQkJCQlpbnQgeW91cnNTdGFydD0gZk9mZnNldDsKLQkJCQlpbnQgeW91cnNFbmQ9ICAgZk9mZnNldCArIGZSZXBsYWNlTGVuZ3RoIC0xOwotCQkJCXlvdXJzRW5kPSBNYXRoLm1heCh5b3Vyc1N0YXJ0LCB5b3Vyc0VuZCk7Ci0JCQkJCi0JCQkJaWYgKG15RW5kIDwgeW91cnNTdGFydCkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCWlmIChteVN0YXJ0IDw9IHlvdXJzU3RhcnQpCi0JCQkJCWZQb3NpdGlvbi5sZW5ndGggKz0gZlJlcGxhY2VMZW5ndGg7Ci0JCQkJZWxzZQotCQkJCQlmUG9zaXRpb24ub2Zmc2V0ICs9IGZSZXBsYWNlTGVuZ3RoOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5hZGFwdFRvSW5zZXJ0KCk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBBIERpZmYgcmVwcmVzZW50cyBzeW5jaHJvbml6ZWQgY2hhcmFjdGVyIHJhbmdlcyBpbiB0d28gb3IgdGhyZWUgRG9jdW1lbnRzLgotCSAqIFRoZSBNZXJnZVRleHRWaWV3ZXIgdXNlcyBEaWZmcyB0byBmaW5kIGRpZmZlcmVuY2VzIGluIGxpbmUgYW5kIHRva2VuIHJhbmdlcy4KLQkgKi8KLQkvKiBwYWNrYWdlICovIGNsYXNzIERpZmYgewotCQkvKiogY2hhcmFjdGVyIHJhbmdlIGluIGFuY2VzdG9yIGRvY3VtZW50ICovCi0JCVBvc2l0aW9uIGZBbmNlc3RvclBvczsKLQkJLyoqIGNoYXJhY3RlciByYW5nZSBpbiBsZWZ0IGRvY3VtZW50ICovCi0JCVBvc2l0aW9uIGZMZWZ0UG9zOwotCQkvKiogY2hhcmFjdGVyIHJhbmdlIGluIHJpZ2h0IGRvY3VtZW50ICovCi0JCVBvc2l0aW9uIGZSaWdodFBvczsKLQkJLyoqIGlmIHRoaXMgaXMgYSBUb2tlbkRpZmYgZlBhcmVudCBwb2ludHMgdG8gdGhlIGVuY2xvc2luZyBMaW5lRGlmZiAqLwotCQlEaWZmIGZQYXJlbnQ7CQotCQkvKiogaWYgRGlmZiBoYXMgYmVlbiByZXNvbHZlZCAqLwotCQlib29sZWFuIGZSZXNvbHZlZDsKLQkJaW50IGZEaXJlY3Rpb247Ci0JCWJvb2xlYW4gZklzVG9rZW49IGZhbHNlOwotCQkvKiogY2hpbGQgdG9rZW4gZGlmZnMgKi8KLQkJQXJyYXlMaXN0IGZEaWZmczsKLQkJYm9vbGVhbiBmSXNXaGl0ZXNwYWNlPSBmYWxzZTsKLQotCQkvKgotCQkgKiBDcmVhdGUgRGlmZiBmcm9tIHR3byByYW5nZXMgYW5kIGFuIG9wdGlvbmFsIHBhcmVudCBkaWZmLgotCQkgKi8KLQkJRGlmZihEaWZmIHBhcmVudCwgaW50IGRpciwgSURvY3VtZW50IGFuY2VzdG9yRG9jLCBQb3NpdGlvbiBhUmFuZ2UsIGludCBhbmNlc3RvclN0YXJ0LCBpbnQgYW5jZXN0b3JFbmQsCi0JCQkJCQkJIElEb2N1bWVudCBsZWZ0RG9jLCBQb3NpdGlvbiBsUmFuZ2UsIGludCBsZWZ0U3RhcnQsIGludCBsZWZ0RW5kLAotCQkJCQkJCSBJRG9jdW1lbnQgcmlnaHREb2MsIFBvc2l0aW9uIHJSYW5nZSwgaW50IHJpZ2h0U3RhcnQsIGludCByaWdodEVuZCkgewotCQkJZlBhcmVudD0gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQgOiB0aGlzOwotCQkJZkRpcmVjdGlvbj0gZGlyOwotCQkJCi0JCQlmTGVmdFBvcz0gY3JlYXRlUG9zaXRpb24obGVmdERvYywgbFJhbmdlLCBsZWZ0U3RhcnQsIGxlZnRFbmQpOwotCQkJZlJpZ2h0UG9zPSBjcmVhdGVQb3NpdGlvbihyaWdodERvYywgclJhbmdlLCByaWdodFN0YXJ0LCByaWdodEVuZCk7Ci0JCQlpZiAoYW5jZXN0b3JEb2MgIT0gbnVsbCkKLQkJCQlmQW5jZXN0b3JQb3M9IGNyZWF0ZVBvc2l0aW9uKGFuY2VzdG9yRG9jLCBhUmFuZ2UsIGFuY2VzdG9yU3RhcnQsIGFuY2VzdG9yRW5kKTsKLQkJfQotCQkKLQkJUG9zaXRpb24gZ2V0UG9zaXRpb24oY2hhciB0eXBlKSB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgJ0EnOgotCQkJCXJldHVybiBmQW5jZXN0b3JQb3M7Ci0JCQljYXNlICdMJzoKLQkJCQlyZXR1cm4gZkxlZnRQb3M7Ci0JCQljYXNlICdSJzoKLQkJCQlyZXR1cm4gZlJpZ2h0UG9zOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gaXNJblJhbmdlKGNoYXIgdHlwZSwgaW50IHBvcykgewotCQkJUG9zaXRpb24gcD0gZ2V0UG9zaXRpb24odHlwZSk7Ci0JCQlyZXR1cm4gKHBvcyA+PSBwLm9mZnNldCkgJiYgKHBvcyA8IChwLm9mZnNldCtwLmxlbmd0aCkpOwotCQl9Ci0JCQotCQlTdHJpbmcgY2hhbmdlVHlwZSgpIHsKLQkJCWJvb2xlYW4gbGVmdEVtcHR5PSBmTGVmdFBvcy5sZW5ndGggPT0gMDsKLQkJCWJvb2xlYW4gcmlnaHRFbXB0eT0gZlJpZ2h0UG9zLmxlbmd0aCA9PSAwOwotCQkJCi0JCQlpZiAoZkRpcmVjdGlvbiA9PSBSYW5nZURpZmZlcmVuY2UuTEVGVCkgewotCQkJCWlmICghbGVmdEVtcHR5ICYmIHJpZ2h0RW1wdHkpCi0JCQkJCXJldHVybiBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuY2hhbmdlVHlwZS5hZGRpdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxlZnRFbXB0eSAmJiAhcmlnaHRFbXB0eSkKLQkJCQkJcmV0dXJuIENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5jaGFuZ2VUeXBlLmRlbGV0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxlZnRFbXB0eSAmJiAhcmlnaHRFbXB0eSkKLQkJCQkJcmV0dXJuIENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5jaGFuZ2VUeXBlLmFkZGl0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWxlZnRFbXB0eSAmJiByaWdodEVtcHR5KQotCQkJCQlyZXR1cm4gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmNoYW5nZVR5cGUuZGVsZXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5jaGFuZ2VUeXBlLmNoYW5nZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUltYWdlIGdldEltYWdlKCkgewotCQkJaW50IGNvZGU9IERpZmZlcmVuY2VyLkNIQU5HRTsKLQkJCXN3aXRjaCAoZkRpcmVjdGlvbikgewotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuUklHSFQ6Ci0JCQkJY29kZSs9IERpZmZlcmVuY2VyLkxFRlQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotCQkJCWNvZGUrPSBEaWZmZXJlbmNlci5SSUdIVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkFOQ0VTVE9SOgotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1Q6Ci0JCQkJY29kZSs9IERpZmZlcmVuY2VyLkNPTkZMSUNUSU5HOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvZGUgIT0gMCkKLQkJCQlyZXR1cm4gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKS5nZXRJbWFnZShjb2RlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihJRG9jdW1lbnQgZG9jLCBQb3NpdGlvbiByYW5nZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0cnkgewotCQkJCWludCBsPSBlbmQtc3RhcnQ7Ci0JCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJaW50IGRsPSByYW5nZS5sZW5ndGg7Ci0JCQkJCWlmIChsID4gZGwpCi0JCQkJCQlsPSBkbDsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBkbD0gZG9jLmdldExlbmd0aCgpOwotCQkJCQlpZiAoc3RhcnQrbCA+IGRsKQotCQkJCQkJbD0gZGwtc3RhcnQ7Ci0JCQkJfQotCQkJCQkKLQkJCQlQb3NpdGlvbiBwPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXA9IG5ldyBQb3NpdGlvbihzdGFydCwgbCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCWRvYy5hZGRQb3NpdGlvbihJRG9jdW1lbnRSYW5nZS5SQU5HRV9DQVRFR09SWSwgcCk7Ci0JCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQkJCXJldHVybiBwOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZWUpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXZvaWQgYWRkKERpZmYgZCkgewotCQkJaWYgKGZEaWZmcyA9PSBudWxsKQotCQkJCWZEaWZmcz0gbmV3IEFycmF5TGlzdCgpOwotCQkJZkRpZmZzLmFkZChkKTsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCQlpZiAoZkFuY2VzdG9yUG9zICE9IG51bGwgJiYgZkFuY2VzdG9yUG9zLmlzRGVsZXRlZCgpKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZMZWZ0UG9zLmlzRGVsZXRlZCgpIHx8IGZSaWdodFBvcy5pc0RlbGV0ZWQoKTsKLQkJfQotCQkKLQkJdm9pZCBzZXRSZXNvbHZlZChib29sZWFuIHIpIHsKLQkJCWZSZXNvbHZlZD0gcjsKLQkJCWlmIChyKQotCQkJCWZEaWZmcz0gbnVsbDsKLQkJfQotCi0JCWJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJCWlmICghZlJlc29sdmVkICYmIGZEaWZmcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgZT0gZkRpZmZzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJCURpZmYgZD0gKERpZmYpIGUubmV4dCgpOwotCQkJCQlpZiAoIWQuaXNSZXNvbHZlZCgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmUmVzb2x2ZWQ7Ci0JCX0KLQkJCi0vLwkJcHJpdmF0ZSBib29sZWFuIGlzSW5jb21pbmcoKSB7Ci0vLwkJCXN3aXRjaCAoZkRpcmVjdGlvbikgewotLy8JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLS8vCQkJCWlmIChmTGVmdElzTG9jYWwpCi0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQlicmVhazsKLS8vCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuTEVGVDoKLS8vCQkJCWlmICghZkxlZnRJc0xvY2FsKQotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBpc0luY29taW5nT3JDb25mbGljdGluZygpIHsKLQkJCXN3aXRjaCAoZkRpcmVjdGlvbikgewotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuUklHSFQ6Ci0JCQkJaWYgKGZMZWZ0SXNMb2NhbCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotCQkJCWlmICghZkxlZnRJc0xvY2FsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkNPTkZMSUNUOgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotLy8JCXByaXZhdGUgYm9vbGVhbiBpc1VucmVzb2x2ZWRJbmNvbWluZygpIHsKLS8vCQkJaWYgKGZSZXNvbHZlZCkKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJcmV0dXJuIGlzSW5jb21pbmcoKTsKLS8vCQl9Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNVbnJlc29sdmVkSW5jb21pbmdPckNvbmZsaWN0aW5nKCkgewotCQkJaWYgKGZSZXNvbHZlZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gaXNJbmNvbWluZ09yQ29uZmxpY3RpbmcoKTsKLQkJfQotCQkJCQotCQlQb3NpdGlvbiBnZXRQb3NpdGlvbihNZXJnZVNvdXJjZVZpZXdlciB3KSB7Ci0JCQlpZiAodyA9PSBmTGVmdCkKLQkJCQlyZXR1cm4gZkxlZnRQb3M7Ci0JCQlpZiAodyA9PSBmUmlnaHQpCi0JCQkJcmV0dXJuIGZSaWdodFBvczsKLQkJCWlmICh3ID09IGZBbmNlc3RvcikKLQkJCQlyZXR1cm4gZkFuY2VzdG9yUG9zOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFJldHVybnMgdHJ1ZSBpZiBnaXZlbiBjaGFyYWN0ZXIgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCB0aGlzIERpZmYuCi0JCSAqLwotCQlib29sZWFuIG92ZXJsYXBzKE1lcmdlU291cmNlVmlld2VyIHcsIGludCBzdGFydCwgaW50IGVuZCkgewotCQkJUG9zaXRpb24gaD0gZ2V0UG9zaXRpb24odyk7Ci0JCQlpZiAoaCAhPSBudWxsKSB7Ci0JCQkJaW50IGRzPSBoLmdldE9mZnNldCgpOwotCQkJCWludCBkZT0gZHMgKyBoLmdldExlbmd0aCgpOwotCQkJCWlmICgoc3RhcnQgPCBkZSkgJiYgKGVuZCA+PSBkcykpCi0JCQkJCXJldHVybiB0cnVlOwkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCQotCQlpbnQgZ2V0TWF4RGlmZkhlaWdodChib29sZWFuIHdpdGhBbmNlc3RvcikgewotCQkJUG9pbnQgcmVnaW9uPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQlpbnQgaD0gZkxlZnQuZ2V0TGluZVJhbmdlKGZMZWZ0UG9zLCByZWdpb24pLnk7Ci0JCQlpZiAod2l0aEFuY2VzdG9yKQotCQkJCWg9IE1hdGgubWF4KGgsIGZBbmNlc3Rvci5nZXRMaW5lUmFuZ2UoZkFuY2VzdG9yUG9zLCByZWdpb24pLnkpOwotCQkJcmV0dXJuIE1hdGgubWF4KGgsIGZSaWdodC5nZXRMaW5lUmFuZ2UoZlJpZ2h0UG9zLCByZWdpb24pLnkpOwotCQl9Ci0JCQotCQlpbnQgZ2V0QW5jZXN0b3JIZWlnaHQoKSB7Ci0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsJCQkKLQkJCXJldHVybiBmQW5jZXN0b3IuZ2V0TGluZVJhbmdlKGZBbmNlc3RvclBvcywgcmVnaW9uKS55OwotCQl9Ci0KLQkJaW50IGdldExlZnRIZWlnaHQoKSB7Ci0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsJCQkKLQkJCXJldHVybiBmTGVmdC5nZXRMaW5lUmFuZ2UoZkxlZnRQb3MsIHJlZ2lvbikueTsKLQkJfQotCi0JCWludCBnZXRSaWdodEhlaWdodCgpIHsKLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwkJCQotCQkJcmV0dXJuIGZSaWdodC5nZXRMaW5lUmFuZ2UoZlJpZ2h0UG9zLCByZWdpb24pLnk7Ci0JCX0KLQl9Ci0KLQkvLy0tLS0gTWVyZ2VUZXh0Vmlld2VyCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgbWVyZ2Ugdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIFRleHRNZXJnZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuTlVMTCwgY29uZmlndXJhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IG1lcmdlIHZpZXdlciB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZSBTV1Qgc3R5bGUgYml0cyBmb3IgdG9wIGxldmVsIGNvbXBvc2l0ZSBvZiB0aGlzIHZpZXdlcgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdAotCSAqLwotCXB1YmxpYyBUZXh0TWVyZ2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKHN0eWxlLCBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpLCBjb25maWd1cmF0aW9uKTsKLQkJCi0JCWZTeW1ib2xpY0ZvbnROYW1lPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCi0JCVN0cmluZyBwbGF0Zm9ybT0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCWZJc01vdGlmPSAibW90aWYiLmVxdWFscyhwbGF0Zm9ybSk7IC8vJE5PTi1OTFMtMSQKLQkJZklzQ2FyYm9uPSAiY2FyYm9uIi5lcXVhbHMocGxhdGZvcm0pOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoZklzTW90aWYpCi0JCQlmTWFyZ2luV2lkdGg9IDA7Ci0JCQkKLQkJRGlzcGxheSBkaXNwbGF5PSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkKLQkJZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcj0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRleHRNZXJnZVZpZXdlci50aGlzLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQotCQlmUHJlZmVyZW5jZVN0b3JlPSBjb25maWd1cmF0aW9uLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSB7Ci0JCQlmUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkKLQkJCWNoZWNrRm9yQ29sb3JVcGRhdGUoZGlzcGxheSk7Ci0KLQkJCWZMZWZ0SXNMb2NhbD0gVXRpbGl0aWVzLmdldEJvb2xlYW4oY29uZmlndXJhdGlvbiwgIkxFRlRfSVNfTE9DQUwiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZTeW5jaHJvbml6ZWRTY3JvbGxpbmc9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuU1lOQ0hST05JWkVfU0NST0xMSU5HKTsKLQkJCWZTaG93TW9yZUluZm89IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuU0hPV19NT1JFX0lORk8pOwotCQkJZlNob3dQc2V1ZG9Db25mbGljdHM9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuU0hPV19QU0VVRE9fQ09ORkxJQ1RTKTsKLQkJCS8vZlVzZVNwbGluZXM9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1NQTElORVMpOwotCQkJZlVzZVNpbmdsZUxpbmU9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1NJTkdMRV9MSU5FKTsKLQkJCS8vZlVzZVJlc29sdmVVST0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfUkVTT0xWRV9VSSk7Ci0JCX0KLQkJCi0JCWZEb2N1bWVudExpc3RlbmVyPSBuZXcgSURvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlUZXh0TWVyZ2VWaWV3ZXIudGhpcy5kb2N1bWVudENoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlidWlsZENvbnRyb2wocGFyZW50KTsKLQkJCi0JCUlOYXZpZ2F0YWJsZSBuYXY9IG5ldyBJTmF2aWdhdGFibGUoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBnb3RvRGlmZmVyZW5jZShib29sZWFuIG5leHQpIHsKLQkJCQlyZXR1cm4gbmF2aWdhdGUobmV4dCwgZmFsc2UsIGZhbHNlKTsKLQkJCX0KLQkJfTsKLQkJZkNvbXBvc2l0ZS5zZXREYXRhKElOYXZpZ2F0YWJsZS5OQVZJR0FUT1JfUFJPUEVSVFksIG5hdik7Ci0JCQotCQlmQmlyZHNFeWVDdXJzb3I9IG5ldyBDdXJzb3IocGFyZW50LmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9IQU5EKTsKLQkJCi0JCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmFkZExpc3RlbmVyKGZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXVwZGF0ZUZvbnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZvbnQoKSB7Ci0JCUZvbnQgZj0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChmU3ltYm9saWNGb250TmFtZSk7Ci0JCWlmIChmICE9IG51bGwpIHsKLQkJCWlmIChmQW5jZXN0b3IgIT0gbnVsbCkKLQkJCQlmQW5jZXN0b3Iuc2V0Rm9udChmKTsKLQkJCWlmIChmTGVmdCAhPSBudWxsKQotCQkJCWZMZWZ0LnNldEZvbnQoZik7Ci0JCQlpZiAoZlJpZ2h0ICE9IG51bGwpCi0JCQkJZlJpZ2h0LnNldEZvbnQoZik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yQ29sb3JVcGRhdGUoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmIChmUG9sbFN5c3RlbUZvcmVncm91bmQpIHsKLQkJCVJHQiBmZz0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKS5nZXRSR0IoKTsKLQkJCWlmIChmRm9yZWdyb3VuZCA9PSBudWxsIHx8ICFmZy5lcXVhbHMoZkZvcmVncm91bmQpKSB7Ci0JCQkJZkZvcmVncm91bmQ9IGZnOwotCQkJCXVwZGF0ZUNvbG9ycyhkaXNwbGF5KTsKLQkJCX0KLQkJfQotCQlpZiAoZlBvbGxTeXN0ZW1CYWNrZ3JvdW5kKSB7Ci0JCQlSR0IgYmc9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkuZ2V0UkdCKCk7Ci0JCQlpZiAoZkJhY2tncm91bmQgPT0gbnVsbCB8fCAhYmcuZXF1YWxzKGZCYWNrZ3JvdW5kKSkgewotCQkJCWZCYWNrZ3JvdW5kPSBiZzsKLQkJCQl1cGRhdGVDb2xvcnMoZGlzcGxheSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdmlld2VyJ3MgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgZ2l2ZW4gUkdCIHZhbHVlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIGlzIHVzZWQuCi0JICogQHBhcmFtIGJhY2tncm91bmQgdGhlIGJhY2tncm91bmQgY29sb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKFJHQiBiYWNrZ3JvdW5kKSB7Ci0JCWZQb2xsU3lzdGVtQmFja2dyb3VuZD0gKGJhY2tncm91bmQgPT0gbnVsbCk7Ci0JCWZCYWNrZ3JvdW5kPSBiYWNrZ3JvdW5kOwotCQl1cGRhdGVDb2xvcnMobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgUkdCIGdldEJhY2tncm91bmQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmIChmQmFja2dyb3VuZCAhPSBudWxsKQotCQkJcmV0dXJuIGZCYWNrZ3JvdW5kOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheT0gZkNvbXBvc2l0ZS5nZXREaXNwbGF5KCk7Ci0JCXJldHVybiBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpLmdldFJHQigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2aWV3ZXIncyBmb3JlZ3JvdW5kIGNvbG9yIHRvIHRoZSBnaXZlbiBSR0IgdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IgaXMgdXNlZC4KLQkgKiBAcGFyYW0gZm9yZWdyb3VuZCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIHN5c3RlbSdzIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoUkdCIGZvcmVncm91bmQpIHsKLQkJZlBvbGxTeXN0ZW1Gb3JlZ3JvdW5kPSAoZm9yZWdyb3VuZCA9PSBudWxsKTsKLQkJZkZvcmVncm91bmQ9IGZvcmVncm91bmQ7Ci0JCXVwZGF0ZUNvbG9ycyhudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbG9ycyhEaXNwbGF5IGRpc3BsYXkpIHsKLQkJCi0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5PSBmQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCi0JCUNvbG9yIGNvbG9yPSBudWxsOwotCQlpZiAoZkJhY2tncm91bmQgIT0gbnVsbCkKLQkJCWNvbG9yPSBnZXRDb2xvcihkaXNwbGF5LCBmQmFja2dyb3VuZCk7Ci0JCQotCQlpZiAoZkFuY2VzdG9yICE9IG51bGwpCi0JCQlmQW5jZXN0b3Iuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLQkJaWYgKGZMZWZ0ICE9IG51bGwpCi0JCQlmTGVmdC5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotCQlpZiAoZlJpZ2h0ICE9IG51bGwpCi0JCQlmUmlnaHQuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLQkJCQkJCQotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5PSBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQlSR0IgYmc9IGdldEJhY2tncm91bmQoZGlzcGxheSk7Ci0JCVNFTEVDVEVEX0lOQ09NSU5HPSByZWdpc3RyeS5nZXRSR0IoSU5DT01JTkdfQ09MT1IpOwotCQlpZiAoU0VMRUNURURfSU5DT01JTkcgPT0gbnVsbCkKLQkJCVNFTEVDVEVEX0lOQ09NSU5HPSBuZXcgUkdCKDAsIDAsIDI1NSk7CS8vIEJMVUUKLQkJSU5DT01JTkc9IGludGVycG9sYXRlKFNFTEVDVEVEX0lOQ09NSU5HLCBiZywgMC42KTsKLQkJSU5DT01JTkdfRklMTD0gaW50ZXJwb2xhdGUoU0VMRUNURURfSU5DT01JTkcsIGJnLCAwLjk3KTsKLQotCQlTRUxFQ1RFRF9PVVRHT0lORz0gcmVnaXN0cnkuZ2V0UkdCKE9VVEdPSU5HX0NPTE9SKTsKLQkJaWYgKFNFTEVDVEVEX09VVEdPSU5HID09IG51bGwpCi0JCQlTRUxFQ1RFRF9PVVRHT0lORz0gbmV3IFJHQigwLCAwLCAwKTsJLy8gQkxBQ0sKLQkJT1VUR09JTkc9IGludGVycG9sYXRlKFNFTEVDVEVEX09VVEdPSU5HLCBiZywgMC42KTsKLQkJT1VUR09JTkdfRklMTD0gaW50ZXJwb2xhdGUoU0VMRUNURURfT1VUR09JTkcsIGJnLCAwLjk3KTsKLQkJCi0JCVNFTEVDVEVEX0NPTkZMSUNUPSByZWdpc3RyeS5nZXRSR0IoQ09ORkxJQ1RJTkdfQ09MT1IpOwotCQlpZiAoU0VMRUNURURfQ09ORkxJQ1QgPT0gbnVsbCkKLQkJCVNFTEVDVEVEX0NPTkZMSUNUPSBuZXcgUkdCKDI1NSwgMCwgMCk7CS8vIFJFRAotCQlDT05GTElDVD0gaW50ZXJwb2xhdGUoU0VMRUNURURfQ09ORkxJQ1QsIGJnLCAwLjYpOwotCQlDT05GTElDVF9GSUxMPSBpbnRlcnBvbGF0ZShTRUxFQ1RFRF9DT05GTElDVCwgYmcsIDAuOTcpOwotCQotCQlSRVNPTFZFRD0gcmVnaXN0cnkuZ2V0UkdCKFJFU09MVkVEX0NPTE9SKTsKLQkJaWYgKFJFU09MVkVEID09IG51bGwpCi0JCQlSRVNPTFZFRD0gbmV3IFJHQigwLCAyNTUsIDApOwkvLyBHUkVFTgotCQkJCQotCQlyZWZyZXNoQmlyZHNFeWVWaWV3KCk7Ci0JCWludmFsaWRhdGVMaW5lcygpOwotCQkKLQkJdXBkYXRlQWxsRGlmZkJhY2tncm91bmRzKGRpc3BsYXkpOwotCX0KLQkKLQkvKioKLQkgKiBJbnZhbGlkYXRlcyB0aGUgY3VycmVudCBwcmVzZW50YXRpb24gYnkgaW52YWxpZGF0aW5nIHRoZSB0aHJlZSB0ZXh0IHZpZXdlcnMuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCkgewotCQlpZiAoZkFuY2VzdG9yICE9IG51bGwpCi0JCQlmQW5jZXN0b3IuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQkJaWYgKGZMZWZ0ICE9IG51bGwpCi0JCQlmTGVmdC5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCQlpZiAoZlJpZ2h0ICE9IG51bGwpCi0JCQlmUmlnaHQuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgcGFzc2VkIHRleHQgdmlld2VyLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgdGhyZWUgdGV4dCB2aWV3ZXJzIGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGUKLQkgKiBjb250ZW50IGFyZWFzLgotCSAqIFRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLQkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0byBwcm92aWRlIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRleHQgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIHRleHRWaWV3ZXIgdGhlIHRleHQgdmlld2VyIHRvIGNvbmZpZ3VyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRleHRWaWV3ZXIoVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCS8vIGVtcHR5IGltcGwKLQl9Ci0JCQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhbiA8Y29kZT5JVG9rZW5Db21wYXJhdG9yPC9jb2RlPiB3aGljaCBpcyB1c2VkIHRvIHNob3cgdGhlCi0JICogaW50cmEgbGluZSBkaWZmZXJlbmNlcy4KLQkgKiBUaGUgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgCi0JICogdG9rZW5pemVyIHRoYXQgYnJlYWtzIGEgbGluZSBpbnRvIHdvcmRzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRvIHByb3ZpZGUgYSBzcGVjaWZpYyB0b2tlbml6ZXIuCi0JICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgPGNvZGU+SVRva2VuQ29tcGFyYXRvcjwvY29kZT4KLQkgKiBAcmV0dXJuIGEgSVRva2VuQ29tcGFyYXRvciB3aGljaCBpcyB1c2VkIGZvciBhIHNlY29uZCBsZXZlbCB0b2tlbiBjb21wYXJlLgotCSAqLwotCXByb3RlY3RlZCBJVG9rZW5Db21wYXJhdG9yIGNyZWF0ZVRva2VuQ29tcGFyYXRvcihTdHJpbmcgbGluZSkgewotCQlyZXR1cm4gbmV3IFRva2VuQ29tcGFyYXRvcihsaW5lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGRvY3VtZW50IHBhcnRpdGlvbmVyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgdW5kZXJseWluZyBjb250ZW50IHR5cGUuCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgaWYgdGhlIGlucHV0IHByb3ZpZGVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIGlzIGEKLQkgKiA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPiBhbmQgYW4gaW50ZXJuYWwgZG9jdW1lbnQgbXVzdCBiZSBjcmVhdGVkLiBUaGlzCi0JICogZG9jdW1lbnQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcGFydGl0aW9uZXIgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZC4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+VGV4dE1lcmdlVmlld2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0byBjcmVhdGUgYSBwYXJ0aXRpb25lciBmb3IgYSAKLQkgKiBzcGVjaWZpYyBjb250ZW50IHR5cGUuCi0JICoKLQkgKiBAcmV0dXJuIGEgZG9jdW1lbnQgcGFydGl0aW9uZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgb24gdGhlIHZpZXdlciBkaXNwb3NhbC4KLQkgKiBVbnJlZ2lzdGVycyBmcm9tIHRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24uCi0JICogQ2xpZW50cyBtYXkgZXh0ZW5kIGlmIHRoZXkgaGF2ZSB0byBkbyBhZGRpdGlvbmFsIGNsZWFudXAuCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZShEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCi0JCWlmIChmS2V5QmluZGluZ1NlcnZpY2UgIT0gbnVsbCkgewotCQkJSUFjdGlvbiBhOwotCQkJaWYgKGZOZXh0SXRlbSAhPSBudWxsKSB7Ci0JCQkJYT0gZk5leHRJdGVtLmdldEFjdGlvbigpOwotCQkJCWlmIChhICE9IG51bGwpCi0JCQkJCWZLZXlCaW5kaW5nU2VydmljZS51bnJlZ2lzdGVyQWN0aW9uKGEpOwotCQkJfQotCQkJaWYgKGZQcmV2aW91c0l0ZW0gIT0gbnVsbCkgewotCQkJCWE9IGZQcmV2aW91c0l0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQkJZktleUJpbmRpbmdTZXJ2aWNlLnVucmVnaXN0ZXJBY3Rpb24oYSk7Ci0JCQl9Ci0JCQlpZiAoZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtICE9IG51bGwpIHsKLQkJCQlhPSBmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQkJZktleUJpbmRpbmdTZXJ2aWNlLnVucmVnaXN0ZXJBY3Rpb24oYSk7Ci0JCQl9Ci0JCQlpZiAoZkNvcHlEaWZmUmlnaHRUb0xlZnRJdGVtICE9IG51bGwpIHsKLQkJCQlhPSBmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQkJZktleUJpbmRpbmdTZXJ2aWNlLnVucmVnaXN0ZXJBY3Rpb24oYSk7Ci0JCQl9Ci0JCQlmS2V5QmluZGluZ1NlcnZpY2U9IG51bGw7Ci0JCX0KLQkJCi0JCU9iamVjdCBpbnB1dD0gZ2V0SW5wdXQoKTsKLQkJRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZShnZXREb2N1bWVudDIoJ0EnLCBpbnB1dCkpOwotCQlEb2N1bWVudE1hbmFnZXIucmVtb3ZlKGdldERvY3VtZW50MignTCcsIGlucHV0KSk7Ci0JCURvY3VtZW50TWFuYWdlci5yZW1vdmUoZ2V0RG9jdW1lbnQyKCdSJywgaW5wdXQpKTsKLQkJCi0JCWlmIChERUJVRykKLQkJCURvY3VtZW50TWFuYWdlci5kdW1wKCk7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKQotCQkJCWZQcmVmZXJlbmNlU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJCWZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI9IG51bGw7Ci0JCX0KLQkJCi0JCWZMZWZ0Q2FudmFzPSBudWxsOwotCQlmUmlnaHRDYW52YXM9IG51bGw7Ci0JCWZWU2Nyb2xsQmFyPSBudWxsOwotCQlmQmlyZHNFeWVDYW52YXM9IG51bGw7Ci0JCWZTdW1tYXJ5SGVhZGVyPSBudWxsOwotCi0JCXVuc2V0RG9jdW1lbnQoZkFuY2VzdG9yKTsKLQkJdW5zZXREb2N1bWVudChmTGVmdCk7Ci0JCXVuc2V0RG9jdW1lbnQoZlJpZ2h0KTsKLQkJCi0JCWlmIChmQ29sb3JzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGk9IGZDb2xvcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNvbG9yIGNvbG9yPSAoQ29sb3IpIGkubmV4dCgpOwotCQkJCWlmICghY29sb3IuaXNEaXNwb3NlZCgpKQotCQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmQ29sb3JzPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoZkJpcmRzRXllQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZCaXJkc0V5ZUN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQmlyZHNFeWVDdXJzb3I9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotICAJfQotICAJICAJICAJCQkJIAkJCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0gaW50ZXJuYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JLyoKLQkgKiBDcmVhdGVzIHRoZSBzcGVjaWZpYyBTV1QgY29udHJvbHMgZm9yIHRoZSBjb250ZW50IGFyZWFzLgotCSAqIENsaWVudHMgbXVzdCBub3QgY2FsbCBvciBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBJQ29tcGFyZUNvbnRleHRJZHMuVEVYVF9NRVJHRV9WSUVXKTsKLQkJCi0JCS8vIDFzdCByb3cKLQkJaWYgKGZNYXJnaW5XaWR0aCA+IDApIHsKLQkJCWZBbmNlc3RvckNhbnZhcz0gbmV3IEJ1ZmZlcmVkQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PTkUpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb1BhaW50KEdDIGdjKSB7Ci0JCQkJCXBhaW50U2lkZXMoZ2MsIGZBbmNlc3RvciwgZkFuY2VzdG9yQ2FudmFzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfTsKLQkJCWZBbmNlc3RvckNhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKAotCQkJCW5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJCXNldEN1cnJlbnREaWZmMihoYW5kbGVNb3VzZUluU2lkZXMoZkFuY2VzdG9yQ2FudmFzLCBmQW5jZXN0b3IsIGUueSksIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCQkJCQkJCQotCQlmQW5jZXN0b3I9IGNyZWF0ZVBhcnQoY29tcG9zaXRlKTsKLQkJZkFuY2VzdG9yLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCi0JCWZTdW1tYXJ5SGVhZGVyPSBuZXcgQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmSGVhZGVyUGFpbnRlcj0gbmV3IEhlYWRlclBhaW50ZXIoKTsKLQkJZlN1bW1hcnlIZWFkZXIuYWRkUGFpbnRMaXN0ZW5lcihmSGVhZGVyUGFpbnRlcik7Ci0JCXVwZGF0ZVJlc29sdmVTdGF0dXMoKTsKLQkJCQkKLQkJLy8gMm5kIHJvdwotCQlpZiAoZk1hcmdpbldpZHRoID4gMCkgewotCQkJZkxlZnRDYW52YXM9IG5ldyBCdWZmZXJlZENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9QYWludChHQyBnYykgewotCQkJCQlwYWludFNpZGVzKGdjLCBmTGVmdCwgZkxlZnRDYW52YXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9OwotCQkJZkxlZnRDYW52YXMuYWRkTW91c2VMaXN0ZW5lcigKLQkJCQluZXcgTW91c2VBZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJCQlzZXRDdXJyZW50RGlmZjIoaGFuZGxlTW91c2VJblNpZGVzKGZMZWZ0Q2FudmFzLCBmTGVmdCwgZS55KSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCQkKLQkJZkxlZnQ9IGNyZWF0ZVBhcnQoY29tcG9zaXRlKTsKLQkJZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmdldFZlcnRpY2FsQmFyKCkuc2V0VmlzaWJsZSghZlN5bmNocm9uaXplZFNjcm9sbGluZyk7Ci0JCWZMZWZ0LmFkZEFjdGlvbihNZXJnZVNvdXJjZVZpZXdlci5TQVZFX0lELCBmTGVmdFNhdmVBY3Rpb24pOwotCQkJCi0JCWZSaWdodD0gY3JlYXRlUGFydChjb21wb3NpdGUpOwotCQlmUmlnaHQuZ2V0VGV4dFdpZGdldCgpLmdldFZlcnRpY2FsQmFyKCkuc2V0VmlzaWJsZSghZlN5bmNocm9uaXplZFNjcm9sbGluZyk7Ci0JCWZSaWdodC5hZGRBY3Rpb24oTWVyZ2VTb3VyY2VWaWV3ZXIuU0FWRV9JRCwgZlJpZ2h0U2F2ZUFjdGlvbik7Ci0JCQotCQloc3luY2hWaWV3cG9ydChmQW5jZXN0b3IsIGZMZWZ0LCBmUmlnaHQpOwotCQloc3luY2hWaWV3cG9ydChmTGVmdCwgZkFuY2VzdG9yLCBmUmlnaHQpOwotCQloc3luY2hWaWV3cG9ydChmUmlnaHQsIGZBbmNlc3RvciwgZkxlZnQpOwotCi0JCWlmIChmTWFyZ2luV2lkdGggPiAwKSB7Ci0JCQlmUmlnaHRDYW52YXM9IG5ldyBCdWZmZXJlZENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9QYWludChHQyBnYykgewotCQkJCQlwYWludFNpZGVzKGdjLCBmUmlnaHQsIGZSaWdodENhbnZhcywgZlN5bmNocm9uaXplZFNjcm9sbGluZyk7Ci0JCQkJfQotCQkJfTsKLQkJCWZSaWdodENhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKAotCQkJCW5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJCXNldEN1cnJlbnREaWZmMihoYW5kbGVNb3VzZUluU2lkZXMoZlJpZ2h0Q2FudmFzLCBmUmlnaHQsIGUueSksIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCi0JCWZTY3JvbGxDYW52YXM9IG5ldyBDYW52YXMoY29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwpOwotCQlSZWN0YW5nbGUgdHJpbT0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQlmVG9wSW5zZXQ9IHRyaW0ueTsKLQkJCi0JCWZWU2Nyb2xsQmFyPSBmU2Nyb2xsQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWZWU2Nyb2xsQmFyLnNldEluY3JlbWVudCgxKTsKLQkJZlZTY3JvbGxCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJZlZTY3JvbGxCYXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwKLQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWludCB2cG9zPSAoKFNjcm9sbEJhcillLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXNjcm9sbFZlcnRpY2FsKHZwb3MsIHZwb3MsIHZwb3MsIG51bGwpOwotCQkJCQl3b3JrYXJvdW5kNjUyMDUoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlmQmlyZHNFeWVDYW52YXM9IG5ldyBCdWZmZXJlZENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb1BhaW50KEdDIGdjKSB7Ci0JCQkJcGFpbnRCaXJkc0V5ZVZpZXcodGhpcywgZ2MpOwotCQkJfQotCQl9OwotCQlmQmlyZHNFeWVDYW52YXMuYWRkTW91c2VMaXN0ZW5lcigKLQkJCW5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCQlzZXRDdXJyZW50RGlmZjIoaGFuZGxlbW91c2VJbkJpcmRzRXllVmlldyhmQmlyZHNFeWVDYW52YXMsIGUueSksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZkJpcmRzRXllQ2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKAotCQkJbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJCQotCQkJCXByaXZhdGUgQ3Vyc29yIGZMYXN0Q3Vyc29yOwotCQkJCQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCQkJQ3Vyc29yIGN1cnNvcj0gbnVsbDsKLQkJCQkJRGlmZiBkaWZmPSBoYW5kbGVtb3VzZUluQmlyZHNFeWVWaWV3KGZCaXJkc0V5ZUNhbnZhcywgZS55KTsKLQkJCQkJaWYgKGRpZmYgIT0gbnVsbCAmJiBkaWZmLmZEaXJlY3Rpb24gIT0gUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFKQotCQkJCQkJY3Vyc29yPSBmQmlyZHNFeWVDdXJzb3I7Ci0JCQkJCWlmIChmTGFzdEN1cnNvciAhPSBjdXJzb3IpIHsKLQkJCQkJCWZCaXJkc0V5ZUNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCQkJCWZMYXN0Q3Vyc29yPSBjdXJzb3I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoc3luY2hWaWV3cG9ydChmaW5hbCBUZXh0Vmlld2VyIHR2MSwgZmluYWwgVGV4dFZpZXdlciB0djIsIGZpbmFsIFRleHRWaWV3ZXIgdHYzKSB7Ci0JCWZpbmFsIFN0eWxlZFRleHQgc3QxPSB0djEuZ2V0VGV4dFdpZGdldCgpOwotCQlmaW5hbCBTdHlsZWRUZXh0IHN0Mj0gdHYyLmdldFRleHRXaWRnZXQoKTsKLQkJZmluYWwgU3R5bGVkVGV4dCBzdDM9IHR2My5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWZpbmFsIFNjcm9sbEJhciBzYjE9IHN0MS5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCXNiMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCSAgICBpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZykgewotCQkJCQlpbnQgbWF4PSBzYjEuZ2V0TWF4aW11bSgpLXNiMS5nZXRUaHVtYigpOwotCQkJCQlkb3VibGUgdj0gMC4wOwotCQkJCQlpZiAobWF4ID4gMCkKLQkJCQkJCXY9IChmbG9hdClzYjEuZ2V0U2VsZWN0aW9uKCkgLyAoZmxvYXQpbWF4OwotCQkJCQlpZiAoc3QyLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlTY3JvbGxCYXIgc2IyPSBzdDIuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQkJCQkJc3QyLnNldEhvcml6b250YWxQaXhlbCgoaW50KSgoc2IyLmdldE1heGltdW0oKS1zYjIuZ2V0VGh1bWIoKSkgKiB2KSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHN0My5pc1Zpc2libGUoKSkgewotCQkJCQkJU2Nyb2xsQmFyIHNiMz0gc3QzLmdldEhvcml6b250YWxCYXIoKTsKLQkJCQkJCXN0My5zZXRIb3Jpem9udGFsUGl4ZWwoKGludCkoKHNiMy5nZXRNYXhpbXVtKCktc2IzLmdldFRodW1iKCkpICogdikpOwotCQkJCQl9Ci0JCQkJCXdvcmthcm91bmQ2NTIwNSgpOwotCQkJICAgIH0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQSB3b3JrYXJvdW5kIGZvciBidWcgIzY1MjA1LgotCSAqIE9uIE1hY09TIFggYSBEaXNwbGF5LnVwZGF0ZSgpIGlzIHJlcXVpcmVkIHRvIGZsdXNoIHBlbmRpbmcgcGFpbnQgcmVxdWVzdHMgYWZ0ZXIKLQkgKiBwcm9ncmFtbWF0aWNhbCBzY29sbGluZy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdvcmthcm91bmQ2NTIwNSgpIHsKLQkJaWYgKGZJc0NhcmJvbiAmJiBmQ29tcG9zaXRlICE9IG51bGwgJiYgIWZDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotCQkJZkNvbXBvc2l0ZS5nZXREaXNwbGF5KCkudXBkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnREaWZmMihEaWZmIGRpZmYsIGJvb2xlYW4gcmV2ZWFsKSB7Ci0JCWlmIChkaWZmICE9IG51bGwgJiYgZGlmZi5mRGlyZWN0aW9uICE9IFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSkgewotCQkJLy9mQ3VycmVudERpZmY9IG51bGw7Ci0JCQlzZXRDdXJyZW50RGlmZihkaWZmLCByZXZlYWwpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgRGlmZiBoYW5kbGVNb3VzZUluU2lkZXMoQ2FudmFzIGNhbnZhcywgTWVyZ2VTb3VyY2VWaWV3ZXIgdHAsIGludCBteSkgewotCi0JCWludCBsaW5lSGVpZ2h0PSB0cC5nZXRUZXh0V2lkZ2V0KCkuZ2V0TGluZUhlaWdodCgpOwotCQlpbnQgdmlzaWJsZUhlaWdodD0gdHAuZ2V0Vmlld3BvcnRIZWlnaHQoKTsKLQotCQlpZiAoISBmSGlnaGxpZ2h0UmFuZ2VzKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2hpZnQ9IHRwLmdldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KCkgKyAoMi1MVyk7Ci0KLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQlpZiAoZGlmZi5pc0RlbGV0ZWQoKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoZlNob3dDdXJyZW50T25seTIgJiYgIWlzQ3VycmVudERpZmYoZGlmZikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJdHAuZ2V0TGluZVJhbmdlKGRpZmYuZ2V0UG9zaXRpb24odHApLCByZWdpb24pOwotCQkJCWludCB5PSAocmVnaW9uLnggKiBsaW5lSGVpZ2h0KSArIHNoaWZ0OwotCQkJCWludCBoPSByZWdpb24ueSAqIGxpbmVIZWlnaHQ7Ci0KLQkJCQlpZiAoeStoIDwgMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHkgPj0gdmlzaWJsZUhlaWdodCkKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWlmIChteSA+PSB5ICYmIG15IDwgeStoKQotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWZmIGdldERpZmZVbmRlck1vdXNlKENhbnZhcyBjYW52YXMsIGludCBteCwgaW50IG15LCBSZWN0YW5nbGUgcikgewotCi0JCWlmICghIGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbGluZUhlaWdodD0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmdldExpbmVIZWlnaHQoKTsKLQkJaW50IHZpc2libGVIZWlnaHQ9IGZSaWdodC5nZXRWaWV3cG9ydEhlaWdodCgpOwotCi0JCVBvaW50IHNpemU9IGNhbnZhcy5nZXRTaXplKCk7Ci0JCWludCB3PSBzaXplLng7Ci0KLQkJaWYgKCEgZkhpZ2hsaWdodFJhbmdlcykKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChmQ2hhbmdlRGlmZnMgIT0gbnVsbCkgewotCQkJaW50IGxzaGlmdD0gZkxlZnQuZ2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKTsKLQkJCWludCByc2hpZnQ9IGZSaWdodC5nZXRWZXJ0aWNhbFNjcm9sbE9mZnNldCgpOwotCi0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsKLQotCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQlpZiAoZGlmZi5pc0RlbGV0ZWQoKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoZlNob3dDdXJyZW50T25seTIgJiYgIWlzQ3VycmVudERpZmYoZGlmZikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJZkxlZnQuZ2V0TGluZVJhbmdlKGRpZmYuZkxlZnRQb3MsIHJlZ2lvbik7Ci0JCQkJaW50IGx5PSAocmVnaW9uLnggKiBsaW5lSGVpZ2h0KSArIGxzaGlmdDsKLQkJCQlpbnQgbGg9IHJlZ2lvbi55ICogbGluZUhlaWdodDsKLQotCQkJCWZSaWdodC5nZXRMaW5lUmFuZ2UoZGlmZi5mUmlnaHRQb3MsIHJlZ2lvbik7Ci0JCQkJaW50IHJ5PSAocmVnaW9uLnggKiBsaW5lSGVpZ2h0KSArIHJzaGlmdDsKLQkJCQlpbnQgcmg9IHJlZ2lvbi55ICogbGluZUhlaWdodDsKLQotCQkJCWlmIChNYXRoLm1heChseStsaCwgcnkrcmgpIDwgMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKE1hdGgubWluKGx5LCByeSkgPj0gdmlzaWJsZUhlaWdodCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpbnQgY3g9ICh3LVJFU09MVkVfU0laRSkvMjsKLQkJCQlpbnQgY3k9ICgobHkrbGgvMikgKyAocnkrcmgvMikgLSBSRVNPTFZFX1NJWkUpLzI7IAotCQkJCWlmIChteSA+PSBjeSAmJiBteSA8IGN5K1JFU09MVkVfU0laRSAmJiBteCA+PSBjeCAmJiBteCA8IGN4K1JFU09MVkVfU0laRSkgewotCQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgU0laRT0gZklzQ2FyYm9uID8gMzAgOiAyMDsKLQkJCQkJCXIueD0gY3grKFJFU09MVkVfU0laRS1TSVpFKS8yOwotCQkJCQkJci55PSBjeSsoUkVTT0xWRV9TSVpFLVNJWkUpLzI7Ci0JCQkJCQlyLndpZHRoPSBTSVpFOwotCQkJCQkJci5oZWlnaHQ9IFNJWkU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGRpZmY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRGlmZiBoYW5kbGVtb3VzZUluQmlyZHNFeWVWaWV3KENhbnZhcyBjYW52YXMsIGludCBteSkgewotCQlpbnQgeXksIGhoOwotCQkKLQkJUG9pbnQgc2l6ZT0gY2FudmFzLmdldFNpemUoKTsKLQkJCi0JCWludCB2aXJ0dWFsSGVpZ2h0PSBmU3luY2hyb25pemVkU2Nyb2xsaW5nID8gZ2V0VmlydHVhbEhlaWdodCgpIDogZ2V0UmlnaHRIZWlnaHQoKTsJCQotCQlpZiAodmlydHVhbEhlaWdodCA8IGdldFZpZXdwb3J0SGVpZ2h0KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCB5PSAwOwotCQlpZiAoZkFsbERpZmZzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGU9IGZBbGxEaWZmcy5pdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaT0gMDsgZS5oYXNOZXh0KCk7IGkrKykgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWludCBoPSBmU3luY2hyb25pemVkU2Nyb2xsaW5nID8gZGlmZi5nZXRNYXhEaWZmSGVpZ2h0KGZTaG93QW5jZXN0b3IpCi0JCQkJCQkJCQkJCSAgOiBkaWZmLmdldFJpZ2h0SGVpZ2h0KCk7Ci0JCQkJaWYgKHVzZUNoYW5nZShkaWZmLmZEaXJlY3Rpb24pICYmICFkaWZmLmZJc1doaXRlc3BhY2UpIHsKLQkJCQkJCQkJCQotCQkJCQl5eT0gKHkqc2l6ZS55KS92aXJ0dWFsSGVpZ2h0OwotCQkJCQloaD0gKGgqc2l6ZS55KS92aXJ0dWFsSGVpZ2h0OwotCQkJCQlpZiAoaGggPCAzKQotCQkJCQkJaGg9IDM7Ci0JCQkJCQkKLQkJCQkJaWYgKG15ID49IHl5ICYmIG15IDwgeXkraGgpCi0JCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQl9Ci0JCQkJeSs9IGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYWludEJpcmRzRXllVmlldyhDYW52YXMgY2FudmFzLCBHQyBnYykgewotCQkKLQkJQ29sb3IgYzsKLQkJUmVjdGFuZ2xlIHI9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0JCWludCB5eSwgaGg7Ci0JCQotCQlQb2ludCBzaXplPSBjYW52YXMuZ2V0U2l6ZSgpOwotCQkKLQkJaW50IHZpcnR1YWxIZWlnaHQ9IGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgPyBnZXRWaXJ0dWFsSGVpZ2h0KCkgOiBnZXRSaWdodEhlaWdodCgpOwkJCi0JCWlmICh2aXJ0dWFsSGVpZ2h0IDwgZ2V0Vmlld3BvcnRIZWlnaHQoKSkKLQkJCXJldHVybjsKLQkJCQkKLQkJRGlzcGxheSBkaXNwbGF5PSBjYW52YXMuZ2V0RGlzcGxheSgpOwotCQlpbnQgeT0gMDsKLQkJaWYgKGZBbGxEaWZmcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlPSBmQWxsRGlmZnMuaXRlcmF0b3IoKTsKLQkJCWZvciAoaW50IGk9IDA7IGUuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQlpbnQgaD0gZlN5bmNocm9uaXplZFNjcm9sbGluZyA/IGRpZmYuZ2V0TWF4RGlmZkhlaWdodChmU2hvd0FuY2VzdG9yKQotCQkJCQkJCQkJCQkgIDogZGlmZi5nZXRSaWdodEhlaWdodCgpOwotCQkJCQkJCQkKLQkJCQlpZiAodXNlQ2hhbmdlKGRpZmYuZkRpcmVjdGlvbikgJiYgIWRpZmYuZklzV2hpdGVzcGFjZSkgewotCQkJCQkKLQkJCQkJeXk9ICh5KnNpemUueSkvdmlydHVhbEhlaWdodDsKLQkJCQkJaGg9IChoKnNpemUueSkvdmlydHVhbEhlaWdodDsKLQkJCQkJaWYgKGhoIDwgMykKLQkJCQkJCWhoPSAzOwotCQkJCQkKLQkJCQkJYz0gZ2V0Q29sb3IoZGlzcGxheSwgZ2V0RmlsbENvbG9yKGRpZmYpKTsKLQkJCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCQkJZ2Muc2V0QmFja2dyb3VuZChjKTsKLQkJCQkJCWdjLmZpbGxSZWN0YW5nbGUoQklSRFNfRVlFX1ZJRVdfSU5TRVQsIHl5LCBzaXplLngtKDIqQklSRFNfRVlFX1ZJRVdfSU5TRVQpLGhoKTsKLQkJCQkJfQotCQkJCQljPSBnZXRDb2xvcihkaXNwbGF5LCBnZXRTdHJva2VDb2xvcihkaWZmKSk7Ci0JCQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQkJCWdjLnNldEZvcmVncm91bmQoYyk7Ci0JCQkJCQlyLng9IEJJUkRTX0VZRV9WSUVXX0lOU0VUOwotCQkJCQkJci55PSB5eTsKLQkJCQkJCXIud2lkdGg9IHNpemUueC0oMipCSVJEU19FWUVfVklFV19JTlNFVCktMTsKLQkJCQkJCXIuaGVpZ2h0PSBoaDsKLQkJCQkJCWlmIChkaWZmID09IGZDdXJyZW50RGlmZiB8fAotCQkJCQkJCQkoZkN1cnJlbnREaWZmICE9IG51bGwgJiYgZGlmZiA9PSBmQ3VycmVudERpZmYuZlBhcmVudCkpIHsKLQkJCQkJCQlnYy5zZXRMaW5lV2lkdGgoMik7Ci0JCQkJCQkJci54Kys7Ci0JCQkJCQkJci55Kys7Ci0JCQkJCQkJci53aWR0aC0tOwotCQkJCQkJCXIuaGVpZ2h0LS07Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWdjLnNldExpbmVXaWR0aCgxKTsKLQkJCQkJCX0KLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUocik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJeSs9IGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hCaXJkc0V5ZVZpZXcoKSB7Ci0JCWlmIChmQmlyZHNFeWVDYW52YXMgIT0gbnVsbCkKLQkJCWZCaXJkc0V5ZUNhbnZhcy5yZWRyYXcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgc2V0Rm9jdXMoKSBpcyBjYWxsZWQgb24gdGhlIENvbnRlbnRWaWV3ZXIncyB0b3AgbGV2ZWwgU1dUIENvbXBvc2l0ZS4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNldHMgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBlbmFibGVkIHRleHQgd2lkZ2V0LgotCSAqLwotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpbnRlcm5hbFNldEZvY3VzKCkgewotCQlpZiAoZkZvY3VzUGFydCA9PSBudWxsKSB7Ci0JCQlpZiAoZkxlZnQgIT0gbnVsbCAmJiBmTGVmdC5nZXRFbmFibGVkKCkpIHsKLQkJCQlmRm9jdXNQYXJ0PSBmTGVmdDsKLQkJCX0gZWxzZSBpZiAoZlJpZ2h0ICE9IG51bGwgJiYgZlJpZ2h0LmdldEVuYWJsZWQoKSkgewotCQkJCWZGb2N1c1BhcnQ9IGZSaWdodDsKLQkJCX0gZWxzZSBpZiAoZkFuY2VzdG9yICE9IG51bGwgJiYgZkFuY2VzdG9yLmdldEVuYWJsZWQoKSkgewotCQkJCWZGb2N1c1BhcnQ9IGZBbmNlc3RvcjsKLQkJCX0KLQkJfQotCQlpZiAoZkZvY3VzUGFydCAhPSBudWxsKSB7Ci0JCQlTdHlsZWRUZXh0IHN0PSBmRm9jdXNQYXJ0LmdldFRleHRXaWRnZXQoKTsKLQkJCWlmIChzdCAhPSBudWxsKQotCQkJCXJldHVybiBzdC5zZXRGb2N1cygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJLy8gY291bGQgbm90IHNldCBmb2N1cwotCX0KLQkKLQkKLQljbGFzcyBIb3ZlclJlc2l6ZXIgZXh0ZW5kcyBSZXNpemVyIHsKLQkJQ2FudmFzIGZDYW52YXM7Ci0JCXB1YmxpYyBIb3ZlclJlc2l6ZXIoQ2FudmFzIGMsIGludCBkaXIpIHsKLQkJCXN1cGVyKGMsIGRpcik7Ci0JCQlmQ2FudmFzPSBjOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCWlmICghZklzRG93biAmJiBmVXNlU2luZ2xlTGluZSAmJiBzaG93UmVzb2x2ZVVJKCkgJiYgaGFuZGxlTW91c2VNb3ZlT3ZlckNlbnRlcihmQ2FudmFzLCBlLngsIGUueSkpCi0JCQkJcmV0dXJuOwotCQkJc3VwZXIubW91c2VNb3ZlKGUpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ3JlYXRlcyB0aGUgY2VudHJhbCBDYW52YXMuCi0JICogQ2FsbGVkIGZyb20gQ29udGVudE1lcmdlVmlld2VyLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gQ29udHJvbCBjcmVhdGVDZW50ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZykgewotCQkJZmluYWwgQ2FudmFzIGNhbnZhcz0gbmV3IEJ1ZmZlcmVkQ2FudmFzKHBhcmVudCwgU1dULk5PTkUpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb1BhaW50KEdDIGdjKSB7Ci0JCQkJCXBhaW50Q2VudGVyKHRoaXMsIGdjKTsKLQkJCQl9Ci0JCQl9OwotCQkJaWYgKGZVc2VSZXNvbHZlVUkpIHsKLQkJCQkKLQkJCQluZXcgSG92ZXJSZXNpemVyKGNhbnZhcywgSE9SSVpPTlRBTCk7Ci0JCQkJCQkJCQotCQkJCWZDZW50ZXJCdXR0b249IG5ldyBCdXR0b24oY2FudmFzLCBmSXNDYXJib24gPyBTV1QuRkxBVCA6IFNXVC5QVVNIKTsKLQkJCQlpZiAoZk5vcm1hbEN1cnNvciA9PSBudWxsKSBmTm9ybWFsQ3Vyc29yPSBuZXcgQ3Vyc29yKGNhbnZhcy5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfQVJST1cpOwotCQkJCWZDZW50ZXJCdXR0b24uc2V0Q3Vyc29yKGZOb3JtYWxDdXJzb3IpOwotCQkJCWZDZW50ZXJCdXR0b24uc2V0VGV4dCgiPCIpOwkgLy8kTk9OLU5MUy0xJAotCQkJCWZDZW50ZXJCdXR0b24ucGFjaygpOwotCQkJCWZDZW50ZXJCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJZkNlbnRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQlpZiAoZkJ1dHRvbkRpZmYgIT0gbnVsbCkgewotCQkJCQkJCQlzZXRDdXJyZW50RGlmZihmQnV0dG9uRGlmZiwgZmFsc2UpOwotCQkJCQkJCQljb3B5KGZDdXJyZW50RGlmZiwgZmFsc2UsIGZDdXJyZW50RGlmZi5mRGlyZWN0aW9uID09IFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsJCQkJCi0JCQl9IGVsc2UgewotCQkJCW5ldyBSZXNpemVyKGNhbnZhcywgSE9SSVpPTlRBTCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjYW52YXM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNlbnRlcihwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlTW91c2VNb3ZlT3ZlckNlbnRlcihDYW52YXMgY2FudmFzLCBpbnQgeCwgaW50IHkpIHsKLQkJUmVjdGFuZ2xlIHI9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0JCURpZmYgZGlmZj0gZ2V0RGlmZlVuZGVyTW91c2UoY2FudmFzLCB4LCB5LCByKTsKLQkJaWYgKGRpZmYgIT0gbnVsbCAmJiAhZGlmZi5pc1VucmVzb2x2ZWRJbmNvbWluZ09yQ29uZmxpY3RpbmcoKSkKLQkJCWRpZmY9IG51bGw7Ci0JCWlmIChkaWZmICE9IGZCdXR0b25EaWZmKSB7Ci0JCQlpZiAoZGlmZiAhPSBudWxsKSB7Ci0JCQkJaWYgKGZMZWZ0LmlzRWRpdGFibGUoKSkgewotCQkJCQlmQnV0dG9uRGlmZj0gZGlmZjsKLQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRUZXh0KCI8Iik7CQkvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB0dD0gZkNvcHlEaWZmUmlnaHRUb0xlZnRJdGVtLmdldEFjdGlvbigpLmdldFRvb2xUaXBUZXh0KCk7Ci0JCQkJCWZDZW50ZXJCdXR0b24uc2V0VG9vbFRpcFRleHQodHQpOwotCQkJCQlmQ2VudGVyQnV0dG9uLnNldEJvdW5kcyhyKTsKLQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0gZWxzZSBpZiAoZlJpZ2h0LmlzRWRpdGFibGUoKSkgewotCQkJCQlmQnV0dG9uRGlmZj0gZGlmZjsKLQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRUZXh0KCI+Iik7CQkvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB0dD0gZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtLmdldEFjdGlvbigpLmdldFRvb2xUaXBUZXh0KCk7Ci0JCQkJCWZDZW50ZXJCdXR0b24uc2V0VG9vbFRpcFRleHQodHQpOwotCQkJCQlmQ2VudGVyQnV0dG9uLnNldEJvdW5kcyhyKTsKLQkJCQkJZkNlbnRlckJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwkJCQkJCQkJCQkKLQkJCQl9IGVsc2UKLQkJCQkJZkJ1dHRvbkRpZmY9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWZDZW50ZXJCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJZkJ1dHRvbkRpZmY9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZCdXR0b25EaWZmICE9IG51bGw7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB3aWR0aCBvZiBjZW50cmFsIGNhbnZhcy4KLQkgKiBPdmVycmlkZGVuIGZyb20gQ29udGVudE1lcmdlVmlld2VyLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gaW50IGdldENlbnRlcldpZHRoKCkgewotCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZykKLQkJCXJldHVybiBDRU5URVJfV0lEVEg7Ci0JCXJldHVybiBzdXBlci5nZXRDZW50ZXJXaWR0aCgpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSB0ZXh0IHBhcnQuCi0JICovCi0JcHJpdmF0ZSBNZXJnZVNvdXJjZVZpZXdlciBjcmVhdGVQYXJ0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCWZpbmFsIE1lcmdlU291cmNlVmlld2VyIHBhcnQ9IG5ldyBNZXJnZVNvdXJjZVZpZXdlcihwYXJlbnQsIGdldFJlc291cmNlQnVuZGxlKCkpOwotCQlmaW5hbCBTdHlsZWRUZXh0IHRlPSBwYXJ0LmdldFRleHRXaWRnZXQoKTsKLQkJCi0JCWlmICghZkNvbmZpcm1TYXZlKQotCQkJcGFydC5oaWRlU2F2ZUFjdGlvbigpOwotCQkKLQkJdGUuYWRkUGFpbnRMaXN0ZW5lcigKLQkJCW5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJcGFpbnQoZSwgcGFydCk7Ci0JCQkJfQotCQkJfQotCQkpOwkJCi0JCXRlLmFkZEtleUxpc3RlbmVyKAotCQkJbmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQocGFydCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQl0ZS5hZGRNb3VzZUxpc3RlbmVyKAotCQkJbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJCS8vc3luY1ZpZXdwb3J0KHBhcnQpOwotCQkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHBhcnQpOwotCQkJCX0KLQkJCX0KLQkJKTsJCQotCQkJCQkKLQkJdGUuYWRkRm9jdXNMaXN0ZW5lcigKLQkJCW5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBmZSkgewotCQkJCQlmRm9jdXNQYXJ0PSBwYXJ0OwotCQkJCQljb25uZWN0R2xvYmFsQWN0aW9ucyhmRm9jdXNQYXJ0KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZmUpIHsKLQkJCQkJY29ubmVjdEdsb2JhbEFjdGlvbnMobnVsbCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJcGFydC5hZGRWaWV3cG9ydExpc3RlbmVyKAotCQkJbmV3IElWaWV3cG9ydExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHZpZXdwb3J0Q2hhbmdlZChpbnQgdmVydGljYWxQb3NpdGlvbikgewotCQkJCQlzeW5jVmlld3BvcnQocGFydCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJRm9udCBmb250PSBKRmFjZVJlc291cmNlcy5nZXRGb250KGZTeW1ib2xpY0ZvbnROYW1lKTsKLQkJaWYgKGZvbnQgIT0gbnVsbCkKLQkJCXRlLnNldEZvbnQoZm9udCk7Ci0JCQotCQlpZiAoZkJhY2tncm91bmQgIT0gbnVsbCkJLy8gbm90IGRlZmF1bHQKLQkJCXRlLnNldEJhY2tncm91bmQoZ2V0Q29sb3IocGFyZW50LmdldERpc3BsYXkoKSwgZkJhY2tncm91bmQpKTsJCQkKLQkJCi0JCWNvbmZpZ3VyZVRleHRWaWV3ZXIocGFydCk7Ci0JCQotCQlyZXR1cm4gcGFydDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3RHbG9iYWxBY3Rpb25zKE1lcmdlU291cmNlVmlld2VyIHBhcnQpIHsKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycz0gVXRpbGl0aWVzLmZpbmRBY3Rpb25CYXJzKGZDb21wb3NpdGUpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgR0xPQkFMX0FDVElPTlMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbj0gbnVsbDsgCi0JCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQlhY3Rpb249IHBhcnQuZ2V0QWN0aW9uKFRFWFRfQUNUSU9OU1tpXSk7Ci0JCQkJCWlmIChhY3Rpb24gPT0gbnVsbCAmJiBURVhUX0FDVElPTlNbaV0uZXF1YWxzKE1lcmdlU291cmNlVmlld2VyLlNBVkVfSUQpKSB7CQkJCi0JCQkJCQlpZiAocGFydCA9PSBmTGVmdCkKLQkJCQkJCQlhY3Rpb249IGZMZWZ0U2F2ZUFjdGlvbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlhY3Rpb249IGZSaWdodFNhdmVBY3Rpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEdMT0JBTF9BQ1RJT05TW2ldLCBhY3Rpb24pOwotCQkJfQotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0JCi0JSVR5cGVkRWxlbWVudCBnZXRMZWcoY2hhciB0eXBlLCBPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlICdBJzoKLQkJCQlyZXR1cm4gKChJQ29tcGFyZUlucHV0KWlucHV0KS5nZXRBbmNlc3RvcigpOwotCQkJY2FzZSAnTCc6Ci0JCQkJcmV0dXJuICgoSUNvbXBhcmVJbnB1dClpbnB1dCkuZ2V0TGVmdCgpOwotCQkJY2FzZSAnUic6Ci0JCQkJcmV0dXJuICgoSUNvbXBhcmVJbnB1dClpbnB1dCkuZ2V0UmlnaHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoY2hhciB0eXBlLCBPYmplY3QgaW5wdXQpIHsKLQkJSVR5cGVkRWxlbWVudCB0ZT0gZ2V0TGVnKHR5cGUsIGlucHV0KTsKLQkJaWYgKHRlIGluc3RhbmNlb2YgSURvY3VtZW50KQotCQkJcmV0dXJuIChJRG9jdW1lbnQpIHRlOwotCQlpZiAodGUgaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZSkKLQkJCXJldHVybiAoKElEb2N1bWVudFJhbmdlKSB0ZSkuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKHRlIGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikKLQkJCXJldHVybiBEb2N1bWVudE1hbmFnZXIuZ2V0KHRlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUlEb2N1bWVudCBnZXREb2N1bWVudDIoY2hhciB0eXBlLCBPYmplY3QgaW5wdXQpIHsKLQkJSURvY3VtZW50IGRvYz0gZ2V0RG9jdW1lbnQodHlwZSwgaW5wdXQpOwotCQlpZiAoZG9jICE9IG51bGwpCi0JCQlyZXR1cm4gZG9jOwotCQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElEaWZmRWxlbWVudCkgewotCQkJSURpZmZDb250YWluZXIgcGFyZW50PSAoKElEaWZmRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50KCk7Ci0JCQlyZXR1cm4gZ2V0RG9jdW1lbnQodHlwZSwgcGFyZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGlucHV0cyBtYXAgdG8gdGhlIHNhbWUgZG9jdW1lbnRzCi0JICovCi0JYm9vbGVhbiBzYW1lRG9jKGNoYXIgdHlwZSwgT2JqZWN0IG5ld0lucHV0LCBPYmplY3Qgb2xkSW5wdXQpIHsKLQkJSURvY3VtZW50IG5ld0RvYz0gZ2V0RG9jdW1lbnQyKHR5cGUsIG5ld0lucHV0KTsKLQkJSURvY3VtZW50IG9sZERvYz0gZ2V0RG9jdW1lbnQyKHR5cGUsIG9sZElucHV0KTsKLQkJcmV0dXJuIG5ld0RvYyA9PSBvbGREb2M7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gcHJldmVudCBzYXZlIGNvbmZpcm1hdGlvbiBpZiBuZXcgaW5wdXQgaXMgc3ViIGRvY3VtZW50IG9mIGN1cnJlbnQgaW5wdXQuCi0JICogQHBhcmFtIG5ld0lucHV0IHRoZSBuZXcgaW5wdXQgb2YgdGhpcyB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG5ldyBpbnB1dAotCSAqIEBwYXJhbSBvbGRJbnB1dCB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBwcmV2aW91c2x5IG5vIGlucHV0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzYXZpbmcgd2FzIHN1Y2Nlc3NmdWwsIG9yIGlmIHRoZSB1c2VyIGRpZG4ndCB3YW50IHRvIHNhdmUgKGJ5IHByZXNzaW5nICdOTycgaW4gdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cpLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1NhdmUoT2JqZWN0IG5ld0lucHV0LCBPYmplY3Qgb2xkSW5wdXQpIHsKLQkJCi0JCWlmIChvbGRJbnB1dCAhPSBudWxsICYmIG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgdW5kZXJseWluZyBkb2N1bWVudHMgaGF2ZSBjaGFuZ2VkLgotCQkJaWYgKHNhbWVEb2MoJ0EnLCBuZXdJbnB1dCwgb2xkSW5wdXQpICYmCi0JCQkJCXNhbWVEb2MoJ0wnLCBuZXdJbnB1dCwgb2xkSW5wdXQpICYmCi0JCQkJCQlzYW1lRG9jKCdSJywgbmV3SW5wdXQsIG9sZElucHV0KSkgewotCQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLSBTYW1lIGRvY3MgISEhISIpOwkvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiogTmV3IGRvY3MgISEhISIpOwkvLyROT04tTkxTLTEkCi0JCQotCQlJRG9jdW1lbnQgYURvYz0gZ2V0RG9jdW1lbnQyKCdBJywgb2xkSW5wdXQpOwotCQlEb2N1bWVudE1hbmFnZXIucmVtb3ZlKGFEb2MpOwotCQlJRG9jdW1lbnQgbERvYz0gZ2V0RG9jdW1lbnQyKCdMJywgb2xkSW5wdXQpOwotCQlEb2N1bWVudE1hbmFnZXIucmVtb3ZlKGxEb2MpOwotCQlJRG9jdW1lbnQgckRvYz0gZ2V0RG9jdW1lbnQyKCdSJywgb2xkSW5wdXQpOwotCQlEb2N1bWVudE1hbmFnZXIucmVtb3ZlKHJEb2MpOwotCQkKLQkJaWYgKERFQlVHKQotCQkJRG9jdW1lbnRNYW5hZ2VyLmR1bXAoKTsKLQkJCi0JCXJldHVybiBzdXBlci5kb1NhdmUobmV3SW5wdXQsIG9sZElucHV0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGdldFBhcmVudChjaGFyIHR5cGUpIHsKLQkJT2JqZWN0IGlucHV0PSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRGlmZkVsZW1lbnQpIHsKLQkJCUlEaWZmQ29udGFpbmVyIHBhcmVudD0gKChJRGlmZkVsZW1lbnQpaW5wdXQpLmdldFBhcmVudCgpOwotCQkJcmV0dXJuIGdldExlZyh0eXBlLCBwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JLyoKLQkgKiBJbml0aWFsaXplcyB0aGUgdGV4dCB2aWV3ZXJzIG9mIHRoZSB0aHJlZSBjb250ZW50IGFyZWFzIHdpdGggdGhlIGdpdmVuIGlucHV0IG9iamVjdHMuCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnQoT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQotCQlib29sZWFuIGVtcHR5SW5wdXQ9IChhbmNlc3RvciA9PSBudWxsICYmIGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKTsKLQotCQlPYmplY3QgaW5wdXQ9IGdldElucHV0KCk7Ci0KLQkJUG9zaXRpb24gbGVmdFJhbmdlPSBudWxsOwotCQlQb3NpdGlvbiByaWdodFJhbmdlPSBudWxsOwotCQkKLQkJLy8gaWYgb25lIHNpZGUgaXMgZW1wdHkgdXNlIGNvbnRhaW5lcgotCQlpZiAoRklYXzQ3NjQwICYmICFlbXB0eUlucHV0ICYmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElEaWZmRWxlbWVudCkgewotCQkJCUlEaWZmQ29udGFpbmVyIHBhcmVudD0gKChJRGlmZkVsZW1lbnQpaW5wdXQpLmdldFBhcmVudCgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQkJICAgIElDb21wYXJlSW5wdXQgY2k9IChJQ29tcGFyZUlucHV0KSBwYXJlbnQ7Ci0JCQkJICAgIAotCQkJCSAgICBpZiAoY2kuZ2V0QW5jZXN0b3IoKSBpbnN0YW5jZW9mIElEb2N1bWVudFJhbmdlCi0JCQkJICAgICAgICAgICAgfHwgY2kuZ2V0TGVmdCgpIGluc3RhbmNlb2YgSURvY3VtZW50UmFuZ2UKLQkJCQkgICAgICAgICAgICAJCXx8IGNpLmdldFJpZ2h0KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZSkgewotCQkJCSAgICAKLQkJCQkgICAgICAgIAlpZiAobGVmdCBpbnN0YW5jZW9mIElEb2N1bWVudFJhbmdlKQotCQkJCSAgICAgICAgCSAgICBsZWZ0UmFuZ2U9ICgoSURvY3VtZW50UmFuZ2UpbGVmdCkuZ2V0UmFuZ2UoKTsKLQkJCQkgICAgICAgIAlpZiAocmlnaHQgaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZSkKLQkJCQkgICAgICAgIAkgICAgcmlnaHRSYW5nZT0gKChJRG9jdW1lbnRSYW5nZSlyaWdodCkuZ2V0UmFuZ2UoKTsKLQkJCQkJICAgIAotCQkJCQkgICAgYW5jZXN0b3I9IGNpLmdldEFuY2VzdG9yKCk7Ci0JCQkJCSAgICBsZWZ0PSBjaS5nZXRMZWZ0KCk7Ci0JCQkJCSAgICByaWdodD0gY2kuZ2V0UmlnaHQoKTsKLQkJCQkgICAgfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBuPSAwOwotCQlpZiAobGVmdCAhPSBudWxsKQotCQkJbisrOwotCQlpZiAocmlnaHQgIT0gbnVsbCkKLQkJCW4rKzsKLQkJZkhpZ2hsaWdodFJhbmdlcz0gbiA+IDE7Ci0JCQotCQkvLyBjbGVhciBzdHVmZgotCQlmQ3VycmVudERpZmY9IG51bGw7Ci0JIAlmQ2hhbmdlRGlmZnM9IG51bGw7Ci0JCWZBbGxEaWZmcz0gbnVsbDsKLQkJZkVuZE9mRG9jUmVhY2hlZD0gZmFsc2U7Ci0JCWZIYXNFcnJvcnM9IGZhbHNlOyAvLyBzdGFydCB3aXRoIG5vIGVycm9ycwotCQkKLQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2M9IGdldENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCUlNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBjcD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJCi0JCWlmIChjcCBpbnN0YW5jZW9mIE1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBtY3A9IChNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcikgY3A7Ci0JCQltY3Auc2V0QW5jZXN0b3JFcnJvcihudWxsKTsKLQkJCW1jcC5zZXRMZWZ0RXJyb3IobnVsbCk7Ci0JCQltY3Auc2V0UmlnaHRFcnJvcihudWxsKTsKLQkJfQotCQkKLQkJLy8gc2V0IG5ldyBkb2N1bWVudHMKLQkJc2V0RG9jdW1lbnQoZkxlZnQsICdMJywgbGVmdCk7Ci0JCWZMZWZ0TGluZUNvdW50PSBmTGVmdC5nZXRMaW5lQ291bnQoKTsKLQkJZkxlZnRFbmNvZGluZz0gZ2V0RW5jb2RpbmcobGVmdCk7Ci0KLQkJc2V0RG9jdW1lbnQoZlJpZ2h0LCAnUicsIHJpZ2h0KTsKLQkJZlJpZ2h0TGluZUNvdW50PSBmUmlnaHQuZ2V0TGluZUNvdW50KCk7Ci0JCWZSaWdodEVuY29kaW5nPSBnZXRFbmNvZGluZyhyaWdodCk7Ci0JCQotCQlzZXREb2N1bWVudChmQW5jZXN0b3IsICdBJywgYW5jZXN0b3IpOwotCQkKLQkJdXBkYXRlSGVhZGVyKCk7Ci0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXVwZGF0ZVRvb2xJdGVtcygpOwotCQkKLQkJaWYgKCFmSGFzRXJyb3JzKQotCQkJZG9EaWZmKCk7Ci0KLQkJZlJpZ2h0LnNldEVkaXRhYmxlKGNjLmlzUmlnaHRFZGl0YWJsZSgpICYmIGNwLmlzUmlnaHRFZGl0YWJsZShpbnB1dCkpOwotCQlmTGVmdC5zZXRFZGl0YWJsZShjYy5pc0xlZnRFZGl0YWJsZSgpICYmIGNwLmlzTGVmdEVkaXRhYmxlKGlucHV0KSk7Ci0JCQotCQlpbnZhbGlkYXRlTGluZXMoKTsKLQkJdXBkYXRlVlNjcm9sbEJhcigpOwotCQlyZWZyZXNoQmlyZHNFeWVWaWV3KCk7Ci0JCQotCQlpZiAoIWZIYXNFcnJvcnMgJiYgIWVtcHR5SW5wdXQgJiYgIWZDb21wb3NpdGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlEaWZmIHNlbGVjdERpZmY9IG51bGw7Ci0JCQlpZiAoRklYXzQ3NjQwKSB7Ci0JCQkJaWYgKGxlZnRSYW5nZSAhPSBudWxsKQotCQkJCSAgICBzZWxlY3REaWZmPSBmaW5kRGlmZignTCcsIGxlZnRSYW5nZSk7Ci0JCQkJZWxzZSBpZiAocmlnaHRSYW5nZSAhPSBudWxsKQotCQkJCSAgICBzZWxlY3REaWZmPSBmaW5kRGlmZignUicsIHJpZ2h0UmFuZ2UpOwotCQkJfQotCQkJaWYgKHNlbGVjdERpZmYgIT0gbnVsbCkKLQkJCQlzZXRDdXJyZW50RGlmZihzZWxlY3REaWZmLCB0cnVlKTsKLQkJCWVsc2UKLQkJCQlzZWxlY3RGaXJzdERpZmYoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRGlmZiBmaW5kRGlmZihjaGFyIGMsIFBvc2l0aW9uIHJhbmdlKSB7Ci0JCQotCQlNZXJnZVNvdXJjZVZpZXdlciB2OwotCQlpbnQgc3RhcnQ9IHJhbmdlLmdldE9mZnNldCgpOwotCQlpbnQgZW5kPSBzdGFydCArIHJhbmdlLmdldExlbmd0aCgpOwotCQlpZiAoYyA9PSAnTCcpCi0JCQl2PSBmTGVmdDsKLQkJZWxzZSBpZiAoYyA9PSAnUicpCi0JCQl2PSBmUmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChkaWZmLmlzRGVsZXRlZCgpIHx8IGRpZmYuZkRpcmVjdGlvbiA9PSBSYW5nZURpZmZlcmVuY2UuTk9DSEFOR0UpCi0JCQkJICAgIGNvbnRpbnVlOwotCQkJCWlmIChkaWZmLm92ZXJsYXBzKHYsIHN0YXJ0LCBlbmQpKQotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoT2JqZWN0IG8pIHsKLQkJU3RyaW5nIGVuY29kaW5nPSBudWxsOwotCQlpZiAobyBpbnN0YW5jZW9mIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQl0cnkgewotCQkJCWVuY29kaW5nPSAoKElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKW8pLmdldENoYXJzZXQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZWQKLQkJCX0KLQkJfQotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkKLQkJCWVuY29kaW5nPSBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRGlmZkJhY2tncm91bmQoRGlmZiBkaWZmKSB7Ci0JCQotCQlpZiAoISBmSGlnaGxpZ2h0UmFuZ2VzKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGRpZmYgPT0gbnVsbCB8fCBkaWZmLmZJc1Rva2VuKQotCQkJcmV0dXJuOwotCQkJCi0JCWlmIChmU2hvd0N1cnJlbnRPbmx5ICYmICFpc0N1cnJlbnREaWZmKGRpZmYpKQotCQkJcmV0dXJuOwotCQkJCQkJCi0JCUNvbG9yIGM9IGdldENvbG9yKG51bGwsIGdldEZpbGxDb2xvcihkaWZmKSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJaWYgKGlzVGhyZWVXYXkoKSkKLQkJCWZBbmNlc3Rvci5zZXRMaW5lQmFja2dyb3VuZChkaWZmLmZBbmNlc3RvclBvcywgYyk7Ci0JCWZMZWZ0LnNldExpbmVCYWNrZ3JvdW5kKGRpZmYuZkxlZnRQb3MsIGMpOwotCQlmUmlnaHQuc2V0TGluZUJhY2tncm91bmQoZGlmZi5mUmlnaHRQb3MsIGMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQWxsRGlmZkJhY2tncm91bmRzKERpc3BsYXkgZGlzcGxheSkgewotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gdGhyZWVXYXk9IGlzVGhyZWVXYXkoKTsKLQkJCUl0ZXJhdG9yIGl0ZXI9IGZDaGFuZ2VEaWZmcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRGlmZiBkaWZmPSAoRGlmZikgaXRlci5uZXh0KCk7Ci0JCQkJQ29sb3IgYz0gZ2V0Q29sb3IoZGlzcGxheSwgZ2V0RmlsbENvbG9yKGRpZmYpKTsKLQkJCQlpZiAodGhyZWVXYXkpCi0JCQkJCWZBbmNlc3Rvci5zZXRMaW5lQmFja2dyb3VuZChkaWZmLmZBbmNlc3RvclBvcywgYyk7Ci0JCQkJZkxlZnQuc2V0TGluZUJhY2tncm91bmQoZGlmZi5mTGVmdFBvcywgYyk7Ci0JCQkJZlJpZ2h0LnNldExpbmVCYWNrZ3JvdW5kKGRpZmYuZlJpZ2h0UG9zLCBjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlib29sZWFuIGlzQ3VycmVudERpZmYoRGlmZiBkaWZmKSB7Ci0JCWlmIChkaWZmID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChkaWZmID09IGZDdXJyZW50RGlmZikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZkN1cnJlbnREaWZmICE9IG51bGwgJiYgZkN1cnJlbnREaWZmLmZQYXJlbnQgPT0gZGlmZikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW52ZXIgb25lIG9mIHRoZSBkb2N1bWVudHMgY2hhbmdlcy4KLQkgKiBTZXRzIHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGlzIHZpZXdlciBhbmQgdXBkYXRlcyB0aGUgbGluZXMuCi0JICogSW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZSkgewotCQkKLQkJSURvY3VtZW50IGRvYz0gZS5nZXREb2N1bWVudCgpOwotCQkKLQkJaWYgKGRvYyA9PSBmTGVmdC5nZXREb2N1bWVudCgpKSB7Ci0JCQlzZXRMZWZ0RGlydHkodHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoZG9jID09IGZSaWdodC5nZXREb2N1bWVudCgpKSB7Ci0JCQlzZXRSaWdodERpcnR5KHRydWUpOwotCQl9Ci0KLQkJdXBkYXRlTGluZXMoZG9jKTsKLQl9Ci0JCQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgcmFuZ2Ugb2YgdGV4dCBvbiBvbmUgc2lkZSBpcyBjb3BpZWQgaW50byBhbiBlbXB0eSBzdWJkb2N1bWVudAotCSAqIG9uIHRoZSBvdGhlciBzaWRlLiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBzdWJkb2N1bWVudCBpcyBwbGFjZWQgaW50byB0aGUgYmFzZSBkb2N1bWVudC4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGV0ZXJtaW5lcyB0aGUgcG9zaXRpb24gYnkgdXNpbmcgdGhlIHRleHQgcmFuZ2UgZGlmZmVyZW5jZXIuCi0JICogSG93ZXZlciB0aGlzIHBvc2l0aW9uIGlzIG5vdCBhbHdheXMgb3B0aW1hbCBmb3Igc3BlY2lmaWMgdHlwZXMgb2YgdGV4dC4KLQkgKiBTbyBzdWJjbGFzc2VzICh3aGljaCBhcmUgYXdhcmUgb2YgdGhlIHR5cGUgb2YgdGV4dCB0aGV5IGFyZSBkZWFsaW5nIHdpdGgpIAotCSAqIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaW5kIGEgYmV0dGVyIHBvc2l0aW9uIHdoZXJlIHRvIGluc2VydCBhIG5ld2x5IGFkZGVkCi0JICogcGllY2Ugb2YgdGV4dC4KLQkgKiBAcGFyYW0gdHlwZSB0aGUgc2lkZSBmb3Igd2hpY2ggdGhlIGluc2VydGlvbiBwb3NpdGlvbiBzaG91bGQgYmUgZGV0ZXJtaW5lZDogJ0EnIGZvciBhbmNlc3RvciwgJ0wnIGZvciBsZWZ0IGhhbmQgc2lkZSwgJ1InIGZvciByaWdodCBoYW5kIHNpZGUuCi0JICogQHBhcmFtIGlucHV0IHRoZSBjdXJyZW50IGlucHV0IG9iamVjdCBvZiB0aGlzIHZpZXdlcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGZpbmRJbnNlcnRpb25Qb3NpdGlvbihjaGFyIHR5cGUsIElDb21wYXJlSW5wdXQgaW5wdXQpIHsKLQkJCQotCQlJVHlwZWRFbGVtZW50IG90aGVyPSBudWxsOwotCQljaGFyIG90aGVyVHlwZT0gMDsKLQkJCi0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlICdBJzoKLQkJCW90aGVyPSBpbnB1dC5nZXRMZWZ0KCk7Ci0JCQlvdGhlclR5cGU9ICdMJzsKLQkJCWlmIChvdGhlciA9PSBudWxsKSB7Ci0JCQkJb3RoZXI9IGlucHV0LmdldFJpZ2h0KCk7Ci0JCQkJb3RoZXJUeXBlPSAnUic7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnTCc6Ci0JCQlvdGhlcj0gaW5wdXQuZ2V0UmlnaHQoKTsKLQkJCW90aGVyVHlwZT0gJ1InOwotCQkJaWYgKG90aGVyID09IG51bGwpIHsKLQkJCQlvdGhlcj0gaW5wdXQuZ2V0QW5jZXN0b3IoKTsKLQkJCQlvdGhlclR5cGU9ICdBJzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdSJzoKLQkJCW90aGVyPSBpbnB1dC5nZXRMZWZ0KCk7Ci0JCQlvdGhlclR5cGU9ICdMJzsKLQkJCWlmIChvdGhlciA9PSBudWxsKSB7Ci0JCQkJb3RoZXI9IGlucHV0LmdldEFuY2VzdG9yKCk7Ci0JCQkJb3RoZXJUeXBlPSAnQSc7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJaWYgKG90aGVyIGluc3RhbmNlb2YgSURvY3VtZW50UmFuZ2UpIHsKLQkJCUlEb2N1bWVudFJhbmdlIGRyPSAoSURvY3VtZW50UmFuZ2UpIG90aGVyOwotCQkJUG9zaXRpb24gcD0gZHIuZ2V0UmFuZ2UoKTsJCi0JCQlEaWZmIGRpZmY9IGZpbmREaWZmKG90aGVyVHlwZSwgcC5vZmZzZXQpOwotCQkJaWYgKGRpZmYgIT0gbnVsbCkgewotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgJ0EnOgotCQkJCQlpZiAoZGlmZi5mQW5jZXN0b3JQb3MgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkaWZmLmZBbmNlc3RvclBvcy5vZmZzZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ0wnOgotCQkJCQlpZiAoZGlmZi5mTGVmdFBvcyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRpZmYuZkxlZnRQb3Mub2Zmc2V0OwotCQkJCQlicmVhazsKLQkJCQljYXNlICdSJzoKLQkJCQkJaWYgKGRpZmYuZlJpZ2h0UG9zICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGlmZi5mUmlnaHRQb3Mub2Zmc2V0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRFcnJvcihjaGFyIHR5cGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUlNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBjcD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJaWYgKGNwIGluc3RhbmNlb2YgTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIpIHsKLQkJCU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIG1jcD0gKE1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyKSBjcDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAnQSc6Ci0JCQkJbWNwLnNldEFuY2VzdG9yRXJyb3IobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdMJzoKLQkJCQltY3Auc2V0TGVmdEVycm9yKG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnUic6Ci0JCQkJbWNwLnNldFJpZ2h0RXJyb3IobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZkhhc0Vycm9ycz0gdHJ1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgRG9jdW1lbnQgY291bGQgYmUgaW5zdGFsbGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXREb2N1bWVudChNZXJnZVNvdXJjZVZpZXdlciB0cCwgY2hhciB0eXBlLCBPYmplY3QgbykgewotCQkKLQkJaWYgKHRwID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCi0JCUlEb2N1bWVudCBuZXdEb2M9IG51bGw7Ci0JCVBvc2l0aW9uIHJhbmdlPSBudWxsOwotCi0JCWlmIChvIGluc3RhbmNlb2YgSURvY3VtZW50UmFuZ2UpIHsKLQkJCW5ld0RvYz0gKChJRG9jdW1lbnRSYW5nZSlvKS5nZXREb2N1bWVudCgpOwotCQkJcmFuZ2U9ICgoSURvY3VtZW50UmFuZ2UpbykuZ2V0UmFuZ2UoKTsKLQotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJRG9jdW1lbnQpIHsKLQkJCW5ld0RvYz0gKElEb2N1bWVudCkgbzsKLQkJCQotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQkKLQkJCW5ld0RvYz0gRG9jdW1lbnRNYW5hZ2VyLmdldChvKTsKLQkJCWlmIChuZXdEb2MgPT0gbnVsbCkgewotCQkJCUlTdHJlYW1Db250ZW50QWNjZXNzb3Igc2NhPSAoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgbzsKLQkJCQlTdHJpbmcgcz0gbnVsbDsKLQkJCi0JCQkJdHJ5IHsKLQkJCQkJcz0gVXRpbGl0aWVzLnJlYWRTdHJpbmcoc2NhKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXNldEVycm9yKHR5cGUsIGV4LmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQotCQkJCW5ld0RvYz0gbmV3IERvY3VtZW50KHMgIT0gbnVsbCA/IHMgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlEb2N1bWVudE1hbmFnZXIucHV0KG8sIG5ld0RvYyk7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXI9IGdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkgewotCQkJCQluZXdEb2Muc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25lcik7Ci0JCQkJCXBhcnRpdGlvbmVyLmNvbm5lY3QobmV3RG9jKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobyA9PSBudWxsKSB7CS8vIGRlbGV0aW9uIG9uIG9uZSBzaWRlCi0JCQkKLQkJCUlUeXBlZEVsZW1lbnQgcGFyZW50PSBnZXRQYXJlbnQodHlwZSk7CS8vIHdlIHRyeSB0byBmaW5kIGFuIGluc2VydGlvbiBwb3NpdGlvbiB3aXRoaW4gdGhlIGRlbGV0aW9uJ3MgcGFyZW50Ci0JCQkKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRSYW5nZSkgewotCQkJCW5ld0RvYz0gKChJRG9jdW1lbnRSYW5nZSlwYXJlbnQpLmdldERvY3VtZW50KCk7Ci0JCQkJbmV3RG9jLmFkZFBvc2l0aW9uQ2F0ZWdvcnkoSURvY3VtZW50UmFuZ2UuUkFOR0VfQ0FURUdPUlkpOwotCQkJCU9iamVjdCBpbnB1dD0gZ2V0SW5wdXQoKTsKLQkJCQlyYW5nZT0gZ2V0TmV3UmFuZ2UodHlwZSwgaW5wdXQpOwotCQkJCWlmIChyYW5nZSA9PSBudWxsKSB7Ci0JCQkJCWludCBwb3M9IDA7Ci0JCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQkJCQlwb3M9IGZpbmRJbnNlcnRpb25Qb3NpdGlvbih0eXBlLCAoSUNvbXBhcmVJbnB1dClpbnB1dCk7Ci0JCQkJCXJhbmdlPSBuZXcgUG9zaXRpb24ocG9zLCAwKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ld0RvYy5hZGRQb3NpdGlvbihJRG9jdW1lbnRSYW5nZS5SQU5HRV9DQVRFR09SWSwgcmFuZ2UpOwotCQkJCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjogIiArIGV4KTsJLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIkJhZExvY2F0aW9uRXhjZXB0aW9uOiAiICsgZXgpOwkvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYWRkTmV3UmFuZ2UodHlwZSwgaW5wdXQsIHJhbmdlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElEb2N1bWVudCkgewotCQkJCW5ld0RvYz0gKChJRG9jdW1lbnRSYW5nZSlvKS5nZXREb2N1bWVudCgpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkPSB0cnVlOwotCQlpZiAobmV3RG9jID09IG51bGwpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzZXREb2N1bWVudDogY3JlYXRlIG5ldyBEb2N1bWVudCIpOwotCQkJbmV3RG9jPSBuZXcgRG9jdW1lbnQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQllbmFibGVkPSBmYWxzZTsKLQkJfQotCQkKLQkJSURvY3VtZW50IG9sZERvYz0gdHAuZ2V0RG9jdW1lbnQoKTsKLQkJCi0JCWlmIChuZXdEb2MgIT0gb2xkRG9jKSB7Ci0JCQkKLQkJCS8vIGdvdCBhIG5ldyBkb2N1bWVudAotCQkJCi0JCQl1bnNldERvY3VtZW50KHRwKTsKLQkJCQotCQkJaWYgKG5ld0RvYyAhPSBudWxsKSB7Ci0JCQkJbmV3RG9jLmFkZFBvc2l0aW9uQ2F0ZWdvcnkoSURvY3VtZW50UmFuZ2UuUkFOR0VfQ0FURUdPUlkpOwotCQkJCWlmIChmUG9zaXRpb25VcGRhdGVyID09IG51bGwpCi0JCQkJCWZQb3NpdGlvblVwZGF0ZXI9IG5ldyBDaGlsZFBvc2l0aW9uVXBkYXRlcihJRG9jdW1lbnRSYW5nZS5SQU5HRV9DQVRFR09SWSk7Ci0JCQkJZWxzZQotCQkJCQluZXdEb2MucmVtb3ZlUG9zaXRpb25VcGRhdGVyKGZQb3NpdGlvblVwZGF0ZXIpOwotCQkJCW5ld0RvYy5hZGRQb3NpdGlvblVwZGF0ZXIoZlBvc2l0aW9uVXBkYXRlcik7Ci0JCQl9Ci0KLQkJCS8vIGluc3RhbGwgbmV3IGRvY3VtZW50Ci0JCQlpZiAobmV3RG9jICE9IG51bGwpIHsKLQkJCQkJCQotCQkJCXRwLnNldFJlZ2lvbihyYW5nZSk7Ci0JCQkJaWYgKGZTdWJEb2MpIHsKLQkJCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJCUlSZWdpb24gcj0gbm9ybWFsaXplRG9jdW1lbnRSZWdpb24obmV3RG9jLCB0b1JlZ2lvbihyYW5nZSkpOwotCQkJCQkJdHAuc2V0RG9jdW1lbnQobmV3RG9jLCByLmdldE9mZnNldCgpLCByLmdldExlbmd0aCgpKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQl0cC5zZXREb2N1bWVudChuZXdEb2MpOwotCQkJCX0gZWxzZQotCQkJCQl0cC5zZXREb2N1bWVudChuZXdEb2MpOwotCQkJCQkJCQkKLQkJCQl0cC5yZW1lbWJlckRvY3VtZW50KG5ld0RvYyk7Ci0JCQkJbmV3RG9jLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQkJCS8vTGVha1Rlc3Rlci5hZGQobmV3RG9jKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewkvLyBzYW1lIGRvY3VtZW50IGJ1dCBkaWZmZXJlbnQgcmFuZ2UKLQkJCQotCQkJdHAuc2V0UmVnaW9uKHJhbmdlKTsKLQkJCWlmIChmU3ViRG9jKSB7Ci0JCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJSVJlZ2lvbiByPSBub3JtYWxpemVEb2N1bWVudFJlZ2lvbihuZXdEb2MsIHRvUmVnaW9uKHJhbmdlKSk7Ci0JCQkJCXRwLnNldFZpc2libGVSZWdpb24oci5nZXRPZmZzZXQoKSwgci5nZXRMZW5ndGgoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRwLnJlc2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJfSBlbHNlCi0JCQkJdHAucmVzZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCX0KLQkJCi0JCXRwLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCQotCXByaXZhdGUgUG9zaXRpb24gZ2V0TmV3UmFuZ2UoY2hhciB0eXBlLCBPYmplY3QgaW5wdXQpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgJ0EnOgotCQkJcmV0dXJuIChQb3NpdGlvbikgZk5ld0FuY2VzdG9yUmFuZ2VzLmdldChpbnB1dCk7Ci0JCWNhc2UgJ0wnOgotCQkJcmV0dXJuIChQb3NpdGlvbikgZk5ld0xlZnRSYW5nZXMuZ2V0KGlucHV0KTsKLQkJY2FzZSAnUic6Ci0JCQlyZXR1cm4gKFBvc2l0aW9uKSBmTmV3UmlnaHRSYW5nZXMuZ2V0KGlucHV0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1JhbmdlKGNoYXIgdHlwZSwgT2JqZWN0IGlucHV0LCBQb3NpdGlvbiByYW5nZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAnQSc6Ci0JCQlmTmV3QW5jZXN0b3JSYW5nZXMucHV0KGlucHV0LCByYW5nZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnTCc6Ci0JCQlmTmV3TGVmdFJhbmdlcy5wdXQoaW5wdXQsIHJhbmdlKTsKLQkJCWJyZWFrOwotCQljYXNlICdSJzoKLQkJCWZOZXdSaWdodFJhbmdlcy5wdXQoaW5wdXQsIHJhbmdlKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuc2V0RG9jdW1lbnQoTWVyZ2VTb3VyY2VWaWV3ZXIgdHApIHsKLQkJSURvY3VtZW50IG9sZERvYz0gdHAuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKG9sZERvYyA9PSBudWxsKSB7Ci0JCQlvbGREb2M9IHRwLmdldFJlbWVtYmVyZWREb2N1bWVudCgpOwotLy8JCQlpZiAob2xkRG9jICE9IG51bGwpCi0vLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRleHRNZXJnZVZpZXdlci51bnNldERvY3VtZW50OiB3b3VsZCBsZWFrIik7Ci0JCX0KLQkJaWYgKG9sZERvYyAhPSBudWxsKSB7Ci0JCQl0cC5yZW1lbWJlckRvY3VtZW50KG51bGwpOwotCQkJLy8gZGVpbnN0YWxsIG9sZCBwb3NpdGlvbnMKLQkJCWlmIChmUG9zaXRpb25VcGRhdGVyICE9IG51bGwpCi0JCQkJb2xkRG9jLnJlbW92ZVBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25VcGRhdGVyKTsKLQkJCXRyeSB7Ci0JCQkJb2xkRG9jLnJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoSURvY3VtZW50UmFuZ2UuUkFOR0VfQ0FURUdPUlkpOwotCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9Ci0JCQkKLQkJCW9sZERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJCS8vTGVha1Rlc3Rlci5yZW1vdmUob2xkRG9jKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBhcyBhbiBhcnJheSBvZiBieXRlcyB1c2luZyB0aGUgY3VycmVudCB3b3JrYmVuY2ggZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIGxlZnQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGNvbnRlbnRzIG9mIHRoZSBsZWZ0IHNpZGUgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSB0aGUgcmlnaHQgc2lkZQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBsZWZ0IG9yIHJpZ2h0IGRvY3VtZW50IG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldENvbnRlbnRzKGJvb2xlYW4gbGVmdCkgewotCQlNZXJnZVNvdXJjZVZpZXdlciB2PSBsZWZ0ID8gZkxlZnQgOiBmUmlnaHQ7Ci0JCWlmICh2ICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkPSB2LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRzPSBkLmdldCgpOwotCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWJ5dGVbXSBieXRlczsKLQkJCQkJdHJ5IHsKLQkJCQkJCWJ5dGVzPSBjb250ZW50cy5nZXRCeXRlcyhsZWZ0ID8gZkxlZnRFbmNvZGluZyA6IGZSaWdodEVuY29kaW5nKTsKLQkJCQkJfSBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJYnl0ZXM9IGNvbnRlbnRzLmdldEJ5dGVzKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGJ5dGVzOwotCQkJCX0KLQkJCX0KLQkJfQkKLQkJcmV0dXJuIG51bGw7CQotCX0KLQkJCi0JcHJpdmF0ZSBJUmVnaW9uIG5vcm1hbGl6ZURvY3VtZW50UmVnaW9uKElEb2N1bWVudCBkb2MsIElSZWdpb24gcmVnaW9uKSB7Ci0JCQotCQlpZiAocmVnaW9uID09IG51bGwgfHwgZG9jID09IG51bGwpCi0JCQlyZXR1cm4gcmVnaW9uOwotCQkJCi0JCWludCBtYXhMZW5ndGg9IGRvYy5nZXRMZW5ndGgoKTsKLQkJCi0JCWludCBzdGFydD0gcmVnaW9uLmdldE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQ9IDA7Ci0JCWVsc2UgaWYgKHN0YXJ0ID4gbWF4TGVuZ3RoKQotCQkJc3RhcnQ9IG1heExlbmd0aDsKLQkJCQotCQlpbnQgbGVuZ3RoPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPCAwKQotCQkJbGVuZ3RoPSAwOwotCQllbHNlIGlmIChzdGFydCArIGxlbmd0aCA+IG1heExlbmd0aCkKLQkJCWxlbmd0aD0gbWF4TGVuZ3RoIC0gc3RhcnQ7Ci0JCQkKLQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIGxlbmd0aCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVSZXNpemVBbmNlc3RvcihpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAod2lkdGggPiAwKSB7Ci0JCQlSZWN0YW5nbGUgdHJpbT0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJaW50IHNjcm9sbGJhckhlaWdodD0gdHJpbS5oZWlnaHQ7Ci0JCQlpZiAoVXRpbGl0aWVzLm9rVG9Vc2UoZkFuY2VzdG9yQ2FudmFzKSkKLQkJCQlmQW5jZXN0b3JDYW52YXMuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWlmIChmQW5jZXN0b3IuaXNDb250cm9sT2tUb1VzZSgpKQotCQkJCWZBbmNlc3Rvci5nZXRUZXh0V2lkZ2V0KCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQotCQkJaWYgKGZBbmNlc3RvckNhbnZhcyAhPSBudWxsKSB7Ci0JCQkJZkFuY2VzdG9yQ2FudmFzLnNldEJvdW5kcyh4LCB5LCBmTWFyZ2luV2lkdGgsIGhlaWdodC1zY3JvbGxiYXJIZWlnaHQpOwotCQkJCXgrPSBmTWFyZ2luV2lkdGg7Ci0JCQkJd2lkdGgtPSBmTWFyZ2luV2lkdGg7Ci0JCQl9Ci0JCQlmQW5jZXN0b3IuZ2V0VGV4dFdpZGdldCgpLnNldEJvdW5kcyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChVdGlsaXRpZXMub2tUb1VzZShmQW5jZXN0b3JDYW52YXMpKQotCQkJCWZBbmNlc3RvckNhbnZhcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWlmIChmQW5jZXN0b3IuaXNDb250cm9sT2tUb1VzZSgpKSB7Ci0JCQkJU3R5bGVkVGV4dCB0PSBmQW5jZXN0b3IuZ2V0VGV4dFdpZGdldCgpOwotCQkJCXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJdC5zZXRCb3VuZHMoMCwgMCwgMCwgMCk7Ci0JCQkJaWYgKGZGb2N1c1BhcnQgPT0gZkFuY2VzdG9yKSB7Ci0JCQkJCWZGb2N1c1BhcnQ9IGZMZWZ0OwotCQkJCQlmRm9jdXNQYXJ0LmdldFRleHRXaWRnZXQoKS5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTGF5cyBvdXQgZXZlcnl0aGluZy4KLQkgKi8KLSAgCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVJlc2l6ZUxlZnRSaWdodChpbnQgeCwgaW50IHksIGludCB3aWR0aDEsIGludCBjZW50ZXJXaWR0aCwgaW50IHdpZHRoMiwgIGludCBoZWlnaHQpIHsKLSAgCQkJCQotICAJCWlmIChmQmlyZHNFeWVDYW52YXMgIT0gbnVsbCkKLSAgCQkJd2lkdGgyLT0gQklSRFNfRVlFX1ZJRVdfV0lEVEg7Ci0gIAkJCQotCQlSZWN0YW5nbGUgdHJpbT0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQlpbnQgc2Nyb2xsYmFySGVpZ2h0PSB0cmltLmhlaWdodCArIHRyaW0ueDsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlPSAoQ29tcG9zaXRlKSBnZXRDb250cm9sKCk7Ci0KLQkJaW50IGxlZnRUZXh0V2lkdGg9IHdpZHRoMTsKLQkJaWYgKGZMZWZ0Q2FudmFzICE9IG51bGwpIHsKLQkJCWZMZWZ0Q2FudmFzLnNldEJvdW5kcyh4LCB5LCBmTWFyZ2luV2lkdGgsIGhlaWdodC1zY3JvbGxiYXJIZWlnaHQpOwotCQkJeCs9IGZNYXJnaW5XaWR0aDsKLQkJCWxlZnRUZXh0V2lkdGgtPSBmTWFyZ2luV2lkdGg7Ci0JCX0KLQkJCi0JCWZMZWZ0LmdldFRleHRXaWRnZXQoKS5zZXRCb3VuZHMoeCwgeSwgbGVmdFRleHRXaWR0aCwgaGVpZ2h0KTsKLQkJeCs9IGxlZnRUZXh0V2lkdGg7Ci0JCQotCQlpZiAoZkNlbnRlciA9PSBudWxsIHx8IGZDZW50ZXIuaXNEaXNwb3NlZCgpKQotCQkJZkNlbnRlcj0gY3JlYXRlQ2VudGVyKGNvbXBvc2l0ZSk7Ci0JCWZDZW50ZXIuc2V0Qm91bmRzKHgsIHksIGNlbnRlcldpZHRoLCBoZWlnaHQtc2Nyb2xsYmFySGVpZ2h0KTsKLQkJeCs9IGNlbnRlcldpZHRoOwotCQkKLQkJaWYgKCFmU3luY2hyb25pemVkU2Nyb2xsaW5nKSB7CS8vIGNhbnZhcyBpcyB0byB0aGUgbGVmdCBvZiB0ZXh0Ci0JCQlpZiAoZlJpZ2h0Q2FudmFzICE9IG51bGwpIHsKLQkJCQlmUmlnaHRDYW52YXMuc2V0Qm91bmRzKHgsIHksIGZNYXJnaW5XaWR0aCwgaGVpZ2h0LXNjcm9sbGJhckhlaWdodCk7Ci0JCQkJZlJpZ2h0Q2FudmFzLnJlZHJhdygpOwotCQkJCXgrPSBmTWFyZ2luV2lkdGg7Ci0JCQl9Ci0JCQkvLyB3ZSBkcmF3IHRoZSBjYW52YXMgdG8gdGhlIGxlZnQgb2YgdGhlIHRleHQgd2lkZ2V0Ci0JCX0KLQkJCi0JCWludCBzY3JvbGxiYXJXaWR0aD0gMDsKLQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgJiYgZlNjcm9sbENhbnZhcyAhPSBudWxsKSB7Ci0JCQl0cmltPSBmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlzY3JvbGxiYXJXaWR0aD0gdHJpbS53aWR0aCArIDIqdHJpbS54OwotCQl9Ci0JCWludCByaWdodFRleHRXaWR0aD0gd2lkdGgyLXNjcm9sbGJhcldpZHRoOwotCQlpZiAoZlJpZ2h0Q2FudmFzICE9IG51bGwpCi0JCQlyaWdodFRleHRXaWR0aC09IGZNYXJnaW5XaWR0aDsKLQkJZlJpZ2h0LmdldFRleHRXaWRnZXQoKS5zZXRCb3VuZHMoeCwgeSwgcmlnaHRUZXh0V2lkdGgsIGhlaWdodCk7Ci0JCXgrPSByaWdodFRleHRXaWR0aDsKLQkJCQotCQlpZiAoZlN5bmNocm9uaXplZFNjcm9sbGluZykgewotCQkJaWYgKGZSaWdodENhbnZhcyAhPSBudWxsKSB7CS8vIGNhbnZhcyBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkJCQlmUmlnaHRDYW52YXMuc2V0Qm91bmRzKHgsIHksIGZNYXJnaW5XaWR0aCwgaGVpZ2h0LXNjcm9sbGJhckhlaWdodCk7Ci0JCQkJeCs9IGZNYXJnaW5XaWR0aDsKLQkJCX0KLQkJCWlmIChmU2Nyb2xsQ2FudmFzICE9IG51bGwpCi0JCQkJZlNjcm9sbENhbnZhcy5zZXRCb3VuZHMoeCwgeSwgc2Nyb2xsYmFyV2lkdGgsIGhlaWdodC1zY3JvbGxiYXJIZWlnaHQpOwotCQl9Ci0JCQotICAJCWlmIChmQmlyZHNFeWVDYW52YXMgIT0gbnVsbCkgewotICAJCQlpbnQgdmVydGljYWxTY3JvbGxiYXJCdXR0b25IZWlnaHQ9IHNjcm9sbGJhcldpZHRoOwotCQkJaW50IGhvcml6b250YWxTY3JvbGxiYXJCdXR0b25IZWlnaHQ9IHNjcm9sbGJhckhlaWdodDsKLQkJCWlmIChmSXNDYXJib24pIHsKLQkJCQl2ZXJ0aWNhbFNjcm9sbGJhckJ1dHRvbkhlaWdodCs9IDI7Ci0JCQkJaG9yaXpvbnRhbFNjcm9sbGJhckJ1dHRvbkhlaWdodD0gMTg7Ci0JCQl9Ci0gIAkJCWlmIChmU3VtbWFyeUhlYWRlciAhPSBudWxsKQotCQkJCWZTdW1tYXJ5SGVhZGVyLnNldEJvdW5kcyh4K3Njcm9sbGJhcldpZHRoLCB5LCBCSVJEU19FWUVfVklFV19XSURUSCwgdmVydGljYWxTY3JvbGxiYXJCdXR0b25IZWlnaHQpOwotICAJCQl5Kz0gdmVydGljYWxTY3JvbGxiYXJCdXR0b25IZWlnaHQ7Ci0gIAkJCWZCaXJkc0V5ZUNhbnZhcy5zZXRCb3VuZHMoeCtzY3JvbGxiYXJXaWR0aCwgeSwgQklSRFNfRVlFX1ZJRVdfV0lEVEgsIGhlaWdodC0oMip2ZXJ0aWNhbFNjcm9sbGJhckJ1dHRvbkhlaWdodCtob3Jpem9udGFsU2Nyb2xsYmFyQnV0dG9uSGVpZ2h0KSk7Ci0gICAJCX0KLQkJCi0JCS8vIGRvZXNuJ3Qgd29yayBzaW5jZSBUZXh0RWRpdG9ycyBkb24ndCBoYXZlIHRoZWlyIGNvcnJlY3Qgc2l6ZSB5ZXQuCi0JCXVwZGF0ZVZTY3JvbGxCYXIoKTsgCi0JCXJlZnJlc2hCaXJkc0V5ZVZpZXcoKTsKLQl9Ci0JCQkJCQkJCi0JLyoKLQkgKiBUcmFjayBzZWxlY3Rpb24gY2hhbmdlcyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgRGlmZi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChNZXJnZVNvdXJjZVZpZXdlciB0dykgewotCQlQb2ludCBwPSB0dy5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCURpZmYgZD0gZmluZERpZmYodHcsIHAueCwgcC54K3AueSk7Ci0JCXVwZGF0ZVN0YXR1cyhkKTsKLQkJc2V0Q3VycmVudERpZmYoZCwgZmFsc2UpOwkvLyBkb24ndCBzZWxlY3Qgb3IgcmV2ZWFsCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lvbiB0b1JlZ2lvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUmVnaW9uKHBvc2l0aW9uLmdldE9mZnNldCgpLCBwb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLy0tLS0gdGhlIGRpZmZlcmVuY2luZwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFdvcmsoSVJhbmdlQ29tcGFyYXRvciBhLCBJUmFuZ2VDb21wYXJhdG9yIGwsIElSYW5nZUNvbXBhcmF0b3IgcikgewotCQlpbnQgbG49IGwuZ2V0UmFuZ2VDb3VudCgpOwotCQlpbnQgcm49IHIuZ2V0UmFuZ2VDb3VudCgpOwotCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQlpbnQgYW49IGEuZ2V0UmFuZ2VDb3VudCgpOwotCQkJcmV0dXJuICgyICogTWF0aC5tYXgoYW4sIGxuKSkgKyAoMiAqIE1hdGgubWF4KGFuLCBybikpOwotCQl9Ci0JCXJldHVybiAyICogTWF0aC5tYXgobG4sIHJuKTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybSBhIHR3byBsZXZlbCAyLSBvciAzLXdheSBkaWZmLgotCSAqIFRoZSBmaXJzdCBsZXZlbCBpcyBiYXNlZCBvbiBsaW5lIGNvbXBhcmlzb24sIHRoZSBzZWNvbmQgbGV2ZWwgb24gdG9rZW4gY29tcGFyaXNvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9EaWZmKCkgewotCQkJCQkJCi0JCWZBbGxEaWZmcz0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ2hhbmdlRGlmZnM9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkN1cnJlbnREaWZmPSBudWxsOwotCQkKLQkJSURvY3VtZW50IGFEb2M9IG51bGw7Ci0JCUlEb2N1bWVudCBsRG9jPSBmTGVmdC5nZXREb2N1bWVudCgpOwotCQlJRG9jdW1lbnQgckRvYz0gZlJpZ2h0LmdldERvY3VtZW50KCk7Ci0JCWlmIChsRG9jID09IG51bGwgfHwgckRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCVBvc2l0aW9uIGFSZWdpb249IG51bGw7Ci0JCVBvc2l0aW9uIGxSZWdpb249IGZMZWZ0LmdldFJlZ2lvbigpOwotCQlQb3NpdGlvbiByUmVnaW9uPSBmUmlnaHQuZ2V0UmVnaW9uKCk7Ci0JCQkJCi0JCWJvb2xlYW4gdGhyZWVXYXk9IGlzVGhyZWVXYXkoKTsKLQkJCi0JCWlmICh0aHJlZVdheSAmJiAhZklnbm9yZUFuY2VzdG9yKSB7Ci0JCQlhRG9jPSBmQW5jZXN0b3IuZ2V0RG9jdW1lbnQoKTsKLQkJCWFSZWdpb249IGZBbmNlc3Rvci5nZXRSZWdpb24oKTsKLQkJfQotCQkKLQkJZkFuY2VzdG9yLnJlc2V0TGluZUJhY2tncm91bmQoKTsKLQkJZkxlZnQucmVzZXRMaW5lQmFja2dyb3VuZCgpOwotCQlmUmlnaHQucmVzZXRMaW5lQmFja2dyb3VuZCgpOwotCQkKLQkJYm9vbGVhbiBpZ25vcmVXaGl0ZVNwYWNlPSBVdGlsaXRpZXMuZ2V0Qm9vbGVhbihnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpLCBDb21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV0hJVEVTUEFDRSwgZmFsc2UpOwkJCi0JCQotCQlEb2NMaW5lQ29tcGFyYXRvciBzcmlnaHQ9IG5ldyBEb2NMaW5lQ29tcGFyYXRvcihyRG9jLCB0b1JlZ2lvbihyUmVnaW9uKSwgaWdub3JlV2hpdGVTcGFjZSk7Ci0JCURvY0xpbmVDb21wYXJhdG9yIHNsZWZ0PSBuZXcgRG9jTGluZUNvbXBhcmF0b3IobERvYywgdG9SZWdpb24obFJlZ2lvbiksIGlnbm9yZVdoaXRlU3BhY2UpOwotCQlEb2NMaW5lQ29tcGFyYXRvciBzYW5jZXN0b3I9IG51bGw7Ci0JCWlmIChhRG9jICE9IG51bGwpCi0JCQlzYW5jZXN0b3I9IG5ldyBEb2NMaW5lQ29tcGFyYXRvcihhRG9jLCB0b1JlZ2lvbihhUmVnaW9uKSwgaWdub3JlV2hpdGVTcGFjZSk7Ci0JCQkKLQkJaWYgKCFmU3ViRG9jICYmIHJSZWdpb24gIT0gbnVsbCAmJiBsUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIHdlIGhhdmUgdG8gYWRkIGEgZGlmZiBmb3IgdGhlIGlnbm9yZWQgbGluZXMKLQkJCQotCQkJaW50IGFzdGFydD0gMDsKLQkJCWludCBhcz0gMDsKLQkJCWlmIChhUmVnaW9uICE9IG51bGwpIHsKLQkJCQlhc3RhcnQ9IGFSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJYXM9IE1hdGgubWF4KDAsIGFzdGFydC0xKTsKLQkJCX0KLQkJCWludCB5cz0gTWF0aC5tYXgoMCwgbFJlZ2lvbi5nZXRPZmZzZXQoKS0xKTsKLQkJCWludCBtcz0gTWF0aC5tYXgoMCwgclJlZ2lvbi5nZXRPZmZzZXQoKS0xKTsKLQkJCQotCQkJaWYgKGFzID4gMCB8fCB5cyA+IDAgfHwgbXMgPiAwKSB7Ci0JCQkJRGlmZiBkaWZmPSBuZXcgRGlmZihudWxsLCBSYW5nZURpZmZlcmVuY2UuTk9DSEFOR0UsCi0JCQkJCWFEb2MsIGFSZWdpb24sIDAsIGFzdGFydCwKLQkJCQkJbERvYywgbFJlZ2lvbiwgMCwgbFJlZ2lvbi5nZXRPZmZzZXQoKSwKLQkJCQkJckRvYywgclJlZ2lvbiwgMCwgclJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJZkFsbERpZmZzLmFkZChkaWZmKTsKLQkJCX0KLQkJfQotCQkKLQkJZmluYWwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQkJCi0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdD0gbmV3IE9iamVjdFsxXTsKLQkJZmluYWwgRG9jTGluZUNvbXBhcmF0b3Igc2E9IHNhbmNlc3Rvciwgc2w9IHNsZWZ0LCBzcj0gc3JpZ2h0OwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGU9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCVN0cmluZyBwcm9ncmVzc1RpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgImNvbXBhcmVQcm9ncmVzc1Rhc2sudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vbml0b3IuYmVnaW5UYXNrKHByb2dyZXNzVGl0bGUsIG1heFdvcmsoc2EsIHNsLCBzcikpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdFswXT0gUmFuZ2VEaWZmZXJlbmNlci5maW5kUmFuZ2VzKG1vbml0b3IsIHNhLCBzbCwgc3IpOwotCQkJCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXgpIHsKLQkJCQkJU3lzdGVtLmdjKCk7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQl7IC8vIGNhbmNlbGxlZAotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX07Ci0JCUlQcm9ncmVzc1NlcnZpY2UgcHJvZ3Jlc3NTZXJ2aWNlPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkKLQkJUmFuZ2VEaWZmZXJlbmNlW10gZT0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb2dyZXNzU2VydmljZS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQkJZT0gKFJhbmdlRGlmZmVyZW5jZVtdKSByZXN1bHRbMF07Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCVN0cmluZyB0aXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZyhidW5kbGUsICJ0b29Db21wbGV4RXJyb3IudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhidW5kbGUsICJ0b29Db21wbGV4RXJyb3IuZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtc2c9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgSW50ZWdlci50b1N0cmluZyhwcm9ncmVzc1NlcnZpY2UuZ2V0TG9uZ09wZXJhdGlvblRpbWUoKS8xMDAwKSB9ICk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihmQ29tcG9zaXRlLmdldFNoZWxsKCksIHRpdGxlLCBtc2cpOwotCQkJZT0gbnVsbDsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIAotCQl9Ci0JCQkJCQotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkvLyB3ZSBjcmVhdGUgYSBOT0NIQU5HRSByYW5nZSBmb3IgdGhlIHdob2xlIGRvY3VtZW50Ci0JCQlEaWZmIGRpZmY9IG5ldyBEaWZmKG51bGwsIFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSwKLQkJCQlhRG9jLCBhUmVnaW9uLCAwLCBhRG9jICE9IG51bGwgPyBhRG9jLmdldExlbmd0aCgpIDogMCwKLQkJCQlsRG9jLCBsUmVnaW9uLCAwLCBsRG9jLmdldExlbmd0aCgpLAotCQkJCXJEb2MsIHJSZWdpb24sIDAsIHJEb2MuZ2V0TGVuZ3RoKCkpOwkKLQkJCQkKLQkJCWZBbGxEaWZmcy5hZGQoZGlmZik7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBhPSBudWxsLCBzPSBudWxsLCBkPSBudWxsOwotCQkJCVJhbmdlRGlmZmVyZW5jZSBlcz0gZVtpXTsKLQkJCQkKLQkJCQlpbnQga2luZD0gZXMua2luZCgpOwotCQkJCQotCQkJCWludCBhbmNlc3RvclN0YXJ0PSAwOwotCQkJCWludCBhbmNlc3RvckVuZD0gMDsKLQkJCQlpZiAoc2FuY2VzdG9yICE9IG51bGwpIHsKLQkJCQkJYW5jZXN0b3JTdGFydD0gc2FuY2VzdG9yLmdldFRva2VuU3RhcnQoZXMuYW5jZXN0b3JTdGFydCgpKTsKLQkJCQkJYW5jZXN0b3JFbmQ9IGdldFRva2VuRW5kMihzYW5jZXN0b3IsIGVzLmFuY2VzdG9yU3RhcnQoKSwgZXMuYW5jZXN0b3JMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWludCBsZWZ0U3RhcnQ9IHNsZWZ0LmdldFRva2VuU3RhcnQoZXMubGVmdFN0YXJ0KCkpOwotCQkJCWludCBsZWZ0RW5kPSBnZXRUb2tlbkVuZDIoc2xlZnQsIGVzLmxlZnRTdGFydCgpLCBlcy5sZWZ0TGVuZ3RoKCkpOwotCQkJCQotCQkJCWludCByaWdodFN0YXJ0PSBzcmlnaHQuZ2V0VG9rZW5TdGFydChlcy5yaWdodFN0YXJ0KCkpOwotCQkJCWludCByaWdodEVuZD0gZ2V0VG9rZW5FbmQyKHNyaWdodCwgZXMucmlnaHRTdGFydCgpLCBlcy5yaWdodExlbmd0aCgpKTsKLQkJCQkKLQkJCQlEaWZmIGRpZmY9IG5ldyBEaWZmKG51bGwsIGtpbmQsCi0JCQkJCWFEb2MsIGFSZWdpb24sIGFuY2VzdG9yU3RhcnQsIGFuY2VzdG9yRW5kLAotCQkJCQlsRG9jLCBsUmVnaW9uLCBsZWZ0U3RhcnQsIGxlZnRFbmQsCi0JCQkJCXJEb2MsIHJSZWdpb24sIHJpZ2h0U3RhcnQsIHJpZ2h0RW5kKTsJCi0JCQkJCi0JCQkJZkFsbERpZmZzLmFkZChkaWZmKTsJLy8gcmVtZW1iZXIgYWxsIHJhbmdlIGRpZmZzIGZvciBzY3JvbGxpbmcKLQkJCi0JCQkJaWYgKGlnbm9yZVdoaXRlU3BhY2UpIHsKLQkJCQkJaWYgKHNhbmNlc3RvciAhPSBudWxsKQotCQkJCQkJYT0gZXh0cmFjdDIoYURvYywgc2FuY2VzdG9yLCBlcy5hbmNlc3RvclN0YXJ0KCksIGVzLmFuY2VzdG9yTGVuZ3RoKCkpOwotCQkJCQlzPSBleHRyYWN0MihsRG9jLCBzbGVmdCwgZXMubGVmdFN0YXJ0KCksIGVzLmxlZnRMZW5ndGgoKSk7Ci0JCQkJCWQ9IGV4dHJhY3QyKHJEb2MsIHNyaWdodCwgZXMucmlnaHRTdGFydCgpLCBlcy5yaWdodExlbmd0aCgpKTsKLQkJCQkKLQkJCQkJaWYgKChhID09IG51bGwgfHwgYS50cmltKCkubGVuZ3RoKCkgPT0gMCkgJiYgcy50cmltKCkubGVuZ3RoKCkgPT0gMCAmJiBkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlkaWZmLmZJc1doaXRlc3BhY2U9IHRydWU7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCi0JCQkJaWYgKHVzZUNoYW5nZShraW5kKSkgewotCQkJCQlmQ2hhbmdlRGlmZnMuYWRkKGRpZmYpOwkvLyBoZXJlIHdlIHJlbWVtYmVyIG9ubHkgdGhlIHJlYWwgZGlmZnMKLQkJCQkJdXBkYXRlRGlmZkJhY2tncm91bmQoZGlmZik7Ci0JCQotCQkJCQlpZiAocyA9PSBudWxsKQotCQkJCQkJcz0gZXh0cmFjdDIobERvYywgc2xlZnQsIGVzLmxlZnRTdGFydCgpLCBlcy5sZWZ0TGVuZ3RoKCkpOwotCQkJCQlpZiAoZCA9PSBudWxsKQotCQkJCQkJZD0gZXh0cmFjdDIockRvYywgc3JpZ2h0LCBlcy5yaWdodFN0YXJ0KCksIGVzLnJpZ2h0TGVuZ3RoKCkpOwotCQkJCQkKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPiAwICYmIGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAoYSA9PSBudWxsICYmIHNhbmNlc3RvciAhPSBudWxsKQotCQkJCQkJCWE9IGV4dHJhY3QyKGFEb2MsIHNhbmNlc3RvciwgZXMuYW5jZXN0b3JTdGFydCgpLCBlcy5hbmNlc3Rvckxlbmd0aCgpKTsKLQkJCQkJCWlmIChVU0VfTUVSR0lOR19UT0tFTl9ESUZGKQotCQkJCQkJCW1lcmdpbmdUb2tlbkRpZmYoZGlmZiwgYURvYywgYSwgckRvYywgZCwgbERvYywgcyk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJc2ltcGxlVG9rZW5EaWZmKGRpZmYsIGFEb2MsIGEsIHJEb2MsIGQsIGxEb2MsIHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIWZTdWJEb2MgJiYgclJlZ2lvbiAhPSBudWxsICYmIGxSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gd2UgaGF2ZSB0byBhZGQgYSBkaWZmIGZvciB0aGUgaWdub3JlZCBsaW5lcwotCQkJCi0JCQlpbnQgYUVuZD0gMDsKLQkJCWludCBhTGVuPSAwOwotCQkJaWYgKGFSZWdpb24gIT0gbnVsbCAmJiBhRG9jICE9IG51bGwpIHsKLQkJCQlhRW5kPSBhUmVnaW9uLmdldE9mZnNldCgpK2FSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJYUxlbj0gYURvYy5nZXRMZW5ndGgoKTsKLQkJCX0KLQkJCURpZmYgZGlmZj0gbmV3IERpZmYobnVsbCwgUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFLAotCQkJCWFEb2MsIGFSZWdpb24sIGFFbmQsIGFMZW4sCi0JCQkJbERvYywgbFJlZ2lvbiwgbFJlZ2lvbi5nZXRPZmZzZXQoKStsUmVnaW9uLmdldExlbmd0aCgpLCBsRG9jLmdldExlbmd0aCgpLAotCQkJCXJEb2MsIHJSZWdpb24sIHJSZWdpb24uZ2V0T2Zmc2V0KCkrclJlZ2lvbi5nZXRMZW5ndGgoKSwgckRvYy5nZXRMZW5ndGgoKSk7Ci0JCQlmQWxsRGlmZnMuYWRkKGRpZmYpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBEaWZmIGZpbmREaWZmKGNoYXIgdHlwZSwgaW50IHBvcykgewotCQkJCQkJCQkKLQkJSURvY3VtZW50IGFEb2M9IG51bGw7Ci0JCUlEb2N1bWVudCBsRG9jPSBmTGVmdC5nZXREb2N1bWVudCgpOwotCQlJRG9jdW1lbnQgckRvYz0gZlJpZ2h0LmdldERvY3VtZW50KCk7Ci0JCWlmIChsRG9jID09IG51bGwgfHwgckRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJUG9zaXRpb24gYVJlZ2lvbj0gbnVsbDsKLQkJUG9zaXRpb24gbFJlZ2lvbj0gbnVsbDsKLQkJUG9zaXRpb24gclJlZ2lvbj0gbnVsbDsKLQkJCQkKLQkJYm9vbGVhbiB0aHJlZVdheT0gaXNUaHJlZVdheSgpOwotCQkKLQkJaWYgKHRocmVlV2F5ICYmICFmSWdub3JlQW5jZXN0b3IpCi0JCQlhRG9jPSBmQW5jZXN0b3IuZ2V0RG9jdW1lbnQoKTsKLQotCQlib29sZWFuIGlnbm9yZVdoaXRlU3BhY2U9IFV0aWxpdGllcy5nZXRCb29sZWFuKGdldENvbXBhcmVDb25maWd1cmF0aW9uKCksIENvbXBhcmVDb25maWd1cmF0aW9uLklHTk9SRV9XSElURVNQQUNFLCBmYWxzZSk7CQkKLQkJCi0JCURvY0xpbmVDb21wYXJhdG9yIHNyaWdodD0gbmV3IERvY0xpbmVDb21wYXJhdG9yKHJEb2MsIHRvUmVnaW9uKHJSZWdpb24pLCBpZ25vcmVXaGl0ZVNwYWNlKTsKLQkJRG9jTGluZUNvbXBhcmF0b3Igc2xlZnQ9IG5ldyBEb2NMaW5lQ29tcGFyYXRvcihsRG9jLCB0b1JlZ2lvbihsUmVnaW9uKSwgaWdub3JlV2hpdGVTcGFjZSk7Ci0JCURvY0xpbmVDb21wYXJhdG9yIHNhbmNlc3Rvcj0gbnVsbDsKLQkJaWYgKGFEb2MgIT0gbnVsbCkKLQkJCXNhbmNlc3Rvcj0gbmV3IERvY0xpbmVDb21wYXJhdG9yKGFEb2MsIHRvUmVnaW9uKGFSZWdpb24pLCBpZ25vcmVXaGl0ZVNwYWNlKTsKLQkJCQotCQlmaW5hbCBSZXNvdXJjZUJ1bmRsZSBidW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCQkKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0PSBuZXcgT2JqZWN0WzFdOwotCQlmaW5hbCBEb2NMaW5lQ29tcGFyYXRvciBzYT0gc2FuY2VzdG9yLCBzbD0gc2xlZnQsIHNyPSBzcmlnaHQ7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZT0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJU3RyaW5nIHByb2dyZXNzVGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAiY29tcGFyZVByb2dyZXNzVGFzay50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvci5iZWdpblRhc2socHJvZ3Jlc3NUaXRsZSwgbWF4V29yayhzYSwgc2wsIHNyKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0WzBdPSBSYW5nZURpZmZlcmVuY2VyLmZpbmRSYW5nZXMobW9uaXRvciwgc2EsIHNsLCBzcik7Ci0JCQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBleCkgewotCQkJCQlTeXN0ZW0uZ2MoKTsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCXsgLy8gY2FuY2VsbGVkCi0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfTsKLQkJSVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2U9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQotCQlSYW5nZURpZmZlcmVuY2VbXSBlPSBudWxsOwotCQl0cnkgewotCQkJcHJvZ3Jlc3NTZXJ2aWNlLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQllPSAoUmFuZ2VEaWZmZXJlbmNlW10pIHJlc3VsdFswXTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJU3RyaW5nIHRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRvb0NvbXBsZXhFcnJvci50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRvb0NvbXBsZXhFcnJvci5mb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1zZz0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyBJbnRlZ2VyLnRvU3RyaW5nKHByb2dyZXNzU2VydmljZS5nZXRMb25nT3BlcmF0aW9uVGltZSgpLzEwMDApIH0gKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGZDb21wb3NpdGUuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZyk7Ci0JCQllPSBudWxsOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gCi0JCX0KLQkJCQkJCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUmFuZ2VEaWZmZXJlbmNlIGVzPSBlW2ldOwotCQkJCQotCQkJCWludCBraW5kPSBlcy5raW5kKCk7Ci0JCQkJCi0JCQkJaW50IGFuY2VzdG9yU3RhcnQ9IDA7Ci0JCQkJaW50IGFuY2VzdG9yRW5kPSAwOwotCQkJCWlmIChzYW5jZXN0b3IgIT0gbnVsbCkgewotCQkJCQlhbmNlc3RvclN0YXJ0PSBzYW5jZXN0b3IuZ2V0VG9rZW5TdGFydChlcy5hbmNlc3RvclN0YXJ0KCkpOwotCQkJCQlhbmNlc3RvckVuZD0gZ2V0VG9rZW5FbmQyKHNhbmNlc3RvciwgZXMuYW5jZXN0b3JTdGFydCgpLCBlcy5hbmNlc3Rvckxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaW50IGxlZnRTdGFydD0gc2xlZnQuZ2V0VG9rZW5TdGFydChlcy5sZWZ0U3RhcnQoKSk7Ci0JCQkJaW50IGxlZnRFbmQ9IGdldFRva2VuRW5kMihzbGVmdCwgZXMubGVmdFN0YXJ0KCksIGVzLmxlZnRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJaW50IHJpZ2h0U3RhcnQ9IHNyaWdodC5nZXRUb2tlblN0YXJ0KGVzLnJpZ2h0U3RhcnQoKSk7Ci0JCQkJaW50IHJpZ2h0RW5kPSBnZXRUb2tlbkVuZDIoc3JpZ2h0LCBlcy5yaWdodFN0YXJ0KCksIGVzLnJpZ2h0TGVuZ3RoKCkpOwotCQkJCQotCQkJCURpZmYgZGlmZj0gbmV3IERpZmYobnVsbCwga2luZCwKLQkJCQkJYURvYywgYVJlZ2lvbiwgYW5jZXN0b3JTdGFydCwgYW5jZXN0b3JFbmQsCi0JCQkJCWxEb2MsIGxSZWdpb24sIGxlZnRTdGFydCwgbGVmdEVuZCwKLQkJCQkJckRvYywgclJlZ2lvbiwgcmlnaHRTdGFydCwgcmlnaHRFbmQpOwkKLQotCQkJCWlmIChkaWZmLmlzSW5SYW5nZSh0eXBlLCBwb3MpKQotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIGtpbmQgb2YgY2hhbmdlIHNob3VsZCBiZSBzaG93bi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2hhbmdlKGludCBraW5kKSB7Ci0JCWlmIChraW5kID09IFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGtpbmQgPT0gUmFuZ2VEaWZmZXJlbmNlLkFOQ0VTVE9SKQotCQkJcmV0dXJuIGZTaG93UHNldWRvQ29uZmxpY3RzOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0VG9rZW5FbmQoSVRva2VuQ29tcGFyYXRvciB0YywgaW50IHN0YXJ0LCBpbnQgY291bnQpIHsKLQkJaWYgKGNvdW50IDw9IDApCi0JCQlyZXR1cm4gdGMuZ2V0VG9rZW5TdGFydChzdGFydCk7Ci0JCWludCBpbmRleD0gc3RhcnQgKyBjb3VudCAtIDE7Ci0JCXJldHVybiB0Yy5nZXRUb2tlblN0YXJ0KGluZGV4KSArIHRjLmdldFRva2VuTGVuZ3RoKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRva2VuRW5kMihJVG9rZW5Db21wYXJhdG9yIHRjLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRjLmdldFRva2VuU3RhcnQoc3RhcnQgKyBsZW5ndGgpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgY29udGVudCBvZiBsaW5lcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIGFzIGEgU3RyaW5nLgotCSAqIFRoaXMgaW5jbHVkZXMgdGhlIGxpbmUgc2VwYXJhdG9ycy4KLQkgKgotCSAqIEBwYXJhbSBkb2MgdGhlIGRvY3VtZW50IGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgY2hhcmFjdGVycwotCSAqIEBwYXJhbSBzdGFydCBpbmRleCBvZiBmaXJzdCBsaW5lCi0JICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgbGluZXMKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGxpbmUgcmFuZ2UgYXMgYSBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0MihJRG9jdW1lbnQgZG9jLCBJVG9rZW5Db21wYXJhdG9yIHRjLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaW50IGNvdW50PSB0Yy5nZXRSYW5nZUNvdW50KCk7Ci0JCWlmIChsZW5ndGggPiAwICYmIGNvdW50ID4gMCkgewotCQkJCi0vLwkJCQotLy8JCQlpbnQgc3RhcnRQb3M9IHRjLmdldFRva2VuU3RhcnQoc3RhcnQpOwotLy8JCQlpbnQgZW5kUG9zPSBzdGFydFBvczsKLS8vCQkJCi0vLwkJCWlmIChsZW5ndGggPiAxKQotLy8JCQkJZW5kUG9zPSB0Yy5nZXRUb2tlblN0YXJ0KHN0YXJ0ICsgKGxlbmd0aC0xKSk7Ci0vLwkJCWVuZFBvcys9IHRjLmdldFRva2VuTGVuZ3RoKHN0YXJ0ICsgKGxlbmd0aC0xKSk7Ci0vLwkJCQkKLQotCQkJaW50IHN0YXJ0UG9zPSB0Yy5nZXRUb2tlblN0YXJ0KHN0YXJ0KTsKLQkJCWludCBlbmRQb3M7Ci0JCQkKLQkJCWlmIChsZW5ndGggPT0gMSkgewotCQkJCWVuZFBvcz0gc3RhcnRQb3MgKyB0Yy5nZXRUb2tlbkxlbmd0aChzdGFydCk7Ci0JCQl9IGVsc2UgewotCQkJCWVuZFBvcz0gdGMuZ2V0VG9rZW5TdGFydChzdGFydCArIGxlbmd0aCk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGRvYy5nZXQoc3RhcnRQb3MsIGVuZFBvcyAtIHN0YXJ0UG9zKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIFBlcmZvcm1zIGEgdG9rZW4gYmFzZWQgMy13YXkgZGlmZiBvbiB0aGUgY2hhcmFjdGVyIHJhbmdlIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gYmFzZURpZmYuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNpbXBsZVRva2VuRGlmZihmaW5hbCBEaWZmIGJhc2VEaWZmLAotCQkJCUlEb2N1bWVudCBhbmNlc3RvckRvYywgU3RyaW5nIGEsCi0JCQkJSURvY3VtZW50IHJpZ2h0RG9jLCBTdHJpbmcgZCwKLQkJCQlJRG9jdW1lbnQgbGVmdERvYywgU3RyaW5nIHMpIHsKLQotCQlpbnQgYW5jZXN0b3JTdGFydD0gMDsKLQkJSVRva2VuQ29tcGFyYXRvciBzYT0gbnVsbDsKLQkJaWYgKGFuY2VzdG9yRG9jICE9IG51bGwpIHsKLQkJCWFuY2VzdG9yU3RhcnQ9IGJhc2VEaWZmLmZBbmNlc3RvclBvcy5nZXRPZmZzZXQoKTsKLQkJCXNhPSBjcmVhdGVUb2tlbkNvbXBhcmF0b3IoYSk7Ci0JCX0KLQkJCi0JCWludCByaWdodFN0YXJ0PSBiYXNlRGlmZi5mUmlnaHRQb3MuZ2V0T2Zmc2V0KCk7CQotCQlJVG9rZW5Db21wYXJhdG9yIHNtPSBjcmVhdGVUb2tlbkNvbXBhcmF0b3IoZCk7Ci0JCQotCQlpbnQgbGVmdFN0YXJ0PSBiYXNlRGlmZi5mTGVmdFBvcy5nZXRPZmZzZXQoKTsKLQkJSVRva2VuQ29tcGFyYXRvciBzeT0gY3JlYXRlVG9rZW5Db21wYXJhdG9yKHMpOwotCQkKLQkJUmFuZ2VEaWZmZXJlbmNlW10gZT0gUmFuZ2VEaWZmZXJlbmNlci5maW5kUmFuZ2VzKHNhLCBzeSwgc20pOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykgewotCQkJUmFuZ2VEaWZmZXJlbmNlIGVzPSBlW2ldOwotCQkJaW50IGtpbmQ9IGVzLmtpbmQoKTsKLQkJCWlmIChraW5kICE9IFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSkgewotCQkJCQotCQkJCWludCBhbmNlc3RvclN0YXJ0Mj0gYW5jZXN0b3JTdGFydDsKLQkJCQlpbnQgYW5jZXN0b3JFbmQyPSBhbmNlc3RvclN0YXJ0OwotCQkJCWlmIChhbmNlc3RvckRvYyAhPSBudWxsKSB7Ci0JCQkJCWFuY2VzdG9yU3RhcnQyICs9IHNhLmdldFRva2VuU3RhcnQoZXMuYW5jZXN0b3JTdGFydCgpKTsKLQkJCQkJYW5jZXN0b3JFbmQyICs9IGdldFRva2VuRW5kKHNhLCBlcy5hbmNlc3RvclN0YXJ0KCksIGVzLmFuY2VzdG9yTGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkKLQkJCQlpbnQgbGVmdFN0YXJ0Mj0gbGVmdFN0YXJ0ICsgc3kuZ2V0VG9rZW5TdGFydChlcy5sZWZ0U3RhcnQoKSk7Ci0JCQkJaW50IGxlZnRFbmQyPSBsZWZ0U3RhcnQgKyBnZXRUb2tlbkVuZChzeSwgZXMubGVmdFN0YXJ0KCksIGVzLmxlZnRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJaW50IHJpZ2h0U3RhcnQyPSByaWdodFN0YXJ0ICsgc20uZ2V0VG9rZW5TdGFydChlcy5yaWdodFN0YXJ0KCkpOwotCQkJCWludCByaWdodEVuZDI9IHJpZ2h0U3RhcnQgKyBnZXRUb2tlbkVuZChzbSwgZXMucmlnaHRTdGFydCgpLCBlcy5yaWdodExlbmd0aCgpKTsKLQkJCQkKLQkJCQlEaWZmIGRpZmY9IG5ldyBEaWZmKGJhc2VEaWZmLCBraW5kLAotCQkJCQkJYW5jZXN0b3JEb2MsIG51bGwsIGFuY2VzdG9yU3RhcnQyLCBhbmNlc3RvckVuZDIsCi0JCQkJCQlsZWZ0RG9jLCBudWxsLCBsZWZ0U3RhcnQyLCBsZWZ0RW5kMiwKLQkJCQkJCXJpZ2h0RG9jLCBudWxsLCByaWdodFN0YXJ0MiwgcmlnaHRFbmQyKTsKLQkJCQkKLQkJCQkvLyBlbnN1cmUgdGhhdCB0b2tlbiBkaWZmIGlzIHNtYWxsZXIgdGhhbiBiYXNlZGlmZgotCQkJCWludCBsZWZ0Uz0gYmFzZURpZmYuZkxlZnRQb3Mub2Zmc2V0OwotCQkJCWludCBsZWZ0RT0gYmFzZURpZmYuZkxlZnRQb3Mub2Zmc2V0K2Jhc2VEaWZmLmZMZWZ0UG9zLmxlbmd0aDsKLQkJCQlpbnQgcmlnaHRTPSBiYXNlRGlmZi5mUmlnaHRQb3Mub2Zmc2V0OwotCQkJCWludCByaWdodEU9IGJhc2VEaWZmLmZSaWdodFBvcy5vZmZzZXQrYmFzZURpZmYuZlJpZ2h0UG9zLmxlbmd0aDsKLQkJCQlpZiAobGVmdFMgIT0gbGVmdFN0YXJ0MiB8fCBsZWZ0RSAhPSBsZWZ0RW5kMiB8fAotCQkJCQkJCXJpZ2h0UyAhPSByaWdodFN0YXJ0MiB8fCByaWdodEUgIT0gcmlnaHRFbmQyKSB7Ci0JCQkJCWRpZmYuZklzVG9rZW49IHRydWU7Ci0JCQkJCS8vIGFkZCB0byBiYXNlIERpZmYKLQkJCQkJYmFzZURpZmYuYWRkKGRpZmYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIFBlcmZvcm1zIGEgInNtYXJ0IiB0b2tlbiBiYXNlZCAzLXdheSBkaWZmIG9uIHRoZSBjaGFyYWN0ZXIgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBiYXNlRGlmZi4KLQkgKiBJdCBpcyAic21hcnQiIGJlY2F1c2UgaXQgdHJpZXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiB0b2tlbiBkaWZmcyBieSBtZXJnaW5nIHRoZW0uCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1lcmdpbmdUb2tlbkRpZmYoRGlmZiBiYXNlRGlmZiwgCi0JCQkJSURvY3VtZW50IGFuY2VzdG9yRG9jLCBTdHJpbmcgYSwKLQkJCQlJRG9jdW1lbnQgcmlnaHREb2MsIFN0cmluZyBkLAotCQkJCUlEb2N1bWVudCBsZWZ0RG9jLCBTdHJpbmcgcykgewotCQlJVG9rZW5Db21wYXJhdG9yIHNhPSBudWxsOwotCQlpbnQgYW5jZXN0b3JTdGFydD0gMDsKLQkJaWYgKGFuY2VzdG9yRG9jICE9IG51bGwpIHsKLQkJCXNhPSBjcmVhdGVUb2tlbkNvbXBhcmF0b3IoYSk7Ci0JCQlhbmNlc3RvclN0YXJ0PSBiYXNlRGlmZi5mQW5jZXN0b3JQb3MuZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJCi0JCWludCByaWdodFN0YXJ0PSBiYXNlRGlmZi5mUmlnaHRQb3MuZ2V0T2Zmc2V0KCk7CQotCQlJVG9rZW5Db21wYXJhdG9yIHNtPSBjcmVhdGVUb2tlbkNvbXBhcmF0b3IoZCk7Ci0JCQotCQlpbnQgbGVmdFN0YXJ0PSBiYXNlRGlmZi5mTGVmdFBvcy5nZXRPZmZzZXQoKTsKLQkJSVRva2VuQ29tcGFyYXRvciBzeT0gY3JlYXRlVG9rZW5Db21wYXJhdG9yKHMpOwotCQkKLQkJUmFuZ2VEaWZmZXJlbmNlW10gcj0gUmFuZ2VEaWZmZXJlbmNlci5maW5kUmFuZ2VzKHNhLCBzeSwgc20pOwotCQlmb3IgKGludCBpPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewotCQkJUmFuZ2VEaWZmZXJlbmNlICBlcz0gcltpXTsKLQkJCS8vIGRldGVybWluZSByYW5nZSBvZiBkaWZmcyBpbiBvbmUgbGluZQotCQkJaW50IHN0YXJ0PSBpOwotCQkJaW50IGxlZnRMaW5lPSAtMTsKLQkJCWludCByaWdodExpbmU9IC0xOwotCQkJdHJ5IHsKLQkJCQlsZWZ0TGluZT0gbGVmdERvYy5nZXRMaW5lT2ZPZmZzZXQobGVmdFN0YXJ0K3N5LmdldFRva2VuU3RhcnQoZXMubGVmdFN0YXJ0KCkpKTsKLQkJCQlyaWdodExpbmU9IHJpZ2h0RG9jLmdldExpbmVPZk9mZnNldChyaWdodFN0YXJ0K3NtLmdldFRva2VuU3RhcnQoZXMucmlnaHRTdGFydCgpKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQkJaSsrOwotCQkJZm9yICg7IGkgPCByLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZXM9IHJbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGxlZnRMaW5lICE9IGxlZnREb2MuZ2V0TGluZU9mT2Zmc2V0KGxlZnRTdGFydCtzeS5nZXRUb2tlblN0YXJ0KGVzLmxlZnRTdGFydCgpKSkpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKHJpZ2h0TGluZSAhPSByaWdodERvYy5nZXRMaW5lT2ZPZmZzZXQocmlnaHRTdGFydCtzbS5nZXRUb2tlblN0YXJ0KGVzLnJpZ2h0U3RhcnQoKSkpKQotCQkJCQkJYnJlYWs7Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQkJfQotCQkJaW50IGVuZD0gaTsKLQkJCQotCQkJLy8gZmluZCBmaXJzdCBkaWZmIGZyb20gbGVmdAotCQkJUmFuZ2VEaWZmZXJlbmNlIGZpcnN0PSBudWxsOwotCQkJZm9yIChpbnQgaWk9IHN0YXJ0OyBpaSA8IGVuZDsgaWkrKykgewotCQkJCWVzPSByW2lpXTsKLQkJCQlpZiAodXNlQ2hhbmdlKGVzLmtpbmQoKSkpIHsKLQkJCQkJZmlyc3Q9IGVzOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGZpbmQgZmlyc3QgZGlmZiBmcm9tIG1pbmUKLQkJCVJhbmdlRGlmZmVyZW5jZSBsYXN0PSBudWxsOwotCQkJZm9yIChpbnQgaWk9IGVuZC0xOyBpaSA+PSBzdGFydDsgaWktLSkgewotCQkJCWVzPSByW2lpXTsKLQkJCQlpZiAodXNlQ2hhbmdlKGVzLmtpbmQoKSkpIHsKLQkJCQkJbGFzdD0gZXM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGZpcnN0ICE9IG51bGwgJiYgbGFzdCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJaW50IGFuY2VzdG9yU3RhcnQyPSAwOwotCQkJCWludCBhbmNlc3RvckVuZDI9IDA7Ci0JCQkJaWYgKGFuY2VzdG9yRG9jICE9IG51bGwpIHsKLQkJCQkJYW5jZXN0b3JTdGFydDI9IGFuY2VzdG9yU3RhcnQrc2EuZ2V0VG9rZW5TdGFydChmaXJzdC5hbmNlc3RvclN0YXJ0KCkpOwotCQkJCQlhbmNlc3RvckVuZDI9IGFuY2VzdG9yU3RhcnQrZ2V0VG9rZW5FbmQoc2EsIGxhc3QuYW5jZXN0b3JTdGFydCgpLCBsYXN0LmFuY2VzdG9yTGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkKLQkJCQlpbnQgbGVmdFN0YXJ0Mj0gbGVmdFN0YXJ0K3N5LmdldFRva2VuU3RhcnQoZmlyc3QubGVmdFN0YXJ0KCkpOwotCQkJCWludCBsZWZ0RW5kMj0gbGVmdFN0YXJ0K2dldFRva2VuRW5kKHN5LCBsYXN0LmxlZnRTdGFydCgpLCBsYXN0LmxlZnRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJaW50IHJpZ2h0U3RhcnQyPSByaWdodFN0YXJ0K3NtLmdldFRva2VuU3RhcnQoZmlyc3QucmlnaHRTdGFydCgpKTsKLQkJCQlpbnQgcmlnaHRFbmQyPSByaWdodFN0YXJ0K2dldFRva2VuRW5kKHNtLCBsYXN0LnJpZ2h0U3RhcnQoKSwgbGFzdC5yaWdodExlbmd0aCgpKTsKLQkJCQlEaWZmIGRpZmY9IG5ldyBEaWZmKGJhc2VEaWZmLCBmaXJzdC5raW5kKCksCi0JCQkJCQkJYW5jZXN0b3JEb2MsIG51bGwsIGFuY2VzdG9yU3RhcnQyLCBhbmNlc3RvckVuZDIrMSwKLQkJCQkJCQlsZWZ0RG9jLCBudWxsLCBsZWZ0U3RhcnQyLCBsZWZ0RW5kMisxLAotCQkJCQkJCXJpZ2h0RG9jLCBudWxsLCByaWdodFN0YXJ0MiwgcmlnaHRFbmQyKzEpOwkKLQkJCQlkaWZmLmZJc1Rva2VuPSB0cnVlOwotCQkJCWJhc2VEaWZmLmFkZChkaWZmKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLy0tLS0gdXBkYXRlIFVJIHN0dWZmCi0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQkKLQkJYm9vbGVhbiBsZWZ0VG9SaWdodD0gZmFsc2U7Ci0JCWJvb2xlYW4gcmlnaHRUb0xlZnQ9IGZhbHNlOwotCQkKLQkJdXBkYXRlU3RhdHVzKGZDdXJyZW50RGlmZik7Ci0JCXVwZGF0ZVJlc29sdmVTdGF0dXMoKTsKLQotCQlpZiAoZkN1cnJlbnREaWZmICE9IG51bGwpIHsKLQkJCUlNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlciBjcD0gZ2V0TWVyZ2VDb250ZW50UHJvdmlkZXIoKTsKLQkJCWlmIChjcCAhPSBudWxsKSB7Ci0JCQkJcmlnaHRUb0xlZnQ9IGNwLmlzTGVmdEVkaXRhYmxlKGdldElucHV0KCkpOwotCQkJCWxlZnRUb1JpZ2h0PSBjcC5pc1JpZ2h0RWRpdGFibGUoZ2V0SW5wdXQoKSk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCWlmIChmRGlyZWN0aW9uTGFiZWwgIT0gbnVsbCkgewotCQkJaWYgKGZIaWdobGlnaHRSYW5nZXMgJiYgZkN1cnJlbnREaWZmICE9IG51bGwgJiYgaXNUaHJlZVdheSgpICYmICFmSWdub3JlQW5jZXN0b3IpIHsKLQkJCQlmRGlyZWN0aW9uTGFiZWwuc2V0SW1hZ2UoZkN1cnJlbnREaWZmLmdldEltYWdlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlmRGlyZWN0aW9uTGFiZWwuc2V0SW1hZ2UobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW0gIT0gbnVsbCkKLQkJCSgoQWN0aW9uKWZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbS5nZXRBY3Rpb24oKSkuc2V0RW5hYmxlZChsZWZ0VG9SaWdodCk7Ci0JCWlmIChmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0gIT0gbnVsbCkKLQkJCSgoQWN0aW9uKWZDb3B5RGlmZlJpZ2h0VG9MZWZ0SXRlbS5nZXRBY3Rpb24oKSkuc2V0RW5hYmxlZChyaWdodFRvTGVmdCk7Ci0JCQkKLQkJYm9vbGVhbiBlbmFibGVOYXZpZ2F0aW9uPSBmYWxzZTsKLQkJaWYgKGZDdXJyZW50RGlmZiA9PSBudWxsICYmIGZDaGFuZ2VEaWZmcyAhPSBudWxsICYmIGZDaGFuZ2VEaWZmcy5zaXplKCkgPiAwKQotCQkJZW5hYmxlTmF2aWdhdGlvbj0gdHJ1ZTsKLQkJZWxzZSBpZiAoZkNoYW5nZURpZmZzICE9IG51bGwgJiYgZkNoYW5nZURpZmZzLnNpemUoKSA+IDEpCi0JCQllbmFibGVOYXZpZ2F0aW9uPSB0cnVlOwotCQllbHNlIGlmIChmQ3VycmVudERpZmYgIT0gbnVsbCAmJiBmQ3VycmVudERpZmYuZkRpZmZzICE9IG51bGwpCi0JCQllbmFibGVOYXZpZ2F0aW9uPSB0cnVlOwotCQllbHNlIGlmIChmQ3VycmVudERpZmYgIT0gbnVsbCAmJiBmQ3VycmVudERpZmYuZklzVG9rZW4pCi0JCQllbmFibGVOYXZpZ2F0aW9uPSB0cnVlOwotCQkKLQkJaWYgKGZOZXh0SXRlbSAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGE9IGZOZXh0SXRlbS5nZXRBY3Rpb24oKTsKLQkJCWEuc2V0RW5hYmxlZChlbmFibGVOYXZpZ2F0aW9uKTsKLQkJfQotCQlpZiAoZlByZXZpb3VzSXRlbSAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGE9IGZQcmV2aW91c0l0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQlhLnNldEVuYWJsZWQoZW5hYmxlTmF2aWdhdGlvbik7Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVSZXNvbHZlU3RhdHVzKCkgewotCQkJCi0JCVJHQiByZ2I9IG51bGw7Ci0JCQotCQlpZiAoc2hvd1Jlc29sdmVVSSgpKSB7Ci0JCQkvLyB3ZSBvbmx5IHNob3cgcmVkIG9yIGdyZWVuIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbmNvbWluZyBvciBjb25mbGljdGluZyBjaGFuZ2UKLQkJCWludCBpbmNvbWluZ09yQ29uZmxpY3Rpbmc9IDA7Ci0JCQlpbnQgdW5yZXNvbHZlZEluY29taW5nPSAwOwotCQkJaW50IHVucmVzb2x2ZWRDb25mbGljdGluZz0gMDsKLQotCQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJCURpZmYgZD0gKERpZmYpIGUubmV4dCgpOwotCQkJCQlpZiAoZC5pc0luY29taW5nT3JDb25mbGljdGluZygpIC8qICYmIHVzZUNoYW5nZShkLmZEaXJlY3Rpb24pICYmICFkLmZJc1doaXRlc3BhY2UgKi8pIHsKLQkJCQkJCWluY29taW5nT3JDb25mbGljdGluZysrOwotCQkJCQkJaWYgKCFkLmZSZXNvbHZlZCkgewotCQkJCQkJCWlmIChkLmZEaXJlY3Rpb24gPT0gUmFuZ2VEaWZmZXJlbmNlLkNPTkZMSUNUKSB7Ci0JCQkJCQkJCXVucmVzb2x2ZWRDb25mbGljdGluZysrOwotCQkJCQkJCQlicmVhazsgLy8gd2UgY2FuIHN0b3AgaGVyZSBiZWNhdXNlIGEgY29uZmxpY3QgaGFzIHRoZSBtYXhpbXVtIHByaW9yaXR5Ci0JCQkJCQkJfQotCQkJCQkJCXVucmVzb2x2ZWRJbmNvbWluZysrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkKLQkJCWlmIChpbmNvbWluZ09yQ29uZmxpY3RpbmcgPiAwKSB7Ci0JCQkJaWYgKHVucmVzb2x2ZWRDb25mbGljdGluZyA+IDApCi0JCQkJCXJnYj0gU0VMRUNURURfQ09ORkxJQ1Q7Ci0JCQkJZWxzZSBpZiAodW5yZXNvbHZlZEluY29taW5nID4gMCkKLQkJCQkJcmdiPSBTRUxFQ1RFRF9JTkNPTUlORzsKLQkJCQllbHNlCi0JCQkJCXJnYj0gUkVTT0xWRUQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChmSGVhZGVyUGFpbnRlci5zZXRDb2xvcihyZ2IpKQotCQkJZlN1bW1hcnlIZWFkZXIucmVkcmF3KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cyhEaWZmIGRpZmYpIHsKLQkJCi0JCWlmICghIGZTaG93TW9yZUluZm8pCi0JCQlyZXR1cm47Ci0JCQotCQlJQWN0aW9uQmFycyBiYXJzPSBVdGlsaXRpZXMuZmluZEFjdGlvbkJhcnMoZkNvbXBvc2l0ZSk7Ci0JCWlmIChiYXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBzbG09IGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKHNsbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCQkKLQkJU3RyaW5nIGRpZmZEZXNjcmlwdGlvbjsKLQkJCi0JCWlmIChkaWZmID09IG51bGwpIHsKLQkJCWRpZmZEZXNjcmlwdGlvbj0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmRpZmZEZXNjcmlwdGlvbi5ub0RpZmYuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCQotCQkJaWYgKGRpZmYuZklzVG9rZW4pCQkvLyB3ZSBkb24ndCBzaG93IHNwZWNpYWwgaW5mbyBmb3IgdG9rZW4gZGlmZnMKLQkJCQlkaWZmPSBkaWZmLmZQYXJlbnQ7Ci0JCQotCQkJU3RyaW5nIGZvcm1hdD0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmRpZmZEZXNjcmlwdGlvbi5kaWZmLmZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCQlkaWZmRGVzY3JpcHRpb249IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJZ2V0RGlmZlR5cGUoZGlmZiksCQkJCQkJLy8gMDogZGlmZiB0eXBlCi0JCQkJCWdldERpZmZOdW1iZXIoZGlmZiksCQkJCQkvLyAxOiBkaWZmIG51bWJlcgotCQkJCQlnZXREaWZmUmFuZ2UoZkxlZnQsIGRpZmYuZkxlZnRQb3MpLAkJLy8gMjogbGVmdCBzdGFydCBsaW5lCi0JCQkJCWdldERpZmZSYW5nZShmUmlnaHQsIGRpZmYuZlJpZ2h0UG9zKQkvLyAzOiBsZWZ0IGVuZCBsaW5lCi0JCQkJfQotCQkJKTsKLQkJfQotCQkKLQkJU3RyaW5nIGZvcm1hdD0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLnN0YXR1c0xpbmUuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHM9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgCi0JCQluZXcgU3RyaW5nW10gewotCQkJCWdldEN1cnNvclBvc2l0aW9uKGZMZWZ0KSwJLy8gMDogbGVmdCBjb2x1bW4KLQkJCQlnZXRDdXJzb3JQb3NpdGlvbihmUmlnaHQpLAkvLyAxOiByaWdodCBjb2x1bW4KLQkJCQlkaWZmRGVzY3JpcHRpb24JCQkJLy8gMjogZGlmZiBkZXNjcmlwdGlvbgotCQkJfQotCQkpOwotCQotCQlzbG0uc2V0TWVzc2FnZShzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTdGF0dXMoKSB7Ci0JCQotCQlJQWN0aW9uQmFycyBiYXJzPSBVdGlsaXRpZXMuZmluZEFjdGlvbkJhcnMoZkNvbXBvc2l0ZSk7Ci0JCWlmIChiYXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBzbG09IGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKHNsbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCQkJCi0JCXNsbS5zZXRNZXNzYWdlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmVHlwZShEaWZmIGRpZmYpIHsKLQkJU3RyaW5nIHM9ICIiOyAJLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2goZGlmZi5mRGlyZWN0aW9uKSB7Ci0JCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkxFRlQ6Ci0JCQlzPSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuZGlyZWN0aW9uLm91dGdvaW5nIik7CS8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwotCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLQkJCXM9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5kaXJlY3Rpb24uaW5jb21pbmciKTsJLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkNPTkZMSUNUOgotCQkJcz0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLmRpcmVjdGlvbi5jb25mbGljdGluZyIpOwkvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJfQotCQlTdHJpbmcgZm9ybWF0PSBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0TWVyZ2VWaWV3ZXIuZGlmZlR5cGUuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgcywgZGlmZi5jaGFuZ2VUeXBlKCkgfSApOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmTnVtYmVyKERpZmYgZGlmZikgewotCQkvLyBmaW5kIHRoZSBkaWZmJ3MgbnVtYmVyCi0JCWludCBkaWZmTnVtYmVyPSAwOwotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGU9IGZDaGFuZ2VEaWZmcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJRGlmZiBkPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJZGlmZk51bWJlcisrOwotCQkJCWlmIChkID09IGRpZmYpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGRpZmZOdW1iZXIpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmUmFuZ2UoTWVyZ2VTb3VyY2VWaWV3ZXIgdiwgUG9zaXRpb24gcG9zKSB7Ci0JCVBvaW50IHA9IHYuZ2V0TGluZVJhbmdlKHBvcywgbmV3IFBvaW50KDAsIDApKTsKLQkJaW50IHN0YXJ0TGluZT0gcC54KzE7Ci0JCWludCBlbmRMaW5lPSBwLngrcC55OwotCQkKLQkJU3RyaW5nIGZvcm1hdDsKLQkJaWYgKGVuZExpbmUgPCBzdGFydExpbmUpCi0JCQlmb3JtYXQ9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5iZWZvcmVMaW5lLmZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWZvcm1hdD0gQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dE1lcmdlVmlld2VyLnJhbmdlLmZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoc3RhcnRMaW5lKSwKLQkJCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZW5kTGluZSkgfSApOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY3Vyc29yIHBvc2l0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgY3Vyc29yIHBvc2l0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q3Vyc29yUG9zaXRpb24oTWVyZ2VTb3VyY2VWaWV3ZXIgdikgewotCQlpZiAodiAhPSBudWxsKSB7Ci0JCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ9IHYuZ2V0VGV4dFdpZGdldCgpOwotCQkJCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IHYuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldD0gdi5nZXRWaXNpYmxlUmVnaW9uKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGNhcmV0PSBvZmZzZXQgKyBzdHlsZWRUZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJCi0JCQkJCWludCBsaW5lPWRvY3VtZW50LmdldExpbmVPZk9mZnNldChjYXJldCk7Ci0JCQkJCQotCQkJCQlpbnQgbGluZU9mZnNldD0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQkJaW50IG9jY3VycmVuY2VzPSAwOwotCQkJCQlmb3IgKGludCBpPSBsaW5lT2Zmc2V0OyBpIDwgY2FyZXQ7IGkrKykKLQkJCQkJCWlmICgnXHQnID09IGRvY3VtZW50LmdldENoYXIoaSkpCi0JCQkJCQkJKysgb2NjdXJyZW5jZXM7Ci0JCQkJCQkJCi0JCQkJCWludCB0YWJXaWR0aD0gc3R5bGVkVGV4dC5nZXRUYWJzKCk7Ci0JCQkJCWludCBjb2x1bW49IGNhcmV0IC0gbGluZU9mZnNldCArICh0YWJXaWR0aCAtMSkgKiBvY2N1cnJlbmNlczsKLQkJCQkJCi0JCQkJCVN0cmluZyBmb3JtYXQ9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci5jdXJzb3JQb3NpdGlvbi5mb3JtYXQiKTsJLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhsaW5lICsgMSksIEludGVnZXIudG9TdHJpbmcoY29sdW1uICsgMSkgfSApOwotCQkJCQkKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVhZGVyKCkgewotCQkKLQkJc3VwZXIudXBkYXRlSGVhZGVyKCk7Ci0JCQkJCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIHRoZSB0d28gaXRlbXMgZm9yIGNvcHlpbmcgYSBkaWZmZXJlbmNlIHJhbmdlIGZyb20gb25lIHNpZGUgdG8gdGhlIG90aGVyIAotCSAqIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGdpdmVuIHRvb2xiYXIgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sSXRlbXMoVG9vbEJhck1hbmFnZXIgdGJtKSB7Ci0KLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHBzPSBVdGlsaXRpZXMuZmluZFNpdGUoZkNvbXBvc2l0ZSk7Ci0JCWZLZXlCaW5kaW5nU2VydmljZT0gcHMgIT0gbnVsbCA/IHBzLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkgOiBudWxsOwotCQkKLQkJZmluYWwgU3RyaW5nIGlnbm9yZUFuY2VzdG9yQWN0aW9uS2V5PSAiYWN0aW9uLklnbm9yZUFuY2VzdG9yLiI7CS8vJE5PTi1OTFMtMSQKLQkJQWN0aW9uIGlnbm9yZUFuY2VzdG9yQWN0aW9uPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldElnbm9yZUFuY2VzdG9yKCEgZklnbm9yZUFuY2VzdG9yKTsKLQkJCQlVdGlsaXRpZXMuaW5pdFRvZ2dsZUFjdGlvbih0aGlzLCBnZXRSZXNvdXJjZUJ1bmRsZSgpLCBpZ25vcmVBbmNlc3RvckFjdGlvbktleSwgZklnbm9yZUFuY2VzdG9yKTsKLQkJCX0KLQkJfTsKLQkJaWdub3JlQW5jZXN0b3JBY3Rpb24uc2V0Q2hlY2tlZChmSWdub3JlQW5jZXN0b3IpOwotCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihpZ25vcmVBbmNlc3RvckFjdGlvbiwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgaWdub3JlQW5jZXN0b3JBY3Rpb25LZXkpOwotCQlVdGlsaXRpZXMuaW5pdFRvZ2dsZUFjdGlvbihpZ25vcmVBbmNlc3RvckFjdGlvbiwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgaWdub3JlQW5jZXN0b3JBY3Rpb25LZXksIGZJZ25vcmVBbmNlc3Rvcik7Ci0JCQotCQlmSWdub3JlQW5jZXN0b3JJdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShpZ25vcmVBbmNlc3RvckFjdGlvbik7Ci0JCWZJZ25vcmVBbmNlc3Rvckl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRibS5hcHBlbmRUb0dyb3VwKCJtb2RlcyIsIGZJZ25vcmVBbmNlc3Rvckl0ZW0pOyAvLyROT04tTkxTLTEkCi0KLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJCQkKLQkJQWN0aW9uIGE9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbmF2aWdhdGUodHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCVV0aWxpdGllcy5pbml0QWN0aW9uKGEsIGdldFJlc291cmNlQnVuZGxlKCksICJhY3Rpb24uTmV4dERpZmYuIik7IC8vJE5PTi1OTFMtMSQKLQkJZk5leHRJdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhKTsKLQkJdGJtLmFwcGVuZFRvR3JvdXAoIm5hdmlnYXRpb24iLCBmTmV4dEl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCVV0aWxpdGllcy5yZWdpc3RlckFjdGlvbihmS2V5QmluZGluZ1NlcnZpY2UsIGEsICJvcmcuZWNsaXBzZS5jb21wYXJlLnNlbGVjdE5leHRDaGFuZ2UiKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJYT0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluYXZpZ2F0ZShmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCVV0aWxpdGllcy5pbml0QWN0aW9uKGEsIGdldFJlc291cmNlQnVuZGxlKCksICJhY3Rpb24uUHJldkRpZmYuIik7IC8vJE5PTi1OTFMtMSQKLQkJZlByZXZpb3VzSXRlbT0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYSk7Ci0JCXRibS5hcHBlbmRUb0dyb3VwKCJuYXZpZ2F0aW9uIiwgZlByZXZpb3VzSXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJVXRpbGl0aWVzLnJlZ2lzdGVyQWN0aW9uKGZLZXlCaW5kaW5nU2VydmljZSwgYSwgIm9yZy5lY2xpcHNlLmNvbXBhcmUuc2VsZWN0UHJldmlvdXNDaGFuZ2UiKTsJLy8kTk9OLU5MUy0xJAotCi0JCQotCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYz0gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCWlmIChjYy5pc1JpZ2h0RWRpdGFibGUoKSkgewotCQkJYT0gbmV3IEFjdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWNvcHlEaWZmTGVmdFRvUmlnaHQoKTsKLQkJCQl9Ci0JCQl9OwotCQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oYSwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgImFjdGlvbi5Db3B5RGlmZkxlZnRUb1JpZ2h0LiIpOyAvLyROT04tTkxTLTEkCi0JCQlmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGEpOwotCQkJZkNvcHlEaWZmTGVmdFRvUmlnaHRJdGVtLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl0Ym0uYXBwZW5kVG9Hcm91cCgibWVyZ2UiLCBmQ29weURpZmZMZWZ0VG9SaWdodEl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCQlVdGlsaXRpZXMucmVnaXN0ZXJBY3Rpb24oZktleUJpbmRpbmdTZXJ2aWNlLCBhLCAib3JnLmVjbGlwc2UuY29tcGFyZS5jb3B5TGVmdFRvUmlnaHQiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAoY2MuaXNMZWZ0RWRpdGFibGUoKSkgewotCQkJYT0gbmV3IEFjdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWNvcHlEaWZmUmlnaHRUb0xlZnQoKTsKLQkJCQl9Ci0JCQl9OwotCQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oYSwgZ2V0UmVzb3VyY2VCdW5kbGUoKSwgImFjdGlvbi5Db3B5RGlmZlJpZ2h0VG9MZWZ0LiIpOyAvLyROT04tTkxTLTEkCi0JCQlmQ29weURpZmZSaWdodFRvTGVmdEl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGEpOwotCQkJZkNvcHlEaWZmUmlnaHRUb0xlZnRJdGVtLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl0Ym0uYXBwZW5kVG9Hcm91cCgibWVyZ2UiLCBmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCQlVdGlsaXRpZXMucmVnaXN0ZXJBY3Rpb24oZktleUJpbmRpbmdTZXJ2aWNlLCBhLCAib3JnLmVjbGlwc2UuY29tcGFyZS5jb3B5UmlnaHRUb0xlZnQiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQotCQlTdHJpbmcga2V5PSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkKLQkJaWYgKGtleS5lcXVhbHMoQ29tcGFyZUNvbmZpZ3VyYXRpb24uSUdOT1JFX1dISVRFU1BBQ0UpCi0JCQkJfHwga2V5LmVxdWFscyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuU0hPV19QU0VVRE9fQ09ORkxJQ1RTKSkgewotCQkJCQkKLQkJCWZTaG93UHNldWRvQ29uZmxpY3RzPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tcGFyZVByZWZlcmVuY2VQYWdlLlNIT1dfUFNFVURPX0NPTkZMSUNUUyk7Ci0JCQkKLQkJCS8vIGNsZWFyIHN0dWZmCi0JCQlmQ3VycmVudERpZmY9IG51bGw7Ci0JCSAJZkNoYW5nZURpZmZzPSBudWxsOwotCQkJZkFsbERpZmZzPSBudWxsOwotCQkJCQkKLQkJCWRvRGlmZigpOwotCQkJCQkKLQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQlpbnZhbGlkYXRlTGluZXMoKTsKLQkJCXVwZGF0ZVZTY3JvbGxCYXIoKTsKLQkJCXJlZnJlc2hCaXJkc0V5ZVZpZXcoKTsKLQkJCQotCQkJc2VsZWN0Rmlyc3REaWZmKCk7Ci0JCQkKLS8vCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ29tcGFyZVByZWZlcmVuY2VQYWdlLlVTRV9TUExJTkVTKSkgewotLy8JCQlmVXNlU3BsaW5lcz0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5VU0VfU1BMSU5FUyk7Ci0vLwkJCWludmFsaWRhdGVMaW5lcygpOwotCi0JCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1NJTkdMRV9MSU5FKSkgewotCQkJZlVzZVNpbmdsZUxpbmU9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1NJTkdMRV9MSU5FKTsKLS8vCQkJZlVzZVJlc29sdmVVST0gZlVzZVNpbmdsZUxpbmU7Ci0JCQlmQmFzaWNDZW50ZXJDdXJ2ZT0gbnVsbDsKLQkJCXVwZGF0ZVJlc29sdmVTdGF0dXMoKTsKLQkJCWludmFsaWRhdGVMaW5lcygpOwotCQotLy8JCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1JFU09MVkVfVUkpKSB7Ci0vLwkJCWZVc2VSZXNvbHZlVUk9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuVVNFX1JFU09MVkVfVUkpOwotLy8JCQl1cGRhdGVSZXNvbHZlU3RhdHVzKCk7Ci0vLwkJCWludmFsaWRhdGVMaW5lcygpOwotCQkKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKGZTeW1ib2xpY0ZvbnROYW1lKSkgewotCQkJdXBkYXRlRm9udCgpOwotCQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0KLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKElOQ09NSU5HX0NPTE9SKSB8fCBrZXkuZXF1YWxzKE9VVEdPSU5HX0NPTE9SKSB8fCBrZXkuZXF1YWxzKENPTkZMSUNUSU5HX0NPTE9SKSB8fCBrZXkuZXF1YWxzKFJFU09MVkVEX0NPTE9SKSkgewotCQkJdXBkYXRlQ29sb3JzKG51bGwpOwotCQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCQkKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TWU5DSFJPTklaRV9TQ1JPTExJTkcpKSB7Ci0JCQkKLQkJCWJvb2xlYW4gYj0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TWU5DSFJPTklaRV9TQ1JPTExJTkcpOwotCQkJaWYgKGIgIT0gZlN5bmNocm9uaXplZFNjcm9sbGluZykKLQkJCQl0b2dnbGVTeW5jaE1vZGUoKTsKLQkJCi0JCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuU0hPV19NT1JFX0lORk8pKSB7Ci0JCQkKLQkJCWJvb2xlYW4gYj0gZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKENvbXBhcmVQcmVmZXJlbmNlUGFnZS5TSE9XX01PUkVfSU5GTyk7Ci0JCQlpZiAoYiAhPSBmU2hvd01vcmVJbmZvKSB7Ci0JCQkJZlNob3dNb3JlSW5mbz0gYjsKLQkJCQlpZiAoZlNob3dNb3JlSW5mbykKLQkJCQkJdXBkYXRlU3RhdHVzKGZDdXJyZW50RGlmZik7Ci0JCQkJZWxzZQotCQkJCQljbGVhclN0YXR1cygpOwotCQkJfQotCQkKLQkJfSBlbHNlCi0JCQlzdXBlci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRJZ25vcmVBbmNlc3Rvcihib29sZWFuIGlnbm9yZSkgewotCQlpZiAoaWdub3JlICE9IGZJZ25vcmVBbmNlc3RvcikgewotCQkJZklnbm9yZUFuY2VzdG9yPSBpZ25vcmU7Ci0JCQlzZXRBbmNlc3RvclZpc2liaWxpdHkoZmFsc2UsICFmSWdub3JlQW5jZXN0b3IpOwotCQkKLQkJCS8vIGNsZWFyIHN0dWZmCi0JCQlmQ3VycmVudERpZmY9IG51bGw7Ci0JCSAJZkNoYW5nZURpZmZzPSBudWxsOwotCQkJZkFsbERpZmZzPSBudWxsOwotCQkJCQkKLQkJCWRvRGlmZigpOwotCQkJCQkKLQkJCWludmFsaWRhdGVMaW5lcygpOwotCQkJdXBkYXRlVlNjcm9sbEJhcigpOwotCQkJcmVmcmVzaEJpcmRzRXllVmlldygpOwotCQkJCi0JCQlzZWxlY3RGaXJzdERpZmYoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0Rmlyc3REaWZmKCkgewotCQkKLQkJaWYgKGZMZWZ0ID09IG51bGwgfHwgZlJpZ2h0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkxlZnQuZ2V0RG9jdW1lbnQoKSA9PSBudWxsIHx8IGZSaWdodC5nZXREb2N1bWVudCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRGlmZiBmaXJzdERpZmY9IG51bGw7Ci0JCWlmIChDb21wYXJlTmF2aWdhdG9yLmdldERpcmVjdGlvbihmQ29tcG9zaXRlKSkKLQkJCWZpcnN0RGlmZj0gZmluZE5leHQoZlJpZ2h0LCBmQ2hhbmdlRGlmZnMsIC0xLCAtMSwgZmFsc2UpOwotCQllbHNlCi0JCQlmaXJzdERpZmY9IGZpbmRQcmV2KGZSaWdodCwgZkNoYW5nZURpZmZzLCA5OTk5OTk5LCA5OTk5OTk5LCBmYWxzZSk7Ci0JCXNldEN1cnJlbnREaWZmKGZpcnN0RGlmZiwgdHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0b2dnbGVTeW5jaE1vZGUoKSB7Ci0JCWZTeW5jaHJvbml6ZWRTY3JvbGxpbmc9ICEgZlN5bmNocm9uaXplZFNjcm9sbGluZzsKLQkJCi0JCXNjcm9sbFZlcnRpY2FsKDAsIDAsIDAsIG51bGwpOwotCQkKLQkJLy8gdGhyb3cgYXdheSBjZW50cmFsIGNvbnRyb2wgKFNhc2ggb3IgQ2FudmFzKQotCQlDb250cm9sIGNlbnRlcj0gZ2V0Q2VudGVyKCk7Ci0JCWlmIChjZW50ZXIgIT0gbnVsbCAmJiAhY2VudGVyLmlzRGlzcG9zZWQoKSkKLQkJCWNlbnRlci5kaXNwb3NlKCk7Ci0JCQotCQlmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuZ2V0VmVydGljYWxCYXIoKS5zZXRWaXNpYmxlKCFmU3luY2hyb25pemVkU2Nyb2xsaW5nKTsKLQkJZlJpZ2h0LmdldFRleHRXaWRnZXQoKS5nZXRWZXJ0aWNhbEJhcigpLnNldFZpc2libGUoIWZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpOwotCi0JCWZDb21wb3NpdGUubGF5b3V0KHRydWUpOwotCX0KLQkJCQkJCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVG9vbEl0ZW1zKCkgewotCQkJCQkKLQkJaWYgKGZJZ25vcmVBbmNlc3Rvckl0ZW0gIT0gbnVsbCkKLQkJCWZJZ25vcmVBbmNlc3Rvckl0ZW0uc2V0VmlzaWJsZShpc1RocmVlV2F5KCkpOwotCQkKLQkJaWYgKGZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbSAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGE9IGZDb3B5RGlmZkxlZnRUb1JpZ2h0SXRlbS5nZXRBY3Rpb24oKTsKLQkJCWlmIChhICE9IG51bGwpCi0JCQkJYS5zZXRFbmFibGVkKGEuaXNFbmFibGVkKCkgJiYgIWZIYXNFcnJvcnMpOwotCQl9Ci0JCWlmIChmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0gIT0gbnVsbCkgewotCQkJSUFjdGlvbiBhPSBmQ29weURpZmZSaWdodFRvTGVmdEl0ZW0uZ2V0QWN0aW9uKCk7Ci0JCQlpZiAoYSAhPSBudWxsKQotCQkJCWEuc2V0RW5hYmxlZChhLmlzRW5hYmxlZCgpICYmICFmSGFzRXJyb3JzKTsKLQkJfQotCQkKLQkJc3VwZXIudXBkYXRlVG9vbEl0ZW1zKCk7Ci0JfQotCQotCS8vLS0tLSBwYWludGluZyBsaW5lcwotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVMaW5lcyhJRG9jdW1lbnQgZCkgewotCi0JCWJvb2xlYW4gbGVmdD0gZmFsc2U7Ci0JCWJvb2xlYW4gcmlnaHQ9IGZhbHNlOwotCQkKLQkJLy8gRklYTUU6IHRoaXMgb3B0aW1pemF0aW9uIGlzIGluY29ycmVjdCBiZWNhdXNlCi0JCS8vIGl0IGRvZXNuJ3QgdGFrZSByZXBsYWNlIG9wZXJhdGlvbnMgaW50byBhY2NvdW50IHdoZXJlCi0JCS8vIHRoZSBvbGQgYW5kIG5ldyBsaW5lIGNvdW50IGRvZXMgbm90IGRpZmZlcgotCQlpZiAoZCA9PSBmTGVmdC5nZXREb2N1bWVudCgpKSB7Ci0JCQlpbnQgbD0gZkxlZnQuZ2V0TGluZUNvdW50KCk7Ci0JCQlsZWZ0PSBmTGVmdExpbmVDb3VudCAhPSBsOwotCQkJZkxlZnRMaW5lQ291bnQ9IGw7Ci0JCX0gZWxzZSBpZiAoZCA9PSBmUmlnaHQuZ2V0RG9jdW1lbnQoKSkgewotCQkJaW50IGw9IGZSaWdodC5nZXRMaW5lQ291bnQoKTsKLQkJCXJpZ2h0PSBmUmlnaHRMaW5lQ291bnQgIT0gbDsKLQkJCWZSaWdodExpbmVDb3VudD0gbDsKLQkJfQotCQkKLQkJaWYgKGxlZnQgfHwgcmlnaHQpIHsKLQkJCQotCQkJaWYgKGxlZnQpIHsKLQkJCQlpZiAoZkxlZnRDYW52YXMgIT0gbnVsbCkKLQkJCQkJZkxlZnRDYW52YXMucmVkcmF3KCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmUmlnaHRDYW52YXMgIT0gbnVsbCkKLQkJCQkJZlJpZ2h0Q2FudmFzLnJlZHJhdygpOwotCQkJfQotCQkJQ29udHJvbCBjZW50ZXI9IGdldENlbnRlcigpOwotCQkJaWYgKGNlbnRlciAhPSBudWxsKQotCQkJCWNlbnRlci5yZWRyYXcoKTsKLQotCQkJdXBkYXRlVlNjcm9sbEJhcigpOwotCQkJcmVmcmVzaEJpcmRzRXllVmlldygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbnZhbGlkYXRlTGluZXMoKSB7Ci0JCWlmIChpc1RocmVlV2F5KCkpIHsKLQkJCWlmIChVdGlsaXRpZXMub2tUb1VzZShmQW5jZXN0b3JDYW52YXMpKQotCQkJCWZBbmNlc3RvckNhbnZhcy5yZWRyYXcoKTsKLQkJCWlmIChmQW5jZXN0b3IgIT0gbnVsbCAmJiBmQW5jZXN0b3IuaXNDb250cm9sT2tUb1VzZSgpKQotCQkJCWZBbmNlc3Rvci5nZXRUZXh0V2lkZ2V0KCkucmVkcmF3KCk7Ci0JCX0KLQkJCi0JCWlmIChVdGlsaXRpZXMub2tUb1VzZShmTGVmdENhbnZhcykpCi0JCQlmTGVmdENhbnZhcy5yZWRyYXcoKTsKLQkJCQotCQlpZiAoZkxlZnQgIT0gbnVsbCAmJiBmTGVmdC5pc0NvbnRyb2xPa1RvVXNlKCkpCi0JCQlmTGVmdC5nZXRUZXh0V2lkZ2V0KCkucmVkcmF3KCk7Ci0JCQkKLQkJaWYgKFV0aWxpdGllcy5va1RvVXNlKGdldENlbnRlcigpKSkKLQkJCWdldENlbnRlcigpLnJlZHJhdygpOwotCQkJCi0JCWlmIChmUmlnaHQgIT0gbnVsbCAmJiBmUmlnaHQuaXNDb250cm9sT2tUb1VzZSgpKQotCQkJZlJpZ2h0LmdldFRleHRXaWRnZXQoKS5yZWRyYXcoKTsKLQkJCQotCQlpZiAoVXRpbGl0aWVzLm9rVG9Vc2UoZlJpZ2h0Q2FudmFzKSkKLQkJCWZSaWdodENhbnZhcy5yZWRyYXcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3dSZXNvbHZlVUkoKSB7Ci0JCWlmICghZlVzZVJlc29sdmVVSSB8fCAhaXNUaHJlZVdheSgpIHx8IGZJZ25vcmVBbmNlc3RvcikKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2M9IGdldENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjYyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyB3ZSBvbmx5IGVuYWJsZSB0aGUgbmV3IHJlc29sdmUgdWkgaWYgZXhhY3RseSBvbmUgc2lkZSBpcyBlZGl0YWJsZQotCQlib29sZWFuIGw9IGNjLmlzTGVmdEVkaXRhYmxlKCk7Ci0JCWJvb2xlYW4gcj0gY2MuaXNSaWdodEVkaXRhYmxlKCk7Ci0JCS8vcmV0dXJuIChsICYmICFyKSB8fCAociAmJiAhbCk7Ci0JCXJldHVybiBsIHx8IHI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYWludENlbnRlcihDYW52YXMgY2FudmFzLCBHQyBnKSB7Ci0JCQotCQlEaXNwbGF5IGRpc3BsYXk9IGNhbnZhcy5nZXREaXNwbGF5KCk7Ci0JCQotCQljaGVja0ZvckNvbG9yVXBkYXRlKGRpc3BsYXkpOwotCQkKLQkJaWYgKCEgZlN5bmNocm9uaXplZFNjcm9sbGluZykKLQkJCXJldHVybjsKLQotCQlpbnQgbGluZUhlaWdodD0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmdldExpbmVIZWlnaHQoKTsJCQkKLQkJaW50IHZpc2libGVIZWlnaHQ9IGZSaWdodC5nZXRWaWV3cG9ydEhlaWdodCgpOwotCi0JCVBvaW50IHNpemU9IGNhbnZhcy5nZXRTaXplKCk7Ci0JCWludCB4PSAwOwotCQlpbnQgdz0gc2l6ZS54OwotCQkJCQotCQlnLnNldEJhY2tncm91bmQoY2FudmFzLmdldEJhY2tncm91bmQoKSk7Ci0JCWcuZmlsbFJlY3RhbmdsZSh4KzEsIDAsIHctMiwgc2l6ZS55KTsKLQkJCi0JCWlmICghZklzTW90aWYpIHsKLQkJCS8vIGRyYXcgdGhpbiBsaW5lIGJldHdlZW4gY2VudGVyIHJ1bGVyIGFuZCBib3RoIHRleHRzCi0JCQlnLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpKTsKLQkJCWcuZmlsbFJlY3RhbmdsZSgwLCAwLCAxLCBzaXplLnkpOwotCQkJZy5maWxsUmVjdGFuZ2xlKHctMSwgMCwgMSwgc2l6ZS55KTsKLQkJfQotCQkJCi0JCWlmICghIGZIaWdobGlnaHRSYW5nZXMpCi0JCQlyZXR1cm47Ci0KLQkJYm9vbGVhbiBzaG93UmVzb2x2ZVVJPSBzaG93UmVzb2x2ZVVJKCk7Ci0KLQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQlpbnQgbHNoaWZ0PSBmTGVmdC5nZXRWZXJ0aWNhbFNjcm9sbE9mZnNldCgpOwotCQkJaW50IHJzaGlmdD0gZlJpZ2h0LmdldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KCk7Ci0JCQkJCQotCQkJUG9pbnQgcmVnaW9uPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQotCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQlpZiAoZGlmZi5pc0RlbGV0ZWQoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJaWYgKGZTaG93Q3VycmVudE9ubHkyICYmICFpc0N1cnJlbnREaWZmKGRpZmYpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWZMZWZ0LmdldExpbmVSYW5nZShkaWZmLmZMZWZ0UG9zLCByZWdpb24pOwotCQkJCWludCBseT0gKHJlZ2lvbi54ICogbGluZUhlaWdodCkgKyBsc2hpZnQ7Ci0JCQkJaW50IGxoPSByZWdpb24ueSAqIGxpbmVIZWlnaHQ7Ci0JCi0JCQkJZlJpZ2h0LmdldExpbmVSYW5nZShkaWZmLmZSaWdodFBvcywgcmVnaW9uKTsKLQkJCQlpbnQgcnk9IChyZWdpb24ueCAqIGxpbmVIZWlnaHQpICsgcnNoaWZ0OwotCQkJCWludCByaD0gcmVnaW9uLnkgKiBsaW5lSGVpZ2h0OwotCQotCQkJCWlmIChNYXRoLm1heChseStsaCwgcnkrcmgpIDwgMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKE1hdGgubWluKGx5LCByeSkgPj0gdmlzaWJsZUhlaWdodCkKLQkJCQkJYnJlYWs7Ci0JCi0JCQkJZlB0c1swXT0geDsJZlB0c1sxXT0gbHk7CWZQdHNbMl09IHc7CWZQdHNbM109IHJ5OwotCQkJCWZQdHNbNl09IHg7CWZQdHNbN109IGx5K2xoOwlmUHRzWzRdPSB3OwlmUHRzWzVdPSByeStyaDsKLQkJCQkKLQkJCQlDb2xvciBmaWxsQ29sb3I9IGdldENvbG9yKGRpc3BsYXksIGdldEZpbGxDb2xvcihkaWZmKSk7Ci0JCQkJQ29sb3Igc3Ryb2tlQ29sb3I9IGdldENvbG9yKGRpc3BsYXksIGdldFN0cm9rZUNvbG9yKGRpZmYpKTsKLQkJCQkKLQkJCQlpZiAoZlVzZVNpbmdsZUxpbmUpIHsKLQkJCQkJaW50IHcyPSAzOwotCi0JCQkJCWcuc2V0QmFja2dyb3VuZChmaWxsQ29sb3IpOwotCQkJCQlnLmZpbGxSZWN0YW5nbGUoMCwgbHksIHcyLCBsaCk7CQkvLyBsZWZ0Ci0JCQkJCWcuZmlsbFJlY3RhbmdsZSh3LXcyLCByeSwgdzIsIHJoKTsJLy8gcmlnaHQKLQotCQkJCQlnLnNldExpbmVXaWR0aChMVyk7Ci0JCQkJCWcuc2V0Rm9yZWdyb3VuZChzdHJva2VDb2xvcik7Ci0JCQkJCWcuZHJhd1JlY3RhbmdsZSgwLTEsIGx5LCB3MiwgbGgpOwkvLyBsZWZ0Ci0JCQkJCWcuZHJhd1JlY3RhbmdsZSh3LXcyLCByeSwgdzIsIHJoKTsJLy8gcmlnaHQKLQotCQkJCQlpZiAoZlVzZVNwbGluZXMpIHsKLQkJCQkJCWludFtdIHBvaW50cz0gZ2V0Q2VudGVyQ3VydmVQb2ludHModzIsIGx5K2xoLzIsIHctdzIsIHJ5K3JoLzIpOwotCQkJCQkJZm9yIChpbnQgaT0gMTsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykKLQkJCQkJCQlnLmRyYXdMaW5lKHcyK2ktMSwgcG9pbnRzW2ktMV0sIHcyK2ksIHBvaW50c1tpXSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlnLmRyYXdMaW5lKHcyLCBseStsaC8yLCB3LXcyLCByeStyaC8yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHR3byBsaW5lcwotCQkJCQlpZiAoZlVzZVNwbGluZXMpIHsKLQkJCQkJCWcuc2V0QmFja2dyb3VuZChmaWxsQ29sb3IpOwotCi0JCQkJCQlnLnNldExpbmVXaWR0aChMVyk7Ci0JCQkJCQlnLnNldEZvcmVncm91bmQoc3Ryb2tlQ29sb3IpOwotCi0JCQkJCQlpbnRbXSB0b3BQb2ludHM9IGdldENlbnRlckN1cnZlUG9pbnRzKGZQdHNbMF0sIGZQdHNbMV0sIGZQdHNbMl0sIGZQdHNbM10pOwotCQkJCQkJaW50W10gYm90dG9tUG9pbnRzPSBnZXRDZW50ZXJDdXJ2ZVBvaW50cyhmUHRzWzZdLCBmUHRzWzddLCBmUHRzWzRdLCBmUHRzWzVdKTsKLQkJCQkJCWcuc2V0Rm9yZWdyb3VuZChmaWxsQ29sb3IpOwotCQkJCQkJZy5kcmF3TGluZSgwLCBib3R0b21Qb2ludHNbMF0sIDAsIHRvcFBvaW50c1swXSk7Ci0JCQkJCQlmb3IgKGludCBpPSAxOyBpIDwgYm90dG9tUG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJZy5zZXRGb3JlZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCQkJCQkJZy5kcmF3TGluZShpLCBib3R0b21Qb2ludHNbaV0sIGksIHRvcFBvaW50c1tpXSk7Ci0JCQkJCQkJZy5zZXRGb3JlZ3JvdW5kKHN0cm9rZUNvbG9yKTsKLQkJCQkJCQlnLmRyYXdMaW5lKGktMSwgdG9wUG9pbnRzW2ktMV0sIGksIHRvcFBvaW50c1tpXSk7Ci0JCQkJCQkJZy5kcmF3TGluZShpLTEsIGJvdHRvbVBvaW50c1tpLTFdLCBpLCBib3R0b21Qb2ludHNbaV0pOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCQkJCQlnLmZpbGxQb2x5Z29uKGZQdHMpOwotCi0JCQkJCQlnLnNldExpbmVXaWR0aChMVyk7Ci0JCQkJCQlnLnNldEZvcmVncm91bmQoc3Ryb2tlQ29sb3IpOwotCQkJCQkJZy5kcmF3TGluZShmUHRzWzBdLCBmUHRzWzFdLCBmUHRzWzJdLCBmUHRzWzNdKTsKLQkJCQkJCWcuZHJhd0xpbmUoZlB0c1s2XSwgZlB0c1s3XSwgZlB0c1s0XSwgZlB0c1s1XSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGZVc2VTaW5nbGVMaW5lICYmIHNob3dSZXNvbHZlVUkgJiYgZGlmZi5pc1VucmVzb2x2ZWRJbmNvbWluZ09yQ29uZmxpY3RpbmcoKSkgewotCQkJCQkvLyBkcmF3IHJlc29sdmUgc3RhdGUKLQkJCQkJaW50IGN4PSAody1SRVNPTFZFX1NJWkUpLzI7Ci0JCQkJCWludCBjeT0gKChseStsaC8yKSArIChyeStyaC8yKSAtIFJFU09MVkVfU0laRSkvMjsKLQkJCQkJCi0JCQkJCWcuc2V0QmFja2dyb3VuZChmaWxsQ29sb3IpOwotCQkJCQlnLmZpbGxSZWN0YW5nbGUoY3gsIGN5LCBSRVNPTFZFX1NJWkUsIFJFU09MVkVfU0laRSk7Ci0JCQkJCQotCQkJCQlnLnNldEZvcmVncm91bmQoc3Ryb2tlQ29sb3IpOwotCQkJCQlnLmRyYXdSZWN0YW5nbGUoY3gsIGN5LCBSRVNPTFZFX1NJWkUsIFJFU09MVkVfU0laRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgaW50W10gZ2V0Q2VudGVyQ3VydmVQb2ludHMoaW50IHN0YXJ0eCwgaW50IHN0YXJ0eSwgaW50IGVuZHgsIGludCBlbmR5KSB7Ci0JCWlmIChmQmFzaWNDZW50ZXJDdXJ2ZSA9PSBudWxsKQotCQkJYnVpbGRCYXNlQ2VudGVyQ3VydmUoZW5keC1zdGFydHgpOwotCQlkb3VibGUgaGVpZ2h0PSBlbmR5IC0gc3RhcnR5OwotCQloZWlnaHQ9IGhlaWdodC8yOwotCQlpbnQgd2lkdGg9IGVuZHgtc3RhcnR4OwotCQlpbnRbXSBwb2ludHM9IG5ldyBpbnRbd2lkdGhdOwotCQlmb3IgKGludCBpPSAwOyBpIDwgd2lkdGg7IGkrKykgewotCQkJcG9pbnRzW2ldPSAoaW50KSAoLWhlaWdodCAqIGZCYXNpY0NlbnRlckN1cnZlW2ldICsgaGVpZ2h0ICsgc3RhcnR5KTsKLQkJfQotCQlyZXR1cm4gcG9pbnRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEJhc2VDZW50ZXJDdXJ2ZShpbnQgdykgewotCQlkb3VibGUgd2lkdGg9IHc7Ci0JCWZCYXNpY0NlbnRlckN1cnZlPSBuZXcgZG91YmxlW2dldENlbnRlcldpZHRoKCldOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZ2V0Q2VudGVyV2lkdGgoKTsgaSsrKSB7Ci0JCQlkb3VibGUgcj0gaSAvIHdpZHRoOwotCQkJZkJhc2ljQ2VudGVyQ3VydmVbaV09IE1hdGguY29zKE1hdGguUEkgKiByKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYWludFNpZGVzKEdDIGcsIE1lcmdlU291cmNlVmlld2VyIHRwLCBDYW52YXMgY2FudmFzLCBib29sZWFuIHJpZ2h0KSB7Ci0JCQotCQlEaXNwbGF5IGRpc3BsYXk9IGNhbnZhcy5nZXREaXNwbGF5KCk7Ci0JCQotCQlpbnQgbGluZUhlaWdodD0gdHAuZ2V0VGV4dFdpZGdldCgpLmdldExpbmVIZWlnaHQoKTsKLQkJaW50IHZpc2libGVIZWlnaHQ9IHRwLmdldFZpZXdwb3J0SGVpZ2h0KCk7Ci0KLQkJUG9pbnQgc2l6ZT0gY2FudmFzLmdldFNpemUoKTsKLQkJaW50IHg9IDA7Ci0JCWludCB3PSBmTWFyZ2luV2lkdGg7Ci0JCWludCB3Mj0gdy8yOwotCQkJCi0JCWcuc2V0QmFja2dyb3VuZChjYW52YXMuZ2V0QmFja2dyb3VuZCgpKTsKLQkJZy5maWxsUmVjdGFuZ2xlKHgsIDAsIHcsIHNpemUueSk7Ci0KLQkJaWYgKCFmSXNNb3RpZikgewotCQkJLy8gZHJhdyB0aGluIGxpbmUgYmV0d2VlbiBydWxlciBhbmQgdGV4dAotCQkJZy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKSk7Ci0JCQlpZiAocmlnaHQpCi0JCQkJZy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEsIHNpemUueSk7Ci0JCQllbHNlCi0JCQkJZy5maWxsUmVjdGFuZ2xlKHNpemUueC0xLCAwLCAxLCBzaXplLnkpOwotCQl9Ci0KLQkJaWYgKCEgZkhpZ2hsaWdodFJhbmdlcykKLQkJCXJldHVybjsKLQotCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwpIHsKLQkJCWludCBzaGlmdD0gdHAuZ2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKSArICgyLUxXKTsKLQkJCQkKLQkJCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCQkJSXRlcmF0b3IgZT0gZkNoYW5nZURpZmZzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCQlpZiAoZGlmZi5pc0RlbGV0ZWQoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJaWYgKGZTaG93Q3VycmVudE9ubHkyICYmICFpc0N1cnJlbnREaWZmKGRpZmYpKQotCQkJCQljb250aW51ZTsKLQotCQkJCXRwLmdldExpbmVSYW5nZShkaWZmLmdldFBvc2l0aW9uKHRwKSwgcmVnaW9uKTsJCi0JCQkJaW50IHk9IChyZWdpb24ueCAqIGxpbmVIZWlnaHQpICsgc2hpZnQ7Ci0JCQkJaW50IGg9IHJlZ2lvbi55ICogbGluZUhlaWdodDsKLQkKLQkJCQlpZiAoeStoIDwgMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHkgPj0gdmlzaWJsZUhlaWdodCkKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWcuc2V0QmFja2dyb3VuZChnZXRDb2xvcihkaXNwbGF5LCBnZXRGaWxsQ29sb3IoZGlmZikpKTsKLQkJCQlpZiAocmlnaHQpCi0JCQkJCWcuZmlsbFJlY3RhbmdsZSh4LCB5LCB3MiwgaCk7Ci0JCQkJZWxzZQotCQkJCQlnLmZpbGxSZWN0YW5nbGUoeCt3MiwgeSwgdzIsIGgpOwotCQotCQkJCWcuc2V0TGluZVdpZHRoKExXKTsKLQkJCQlnLnNldEZvcmVncm91bmQoZ2V0Q29sb3IoZGlzcGxheSwgZ2V0U3Ryb2tlQ29sb3IoZGlmZikpKTsKLQkJCQlpZiAocmlnaHQpCi0JCQkJCWcuZHJhd1JlY3RhbmdsZSh4LTEsIHktMSwgdzIsIGgpOwotCQkJCWVsc2UKLQkJCQkJZy5kcmF3UmVjdGFuZ2xlKHgrdzIsIHktMSwgdzIsIGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYWludChQYWludEV2ZW50IGV2ZW50LCBNZXJnZVNvdXJjZVZpZXdlciB0cCkgewotCQkKLQkJaWYgKCEgZkhpZ2hsaWdodFJhbmdlcykKLQkJCXJldHVybjsKLQkJaWYgKGZDaGFuZ2VEaWZmcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNvbnRyb2wgY2FudmFzPSAoQ29udHJvbCkgZXZlbnQud2lkZ2V0OwotCQlHQyBnPSBldmVudC5nYzsKLQkJCi0JCURpc3BsYXkgZGlzcGxheT0gY2FudmFzLmdldERpc3BsYXkoKTsKLQkJCi0JCWludCBsaW5lSGVpZ2h0PSB0cC5nZXRUZXh0V2lkZ2V0KCkuZ2V0TGluZUhlaWdodCgpOwkJCQotCQlpbnQgdz0gY2FudmFzLmdldFNpemUoKS54OwotCQlpbnQgc2hpZnQ9IHRwLmdldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KCkgKyAoMi1MVyk7Ci0JCWludCBtYXhoPSBldmVudC55K2V2ZW50LmhlaWdodDsgCS8vIHZpc2libGVIZWlnaHQKLQkJCi0JCS8vaWYgKGZJc01vdGlmKQotCQkJc2hpZnQrPSBmVG9wSW5zZXQ7Ci0JCQkJCi0JCVBvaW50IHJhbmdlPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCQkJCi0JCUl0ZXJhdG9yIGU9IGZDaGFuZ2VEaWZmcy5pdGVyYXRvcigpOwkKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlEaWZmIGRpZmY9IChEaWZmKSBlLm5leHQoKTsKLQkJCWlmIChkaWZmLmlzRGVsZXRlZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpZiAoZlNob3dDdXJyZW50T25seSAmJiAhaXNDdXJyZW50RGlmZihkaWZmKSkKLQkJCQljb250aW51ZTsKLQotCQkJdHAuZ2V0TGluZVJhbmdlKGRpZmYuZ2V0UG9zaXRpb24odHApLCByYW5nZSk7Ci0JCQlpbnQgeT0gKHJhbmdlLnggKiBsaW5lSGVpZ2h0KSArIHNoaWZ0OwotCQkJaW50IGg9IHJhbmdlLnkgKiBsaW5lSGVpZ2h0OwotCQkJCi0JCQlpZiAoeStoIDwgZXZlbnQueSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh5ID4gbWF4aCkKLQkJCQlicmVhazsKLQkJCQotCQkJZy5zZXRCYWNrZ3JvdW5kKGdldENvbG9yKGRpc3BsYXksIGdldFN0cm9rZUNvbG9yKGRpZmYpKSk7Ci0JCQlnLmZpbGxSZWN0YW5nbGUoMCwgeS0xLCB3LCBMVyk7Ci0JCQlnLmZpbGxSZWN0YW5nbGUoMCwgeStoLTEsIHcsIExXKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUkdCIGdldEZpbGxDb2xvcihEaWZmIGRpZmYpIHsKLQkJYm9vbGVhbiBzZWxlY3RlZD0gZkN1cnJlbnREaWZmICE9IG51bGwgJiYgZkN1cnJlbnREaWZmLmZQYXJlbnQgPT0gZGlmZjsKLQkJCi0JCVJHQiBzZWxlY3RlZF9maWxsPSBnZXRCYWNrZ3JvdW5kKG51bGwpOwotCi0JCWlmIChpc1RocmVlV2F5KCkgJiYgIWZJZ25vcmVBbmNlc3RvcikgewotCQkJc3dpdGNoIChkaWZmLmZEaXJlY3Rpb24pIHsKLQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotCQkJCWlmIChmTGVmdElzTG9jYWwpCi0JCQkJCXJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkX2ZpbGwgOiBJTkNPTUlOR19GSUxMOwotCQkJCXJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkX2ZpbGwgOiBPVVRHT0lOR19GSUxMOwotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQU5DRVNUT1I6Ci0JCQkJcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWRfZmlsbCA6IENPTkZMSUNUX0ZJTEw7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotCQkJCWlmIChmTGVmdElzTG9jYWwpCi0JCQkJCXJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkX2ZpbGwgOiBPVVRHT0lOR19GSUxMOwotCQkJCXJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkX2ZpbGwgOiBJTkNPTUlOR19GSUxMOwotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1Q6Ci0JCQkJcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWRfZmlsbCA6IENPTkZMSUNUX0ZJTEw7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQgPyBzZWxlY3RlZF9maWxsIDogT1VUR09JTkdfRklMTDsKLQl9Ci0JCi0JcHJpdmF0ZSBSR0IgZ2V0U3Ryb2tlQ29sb3IoRGlmZiBkaWZmKSB7Ci0JCWJvb2xlYW4gc2VsZWN0ZWQ9IGZDdXJyZW50RGlmZiAhPSBudWxsICYmIGZDdXJyZW50RGlmZi5mUGFyZW50ID09IGRpZmY7Ci0JCQotCQlpZiAoaXNUaHJlZVdheSgpICYmICFmSWdub3JlQW5jZXN0b3IpIHsKLQkJCXN3aXRjaCAoZGlmZi5mRGlyZWN0aW9uKSB7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLQkJCQlpZiAoZkxlZnRJc0xvY2FsKQotCQkJCQlyZXR1cm4gc2VsZWN0ZWQgPyBTRUxFQ1RFRF9JTkNPTUlORyA6IElOQ09NSU5HOwotCQkJCXJldHVybiBzZWxlY3RlZCA/IFNFTEVDVEVEX09VVEdPSU5HIDogT1VUR09JTkc7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5BTkNFU1RPUjoKLQkJCQlyZXR1cm4gc2VsZWN0ZWQgPyBTRUxFQ1RFRF9DT05GTElDVCA6IENPTkZMSUNUOwotCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuTEVGVDoKLQkJCQlpZiAoZkxlZnRJc0xvY2FsKQotCQkJCQlyZXR1cm4gc2VsZWN0ZWQgPyBTRUxFQ1RFRF9PVVRHT0lORyA6IE9VVEdPSU5HOwotCQkJCXJldHVybiBzZWxlY3RlZCA/IFNFTEVDVEVEX0lOQ09NSU5HIDogSU5DT01JTkc7Ci0JCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVDoKLQkJCQlyZXR1cm4gc2VsZWN0ZWQgPyBTRUxFQ1RFRF9DT05GTElDVCA6IENPTkZMSUNUOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkID8gU0VMRUNURURfT1VUR09JTkcgOiBPVVRHT0lORzsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xvciBnZXRDb2xvcihEaXNwbGF5IGRpc3BsYXksIFJHQiByZ2IpIHsKLQkJaWYgKHJnYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CQkKLQkJaWYgKGZDb2xvcnMgPT0gbnVsbCkKLQkJCWZDb2xvcnM9IG5ldyBIYXNoTWFwKDIwKTsKLQkJQ29sb3IgYz0gKENvbG9yKSBmQ29sb3JzLmdldChyZ2IpOwotCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQljPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJCWZDb2xvcnMucHV0KHJnYiwgYyk7Ci0JCX0KLQkJcmV0dXJuIGM7Ci0JfQotCQkJCi0Jc3RhdGljIFJHQiBpbnRlcnBvbGF0ZShSR0IgZmcsIFJHQiBiZywgZG91YmxlIHNjYWxlKSB7Ci0JCWlmIChmZyAhPSBudWxsICYmIGJnICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFJHQigKLQkJCQkoaW50KSgoMS4wLXNjYWxlKSAqIGZnLnJlZCArIHNjYWxlICogYmcucmVkKSwKLQkJCQkoaW50KSgoMS4wLXNjYWxlKSAqIGZnLmdyZWVuICsgc2NhbGUgKiBiZy5ncmVlbiksCi0JCQkJKGludCkoKDEuMC1zY2FsZSkgKiBmZy5ibHVlICsgc2NhbGUgKiBiZy5ibHVlKQotCQkJKTsKLQkJaWYgKGZnICE9IG51bGwpCi0JCQlyZXR1cm4gZmc7Ci0JCWlmIChiZyAhPSBudWxsKQotCQkJcmV0dXJuIGJnOwotCQlyZXR1cm4gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsJLy8gYSBncmF5Ci0JfQotCQotCS8vLS0tLSBOYXZpZ2F0aW5nIGFuZCByZXNvbHZpbmcgRGlmZnMKLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBlbmQgKG9yIGJlZ2lubmluZykgb2YgZG9jdW1lbnQgcmVhY2hlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbmF2aWdhdGUoYm9vbGVhbiBkb3duLCBib29sZWFuIHdyYXAsIGJvb2xlYW4gZGVlcCkgewotCi0JCURpZmYgZGlmZj0gbnVsbDsKLQkJCi0JCWZvciAoOzspIHsKLQkJCQotCQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQkJTWVyZ2VTb3VyY2VWaWV3ZXIgcGFydD0gZkZvY3VzUGFydDsKLQkJCQlpZiAocGFydCA9PSBudWxsKQotCQkJCQlwYXJ0PSBmUmlnaHQ7Ci0JCQkJCi0JCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQlQb2ludCBzPSBwYXJ0LmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCQkJaWYgKGRvd24pCi0JCQkJCQlkaWZmPSBmaW5kTmV4dChwYXJ0LCBmQ2hhbmdlRGlmZnMsIHMueCwgcy54K3MueSwgZGVlcCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWRpZmY9IGZpbmRQcmV2KHBhcnQsIGZDaGFuZ2VEaWZmcywgcy54LCBzLngrcy55LCBkZWVwKTsJCQkJCQotCQkJCX0JCQotCQkJfQotCQkKLQkJCWlmIChkaWZmID09IG51bGwpIHsJLy8gYXQgZW5kIG9yIGJlZ2lubmluZwotCQkJCWlmICh3cmFwKSB7Ci0JCQkJCWlmICghZkVuZE9mRG9jUmVhY2hlZCkgewotCQkJCQkJZkVuZE9mRG9jUmVhY2hlZD0gdHJ1ZTsKLQkJCQkJCWlmICghIGVuZE9mRG9jdW1lbnRSZWFjaGVkKGRvd24pKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWZFbmRPZkRvY1JlYWNoZWQ9IGZhbHNlOwotCQkJCQlpZiAoZkNoYW5nZURpZmZzICE9IG51bGwgJiYgZkNoYW5nZURpZmZzLnNpemUoKSA+IDApIHsKLQkJCQkJCWlmIChkb3duKQotCQkJCQkJCWRpZmY9IChEaWZmKSBmQ2hhbmdlRGlmZnMuZ2V0KDApOwotCQkJCQkJZWxzZQotCQkJCQkJCWRpZmY9IChEaWZmKSBmQ2hhbmdlRGlmZnMuZ2V0KGZDaGFuZ2VEaWZmcy5zaXplKCktMSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmRW5kT2ZEb2NSZWFjaGVkPSBmYWxzZTsJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJc2V0Q3VycmVudERpZmYoZGlmZiwgdHJ1ZSk7Ci0JCQkKLQkJCWlmIChkaWZmICE9IG51bGwgJiYgZGlmZi5mRGlyZWN0aW9uID09IFJhbmdlRGlmZmVyZW5jZS5BTkNFU1RPUgotCQkJCQkJCQkJJiYgIWdldEFuY2VzdG9yRW5hYmxlZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBlbmRPZkRvY3VtZW50UmVhY2hlZChib29sZWFuIGRvd24pIHsKLQkJQ29udHJvbCBjPSBnZXRDb250cm9sKCk7Ci0JCWlmIChVdGlsaXRpZXMub2tUb1VzZShjKSkgewotCQkJCi0JCQljLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JCQkKLQkJCVN0cmluZyBrZXk9IGRvd24gPyAiYXRFbmQiIDogImF0QmVnaW5uaW5nIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oYy5nZXRTaGVsbCgpLAotCQkJCUNvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci4iK2tleSsiLnRpdGxlIiksCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUNvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRNZXJnZVZpZXdlci4iK2tleSsiLm1lc3NhZ2UiKSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBGaW5kIHRoZSBEaWZmIHRoYXQgb3ZlcmxhcHMgd2l0aCB0aGUgZ2l2ZW4gVGV4dFBhcnQncyB0ZXh0IHJhbmdlLgotCSAqIElmIHRoZSByYW5nZSBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgcmFuZ2UgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIERpZmYgZmluZERpZmYoTWVyZ2VTb3VyY2VWaWV3ZXIgdHAsIGludCByYW5nZVN0YXJ0LCBpbnQgcmFuZ2VFbmQpIHsKLQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlPSBmQ2hhbmdlRGlmZnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWlmIChkaWZmLm92ZXJsYXBzKHRwLCByYW5nZVN0YXJ0LCByYW5nZUVuZCkpCi0JCQkJCXJldHVybiBkaWZmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEaWZmIGZpbmROZXh0KE1lcmdlU291cmNlVmlld2VyIHRwLCBMaXN0IHYsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7Ci0JCQlEaWZmIGRpZmY9IChEaWZmKSB2LmdldChpKTsKLQkJCVBvc2l0aW9uIHA9IGRpZmYuZ2V0UG9zaXRpb24odHApOwotCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCWludCBzdGFydE9mZnNldD0gcC5nZXRPZmZzZXQoKTsKLQkJCQlpZiAoZW5kIDwgc3RhcnRPZmZzZXQpICAvLyA8PQotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQlpZiAoZGVlcCAmJiBkaWZmLmZEaWZmcyAhPSBudWxsKSB7Ci0JCQkJCURpZmYgZD0gbnVsbDsKLQkJCQkJaW50IGVuZE9mZnNldD0gc3RhcnRPZmZzZXQgKyBwLmdldExlbmd0aCgpOwotCQkJCQlpZiAoc3RhcnQgPT0gc3RhcnRPZmZzZXQgJiYgKGVuZCA9PSBlbmRPZmZzZXQgfHwgZW5kID09IGVuZE9mZnNldC0xKSkgewotCQkJCQkJZD0gZmluZE5leHQodHAsIGRpZmYuZkRpZmZzLCBzdGFydC0xLCBzdGFydC0xLCBkZWVwKTsKLQkJCQkJfSBlbHNlIGlmIChlbmQgPCBlbmRPZmZzZXQpIHsKLQkJCQkJCWQ9IGZpbmROZXh0KHRwLCBkaWZmLmZEaWZmcywgc3RhcnQsIGVuZCwgZGVlcCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGlmZiBmaW5kUHJldihNZXJnZVNvdXJjZVZpZXdlciB0cCwgTGlzdCB2LCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gZGVlcCkgewotCQlmb3IgKGludCBpPSB2LnNpemUoKS0xOyBpID49IDA7IGktLSkgewotCQkJRGlmZiBkaWZmPSAoRGlmZikgdi5nZXQoaSk7Ci0JCQlQb3NpdGlvbiBwPSBkaWZmLmdldFBvc2l0aW9uKHRwKTsKLQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQ9IHAuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZE9mZnNldD0gc3RhcnRPZmZzZXQgKyBwLmdldExlbmd0aCgpOwotCQkJCWlmIChzdGFydCA+IGVuZE9mZnNldCkKLQkJCQkJcmV0dXJuIGRpZmY7Ci0JCQkJaWYgKGRlZXAgJiYgZGlmZi5mRGlmZnMgIT0gbnVsbCkgewotCQkJCQlEaWZmIGQ9IG51bGw7Ci0JCQkJCWlmIChzdGFydCA9PSBzdGFydE9mZnNldCAmJiBlbmQgPT0gZW5kT2Zmc2V0KSB7Ci0JCQkJCQlkPSBmaW5kUHJldih0cCwgZGlmZi5mRGlmZnMsIGVuZCwgZW5kLCBkZWVwKTsKLQkJCQkJfSBlbHNlIGlmIChzdGFydCA+PSBzdGFydE9mZnNldCkgewotCQkJCQkJZD0gZmluZFByZXYodHAsIGRpZmYuZkRpZmZzLCBzdGFydCwgZW5kLCBkZWVwKTsKLQkJCQkJfQotCQkJCQlpZiAoZCAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JLyoKLQkgKiBTZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgRGlmZiBhbmQgdXBkYXRlIHRoZSB0b29sYmFycyBjb250cm9scyBhbmQgbGluZXMuCi0JICogSWYgPGNvZGU+cmV2ZWFsQW5kU2VsZWN0PC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGUgRGlmZiBpcyByZXZlYWxlZCBhbmQKLQkgKiBzZWxlY3RlZCBpbiBib3RoIFRleHRQYXJ0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudERpZmYoRGlmZiBkLCBib29sZWFuIHJldmVhbEFuZFNlbGVjdCkgewotCi0vLwkJaWYgKGQgPT0gZkN1cnJlbnREaWZmKQotLy8JCQlyZXR1cm47Ci0KLQkJaWYgKGZDZW50ZXJCdXR0b24gIT0gbnVsbCkKLQkJCWZDZW50ZXJCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkKLQkJZkVuZE9mRG9jUmVhY2hlZD0gZmFsc2U7CQotCi0JCURpZmYgb2xkRGlmZj0gZkN1cnJlbnREaWZmOwotCQkJCQkKLQkJaWYgKGQgIT0gbnVsbCAmJiByZXZlYWxBbmRTZWxlY3QpIHsKLQkJCQotCQkJLy8gYmVmb3JlIHdlIHNldCBmQ3VycmVudERpZmYgd2UgY2hhbmdlIHRoZSBzZWxlY3Rpb24KLQkJCS8vIHNvIHRoYXQgdGhlIHBhaW50IGNvZGUgdXNlcyB0aGUgb2xkIGJhY2tncm91bmQgY29sb3JzCi0JCQkvLyBvdGhlcndpc2Ugc2VsZWN0aW9uIGlzbid0IGRyYXduIGNvcnJlY3RseQotCQkJaWYgKGlzVGhyZWVXYXkoKSAmJiAhZklnbm9yZUFuY2VzdG9yKQotCQkJCWZBbmNlc3Rvci5zZXRTZWxlY3Rpb24oZC5mQW5jZXN0b3JQb3MpOwotCQkJZkxlZnQuc2V0U2VsZWN0aW9uKGQuZkxlZnRQb3MpOwotCQkJZlJpZ2h0LnNldFNlbGVjdGlvbihkLmZSaWdodFBvcyk7Ci0JCQkKLQkJCS8vIG5vdyBzd2l0Y2ggZGlmZnMKLQkJCWZDdXJyZW50RGlmZj0gZDsKLQkJCXJldmVhbERpZmYoZCwgZC5mSXNUb2tlbik7Ci0JCX0gZWxzZSB7Ci0JCQlmQ3VycmVudERpZmY9IGQ7Ci0JCX0KLQkJCi0JCURpZmYgZDE9IG9sZERpZmYgIT0gbnVsbCA/IG9sZERpZmYuZlBhcmVudCA6IG51bGw7Ci0JCURpZmYgZDI9IGZDdXJyZW50RGlmZiAhPSBudWxsID8gZkN1cnJlbnREaWZmLmZQYXJlbnQgOiBudWxsOwotCQlpZiAoZDEgIT0gZDIpIHsKLQkJCXVwZGF0ZURpZmZCYWNrZ3JvdW5kKGQxKTsKLQkJCXVwZGF0ZURpZmZCYWNrZ3JvdW5kKGQyKTsKLQkJfQotCQkKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCXJlZnJlc2hCaXJkc0V5ZVZpZXcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBTbWFydCBkZXRlcm1pbmVzIHdoZXRoZXIgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJldmVhbERpZmYoRGlmZiBkLCBib29sZWFuIHNtYXJ0KSB7Ci0JCQotCQlib29sZWFuIGFuY2VzdG9ySXNWaXNpYmxlPSBmYWxzZTsKLQkJYm9vbGVhbiBsZWZ0SXNWaXNpYmxlPSBmYWxzZTsKLQkJYm9vbGVhbiByaWdodElzVmlzaWJsZT0gZmFsc2U7Ci0KLQkJaWYgKHNtYXJ0KSB7Ci0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsKLQkJCS8vIGZpbmQgdGhlIHN0YXJ0aW5nIGxpbmUgb2YgdGhlIGRpZmYgaW4gYWxsIHRleHQgd2lkZ2V0cwotCQkJaW50IGxzPSBmTGVmdC5nZXRMaW5lUmFuZ2UoZC5mTGVmdFBvcywgcmVnaW9uKS54OwotCQkJaW50IHJzPSBmUmlnaHQuZ2V0TGluZVJhbmdlKGQuZlJpZ2h0UG9zLCByZWdpb24pLng7Ci0JCQkKLQkJCWlmIChpc1RocmVlV2F5KCkgJiYgIWZJZ25vcmVBbmNlc3RvcikgewotCQkJCWludCBhcz0gZkFuY2VzdG9yLmdldExpbmVSYW5nZShkLmZBbmNlc3RvclBvcywgcmVnaW9uKS54OwotCQkJCWlmIChhcyA+PSBmQW5jZXN0b3IuZ2V0VG9wSW5kZXgoKSAmJiBhcyA8PSBmQW5jZXN0b3IuZ2V0Qm90dG9tSW5kZXgoKSkKLQkJCQkJYW5jZXN0b3JJc1Zpc2libGU9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChscyA+PSBmTGVmdC5nZXRUb3BJbmRleCgpICYmIGxzIDw9IGZMZWZ0LmdldEJvdHRvbUluZGV4KCkpCi0JCQkJbGVmdElzVmlzaWJsZT0gdHJ1ZTsKLQotCQkJaWYgKHJzID49IGZSaWdodC5nZXRUb3BJbmRleCgpICYmIHJzIDw9IGZSaWdodC5nZXRCb3R0b21JbmRleCgpKQotCQkJCXJpZ2h0SXNWaXNpYmxlPSB0cnVlOwotCQl9Ci0KLQkJLy8gdmVydGljYWwgc2Nyb2xsaW5nCi0JCWlmICghbGVmdElzVmlzaWJsZSB8fCAhcmlnaHRJc1Zpc2libGUpIHsKLQkJCWludCBhdnBvcz0gMCwgbHZwb3M9IDAsIHJ2cG9zPSAwOwotCQkJCi0JCQlNZXJnZVNvdXJjZVZpZXdlciBhbGxCdXRUaGlzPSBudWxsOwotCQkJaWYgKGxlZnRJc1Zpc2libGUpIHsKLQkJCQlhdnBvcz0gbHZwb3M9IHJ2cG9zPSByZWFsVG9WaXJ0dWFsUG9zaXRpb24oZkxlZnQsIGZMZWZ0LmdldFRvcEluZGV4KCkpOwotCQkJCWFsbEJ1dFRoaXM9IGZMZWZ0OwotCQkJfSBlbHNlIGlmIChyaWdodElzVmlzaWJsZSkgewotCQkJCWF2cG9zPSBsdnBvcz0gcnZwb3M9IHJlYWxUb1ZpcnR1YWxQb3NpdGlvbihmUmlnaHQsIGZSaWdodC5nZXRUb3BJbmRleCgpKTsKLQkJCQlhbGxCdXRUaGlzPSBmUmlnaHQ7Ci0JCQl9IGVsc2UgaWYgKGFuY2VzdG9ySXNWaXNpYmxlKSB7Ci0JCQkJYXZwb3M9IGx2cG9zPSBydnBvcz0gcmVhbFRvVmlydHVhbFBvc2l0aW9uKGZBbmNlc3RvciwgZkFuY2VzdG9yLmdldFRvcEluZGV4KCkpOwotCQkJCWFsbEJ1dFRoaXM9IGZBbmNlc3RvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZBbGxEaWZmcyAhPSBudWxsKSB7Ci0JCQkJCWludCB2cG9zPSAwOwotCQkJCQlJdGVyYXRvciBlPSBmQWxsRGlmZnMuaXRlcmF0b3IoKTsKLQkJCQkJZm9yIChpbnQgaT0gMDsgZS5oYXNOZXh0KCk7IGkrKykgewotCQkJCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJCQlpZiAoZGlmZiA9PSBkKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpIHsKLQkJCQkJCQl2cG9zKz0gZGlmZi5nZXRNYXhEaWZmSGVpZ2h0KGZTaG93QW5jZXN0b3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhdnBvcys9IGRpZmYuZ2V0QW5jZXN0b3JIZWlnaHQoKTsKLQkJCQkJCQlsdnBvcys9IGRpZmYuZ2V0TGVmdEhlaWdodCgpOwotCQkJCQkJCXJ2cG9zKz0gZGlmZi5nZXRSaWdodEhlaWdodCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nKQotCQkJCQkJYXZwb3M9IGx2cG9zPSBydnBvcz0gdnBvczsKLQkJCQl9Ci0JCQkJaW50IGRlbHRhPSBmUmlnaHQuZ2V0Vmlld3BvcnRMaW5lcygpLzQ7Ci0JCQkJYXZwb3MtPSBkZWx0YTsKLQkJCQlpZiAoYXZwb3MgPCAwKQotCQkJCQlhdnBvcz0gMDsKLQkJCQlsdnBvcy09IGRlbHRhOwotCQkJCWlmIChsdnBvcyA8IDApCi0JCQkJCWx2cG9zPSAwOwotCQkJCXJ2cG9zLT0gZGVsdGE7Ci0JCQkJaWYgKHJ2cG9zIDwgMCkKLQkJCQkJcnZwb3M9IDA7Ci0JCQl9Ci0JCQkJCQkJCi0JCQlzY3JvbGxWZXJ0aWNhbChhdnBvcywgbHZwb3MsIHJ2cG9zLCBhbGxCdXRUaGlzKTsKLQkJCQotCQkJaWYgKGZWU2Nyb2xsQmFyICE9IG51bGwpCi0JCQkJZlZTY3JvbGxCYXIuc2V0U2VsZWN0aW9uKGF2cG9zKTsKLQkJfQotCQkKLQkJLy8gaG9yaXpvbnRhbCBzY3JvbGxpbmcKLQkJaWYgKGQuZklzVG9rZW4pIHsKLQkJCS8vIHdlIG9ubHkgc2Nyb2xsIGhvcml6b250YWxseSBmb3IgdG9rZW4gZGlmZnMKLQkJCXJldmVhbChmQW5jZXN0b3IsIGQuZkFuY2VzdG9yUG9zKTsKLQkJCXJldmVhbChmTGVmdCwgZC5mTGVmdFBvcyk7Ci0JCQlyZXZlYWwoZlJpZ2h0LCBkLmZSaWdodFBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpbiBhbGwgb3RoZXIgY2FzZXMgd2UgcmVzZXQgdGhlIGhvcml6b250YWwgb2Zmc2V0Ci0JCQloc2Nyb2xsKGZBbmNlc3Rvcik7Ci0JCQloc2Nyb2xsKGZMZWZ0KTsKLQkJCWhzY3JvbGwoZlJpZ2h0KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJldmVhbChNZXJnZVNvdXJjZVZpZXdlciB2LCBQb3NpdGlvbiBwKSB7Ci0JCWlmICh2ICE9IG51bGwgJiYgcCAhPSBudWxsKSB7Ci0JCQlTdHlsZWRUZXh0IHN0PSB2LmdldFRleHRXaWRnZXQoKTsKLQkJCWlmIChzdCAhPSBudWxsKSB7Ci0JCQkJUmVjdGFuZ2xlIHI9IHN0LmdldENsaWVudEFyZWEoKTsKLQkJCQlpZiAoIXIuaXNFbXB0eSgpKQkvLyB3b3JrYXJvdW5kIGZvciAjNzMyMDogTmV4dCBkaWZmIHNjcm9sbHMgd2hlbiBnb2luZyBpbnRvIGN1cnJlbnQgZGlmZiAKLQkJCQkJdi5yZXZlYWxSYW5nZShwLm9mZnNldCwgcC5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaHNjcm9sbChNZXJnZVNvdXJjZVZpZXdlciB2KSB7Ci0JCWlmICh2ICE9IG51bGwpIHsKLQkJCVN0eWxlZFRleHQgc3Q9IHYuZ2V0VGV4dFdpZGdldCgpOwotCQkJaWYgKHN0ICE9IG51bGwpCi0JCQkJc3Quc2V0SG9yaXpvbnRhbEluZGV4KDApOwotCQl9Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQl2b2lkIGNvcHlBbGxVbnJlc29sdmVkKGJvb2xlYW4gbGVmdFRvUmlnaHQpIHsKLQkJaWYgKGZDaGFuZ2VEaWZmcyAhPSBudWxsICYmIGlzVGhyZWVXYXkoKSAmJiAhZklnbm9yZUFuY2VzdG9yKSB7Ci0JCQlJUmV3cml0ZVRhcmdldCB0YXJnZXQ9IGxlZnRUb1JpZ2h0ID8gZlJpZ2h0LmdldFJld3JpdGVUYXJnZXQoKSA6IGZMZWZ0LmdldFJld3JpdGVUYXJnZXQoKTsKLQkJCWJvb2xlYW4gY29tcG91bmRDaGFuZ2VTdGFydGVkPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIGU9IGZDaGFuZ2VEaWZmcy5pdGVyYXRvcigpOwotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoZGlmZi5mRGlyZWN0aW9uKSB7Ci0JCQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLkxFRlQ6Ci0JCQkJCQlpZiAobGVmdFRvUmlnaHQpIHsKLQkJCQkJCQlpZiAoIWNvbXBvdW5kQ2hhbmdlU3RhcnRlZCkgewotCQkJCQkJCQl0YXJnZXQuYmVnaW5Db21wb3VuZENoYW5nZSgpOwotCQkJCQkJCQljb21wb3VuZENoYW5nZVN0YXJ0ZWQ9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWNvcHkoZGlmZiwgbGVmdFRvUmlnaHQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUmFuZ2VEaWZmZXJlbmNlLlJJR0hUOgotCQkJCQkJaWYgKCFsZWZ0VG9SaWdodCkgewotCQkJCQkJCWlmICghY29tcG91bmRDaGFuZ2VTdGFydGVkKSB7Ci0JCQkJCQkJCXRhcmdldC5iZWdpbkNvbXBvdW5kQ2hhbmdlKCk7Ci0JCQkJCQkJCWNvbXBvdW5kQ2hhbmdlU3RhcnRlZD0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJY29weShkaWZmLCBsZWZ0VG9SaWdodCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY29tcG91bmRDaGFuZ2VTdGFydGVkKSB7Ci0JCQkJCXRhcmdldC5lbmRDb21wb3VuZENoYW5nZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIENvcHkgd2hvbGUgZG9jdW1lbnQgZnJvbSBvbmUgc2lkZSB0byB0aGUgb3RoZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weShib29sZWFuIGxlZnRUb1JpZ2h0KSB7Ci0JCQotCQlpZiAoc2hvd1Jlc29sdmVVSSgpKSB7Ci0JCQljb3B5QWxsVW5yZXNvbHZlZChsZWZ0VG9SaWdodCk7Ci0JCQlpbnZhbGlkYXRlTGluZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQkJCQotCQlpZiAobGVmdFRvUmlnaHQpIHsKLQkJCWlmIChmTGVmdC5nZXRFbmFibGVkKCkpIHsKLQkJCQkvLyBjb3B5IHRleHQKLQkJCQlTdHJpbmcgdGV4dD0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJCQlmUmlnaHQuZ2V0VGV4dFdpZGdldCgpLnNldFRleHQodGV4dCk7Ci0JCQkJZlJpZ2h0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRlbGV0ZQotCQkJCWZSaWdodC5nZXRUZXh0V2lkZ2V0KCkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmUmlnaHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQlmUmlnaHRMaW5lQ291bnQ9IGZSaWdodC5nZXRMaW5lQ291bnQoKTsKLQkJCXNldFJpZ2h0RGlydHkodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZlJpZ2h0LmdldEVuYWJsZWQoKSkgewotCQkJCS8vIGNvcHkgdGV4dAotCQkJCVN0cmluZyB0ZXh0PSBmUmlnaHQuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJCQlmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuc2V0VGV4dCh0ZXh0KTsKLQkJCQlmTGVmdC5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBkZWxldGUKLQkJCQlmTGVmdC5nZXRUZXh0V2lkZ2V0KCkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmTGVmdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCWZMZWZ0TGluZUNvdW50PSBmTGVmdC5nZXRMaW5lQ291bnQoKTsKLQkJCXNldExlZnREaXJ0eSh0cnVlKTsKLQkJfQotCQlkb0RpZmYoKTsKLQkJaW52YWxpZGF0ZUxpbmVzKCk7Ci0JCXVwZGF0ZVZTY3JvbGxCYXIoKTsKLQkJc2VsZWN0Rmlyc3REaWZmKCk7Ci0JCXJlZnJlc2hCaXJkc0V5ZVZpZXcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weURpZmZMZWZ0VG9SaWdodCgpIHsKLQkJY29weShmQ3VycmVudERpZmYsIHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weURpZmZSaWdodFRvTGVmdCgpIHsKLQkJY29weShmQ3VycmVudERpZmYsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCQkKLQkvKgotCSAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkaWZmIGZyb20gb25lIHNpZGUgdG8gdGhlIG90aGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb3B5KERpZmYgZGlmZiwgYm9vbGVhbiBsZWZ0VG9SaWdodCwgYm9vbGVhbiBnb3RvTmV4dCkgewotCQlpZiAoY29weShkaWZmLCBsZWZ0VG9SaWdodCkpIHsKLQkJCWlmIChnb3RvTmV4dCkgewotCQkJCW5hdmlnYXRlKHRydWUsIHRydWUsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXZlYWxEaWZmKGRpZmYsIHRydWUpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkaWZmIGZyb20gb25lIHNpZGUgdG8gdGhlIG90aGVyIGJ1dAotCSAqIGRvZXNuJ3QgcmV2ZWFsIGFueXRoaW5nLgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjb3B5IHdhcyBzdWNjZXNmdWwuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvcHkoRGlmZiBkaWZmLCBib29sZWFuIGxlZnRUb1JpZ2h0KSB7Ci0JCQotCQlpZiAoZGlmZiAhPSBudWxsICYmICFkaWZmLmlzUmVzb2x2ZWQoKSkgewotCi0JCQlQb3NpdGlvbiBmcm9tUG9zPSBudWxsOwotCQkJUG9zaXRpb24gdG9Qb3M9IG51bGw7Ci0JCQlJRG9jdW1lbnQgZnJvbURvYz0gbnVsbDsKLQkJCUlEb2N1bWVudCB0b0RvYz0gbnVsbDsKLQotCQkJaWYgKGxlZnRUb1JpZ2h0KSB7Ci0JCQkJZlJpZ2h0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZnJvbVBvcz0gZGlmZi5mTGVmdFBvczsKLQkJCQl0b1Bvcz0gZGlmZi5mUmlnaHRQb3M7Ci0JCQkJZnJvbURvYz0gZkxlZnQuZ2V0RG9jdW1lbnQoKTsKLQkJCQl0b0RvYz0gZlJpZ2h0LmdldERvY3VtZW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCWZMZWZ0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZnJvbVBvcz0gZGlmZi5mUmlnaHRQb3M7Ci0JCQkJdG9Qb3M9IGRpZmYuZkxlZnRQb3M7Ci0JCQkJZnJvbURvYz0gZlJpZ2h0LmdldERvY3VtZW50KCk7Ci0JCQkJdG9Eb2M9IGZMZWZ0LmdldERvY3VtZW50KCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChmcm9tRG9jICE9IG51bGwpIHsKLQkJCQkKLQkJCQlpbnQgZnJvbVN0YXJ0PSBmcm9tUG9zLmdldE9mZnNldCgpOwotCQkJCWludCBmcm9tTGVuPSBmcm9tUG9zLmdldExlbmd0aCgpOwotCQkJCQotCQkJCWludCB0b1N0YXJ0PSB0b1Bvcy5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgdG9MZW49IHRvUG9zLmdldExlbmd0aCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHM9IG51bGw7Ci0JCQkJCQkJCQkJCQotCQkJCQlzd2l0Y2ggKGRpZmYuZkRpcmVjdGlvbikgewotCQkJCQljYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLQkJCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuTEVGVDoKLQkJCQkJCXM9IGZyb21Eb2MuZ2V0KGZyb21TdGFydCwgZnJvbUxlbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQU5DRVNUT1I6Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBSYW5nZURpZmZlcmVuY2UuQ09ORkxJQ1Q6Ci0JCQkJCQlpZiAoQVBQRU5EX0NPTkZMSUNUKSB7Ci0JCQkJCQkJcz0gdG9Eb2MuZ2V0KHRvU3RhcnQsIHRvTGVuKTsKLQkJCQkJCQlzKz0gZnJvbURvYy5nZXQoZnJvbVN0YXJ0LCBmcm9tTGVuKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXM9IGZyb21Eb2MuZ2V0KGZyb21TdGFydCwgZnJvbUxlbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAocyAhPSBudWxsKSB7Ci0JCQkJCQl0b0RvYy5yZXBsYWNlKHRvU3RhcnQsIHRvTGVuLCBzKTsJCQkJCQkKLQkJCQkJCXRvUG9zLnNldE9mZnNldCh0b1N0YXJ0KTsKLQkJCQkJCXRvUG9zLnNldExlbmd0aChzLmxlbmd0aCgpKTsKLQkJCQkJfQkKLQkJCQkKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCQotCQkJZGlmZi5zZXRSZXNvbHZlZCh0cnVlKTsKLQkJCXVwZGF0ZVJlc29sdmVTdGF0dXMoKTsKLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vLS0tLSBzY3JvbGxpbmcKLQotCS8qCi0JICogQ2FsY3VsYXRlcyB2aXJ0dWFsIGhlaWdodCAoaW4gbGluZXMpIG9mIHZpZXdzIGJ5IGFkZGluZyB0aGUgbWF4aW11bSBvZiBjb3JyZXNwb25kaW5nIGRpZmZzLgotCSAqLwotCXByaXZhdGUgaW50IGdldFZpcnR1YWxIZWlnaHQoKSB7Ci0JCWludCBoPSAxOwotCQlpZiAoZkFsbERpZmZzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGU9IGZBbGxEaWZmcy5pdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaT0gMDsgZS5oYXNOZXh0KCk7IGkrKykgewotCQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJCWgrPSBkaWZmLmdldE1heERpZmZIZWlnaHQoZlNob3dBbmNlc3Rvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCQotCS8qCi0JICogQ2FsY3VsYXRlcyBoZWlnaHQgKGluIGxpbmVzKSBvZiByaWdodCB2aWV3IGJ5IGFkZGluZyB0aGUgaGVpZ2h0IG9mIHRoZSByaWdodCBkaWZmcy4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRSaWdodEhlaWdodCgpIHsKLQkJaW50IGg9IDE7Ci0JCWlmIChmQWxsRGlmZnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkFsbERpZmZzLml0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBlLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQkJaCs9IGRpZmYuZ2V0UmlnaHRIZWlnaHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaDsKLQl9Ci0JCi0JLyoKLQkgKiBUaGUgaGVpZ2h0IG9mIHRoZSBUZXh0RWRpdG9ycyBpbiBsaW5lcy4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRWaWV3cG9ydEhlaWdodCgpIHsKLQkJU3R5bGVkVGV4dCB0ZT0gZkxlZnQuZ2V0VGV4dFdpZGdldCgpOwotCQkKLQkJaW50IHZoPSB0ZS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotCQlpZiAodmggPT0gMCkgewotCQkJUmVjdGFuZ2xlIHRyaW09IHRlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJaW50IHNjcm9sbGJhckhlaWdodD0gdHJpbS5oZWlnaHQ7Ci0JCQkKLQkJCWludCBoZWFkZXJIZWlnaHQ9IGdldEhlYWRlckhlaWdodCgpOwotCQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHI9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQkJCi0JCQl2aD0gci5oZWlnaHQtaGVhZGVySGVpZ2h0LXNjcm9sbGJhckhlaWdodDsKLQkJfQkJCQkJCQkJCQkJCQkJCQotCi0JCXJldHVybiB2aCAvIHRlLmdldExpbmVIZWlnaHQoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIHBvc2l0aW9uIGZvciB0aGUgZ2l2ZW4gdmlldyBwb3NpdGlvbi4KLQkgKi8KLQlwcml2YXRlIGludCByZWFsVG9WaXJ0dWFsUG9zaXRpb24oTWVyZ2VTb3VyY2VWaWV3ZXIgdywgaW50IHZwb3MpIHsKLQotCQlpZiAoISBmU3luY2hyb25pemVkU2Nyb2xsaW5nIHx8IGZBbGxEaWZmcyA9PSBudWxsKQotCQkJcmV0dXJuIHZwb3M7Ci0JCQkJCi0JCWludCB2aWV3UG9zPSAwOwkJLy8gcmVhbCB2aWV3IHBvc2l0aW9uCi0JCWludCB2aXJ0dWFsUG9zPSAwOwkvLyB2aXJ0dWFsIHBvc2l0aW9uCi0JCVBvaW50IHJlZ2lvbj0gbmV3IFBvaW50KDAsIDApOwotCQkKLQkJSXRlcmF0b3IgZT0gZkFsbERpZmZzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJRGlmZiBkaWZmPSAoRGlmZikgZS5uZXh0KCk7Ci0JCQlQb3NpdGlvbiBwb3M9IGRpZmYuZ2V0UG9zaXRpb24odyk7Ci0JCQl3LmdldExpbmVSYW5nZShwb3MsIHJlZ2lvbik7Ci0JCQlpbnQgcmVhbEhlaWdodD0gcmVnaW9uLnk7Ci0JCQlpbnQgdmlydHVhbEhlaWdodD0gZGlmZi5nZXRNYXhEaWZmSGVpZ2h0KGZTaG93QW5jZXN0b3IpOwotCQkJaWYgKHZwb3MgPD0gdmlld1BvcyArIHJlYWxIZWlnaHQpIHsJLy8gT0ssIGZvdW5kIQotCQkJCXZwb3MtPSB2aWV3UG9zOwkvLyBtYWtlIHJlbGF0aXZlIHRvIHRoaXMgc2xvdAotCQkJCS8vIG5vdyBzY2FsZSBwb3NpdGlvbiB3aXRoaW4gdGhpcyBzbG90IHRvIHZpcnR1YWwgc2xvdAotCQkJCWlmIChyZWFsSGVpZ2h0IDw9IDApCi0JCQkJCXZwb3M9IDA7Ci0JCQkJZWxzZQotCQkJCQl2cG9zPSAodnBvcyp2aXJ0dWFsSGVpZ2h0KS9yZWFsSGVpZ2h0OwotCQkJCXJldHVybiB2aXJ0dWFsUG9zK3Zwb3M7Ci0JCQl9Ci0JCQl2aWV3UG9zKz0gcmVhbEhlaWdodDsKLQkJCXZpcnR1YWxQb3MrPSB2aXJ0dWFsSGVpZ2h0OwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsUG9zOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHNjcm9sbFZlcnRpY2FsKGludCBhdnBvcywgaW50IGx2cG9zLCBpbnQgcnZwb3MsIE1lcmdlU291cmNlVmlld2VyIGFsbEJ1dCkgewotCQkJCQkJCi0JCWludCBzPSAwOwotCQkKLQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcpIHsKLQkJCXM9IGdldFZpcnR1YWxIZWlnaHQoKSAtIHJ2cG9zOwotCQkJaW50IGhlaWdodD0gZlJpZ2h0LmdldFZpZXdwb3J0TGluZXMoKS80OwotCQkJaWYgKHMgPCAwKQotCQkJCXM9IDA7Ci0JCQlpZiAocyA+IGhlaWdodCkKLQkJCQlzPSBoZWlnaHQ7Ci0JCX0KLQotCQlmSW5TY3JvbGxpbmc9IHRydWU7Ci0JCQkJCi0JCWlmIChpc1RocmVlV2F5KCkgJiYgYWxsQnV0ICE9IGZBbmNlc3RvcikgewotCQkJaWYgKGZTeW5jaHJvbml6ZWRTY3JvbGxpbmcgfHwgYWxsQnV0ID09IG51bGwpIHsKLQkJCQlpbnQgeT0gdmlydHVhbFRvUmVhbFBvc2l0aW9uKGZBbmNlc3RvciwgYXZwb3MrcyktczsKLQkJCQlmQW5jZXN0b3IudnNjcm9sbCh5KTsKLQkJCX0KLQkJfQotCi0JCWlmIChhbGxCdXQgIT0gZkxlZnQpIHsKLQkJCWlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nIHx8IGFsbEJ1dCA9PSBudWxsKSB7Ci0JCQkJaW50IHk9IHZpcnR1YWxUb1JlYWxQb3NpdGlvbihmTGVmdCwgbHZwb3MrcyktczsKLQkJCQlmTGVmdC52c2Nyb2xsKHkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbEJ1dCAhPSBmUmlnaHQpIHsKLQkJCWlmIChmU3luY2hyb25pemVkU2Nyb2xsaW5nIHx8IGFsbEJ1dCA9PSBudWxsKSB7Ci0JCQkJaW50IHk9IHZpcnR1YWxUb1JlYWxQb3NpdGlvbihmUmlnaHQsIHJ2cG9zK3MpLXM7Ci0JCQkJZlJpZ2h0LnZzY3JvbGwoeSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZJblNjcm9sbGluZz0gZmFsc2U7Ci0JCQotCQlpZiAoaXNUaHJlZVdheSgpICYmIGZBbmNlc3RvckNhbnZhcyAhPSBudWxsKQotCQkJZkFuY2VzdG9yQ2FudmFzLnJlcGFpbnQoKTsKLQkJCi0JCWlmIChmTGVmdENhbnZhcyAhPSBudWxsKQotCQkJZkxlZnRDYW52YXMucmVwYWludCgpOwotCQkKLQkJQ29udHJvbCBjZW50ZXI9IGdldENlbnRlcigpOwotCQlpZiAoY2VudGVyIGluc3RhbmNlb2YgQnVmZmVyZWRDYW52YXMpCi0JCQkoKEJ1ZmZlcmVkQ2FudmFzKWNlbnRlcikucmVwYWludCgpOwotCQkKLQkJaWYgKGZSaWdodENhbnZhcyAhPSBudWxsKQotCQkJZlJpZ2h0Q2FudmFzLnJlcGFpbnQoKTsKLQl9Ci0JCQotCS8qCi0JICogVXBkYXRlcyBTY3JvbGxiYXJzIHdpdGggdmlld3BvcnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jVmlld3BvcnQoTWVyZ2VTb3VyY2VWaWV3ZXIgdykgewotCQkKLQkJaWYgKGZJblNjcm9sbGluZykKLQkJCXJldHVybjsKLQotCQlpbnQgaXg9IHcuZ2V0VG9wSW5kZXgoKTsKLQkJaW50IGl4Mj0gdy5nZXREb2N1bWVudFJlZ2lvbk9mZnNldCgpOwotCQkKLQkJaW50IHZpZXdQb3NpdGlvbj0gcmVhbFRvVmlydHVhbFBvc2l0aW9uKHcsIGl4LWl4Mik7Ci0JCQkJCi0JCXNjcm9sbFZlcnRpY2FsKHZpZXdQb3NpdGlvbiwgdmlld1Bvc2l0aW9uLCB2aWV3UG9zaXRpb24sIHcpOwkvLyBzY3JvbGwgYWxsIGJ1dCB0aGUgZ2l2ZW4gdmlld3MKLQkJCi0JCWlmIChmVlNjcm9sbEJhciAhPSBudWxsKSB7Ci0JCQlpbnQgdmFsdWU9IE1hdGgubWF4KDAsIE1hdGgubWluKHZpZXdQb3NpdGlvbiwgZ2V0VmlydHVhbEhlaWdodCgpIC0gZ2V0Vmlld3BvcnRIZWlnaHQoKSkpOwotCQkJZlZTY3JvbGxCYXIuc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQkJCS8vcmVmcmVzaEJpcmRFeWVWaWV3KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVlNjcm9sbEJhcigpIHsKLQkJCi0JCWlmIChVdGlsaXRpZXMub2tUb1VzZShmVlNjcm9sbEJhcikgJiYgZlN5bmNocm9uaXplZFNjcm9sbGluZykgewotCQkJaW50IHZpcnR1YWxIZWlnaHQ9IGdldFZpcnR1YWxIZWlnaHQoKTsKLQkJCWludCB2aWV3UG9ydEhlaWdodD0gZ2V0Vmlld3BvcnRIZWlnaHQoKTsKLQkJCWludCBwYWdlSW5jcmVtZW50PSB2aWV3UG9ydEhlaWdodC0xOwotCQkJaW50IHRodW1iPSAodmlld1BvcnRIZWlnaHQgPiB2aXJ0dWFsSGVpZ2h0KSA/IHZpcnR1YWxIZWlnaHQgOiB2aWV3UG9ydEhlaWdodDsKLQkJCQkJCQotCQkJZlZTY3JvbGxCYXIuc2V0UGFnZUluY3JlbWVudChwYWdlSW5jcmVtZW50KTsKLQkJCWZWU2Nyb2xsQmFyLnNldE1heGltdW0odmlydHVhbEhlaWdodCk7Ci0JCQlmVlNjcm9sbEJhci5zZXRUaHVtYih0aHVtYik7Ci0JCX0JCQkKLQl9Ci0JCi0JLyoKLQkgKiBtYXBzIGdpdmVuIHZpcnR1YWwgcG9zaXRpb24gaW50byBhIHJlYWwgdmlldyBwb3NpdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJpdmF0ZSBpbnQgdmlydHVhbFRvUmVhbFBvc2l0aW9uKE1lcmdlU291cmNlVmlld2VyIHBhcnQsIGludCB2KSB7Ci0JCQkKLQkJaWYgKCEgZlN5bmNocm9uaXplZFNjcm9sbGluZyB8fCBmQWxsRGlmZnMgPT0gbnVsbCkKLQkJCXJldHVybiB2OwotCQkJCQkKLQkJaW50IHZpcnR1YWxQb3M9IDA7Ci0JCWludCB2aWV3UG9zPSAwOwotCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsKLQkJCi0JCUl0ZXJhdG9yIGU9IGZBbGxEaWZmcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCURpZmYgZGlmZj0gKERpZmYpIGUubmV4dCgpOwotCQkJUG9zaXRpb24gcG9zPSBkaWZmLmdldFBvc2l0aW9uKHBhcnQpOwotCQkJaW50IHZpZXdIZWlnaHQ9IHBhcnQuZ2V0TGluZVJhbmdlKHBvcywgcmVnaW9uKS55OwotCQkJaW50IHZpcnR1YWxIZWlnaHQ9IGRpZmYuZ2V0TWF4RGlmZkhlaWdodChmU2hvd0FuY2VzdG9yKTsKLQkJCWlmICh2IDwgKHZpcnR1YWxQb3MgKyB2aXJ0dWFsSGVpZ2h0KSkgewotCQkJCXYtPSB2aXJ0dWFsUG9zOwkJLy8gbWFrZSByZWxhdGl2ZSB0byB0aGlzIHNsb3QKLQkJCQlpZiAodmlld0hlaWdodCA8PSAwKSB7Ci0JCQkJCXY9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdj0gKHYqdmlld0hlaWdodCkvdmlydHVhbEhlaWdodDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZpZXdQb3MrdjsKLQkJCX0KLQkJCXZpcnR1YWxQb3MrPSB2aXJ0dWFsSGVpZ2h0OwotCQkJdmlld1Bvcys9IHZpZXdIZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuIHZpZXdQb3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL1RleHRNZXJnZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvY29udGVudG1lcmdldmlld2VyL1RleHRNZXJnZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdhY2IzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9UZXh0TWVyZ2VWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBAKCMpVGV4dE1lcmdlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKLSMKLSMgUmVzb3VyY2Ugc3RyaW5ncyBmb3IgVGV4dE1lcmdlVmlld2VyLmphdmEKLQotdGl0bGU9IFRleHQgQ29tcGFyZQotCi1zYXZlRGlhbG9nLnRpdGxlPSBTYXZlIFJlc291cmNlCi1zYXZlRGlhbG9nLm1lc3NhZ2U9IFJlc291cmNlIGhhcyBiZWVuIG1vZGlmaWVkLiBTYXZlIGNoYW5nZXM/Ci0KLWNvbXBhcmVQcm9ncmVzc1Rhc2sudGl0bGU9IENvbXB1dGluZyBEaWZmZXJlbmNlcy4uLgotCi10b29Db21wbGV4RXJyb3IudGl0bGU9IEVycm9yCi0jIE5MU19NRVNTQUdFRk9STUFUX0FMTAotdG9vQ29tcGxleEVycm9yLmZvcm1hdD0gVG9vIG1hbnkgZGlmZmVyZW5jZXMuIFR1cm4gb24gdGhlICcnSWdub3JlIFdoaXRlIFNwYWNlJycgb3B0aW9uIG9yIGRvIGEgc3RydWN0dXJlIGNvbXBhcmUgZmlyc3QuCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUb29sYmFyIGFjdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWFjdGlvbi5Db3B5TGVmdFRvUmlnaHQubGFiZWw9Q29weSBMZWZ0IHRvIFJpZ2h0Ci1hY3Rpb24uQ29weUxlZnRUb1JpZ2h0LnRvb2x0aXA9Q29weSBBbGwgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci1hY3Rpb24uQ29weUxlZnRUb1JpZ2h0LmltYWdlPWNvcHlfcl9jby5naWYKLQotYWN0aW9uLkNvcHlSaWdodFRvTGVmdC5sYWJlbD1Db3B5IFJpZ2h0IHRvIExlZnQKLWFjdGlvbi5Db3B5UmlnaHRUb0xlZnQudG9vbHRpcD1Db3B5IEFsbCBOb24tQ29uZmxpY3RpbmcgQ2hhbmdlcyBmcm9tIFJpZ2h0IHRvIExlZnQKLWFjdGlvbi5Db3B5UmlnaHRUb0xlZnQuaW1hZ2U9Y29weV9sX2NvLmdpZgotCi1hY3Rpb24uQ29weURpZmZMZWZ0VG9SaWdodC5sYWJlbD1Db3B5IEN1cnJlbnQgQ2hhbmdlIHRvIFJpZ2h0Ci1hY3Rpb24uQ29weURpZmZMZWZ0VG9SaWdodC50b29sdGlwPUNvcHkgQ3VycmVudCBDaGFuZ2UgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci1hY3Rpb24uQ29weURpZmZMZWZ0VG9SaWdodC5pbWFnZT1jb3B5Y29udF9yX2NvLmdpZgotCi1hY3Rpb24uQ29weURpZmZSaWdodFRvTGVmdC5sYWJlbD1Db3B5IEN1cnJlbnQgQ2hhbmdlIHRvIExlZnQKLWFjdGlvbi5Db3B5RGlmZlJpZ2h0VG9MZWZ0LnRvb2x0aXA9Q29weSBDdXJyZW50IENoYW5nZSBmcm9tIFJpZ2h0IHRvIExlZnQKLWFjdGlvbi5Db3B5RGlmZlJpZ2h0VG9MZWZ0LmltYWdlPWNvcHljb250X2xfY28uZ2lmCi0KLWFjdGlvbi5OZXh0RGlmZi5sYWJlbD1OZXh0Ci1hY3Rpb24uTmV4dERpZmYudG9vbHRpcD1TZWxlY3QgTmV4dCBDaGFuZ2UKLWFjdGlvbi5OZXh0RGlmZi5pbWFnZT1uZXh0X25hdi5naWYKLQotYWN0aW9uLlByZXZEaWZmLmxhYmVsPVByZXZpb3VzCi1hY3Rpb24uUHJldkRpZmYudG9vbHRpcD1TZWxlY3QgUHJldmlvdXMgQ2hhbmdlCi1hY3Rpb24uUHJldkRpZmYuaW1hZ2U9cHJldl9uYXYuZ2lmCi0KLWFjdGlvbi5FbmFibGVBbmNlc3Rvci5sYWJlbD1FbmFibGUgQW5jZXN0b3IgUGFuZQotYWN0aW9uLkVuYWJsZUFuY2VzdG9yLnRvb2x0aXAudW5jaGVja2VkPVNob3cgQW5jZXN0b3IgUGFuZQotYWN0aW9uLkVuYWJsZUFuY2VzdG9yLnRvb2x0aXAuY2hlY2tlZD1IaWRlIEFuY2VzdG9yIFBhbmUKLWFjdGlvbi5FbmFibGVBbmNlc3Rvci5kZXNjcmlwdGlvbi51bmNoZWNrZWQ9U2hvdyBBbmNlc3RvciBQYW5lCi1hY3Rpb24uRW5hYmxlQW5jZXN0b3IuZGVzY3JpcHRpb24uY2hlY2tlZD1IaWRlIEFuY2VzdG9yIFBhbmUKLWFjdGlvbi5FbmFibGVBbmNlc3Rvci5pbWFnZT1hbmNlc3RvcnBhbmVfY28uZ2lmCi0KLWFjdGlvbi5JZ25vcmVBbmNlc3Rvci5sYWJlbD1JZ25vcmUgQW5jZXN0b3IKLWFjdGlvbi5JZ25vcmVBbmNlc3Rvci50b29sdGlwLnVuY2hlY2tlZD1Ud28tV2F5IENvbXBhcmUgKElnbm9yZSBBbmNlc3RvcikKLWFjdGlvbi5JZ25vcmVBbmNlc3Rvci50b29sdGlwLmNoZWNrZWQ9VGhyZWUtV2F5IENvbXBhcmUKLWFjdGlvbi5JZ25vcmVBbmNlc3Rvci5kZXNjcmlwdGlvbi51bmNoZWNrZWQ9VHdvLVdheSBDb21wYXJlIChJZ25vcmUgQW5jZXN0b3IpCi1hY3Rpb24uSWdub3JlQW5jZXN0b3IuZGVzY3JpcHRpb24uY2hlY2tlZD1UaHJlZS1XYXkgQ29tcGFyZQotYWN0aW9uLklnbm9yZUFuY2VzdG9yLmltYWdlPXR3b3dheWNvbXBhcmVfY28uZ2lmCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29udGV4dCBtZW51IGFjdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWFjdGlvbi51bmRvLmxhYmVsPVVuZG9AQ3RybCtaCi1hY3Rpb24udW5kby50b29sdGlwPVVuZG8gTGFzdCBPcGVyYXRpb24KLQotYWN0aW9uLnJlZG8ubGFiZWw9UmVkb0BDdHJsK1kKLWFjdGlvbi5yZWRvLnRvb2x0aXA9UmVkbyBMYXN0IE9wZXJhdGlvbgotCi1hY3Rpb24uY3V0LmxhYmVsPUN1dEBDdHJsK1gKLWFjdGlvbi5jdXQudG9vbHRpcD1DdXQgVGV4dCBTZWxlY3Rpb24gdG8gQ2xpcGJvYXJkCi0KLWFjdGlvbi5jb3B5LmxhYmVsPUNvcHlAQ3RybCtDCi1hY3Rpb24uY29weS50b29sdGlwPUNvcHkgVGV4dCBTZWxlY3Rpb24gdG8gQ2xpcGJvYXJkCi0KLWFjdGlvbi5wYXN0ZS5sYWJlbD1QYXN0ZUBDdHJsK1YKLWFjdGlvbi5wYXN0ZS50b29sdGlwPVJlcGxhY2UgVGV4dCBTZWxlY3Rpb24gd2l0aCBDbGlwYm9hcmQgQ29udGVudHMKLQotYWN0aW9uLmRlbGV0ZS5sYWJlbD1EZWxldGUKLWFjdGlvbi5kZWxldGUudG9vbHRpcD1EZWxldGUgQ3VycmVudCBUZXh0IFNlbGVjdGlvbgotCi1hY3Rpb24uZmluZC5sYWJlbD1GaW5kLi4uQEN0cmwrRgotYWN0aW9uLmZpbmQudG9vbHRpcD1GaW5kIE9jY3VycmVuY2UKLQotYWN0aW9uLnNlbGVjdEFsbC5sYWJlbD1TZWxlY3QgQWxsQEN0cmwrQQotYWN0aW9uLnNlbGVjdEFsbC50b29sdGlwPVNlbGVjdCBBbGwgQ2hhbmdlcwotCi1hY3Rpb24uc2F2ZS5sYWJlbD1TYXZlQEN0cmwrUwotYWN0aW9uLnNhdmUudG9vbHRpcD1TYXZlIENoYW5nZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9jb250ZW50bWVyZ2V2aWV3ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYwNmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2NvbnRlbnRtZXJnZXZpZXdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luTlQ7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVN1cHBvcnQgZm9yIGNvbXBhcmUgYW5kIG1lcmdlIHZpZXdlcnMgd2hpY2ggc2hvdyB0aGUKLWNvbnRlbnQgc2lkZS1ieS1zaWRlLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLQotVGhlIDxiPkNvbnRlbnRNZXJnZVZpZXdlcjwvYj4gaXMgYW4gYWJzdHJhY3QgY29tcGFyZSBhbmQgbWVyZ2Ugdmlld2VyCi13aXRoIHR3byBzaWRlLWJ5LXNpZGUgY29udGVudCBhcmVhcyBhbmQgYW4gb3B0aW9uYWwgY29udGVudCBhcmVhIGZvciBhCi1jb21tb24gYW5jZXN0b3IgKGZvciB0aHJlZS13YXkgY29tcGFyZSkuIEJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uIG1ha2VzCi1ubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY29udGVudCB0eXBlIGl0IGlzIGEgc3ViY2xhc3MgcmVzcG9uc2liaWxpdHkgdG8KLWRlYWwgd2l0aCBhIHNwZWNpZmljIHR5cGUuIEl0cyBzdWJjbGFzcyA8Yj5JbWFnZU1lcmdlVmlld2VyPC9iPiBpbgotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsIHNob3dzIGhvdyB0byBiYXNlIGEgc2ltcGxlCi1tZXJnZXZpZXdlciBmb3IgaW1hZ2VzIG9uIDxiPkNvbnRlbnRNZXJnZVZpZXdlcjwvYj4uCi08cD4KLQotQSA8Yj5Db250ZW50TWVyZ2VWaWV3ZXI8L2I+IGFjY2Vzc2VzIGl0cyBtb2RlbCBieSBtZWFucyBvZiBhIGNvbnRlbnQKLXByb3ZpZGVyIHdoaWNoIG11c3QgaW1wbGVtZW50IHRoZSA8Yj5JTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXI8L2I+IGludGVyZmFjZS4KLTxwPgotCi1UaGUgPGI+VGV4dE1lcmdlVmlld2VyPC9iPiBpcyB0aGUgc3RhbmRhcmQgY29uY3JldGUgc3ViY2xhc3Mgb2YKLTxiPkNvbnRlbnRNZXJnZVZpZXdlcjwvYj4gZm9yIGNvbXBhcmluZyBhbmQgbWVyZ2luZyB0ZXh0IGNvbnRlbnQuCi08YnI+Ci1BIHRleHQgbWVyZ2Ugdmlld2VyIHVzZXMgdGhlIDxiPm9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5SYW5nZURpZmZlcmVuY2VyPC9iPgotdG8gcGVyZm9ybSBhIHRleHR1YWwsIGxpbmUtYnktbGluZSBjb21wYXJpc29uIG9mIHR3byAob3IgdGhyZWUpIGlucHV0IGRvY3VtZW50cy4KLUZvciB0ZXh0IGxpbmVzIHRoYXQgZGlmZmVyIHRoZSA8Yj5UZXh0TWVyZ2VWaWV3ZXI8L2I+IHVzZXMgYW4gPGI+SVRva2VuQ29tcGFyYXRvcjwvYj4KLXRvIGZpbmQgbG9uZ2VzdCBzZXF1ZW5jZXMgb2YgbWF0Y2hpbmcgYW5kIG5vbi1tYXRjaGluZyB0b2tlbnMuCi1UaGUgPGI+VGV4dE1lcmdlVmlld2VyPC9iPidzCi1kZWZhdWx0IHRva2VuIGNvbXBhcmUgd29ya3Mgb24gY2hhcmFjdGVycyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gSWYgYQotZGlmZmVyZW50IHN0cmF0ZWd5IGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUsIEphdmEgdG9rZW5zIGluIGEgSmF2YS1hd2FyZQotbWVyZ2Ugdmlld2VyKSwgY2xpZW50cyBjYW4gY3JlYXRlIHRoZWlyIG93biB0b2tlbiBjb21wYXJhdG9ycyBieSBpbXBsZW1lbnRpbmcKLXRoZSA8Yj5JVG9rZW5Db21wYXJhdG9yPC9iPiBpbnRlcmZhY2UuCi08cD5UaGUgPGI+VGV4dE1lcmdlVmlld2VyPC9iPiBub3Qgb25seSB3b3JrcyBvbiB3aG9sZSBkb2N1bWVudHMgYnV0IG9uCi1zdWJyYW5nZXMgb2YgZG9jdW1lbnRzIHRvby4gSW4gdGhpcyBjYXNlIHRoZSB2aWV3ZXIncyBpbnB1dCBtdXN0IGJlIGFuCi08Yj5JRG9jdW1lbnRSYW5nZTwvYj4gaW5zdGVhZCBvZiBhbiA8Yj5JRG9jdW1lbnQ8L2I+LgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BYnN0cmFjdFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWJzdHJhY3RWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiZDI1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BYnN0cmFjdFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Vmlld2VyIGV4dGVuZHMgVmlld2VyIHsKLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzLCBib29sZWFuIHJldmVhbCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BZGRGcm9tSGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMTg1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BZGRGcm9tSGlzdG9yeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRGcm9tSGlzdG9yeUFjdGlvbiBleHRlbmRzIEJhc2VDb21wYXJlQWN0aW9uIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUU9ICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkFkZEZyb21IaXN0b3J5QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEFkZEZyb21IaXN0b3J5QWN0aW9uKCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gVXRpbGl0aWVzLmdldFJlc291cmNlcyhzZWxlY3Rpb24pLmxlbmd0aCA9PSAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJU3RyaW5nIHRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlTaGVsbCBwYXJlbnRTaGVsbD0gQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCk7Ci0JCUFkZEZyb21IaXN0b3J5RGlhbG9nIGRpYWxvZz0gbnVsbDsKLQotCQlPYmplY3RbXSBzPSBVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKHNlbGVjdGlvbik7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG89IHNbaV07Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lcj0gKElDb250YWluZXIpIG87Ci0JCQkJCi0JCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtZGlhbG9nPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHBhcmVudFNoZWxsKTsJCi0JCQkJSVByb2dyZXNzTW9uaXRvciBwbT0gcG1kaWFsb2cuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJSUZpbGVbXSBzdGF0ZXM9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RhdGVzPSBjb250YWluZXIuZmluZERlbGV0ZWRNZW1iZXJzV2l0aEhpc3RvcnkoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBwbSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlwbS5kb25lKCk7Ci0JCQkJfQotCQkKLQkJCQlpZiAoc3RhdGVzID09IG51bGwgfHwgc3RhdGVzLmxlbmd0aCA8PSAwKSB7Ci0JCQkJCVN0cmluZyBtc2c9IFV0aWxpdGllcy5nZXRTdHJpbmcoYnVuZGxlLCAibm9Mb2NhbEhpc3RvcnlFcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcmVudFNoZWxsLCB0aXRsZSwgbXNnKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCi0JCQkJaWYgKGRpYWxvZyA9PSBudWxsKSB7Ci0JCQkJCWRpYWxvZz0gbmV3IEFkZEZyb21IaXN0b3J5RGlhbG9nKHBhcmVudFNoZWxsLCBidW5kbGUpOwotCQkJCQlkaWFsb2cuc2V0SGVscENvbnRleHRJZChJQ29tcGFyZUNvbnRleHRJZHMuQUREX0ZST01fSElTVE9SWV9ESUFMT0cpOwotCQkJCX0KLQkJCQkJCi0JCQkJaWYgKGRpYWxvZy5zZWxlY3QoY29udGFpbmVyLCBzdGF0ZXMpKSB7CQkKLQkJCQkJCQkKLQkJCQkJQWRkRnJvbUhpc3RvcnlEaWFsb2cuSGlzdG9yeUlucHV0W10gc2VsZWN0ZWQ9IGRpYWxvZy5nZXRTZWxlY3RlZCgpOwkJCQkKLQotCQkJCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7CQotCQkJCQkJdHJ5IHsKLQkJCQkJCQl1cGRhdGVXb3Jrc3BhY2UoYnVuZGxlLCBwYXJlbnRTaGVsbCwgc2VsZWN0ZWQpOwotCQotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24geCkgewotCQkJCQkJCS8vIERvIG5vdGhpbmcuIE9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCBieSB1c2VyLgotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkJU3RyaW5nIHJlYXNvbj0geC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocGFyZW50U2hlbGwsIHRpdGxlLCBVdGlsaXRpZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKGJ1bmRsZSwgInJlcGxhY2VFcnJvciIsIHJlYXNvbikpOwkvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBjcmVhdGVDb250YWluZXJzKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIGNvbnRhaW5lcj0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQlJRm9sZGVyIHBhcmVudD0gKElGb2xkZXIpIGNvbnRhaW5lcjsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJY3JlYXRlQ29udGFpbmVycyhwYXJlbnQpOwotCQkJCXBhcmVudC5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVXb3Jrc3BhY2UoZmluYWwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTaGVsbCBzaGVsbCwKLQkJCQkJZmluYWwgQWRkRnJvbUhpc3RvcnlEaWFsb2cuSGlzdG9yeUlucHV0W10gc2VsZWN0ZWQpCi0JCQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbj0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyB0YXNrTmFtZT0gVXRpbGl0aWVzLmdldFN0cmluZyhidW5kbGUsICJ0YXNrTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXBtLmJlZ2luVGFzayh0YXNrTmFtZSwgc2VsZWN0ZWQubGVuZ3RoKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCQkJSUZpbGUgZmlsZT0gc2VsZWN0ZWRbaV0uZkZpbGU7Ci0JCQkJCQlJRmlsZVN0YXRlIGZpbGVTdGF0ZT0gc2VsZWN0ZWRbaV0uZkZpbGVTdGF0ZTsKLQkJCQkJCWNyZWF0ZUNvbnRhaW5lcnMoZmlsZSk7Ci0JCQkJCQkKLQkJCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZmlsZS5jcmVhdGUoZmlsZVN0YXRlLmdldENvbnRlbnRzKCksIGZhbHNlLCBzdWJNb25pdG9yKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcG0uZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbWRpYWxvZz0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7CQkJCQotCQlwbWRpYWxvZy5ydW4oZmFsc2UsIHRydWUsIG9wZXJhdGlvbik7CQkJCQkJCQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlBY3Rpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0FkZEZyb21IaXN0b3J5QWN0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDU1MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlBY3Rpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBAKCMpQWRkRnJvbUhpc3RvcnlBY3Rpb24ucHJvcGVydGllcwotIwotIyBSZXNvdXJjZXMgZm9yIEFkZEZyb21IaXN0b3J5QWN0aW9uLmphdmEKLQotdGl0bGU9IFJlc3RvcmUgZnJvbSBMb2NhbCBIaXN0b3J5Ci0KLW1lbWJlclBhbmVUaXRsZT0gezB9IC0gQXZhaWxhYmxlIEZpbGVzIGluIExvY2FsIEhpc3Rvcnk6Ci0KLXRyZWVUaXRsZUZvcm1hdD0gTG9jYWwgSGlzdG9yeSBvZiAnJ3swfScnCi1kYXRlSWNvbj0gb2JqMTYvZGF5X29iai5naWYKLXRpbWVJY29uPSBvYmoxNi9yZXNvdXJjZV9vYmouZ2lmCi0KLW1lbWJlckRlc2NyaXB0aW9uPSBDaGVjayBmaWxlcyB0byByZXN0b3JlIGZyb20gbG9jYWwgaGlzdG9yeToKLWVkaXRpb25EZXNjcmlwdGlvbj0gU2VsZWN0IGFuIGVkaXRpb24gb2YgYSBmaWxlOgotCi10cmVlRm9ybWF0PSB7MH0KLXdvcmtzcGFjZVRyZWVGb3JtYXQ9IHswfSAoV29ya3NwYWNlIEZpbGUpCi1wYXJzZUVycm9yRm9ybWF0PSB7MH0gKFBhcnNlIEVycm9yKQotCi1lZGl0aW9uTGFiZWw9IExvY2FsIEhpc3RvcnkgKHswfSkKLXdvcmtzcGFjZUVkaXRpb25MYWJlbD0gV29ya3NwYWNlIEZpbGUKLQotdGFyZ2V0TGFiZWw9IHswfQotCi10b2RheUZvcm1hdD0gVG9kYXkgKHswfSkKLXllc3RlcmRheUZvcm1hdD0gWWVzdGVyZGF5ICh7MH0pCi1kYXlGb3JtYXQ9IHswfQotCi1idXR0b25MYWJlbD0gUmVzdG9yZQotCi1ub0xvY2FsSGlzdG9yeUVycm9yPSBObyBkZWxldGVkIHJlc291cmNlcyBpbiBsb2NhbCBoaXN0b3J5IGZvciBzZWxlY3RlZCBjb250YWluZXIuCi1yZXBsYWNlRXJyb3I9Q2Fubm90IHJlcGxhY2UgcmVzb3VyY2UgKHJlYXNvbjogezB9KS4KLQotdGFza05hbWU9UmVzdG9yaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BZGRGcm9tSGlzdG9yeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQWRkRnJvbUhpc3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5OTIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9BZGRGcm9tSGlzdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkRnJvbUhpc3RvcnlEaWFsb2cgZXh0ZW5kcyBSZXNpemFibGVEaWFsb2cgewotCQotCXN0YXRpYyBjbGFzcyBIaXN0b3J5SW5wdXQgaW1wbGVtZW50cyBJVHlwZWRFbGVtZW50LCBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciwgSU1vZGlmaWNhdGlvbkRhdGUgewotCQlJRmlsZSBmRmlsZTsKLQkJSUZpbGVTdGF0ZSBmRmlsZVN0YXRlOwotCQkKLQkJSGlzdG9yeUlucHV0KElGaWxlIGZpbGUsIElGaWxlU3RhdGUgZmlsZVN0YXRlKSB7Ci0JCQlmRmlsZT0gZmlsZTsKLQkJCWZGaWxlU3RhdGU9IGZpbGVTdGF0ZTsKLQkJfQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZkZpbGVTdGF0ZS5nZXRDb250ZW50cygpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB7Ci0JCQlTdHJpbmcgY2hhcnNldD0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY2hhcnNldD0gZkZpbGVTdGF0ZS5nZXRDaGFyc2V0KCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBmYWxsIHRocm91Z2gKLQkJCX0KLQkJCWlmIChjaGFyc2V0ID09IG51bGwpCi0JCQkJY2hhcnNldD0gVXRpbGl0aWVzLmdldENoYXJzZXQoZkZpbGUpOwotCQkJcmV0dXJuIGNoYXJzZXQ7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gZkZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBDb21wYXJlVUkuZ2V0SW1hZ2UoZkZpbGUpOwotCQl9Ci0JCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvbkRhdGUoKSB7Ci0JCQlyZXR1cm4gZkZpbGVTdGF0ZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIEZpbGVIaXN0b3J5IHsKLQkJcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQkJcHJpdmF0ZSBJRmlsZVN0YXRlW10gZlN0YXRlczsKLQkJcHJpdmF0ZSBpbnQgZlNlbGVjdGVkOwotCQkKLQkJRmlsZUhpc3RvcnkoSUZpbGUgZmlsZSkgewotCQkJZkZpbGU9IGZpbGU7Ci0JCX0KLQkJCi0JCUlGaWxlIGdldEZpbGUoKSB7Ci0JCQlyZXR1cm4gZkZpbGU7Ci0JCX0KLQkJCi0JCUlGaWxlU3RhdGVbXSBnZXRTdGF0ZXMoKSB7Ci0JCQlpZiAoZlN0YXRlcyA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZlN0YXRlcz0gZkZpbGUuZ2V0SGlzdG9yeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIE5lZWRXb3JrCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZTdGF0ZXM7Ci0JCX0KLQkJCi0JCUlGaWxlU3RhdGUgZ2V0U2VsZWN0ZWRTdGF0ZSgpIHsKLQkJCXJldHVybiBnZXRTdGF0ZXMoKVtmU2VsZWN0ZWRdOwotCQl9Ci0JCQotCQl2b2lkIHNldFNlbGVjdGVkKElGaWxlU3RhdGUgc3RhdGUpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmU3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZTdGF0ZXNbaV0gPT0gc3RhdGUpIHsKLQkJCQkJZlNlbGVjdGVkPSBpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlIaXN0b3J5SW5wdXQgZ2V0SGlzdG9yeUlucHV0KCkgewotCQkJcmV0dXJuIG5ldyBIaXN0b3J5SW5wdXQoZkZpbGUsIGdldFNlbGVjdGVkU3RhdGUoKSk7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gaXNTZWxlY3RlZChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA9PSBmU2VsZWN0ZWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbXBhcmVDb25maWd1cmF0aW9uIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEFycmF5TGlzdCBmQXJyYXlMaXN0PSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBGaWxlSGlzdG9yeSBmQ3VycmVudEZpbGVIaXN0b3J5OwotCi0JLy8gU1dUIGNvbnRyb2xzCi0JcHJpdmF0ZSBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSBmQ29udGVudFBhbmU7Ci0JcHJpdmF0ZSBCdXR0b24gZkNvbW1pdEJ1dHRvbjsKLQlwcml2YXRlIFRhYmxlIGZNZW1iZXJUYWJsZTsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJQYW5lIGZNZW1iZXJQYW5lOwotCXByaXZhdGUgVHJlZSBmRWRpdGlvblRyZWU7Ci0JcHJpdmF0ZSBDb21wYXJlVmlld2VyUGFuZSBmRWRpdGlvblBhbmU7Ci0JcHJpdmF0ZSBJbWFnZSBmRGF0ZUltYWdlOwotCXByaXZhdGUgSW1hZ2UgZlRpbWVJbWFnZTsKLQotCi0JcHVibGljIEFkZEZyb21IaXN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYnVuZGxlKTsKLQkJCQkJCi0JCVN0cmluZyBpY29uTmFtZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZGF0ZUljb24iLCAib2JqMTYvZGF5X29iai5naWYiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCUltYWdlRGVzY3JpcHRvciBpZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihpY29uTmFtZSk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJZkRhdGVJbWFnZT0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJaWNvbk5hbWU9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRpbWVJY29uIiwgIm9iajE2L3Jlc291cmNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlkPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGljb25OYW1lKTsKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlmVGltZUltYWdlPSBpZC5jcmVhdGVJbWFnZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoSUNvbnRhaW5lciByb290LCBJRmlsZVtdIGlucHV0RmlsZXMpIHsKLQkJCi0JCWNyZWF0ZSgpOwkvLyBjcmVhdGUgd2lkZ2V0cwotCQkKLQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAibWVtYmVyUGFuZVRpdGxlIik7CS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRpdGxlPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBPYmplY3RbXSB7IHJvb3QuZ2V0TmFtZSgpIH0pOwotCQlmTWVtYmVyUGFuZS5zZXRJbWFnZShDb21wYXJlVUkuZ2V0SW1hZ2Uocm9vdCkpOwotCQlmTWVtYmVyUGFuZS5zZXRUZXh0KHRpdGxlKTsKLQkJCi0JCS8vIHNvcnQgaW5wdXQgZmlsZXMKLQkJZmluYWwgaW50IGNvdW50PSBpbnB1dEZpbGVzLmxlbmd0aDsKLQkJZmluYWwgSUZpbGVbXSBmaWxlcz0gbmV3IElGaWxlW2NvdW50XTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQlmaWxlc1tpXT0gaW5wdXRGaWxlc1tpXTsKLQkJaWYgKGNvdW50ID4gMSkKLQkJCWludGVybmFsU29ydChmaWxlcywgMCwgY291bnQtMSk7Ci0JCQkKLQkJCi0JCVN0cmluZyBwcmVmaXg9IHJvb3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkKLQkJaWYgKGZNZW1iZXJUYWJsZSAhPSBudWxsICYmICFmTWVtYmVyVGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmlsZSBmaWxlPSBmaWxlc1tpXTsKLQkJCQlTdHJpbmcgcGF0aD0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKHBhdGguc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCQlwYXRoPSBwYXRoLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkrMSk7Ci0JCQkJVGFibGVJdGVtIHRpPSBuZXcgVGFibGVJdGVtKGZNZW1iZXJUYWJsZSwgU1dULk5PTkUpOwotCQkJCXRpLnNldEltYWdlKENvbXBhcmVVSS5nZXRJbWFnZShmaWxlKSk7Ci0JCQkJdGkuc2V0VGV4dChwYXRoKTsKLQkJCQl0aS5zZXREYXRhKG5ldyBGaWxlSGlzdG9yeShmaWxlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCW9wZW4oKTsKLQkJCi0JCXJldHVybiAoZ2V0UmV0dXJuQ29kZSgpID09IE9LKSAmJiAoZkFycmF5TGlzdC5zaXplKCkgPiAwKTsKLQl9Ci0JCQotCUhpc3RvcnlJbnB1dFtdIGdldFNlbGVjdGVkKCkgewotCQlIaXN0b3J5SW5wdXRbXSBzZWxlY3RlZD0gbmV3IEhpc3RvcnlJbnB1dFtmQXJyYXlMaXN0LnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ZXI9IGZBcnJheUxpc3QuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaT0gMDsgaXRlci5oYXNOZXh0KCk7IGkrKykgewotCQkJRmlsZUhpc3RvcnkgaD0gKEZpbGVIaXN0b3J5KSBpdGVyLm5leHQoKTsKLQkJCXNlbGVjdGVkW2ldPSBoLmdldEhpc3RvcnlJbnB1dCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCQkJCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudDIpIHsKLQkJCi0JCUNvbXBvc2l0ZSBwYXJlbnQ9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50Mik7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgInRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlvcmcuZWNsaXBzZS5jb21wYXJlLlNwbGl0dGVyIHZzcGxpdHRlcj0gbmV3IG9yZy5lY2xpcHNlLmNvbXBhcmUuU3BsaXR0ZXIocGFyZW50LCAgU1dULlZFUlRJQ0FMKTsKLQkJdnNwbGl0dGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0KLQkJdnNwbGl0dGVyLmFkZERpc3Bvc2VMaXN0ZW5lcigKLQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGZEYXRlSW1hZ2UgIT0gbnVsbCkKLQkJCQkJCWZEYXRlSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlpZiAoZlRpbWVJbWFnZSAhPSBudWxsKQotCQkJCQkJZlRpbWVJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJLy8gd2UgbmVlZCB0d28gcGFuZXM6IHRoZSBsZWZ0IGZvciB0aGUgZWxlbWVudHMsIHRoZSByaWdodCBvbmUgZm9yIHRoZSBlZGl0aW9ucwotCQlTcGxpdHRlciBoc3BsaXR0ZXI9IG5ldyBTcGxpdHRlcih2c3BsaXR0ZXIsICBTV1QuSE9SSVpPTlRBTCk7Ci0JCQotCQlDb21wb3NpdGUgYz0gbmV3IENvbXBvc2l0ZShoc3BsaXR0ZXIsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZz0gMjsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDE7Ci0JCWMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUxhYmVsIGwxPSBuZXcgTGFiZWwoYywgU1dULk5PTkUpOwotCQlsMS5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgIm1lbWJlckRlc2NyaXB0aW9uIikpOwkvLyROT04tTkxTLTEkCi0JCWZNZW1iZXJQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclBhbmUoYywgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZk1lbWJlclBhbmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZk1lbWJlclRhYmxlPSBuZXcgVGFibGUoZk1lbWJlclBhbmUsIFNXVC5DSEVDSyB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWZNZW1iZXJUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5DSEVDSykgewotCQkJCQkJaWYgKGUuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCQkJCVRhYmxlSXRlbSB0aT0gKFRhYmxlSXRlbSkgZS5pdGVtOwotCQkJCQkJCWlmICh0aS5nZXRDaGVja2VkKCkpCi0JCQkJCQkJCWZBcnJheUxpc3QuYWRkKHRpLmdldERhdGEoKSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlmQXJyYXlMaXN0LnJlbW92ZSh0aS5nZXREYXRhKCkpOwotCQkJCQkJCQkKLQkJCQkJCQlpZiAoZkNvbW1pdEJ1dHRvbiAhPSBudWxsKQotCQkJCQkJCQlmQ29tbWl0QnV0dG9uLnNldEVuYWJsZWQoZkFycmF5TGlzdC5zaXplKCkgPiAwKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWhhbmRsZU1lbWJlclNlbGVjdChlLml0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkpOwotCQkJCQotCQlmTWVtYmVyUGFuZS5zZXRDb250ZW50KGZNZW1iZXJUYWJsZSk7Ci0JCQotCQljPSBuZXcgQ29tcG9zaXRlKGhzcGxpdHRlciwgU1dULk5PTkUpOwotCQlsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZz0gMjsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDE7Ci0JCWMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUxhYmVsIGwyPSBuZXcgTGFiZWwoYywgU1dULk5PTkUpOwotCQlsMi5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImVkaXRpb25EZXNjcmlwdGlvbiIpKTsJLy8kTk9OLU5MUy0xJAotCQlmRWRpdGlvblBhbmU9IG5ldyBDb21wYXJlVmlld2VyUGFuZShjLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlmRWRpdGlvblBhbmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlmRWRpdGlvblRyZWU9IG5ldyBUcmVlKGZFZGl0aW9uUGFuZSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJZkVkaXRpb25UcmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlmZWVkQ29udGVudChlLml0ZW0pOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZkVkaXRpb25QYW5lLnNldENvbnRlbnQoZkVkaXRpb25UcmVlKTsJCQotCQkKLQkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7IC8vIHRvIGF2b2lkIGFwcGx5aW5nIGZvbnQgdG8gY29tcGFyZSB2aWV3ZXIKLQkJZkNvbnRlbnRQYW5lPSBuZXcgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUodnNwbGl0dGVyLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpIHsKLQkJCXByb3RlY3RlZCBWaWV3ZXIgZ2V0Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIE9iamVjdCBpbnB1dCkgewotCQkJCXJldHVybiBDb21wYXJlVUkuZmluZENvbnRlbnRWaWV3ZXIob2xkVmlld2VyLCBpbnB1dCwgdGhpcywgZkNvbXBhcmVDb25maWd1cmF0aW9uKTsJCi0JCQl9Ci0JCX07Ci0JCXZzcGxpdHRlci5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDMwLCA3MCB9KTsKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCS8qCi0JICogRmVlZHMgc2VsZWN0aW9uIGZyb20gbWVtYmVyIHZpZXdlciB0byBlZGl0aW9uIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlTWVtYmVyU2VsZWN0KFdpZGdldCB3KSB7Ci0JCU9iamVjdCBkYXRhPSBudWxsOwotCQlpZiAodyAhPSBudWxsKQotCQkJZGF0YT0gdy5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgRmlsZUhpc3RvcnkpIHsKLQkJCQotCQkJRmlsZUhpc3RvcnkgaD0gKEZpbGVIaXN0b3J5KSBkYXRhOwotCQkJZkN1cnJlbnRGaWxlSGlzdG9yeT0gaDsKLQkJCQotCQkJSUZpbGUgZmlsZT0gaC5nZXRGaWxlKCk7Ci0JCQlJRmlsZVN0YXRlW10gc3RhdGVzPSBoLmdldFN0YXRlcygpOwotCQkJCi0JCQlmRWRpdGlvblBhbmUuc2V0SW1hZ2UoQ29tcGFyZVVJLmdldEltYWdlKGZpbGUpKTsKLQkJCVN0cmluZyBwYXR0ZXJuPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0cmVlVGl0bGVGb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRpdGxlPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBuZXcgT2JqZWN0W10geyBmaWxlLmdldE5hbWUoKSB9KTsKLQkJCWZFZGl0aW9uUGFuZS5zZXRUZXh0KHRpdGxlKTsKLQkJCQotCQkJaWYgKGZFZGl0aW9uVHJlZSAhPSBudWxsKSB7Ci0JCQkJZkVkaXRpb25UcmVlLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJZkVkaXRpb25UcmVlLnJlbW92ZUFsbCgpOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYWRkRWRpdGlvbihuZXcgSGlzdG9yeUlucHV0KGZpbGUsIHN0YXRlc1tpXSksIGguaXNTZWxlY3RlZChpKSk7Ci0JCQkJfQotCQkJCWZFZGl0aW9uVHJlZS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZkN1cnJlbnRGaWxlSGlzdG9yeT0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBBZGRzIHRoZSBnaXZlbiBQYWlyIHRvIHRoZSBlZGl0aW9uIHRyZWUuCi0JICogSXQgdGFrZXMgY2FyZSBvZiBjcmVhdGluZyB0cmVlIG5vZGVzIGZvciBkaWZmZXJlbnQgZGF0ZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRpb24oSGlzdG9yeUlucHV0IGlucHV0LCBib29sZWFuIGlzU2VsZWN0ZWQpIHsKLQkJaWYgKGZFZGl0aW9uVHJlZSA9PSBudWxsIHx8IGZFZGl0aW9uVHJlZS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJRmlsZVN0YXRlIHN0YXRlPSBpbnB1dC5mRmlsZVN0YXRlOwotCQkKLQkJLy8gZmluZCBsYXN0IGRheQotCQlUcmVlSXRlbVtdIGRheXM9IGZFZGl0aW9uVHJlZS5nZXRJdGVtcygpOwotCQlUcmVlSXRlbSBsYXN0RGF5PSBudWxsOwotCQlpZiAoZGF5cy5sZW5ndGggPiAwKQotCQkJbGFzdERheT0gZGF5c1tkYXlzLmxlbmd0aC0xXTsKLQkJCQkJCQotCQlsb25nIGxkYXRlPSBzdGF0ZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7CQkKLQkJbG9uZyBkYXk9IGRheU51bWJlcihsZGF0ZSk7Ci0JCURhdGUgZGF0ZT0gbmV3IERhdGUobGRhdGUpOwotCQlpZiAobGFzdERheSA9PSBudWxsIHx8IGRheSAhPSBkYXlOdW1iZXIoKChEYXRlKWxhc3REYXkuZ2V0RGF0YSgpKS5nZXRUaW1lKCkpKSB7Ci0JCQlsYXN0RGF5PSBuZXcgVHJlZUl0ZW0oZkVkaXRpb25UcmVlLCBTV1QuTk9ORSk7Ci0JCQlsYXN0RGF5LnNldEltYWdlKGZEYXRlSW1hZ2UpOwotCQkJU3RyaW5nIGRmPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdChkYXRlKTsKLQkJCWxvbmcgdG9kYXk9IGRheU51bWJlcihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkKLQkJCVN0cmluZyBmb3JtYXRLZXk7Ci0JCQlpZiAoZGF5ID09IHRvZGF5KQotCQkJCWZvcm1hdEtleT0gInRvZGF5Rm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoZGF5ID09IHRvZGF5LTEpCi0JCQkJZm9ybWF0S2V5PSAieWVzdGVyZGF5Rm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWZvcm1hdEtleT0gImRheUZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwYXR0ZXJuPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsIGZvcm1hdEtleSk7Ci0JCQlpZiAocGF0dGVybiAhPSBudWxsKQotCQkJCWRmPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBuZXcgU3RyaW5nW10geyBkZiB9KTsKLQkJCWxhc3REYXkuc2V0VGV4dChkZik7Ci0JCQlsYXN0RGF5LnNldERhdGEoZGF0ZSk7Ci0JCX0KLQkJVHJlZUl0ZW0gdGk9IG5ldyBUcmVlSXRlbShsYXN0RGF5LCBTV1QuTk9ORSk7Ci0JCXRpLnNldEltYWdlKGZUaW1lSW1hZ2UpOwotCQl0aS5zZXRUZXh0KERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpKTsKLQkJdGkuc2V0RGF0YShpbnB1dCk7Ci0KLQkJaWYgKGlzU2VsZWN0ZWQpIHsKLQkJCWxhc3REYXkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlmRWRpdGlvblRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgdGkgfSk7Ci0JCQlmZWVkQ29udGVudCh0aSk7Ci0JCX0KLQl9Ci0JCQkJCQkKLQkvKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzIHNpbmNlIEphbiAxc3QsIDE5NzAuCi0JICogVGhlIGdpdmVuIGRhdGUgaXMgY29udmVydGVkIHRvIEdNVCBhbmQgZGF5bGlnaHQgc2F2aW5nIGlzIHRha2VuIGludG8gYWNjb3VudCB0b28uCi0JICovCi0JcHJpdmF0ZSBsb25nIGRheU51bWJlcihsb25nIGRhdGUpIHsKLQkJaW50IE9ORV9EQVlfTVM9IDI0KjYwKjYwICogMTAwMDsgLy8gb25lIGRheSBpbiBtaWxsaSBzZWNvbmRzCi0JCQotCQlDYWxlbmRhciBjYWxlbmRhcj0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJbG9uZyBsb2NhbFRpbWVPZmZzZXQ9IGNhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCkgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCk7Ci0JCQotCQlyZXR1cm4gKGRhdGUgKyBsb2NhbFRpbWVPZmZzZXQpIC8gT05FX0RBWV9NUzsKLQl9Ci0JCi0JLyoKLQkgKiBGZWVkcyB0aGUgdHJlZSB2aWV3ZXIncyBzZWxlY3Rpb24gdG8gdGhlIGNvbnRlbnR2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmVlZENvbnRlbnQoV2lkZ2V0IHcpIHsKLQkJaWYgKGZDb250ZW50UGFuZSAhPSBudWxsICYmICFmQ29udGVudFBhbmUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlPYmplY3Qgbz0gdy5nZXREYXRhKCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEhpc3RvcnlJbnB1dCkgewotCQkJCUhpc3RvcnlJbnB1dCBzZWxlY3RlZD0gKEhpc3RvcnlJbnB1dCkgbzsKLQkJCQlmQ29udGVudFBhbmUuc2V0SW5wdXQoc2VsZWN0ZWQpOwotCQkJCWZDb250ZW50UGFuZS5zZXRUZXh0KGdldEVkaXRpb25MYWJlbChzZWxlY3RlZCkpOwotCQkJCWZDb250ZW50UGFuZS5zZXRJbWFnZShmVGltZUltYWdlKTsKLQkJCQkKLQkJCQlpZiAoZkN1cnJlbnRGaWxlSGlzdG9yeSAhPSBudWxsKQotCQkJCQlmQ3VycmVudEZpbGVIaXN0b3J5LnNldFNlbGVjdGVkKHNlbGVjdGVkLmZGaWxlU3RhdGUpOwotCQkJfSBlbHNlIHsKLQkJCQlmQ29udGVudFBhbmUuc2V0SW5wdXQobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0aW9uTGFiZWwoSGlzdG9yeUlucHV0IGlucHV0KSB7Ci0JCVN0cmluZyBmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImhpc3RvcnlFZGl0aW9uTGFiZWwiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImVkaXRpb25MYWJlbCIpOwkvLyROT04tTkxTLTEkCi0JCWlmIChmb3JtYXQgPT0gbnVsbCkKLQkJCWZvcm1hdD0gInh7MH0iOwkvLyROT04tTkxTLTEkCi0JCQotCQlsb25nIG1vZERhdGU9IGlucHV0LmdldE1vZGlmaWNhdGlvbkRhdGUoKTsKLQkJU3RyaW5nIGRhdGU9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpLmZvcm1hdChuZXcgRGF0ZShtb2REYXRlKSk7Ci0JCQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyBkYXRlIH0pOwotCX0KLQkJCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgYnV0dG9uTGFiZWw9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImJ1dHRvbkxhYmVsIiwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYSAnQ2FuY2VsJyBhbmQgYSAnQWRkJyBidXR0b24KLQkJZkNvbW1pdEJ1dHRvbj0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgYnV0dG9uTGFiZWwsIHRydWUpOwotCQlmQ29tbWl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGhuYW1lIG9mIGYxIGNvbWVzIGFmdGVyIGYyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBncmVhdGVyVGhhbihJRmlsZSBmMSwgSUZpbGUgZjIpIHsKLQkJU3RyaW5nW10gc3MxPSBmMS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRzKCk7Ci0JCVN0cmluZ1tdIHNzMj0gZjIuZ2V0RnVsbFBhdGgoKS5zZWdtZW50cygpOwotCQlpbnQgbDE9IHNzMS5sZW5ndGg7Ci0JCWludCBsMj0gc3MyLmxlbmd0aDsKLQkJaW50IG49IE1hdGgubWF4KGwxLCBsMik7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlTdHJpbmcgczE9IGkgPCBsMSA/IHNzMVtpXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgczI9IGkgPCBsMiA/IHNzMltpXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgcmM9IHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOwotCQkJaWYgKHJjICE9IDApCi0JCQkJcmV0dXJuIHJjIDwgMDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW50ZXJuYWxTb3J0KElGaWxlW10ga2V5cywgaW50IGxlZnQsIGludCByaWdodCkgeyAKLQkKLQkJaW50IG9yaWdpbmFsX2xlZnQ9IGxlZnQ7Ci0JCWludCBvcmlnaW5hbF9yaWdodD0gcmlnaHQ7Ci0JCQotCQlJRmlsZSBtaWQ9IGtleXNbKGxlZnQgKyByaWdodCkgLyAyXTsgCi0JCWRvIHsgCi0JCQl3aGlsZSAoZ3JlYXRlclRoYW4oa2V5c1tsZWZ0XSwgbWlkKSkKLQkJCQlsZWZ0Kys7IAotCQkJCi0JCQl3aGlsZSAoZ3JlYXRlclRoYW4obWlkLCBrZXlzW3JpZ2h0XSkpCi0JCQkJcmlnaHQtLTsgCi0JCQotCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsgCi0JCQkJSUZpbGUgdG1wPSBrZXlzW2xlZnRdOyAKLQkJCQlrZXlzW2xlZnRdPSBrZXlzW3JpZ2h0XTsgCi0JCQkJa2V5c1tyaWdodF09IHRtcDsJCQkKLQkJCQlsZWZ0Kys7IAotCQkJCXJpZ2h0LS07IAotCQkJfSAKLQkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0JCQotCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KQotCQkJaW50ZXJuYWxTb3J0KGtleXMsIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsgCi0JCQotCQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KQotCQkJaW50ZXJuYWxTb3J0KGtleXMsIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmFzZUNvbXBhcmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0Jhc2VDb21wYXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjY3ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmFzZUNvbXBhcmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbXBhcmVBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJcnVuKGZTZWxlY3Rpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbj0gc2VsZWN0aW9uOwotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQlhY3Rpb24uc2V0RW5hYmxlZChpc0VuYWJsZWQoZlNlbGVjdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU3MTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0JpbmFyeUNvbXBhcmVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSUNvbXBhcmVJbnB1dDsKLQotLyoqCi0gKiBBIHNpbXBsZSBjb21wYXJlIHZpZXdlciBmb3IgYmluYXJ5IGZpbGVzLgotICogU2hvd3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBub24tbWF0Y2hpbmcgYnl0ZS4KLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUNvbXBhcmVWaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdFZpZXdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUU9ICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkJpbmFyeUNvbXBhcmVWaWV3ZXJSZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU9GPSAtMTsKLQlwcml2YXRlIExhYmVsIGZDb250cm9sOwotCXByaXZhdGUgSUNvbXBhcmVJbnB1dCBmSW5wdXQ7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmQnVuZGxlOwotCXByaXZhdGUgYm9vbGVhbiBmTGVmdElzTG9jYWw7Ci0JCi0JCi0JcHVibGljIEJpbmFyeUNvbXBhcmVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MpIHsKLQkJCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIElDb21wYXJlQ29udGV4dElkcy5CSU5BUllfQ09NUEFSRV9WSUVXKTsKLQotCQlmQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JCWZDb250cm9sPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWZDb250cm9sLnNldERhdGEoQ29tcGFyZVVJLkNPTVBBUkVfVklFV0VSX1RJVExFLCBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJ0aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZkxlZnRJc0xvY2FsPSBVdGlsaXRpZXMuZ2V0Qm9vbGVhbihjYywgIkxFRlRfSVNfTE9DQUwiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZkNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChmQ29udHJvbCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJZklucHV0PSAoSUNvbXBhcmVJbnB1dCkgaW5wdXQ7Ci0JCQkKLQkJCUlucHV0U3RyZWFtIGxlZnQ9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSByaWdodD0gbnVsbDsKLQkJCQotCQkJU3RyaW5nIG1lc3NhZ2U9IG51bGw7Ci0JCQl0cnkgewotCQkJCWxlZnQ9IGdldFN0cmVhbShmSW5wdXQuZ2V0TGVmdCgpKTsKLQkJCQlyaWdodD0gZ2V0U3RyZWFtKGZJbnB1dC5nZXRSaWdodCgpKTsKLQkJCQkKLQkJCQlpZiAobGVmdCAhPSBudWxsICYmIHJpZ2h0ICE9IG51bGwpIHsKLQkJCQkJaW50IHBvcz0gMDsKLQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCWludCBsPSBsZWZ0LnJlYWQoKTsKLQkJCQkJCWludCByPSByaWdodC5yZWFkKCk7Ci0JCQkJCQlpZiAobCAhPSByKSB7Ci0JCQkJCQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAiZGlmZk1lc3NhZ2VGb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW1lc3NhZ2U9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwb3MpIH0gKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWlmIChsID09IEVPRikKLQkJCQkJCQlicmVhazsKLQkJCQkJCXBvcysrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkZWxldGVDb25mbGljdE1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAobGVmdCA9PSBudWxsKSB7Ci0JCQkJCWlmIChmTGVmdElzTG9jYWwpCi0JCQkJCQltZXNzYWdlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkZWxldGVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImFkZGVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChyaWdodCA9PSBudWxsKSB7Ci0JCQkJCWlmIChmTGVmdElzTG9jYWwpCi0JCQkJCQltZXNzYWdlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJhZGRlZE1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbHNlCi0JCQkJCQltZXNzYWdlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJkZWxldGVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImVycm9yTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCW1lc3NhZ2U9IFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImVycm9yTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCVV0aWxpdGllcy5jbG9zZShsZWZ0KTsKLQkJCQlVdGlsaXRpZXMuY2xvc2UocmlnaHQpOwkJCQotCQkJfQotCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLQkJCQlmQ29udHJvbC5zZXRUZXh0KG1lc3NhZ2UpOwkJCQkKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oSVR5cGVkRWxlbWVudCBpbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKQotCQkJcmV0dXJuICgoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcilpbnB1dCkuZ2V0Q29udGVudHMoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0JpbmFyeUNvbXBhcmVWaWV3ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjJlMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotCi0vKioKLSAqIEEgZmFjdG9yeSBvYmplY3QgZm9yIHRoZSA8Y29kZT5CaW5hcnlDb21wYXJlVmlld2VyPC9jb2RlPi4KLSAqIFRoaXMgaW5kaXJlY3Rpb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb25seSBvYmplY3RzIHdpdGggYSBkZWZhdWx0Ci0gKiBjb25zdHJ1Y3RvciBjYW4gYmUgY3JlYXRlZCB2aWEgYW4gZXh0ZW5zaW9uIHBvaW50Ci0gKiAodGhpcyBwcmVjbHVkZXMgVmlld2VycykuCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5hcnlDb21wYXJlVmlld2VyQ3JlYXRvciBpbXBsZW1lbnRzIElWaWV3ZXJDcmVhdG9yIHsKLQotCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIG1wKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5Q29tcGFyZVZpZXdlcihwYXJlbnQsIG1wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CaW5hcnlDb21wYXJlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CaW5hcnlDb21wYXJlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjg0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQmluYXJ5Q29tcGFyZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEAoIylCaW5hcnlDb21wYXJlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKLSMKLSMgUmVzb3VyY2Ugc3RyaW5ncyBmb3IgQmluYXJ5Q29tcGFyZVZpZXdlci5qYXZhCi0KLXRpdGxlPSBCaW5hcnkgQ29tcGFyZQotCi1kaWZmTWVzc2FnZUZvcm1hdD0gRmlyc3QgYnl0ZXMgZGlmZmVyIGF0IHBvc2l0aW9uIHswfQotZGVsZXRlQ29uZmxpY3RNZXNzYWdlPSBEZWxldGUgQ29uZmxpY3QKLWFkZGVkTWVzc2FnZT0gQWRkZWQgUmVzb3VyY2UKLWRlbGV0ZWRNZXNzYWdlPSBSZW1vdmVkIFJlc291cmNlCi1lcnJvck1lc3NhZ2U9IEludGVybmFsIEVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CdWZmZXJlZENhbnZhcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQnVmZmVyZWRDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NGU4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CdWZmZXJlZENhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiBBIENhbnZhcyB3aGljaCByZWR1Y2VzIGZsaWNrZXIgYnkgZHJhd2luZyBpbiBhbiBvZmYgc2NyZWVuIGJ1ZmZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1ZmZlcmVkQ2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfRE9VQkxFX0JVRkZFUj0gISJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9ET1VCTEVfQlVGRkVSPSB0cnVlOwotCQotCS8qKiBUaGUgZHJhd2FibGUgZm9yIGRvdWJsZSBidWZmZXJpbmcgKi8KLQlJbWFnZSBmQnVmZmVyOwotCi0JcHVibGljIEJ1ZmZlcmVkQ2FudmFzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBmbGFncykgewotCQlzdXBlcihwYXJlbnQsIGZsYWdzICsgU1dULk5PX0JBQ0tHUk9VTkQpOwotCi0JCWFkZFBhaW50TGlzdGVuZXIoCi0JCQluZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCQlkb3VibGVCdWZmZXJQYWludChldmVudC5nYyk7Ci0JCQkJfQotCQkJfQotCQkpOwotCi0JCWFkZERpc3Bvc2VMaXN0ZW5lcigKLQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGZCdWZmZXIgIT0gbnVsbCkgewotCQkJCQkJZkJ1ZmZlci5kaXNwb3NlKCk7Ci0JCQkJCQlmQnVmZmVyPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGFpbnQoKSB7Ci0JCWlmICghaXNEaXNwb3NlZCgpKSB7Ci0JCQlHQyBnYz0gbmV3IEdDKHRoaXMpOwotCQkJZG91YmxlQnVmZmVyUGFpbnQoZ2MpOwotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBEb3VibGUgYnVmZmVyIGRyYXdpbmcuCi0JICovCi0Jdm9pZCBkb3VibGVCdWZmZXJQYWludChHQyBkZXN0KSB7Ci0JCQotCQlpZiAoIVVTRV9ET1VCTEVfQlVGRkVSKSB7Ci0JCQlkb1BhaW50KGRlc3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUG9pbnQgc2l6ZT0gZ2V0U2l6ZSgpOwotCi0JCWlmIChzaXplLnggPD0gMSB8fCBzaXplLnkgPD0gMSkgLy8gd2UgdGVzdCBmb3IgPD0gMSBiZWNhdXNlIG9uIFgxMSBjb250cm9scyBoYXZlIGluaXRpYWwgc2l6ZSAxLDEKLQkJCXJldHVybjsKLQotCQlpZiAoZkJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgcj0gZkJ1ZmZlci5nZXRCb3VuZHMoKTsKLQkJCWlmIChyLndpZHRoICE9IHNpemUueCB8fCByLmhlaWdodCAhPSBzaXplLnkpIHsKLQkJCQlmQnVmZmVyLmRpc3Bvc2UoKTsKLQkJCQlmQnVmZmVyPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChmQnVmZmVyID09IG51bGwpCi0JCQlmQnVmZmVyPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCBzaXplLngsIHNpemUueSk7Ci0KLQkJR0MgZ2M9IG5ldyBHQyhmQnVmZmVyKTsKLQkJdHJ5IHsKLQkJCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgc2l6ZS54LCBzaXplLnkpOwotCQkJZG9QYWludChnYyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlkZXN0LmRyYXdJbWFnZShmQnVmZmVyLCAwLCAwKTsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBkb1BhaW50KEdDIGdjKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0J1ZmZlcmVkUmVzb3VyY2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9CdWZmZXJlZFJlc291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZlNzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0J1ZmZlcmVkUmVzb3VyY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDb21wYXJhdG9yOwotCi0vKioKLSAqIEEgYnVmZmVyIGZvciBhIHdvcmtzcGFjZSByZXNvdXJjZS4KLSAqLwotcHVibGljIGNsYXNzIEJ1ZmZlcmVkUmVzb3VyY2VOb2RlIGV4dGVuZHMgUmVzb3VyY2VOb2RlIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5PSBmYWxzZTsKLQlwcml2YXRlIElGaWxlIGZEZWxldGVGaWxlOwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+UmVzb3VyY2VOb2RlPC9jb2RlPiBmb3IgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBCdWZmZXJlZFJlc291cmNlTm9kZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCX0KLQkKLSAgICAvKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYnVmZmVyIGNvbnRhaW5zIHVuY29tbWl0dGVkIGNoYW5nZXMuCi0gICAgICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkgICAgcmV0dXJuIGZEaXJ0eTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGNyZWF0ZUNoaWxkKElSZXNvdXJjZSBjaGlsZCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKGNoaWxkKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoYnl0ZVtdIGNvbnRlbnRzKSB7Ci0JCWZEaXJ0eT0gdHJ1ZTsKLQkJc3VwZXIuc2V0Q29udGVudChjb250ZW50cyk7Ci0JfQkKLQotCS8qCi0JICogQ29tbWl0cyBidWZmZXJlZCBjb250ZW50cyB0byByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkRpcnR5KSB7Ci0JCQkKLQkJCWlmIChmRGVsZXRlRmlsZSAhPSBudWxsKSB7Ci0JCQkJZkRlbGV0ZUZpbGUuZGVsZXRlKHRydWUsIHRydWUsIHBtKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0KLQkJCQlieXRlW10gYnl0ZXM9IGdldENvbnRlbnQoKTsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcz0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCQl0cnkgewotCQkJCQlJRmlsZSBmaWxlPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQkJCWZpbGUuc2V0Q29udGVudHMoaXMsIGZhbHNlLCB0cnVlLCBwbSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZpbGUuY3JlYXRlKGlzLCBmYWxzZSwgcG0pOwotCQkJCQlmRGlydHk9IGZhbHNlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcy5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCS8vIFNpbGVudGx5IGlnbm9yZWQKLQkJCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElUeXBlZEVsZW1lbnQgcmVwbGFjZShJVHlwZWRFbGVtZW50IGNoaWxkLCBJVHlwZWRFbGVtZW50IG90aGVyKSB7Ci0JCQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewkvLyBhZGQgcmVzb3VyY2UKLQkJCS8vIGNyZWF0ZSBhIG5vZGUgd2l0aG91dCBhIHJlc291cmNlIGJlaGluZCBpdCEKLQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQlJRm9sZGVyIGZvbGRlcj0gKElGb2xkZXIpIHJlc291cmNlOwotCQkJCUlGaWxlIGZpbGU9IGZvbGRlci5nZXRGaWxlKG90aGVyLmdldE5hbWUoKSk7Ci0JCQkJY2hpbGQ9IG5ldyBCdWZmZXJlZFJlc291cmNlTm9kZShmaWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG90aGVyID09IG51bGwpIHsJLy8gZGVsZXRlIHJlc291cmNlCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2U9IGdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJSUZvbGRlciBmb2xkZXI9IChJRm9sZGVyKSByZXNvdXJjZTsKLQkJCQlJRmlsZSBmaWxlPSBmb2xkZXIuZ2V0RmlsZShjaGlsZC5nZXROYW1lKCkpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCQlmRGVsZXRlRmlsZT0gZmlsZTsKLQkJCQkJZkRpcnR5PSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yICYmIGNoaWxkIGluc3RhbmNlb2YgSUVkaXRhYmxlQ29udGVudCkgewotCQkJSUVkaXRhYmxlQ29udGVudCBkc3Q9IChJRWRpdGFibGVDb250ZW50KSBjaGlsZDsKLQkJCQotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpcz0gKChJU3RyZWFtQ29udGVudEFjY2Vzc29yKW90aGVyKS5nZXRDb250ZW50cygpOwotCQkJCWJ5dGVbXSBieXRlcz0gVXRpbGl0aWVzLnJlYWRCeXRlcyhpcyk7Ci0JCQkJaWYgKGJ5dGVzICE9IG51bGwpCi0JCQkJCWRzdC5zZXRDb250ZW50KGJ5dGVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NoYW5nZVByb3BlcnR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9DaGFuZ2VQcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZkYWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NoYW5nZVByb3BlcnR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUb2dnbGVzIGEgYm9vbGVhbiBwcm9wZXJ0eSBvZiBhbiA8Y29kZT5JQ29tcGFyZUNvbmZpZ3VyYXRpb248L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlUHJvcGVydHlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZlByb3BlcnR5S2V5OwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZkJ1bmRsZTsKLQlwcml2YXRlIFN0cmluZyBmUHJlZml4OwotCi0KLQlwdWJsaWMgQ2hhbmdlUHJvcGVydHlBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjYywgU3RyaW5nIHJrZXksIFN0cmluZyBwa2V5KSB7Ci0JCWZQcm9wZXJ0eUtleT0gcGtleTsKLQkJZkJ1bmRsZT0gYnVuZGxlOwotCQlmUHJlZml4PSBya2V5OwotCQlVdGlsaXRpZXMuaW5pdEFjdGlvbih0aGlzLCBmQnVuZGxlLCBmUHJlZml4KTsKLQkJc2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oY2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJYm9vbGVhbiBiPSAhVXRpbGl0aWVzLmdldEJvb2xlYW4oZkNvbXBhcmVDb25maWd1cmF0aW9uLCBmUHJvcGVydHlLZXksIGZhbHNlKTsKLQkJc2V0Q2hlY2tlZChiKTsKLQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiAhPSBudWxsKQotCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KGZQcm9wZXJ0eUtleSwgbmV3IEJvb2xlYW4oYikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBzdGF0ZSkgewotCQlzdXBlci5zZXRDaGVja2VkKHN0YXRlKTsKLQkJVXRpbGl0aWVzLmluaXRUb2dnbGVBY3Rpb24odGhpcywgZkJ1bmRsZSwgZlByZWZpeCwgc3RhdGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJlQ29uZmlndXJhdGlvbihDb21wYXJlQ29uZmlndXJhdGlvbiBjYykgewotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb249IGNjOwotCQlzZXRDaGVja2VkKFV0aWxpdGllcy5nZXRCb29sZWFuKGZDb21wYXJlQ29uZmlndXJhdGlvbiwgZlByb3BlcnR5S2V5LCBmYWxzZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOTQ4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZVVJOwotCi0KLS8qCi0gKiBUaGUgIkNvbXBhcmUgd2l0aCBlYWNoIG90aGVyIiBhY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVBY3Rpb24gZXh0ZW5kcyBCYXNlQ29tcGFyZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIFJlc291cmNlQ29tcGFyZUlucHV0IGZJbnB1dDsKLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGZXb3JrYmVuY2hQYWdlOwotCi0KLQlwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZJbnB1dCAhPSBudWxsKSB7Ci0JCQlmSW5wdXQuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQlmSW5wdXQuaW5pdGlhbGl6ZUNvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCQlDb21wYXJlVUkub3BlbkNvbXBhcmVFZGl0b3JPblBhZ2UoZklucHV0LCBmV29ya2JlbmNoUGFnZSk7Ci0JCQlmSW5wdXQ9IG51bGw7CS8vIGRvbid0IHJldXNlIHRoaXMgaW5wdXQhCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZJbnB1dCA9PSBudWxsKSB7Ci0JCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYz0gbmV3IENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCQkvLyBidWZmZXJlZCBtZXJnZSBtb2RlOiBkb24ndCBhc2sgZm9yIGNvbmZpcm1hdGlvbgotCQkJLy8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBtb2RpZmllZCByZXNvdXJjZXMKLQkJCWNjLnNldFByb3BlcnR5KENvbXBhcmVFZGl0b3IuQ09ORklSTV9TQVZFX1BST1BFUlRZLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJCi0JCQkvLyB1bmNvbW1lbnQgZm9sbG93aW5nIGxpbmUgdG8gaGF2ZSBzZXBhcmF0ZSBvdXRsaW5lIHZpZXcKLQkJCS8vY2Muc2V0UHJvcGVydHkoQ29tcGFyZUNvbmZpZ3VyYXRpb24uVVNFX09VVExJTkVfVklFVywgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCQkJCi0JCQlmSW5wdXQ9IG5ldyBSZXNvdXJjZUNvbXBhcmVJbnB1dChjYyk7Ci0JCX0KLQkJcmV0dXJuIGZJbnB1dC5pc0VuYWJsZWQoc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCWZXb3JrYmVuY2hQYWdlPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYwODA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGFyZURpYWxvZyBleHRlbmRzIFJlc2l6YWJsZURpYWxvZyBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JcHJpdmF0ZSBDb21wYXJlRWRpdG9ySW5wdXQgZkNvbXBhcmVFZGl0b3JJbnB1dDsKLQlwcml2YXRlIEJ1dHRvbiBmQ29tbWl0QnV0dG9uOwotCi0KLQlDb21wYXJlRGlhbG9nKFNoZWxsIHNoZWxsLCBDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIoc2hlbGwsIG51bGwpOwotCQkKLQkJQXNzZXJ0LmlzTm90TnVsbChpbnB1dCk7Ci0JCWZDb21wYXJlRWRpdG9ySW5wdXQ9IGlucHV0OwotCQlmQ29tcGFyZUVkaXRvcklucHV0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXNldEhlbHBDb250ZXh0SWQoSUNvbXBhcmVDb250ZXh0SWRzLkNPTVBBUkVfRElBTE9HKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChzdXBlci5jbG9zZSgpKSB7Ci0JCQlpZiAoZkNvbXBhcmVFZGl0b3JJbnB1dCAhPSBudWxsKQotCQkJCWZDb21wYXJlRWRpdG9ySW5wdXQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZDb21taXRCdXR0b249IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVEaWFsb2cuY29tbWl0QWN0aW9uLmxhYmVsIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZDb21taXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZDb21taXRCdXR0b24gIT0gbnVsbCAmJiBmQ29tcGFyZUVkaXRvcklucHV0ICE9IG51bGwpCi0JCQlmQ29tbWl0QnV0dG9uLnNldEVuYWJsZWQoZkNvbXBhcmVFZGl0b3JJbnB1dC5pc1NhdmVOZWVkZWQoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudDIpIHsKLQkJCQkJCQotCQlDb21wb3NpdGUgcGFyZW50PSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudDIpOwotCi0JCUNvbnRyb2wgYz0gZkNvbXBhcmVFZGl0b3JJbnB1dC5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQljLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJU2hlbGwgc2hlbGw9IGMuZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0VGV4dChmQ29tcGFyZUVkaXRvcklucHV0LmdldFRpdGxlKCkpOwotCQlzaGVsbC5zZXRJbWFnZShmQ29tcGFyZUVkaXRvcklucHV0LmdldFRpdGxlSW1hZ2UoKSk7Ci0JCWFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0JICovCi0JcHVibGljIGludCBvcGVuKCkgewotCQkKLQkJaW50IHJjPSBzdXBlci5vcGVuKCk7Ci0JCQotCQlpZiAocmMgPT0gT0sgJiYgZkNvbXBhcmVFZGl0b3JJbnB1dC5pc1NhdmVOZWVkZWQoKSkgewotCQkJCQkJCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlmQ29tcGFyZUVkaXRvcklucHV0LnNhdmVDaGFuZ2VzKHBtKTsKLQkJCQl9Ci0JCQl9OwotCQkJCQkJCi0JCQlTaGVsbCBzaGVsbD0gZ2V0UGFyZW50U2hlbGwoKTsKLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbWQ9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwkJCQkKLQkJCXRyeSB7Ci0JCQkJb3BlcmF0aW9uLnJ1bihwbWQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwkJCQkKLQkJCQkKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24geCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHgpIHsKLQkJCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVEaWFsb2cuc2F2ZUVycm9yVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtc2c9IFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVEaWFsb2cuc2F2ZUVycm9yTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2cgKyB4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjhjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotCi0KLS8qKgotICogQSBDb21wYXJlRWRpdG9yIHRha2VzIGEgSUNvbXBhcmVFZGl0b3JJbnB1dCBhcyBpbnB1dC4KLSAqIE1vc3QgZnVuY3Rpb25hbGl0eSBpcyBkZWxlZ2F0ZWQgdG8gdGhlIElDb21wYXJlRWRpdG9ySW5wdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXJlRWRpdG9yIGV4dGVuZHMgRWRpdG9yUGFydCBpbXBsZW1lbnRzIElSZXVzYWJsZUVkaXRvciB7Ci0JCi0JLyoqCi0JICogSW50ZXJuYWwgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZvciBoYW5kbGluZyBjaGFuZ2VzIGluIHRoZSBlZGl0b3IncyBpbnB1dC4KLQkgKi8KLQljbGFzcyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkvKgotCQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUNvbXBhcmVFZGl0b3IudGhpcy5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05GSVJNX1NBVkVfUFJPUEVSVFk9ICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNPTkZJUk1fU0FWRV9QUk9QRVJUWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElBY3Rpb25CYXJzIGZBY3Rpb25CYXJzOwotCS8qKiBUaGUgZWRpdG9yJ3MgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyLiAqLwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JLyoqIHRoZSBTV1QgY29udHJvbCAqLwotCXByaXZhdGUgQ29udHJvbCBmQ29udHJvbDsKLQkvKiogdGhlIG91dGxpbmUgcGFnZSAqLwotCXByaXZhdGUgQ29tcGFyZU91dGxpbmVQYWdlIGZPdXRsaW5lUGFnZTsKLQkvKiogZW5hYmxlIG91dGxpbmUgKi8KLQkKLQkKLQlwdWJsaWMgQ29tcGFyZUVkaXRvcigpIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElBZGFwdGFibGUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCQotCQlpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgewotCQkJT2JqZWN0IG9iamVjdD0gZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShDb21wYXJlQ29uZmlndXJhdGlvbi5VU0VfT1VUTElORV9WSUVXKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuICYmICgoQm9vbGVhbilvYmplY3QpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0PSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkgewotCQkJCQlmT3V0bGluZVBhZ2U9IG5ldyBDb21wYXJlT3V0bGluZVBhZ2UoKENvbXBhcmVFZGl0b3JJbnB1dCkgaW5wdXQpOwotCQkJCQlyZXR1cm4gZk91dGxpbmVQYWdlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCX0KLQkKLQkvKiBwYWNrYWdlICovIENvbXBhcmVDb25maWd1cmF0aW9uIGdldENvbXBhcmVDb25maWd1cmF0aW9uKCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkKLQkJCXJldHVybiAoKENvbXBhcmVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkJCQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQkKLQkJaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9ySW5wdXQpKQotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVFZGl0b3IuaW52YWxpZElucHV0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXRyeSB7Ci0JCQlkb1NldElucHV0KGlucHV0KTsJCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlTdHJpbmcgdGl0bGU9IFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVFZGl0b3IuZXJyb3Iuc2V0aW5wdXQudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1zZz0gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZUVkaXRvci5lcnJvci5zZXRpbnB1dC5tZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZywgeC5nZXRTdGF0dXMoKSk7Ci0JCX0JCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCi0JCWlmICghKGlucHV0IGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KSkgewotCQkJSVN0YXR1cyBzPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBsYXRmb3JtVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlRWRpdG9yLmludmFsaWRJbnB1dCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JCX0KLQotCQlJRWRpdG9ySW5wdXQgb2xkSW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElQcm9wZXJ0eUNoYW5nZU5vdGlmaWVyKQotCQkJKChJUHJvcGVydHlDaGFuZ2VOb3RpZmllcilpbnB1dCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkKLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkKLQkJQ29tcGFyZUVkaXRvcklucHV0IGNlaT0gKENvbXBhcmVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0KLQkJc2V0VGl0bGVJbWFnZShjZWkuZ2V0VGl0bGVJbWFnZSgpKTsKLQkJc2V0UGFydE5hbWUoY2VpLmdldFRpdGxlKCkpOwkvLyB3YXMgc2V0VGl0bGUoY2VpLmdldFRpdGxlKCkpOwotCQkJCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJUHJvcGVydHlDaGFuZ2VOb3RpZmllcikKLQkJCSgoSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIpaW5wdXQpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJCi0JCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoZkNvbnRyb2wgIT0gbnVsbCAmJiAhZkNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJUG9pbnQgb2xkU2l6ZT0gZkNvbnRyb2wuZ2V0U2l6ZSgpOwotCQkJCUNvbXBvc2l0ZSBwYXJlbnQ9IGZDb250cm9sLmdldFBhcmVudCgpOwotCQkJCWZDb250cm9sLmRpc3Bvc2UoKTsKLQkJCQljcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQkJCWlmIChmQ29udHJvbCAhPSBudWxsKQotCQkJCQlmQ29udHJvbC5zZXRTaXplKG9sZFNpemUpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkFjdGlvbkJhcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlmQWN0aW9uQmFycz0gYWN0aW9uQmFyczsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElEZXNrdG9wUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQuc2V0RGF0YSh0aGlzKTsKLQkJCi0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KSB7Ci0JCQlmQ29udHJvbD0gKChDb21wYXJlRWRpdG9ySW5wdXQpIGlucHV0KS5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGZDb250cm9sLCBJQ29tcGFyZUNvbnRleHRJZHMuQ09NUEFSRV9FRElUT1IpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBEZXNrdG9wUGFydCNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkKLQkJSUVkaXRvcklucHV0IGlucHV0PSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJUHJvcGVydHlDaGFuZ2VOb3RpZmllcikKLQkJCSgoSVByb3BlcnR5Q2hhbmdlTm90aWZpZXIpaW5wdXQpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJCQkJCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG51bGw7Ci0JfQotCQkJCi0JLyoKLQkgKiBAc2VlIElEZXNrdG9wUGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkKLQkJCSgoQ29tcGFyZUVkaXRvcklucHV0KWlucHV0KS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVuYXRhdGlvbgotCX0KLQkKLQkvKioKLQkgKiBBbHdheXMgdGhyb3dzIGFuIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi4KLQkgKi8KLQkvKgotCSAqIEBzZWUgSUVkaXRvclBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsgLy8gU2F2ZSBBcyBub3Qgc3VwcG9ydGVkIGZvciBDb21wYXJlRWRpdG9yCi0JfQotCQotCS8qCi0JICogQHNlZSBJRWRpdG9yUGFydCNkb1NhdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkKLQkJZmluYWwgSUVkaXRvcklucHV0IGlucHV0PSBnZXRFZGl0b3JJbnB1dCgpOwotCQkKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbj0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3JJbnB1dCkKLQkJCQkJKChDb21wYXJlRWRpdG9ySW5wdXQpaW5wdXQpLnNhdmVDaGFuZ2VzKHBtKTsKLQkJCX0KLQkJfTsKLQotCQlTaGVsbCBzaGVsbD0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQotCQl0cnkgewotCQkJCi0JCQlvcGVyYXRpb24ucnVuKHByb2dyZXNzTW9uaXRvcik7Ci0JCQkJCQkJCQkKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBOZWVkV29yawotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBOZWVkV29yawotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHgpIHsKLQkJCVN0cmluZyB0aXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZUVkaXRvci5zYXZlRXJyb3IudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHJlYXNvbj0geC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkNvbXBhcmVFZGl0b3IuY2FudFNhdmVFcnJvciIsIHJlYXNvbikpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCQkKLQkvKgotCSAqIEBzZWUgSUVkaXRvclBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0PSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9ySW5wdXQpCi0JCQlyZXR1cm4gKChDb21wYXJlRWRpdG9ySW5wdXQpaW5wdXQpLmlzU2F2ZU5lZWRlZCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG9sZF92YWx1ZT0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJT2JqZWN0IG5ld192YWx1ZT0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKG9sZF92YWx1ZSA9PSBudWxsIHx8IG5ld192YWx1ZSA9PSBudWxsIHx8ICFvbGRfdmFsdWUuZXF1YWxzKG5ld192YWx1ZSkpCi0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRWRpdG9yQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVFZGl0b3JDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTE5ODM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVFZGl0b3JDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsgCi0KLQotcHVibGljIGNsYXNzIENvbXBhcmVFZGl0b3JDb250cmlidXRvciBleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQkKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZBY3RpdmVFZGl0b3JQYXJ0PSBudWxsOwotCi0JcHJpdmF0ZSBJZ25vcmVXaGl0ZVNwYWNlQWN0aW9uIGZJZ25vcmVXaGl0ZXNwYWNlOwotCXByaXZhdGUgTmF2aWdhdGlvbkFjdGlvbiBmTmV4dDsKLQlwcml2YXRlIE5hdmlnYXRpb25BY3Rpb24gZlByZXZpb3VzOwotCQotCXByaXZhdGUgTmF2aWdhdGlvbkFjdGlvbiBmVG9vbGJhck5leHQ7Ci0JcHJpdmF0ZSBOYXZpZ2F0aW9uQWN0aW9uIGZUb29sYmFyUHJldmlvdXM7Ci0KLQotCXB1YmxpYyBDb21wYXJlRWRpdG9yQ29udHJpYnV0b3IoKSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZT0gQ29tcGFyZVVJLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCQotCQlmSWdub3JlV2hpdGVzcGFjZT0gbmV3IElnbm9yZVdoaXRlU3BhY2VBY3Rpb24oYnVuZGxlLCBudWxsKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGZJZ25vcmVXaGl0ZXNwYWNlLCBJQ29tcGFyZUNvbnRleHRJZHMuSUdOT1JFX1dISVRFU1BBQ0VfQUNUSU9OKTsKLQkJCi0JCWZOZXh0PSBuZXcgTmF2aWdhdGlvbkFjdGlvbihidW5kbGUsIHRydWUpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoZk5leHQsIElDb21wYXJlQ29udGV4dElkcy5HTE9CQUxfTkVYVF9ESUZGX0FDVElPTik7Ci0JCQotCQlmUHJldmlvdXM9IG5ldyBOYXZpZ2F0aW9uQWN0aW9uKGJ1bmRsZSwgZmFsc2UpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoZlByZXZpb3VzLCBJQ29tcGFyZUNvbnRleHRJZHMuR0xPQkFMX1BSRVZJT1VTX0RJRkZfQUNUSU9OKTsKLQkJCi0JCWZUb29sYmFyTmV4dD0gbmV3IE5hdmlnYXRpb25BY3Rpb24oYnVuZGxlLCB0cnVlKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGZUb29sYmFyTmV4dCwgSUNvbXBhcmVDb250ZXh0SWRzLk5FWFRfRElGRl9BQ1RJT04pOwotCQkKLQkJZlRvb2xiYXJQcmV2aW91cz0gbmV3IE5hdmlnYXRpb25BY3Rpb24oYnVuZGxlLCBmYWxzZSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChmVG9vbGJhclByZXZpb3VzLCBJQ29tcGFyZUNvbnRleHRJZHMuUFJFVklPVVNfRElGRl9BQ1RJT04pOwotCX0KLQotCS8qCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0Ym0pIHsKLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0Ym0uYWRkKGZJZ25vcmVXaGl0ZXNwYWNlKTsKLQkJdGJtLmFkZChmVG9vbGJhck5leHQpOwotCQl0Ym0uYWRkKGZUb29sYmFyUHJldmlvdXMpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCQkJCi0JCWlmIChmQWN0aXZlRWRpdG9yUGFydCA9PSB0YXJnZXRFZGl0b3IpCi0JCQlyZXR1cm47Ci0JCQkKLQkJZkFjdGl2ZUVkaXRvclBhcnQ9IHRhcmdldEVkaXRvcjsKLQkJCi0JCWlmIChmQWN0aXZlRWRpdG9yUGFydCAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGZBY3RpdmVFZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb21wYXJlRWRpdG9ySW5wdXQpIHsKLQkJCQlDb21wYXJlRWRpdG9ySW5wdXQgY29tcGFyZUlucHV0PSAoQ29tcGFyZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCQlmTmV4dC5zZXRDb21wYXJlRWRpdG9ySW5wdXQoY29tcGFyZUlucHV0KTsKLQkJCQlmUHJldmlvdXMuc2V0Q29tcGFyZUVkaXRvcklucHV0KGNvbXBhcmVJbnB1dCk7Ci0JCQkJLy8gQmVnaW4gZml4IGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA1Ci0JCQkJZlRvb2xiYXJOZXh0LnNldENvbXBhcmVFZGl0b3JJbnB1dChjb21wYXJlSW5wdXQpOwotCQkJCWZUb29sYmFyUHJldmlvdXMuc2V0Q29tcGFyZUVkaXRvcklucHV0KGNvbXBhcmVJbnB1dCk7Ci0JCQkJLy8gRW5kIGZpeCBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNQotCQkJfQotCQl9Ci0JCQkKLQkJaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIENvbXBhcmVFZGl0b3IpIHsKLQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldEFjdGlvbkJhcnMoKTsKLQkJCi0JCQlDb21wYXJlRWRpdG9yIGVkaXRvcj0gKENvbXBhcmVFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJCWVkaXRvci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCQkKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5Lk5FWFQuZ2V0SWQoKSwgZk5leHQpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJFVklPVVMuZ2V0SWQoKSwgZlByZXZpb3VzKTsKLQotCQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2M9IGVkaXRvci5nZXRDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQkJZklnbm9yZVdoaXRlc3BhY2Uuc2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oY2MpOwotCQl9CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDNlNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGFyZUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdW10gTk9fQ0hBUl9DSEFSPSBuZXcgY2hhclswXVtdOwotCQotCXByaXZhdGUgY2hhcltdW10gZkV4dHJhUmVzb3VyY2VGaWxlRmlsdGVyczsKLQlwcml2YXRlIFN0cmluZ1tdIGZFeHRyYVJlc291cmNlRm9sZGVyRmlsdGVyczsKLQotCQotCXB1YmxpYyBDb21wYXJlRmlsdGVyKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgcGF0aCBtYXRjaGVzIGZpbHRlciwgdGhhdCBpcyBpZiBwYXRoIHNob3VsZCBiZSBmaWx0ZXJlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaWx0ZXIoU3RyaW5nIHBhdGgwLCBib29sZWFuIGZvbGRlciwgYm9vbGVhbiBpc0FyY2hpdmUpIHsKLQkJaWYgKCFmb2xkZXIgJiYgZkV4dHJhUmVzb3VyY2VGaWxlRmlsdGVycyAhPSBudWxsKSB7Ci0JCQljaGFyW10gbmFtZT0gcGF0aDAudG9DaGFyQXJyYXkoKTsKLQkJCWZvciAoaW50IGk9IDAsIGw9IGZFeHRyYVJlc291cmNlRmlsZUZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQkJCWlmIChtYXRjaChmRXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzW2ldLCBuYW1lLCB0cnVlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGZvbGRlciAmJiBmRXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMCwgbD0gZkV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJCQlpZiAoZkV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzWzBdLmVxdWFscyhwYXRoMCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZVJlc291cmNlRmlsdGVycyhTdHJpbmcgdGV4dCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlTdHJpbmdbXSBmaWx0ZXJzPSBnZXRUb2tlbnModGV4dCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGZpbGVOYW1lPSBmaWx0ZXJzW2ldLnJlcGxhY2UoJyonLCAneCcpOwotCQkJaW50IHJlc291cmNlVHlwZT0gSVJlc291cmNlLkZJTEU7Ci0JCQlpbnQgbGFzdENoYXJhY3Rlcj0gZmlsZU5hbWUubGVuZ3RoKCkgLSAxOwotCQkJaWYgKGxhc3RDaGFyYWN0ZXIgPj0gMCAmJiBmaWxlTmFtZS5jaGFyQXQobGFzdENoYXJhY3RlcikgPT0gJy8nKSB7Ci0JCQkJZmlsZU5hbWU9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBsYXN0Q2hhcmFjdGVyKTsKLQkJCQlyZXNvdXJjZVR5cGU9IElSZXNvdXJjZS5GT0xERVI7Ci0JCQl9Ci0JCQlJU3RhdHVzIHN0YXR1cz0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShmaWxlTmFtZSwgcmVzb3VyY2VUeXBlKTsKLQkJCWlmIChzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewkJCi0JCQkJU3RyaW5nIGZvcm1hdD0gVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmZpbHRlci5pbnZhbGlkc2VnbWVudC5lcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgc3RhdHVzLmdldE1lc3NhZ2UoKSB9ICk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcnMoU3RyaW5nIGZpbHRlclNlcXVlbmNlKSB7Ci0JCWNoYXJbXVtdIGZpbHRlcnM9IGZpbHRlclNlcXVlbmNlICE9IG51bGwgJiYgZmlsdGVyU2VxdWVuY2UubGVuZ3RoKCkgPiAwCi0JCT8gc3BsaXRBbmRUcmltT24oJywnLCBmaWx0ZXJTZXF1ZW5jZS50b0NoYXJBcnJheSgpKQotCQk6IG51bGw7Ci0JCWlmIChmaWx0ZXJzID09IG51bGwpIHsKLQkJCWZFeHRyYVJlc291cmNlRmlsZUZpbHRlcnM9IG51bGw7Ci0JCQlmRXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnM9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgZmlsZUNvdW50PSAwLCBmb2xkZXJDb3VudD0gMDsKLQkJCWZvciAoaW50IGk9IDAsIGw9IGZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCQkJY2hhcltdIGY9IGZpbHRlcnNbaV07Ci0JCQkJaWYgKGYubGVuZ3RoID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChmW2YubGVuZ3RoIC0gMV0gPT0gJy8nKQotCQkJCQlmb2xkZXJDb3VudCsrOwotCQkJCWVsc2UKLQkJCQkJZmlsZUNvdW50Kys7Ci0JCQl9Ci0JCQlmRXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzPSBuZXcgY2hhcltmaWxlQ291bnRdW107Ci0JCQlmRXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnM9IG5ldyBTdHJpbmdbZm9sZGVyQ291bnRdOwotCQkJZm9yIChpbnQgaT0gMCwgbD0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCQljaGFyW10gZj0gZmlsdGVyc1tpXTsKLQkJCQlpZiAoZi5sZW5ndGggPT0gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGZbZi5sZW5ndGggLSAxXSA9PSAnLycpCi0JCQkJCWZFeHRyYVJlc291cmNlRm9sZGVyRmlsdGVyc1stLWZvbGRlckNvdW50XT0gbmV3IFN0cmluZyhzdWJhcnJheShmLCAwLCBmLmxlbmd0aCAtIDEpKTsKLQkJCQllbHNlCi0JCQkJCWZFeHRyYVJlc291cmNlRmlsZUZpbHRlcnNbLS1maWxlQ291bnRdPSBmOwotCQkJfQotCQl9Ci0JfQotCi0JLy8vLy8vLy8vCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyB0ZXh0LCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2s9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgc2VwYXJhdG9yKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgblRva2Vucz0gdG9rLmNvdW50VG9rZW5zKCk7Ci0JCVN0cmluZ1tdIHJlcz0gbmV3IFN0cmluZ1tuVG9rZW5zXTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykKLQkJCXJlc1tpXT0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJcmV0dXJuIHJlczsKLQl9CQotCQotCS8qKgotCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lLCBmYWxzZSBvdGhlcndpc2UuCi0JICogVGhpcyBjaGFyW10gcGF0dGVybiBtYXRjaGluZyBhY2NlcHRzIHdpbGQtY2FyZHMgJyonIGFuZCAnPycuCi0JICogCi0JICogV2hlbiBub3QgY2FzZSBzZW5zaXRpdmUsIHRoZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZQotCSAqIGxvd2VyY2FzZWQsIHRoZSBuYW1lIHdpbGwgYmUgbG93ZXJjYXNlZCBjaGFyYWN0ZXIgcGVyIGNoYXJhY3RlciBhcwotCSAqIGNvbXBhcmluZy4gSWYgbmFtZSBpcyBudWxsLCB0aGUgYW5zd2VyIGlzIGZhbHNlLiBJZiBwYXR0ZXJuIGlzIG51bGwsIHRoZQotCSAqIGFuc3dlciBpcyB0cnVlIGlmIG5hbWUgaXMgbm90IG51bGwuIDxicj48YnI+Rm9yIGV4YW1wbGU6Ci0JICogPG9sPgotCSAqIDxsaT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICBwYXR0ZXJuID0geyAnPycsICdiJywgJyonIH0gbmFtZSA9IHsgJ2EnLCAnYicsICdjJyAsICdkJyB9IGlzQ2FzZVNlbnNpdGl2ZSA9IHRydWUgcmVzdWx0ID0+IHRydWUKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiAKLQkgKiA8L2xpPgotCSAqIDxsaT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICBwYXR0ZXJuID0geyAnPycsICdiJywgJz8nIH0gbmFtZSA9IHsgJ2EnLCAnYicsICdjJyAsICdkJyB9IGlzQ2FzZVNlbnNpdGl2ZSA9IHRydWUgcmVzdWx0ID0+IGZhbHNlCi0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgcGF0dGVybiA9IHsgJ2InLCAnKicgfSBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZSByZXN1bHQgPT4gZmFsc2UKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiAKLQkgKiA8L2xpPgotCSAqIDwvb2w+Ci0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBwYXR0ZXJuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBuYW1lCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgZmxhZyB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZQotCSAqICAgICAgICAgICAgc2Vuc2l0aXZlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaChjaGFyW10gcGF0dGVybiwgY2hhcltdIG5hbWUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIG51bGwgbmFtZSBjYW5ub3QgbWF0Y2gKLQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyBudWxsIHBhdHRlcm4gaXMgZXF1aXZhbGVudCB0byAnKicKLQkJcmV0dXJuIG1hdGNoKHBhdHRlcm4sIDAsIHBhdHRlcm4ubGVuZ3RoLCBuYW1lLCAwLCBuYW1lLmxlbmd0aCwgaXNDYXNlU2Vuc2l0aXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3VicGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwKLQkgKiBmYWxzZSBvdGhlcndpc2UuIGNoYXJbXSBwYXR0ZXJuIG1hdGNoaW5nLCBhY2NlcHRpbmcgd2lsZC1jYXJkcyAnKicgYW5kCi0JICogJz8nLiBDYW4gbWF0Y2ggb25seSBzdWJzZXQgb2YgbmFtZS9wYXR0ZXJuLiBlbmQgcG9zaXRpb25zIGFyZQotCSAqIG5vbi1pbmNsdXNpdmUuIFRoZSBzdWJwYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQKLQkgKiBwYXR0dGVybkVuZCBwb3NpdGlvbnMuIFdoZW4gbm90IGNhc2Ugc2Vuc2l0aXZlLCB0aGUgcGF0dGVybiBpcyBhc3N1bWVkCi0JICogdG8gYWxyZWFkeSBiZSBsb3dlcmNhc2VkLCB0aGUgbmFtZSB3aWxsIGJlIGxvd2VyY2FzZWQgY2hhcmFjdGVyIHBlcgotCSAqIGNoYXJhY3RlciBhcyBjb21wYXJpbmcuIDxicj48YnI+Rm9yIGV4YW1wbGU6Ci0JICogPG9sPgotCSAqIDxsaT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICBwYXR0ZXJuID0geyAnPycsICdiJywgJyonIH0gcGF0dGVyblN0YXJ0ID0gMSBwYXR0ZXJuRW5kID0gMyBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0gbmFtZVN0YXJ0ID0gMSBuYW1lRW5kID0gNCBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlIHJlc3VsdCA9PiB0cnVlCi0JICogPC9wcmU+Ci0JICogCi0JICogCi0JICogPC9saT4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgcGF0dGVybiA9IHsgJz8nLCAnYicsICcqJyB9IHBhdHRlcm5TdGFydCA9IDEgcGF0dGVybkVuZCA9IDIgbmFtZSA9IHsgJ2EnLCAnYicsICdjJyAsICdkJyB9IG5hbWVTdGFydCA9IDEgbmFtZUVuZCA9IDIgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZSByZXN1bHQgPT4gZmFsc2UKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiAKLQkgKiA8L2xpPgotCSAqIDwvb2w+Ci0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBwYXR0ZXJuCi0JICogQHBhcmFtIHBhdHRlcm5TdGFydAotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHBhdHRlcm4gc3RhcnQKLQkgKiBAcGFyYW0gcGF0dGVybkVuZAotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHBhdHRlcm4gZW5kCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBuYW1lCi0JICogQHBhcmFtIG5hbWVTdGFydAotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUgc3RhcnQKLQkgKiBAcGFyYW0gbmFtZUVuZAotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUgZW5kCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgZmxhZyB0byBrbm93IGlmIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3VicGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwKLQkgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaChjaGFyW10gcGF0dGVybiwgaW50IHBhdHRlcm5TdGFydCwgaW50IHBhdHRlcm5FbmQsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIG51bGwgbmFtZSBjYW5ub3QgbWF0Y2gKLQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyBudWxsIHBhdHRlcm4gaXMgZXF1aXZhbGVudCB0byAnKicKLQkJaW50IGlQYXR0ZXJuPSBwYXR0ZXJuU3RhcnQ7Ci0JCWludCBpTmFtZT0gbmFtZVN0YXJ0OwotCQlpZiAocGF0dGVybkVuZCA8IDApCi0JCQlwYXR0ZXJuRW5kPSBwYXR0ZXJuLmxlbmd0aDsKLQkJaWYgKG5hbWVFbmQgPCAwKQotCQkJbmFtZUVuZD0gbmFtZS5sZW5ndGg7Ci0JCS8qIGNoZWNrIGZpcnN0IHNlZ21lbnQgKi8KLQkJY2hhciBwYXR0ZXJuQ2hhcj0gMDsKLQkJd2hpbGUgKChpUGF0dGVybiA8IHBhdHRlcm5FbmQpICYmIChwYXR0ZXJuQ2hhcj0gcGF0dGVybltpUGF0dGVybl0pICE9ICcqJykgewotCQkJaWYgKGlOYW1lID09IG5hbWVFbmQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKHBhdHRlcm5DaGFyICE9IChpc0Nhc2VTZW5zaXRpdmUgPyBuYW1lW2lOYW1lXSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lW2lOYW1lXSkpICYmIHBhdHRlcm5DaGFyICE9ICc/JykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlOYW1lKys7Ci0JCQlpUGF0dGVybisrOwotCQl9Ci0JCS8qIGNoZWNrIHNlcXVlbmNlIG9mIHN0YXIrc2VnbWVudCAqLwotCQlpbnQgc2VnbWVudFN0YXJ0OwotCQlpZiAocGF0dGVybkNoYXIgPT0gJyonKSB7Ci0JCQlzZWdtZW50U3RhcnQ9ICsraVBhdHRlcm47IC8vIHNraXAgc3RhcgotCQl9IGVsc2UgewotCQkJc2VnbWVudFN0YXJ0PSAwOyAvLyBmb3JjZSBpTmFtZSBjaGVjawotCQl9Ci0JCWludCBwcmVmaXhTdGFydD0gaU5hbWU7Ci0JCWNoZWNrU2VnbWVudCA6IHdoaWxlIChpTmFtZSA8IG5hbWVFbmQpIHsKLQkJCWlmIChpUGF0dGVybiA9PSBwYXR0ZXJuRW5kKSB7Ci0JCQkJaVBhdHRlcm49IHNlZ21lbnRTdGFydDsgLy8gbWlzbWF0Y2ggLSByZXN0YXJ0IGN1cnJlbnQgc2VnbWVudAotCQkJCWlOYW1lPSArK3ByZWZpeFN0YXJ0OwotCQkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKLQkJCX0KLQkJCS8qIHNlZ21lbnQgaXMgZW5kaW5nICovCi0JCQlpZiAoKHBhdHRlcm5DaGFyPSBwYXR0ZXJuW2lQYXR0ZXJuXSkgPT0gJyonKSB7Ci0JCQkJc2VnbWVudFN0YXJ0PSArK2lQYXR0ZXJuOyAvLyBza2lwIHN0YXJ0Ci0JCQkJaWYgKHNlZ21lbnRTdGFydCA9PSBwYXR0ZXJuRW5kKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlwcmVmaXhTdGFydD0gaU5hbWU7Ci0JCQkJY29udGludWUgY2hlY2tTZWdtZW50OwotCQkJfQotCQkJLyogY2hlY2sgY3VycmVudCBuYW1lIGNoYXJhY3RlciAqLwotCQkJaWYgKChpc0Nhc2VTZW5zaXRpdmUgPyBuYW1lW2lOYW1lXSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lW2lOYW1lXSkpICE9IHBhdHRlcm5DaGFyICYmIHBhdHRlcm5DaGFyICE9ICc/JykgewotCQkJCWlQYXR0ZXJuPSBzZWdtZW50U3RhcnQ7IC8vIG1pc21hdGNoIC0gcmVzdGFydCBjdXJyZW50IHNlZ21lbnQKLQkJCQlpTmFtZT0gKytwcmVmaXhTdGFydDsKLQkJCQljb250aW51ZSBjaGVja1NlZ21lbnQ7Ci0JCQl9Ci0JCQlpTmFtZSsrOwotCQkJaVBhdHRlcm4rKzsKLQkJfQotCQlyZXR1cm4gKHNlZ21lbnRTdGFydCA9PSBwYXR0ZXJuRW5kKSB8fCAoaU5hbWUgPT0gbmFtZUVuZCAmJiBpUGF0dGVybiA9PSBwYXR0ZXJuRW5kKQotCQkJCXx8IChpUGF0dGVybiA9PSBwYXR0ZXJuRW5kIC0gMSAmJiBwYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnKicpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyB0aGUgc3BsaXQgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSBnaXZlbgotCSAqIGRpdmlkZXIgYW5kIHRyaW1pbmcgZWFjaCBzdWJhcnJheSB0byByZW1vdmUgd2hpdGVzcGFjZXMgZXF1YWxzIHRvICcgJy4KLQkgKiA8YnI+PGJyPkZvciBleGFtcGxlOgotCSAqIDxvbD4KLQkgKiA8bGk+Ci0JICogCi0JICogPHByZT4KLQkgKiAgZGl2aWRlciA9ICdiJyBhcnJheSA9IHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfSByZXN1bHQgPT4geyB7ICdhJyB9LCB7IH0sIHsgJ2EnIH0sIHsgJ2EnIH0gfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIGRpdmlkZXIgPSAnYycgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0gcmVzdWx0ID0+IHsgeyAnYScsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0gfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIGRpdmlkZXIgPSAnYicgYXJyYXkgPSB7ICdhJyAsICcgJywgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfSByZXN1bHQgPT4geyB7ICdhJyB9LCB7IH0sIHsgJ2EnIH0sIHsgJ2EnIH0gfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIGRpdmlkZXIgPSAnYycgYXJyYXkgPSB7ICcgJywgJyAnLCAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJywgJyAnIH0gcmVzdWx0ID0+IHsgeyAnYScsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0gfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPC9vbD4KLQkgKiAKLQkgKiBAcGFyYW0gZGl2aWRlcgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGRpdmlkZXIKLQkgKiBAcGFyYW0gYXJyYXkKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBhcnJheQotCSAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUKLQkgKiAgICAgICAgIGdpdmVuIGRpdmlkZXIgYW5kIHRyaW1pbmcgZWFjaCBzdWJhcnJheSB0byByZW1vdmUgd2hpdGVzcGFjZXMKLQkgKiAgICAgICAgIGVxdWFscyB0byAnICcKLQkgKi8KLQlwcml2YXRlIGNoYXJbXVtdIHNwbGl0QW5kVHJpbU9uKGNoYXIgZGl2aWRlciwgY2hhcltdIGFycmF5KSB7Ci0JCWludCBsZW5ndGg9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gTk9fQ0hBUl9DSEFSOwotCQlpbnQgd29yZENvdW50PSAxOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikKLQkJCQl3b3JkQ291bnQrKzsKLQkJY2hhcltdW10gc3BsaXQ9IG5ldyBjaGFyW3dvcmRDb3VudF1bXTsKLQkJaW50IGxhc3Q9IDAsIGN1cnJlbnRXb3JkPSAwOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSA9PSBkaXZpZGVyKSB7Ci0JCQkJaW50IHN0YXJ0PSBsYXN0LCBlbmQ9IGkgLSAxOwotCQkJCXdoaWxlIChzdGFydCA8IGkgJiYgYXJyYXlbc3RhcnRdID09ICcgJykKLQkJCQkJc3RhcnQrKzsKLQkJCQl3aGlsZSAoZW5kID4gc3RhcnQgJiYgYXJyYXlbZW5kXSA9PSAnICcpCi0JCQkJCWVuZC0tOwotCQkJCXNwbGl0W2N1cnJlbnRXb3JkXT0gbmV3IGNoYXJbZW5kIC0gc3RhcnQgKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgc3BsaXRbY3VycmVudFdvcmQrK10sIDAsIGVuZCAtIHN0YXJ0ICsgMSk7Ci0JCQkJbGFzdD0gaSArIDE7Ci0JCQl9Ci0JCX0KLQkJaW50IHN0YXJ0PSBsYXN0LCBlbmQ9IGxlbmd0aCAtIDE7Ci0JCXdoaWxlIChzdGFydCA8IGxlbmd0aCAmJiBhcnJheVtzdGFydF0gPT0gJyAnKQotCQkJc3RhcnQrKzsKLQkJd2hpbGUgKGVuZCA+IHN0YXJ0ICYmIGFycmF5W2VuZF0gPT0gJyAnKQotCQkJZW5kLS07Ci0JCXNwbGl0W2N1cnJlbnRXb3JkXT0gbmV3IGNoYXJbZW5kIC0gc3RhcnQgKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHNwbGl0W2N1cnJlbnRXb3JkKytdLCAwLCBlbmQgLSBzdGFydCArIDEpOwotCQlyZXR1cm4gc3BsaXQ7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyBhIG5ldyBhcnJheSB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZQotCSAqIGdpdmVuIHN0YXJ0IGFuZCBlbmRpbmcgYXQgdGhlIGdpdmVuIGVuZC4gVGhlIGdpdmVuIHN0YXJ0IGlzIGluY2x1c2l2ZQotCSAqIGFuZCB0aGUgZ2l2ZW4gZW5kIGlzIGV4Y2x1c2l2ZS4gQW5zd2VycyBudWxsIGlmIHN0YXJ0IGlzIGdyZWF0ZXIgdGhhbgotCSAqIGVuZCwgaWYgc3RhcnQgaXMgbG93ZXIgdGhhbiAwIG9yIGlmIGVuZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgotCSAqIHRoZSBnaXZlbiBhcnJheS4gSWYgZW5kIGVxdWFscyAtMSwgaXQgaXMgY29udmVydGVkIHRvIHRoZSBhcnJheSBsZW5ndGguCi0JICogPGJyPjxicj5Gb3IgZXhhbXBsZToKLQkgKiA8b2w+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIGFycmF5ID0geyAnYScgLCAnYicgfSBzdGFydCA9IDAgZW5kID0gMSByZXN1bHQgPT4geyAnYScgfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPGxpPgotCSAqIAotCSAqIDxwcmU+Ci0JICogIGFycmF5ID0geyAnYScsICdiJyB9IHN0YXJ0ID0gMCBlbmQgPSAtMSByZXN1bHQgPT4geyAnYScgLCAnYicgfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIAotCSAqIDwvbGk+Ci0JICogPC9vbD4KLQkgKiAKLQkgKiBAcGFyYW0gYXJyYXkKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBhcnJheQotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHN0YXJ0aW5nIGluZGV4Ci0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGVuZGluZyBpbmRleAotCSAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBhcnJheSBzdGFydGluZyBhdCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHN0YXJ0IGFuZCBlbmRpbmcgYXQgdGhlIGdpdmVuIGVuZAotCSAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gYXJyYXkgaXMgbnVsbAotCSAqLwotCXByaXZhdGUgY2hhcltdIHN1YmFycmF5KGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChlbmQgPT0gLTEpCi0JCQllbmQ9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHN0YXJ0ID4gZW5kKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGVuZCA+IGFycmF5Lmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCQljaGFyW10gcmVzdWx0PSBuZXcgY2hhcltlbmQgLSBzdGFydF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHN0YXJ0LCByZXN1bHQsIDAsIGVuZCAtIHN0YXJ0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzExYjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENvbXBhcmVNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFPSAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9CVU5ETEUpOwotCi0JcHJpdmF0ZSBDb21wYXJlTWVzc2FnZXMoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzMDhiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ29tcGFyZVBsdWdpbi5pbnRlcm5hbF9lcnJvcj0gSW50ZXJuYWwgRXJyb3IKLUV4Y2VwdGlvbkRpYWxvZy5zZWVFcnJvckxvZ01lc3NhZ2U9IFNlZSBlcnJvciBsb2cgZm9yIGRldGFpbHMuCi0KLSMKLSMgVGl0bGUgZm9ybWF0IGZvciBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZQotIwotQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUuVGl0bGVmb3JtYXQ9IHswfSAgKHsxfSkKLQotIwotIyBUaXRsZSBtZXNzYWdlIGZvciBTdHJ1Y3R1cmVEaWZmVmlld2VyIGlmIG5vIHN0cnVjdHVyYWwgZGlmZmVyZW5jZXMgY291bGQgYmUgZm91bmQKLSMKLVN0cnVjdHVyZURpZmZWaWV3ZXIuTm9TdHJ1Y3R1cmFsRGlmZmVyZW5jZXM9IE5vIFN0cnVjdHVyYWwgRGlmZmVyZW5jZXMKLVN0cnVjdHVyZURpZmZWaWV3ZXIuU3RydWN0dXJlRXJyb3I9IENhbm5vdCBDb21wYXJlIFN0cnVjdHVyZXMKLQotIwotIyBUZXh0TWVyZ2VWaWV3ZXIKLSMKLVRleHRNZXJnZVZpZXdlci5jdXJzb3JQb3NpdGlvbi5mb3JtYXQ9IHswfSA6IHsxfQotCi1UZXh0TWVyZ2VWaWV3ZXIuYmVmb3JlTGluZS5mb3JtYXQ9IGJlZm9yZSBsaW5lIHswfQotVGV4dE1lcmdlVmlld2VyLnJhbmdlLmZvcm1hdD0gezB9IDogezF9Ci0KLVRleHRNZXJnZVZpZXdlci5jaGFuZ2VUeXBlLmFkZGl0aW9uPSBhZGRpdGlvbgotVGV4dE1lcmdlVmlld2VyLmNoYW5nZVR5cGUuZGVsZXRpb249IGRlbGV0aW9uCi1UZXh0TWVyZ2VWaWV3ZXIuY2hhbmdlVHlwZS5jaGFuZ2U9IGNoYW5nZQotCi1UZXh0TWVyZ2VWaWV3ZXIuZGlyZWN0aW9uLm91dGdvaW5nPSBvdXRnb2luZwotVGV4dE1lcmdlVmlld2VyLmRpcmVjdGlvbi5pbmNvbWluZz0gaW5jb21pbmcKLVRleHRNZXJnZVZpZXdlci5kaXJlY3Rpb24uY29uZmxpY3Rpbmc9IGNvbmZsaWN0aW5nCi0KLVRleHRNZXJnZVZpZXdlci5kaWZmVHlwZS5mb3JtYXQ9IHswfSB7MX0KLQotVGV4dE1lcmdlVmlld2VyLmRpZmZEZXNjcmlwdGlvbi5ub0RpZmYuZm9ybWF0PSBubyBkaWZmCi1UZXh0TWVyZ2VWaWV3ZXIuZGlmZkRlc2NyaXB0aW9uLmRpZmYuZm9ybWF0PSB7MH0gI3sxfSAoTGVmdDogezJ9LCBSaWdodDogezN9KQotVGV4dE1lcmdlVmlld2VyLnN0YXR1c0xpbmUuZm9ybWF0PSBMZWZ0OiB7MH0sIFJpZ2h0OiB7MX0sIHsyfQotCi1UZXh0TWVyZ2VWaWV3ZXIuYXRFbmQudGl0bGU9IEdvIHRvIE5leHQgRGlmZmVyZW5jZQotVGV4dE1lcmdlVmlld2VyLmF0RW5kLm1lc3NhZ2U9IEVuZCBvZiBkb2N1bWVudCByZWFjaGVkLiBDb250aW51ZSBmcm9tIGJlZ2lubmluZz8KLQkJCQkKLVRleHRNZXJnZVZpZXdlci5hdEJlZ2lubmluZy50aXRsZT0gR28gdG8gUHJldmlvdXMgRGlmZmVyZW5jZQotVGV4dE1lcmdlVmlld2VyLmF0QmVnaW5uaW5nLm1lc3NhZ2U9IEJlZ2lubmluZyBvZiBkb2N1bWVudCByZWFjaGVkLiBDb250aW51ZSBmcm9tIGVuZD8KLQotQ29tcGFyZU5hdmlnYXRvci5hdEVuZC50aXRsZT0gR28gdG8gTmV4dCBEaWZmZXJlbmNlCi1Db21wYXJlTmF2aWdhdG9yLmF0RW5kLm1lc3NhZ2U9IExhc3QgZGlmZmVyZW5jZSByZWFjaGVkLgotCQkJCQotQ29tcGFyZU5hdmlnYXRvci5hdEJlZ2lubmluZy50aXRsZT0gR28gdG8gUHJldmlvdXMgRGlmZmVyZW5jZQotQ29tcGFyZU5hdmlnYXRvci5hdEJlZ2lubmluZy5tZXNzYWdlPSBGaXJzdCBkaWZmZXJlbmNlIHJlYWNoZWQuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTmF2aWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZTMzNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU5hdmlnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci0KLS8qKgotICogU3VwcG9ydHMgY3Jvc3MtcGFuZSBuYXZpZ2F0aW9uIHRocm91Z2ggZGlmZmVyZW5jZXMuCi0gKiBYWFg6IERlc2lnbiBpcyBhcyBpdCBpcyBiZWNhdXNlIHRoZSBmZWF0dXJlIGhhZCB0byBiZSBhZGRlZCB3aXRob3V0IHRvdWNoaW5nIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVOYXZpZ2F0b3IgaW1wbGVtZW50cyBJQ29tcGFyZU5hdmlnYXRvciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZMYXN0RGlyZWN0aW9uPSB0cnVlOwotCXByaXZhdGUgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmVbXSBmUGFuZXM7Ci0JLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JcHJpdmF0ZSBib29sZWFuIGZOZXh0Rmlyc3RUaW1lPSB0cnVlOwotCQotCXB1YmxpYyBDb21wYXJlTmF2aWdhdG9yKENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lW10gcGFuZXMpIHsKLQkJZlBhbmVzPSBwYW5lczsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmVbXSBnZXRQYW5lcygpIHsKLQkJcmV0dXJuIGZQYW5lczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0Q2hhbmdlKGJvb2xlYW4gbmV4dCkgewotCQkKLQkJZkxhc3REaXJlY3Rpb249IG5leHQ7Ci0KLQkJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCWlmIChuZXh0ICYmIGZOZXh0Rmlyc3RUaW1lICYmIG11c3RPcGVuKCkpIHsKLQkJCWZOZXh0Rmlyc3RUaW1lPSBmYWxzZTsKLQkJCW9wZW5FbGVtZW50KCk7Ci0JCX0KLQkJCi0JCS8vIGZpbmQgbW9zdCBkb3duIHN0cmVhbSBDb21wYXJlVmlld2VyUGFuZQotCQlpbnQgbj0gMDsKLQkJSU5hdmlnYXRhYmxlW10gbmF2aWdhdG9ycz0gbmV3IElOYXZpZ2F0YWJsZVs0XTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZQYW5lcy5sZW5ndGg7IGkrKykgewotCQkJbmF2aWdhdG9yc1tuXT0gZ2V0TmF2aWdhdG9yKGZQYW5lc1tpXSk7Ci0JCQlpZiAobmF2aWdhdG9yc1tuXSAhPSBudWxsKQotCQkJCW4rKzsKLQkJfQotCQkJCQkJCQkJCi0JCXdoaWxlIChuID4gMCkgewotCQkJbi0tOwotCQkJaWYgKG5hdmlnYXRvcnNbbl0uZ290b0RpZmZlcmVuY2UobmV4dCkpIHsKLQkJCQkvLyBhdCBlbmQgb2YgdGhpcyBuYXZpZ2F0b3IKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIG5vdCBhdCBlbmQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElOYXZpZ2F0YWJsZSBnZXROYXZpZ2F0b3IoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgcGFuZSkgewotCQlpZiAocGFuZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChwYW5lLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlWaWV3ZXIgdmlld2VyPSBwYW5lLmdldFZpZXdlcigpOwotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udHJvbCBjb250cm9sPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBkYXRhPSBjb250cm9sLmdldERhdGEoSU5hdmlnYXRhYmxlLk5BVklHQVRPUl9QUk9QRVJUWSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgSU5hdmlnYXRhYmxlKQotCQkJcmV0dXJuIChJTmF2aWdhdGFibGUpIGRhdGE7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb21wYXJlTmF2aWdhdG9yIGZpbmROYXZpZ2F0b3IoQ29udHJvbCBjKSB7Ci0JCXdoaWxlIChjICE9IG51bGwgJiYgIWMuaXNEaXNwb3NlZCgpKSB7CS8vIFBSIDFHRVVWVjIKLQkJCU9iamVjdCBkYXRhPSBjLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcklucHV0KSB7Ci0JCQkJQ29tcGFyZUVkaXRvcklucHV0IGNlaT0gKENvbXBhcmVFZGl0b3JJbnB1dCkgZGF0YTsKLQkJCQlPYmplY3QgYWRhcHRlcj0gY2VpLmdldEFkYXB0ZXIoQ29tcGFyZU5hdmlnYXRvci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBDb21wYXJlTmF2aWdhdG9yKQotCQkJCQlyZXR1cm4gKENvbXBhcmVOYXZpZ2F0b3IpYWRhcHRlcjsKLQkJCX0KLQkJCWM9IGMuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZXNldERpcmVjdGlvbigpIHsKLQkJYm9vbGVhbiBsYXN0PSBmTGFzdERpcmVjdGlvbjsKLQkJZkxhc3REaXJlY3Rpb249IHRydWU7Ci0JCXJldHVybiBsYXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGlyZWN0aW9uKENvbnRyb2wgYykgewotCQlDb21wYXJlTmF2aWdhdG9yIG5hdj0gZmluZE5hdmlnYXRvcihjKTsKLQkJaWYgKG5hdiAhPSBudWxsKQotCQkJcmV0dXJuIG5hdi5yZXNldERpcmVjdGlvbigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbXVzdE9wZW4oKSB7Ci0JCWlmIChmUGFuZXMgPT0gbnVsbCB8fCBmUGFuZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGk9IDE7IGkgPCBmUGFuZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIHBhbmU9IGZQYW5lc1tpXTsKLQkJCWlmIChwYW5lICE9IG51bGwgJiYgcGFuZS5nZXRJbnB1dCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKgotCSAqIEZpeCBmb3IgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRWxlbWVudCgpIHsKLQkJaWYgKGZQYW5lcyA9PSBudWxsIHx8IGZQYW5lcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJSU9wZW5hYmxlIG9wZW5hYmxlPSBnZXRPcGVuYWJsZShmUGFuZXNbMF0pOwotCQlpZiAob3BlbmFibGUgIT0gbnVsbCkgewotCQkJb3BlbmFibGUub3BlblNlbGVjdGVkKCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGUoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUgcGFuZSkgewotCQlpZiAocGFuZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChwYW5lLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlWaWV3ZXIgdmlld2VyPSBwYW5lLmdldFZpZXdlcigpOwotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udHJvbCBjb250cm9sPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBkYXRhPSBjb250cm9sLmdldERhdGEoSU9wZW5hYmxlLk9QRU5BQkxFX1BST1BFUlRZKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBJT3BlbmFibGUpCi0JCQlyZXR1cm4gKElPcGVuYWJsZSkgZGF0YTsKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjczMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZU91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZU91dGxpbmVQYWdlIGltcGxlbWVudHMgSUNvbnRlbnRPdXRsaW5lUGFnZSB7Ci0KLQlwcml2YXRlIENvbnRyb2wgZkNvbnRyb2w7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVycz0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCS8vcHJpdmF0ZSBJQWN0aW9uQmFycyBmQWN0aW9uQmFyczsKLQlwcml2YXRlIENvbXBhcmVFZGl0b3JJbnB1dCBmQ29tcGFyZUVkaXRvcklucHV0OwotCQotCUNvbXBhcmVPdXRsaW5lUGFnZShDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJZkNvbXBhcmVFZGl0b3JJbnB1dD0gaW5wdXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZDb21wYXJlRWRpdG9ySW5wdXQgIT0gbnVsbCkgewotCQkJZkNvbnRyb2w9IGZDb21wYXJlRWRpdG9ySW5wdXQuY3JlYXRlT3V0bGluZUNvbnRlbnRzKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZDb250cm9sICE9IG51bGwpCi0JCQlmQ29udHJvbC5kaXNwb3NlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNnZXRDb250cm9sKCkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZkNvbnRyb2w7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNzZXRBY3Rpb25CYXJzKG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkvL2ZBY3Rpb25CYXJzPSBhY3Rpb25CYXJzOwotCQkvL2lmIChmQ29udHJvbCAhPSBudWxsKQotCQkvLwlmQ29udHJvbC5zZXREYXRhKCJhY3Rpb25CYXJzIiwgYWN0aW9uQmFycyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChmQ29udHJvbCAhPSBudWxsKQotCQkJZkNvbnRyb2wuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbj0gc2VsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjA5OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuKjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGFyZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCQotCWNsYXNzIEZha2VJbnB1dCBpbXBsZW1lbnRzIElUeXBlZEVsZW1lbnQsIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yIHsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTY9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmQ29udGVudDsKLQkJCi0JCUZha2VJbnB1dChTdHJpbmcgbmFtZSkgewotCQkJZkNvbnRlbnQ9IGxvYWRQcmV2aWV3Q29udGVudEZyb21GaWxlKG5hbWUpOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAibm8gbmFtZSI7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gIm5vIHR5cGUiOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgewotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShVdGlsaXRpZXMuZ2V0Qnl0ZXMoZkNvbnRlbnQsIFVURl8xNikpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJCXJldHVybiBVVEZfMTY7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYPSBDb21wYXJlVUlQbHVnaW4uUExVR0lOX0lEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9TVFJVQ1RVUkVfQ09NUEFSRT0gUFJFRklYICsgIk9wZW5TdHJ1Y3R1cmVDb21wYXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNIUk9OSVpFX1NDUk9MTElORz0gUFJFRklYICsgIlN5bmNocm9uaXplU2Nyb2xsaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfUFNFVURPX0NPTkZMSUNUUz0gUFJFRklYICsgIlNob3dQc2V1ZG9Db25mbGljdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORT0gUFJFRklYICsgIkluaXRpYWxseVNob3dBbmNlc3RvclBhbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TQVZFX0FMTF9FRElUT1JTPSBQUkVGSVggKyAiU2F2ZUFsbEVkaXRvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19NT1JFX0lORk89IFBSRUZJWCArICJTaG93TW9yZUluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX1dISVRFU1BBQ0U9IFBSRUZJWCArICJJZ25vcmVXaGl0ZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1NQTElORVM9IFBSRUZJWCArICJVc2VTcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9TSU5HTEVfTElORT0gUFJFRklYICsgIlVzZVNpbmdsZUxpbmUiOyAvLyROT04tTkxTLTEkCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfUkVTT0xWRV9VST0gUFJFRklYICsgIlVzZVJlc29sdmVVSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0ZJTFRFUj0gUFJFRklYICsgIlBhdGhGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBUZXh0TWVyZ2VWaWV3ZXIgZlByZXZpZXdWaWV3ZXI7Ci0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgQ29tcGFyZUNvbmZpZ3VyYXRpb24gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgTWFwIGZDaGVja0JveGVzPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgVGV4dCBmRmlsdGVyczsKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZDaGVja0JveExpc3RlbmVyOwotCi0KLQlwdWJsaWMgZmluYWwgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10gZktleXM9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSB7CQotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgT1BFTl9TVFJVQ1RVUkVfQ09NUEFSRSksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBTWU5DSFJPTklaRV9TQ1JPTExJTkcpLAotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgU0hPV19QU0VVRE9fQ09ORkxJQ1RTKSwKLQkJbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIElOSVRJQUxMWV9TSE9XX0FOQ0VTVE9SX1BBTkUpLAotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgU0hPV19NT1JFX0lORk8pLAotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgSUdOT1JFX1dISVRFU1BBQ0UpLAotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgUFJFRl9TQVZFX0FMTF9FRElUT1JTKSwKLQkJCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkQpLAotCQluZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfQkFDS0dST1VORF9TWVNURU1fREVGQVVMVCksCi0JCQotCQkvL25ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBVU0VfU1BMSU5FUyksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBVU0VfU0lOR0xFX0xJTkUpLAotCQkvL25ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBVU0VfUkVTT0xWRV9VSSksCi0JCW5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIFBBVEhfRklMVEVSKSwKLQl9OwotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0RGVmYXVsdHMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlzdG9yZS5zZXREZWZhdWx0KE9QRU5fU1RSVUNUVVJFX0NPTVBBUkUsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFNZTkNIUk9OSVpFX1NDUk9MTElORywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoU0hPV19QU0VVRE9fQ09ORkxJQ1RTLCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSwgZmFsc2UpOwotCQlzdG9yZS5zZXREZWZhdWx0KFNIT1dfTU9SRV9JTkZPLCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSUdOT1JFX1dISVRFU1BBQ0UsIGZhbHNlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQUkVGX1NBVkVfQUxMX0VESVRPUlMsIGZhbHNlKTsKLQkJLy9zdG9yZS5zZXREZWZhdWx0KFVTRV9TUExJTkVTLCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoVVNFX1NJTkdMRV9MSU5FLCB0cnVlKTsKLQkJLy9zdG9yZS5zZXREZWZhdWx0KFVTRV9SRVNPTFZFX1VJLCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUEFUSF9GSUxURVIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9CQUNLR1JPVU5EX1NZU1RFTV9ERUZBVUxULCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyZVByZWZlcmVuY2VQYWdlKCkgewotCQkKLQkJLy9zZXREZXNjcmlwdGlvbihVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UuZGVzY3JpcHRpb24iKSk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCXNldFByZWZlcmVuY2VTdG9yZShDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJCi0JCWZPdmVybGF5U3RvcmU9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBmS2V5cyk7Ci0JCWZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcga2V5PSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJCWlmIChrZXkuZXF1YWxzKElOSVRJQUxMWV9TSE9XX0FOQ0VTVE9SX1BBTkUpKSB7Ci0JCQkJCWJvb2xlYW4gYj0gZk92ZXJsYXlTdG9yZS5nZXRCb29sZWFuKElOSVRJQUxMWV9TSE9XX0FOQ0VTVE9SX1BBTkUpOwotCQkJCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShJTklUSUFMTFlfU0hPV19BTkNFU1RPUl9QQU5FLCBuZXcgQm9vbGVhbihiKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWZPdmVybGF5U3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGVtcHR5Ci0JfQkKLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZk92ZXJsYXlTdG9yZS5wcm9wYWdhdGUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJCi0JCWZPdmVybGF5U3RvcmUubG9hZERlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCQotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlpZiAoZlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJZk92ZXJsYXlTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJCWZQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI9IG51bGw7Ci0JCQl9Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJCWZPdmVybGF5U3RvcmU9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gZ2V0U2F2ZUFsbEVkaXRvcnMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmU9IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBzdG9yZS5nZXRCb29sZWFuKFBSRUZfU0FWRV9BTExfRURJVE9SUyk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCBzZXRTYXZlQWxsRWRpdG9ycyhib29sZWFuIHZhbHVlKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmU9IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldFZhbHVlKFBSRUZfU0FWRV9BTExfRURJVE9SUywgdmFsdWUpOwotCX0JCi0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIElDb21wYXJlQ29udGV4dElkcy5DT01QQVJFX1BSRUZFUkVOQ0VfUEFHRSk7Ci0JCQotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCQkKLQkJVGFiRm9sZGVyIGZvbGRlcj0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJZm9sZGVyLnNldExheW91dChuZXcgVGFiRm9sZGVyTGF5b3V0KCkpOwkKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJVGFiSXRlbSBpdGVtPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5nZW5lcmFsVGFiLmxhYmVsIikpOwkvLyROT04tTkxTLTEkCi0JCS8vaXRlbS5zZXRJbWFnZShKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX0NGSUxFKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChjcmVhdGVHZW5lcmFsUGFnZShmb2xkZXIpKTsKLQkJCi0JCWl0ZW09IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnRleHRDb21wYXJlVGFiLmxhYmVsIikpOwkvLyROT04tTkxTLTEkCi0JCS8vaXRlbS5zZXRJbWFnZShKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX0NGSUxFKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChjcmVhdGVUZXh0Q29tcGFyZVBhZ2UoZm9sZGVyKSk7Ci0JCQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoZm9sZGVyKTsKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUdlbmVyYWxQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCi0JCWFkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zdHJ1Y3R1cmVDb21wYXJlLmxhYmVsIiwgT1BFTl9TVFJVQ1RVUkVfQ09NUEFSRSwgMCk7CS8vJE5PTi1OTFMtMSQKLQkJYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnNob3dNb3JlSW5mby5sYWJlbCIsIFNIT1dfTU9SRV9JTkZPLCAwKTsJLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChjb21wb3NpdGUsICJDb21wYXJlUHJlZmVyZW5jZVBhZ2UuaWdub3JlV2hpdGVzcGFjZS5sYWJlbCIsIElHTk9SRV9XSElURVNQQUNFLCAwKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gYSBzcGFjZXIKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCWFkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zYXZlQmVmb3JlUGF0Y2hpbmcubGFiZWwiLCBQUkVGX1NBVkVfQUxMX0VESVRPUlMsIDApOwkvLyROT04tTkxTLTEkCi0KLQkJLy8gYSBzcGFjZXIKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkKLQkJTGFiZWwgbD0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsLnNldFRleHQoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmZpbHRlci5kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQ29tcG9zaXRlIGMyPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGF5b3V0PSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJYzIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlsPSBuZXcgTGFiZWwoYzIsIFNXVC5OT05FKTsKLQkJbC5zZXRUZXh0KFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5maWx0ZXIubGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZGaWx0ZXJzPSBuZXcgVGV4dChjMiwgU1dULkJPUkRFUik7Ci0JCWZGaWx0ZXJzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmRmlsdGVycy5zZXRUZXh0KGZPdmVybGF5U3RvcmUuZ2V0U3RyaW5nKFBBVEhfRklMVEVSKSk7Ci0JCWZGaWx0ZXJzLmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlTdHJpbmcgZmlsdGVycz0gZkZpbHRlcnMuZ2V0VGV4dCgpOwotCQkJCQlTdHJpbmcgbWVzc2FnZT0gQ29tcGFyZUZpbHRlci52YWxpZGF0ZVJlc291cmNlRmlsdGVycyhmaWx0ZXJzKTsKLQkJCQkJc2V0VmFsaWQobWVzc2FnZSA9PSBudWxsKTsKLQkJCQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKFBBVEhfRklMVEVSLCBmaWx0ZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlVGV4dENvbXBhcmVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQotCQlhZGRDaGVja0JveChjb21wb3NpdGUsICJDb21wYXJlUHJlZmVyZW5jZVBhZ2Uuc3luY2hyb25pemVTY3JvbGxpbmcubGFiZWwiLCBTWU5DSFJPTklaRV9TQ1JPTExJTkcsIDApOwkvLyROT04tTkxTLTEkCi0JCWFkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5pbml0aWFsbHlTaG93QW5jZXN0b3JQYW5lLmxhYmVsIiwgSU5JVElBTExZX1NIT1dfQU5DRVNUT1JfUEFORSwgMCk7CS8vJE5PTi1OTFMtMSQKLQkJYWRkQ2hlY2tCb3goY29tcG9zaXRlLCAiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnNob3dQc2V1ZG9Db25mbGljdHMubGFiZWwiLCBTSE9XX1BTRVVET19DT05GTElDVFMsIDApOwkvLyROT04tTkxTLTEkCi0JCQotCQkvL2FkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS51c2VTcGxpbmVzLmxhYmVsIiwgVVNFX1NQTElORVMsIDApOwkvLyROT04tTkxTLTEkCi0JCWFkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS51c2VTaW5nbGVMaW5lLmxhYmVsIiwgVVNFX1NJTkdMRV9MSU5FLCAwKTsJLy8kTk9OLU5MUy0xJAotCQkvL2FkZENoZWNrQm94KGNvbXBvc2l0ZSwgIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS51c2VSZXNvbHZlVUkubGFiZWwiLCBVU0VfUkVTT0xWRV9VSSwgMCk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGEgc3BhY2VyCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCi0JCUxhYmVsIHByZXZpZXdMYWJlbD0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlwcmV2aWV3TGFiZWwuc2V0VGV4dChVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlUHJlZmVyZW5jZVBhZ2UucHJldmlldy5sYWJlbCIpKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJQ29udHJvbCBwcmV2aWV3ZXI9IGNyZWF0ZVByZXZpZXdlcihjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLndpZHRoSGludD0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDYwKTsKLQkJZ2QuaGVpZ2h0SGludD0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMyk7Ci0JCXByZXZpZXdlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVQcmV2aWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb249IG5ldyBDb21wYXJlQ29uZmlndXJhdGlvbihmT3ZlcmxheVN0b3JlKTsKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldEFuY2VzdG9yTGFiZWwoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLmFuY2VzdG9yLmxhYmVsIikpOwkvLyROT04tTkxTLTEkCi0JCQotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0TGVmdExhYmVsKFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5sZWZ0LmxhYmVsIikpOwkvLyROT04tTkxTLTEkCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRMZWZ0RWRpdGFibGUoZmFsc2UpOwotCQkKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldFJpZ2h0TGFiZWwoVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnJpZ2h0LmxhYmVsIikpOwkvLyROT04tTkxTLTEkCi0JCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRSaWdodEVkaXRhYmxlKGZhbHNlKTsKLQkJCi0JCWZQcmV2aWV3Vmlld2VyPSBuZXcgVGV4dE1lcmdlVmlld2VyKHBhcmVudCwgU1dULkJPUkRFUiwgZkNvbXBhcmVDb25maWd1cmF0aW9uKTsKLQkJCi0JCWZQcmV2aWV3Vmlld2VyLnNldElucHV0KAotCQkJbmV3IERpZmZOb2RlKERpZmZlcmVuY2VyLkNPTkZMSUNUSU5HLAotCQkJCW5ldyBGYWtlSW5wdXQoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5wcmV2aWV3QW5jZXN0b3IiKSwJLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBGYWtlSW5wdXQoIkNvbXBhcmVQcmVmZXJlbmNlUGFnZS5wcmV2aWV3TGVmdCIpLAkvLyROT04tTkxTLTEkCi0JCQkJbmV3IEZha2VJbnB1dCgiQ29tcGFyZVByZWZlcmVuY2VQYWdlLnByZXZpZXdSaWdodCIpCS8vJE5PTi1OTFMtMSQKLQkJCSkKLQkJKTsKLQotCQlDb250cm9sIGM9IGZQcmV2aWV3Vmlld2VyLmdldENvbnRyb2woKTsKLQkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGZDb21wYXJlQ29uZmlndXJhdGlvbiAhPSBudWxsKQotCQkJCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiAgYzsKLQl9Ci0JCQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJCi0JCUl0ZXJhdG9yIGU9IGZDaGVja0JveGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJQnV0dG9uIGI9IChCdXR0b24pIGUubmV4dCgpOwotCQkJU3RyaW5nIGtleT0gKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGIpOwotCQkJYi5zZXRTZWxlY3Rpb24oZk92ZXJsYXlTdG9yZS5nZXRCb29sZWFuKGtleSkpOwotCQl9Ci0JCQotCQlpZiAoZkZpbHRlcnMgIT0gbnVsbCkKLQkJCWZGaWx0ZXJzLnNldFRleHQoZk92ZXJsYXlTdG9yZS5nZXRTdHJpbmcoUEFUSF9GSUxURVIpKTsKLQl9Ci0KLQkvLyBvdmVybGF5IHN0dWZmCi0JCi0JcHJpdmF0ZSBCdXR0b24gYWRkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsS2V5LCBTdHJpbmcga2V5LCBpbnQgaW5kZW50YXRpb24pIHsKLQkJCi0JCVN0cmluZyBsYWJlbD0gVXRpbGl0aWVzLmdldFN0cmluZyhsYWJlbEtleSk7Ci0JCQkJCi0JCUJ1dHRvbiBjaGVja0JveD0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCQkKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50PSBpbmRlbnRhdGlvbjsKLQkJZ2QuaG9yaXpvbnRhbFNwYW49IDI7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJaWYgKGZDaGVja0JveExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZDaGVja0JveExpc3RlbmVyPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUJ1dHRvbiBidXR0b249IChCdXR0b24pIGUud2lkZ2V0OwotCQkJCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKChTdHJpbmcpIGZDaGVja0JveGVzLmdldChidXR0b24pLCBidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIoZkNoZWNrQm94TGlzdGVuZXIpOwotCQkKLQkJZkNoZWNrQm94ZXMucHV0KGNoZWNrQm94LCBrZXkpOwotCQkKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBsb2FkUHJldmlld0NvbnRlbnRGcm9tRmlsZShTdHJpbmcga2V5KSB7Ci0JCQotCQlTdHJpbmcgcHJldmlldz0gVXRpbGl0aWVzLmdldFN0cmluZyhrZXkpOwotCQlTdHJpbmcgc2VwYXJhdG9yPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgcHJldmlldy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGM9IHByZXZpZXcuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQlidWZmZXIuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyYmJkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIENvbXBhcmUgVUkgcGx1Zy1pbiBkZWZpbmVzIHRoZSBlbnRyeSBwb2ludCB0byBpbml0aWF0ZSBhIGNvbmZpZ3VyYWJsZQotICogY29tcGFyZSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IHJlc291cmNlcy4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZQotICogaXMgb3BlbmVkIGludG8gYSBjb21wYXJlIGVkaXRvciB3aGVyZSB0aGUgZGV0YWlscyBjYW4gYmUgYnJvd3NlZCBhbmQKLSAqIGVkaXRlZCBpbiBkeW5hbWljYWxseSBzZWxlY3RlZCBzdHJ1Y3R1cmUgYW5kIGNvbnRlbnQgdmlld2Vycy4KLSAqIDxwPgotICogVGhlIENvbXBhcmUgVUkgcHJvdmlkZXMgYSByZWdpc3RyeSBmb3IgY29udGVudCBhbmQgc3RydWN0dXJlIGNvbXBhcmUgdmlld2VycywKLSAqIHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gZXh0ZW5zaW9ucyBjb250cmlidXRlZCB0byBleHRlbnNpb24gcG9pbnRzCi0gKiBkZWNsYXJlZCBieSB0aGlzIHBsdWctaW4uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdGhlIHBsdWctaW4gcnVudGltZSBjbGFzcyBmb3IgdGhlIAotICogPGNvZGU+Im9yZy5lY2xpcHNlLmNvbXBhcmUiPC9jb2RlPiBwbHVnLWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcGFyZVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgCi0gICAgc3RhdGljIGNsYXNzIENvbXBhcmVSZWdpc3RyeSB7Ci0gICAgICAgIAotICAgIAkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElEX0FUVFJJQlVURT0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIAkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTlNfQVRUUklCVVRFPSAiZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT05URU5UX1RZUEVfSURfQVRUUklCVVRFPSAiY29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLSAKLSAgICAJCXByaXZhdGUgSGFzaE1hcCBmSWRNYXA7Ci0gICAgCQlwcml2YXRlIEhhc2hNYXAgZkV4dGVuc2lvbk1hcDsKLSAgICAJCXByaXZhdGUgSGFzaE1hcCBmQ29udGVudFR5cGVCaW5kaW5nczsJCS8vIG1hcHMgY29udGVudCB0eXBlIGJpbmRpbmdzIHRvIGRhdGFzCi0gICAgICAgIAotIAotCSAgICAJdm9pZCByZWdpc3RlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IGRhdGEpIHsKLQkgICAgCSAgICBTdHJpbmcgaWQ9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElEX0FUVFJJQlVURSk7Ci0JICAgIAkgICAgaWYgKGlkICE9IG51bGwpIHsgICAgICAKLQkgICAgCSAgICAgICAgaWYgKGZJZE1hcCA9PSBudWxsKQotCSAgICAJICAgICAgICAgICAgZklkTWFwPSBuZXcgSGFzaE1hcCgpOwotCSAgICAJICAgICAgICBmSWRNYXAucHV0KGlkLCBkYXRhKTsKLQkgICAgCSAgICB9Ci0JICAgIAkgICAgCi0JICAgIAkgICAgU3RyaW5nIHR5cGVzPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFWFRFTlNJT05TX0FUVFJJQlVURSk7Ci0JICAgIAkgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLQkgICAgCSAgICAgICAgaWYgKGZFeHRlbnNpb25NYXAgPT0gbnVsbCkKLQkgICAgCSAgICAgICAgICAgIGZFeHRlbnNpb25NYXA9IG5ldyBIYXNoTWFwKCk7Ci0JCSAgICAJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXI9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHlwZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkgICAgCQkJU3RyaW5nIGV4dGVuc2lvbj0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJICAgIAkJCWZFeHRlbnNpb25NYXAucHV0KG5vcm1hbGl6ZUNhc2UoZXh0ZW5zaW9uKSwgZGF0YSk7Ci0JCSAgICAJCX0KLQkgICAgCSAgICB9Ci0JICAgIAl9Ci0KLQkgICAgCXZvaWQgY3JlYXRlQmluZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGlkQXR0cmlidXRlTmFtZSkgewotICAgICAgICAgICAgU3RyaW5nIHR5cGU9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKENPTlRFTlRfVFlQRV9JRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgU3RyaW5nIGlkPSBlbGVtZW50LmdldEF0dHJpYnV0ZShpZEF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpCi0gICAgICAgICAgICAgICAgbG9nRXJyb3JNZXNzYWdlKFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi50YXJnZXRJZEF0dHJpYnV0ZU1pc3NpbmciLCBpZEF0dHJpYnV0ZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiBpZCAhPSBudWxsICYmIGZJZE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG89IGZJZE1hcC5nZXQoaWQpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGN0PSBmZ0NvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZSh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQ29udGVudFR5cGVCaW5kaW5ncyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50VHlwZUJpbmRpbmdzPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRUeXBlQmluZGluZ3MucHV0KGN0LCBvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yTWVzc2FnZShVdGlsaXRpZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJDb21wYXJlVUlQbHVnaW4uY29udGVudFR5cGVOb3RGb3VuZCIsIHR5cGUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3JNZXNzYWdlKFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi50YXJnZXROb3RGb3VuZCIsIGlkKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAgIAl9Ci0KLQkgICAgCU9iamVjdCBzZWFyY2goSUNvbnRlbnRUeXBlIHR5cGUpIHsKLQkgICAgCSAgICBpZiAodHlwZSAhPSBudWxsICYmIGZDb250ZW50VHlwZUJpbmRpbmdzICE9IG51bGwpIHsKLQkJICAgIAkgICAgT2JqZWN0IGI9IGZDb250ZW50VHlwZUJpbmRpbmdzLmdldCh0eXBlKTsKLQkJICAgIAkgICAgaWYgKGIgIT0gbnVsbCkKLQkJICAgIAkgICAgICAgIHJldHVybiBiOwotCSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXI9IGZDb250ZW50VHlwZUJpbmRpbmdzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgIElDb250ZW50VHlwZSBjdD0gKElDb250ZW50VHlwZSkgaXRlci5uZXh0KCk7Ci0JICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzS2luZE9mKGN0KSkgewotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZDb250ZW50VHlwZUJpbmRpbmdzLmdldChjdCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgIAkgICAgfQotCSAgICAJICAgIHJldHVybiBudWxsOwotCSAgICAJfQotCSAgICAJCi0JICAgIAlPYmplY3Qgc2VhcmNoKFN0cmluZyBleHRlbnNpb24pIHsKLQkgICAgCSAgICBpZiAoZkV4dGVuc2lvbk1hcCAhPSBudWxsKQotCSAgICAJICAgICAgICByZXR1cm4gZkV4dGVuc2lvbk1hcC5nZXQobm9ybWFsaXplQ2FzZShleHRlbnNpb24pKTsKLQkgICAgCSAgICByZXR1cm4gbnVsbDsKLQkgICAgCX0KLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0xfTkVYVD0gImRsY2wxNi9uZXh0X25hdi5naWYiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRPT0xfTkVYVD0gImVsY2wxNi9uZXh0X25hdi5naWYiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RPT0xfTkVYVD0gRVRPT0xfTkVYVDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTF9QUkVWPSAiZGxjbDE2L3ByZXZfbmF2LmdpZiI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTF9QUkVWPSAiZWxjbDE2L3ByZXZfbmF2LmdpZiI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVE9PTF9QUkVWPSBFVE9PTF9QUkVWOwotCQkJCQotCS8qKiBTdGF0dXMgY29kZSBkZXNjcmliaW5nIGFuIGludGVybmFsIGVycm9yICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfRVJST1I9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIE5PUk1BTElaRV9DQVNFPSB0cnVlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEPSAib3JnLmVjbGlwc2UuY29tcGFyZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOQVJZX1RZUEU9ICJiaW5hcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01FUkdFUl9FWFRFTlNJT05fUE9JTlQ9ICJzdHJlYW1NZXJnZXJzIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01FUkdFUj0gInN0cmVhbU1lcmdlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9NRVJHRVJfSURfQVRUUklCVVRFPSAic3RyZWFtTWVyZ2VySWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUlVDVFVSRV9DUkVBVE9SX0VYVEVOU0lPTl9QT0lOVD0gInN0cnVjdHVyZUNyZWF0b3JzIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFX0NSRUFUT1I9ICJzdHJ1Y3R1cmVDcmVhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFX0NSRUFUT1JfSURfQVRUUklCVVRFPSAic3RydWN0dXJlQ3JlYXRvcklkIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0VSX1RBRz0gInZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFX01FUkdFX1ZJRVdFUl9FWFRFTlNJT05fUE9JTlQ9ICJzdHJ1Y3R1cmVNZXJnZVZpZXdlcnMiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkVfTUVSR0VfVklFV0VSX0lEX0FUVFJJQlVURT0gInN0cnVjdHVyZU1lcmdlVmlld2VySWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUVSR0VfVklFV0VSX0VYVEVOU0lPTl9QT0lOVD0gImNvbnRlbnRNZXJnZVZpZXdlcnMiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01FUkdFX1ZJRVdFUl9JRF9BVFRSSUJVVEU9ICJjb250ZW50TWVyZ2VWaWV3ZXJJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9WSUVXRVJfRVhURU5TSU9OX1BPSU5UPSAiY29udGVudFZpZXdlcnMiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1ZJRVdFUl9JRF9BVFRSSUJVVEU9ICJjb250ZW50Vmlld2VySWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0JJTkRJTkc9ICJjb250ZW50VHlwZUJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0KLQotICAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVfRURJVE9SPSBQTFVHSU5fSUQgKyAiLkNvbXBhcmVFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUlVDVFVSRVZJRVdFUl9BTElBU0VTX1BSRUZFUkVOQ0VfTkFNRT0gIlN0cnVjdHVyZVZpZXdlckFsaWFzZXMiOwkvLyROT04tTkxTLTEkCi0KLQkvLyBjb250ZW50IHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29udGVudFR5cGVNYW5hZ2VyIGZnQ29udGVudFR5cGVNYW5hZ2VyPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFRoZSBwbHVnaW4gc2luZ2xldG9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbXBhcmVVSVBsdWdpbiBmZ0NvbXBhcmVQbHVnaW47Ci0JCi0JLyoqIE1hcHMgdHlwZSB0byBpY29ucyAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBmZ0ltYWdlcz0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0JLyoqIE1hcHMgdHlwZSB0byBJbWFnZURlc2NyaXB0b3JzICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZnSW1hZ2VEZXNjcmlwdG9ycz0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0JLyoqIE1hcHMgSW1hZ2VEZXNjcmlwdG9ycyB0byBJbWFnZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZmdJbWFnZXMyPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGZnRGlzcG9zZU9uU2h1dGRvd25JbWFnZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXByaXZhdGUgYm9vbGVhbiBmUmVnaXN0cmllc0luaXRpYWxpemVkOwotCXByaXZhdGUgQ29tcGFyZVJlZ2lzdHJ5IGZTdHJlYW1NZXJnZXJzPSBuZXcgQ29tcGFyZVJlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBDb21wYXJlUmVnaXN0cnkgZlN0cnVjdHVyZUNyZWF0b3JzPSBuZXcgQ29tcGFyZVJlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBDb21wYXJlUmVnaXN0cnkgZlN0cnVjdHVyZU1lcmdlVmlld2Vycz0gbmV3IENvbXBhcmVSZWdpc3RyeSgpOwotCXByaXZhdGUgQ29tcGFyZVJlZ2lzdHJ5IGZDb250ZW50Vmlld2Vycz0gbmV3IENvbXBhcmVSZWdpc3RyeSgpOwotCXByaXZhdGUgQ29tcGFyZVJlZ2lzdHJ5IGZDb250ZW50TWVyZ2VWaWV3ZXJzPSBuZXcgQ29tcGFyZVJlZ2lzdHJ5KCk7Ci0KLQlwcml2YXRlIE1hcCBmU3RydWN0dXJlVmlld2VyQWxpYXNlczsKLQlwcml2YXRlIENvbXBhcmVGaWx0ZXIgZkZpbHRlcjsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPkNvbXBhcmVVSVBsdWdpbjwvY29kZT4gb2JqZWN0IGFuZCByZWdpc3RlcnMgYWxsCi0JICogc3RydWN0dXJlIGNyZWF0b3JzLCBjb250ZW50IG1lcmdlIHZpZXdlcnMsIGFuZCBzdHJ1Y3R1cmUgbWVyZ2Ugdmlld2VycwotCSAqIGNvbnRyaWJ1dGVkIHRvIHRoaXMgcGx1Zy1pbidzIGV4dGVuc2lvbiBwb2ludHMuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IGluc3RhbmNlcyBvZiBwbHVnLWluIHJ1bnRpbWUgY2xhc3NlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIAotCSAqIGJ5IHRoZSBwbGF0Zm9ybSBpbiB0aGUgY291cnNlIG9mIHBsdWctaW4gYWN0aXZhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tcGFyZVVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlBc3NlcnQuaXNUcnVlKGZnQ29tcGFyZVBsdWdpbiA9PSBudWxsKTsKLQkJZmdDb21wYXJlUGx1Z2luPSB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlDb21wYXJlUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci0JCQkKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJUHJlZmVyZW5jZVN0b3JlIHBzPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmVtZW1iZXJBbGlhc2VzKHBzKTsJCi0JCWlmIChmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlwcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCWZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQkKLQkJaWYgKGZnRGlzcG9zZU9uU2h1dGRvd25JbWFnZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaT0gZmdEaXNwb3NlT25TaHV0ZG93bkltYWdlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSW1hZ2UgaW1nPSAoSW1hZ2UpIGkubmV4dCgpOwotCQkJCWlmICghaW1nLmlzRGlzcG9zZWQoKSkKLQkJCQkJaW1nLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZnSW1hZ2VzPSBudWxsOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnLWluIHJ1bnRpbWUgY2xhc3MuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjb21wYXJlIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBhcmVVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZmdDb21wYXJlUGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcGx1Zy1pbidzIHJlc291cmNlIGJ1bmRsZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJZlJlc291cmNlQnVuZGxlPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSk7Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwbHVnLWluJ3MgdW5pcXVlIGlkZW50aWZpZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwbHVnaW4ncyB1bmlxdWUgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUmVnaXN0cmllcygpIHsKLQkJaWYgKCFmUmVnaXN0cmllc0luaXRpYWxpemVkKSB7Ci0JCQlyZWdpc3RlckV4dGVuc2lvbnMoKTsKLQkJCWZSZWdpc3RyaWVzSW5pdGlhbGl6ZWQ9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFsbCBzdHJlYW0gbWVyZ2Vycywgc3RydWN0dXJlIGNyZWF0b3JzLCBjb250ZW50IG1lcmdlIHZpZXdlcnMsIGFuZCBzdHJ1Y3R1cmUgbWVyZ2Ugdmlld2VycwotCSAqIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBYTUwgcGx1Z2luIGZpbGVzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckV4dGVuc2lvbnMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeT0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCi0JCS8vIGNvbGxlY3QgYWxsIElTdHJlYW1NZXJnZXJzCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoUExVR0lOX0lELCBTVFJFQU1fTUVSR0VSX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCSAgICAJCWlmIChTVFJFQU1fTUVSR0VSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJZlN0cmVhbU1lcmdlcnMucmVnaXN0ZXIoZWxlbWVudCwgbmV3IFN0cmVhbU1lcmdlckRlc2NyaXB0b3IoZWxlbWVudCkpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCSAgICAJCWlmIChDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCSAgICAJCSAgICBmU3RyZWFtTWVyZ2Vycy5jcmVhdGVCaW5kaW5nKGVsZW1lbnQsIFNUUkVBTV9NRVJHRVJfSURfQVRUUklCVVRFKTsKLQkJfQotCQkJCQotCQkvLyBjb2xsZWN0IGFsbCBJU3RydWN0dXJlQ3JlYXRvcnMKLQkJZWxlbWVudHM9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihQTFVHSU5fSUQsIFNUUlVDVFVSRV9DUkVBVE9SX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkgICAgU3RyaW5nIG5hbWU9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkgICAgaWYgKCFDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMobmFtZSkpIHsKLQkJICAgICAgICBpZiAoIVNUUlVDVFVSRV9DUkVBVE9SLmVxdWFscyhuYW1lKSkKLQkgICAgICAgICAgICAgICAgbG9nRXJyb3JNZXNzYWdlKFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi51bmV4cGVjdGVkVGFnIiwgbmFtZSwgU1RSVUNUVVJFX0NSRUFUT1IpKTsgLy8kTk9OLU5MUy0xJAkJICAgICAgICAgICAgCi0JCSAgICAgICAgZlN0cnVjdHVyZUNyZWF0b3JzLnJlZ2lzdGVyKGVsZW1lbnQsIG5ldyBTdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCSAgICB9Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBpZiAoQ09OVEVOVF9UWVBFX0JJTkRJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJICAgICAgICBmU3RydWN0dXJlQ3JlYXRvcnMuY3JlYXRlQmluZGluZyhlbGVtZW50LCBTVFJVQ1RVUkVfQ1JFQVRPUl9JRF9BVFRSSUJVVEUpOwotCQl9Ci0JCQkJCi0JCS8vIGNvbGxlY3QgYWxsIHZpZXdlcnMgd2hpY2ggZGVmaW5lIHRoZSBzdHJ1Y3R1cmUgbWVyZ2V2aWV3ZXIgZXh0ZW5zaW9uIHBvaW50Ci0JCWVsZW1lbnRzPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoUExVR0lOX0lELCBTVFJVQ1RVUkVfTUVSR0VfVklFV0VSX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkgICAgU3RyaW5nIG5hbWU9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkgICAgaWYgKCFDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMobmFtZSkpIHsKLQkJICAgICAgICBpZiAoIVZJRVdFUl9UQUcuZXF1YWxzKG5hbWUpKQotCSAgICAgICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2UoVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLnVuZXhwZWN0ZWRUYWciLCBuYW1lLCBWSUVXRVJfVEFHKSk7IC8vJE5PTi1OTFMtMSQJCSAgICAgICAgICAgIAotCQkgICAgICAgIGZTdHJ1Y3R1cmVNZXJnZVZpZXdlcnMucmVnaXN0ZXIoZWxlbWVudCwgbmV3IFZpZXdlckRlc2NyaXB0b3IoZWxlbWVudCkpOwotCQkgICAgfQotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkgICAgaWYgKENPTlRFTlRfVFlQRV9CSU5ESU5HLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCSAgICAgICAgZlN0cnVjdHVyZU1lcmdlVmlld2Vycy5jcmVhdGVCaW5kaW5nKGVsZW1lbnQsIFNUUlVDVFVSRV9NRVJHRV9WSUVXRVJfSURfQVRUUklCVVRFKTsKLQkJfQotCQkKLQkJLy8gY29sbGVjdCBhbGwgdmlld2VycyB3aGljaCBkZWZpbmUgdGhlIGNvbnRlbnQgbWVyZ2V2aWV3ZXIgZXh0ZW5zaW9uIHBvaW50Ci0JCWVsZW1lbnRzPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoUExVR0lOX0lELCBDT05URU5UX01FUkdFX1ZJRVdFUl9FWFRFTlNJT05fUE9JTlQpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50PSBlbGVtZW50c1tpXTsKLQkJICAgIFN0cmluZyBuYW1lPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJICAgIGlmICghQ09OVEVOVF9UWVBFX0JJTkRJTkcuZXF1YWxzKG5hbWUpKSB7Ci0JCSAgICAgICAgaWYgKCFWSUVXRVJfVEFHLmVxdWFscyhuYW1lKSkKLQkgICAgICAgICAgICAgICAgbG9nRXJyb3JNZXNzYWdlKFV0aWxpdGllcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi51bmV4cGVjdGVkVGFnIiwgbmFtZSwgVklFV0VSX1RBRykpOyAvLyROT04tTkxTLTEkCQkgICAgICAgICAgICAKLQkJICAgICAgICBmQ29udGVudE1lcmdlVmlld2Vycy5yZWdpc3RlcihlbGVtZW50LCBuZXcgVmlld2VyRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCSAgICB9Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBpZiAoQ09OVEVOVF9UWVBFX0JJTkRJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJICAgICAgICBmQ29udGVudE1lcmdlVmlld2Vycy5jcmVhdGVCaW5kaW5nKGVsZW1lbnQsIENPTlRFTlRfTUVSR0VfVklFV0VSX0lEX0FUVFJJQlVURSk7Ci0JCX0KLQkJCi0JCS8vIGNvbGxlY3QgYWxsIHZpZXdlcnMgd2hpY2ggZGVmaW5lIHRoZSBjb250ZW50IHZpZXdlciBleHRlbnNpb24gcG9pbnQKLQkJZWxlbWVudHM9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihQTFVHSU5fSUQsIENPTlRFTlRfVklFV0VSX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkgICAgU3RyaW5nIG5hbWU9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkgICAgaWYgKCFDT05URU5UX1RZUEVfQklORElORy5lcXVhbHMobmFtZSkpIHsKLQkJICAgICAgICBpZiAoIVZJRVdFUl9UQUcuZXF1YWxzKG5hbWUpKQotCSAgICAgICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2UoVXRpbGl0aWVzLmdldEZvcm1hdHRlZFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLnVuZXhwZWN0ZWRUYWciLCBuYW1lLCBWSUVXRVJfVEFHKSk7IC8vJE5PTi1OTFMtMSQJCSAgICAgICAgICAgIAotCQkgICAgICAgIGZDb250ZW50Vmlld2Vycy5yZWdpc3RlcihlbGVtZW50LCBuZXcgVmlld2VyRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCSAgICB9Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCSAgICBpZiAoQ09OVEVOVF9UWVBFX0JJTkRJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJICAgICAgICBmQ29udGVudFZpZXdlcnMuY3JlYXRlQmluZGluZyhlbGVtZW50LCBDT05URU5UX1ZJRVdFUl9JRF9BVFRSSUJVVEUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaCBnZXRBY3RpdmVXb3JrYmVuY2goKSB7Ci0JCUNvbXBhcmVVSVBsdWdpbiBwbHVnaW49IGdldERlZmF1bHQoKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoPSBnZXRBY3RpdmVXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CQotCQlyZXR1cm4gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgd29ya2tiZW5jaCBwYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gYWN0aXZlIHdvcmtrYmVuY2ggcGFnZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGFjdGl2ZSB3b3Jra2JlbmNoIHBhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAJbm8gYWN0aXZlIHdvcmtrYmVuY2ggcGFnZSBjYW4gYmUgZGV0ZXJtaW5lZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTV1QgU2hlbGwgb2YgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gd29ya2JlbmNoIHdpbmRvdyBpcyBhY3RpdmUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBTV1QgU2hlbGwgb2YgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIAlubyB3b3JrYmVuY2ggd2luZG93IGlzIGFjdGl2ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3aW5kb3cuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGltYWdlIGZvciBiZWluZyBkaXNwb3NlZCB3aGVuIHRoaXMgcGx1Zy1pbiBpcyBzaHV0ZG93bi4KLQkgKgotCSAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgdG8gcmVnaXN0ZXIgZm9yIGRpc3Bvc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2VPblNodXRkb3duKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJZmdEaXNwb3NlT25TaHV0ZG93bkltYWdlcy5hZGQoaW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tcGFyaXNvbiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGlucHV0IGFuZCBvcGVucyBhCi0JICogY29tcGFyZSBlZGl0b3Igb24gdGhlIHJlc3VsdC4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb24gd2hpY2ggdG8gb3BlbiB0aGUgY29tcGFyZSBlZGl0b3IKLQkgKiBAcGFyYW0gcGFnZSB0aGUgd29ya2JlbmNoIHBhZ2Ugb24gd2hpY2ggdG8gY3JlYXRlIGEgbmV3IGNvbXBhcmUgZWRpdG9yCi0JICogQHBhcmFtIGVkaXRvciBpZiBub3QgbnVsbCB0aGUgaW5wdXQgaXMgb3BlbmVkIGluIHRoaXMgZWRpdG9yCi0JICogQHNlZSBDb21wYXJlRWRpdG9ySW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuQ29tcGFyZUVkaXRvcihDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQsIElXb3JrYmVuY2hQYWdlIHBhZ2UsIElSZXVzYWJsZUVkaXRvciBlZGl0b3IpIHsKLQkgICAgCi0JCWlmIChjb21wYXJlUmVzdWx0T0soaW5wdXQpKSB7Ci0JCQkKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewkvLyByZXVzZSB0aGUgZ2l2ZW4gZWRpdG9yCi0JCQkJZWRpdG9yLnNldElucHV0KGlucHV0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmIChwYWdlID09IG51bGwpCi0JCQkJcGFnZT0gZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCS8vIG9wZW4gbmV3IENvbXBhcmVFZGl0b3Igb24gcGFnZQotCQkJCXRyeSB7Ci0JCQkJCXBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgQ09NUEFSRV9FRElUT1IpOwotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLm9wZW5FZGl0b3JFcnJvciIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9CQkKLQkJCX0gZWxzZSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwKLQkJCQkJCVV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi5vcGVuRWRpdG9yRXJyb3IiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJVXRpbGl0aWVzLmdldFN0cmluZygiQ29tcGFyZVVJUGx1Z2luLm5vQWN0aXZlV29ya2JlbmNoUGFnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBhbmQgb3BlbnMgYQotCSAqIGNvbXBhcmUgZGlhbG9nIG9uIHRoZSByZXN1bHQuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9uIHdoaWNoIHRvIG9wZW4gdGhlIGNvbXBhcmUgZWRpdG9yCi0JICogQHNlZSBDb21wYXJlRWRpdG9ySW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuQ29tcGFyZURpYWxvZyhmaW5hbCBDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJCQkKLQkJaWYgKGNvbXBhcmVSZXN1bHRPSyhpbnB1dCkpIHsKLQkJCUNvbXBhcmVEaWFsb2cgZGlhbG9nPSBuZXcgQ29tcGFyZURpYWxvZyhnZXRTaGVsbCgpLCBpbnB1dCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb21wYXJlIHJlc3VsdCBpcyBPSyB0byBzaG93LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVSZXN1bHRPSyhDb21wYXJlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGw9IGdldFNoZWxsKCk7Ci0JCXRyeSB7Ci0JCQkKLQkJCS8vIHJ1biBvcGVyYXRpb24gaW4gc2VwYXJhdGUgdGhyZWFkIGFuZCBtYWtlIGl0IGNhbmNlYWJsZQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgdHJ1ZSwgaW5wdXQpOwotCQkJCi0JCQlTdHJpbmcgbWVzc2FnZT0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlVUlQbHVnaW4uY29tcGFyZUZhaWxlZCIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKGlucHV0LmdldENvbXBhcmVSZXN1bHQoKSA9PSBudWxsKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi5kaWFsb2dUaXRsZSIpLCBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJDb21wYXJlVUlQbHVnaW4ubm9EaWZmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBjYW5jZWxsZWQgYnkgdXNlcgkJCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geCkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIFV0aWxpdGllcy5nZXRTdHJpbmcoIkNvbXBhcmVVSVBsdWdpbi5jb21wYXJlRmFpbGVkIiksIHguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8qCi0JICogUmVnaXN0ZXJzIGFuIGltYWdlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVySW1hZ2UoU3RyaW5nIHR5cGUsIEltYWdlIGltYWdlLCBib29sZWFuIGRpc3Bvc2UpIHsKLQkJZmdJbWFnZXMucHV0KG5vcm1hbGl6ZUNhc2UodHlwZSksIGltYWdlKTsKLQkJaWYgKGltYWdlICE9IG51bGwgJiYgZGlzcG9zZSkgewotCQkJZmdEaXNwb3NlT25TaHV0ZG93bkltYWdlcy5hZGQoaW1hZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHR5cGUsIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWZnSW1hZ2VEZXNjcmlwdG9ycy5wdXQobm9ybWFsaXplQ2FzZSh0eXBlKSwgZGVzY3JpcHRvcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCQotCQlVUkwgaW5zdGFsbFVSTD0gbnVsbDsKLQkJaWYgKGZnQ29tcGFyZVBsdWdpbiAhPSBudWxsKQotCQkJaW5zdGFsbFVSTD0gZmdDb21wYXJlUGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCWlmIChpbnN0YWxsVVJMICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJVVJMIHVybD0gbmV3IFVSTChpbnN0YWxsVVJMLCBVdGlsaXRpZXMuZ2V0SWNvblBhdGgobnVsbCkgKyByZWxhdGl2ZVBhdGgpOwotCQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYXJlZCBpbWFnZSBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIGEgZ2VuZXJpYyBpbWFnZSBpZiBub25lCi0JICogaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZTogSW1hZ2VzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBiZSBhdXRvbWl0aWNhbGx5IGRpc3Bvc2VkCi0JICogb2Ygd2hlbiB0aGlzIHBsdWctaW4gc2h1dHMgZG93bi4gQ2FsbGVycyBtdXN0IG5vdCBkaXNwb3NlIG9mIHRoZXNlCi0JICogaW1hZ2VzIHRoZW1zZWx2ZXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHR5cGUpIHsKLQkJCi0JCXR5cGU9IG5vcm1hbGl6ZUNhc2UodHlwZSk7Ci0JCQotCQlib29sZWFuIGRpc3Bvc2U9IGZhbHNlOwotCQlJbWFnZSBpbWFnZT0gbnVsbDsKLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCWltYWdlPSAoSW1hZ2UpIGZnSW1hZ2VzLmdldCh0eXBlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZD0gKEltYWdlRGVzY3JpcHRvcikgZmdJbWFnZURlc2NyaXB0b3JzLmdldCh0eXBlKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJaW1hZ2U9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQkJZGlzcG9zZT0gdHJ1ZTsKLQkJCX0KLQkJCQkKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGZnQ29tcGFyZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChJVHlwZWRFbGVtZW50LkZPTERFUl9UWVBFLmVxdWFscyh0eXBlKSkgewotCQkJCQkJaW1hZ2U9IGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJCQkJCS8vaW1hZ2U9IFNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWltYWdlPSBjcmVhdGVXb3JrYmVuY2hJbWFnZSh0eXBlKTsKLQkJCQkJCWRpc3Bvc2U9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZD0gKEltYWdlRGVzY3JpcHRvcikgZmdJbWFnZURlc2NyaXB0b3JzLmdldChub3JtYWxpemVDYXNlKCJmaWxlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCWltYWdlPSBpZC5jcmVhdGVJbWFnZSgpOwotCQkJCQlkaXNwb3NlPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCXJlZ2lzdGVySW1hZ2UodHlwZSwgaW1hZ2UsIGRpc3Bvc2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYXJlZCBpbWFnZSBmb3IgdGhlIGdpdmVuIGFkYXB0YWJsZS4KLQkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBxdWVyaWVzIHRoZSBnaXZlbiBhZGFwdGFibGUKLQkgKiBmb3IgaXRzIDxjb2RlPklXb3JrYmVuY2hBZGFwdGVyLmdldEltYWdlRGVzY3JpcHRvcjwvY29kZT4sIHdoaWNoIGl0Ci0JICogdXNlcyB0byBjcmVhdGUgYW4gaW1hZ2UgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIG9uZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBJbWFnZXMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGJlIGF1dG9taXRpY2FsbHkgZGlzcG9zZWQKLQkgKiBvZiB3aGVuIHRoaXMgcGx1Zy1pbiBzaHV0cyBkb3duLiBDYWxsZXJzIG11c3Qgbm90IGRpc3Bvc2Ugb2YgdGhlc2UKLQkgKiBpbWFnZXMgdGhlbXNlbHZlcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRhcHRhYmxlIHRoZSBhZGFwdGFibGUgZm9yIHdoaWNoIHRvIGZpbmQgYW4gaW1hZ2UKLQkgKiBAcmV0dXJuIGFuIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGFkYXB0YWJsZSkgewotCQlpZiAoYWRhcHRhYmxlICE9IG51bGwpIHsKLQkJCU9iamVjdCBvPSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJV29ya2JlbmNoQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKSB7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGlkPSAoKElXb3JrYmVuY2hBZGFwdGVyKSBvKS5nZXRJbWFnZURlc2NyaXB0b3IoYWRhcHRhYmxlKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCQlJbWFnZSBpbWFnZT0gKEltYWdlKWZnSW1hZ2VzMi5nZXQoaWQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJaW1hZ2U9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZnSW1hZ2VzMi5wdXQoaWQsIGltYWdlKTsKLQkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gTmVlZFdvcmsKLQkJCQkJCX0KLQkJCQkJCWZnRGlzcG9zZU9uU2h1dGRvd25JbWFnZXMuYWRkKGltYWdlKTsKLQotCQkJCQl9Ci0JCQkJCXJldHVybiBpbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEltYWdlIGNyZWF0ZVdvcmtiZW5jaEltYWdlKFN0cmluZyB0eXBlKSB7Ci0JCUlFZGl0b3JSZWdpc3RyeSBlcj0gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZD0gZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmb28uIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBpZC5jcmVhdGVJbWFnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIHN0cnVjdHVyZSBjcmVhdG9yIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0eXBlLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgZm9yIHdoaWNoIHRvIGZpbmQgYSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgZGVzY3JpcHRvciBoYXMgYmVlbiByZWdpc3RlcmVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yIGdldFN0cnVjdHVyZUNyZWF0b3IoU3RyaW5nIHR5cGUpIHsKLQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvcikgZlN0cnVjdHVyZUNyZWF0b3JzLnNlYXJjaCh0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmVhbSBtZXJnZXIgZm9yIHRoZSBnaXZlbiB0eXBlLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgZm9yIHdoaWNoIHRvIGZpbmQgYSBzdHJlYW0gbWVyZ2VyCi0JICogQHJldHVybiBhIHN0cmVhbSBtZXJnZXIgZm9yIHRoZSBnaXZlbiB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgc3RyZWFtIG1lcmdlciBoYXMgYmVlbiByZWdpc3RlcmVkCi0JICovCi0JcHVibGljIElTdHJlYW1NZXJnZXIgY3JlYXRlU3RyZWFtTWVyZ2VyKFN0cmluZyB0eXBlKSB7Ci0JCWluaXRpYWxpemVSZWdpc3RyaWVzKCk7Ci0JCVN0cmVhbU1lcmdlckRlc2NyaXB0b3IgZGVzY3JpcHRvcj0gKFN0cmVhbU1lcmdlckRlc2NyaXB0b3IpIGZTdHJlYW1NZXJnZXJzLnNlYXJjaCh0eXBlKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZVN0cmVhbU1lcmdlcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmVhbSBtZXJnZXIgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggdG8gZmluZCBhIHN0cmVhbSBtZXJnZXIKLQkgKiBAcmV0dXJuIGEgc3RyZWFtIG1lcmdlciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICBzdHJlYW0gbWVyZ2VyIGhhcyBiZWVuIHJlZ2lzdGVyZWQKLQkgKi8KLQlwdWJsaWMgSVN0cmVhbU1lcmdlciBjcmVhdGVTdHJlYW1NZXJnZXIoSUNvbnRlbnRUeXBlIHR5cGUpIHsKLQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJU3RyZWFtTWVyZ2VyRGVzY3JpcHRvciBkZXNjcmlwdG9yPSAoU3RyZWFtTWVyZ2VyRGVzY3JpcHRvcikgZlN0cmVhbU1lcmdlcnMuc2VhcmNoKHR5cGUpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlU3RyZWFtTWVyZ2VyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RydWN0dXJlIGNvbXBhcmUgdmlld2VyIGJhc2VkIG9uIGFuIG9sZCB2aWV3ZXIgYW5kIGFuIGlucHV0IG9iamVjdC4KLQkgKiBJZiB0aGUgb2xkIHZpZXdlciBpcyBzdWl0YWJsZSBmb3Igc2hvd2luZyB0aGUgaW5wdXQsIHRoZSBvbGQgdmlld2VyCi0JICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGlucHV0J3MgdHlwZSBpcyB1c2VkIHRvIGZpbmQgYSB2aWV3ZXIgZGVzY3JpcHRvciBpbiB0aGUgcmVnaXN0cnkKLQkgKiB3aGljaCBpbiB0dXJuIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0dXJlIGNvbXBhcmUgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIElmIG5vIHZpZXdlciBkZXNjcmlwdG9yIGNhbiBiZSBmb3VuZCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBvbGRWaWV3ZXIgYSBuZXcgdmlld2VyIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGlzIG9sZCB2aWV3ZXIgY2Fubm90IHNob3cgdGhlIGdpdmVuIGlucHV0Ci0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvYmplY3QgZm9yIHdoaWNoIHRvIGZpbmQgYSBzdHJ1Y3R1cmUgdmlld2VyCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb21wb3NpdGUgdW5kZXIgd2hpY2ggdGhlIG5ldyB2aWV3ZXIgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgY29uZmlndXJhdGlvbiB3aGljaCBpcyBwYXNzZWQgdG8gYSBuZXdseSBjcmVhdGVkIHZpZXdlcgotCSAqIEByZXR1cm4gdGhlIGNvbXBhcmUgdmlld2VyIHdoaWNoIGlzIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFZpZXdlciBmaW5kU3RydWN0dXJlVmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIElDb21wYXJlSW5wdXQgaW5wdXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCi0JCWlmIChpbnB1dC5nZXRMZWZ0KCkgPT0gbnVsbCB8fCBpbnB1dC5nZXRSaWdodCgpID09IG51bGwpCS8vIHdlIGRvbid0IHNob3cgdGhlIHN0cnVjdHVyZSBvZiBhZGRpdGlvbnMgb3IgZGVsZXRpb25zCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQkJCi0JCS8vIGNvbnRlbnQgdHlwZSBzZWFyY2gKLQkJSUNvbnRlbnRUeXBlIGN0eXBlPSBnZXRDb21tb25UeXBlKGdldENvbnRlbnRUeXBlcyhpbnB1dCkpOwotCQlpZiAoY3R5cGUgIT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJICAgIFZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcihmU3RydWN0dXJlTWVyZ2VWaWV3ZXJzLnNlYXJjaChjdHlwZSksIG9sZFZpZXdlciwgcGFyZW50LCBjb25maWd1cmF0aW9uKTsKLQkJICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJICAgICAgICByZXR1cm4gdmlld2VyOwotCQl9Ci0JCQotCQkvLyBvbGQgc3R5bGUgc2VhcmNoCi0JCVN0cmluZ1tdIHR5cGVzPSBnZXRUeXBlcyhpbnB1dCk7Ci0JCVN0cmluZyB0eXBlPSBudWxsOwotCQlpZiAoaXNIb21vZ2Vub3VzKHR5cGVzKSkgewotCQkJdHlwZT0gbm9ybWFsaXplQ2FzZSh0eXBlc1swXSk7Ci0JCQlpbml0aWFsaXplUmVnaXN0cmllcygpOwotCQkJSVZpZXdlckRlc2NyaXB0b3IgdmQ9IChJVmlld2VyRGVzY3JpcHRvcikgZlN0cnVjdHVyZU1lcmdlVmlld2Vycy5zZWFyY2godHlwZSk7Ci0JCQlpZiAodmQgPT0gbnVsbCkgewotCQkJCVN0cmluZyBhbGlhcz0gZ2V0U3RydWN0dXJlVmlld2VyQWxpYXModHlwZSk7Ci0JCQkJaWYgKGFsaWFzICE9IG51bGwpCi0JCQkJCXZkPSAoSVZpZXdlckRlc2NyaXB0b3IpIGZTdHJ1Y3R1cmVNZXJnZVZpZXdlcnMuc2VhcmNoKGFsaWFzKTsKLQkJCX0KLQkJCWlmICh2ZCAhPSBudWxsKQotCQkJCXJldHVybiB2ZC5jcmVhdGVWaWV3ZXIob2xkVmlld2VyLCBwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JCQotCQkvLyB3ZSBkaWRuJ3QgZm91bmQgYW55IHZpZXdlciBzbyBmYXIuCi0JCS8vIG5vdyB3ZSB0cnkgdG8gZmluZCBhIHN0cnVjdHVyZWNyZWF0b3IgZm9yIHRoZSBnZW5lcmljIFN0cnVjdHVyZURpZmZWaWV3ZXIKLQkJCi0JCVN0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yIHNjYz0gbnVsbDsKLQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJT2JqZWN0IGRlc2M9IGZTdHJ1Y3R1cmVDcmVhdG9ycy5zZWFyY2goY3R5cGUpOwkvLyBzZWFyY2ggZm9yIGNvbnRlbnQgdHlwZQotCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFN0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yKQotCQkgICAgc2NjPSAoU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3IpIGRlc2M7Ci0JCWlmIChzY2MgPT0gbnVsbCAmJiB0eXBlICE9IG51bGwpCi0JCSAgICBzY2M9IGdldFN0cnVjdHVyZUNyZWF0b3IodHlwZSk7CS8vIHNlYXJjaCBmb3Igb2xkLXN0eWxlIHR5cGUgc2NoZW1lCi0JCWlmIChzY2MgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZUNyZWF0b3Igc2M9IHNjYy5jcmVhdGVTdHJ1Y3R1cmVDcmVhdG9yKCk7Ci0JCQlpZiAoc2MgIT0gbnVsbCkgewotCQkJCVN0cnVjdHVyZURpZmZWaWV3ZXIgc2R2PSBuZXcgU3RydWN0dXJlRGlmZlZpZXdlcihwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOwotCQkJCXNkdi5zZXRTdHJ1Y3R1cmVDcmVhdG9yKHNjKTsKLQkJCQlyZXR1cm4gc2R2OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgY29udGVudCBjb21wYXJlIHZpZXdlciBiYXNlZCBvbiBhbiBvbGQgdmlld2VyIGFuZCBhbiBpbnB1dCBvYmplY3QuCi0JICogSWYgdGhlIG9sZCB2aWV3ZXIgaXMgc3VpdGFibGUgZm9yIHNob3dpbmcgdGhlIGlucHV0IHRoZSBvbGQgdmlld2VyCi0JICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgaW5wdXQncyB0eXBlIGlzIHVzZWQgdG8gZmluZCBhIHZpZXdlciBkZXNjcmlwdG9yIGluIHRoZSByZWdpc3RyeQotCSAqIHdoaWNoIGluIHR1cm4gaXMgdXNlZCB0byBjcmVhdGUgYSBjb250ZW50IGNvbXBhcmUgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIElmIG5vIHZpZXdlciBkZXNjcmlwdG9yIGNhbiBiZSBmb3VuZCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBvbGRWaWV3ZXIgYSBuZXcgdmlld2VyIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGlzIG9sZCB2aWV3ZXIgY2Fubm90IHNob3cgdGhlIGdpdmVuIGlucHV0Ci0JICogQHBhcmFtIGluIHRoZSBpbnB1dCBvYmplY3QgZm9yIHdoaWNoIHRvIGZpbmQgYSBjb250ZW50IHZpZXdlcgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBwYXJlbnQgY29tcG9zaXRlIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gY2MgYSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHBhc3NlZCB0byBhIG5ld2x5IGNyZWF0ZWQgdmlld2VyCi0JICogQHJldHVybiB0aGUgY29tcGFyZSB2aWV3ZXIgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHRoZSBnaXZlbiBpbnB1dCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGZpbmRDb250ZW50Vmlld2VyKFZpZXdlciBvbGRWaWV3ZXIsIE9iamVjdCBpbiwgQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MpIHsKLQkJCi0JCWlmIChpbiBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCVN0cmluZyB0eXBlPSBJVHlwZWRFbGVtZW50LlRFWFRfVFlQRTsKLQkJCQotCQkJaWYgKGluIGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkgewotCQkJCUlUeXBlZEVsZW1lbnQgdGluPSAoSVR5cGVkRWxlbWVudCkgaW47Ci0JCQkgICAgCQkgICAgCi0JCQkgICAgSUNvbnRlbnRUeXBlIGN0PSBnZXRDb250ZW50VHlwZSh0aW4pOwotCQkJCWlmIChjdCAhPSBudWxsKSB7Ci0JCQkJCWluaXRpYWxpemVSZWdpc3RyaWVzKCk7Ci0JCQkJCVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcihmQ29udGVudFZpZXdlcnMuc2VhcmNoKGN0KSwgb2xkVmlld2VyLCBwYXJlbnQsIGNjKTsKLQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHZpZXdlcjsKLQkJCQl9Ci0JCQkgICAgCi0JCQkJU3RyaW5nIHR5PSB0aW4uZ2V0VHlwZSgpOwotCQkJCWlmICh0eSAhPSBudWxsKQotCQkJCQl0eXBlPSB0eTsKLQkJCX0KLQkJCQotCQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJCVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcihmQ29udGVudFZpZXdlcnMuc2VhcmNoKHR5cGUpLCBvbGRWaWV3ZXIsIHBhcmVudCwgY2MpOwotCQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJCXJldHVybiB2aWV3ZXI7Ci0JCQkvLyBmYWxsYmFjawotCQkJcmV0dXJuIG5ldyBTaW1wbGVUZXh0Vmlld2VyKHBhcmVudCk7Ci0JCX0KLQotCQlpZiAoIShpbiBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJSUNvbXBhcmVJbnB1dCBpbnB1dD0gKElDb21wYXJlSW5wdXQpIGluOwotCQkKLQkJSUNvbnRlbnRUeXBlIGN0eXBlPSBnZXRDb21tb25UeXBlKGdldENvbnRlbnRUeXBlcyhpbnB1dCkpOwotCQlpZiAoY3R5cGUgIT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlZ2lzdHJpZXMoKTsKLQkJCVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcihmQ29udGVudE1lcmdlVmlld2Vycy5zZWFyY2goY3R5cGUpLCBvbGRWaWV3ZXIsIHBhcmVudCwgY2MpOwotCQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJCXJldHVybiB2aWV3ZXI7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHR5cGVzPSBnZXRUeXBlcyhpbnB1dCk7Ci0JCVN0cmluZyB0eXBlPSBudWxsOwotCQlpZiAoaXNIb21vZ2Vub3VzKHR5cGVzKSkKLQkJCXR5cGU9IHR5cGVzWzBdOwotCQkKLQkJaWYgKElUeXBlZEVsZW1lbnQuRk9MREVSX1RZUEUuZXF1YWxzKHR5cGUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJaW50IG49IDA7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKCFJVHlwZWRFbGVtZW50LlVOS05PV05fVFlQRS5lcXVhbHModHlwZXNbaV0pKSB7Ci0JCQkJCW4rKzsKLQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJCXR5cGU9IHR5cGVzW2ldOwkvLyByZW1lbWJlciB0aGUgZmlyc3Qga25vd24gdHlwZQotCQkJCX0KLQkJCWlmIChuID4gMSkJLy8gZG9uJ3QgdXNlIHRoZSB0eXBlIGlmIHRoZXJlIHdlcmUgbW9yZSB0aGFuIG9uZQotCQkJCXR5cGU9IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWluaXRpYWxpemVSZWdpc3RyaWVzKCk7Ci0JCQlWaWV3ZXIgdmlld2VyPSBnZXRWaWV3ZXIoZkNvbnRlbnRNZXJnZVZpZXdlcnMuc2VhcmNoKHR5cGUpLCBvbGRWaWV3ZXIsIHBhcmVudCwgY2MpOwotCQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJCXJldHVybiB2aWV3ZXI7Ci0JCX0KLQotCQkvLyBmYWxsYmFjawotCQlTdHJpbmcgbGVmdFR5cGU9IGd1ZXNzVHlwZShpbnB1dC5nZXRMZWZ0KCkpOwotCQlTdHJpbmcgcmlnaHRUeXBlPSBndWVzc1R5cGUoaW5wdXQuZ2V0UmlnaHQoKSk7Ci0JCQkKLQkJaWYgKGxlZnRUeXBlICE9IG51bGwgfHwgcmlnaHRUeXBlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gcmlnaHRfdGV4dD0gcmlnaHRUeXBlICE9IG51bGwgJiYgSVR5cGVkRWxlbWVudC5URVhUX1RZUEUuZXF1YWxzKHJpZ2h0VHlwZSk7Ci0JCQlib29sZWFuIGxlZnRfdGV4dD0gbGVmdFR5cGUgIT0gbnVsbCAmJiBJVHlwZWRFbGVtZW50LlRFWFRfVFlQRS5lcXVhbHMobGVmdFR5cGUpOwotCQkJaWYgKChsZWZ0VHlwZSA9PSBudWxsICYmIHJpZ2h0X3RleHQpIHx8IChsZWZ0X3RleHQgJiYgcmlnaHRUeXBlID09IG51bGwpIHx8IChsZWZ0X3RleHQgJiYgcmlnaHRfdGV4dCkpCi0JCQkJdHlwZT0gSVR5cGVkRWxlbWVudC5URVhUX1RZUEU7Ci0JCQllbHNlCi0JCQkJdHlwZT0gQklOQVJZX1RZUEU7Ci0JCQkKLQkJCWluaXRpYWxpemVSZWdpc3RyaWVzKCk7Ci0JCQlJVmlld2VyRGVzY3JpcHRvciB2ZD0gKElWaWV3ZXJEZXNjcmlwdG9yKSBmQ29udGVudE1lcmdlVmlld2Vycy5zZWFyY2godHlwZSk7Ci0JCQlpZiAodmQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmQuY3JlYXRlVmlld2VyKG9sZFZpZXdlciwgcGFyZW50LCBjYyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFZpZXdlciBnZXRWaWV3ZXIoT2JqZWN0IGRlc2NyaXB0b3IsIFZpZXdlciBvbGRWaWV3ZXIsIENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIGNjKSB7ICAgIAotCSAgICBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIElWaWV3ZXJEZXNjcmlwdG9yKQotCQkJcmV0dXJuICgoSVZpZXdlckRlc2NyaXB0b3IpZGVzY3JpcHRvcikuY3JlYXRlVmlld2VyKG9sZFZpZXdlciwgcGFyZW50LCBjYyk7Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRUeXBlcyhJQ29tcGFyZUlucHV0IGlucHV0KSB7Ci0JCUlUeXBlZEVsZW1lbnQgYW5jZXN0b3I9IGlucHV0LmdldEFuY2VzdG9yKCk7Ci0JCUlUeXBlZEVsZW1lbnQgbGVmdD0gaW5wdXQuZ2V0TGVmdCgpOwotCQlJVHlwZWRFbGVtZW50IHJpZ2h0PSBpbnB1dC5nZXRSaWdodCgpOwotCQkKLQkJQXJyYXlMaXN0IHRtcD0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCWlmIChhbmNlc3RvciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZT0gYW5jZXN0b3IuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCSAgICB0bXAuYWRkKG5vcm1hbGl6ZUNhc2UodHlwZSkpOwotCQl9Ci0JCWlmIChsZWZ0ICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlPSBsZWZ0LmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkgICAgdG1wLmFkZChub3JtYWxpemVDYXNlKHR5cGUpKTsKLQkJfQotCQlpZiAocmlnaHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGU9IHJpZ2h0LmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkgICAgdG1wLmFkZChub3JtYWxpemVDYXNlKHR5cGUpKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSB0bXAudG9BcnJheShuZXcgU3RyaW5nW3RtcC5zaXplKCldKTsKLQl9Ci0JCQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZVtdIGdldENvbnRlbnRUeXBlcyhJQ29tcGFyZUlucHV0IGlucHV0KSB7Ci0JCUlUeXBlZEVsZW1lbnQgYW5jZXN0b3I9IGlucHV0LmdldEFuY2VzdG9yKCk7Ci0JCUlUeXBlZEVsZW1lbnQgbGVmdD0gaW5wdXQuZ2V0TGVmdCgpOwotCQlJVHlwZWRFbGVtZW50IHJpZ2h0PSBpbnB1dC5nZXRSaWdodCgpOwotCQkKLQkJQXJyYXlMaXN0IHRtcD0gbmV3IEFycmF5TGlzdCgpOwkJCQkKLQkgICAgSUNvbnRlbnRUeXBlIHR5cGU9IGdldENvbnRlbnRUeXBlKGFuY2VzdG9yKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJICAgIHRtcC5hZGQodHlwZSk7Ci0JICAgIHR5cGU9IGdldENvbnRlbnRUeXBlKGxlZnQpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkgICAgdG1wLmFkZCh0eXBlKTsKLQkJdHlwZT0gZ2V0Q29udGVudFR5cGUocmlnaHQpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkgICAgdG1wLmFkZCh0eXBlKTsKLQkJCi0JCXJldHVybiAoSUNvbnRlbnRUeXBlW10pIHRtcC50b0FycmF5KG5ldyBJQ29udGVudFR5cGVbdG1wLnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoSVR5cGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgU3RyaW5nIG5hbWU9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQlJQ29udGVudFR5cGVbXSBhc3NvY2lhdGVkPSBmZ0NvbnRlbnRUeXBlTWFuYWdlci5maW5kQ29udGVudFR5cGVzRm9yKG5hbWUpOwotCQlpZiAoYXNzb2NpYXRlZC5sZW5ndGggPiAwKQotCQkgICAgcmV0dXJuIGFzc29jaWF0ZWRbMF07Ci0gICAgICAgIElDb250ZW50VHlwZSBjdD0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCSAgICBJU3RyZWFtQ29udGVudEFjY2Vzc29yIGlzYT0gKElTdHJlYW1Db250ZW50QWNjZXNzb3IpIGVsZW1lbnQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzPSBpc2EuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotCSAgICAJCSAgICAgICAgSW5wdXRTdHJlYW0gYmlzPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7Ci0JICAgIAkJICAgICAgICB0cnkgewotCSAgICAJCSAgICAgICAgICAgIGN0PSBmZ0NvbnRlbnRUeXBlTWFuYWdlci5maW5kQ29udGVudFR5cGVGb3IoaXMsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJLy8gc2lsZW50bHkgaWdub3JlZAotICAgICAgICAgICAgICAgICAgICB9Ci0JICAgIAkJICAgICAgICB0cnkgewotCSAgICAJCSAgICAgICAgICAgIAliaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAJCSAgICAJCX0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIAkJLy8gc2lsZW50bHkgaWdub3JlZAotICAgICAgICAgICAgfQotCQl9Ci0gICAgICAgIHJldHVybiBjdDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGVzIGFyZSBob21vZ2Vub3VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIb21vZ2Vub3VzKFN0cmluZ1tdIHR5cGVzKSB7Ci0JCXN3aXRjaCAodHlwZXMubGVuZ3RoKSB7Ci0JCWNhc2UgMToKLQkJCXJldHVybiB0cnVlOwotCQljYXNlIDI6Ci0JCQlyZXR1cm4gdHlwZXNbMF0uZXF1YWxzKHR5cGVzWzFdKTsKLQkJY2FzZSAzOgotCQkJcmV0dXJuIHR5cGVzWzBdLmVxdWFscyh0eXBlc1sxXSkgJiYgdHlwZXNbMV0uZXF1YWxzKHR5cGVzWzJdKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0aGUgbW9zdCBzcGVjaWZpYyBjb250ZW50IHR5cGUgdGhhdCBpcyBjb21tb24gdG8gdGhlIGdpdmVuIGlucHV0cyBvciBudWxsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZSBnZXRDb21tb25UeXBlKElDb250ZW50VHlwZVtdIHR5cGVzKSB7Ci0JICAgIFNldCBzPSBudWxsOwotCSAgICBBcnJheUxpc3QgbD0gbnVsbDsKLQkgICAgCXN3aXRjaCAodHlwZXMubGVuZ3RoKSB7Ci0JCWNhc2UgMToKLQkJCXJldHVybiB0eXBlc1swXTsKLQkJY2FzZSAyOgotCQkgICAgbD0gbmV3IEFycmF5TGlzdCgpOwotCQkgICAgcz0gdG9TZXQobCwgdHlwZXNbMF0pOwotCQkgICAgcy5yZXRhaW5BbGwodG9TZXQobCwgdHlwZXNbMV0pKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCSAgICBsPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgICBzPSB0b1NldChsLCB0eXBlc1swXSk7Ci0JCSAgICBzLnJldGFpbkFsbCh0b1NldChsLCB0eXBlc1sxXSkpOwotCQkgICAgcy5yZXRhaW5BbGwodG9TZXQobCwgdHlwZXNbMl0pKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzICE9IG51bGwgJiYgIXMuaXNFbXB0eSgpKSB7Ci0JCSAgICBJdGVyYXRvciBpdGVyPSBsLml0ZXJhdG9yKCk7Ci0JCSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJICAgICAgICBJQ29udGVudFR5cGUgY3Q9IChJQ29udGVudFR5cGUpIGl0ZXIubmV4dCgpOwotCQkgICAgICAgIGlmIChzLmNvbnRhaW5zKGN0KSkKLQkJICAgICAgICAgICAgcmV0dXJuIGN0OwotCQkgICAgfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTZXQgdG9TZXQoQXJyYXlMaXN0IGwsIElDb250ZW50VHlwZSBjdCkgewotCSAgICBTZXQgc2V0PSBuZXcgSGFzaFNldCgpOwotCSAgICBmb3IgKDsgY3QgIT0gbnVsbDsgY3Q9IGN0LmdldEJhc2VUeXBlKCkpIHsKLQkgICAgICAgIGwuYWRkKGN0KTsKLQkgICAgICAgIHNldC5hZGQoY3QpOwotCSAgICB9Ci0JICAgIHJldHVybiBzZXQ7Ci0JfQotCQotCS8qCi0JICogR3Vlc3NlcyB0aGUgZmlsZSB0eXBlIG9mIHRoZSBnaXZlbiBpbnB1dC4KLQkgKiBSZXR1cm5zIElUeXBlZEVsZW1lbnQuVEVYVF9UWVBFIGlmIG5vbmUgb2YgdGhlIGZpcnN0IDEwIGxpbmVzIGlzIGxvbmdlciB0aGFuIDEwMDAgYnl0ZXMuCi0JICogUmV0dXJucyBJVHlwZWRFbGVtZW50LlVOS05PV05fVFlQRSBvdGhlcndpc2UuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgaXNuJ3QgYW4gPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGd1ZXNzVHlwZShJVHlwZWRFbGVtZW50IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpIHsKLQkJCUlTdHJlYW1Db250ZW50QWNjZXNzb3Igc2NhPSAoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgaW5wdXQ7Ci0JCQlJbnB1dFN0cmVhbSBpcz0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXM9IHNjYS5nZXRDb250ZW50cygpOwotCQkJCWlmIChpcyA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpbnQgbGluZUxlbmd0aD0gMDsKLQkJCQlpbnQgbGluZXM9IDA7Ci0JCQkJd2hpbGUgKGxpbmVzIDwgMTApIHsKLQkJCQkJaW50IGM9IGlzLnJlYWQoKTsKLQkJCQkJaWYgKGMgPT0gLTEpCS8vIEVPRgotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKSB7IC8vIHJlc2V0IGxpbmUgbGVuZ3RoCi0JCQkJCQlsaW5lTGVuZ3RoPSAwOwotCQkJCQkJbGluZXMrKzsKLQkJCQkJfSBlbHNlCi0JCQkJCQlsaW5lTGVuZ3RoKys7Ci0JCQkJCWlmIChsaW5lTGVuZ3RoID4gMTAwMCkKLQkJCQkJCXJldHVybiBJVHlwZWRFbGVtZW50LlVOS05PV05fVFlQRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIElUeXBlZEVsZW1lbnQuVEVYVF9UWVBFOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGJlIHNpbGVudCBhbmQgcmV0dXJuIFVOS05PV05fVFlQRQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBiZSBzaWxlbnQgYW5kIHJldHVybiBVTktOT1dOX1RZUEUKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBub3JtYWxpemVDYXNlKFN0cmluZyBzKSB7Ci0JCWlmIChOT1JNQUxJWkVfQ0FTRSAmJiBzICE9IG51bGwpCi0JCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpOwotCQlyZXR1cm4gczsKLQl9Ci0JCi0JLy8tLS0tIGFsaWFzIG1nbXQKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcyhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0U3RydWN0dXJlVmlld2VyQWxpYXNlcygpLmdldCh0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcyhTdHJpbmcgdHlwZSwgU3RyaW5nIGFsaWFzKSB7Ci0JCWdldFN0cnVjdHVyZVZpZXdlckFsaWFzZXMoKS5wdXQobm9ybWFsaXplQ2FzZShhbGlhcyksIG5vcm1hbGl6ZUNhc2UodHlwZSkpOwotCX0KLQkKLQlwcml2YXRlIE1hcCBnZXRTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzKCkgewotCQlpZiAoZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMgPT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZVZpZXdlckFsaWFzZXM9IG5ldyBIYXNodGFibGUoMTApOwotCQkJU3RyaW5nIGFsaWFzZXM9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhTVFJVQ1RVUkVWSUVXRVJfQUxJQVNFU19QUkVGRVJFTkNFX05BTUUpOwotCQkJaWYgKGFsaWFzZXMgIT0gbnVsbCAmJiBhbGlhc2VzLmxlbmd0aCgpID4gMCkgewotCQkJCVN0cmluZ1Rva2VuaXplciBzdD0gbmV3IFN0cmluZ1Rva2VuaXplcihhbGlhc2VzLCAiICIpOwkvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgcGFpcj0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCWludCBwb3M9IHBhaXIuaW5kZXhPZignLicpOwotCQkJCQlpZiAocG9zID4gMCkgewotCQkJCQkJU3RyaW5nIGtleT0gcGFpci5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCQkJCVN0cmluZyBhbGlhcz0gcGFpci5zdWJzdHJpbmcocG9zKzEpOwotCQkJCQkJZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMucHV0KGtleSwgYWxpYXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmU3RydWN0dXJlVmlld2VyQWxpYXNlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsU3RydWN0dXJlVmlld2VyQWxpYXNlcyhTdHJpbmcgdHlwZSkgewotCQlpZiAoZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHQ9IG5vcm1hbGl6ZUNhc2UodHlwZSk7Ci0JCVNldCBlbnRyeVNldD0gZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMuZW50cnlTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyPSBlbnRyeVNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnk9IChNYXAuRW50cnkpaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0VmFsdWUoKS5lcXVhbHModCkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENvbnZlcnRzIHRoZSBhbGlhc2VzIGludG8gYSBzaW5nbGUgc3RyaW5nIGJlZm9yZSB0aGV5IGFyZSBzdG9yZWQKLQkgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiBUaGUgZm9ybWF0IGlzOgotCSAqIDxrZXk+ICcuJyA8YWxpYXM+ICcgJyA8a2V5PiAnLicgPGFsaWFzPiAuLi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtZW1iZXJBbGlhc2VzKElQcmVmZXJlbmNlU3RvcmUgcHMpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVWaWV3ZXJBbGlhc2VzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcj0gZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5PSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhbGlhcz0gKFN0cmluZykgZlN0cnVjdHVyZVZpZXdlckFsaWFzZXMuZ2V0KGtleSk7Ci0JCQlidWZmZXIuYXBwZW5kKGtleSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGFsaWFzKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJfQotCQlwcy5zZXRWYWx1ZShTVFJVQ1RVUkVWSUVXRVJfQUxJQVNFU19QUkVGRVJFTkNFX05BTUUsIGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvLy0tLS0gZmlsdGVycwotCQotCXB1YmxpYyBib29sZWFuIGZpbHRlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0ZvbGRlciwgYm9vbGVhbiBpc0FyY2hpdmUpIHsKLQkgICAgaWYgKGZGaWx0ZXIgPT0gbnVsbCkgewotCQkJZkZpbHRlcj0gbmV3IENvbXBhcmVGaWx0ZXIoKTsKLQkJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHM9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJZkZpbHRlci5zZXRGaWx0ZXJzKHBzLmdldFN0cmluZyhDb21wYXJlUHJlZmVyZW5jZVBhZ2UuUEFUSF9GSUxURVIpKTsKLQkJCWZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlpZiAoQ29tcGFyZVByZWZlcmVuY2VQYWdlLlBBVEhfRklMVEVSLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkKLQkJCQkJCWZGaWx0ZXIuc2V0RmlsdGVycyhwcy5nZXRTdHJpbmcoQ29tcGFyZVByZWZlcmVuY2VQYWdlLlBBVEhfRklMVEVSKSk7Ci0JCQkJfQotCQkJfTsKLQkJCXBzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCSAgICB9Ci0JICAgIHJldHVybiBmRmlsdGVyLmZpbHRlcihuYW1lLCBpc0ZvbGRlciwgaXNBcmNoaXZlKTsKLQl9Ci0KLQkvLy0tLS0gbW9yZSB1dGlsaXRpZXMKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBlZGl0b3JzIHRoYXQgaGF2ZSBhbiB1bnNhdmVkIGNvbnRlbnQuIElmIHRoZSBpZGVudGljYWwgY29udGVudCBpcyAKLQkgKiBwcmVzZW50ZWQgaW4gbW9yZSB0aGFuIG9uZSBlZGl0b3IsIG9ubHkgb25lIG9mIHRob3NlIGVkaXRvciBwYXJ0cyBpcyBwYXJ0IG9mIHRoZSByZXN1bHQuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhbGwgZGlydHkgZWRpdG9yIHBhcnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnRbXSBnZXREaXJ0eUVkaXRvcnMoKSB7Ci0JCVNldCBpbnB1dHM9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KDApOwotCQlJV29ya2JlbmNoIHdvcmtiZW5jaD0gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cz0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXM9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKLQkJCWZvciAoaW50IHg9IDA7IHggPCBwYWdlcy5sZW5ndGg7IHgrKykgewotCQkJCUlFZGl0b3JQYXJ0W10gZWRpdG9ycz0gcGFnZXNbeF0uZ2V0RGlydHlFZGl0b3JzKCk7Ci0JCQkJZm9yIChpbnQgej0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspIHsKLQkJCQkJSUVkaXRvclBhcnQgZXA9IGVkaXRvcnNbel07Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dD0gZXAuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKCFpbnB1dHMuY29udGFpbnMoaW5wdXQpKSB7Ci0JCQkJCQlpbnB1dHMuYWRkKGlucHV0KTsKLQkJCQkJCXJlc3VsdC5hZGQoZXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUVkaXRvclBhcnRbXSlyZXN1bHQudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZT0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElOVEVSTkFMX0VSUk9SLCBDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb21wYXJlUGx1Z2luLmludGVybmFsX2Vycm9yIiksIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Db21wYXJlV2l0aEVkaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QzNTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXJlV2l0aEVkaXRpb25BY3Rpb24gZXh0ZW5kcyBFZGl0aW9uQWN0aW9uIHsKLQkKLQlwdWJsaWMgQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uKCkgewotCQlzdXBlcihmYWxzZSwgIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mSGVscENvbnRleHRJZD0gSUNvbXBhcmVDb250ZXh0SWRzLkNPTVBBUkVfV0lUSF9FRElUSU9OX0RJQUxPRzsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0NvbXBhcmVXaXRoRWRpdGlvbkFjdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzhhOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQCgjKUNvbXBhcmVXaXRoRWRpdGlvbkFjdGlvbi5wcm9wZXJ0aWVzCi0jCi0jIFJlc291cmNlcyBmb3IgQ29tcGFyZVdpdGhFZGl0aW9uQWN0aW9uLmphdmEKLQotdGl0bGU9IENvbXBhcmUgd2l0aCBMb2NhbCBIaXN0b3J5Ci0KLXRyZWVUaXRsZUZvcm1hdD0gTG9jYWwgSGlzdG9yeSBvZiAnJ3swfScnCi1kYXRlSWNvbj0gb2JqMTYvZGF5X29iai5naWYKLXRpbWVJY29uPSBvYmoxNi9yZXNvdXJjZV9vYmouZ2lmCi0KLXRyZWVGb3JtYXQ9IHswfQotd29ya3NwYWNlVHJlZUZvcm1hdD0gezB9IChXb3Jrc3BhY2UgRmlsZSkKLXBhcnNlRXJyb3JGb3JtYXQ9IHswfSAoUGFyc2UgRXJyb3IpCi0KLWVkaXRpb25MYWJlbD0gTG9jYWwgSGlzdG9yeSAoezB9KQotd29ya3NwYWNlRWRpdGlvbkxhYmVsPSBXb3Jrc3BhY2UgRmlsZQotCi10YXJnZXRMYWJlbD0gRWRpdG9yIEJ1ZmZlcgotd29ya3NwYWNlVGFyZ2V0TGFiZWw9IFdvcmtzcGFjZSBGaWxlCi0KLXRvZGF5Rm9ybWF0PSBUb2RheSAoezB9KQoteWVzdGVyZGF5Rm9ybWF0PSBZZXN0ZXJkYXkgKHswfSkKLWRheUZvcm1hdD0gezB9Ci0KLWNsb3NlQnV0dG9uLmxhYmVsPUNsb3NlCi0KLW5vTG9jYWxIaXN0b3J5RXJyb3I9IE5vIGxvY2FsIGhpc3RvcnkgYXZhaWxhYmxlIGZvciBzZWxlY3RlZCByZXNvdXJjZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0RpZmZJbWFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRGlmZkltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTNlODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRGlmZkltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBDb21iaW5lcyBhbiBpbWFnZSB3aXRoIGFuIG92ZXJsYXkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmSW1hZ2UgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCi0Jc3RhdGljIGZpbmFsIGludCBIRUlHSFQ9IDE2OwotCi0JcHJpdmF0ZSBJbWFnZSBmQmFzZUltYWdlOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5SW1hZ2U7Ci0JcHJpdmF0ZSBpbnQgZldpZHRoOwotCXByaXZhdGUgYm9vbGVhbiBmTGVmdD0gdHJ1ZTsKLQotCXB1YmxpYyBEaWZmSW1hZ2UoSW1hZ2UgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXksIGludCB3KSB7Ci0JCWZCYXNlSW1hZ2U9IGJhc2U7Ci0JCWZPdmVybGF5SW1hZ2U9IG92ZXJsYXk7Ci0JCWZXaWR0aD0gdzsKLQl9Ci0KLQlwdWJsaWMgRGlmZkltYWdlKEltYWdlIGJhc2UsIEltYWdlRGVzY3JpcHRvciBvdmVybGF5LCBpbnQgdywgYm9vbGVhbiBvbkxlZnQpIHsKLQkJZkJhc2VJbWFnZT0gYmFzZTsKLQkJZk92ZXJsYXlJbWFnZT0gb3ZlcmxheTsKLQkJZldpZHRoPSB3OwotCQlmTGVmdD0gb25MZWZ0OwotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gbmV3IFBvaW50KGZXaWR0aCwgSEVJR0hUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmIChmTGVmdCkgewotCQkJaWYgKGZCYXNlSW1hZ2UgIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBiYXNlPSBmQmFzZUltYWdlLmdldEltYWdlRGF0YSgpOwotCQkJCWlmIChiYXNlID09IG51bGwpCi0JCQkJCWJhc2U9IERFRkFVTFRfSU1BR0VfREFUQTsKLQkJCQlkcmF3SW1hZ2UoYmFzZSwgZldpZHRoIC0gYmFzZS53aWR0aCwgMCk7Ci0JCQl9Ci0JCi0JCQlpZiAoZk92ZXJsYXlJbWFnZSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIG92ZXJsYXk9IGZPdmVybGF5SW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJaWYgKG92ZXJsYXkgPT0gbnVsbCkKLQkJCQkJb3ZlcmxheT0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJCWRyYXdJbWFnZShvdmVybGF5LCAwLCAoSEVJR0hUIC0gb3ZlcmxheS5oZWlnaHQpIC8gMik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZkJhc2VJbWFnZSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGJhc2U9IGZCYXNlSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCQkJYmFzZT0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJCWRyYXdJbWFnZShiYXNlLCAwLCAwKTsKLQkJCX0KLQkKLQkJCWlmIChmT3ZlcmxheUltYWdlICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgb3ZlcmxheT0gZk92ZXJsYXlJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJCQlpZiAob3ZlcmxheSA9PSBudWxsKQotCQkJCQlvdmVybGF5PSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0JCQkJZHJhd0ltYWdlKG92ZXJsYXksIGZXaWR0aCAtIG92ZXJsYXkud2lkdGgsIChIRUlHSFQgLSBvdmVybGF5LmhlaWdodCkgLyAyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0RvY0xpbmVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Eb2NMaW5lQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMwNjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0RvY0xpbmVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuSVRva2VuQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuSVJhbmdlQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPiBpbnRlcmZhY2UgZm9yIGxpbmVzIGluIGEgZG9jdW1lbnQuCi0gKiBBIDxjb2RlPkRvY0xpbmVDb21wYXJhdG9yPC9jb2RlPiBpcyB1c2VkIGFzIHRoZSBpbnB1dCBmb3IgdGhlIDxjb2RlPlJhbmdlRGlmZmVyZW5jZXI8L2NvZGU+Ci0gKiBlbmdpbmUgdG8gcGVyZm9ybSBhIGxpbmUgb3JpZW50ZWQgY29tcGFyZSBvbiBkb2N1bWVudHMuCi0gKiA8cD4KLSAqIEEgPGNvZGU+RG9jTGluZUNvbXBhcmF0b3I8L2NvZGU+IGRvZXNuJ3Qga25vdyBhbnl0aGluZyBhYm91dCBsaW5lIHNlcGFyYXRvcnMgYmVjYXVzZQotICogaXRzIG5vdGlvbiBvZiBsaW5lcyBpcyBzb2xlbHkgZGVmaW5lZCBpbiB0aGUgdW5kZXJseWluZyA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgRG9jTGluZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBJVG9rZW5Db21wYXJhdG9yIHsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmTGluZU9mZnNldDsKLQlwcml2YXRlIGludCBmTGluZUNvdW50OwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVXaGl0ZVNwYWNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkRvY0xpbmVDb21wYXJhdG9yPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGRvY3VtZW50IHJhbmdlLgotCSAqIGlnbm9yZVdoaXRlU3BhY2UgY29udHJvbHMgd2hldGhlciBjb21wYXJpbmcgbGluZXMgKGluIG1ldGhvZAotCSAqIDxjb2RlPnJhbmdlc0VxdWFsPGNvZGU+KSBzaG91bGQgaWdub3JlIHdoaXRlc3BhY2UuCi0JICoKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IGZyb20gd2hpY2ggdGhlIGxpbmVzIGFyZSB0YWtlbgotCSAqIEBwYXJhbSByZWdpb24gaWYgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9ubHkgbGluZXMgd2l0aGluIHRoaXMgcmFuZ2UgYXJlIHRha2VuCi0JICogQHBhcmFtIGlnbm9yZVdoaXRlU3BhY2UgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2hpdGUgc3BhY2UgaXMgaWdub3JlZCB3aGVuIGNvbXBhcmluZyBsaW5lcwotCSAqLwotCXB1YmxpYyBEb2NMaW5lQ29tcGFyYXRvcihJRG9jdW1lbnQgZG9jdW1lbnQsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGlnbm9yZVdoaXRlU3BhY2UpIHsKLQotCQlmRG9jdW1lbnQ9IGRvY3VtZW50OwotCQlmSWdub3JlV2hpdGVTcGFjZT0gaWdub3JlV2hpdGVTcGFjZTsKLQotCQlmTGluZU9mZnNldD0gMDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlmTGVuZ3RoPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgc3RhcnQ9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCXRyeSB7Ci0JCQkJZkxpbmVPZmZzZXQ9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0KLQkJCWlmIChmTGVuZ3RoID09IDApCi0JCQkJZkxpbmVDb3VudD0gMDsKLQkJCWVsc2UgewotCQkJCWludCBlbmRMaW5lPSBmRG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQkJCXRyeSB7Ci0JCQkJCWVuZExpbmU9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQgKyBmTGVuZ3RoKTsKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQkJCWZMaW5lQ291bnQ9IGVuZExpbmUgLSBmTGluZU9mZnNldCArIDE7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCWZMZW5ndGg9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCQkJZkxpbmVDb3VudD0gZkRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZG9jdW1lbnQuCi0JICoKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBsaW5lcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmFuZ2VDb3VudCgpIHsKLQkJcmV0dXJuIGZMaW5lQ291bnQ7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJVG9rZW5Db21wYXJhdG9yLmdldFRva2VuU3RhcnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRva2VuU3RhcnQoaW50IGxpbmUpIHsKLQkJdHJ5IHsKLQkJCUlSZWdpb24gcj0gZkRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihmTGluZU9mZnNldCArIGxpbmUpOwotCQkJcmV0dXJuIHIuZ2V0T2Zmc2V0KCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZkRvY3VtZW50LmdldExlbmd0aCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gbGluZS4KLQkgKiBzZWUgSVRva2VuQ29tcGFyYXRvci5nZXRUb2tlbkxlbmd0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VG9rZW5MZW5ndGgoaW50IGxpbmUpIHsKLQkJcmV0dXJuIGdldFRva2VuU3RhcnQobGluZSsxKSAtIGdldFRva2VuU3RhcnQobGluZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGxpbmUgZ2l2ZW4gYnkgdGhlIGZpcnN0IGluZGV4Ci0JICogbWF0Y2hlcyBhIGxpbmUgc3BlY2lmaWVkIGJ5IHRoZSBvdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPiBhbmQgaW5kZXguCi0JICoKLQkgKiBAcGFyYW0gdGhpc0luZGV4IHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgd2l0aGluIHRoaXMgcmFuZ2UgY29tcGFyYXRvcgotCSAqIEBwYXJhbSBvdGhlckNvbXBhcmF0b3IgdGhlIHJhbmdlIGNvbXBhcmF0b3IgdG8gY29tcGFyZSB0aGlzIHdpdGgKLQkgKiBAcGFyYW0gb3RoZXJJbmRleCB0aGUgbnVtYmVyIG9mIHRoZSBsaW5lIHdpdGhpbiB0aGUgb3RoZXIgY29tcGFyYXRvcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpbmVzIGFyZSBlcXVhbAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJhbmdlc0VxdWFsKGludCB0aGlzSW5kZXgsIElSYW5nZUNvbXBhcmF0b3Igb3RoZXJDb21wYXJhdG9yLCBpbnQgb3RoZXJJbmRleCkgewotCi0JCWlmIChvdGhlckNvbXBhcmF0b3IgIT0gbnVsbCAmJiBvdGhlckNvbXBhcmF0b3IuZ2V0Q2xhc3MoKSA9PSBnZXRDbGFzcygpKSB7Ci0JCQlEb2NMaW5lQ29tcGFyYXRvciBvdGhlcj0gKERvY0xpbmVDb21wYXJhdG9yKSBvdGhlckNvbXBhcmF0b3I7Ci0KLQkJCWlmIChmSWdub3JlV2hpdGVTcGFjZSkgewotCQkJCVN0cmluZyBzMT0gZXh0cmFjdCh0aGlzSW5kZXgpOwotCQkJCVN0cmluZyBzMj0gb3RoZXIuZXh0cmFjdChvdGhlckluZGV4KTsKLQkJCQkvL3JldHVybiBzMS50cmltKCkuZXF1YWxzKHMyLnRyaW0oKSk7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoczEsIHMyKTsKLQkJCX0KLQotCQkJaW50IHRsZW49IGdldFRva2VuTGVuZ3RoKHRoaXNJbmRleCk7Ci0JCQlpbnQgb2xlbj0gb3RoZXIuZ2V0VG9rZW5MZW5ndGgob3RoZXJJbmRleCk7Ci0JCQlpZiAodGxlbiA9PSBvbGVuKSB7Ci0JCQkJU3RyaW5nIHMxPSBleHRyYWN0KHRoaXNJbmRleCk7Ci0JCQkJU3RyaW5nIHMyPSBvdGhlci5leHRyYWN0KG90aGVySW5kZXgpOwotCQkJCXJldHVybiBzMS5lcXVhbHMoczIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBYm9ydHMgdGhlIGNvbXBhcmlzb24gaWYgdGhlIG51bWJlciBvZiB0b2tlbnMgaXMgdG9vIGxhcmdlLgotCSAqIAotCSAqIEBwYXJhbSBsZW5ndGggYSBudW1iZXIgb24gd2hpY2ggdG8gYmFzZSB0aGUgZGVjaXNpb24gd2hldGhlciB0byByZXR1cm4KLQkgKiAJPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHBhcmFtIG1heExlbmd0aCBhbm90aGVyIG51bWJlciBvbiB3aGljaCB0byBiYXNlIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHRvIHJldHVybgotCSAqCTxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4gdG8gY29tcGFyZSB3aXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBhdm9pZCBhIHRvbyBsZW5ndGh5IHJhbmdlIGNvbXBhcmlzb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBza2lwUmFuZ2VDb21wYXJpc29uKGludCBsZW5ndGgsIGludCBtYXhMZW5ndGgsIElSYW5nZUNvbXBhcmF0b3Igb3RoZXIpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLy8tLS0tIHByaXZhdGUgbWV0aG9kcwotCQotCS8qKgotCSAqIEV4dHJhY3QgYSBzaW5nbGUgbGluZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50IHdpdGhvdXQgdGhlIGxpbmUgc2VwYXJhdG9yLgotCSAqCi0JICogQHBhcmFtIGxpbmUgdGhlIG51bWJlciBvZiB0aGUgbGluZSB0byBleHRyYWN0Ci0JICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgYXMgYSBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0KGludCBsaW5lKSB7Ci0JCWlmIChsaW5lIDwgZkxpbmVDb3VudCkgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIHI9IGZEb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oZkxpbmVPZmZzZXQgKyBsaW5lKTsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldChyLmdldE9mZnNldCgpLCByLmdldExlbmd0aCgpKTsKLQkJCX0gY2F0Y2goQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaW50IGwxPSBzMS5sZW5ndGgoKTsKLQkJaW50IGwyPSBzMi5sZW5ndGgoKTsKLQkJaW50IGMxPSAwLCBjMj0gMDsKLQkJaW50IGkxPSAwLCBpMj0gMDsKLQkJCi0JCXdoaWxlIChjMSAhPSAtMSkgewotCQkJCi0JCQljMT0gLTE7Ci0JCQl3aGlsZSAoaTEgPCBsMSkgewotCQkJCWNoYXIgYz0gczEuY2hhckF0KGkxKyspOwotCQkJCWlmICghIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQkJYzE9IGM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJYzI9IC0xOwotCQkJd2hpbGUgKGkyIDwgbDIpIHsKLQkJCQljaGFyIGM9IHMyLmNoYXJBdChpMisrKTsKLQkJCQlpZiAoISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJCWMyPSBjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkJCi0JCQlpZiAoYzEgIT0gYzIpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRG9jdW1lbnRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Eb2N1bWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5MWExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotLyoqCi0gKiBObyBBUEkgeWV0LgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRNYW5hZ2VyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZmdLZXlzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGZnVmFsdWVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHVibGljIHN0YXRpYyBJRG9jdW1lbnQgZ2V0KE9iamVjdCBvKSB7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgZmdLZXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoZmdLZXlzLmdldChpKSA9PSBvKQotCQkJCXJldHVybiAoSURvY3VtZW50KSBmZ1ZhbHVlcy5nZXQoaSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwdXQoT2JqZWN0IG8sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRNYW5hZ2VyLnB1dDogIiArIGRvY3VtZW50KTsJLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpPSAwOyBpIDwgZmdLZXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoZmdLZXlzLmdldChpKSA9PSBvKSB7Ci0JCQkJZmdWYWx1ZXMuc2V0KGksIGRvY3VtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZmdLZXlzLmFkZChvKTsKLQkJZmdWYWx1ZXMuYWRkKGRvY3VtZW50KTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZTogIiArIGRvY3VtZW50KTsJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZnVmFsdWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKGZnVmFsdWVzLmdldChpKSA9PSBkb2N1bWVudCkgewotCQkJCQlmZ0tleXMucmVtb3ZlKGkpOwotCQkJCQlmZ1ZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZTogbm90IGZvdW5kIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCgpIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50TWFuYWdlcjogbWFuYWdlZCBkb2NzOiIgKyBmZ1ZhbHVlcy5zaXplKCkpOwkvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRWRpdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvRWRpdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ0MGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0VkaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JU3RyZWFtQ29udGVudEFjY2Vzc29yOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZUNvbXBhcmVBY3Rpb24gewotCi0JLyoqCi0JICogSW1wbGVtZW50cyB0aGUgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBhbmQgSVR5cGVkRWxlbWVudCBwcm90b2NvbHMKLQkgKiBmb3IgYSBEb2N1bWVudC4KLQkgKi8KLQljbGFzcyBEb2N1bWVudEJ1ZmZlck5vZGUgaW1wbGVtZW50cyBJVHlwZWRFbGVtZW50LCBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTY9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkJcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQkJCi0JCURvY3VtZW50QnVmZmVyTm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIElGaWxlIGZpbGUpIHsKLQkJCWZEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCQlmRmlsZT0gZmlsZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIGZGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHsKLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVXRpbGl0aWVzLmdldEJ5dGVzKGZEb2N1bWVudC5nZXQoKSwgVVRGXzE2KSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB7Ci0JCQlyZXR1cm4gVVRGXzE2OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1bmRsZU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZXBsYWNlTW9kZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmUHJldmlvdXM9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmcgZkhlbHBDb250ZXh0SWQ7Ci0JCi0JRWRpdGlvbkFjdGlvbihib29sZWFuIHJlcGxhY2VNb2RlLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlmUmVwbGFjZU1vZGU9IHJlcGxhY2VNb2RlOwotCQlmQnVuZGxlTmFtZT0gYnVuZGxlTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIFV0aWxpdGllcy5nZXRGaWxlcyhzZWxlY3Rpb24pLmxlbmd0aCA9PSAxOwkJLy8gd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBzZWxlY3Rpb24gZm9yIG5vdwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJRmlsZVtdIGZpbGVzPSBVdGlsaXRpZXMuZ2V0RmlsZXMoc2VsZWN0aW9uKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotCQkJZG9Gcm9tSGlzdG9yeShmaWxlc1tpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRnJvbUhpc3RvcnkoZmluYWwgSUZpbGUgZmlsZSkgewotCQkJCQkJCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGZCdW5kbGVOYW1lKTsKLQkJU3RyaW5nIHRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlTaGVsbCBwYXJlbnRTaGVsbD0gQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCk7Ci0JCQotCQlJRmlsZVN0YXRlIHN0YXRlc1tdPSBudWxsOwotCQl0cnkgewotCQkJc3RhdGVzPSBmaWxlLmdldEhpc3RvcnkobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsJCQotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocGFyZW50U2hlbGwsIHRpdGxlLCBleC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc3RhdGVzID09IG51bGwgfHwgc3RhdGVzLmxlbmd0aCA8PSAwKSB7Ci0JCQlTdHJpbmcgbXNnPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgIm5vTG9jYWxIaXN0b3J5RXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24ocGFyZW50U2hlbGwsIHRpdGxlLCBtc2cpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJVHlwZWRFbGVtZW50IGJhc2U9IG5ldyBSZXNvdXJjZU5vZGUoZmlsZSk7Ci0JCQotCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IGdldERvY3VtZW50KGZpbGUpOwotCQlJVHlwZWRFbGVtZW50IHRhcmdldD0gYmFzZTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQl0YXJnZXQ9IG5ldyBEb2N1bWVudEJ1ZmZlck5vZGUoZG9jdW1lbnQsIGZpbGUpOwotCQotCQlJVHlwZWRFbGVtZW50W10gZWRpdGlvbnM9IG5ldyBJVHlwZWRFbGVtZW50W3N0YXRlcy5sZW5ndGgrMV07Ci0JCWVkaXRpb25zWzBdPSBiYXNlOwotCQlmb3IgKGludCBpPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKQotCQkJZWRpdGlvbnNbaSsxXT0gbmV3IEhpc3RvcnlJdGVtKGJhc2UsIHN0YXRlc1tpXSk7Ci0KLQkJRWRpdGlvblNlbGVjdGlvbkRpYWxvZyBkPSBuZXcgRWRpdGlvblNlbGVjdGlvbkRpYWxvZyhwYXJlbnRTaGVsbCwgYnVuZGxlKTsKLQkJZC5zZXRFZGl0aW9uVGl0bGVBcmd1bWVudChmaWxlLmdldE5hbWUoKSk7Ci0JCWQuc2V0RWRpdGlvblRpdGxlSW1hZ2UoQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlKGZpbGUpKTsKLQkJLy9kLnNldEhpZGVJZGVudGljYWxFbnRyaWVzKGZhbHNlKTsKLQkJaWYgKGZIZWxwQ29udGV4dElkICE9IG51bGwpCi0JCQlkLnNldEhlbHBDb250ZXh0SWQoZkhlbHBDb250ZXh0SWQpOwotCQkKLQkJaWYgKGZSZXBsYWNlTW9kZSkgewotCQkJCi0JCQlJVHlwZWRFbGVtZW50IHRpPSBudWxsOwotCQkJaWYgKGZQcmV2aW91cykKLQkJCQl0aT0gZC5zZWxlY3RQcmV2aW91c0VkaXRpb24odGFyZ2V0LCBlZGl0aW9ucywgbnVsbCk7Ci0JCQllbHNlCi0JCQkJdGk9IGQuc2VsZWN0RWRpdGlvbih0YXJnZXQsIGVkaXRpb25zLCBudWxsKTsKLQkJCQotCQkJaWYgKHRpIGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgewotCQkJCUlTdHJlYW1Db250ZW50QWNjZXNzb3Igc2E9IChJU3RyZWFtQ29udGVudEFjY2Vzc29yKXRpOwotCQkJCQotCQkJCWlmIChVdGlsaXRpZXMudmFsaWRhdGVSZXNvdXJjZShmaWxlLCBwYXJlbnRTaGVsbCwgdGl0bGUpKSB7Ci0JCQkJCXRyeSB7Ci0JCi0JCQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQkJCQl1cGRhdGVEb2N1bWVudChkb2N1bWVudCwgc2EpOwkKLQkJCQkJCWVsc2UKLQkJCQkJCQl1cGRhdGVXb3Jrc3BhY2UoYnVuZGxlLCBwYXJlbnRTaGVsbCwgc2EsIGZpbGUpOwotCQkJCQkJCQotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkvLyBEbyBub3RoaW5nLiBPcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsZWQgYnkgdXNlci4KLQkJCQkJCQotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHgpIHsKLQkJCQkJCVN0cmluZyByZWFzb249IHguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocGFyZW50U2hlbGwsIHRpdGxlLCBVdGlsaXRpZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKGJ1bmRsZSwgInJlcGxhY2VFcnJvciIsIHJlYXNvbikpOwkvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkLnNldENvbXBhcmVNb2RlKHRydWUpOwotCi0JCQlkLnNlbGVjdEVkaXRpb24odGFyZ2V0LCBlZGl0aW9ucywgbnVsbCk7CQkJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVdvcmtzcGFjZShmaW5hbCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFNoZWxsIHNoZWxsLAotCQkJCQkJZmluYWwgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzYSwgZmluYWwgSUZpbGUgZmlsZSkKLQkJCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CQotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHRhc2tOYW1lPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGJ1bmRsZSwgInRhc2tOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcG0uYmVnaW5UYXNrKHRhc2tOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKHNhLmdldENvbnRlbnRzKCksIGZhbHNlLCB0cnVlLCBwbSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXBtLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgcG1kaWFsb2c9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwkJCQkKLQkJcG1kaWFsb2cucnVuKGZhbHNlLCB0cnVlLCBvcGVyYXRpb24pOwkJCQkJCQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNhKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdGV4dD0gVXRpbGl0aWVzLnJlYWRTdHJpbmcoc2EpOwotCQkJZG9jdW1lbnQucmVwbGFjZSgwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgdGV4dCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KElGaWxlIGZpbGUpIHsKLQkJSVdvcmtiZW5jaCB3Yj0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdzPSB3Yi5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JCWlmICh3cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJRmlsZUVkaXRvcklucHV0IHRlc3Q9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSk7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgdz0gd3NbaV07Ci0JCQlJV29ya2JlbmNoUGFnZVtdIHdwcz0gdy5nZXRQYWdlcygpOwotCQkJaWYgKHdwcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaj0gMDsgaiA8IHdwcy5sZW5ndGg7IGorKykgewotCQkJCQlJV29ya2JlbmNoUGFnZSB3cD0gd3BzW2pdOwotCQkJCQlJRWRpdG9yUGFydCBlcD0gd3AuZmluZEVkaXRvcih0ZXN0KTsKLQkJCQkJaWYgKGVwIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJCUlUZXh0RWRpdG9yIHRlPSAoSVRleHRFZGl0b3IpIGVwOwotCQkJCQkJSURvY3VtZW50UHJvdmlkZXIgZHA9IHRlLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCQkJCWlmIChkcCAhPSBudWxsKSB7Ci0JCQkJCQkJSURvY3VtZW50IGRvYz0gZHAuZ2V0RG9jdW1lbnQoZXApOwotCQkJCQkJCWlmIChkb2MgIT0gbnVsbCkKLQkJCQkJCQkJcmV0dXJuIGRvYzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjODc0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgZXhjZXB0aW9uIGhhbmRsZXIgc2hvd3MgYW4gZXJyb3IgZGlhbG9nIHdoZW4gb25lIG9mIGl0cyBoYW5kbGUgbWV0aG9kcwotICogaXMgY2FsbGVkLiBJZiB0aGUgcGFzc2VkIGV4Y2VwdGlvbiBpcyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGFuIGVycm9yIGRpYWxvZwotICogcG9wcyB1cCBzaG93aW5nIHRoZSBleGNlcHRpb24ncyBzdGF0dXMgaW5mb3JtYXRpb24uIEZvciBhIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+Ci0gKiBhIG5vcm1hbCBtZXNzYWdlIGRpYWxvZyBwb3BzIHVwIHNob3dpbmcgdGhlIGV4Y2VwdGlvbidzIG1lc3NhZ2UuIEFkZGl0aW9uYWxseSB0aGUgZXhjZXB0aW9uCi0gKiBpcyB3cml0dGVuIHRvIHRoZSBwbGF0Zm9ybSBsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEV4Y2VwdGlvbkhhbmRsZXIgZmdJbnN0YW5jZT0gbmV3IEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkKLQkvKgotCSAqIExvZ3MgdGhlIGdpdmVuIGV4Y2VwdGlvbiB1c2luZyB0aGUgcGxhdGZvcm0ncyBsb2dnaW5nIG1lY2hhbmlzbS4gVGhlIGV4Y2VwdGlvbiBpcwotCSAqIGxvZ2dlZCBhcyBhbiBlcnJvciB3aXRoIHRoZSBlcnJvciBjb2RlIDxjb2RlPkphdmFTdGF0dXNDb25zdGFudHMuSU5URVJOQUxfRVJST1I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHQsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUNvbXBhcmVVSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb21wYXJlVUlQbHVnaW4uZ2V0UGx1Z2luSWQoKSwgCi0JCQlDb21wYXJlVUlQbHVnaW4uSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UsIHQpKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uIFRoZSB3b3JrYmVuY2ggc2hlbGwgaXMgdXNlZCBhcyBhIHBhcmVudAotCSAqIGZvciB0aGUgZGlhbG9nIHdpbmRvdy4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gdG8gYmUgaGFuZGxlZAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nIHdpbmRvdydzIHdpbmRvdyB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBkaWFsb2cgd2luZG93Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShDb3JlRXhjZXB0aW9uIGUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaGFuZGxlKGUsIENvbXBhcmVVSVBsdWdpbi5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgdGhlIGdpdmVuIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LiAKLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gdG8gYmUgaGFuZGxlZAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGRpYWxvZyB3aW5kb3cncyBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgdGhlIGRpYWxvZyB3aW5kb3cncyB3aW5kb3cgdGl0bGUKLQkgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgZGlhbG9nIHdpbmRvdwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGUoQ29yZUV4Y2VwdGlvbiBlLCBTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZmdJbnN0YW5jZS5wZXJmb3JtKGUsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBnaXZlbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPi4gVGhlIHdvcmtiZW5jaCBzaGVsbCBpcyB1c2VkIAotCSAqIGFzIGEgcGFyZW50IGZvciB0aGUgZGlhbG9nIHdpbmRvdy4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gdG8gYmUgaGFuZGxlZAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nIHdpbmRvdydzIHdpbmRvdyB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBkaWFsb2cgd2luZG93Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaGFuZGxlKGUsIENvbXBhcmVVSVBsdWdpbi5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgdGhlIGdpdmVuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+LiAKLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gdG8gYmUgaGFuZGxlZAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGRpYWxvZyB3aW5kb3cncyBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgdGhlIGRpYWxvZyB3aW5kb3cncyB3aW5kb3cgdGl0bGUKLQkgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgZGlhbG9nIHdpbmRvdwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGUoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlLCBTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZmdJbnN0YW5jZS5wZXJmb3JtKGUsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLQotCS8vLS0tLSBIb29rcyBmb3Igc3ViY2xhc3NlcyB0byBjb250cm9sIGV4Y2VwdGlvbiBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtKENvcmVFeGNlcHRpb24gZSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJQ29tcGFyZVVJUGx1Z2luLmxvZyhlKTsKLQkJSVN0YXR1cyBzdGF0dXM9IGUuZ2V0U3RhdHVzKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKGUsIGUuZ2V0TWVzc2FnZSgpLCBzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybShJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVRocm93YWJsZSB0YXJnZXQ9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlwZXJmb3JtKChDb3JlRXhjZXB0aW9uKXRhcmdldCwgc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbXBhcmVVSVBsdWdpbi5sb2coZSk7Ci0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBlLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkaXNwbGF5TWVzc2FnZURpYWxvZyhlLCBlLmdldE1lc3NhZ2UoKSwgc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coZSwgdGFyZ2V0LmdldE1lc3NhZ2UoKSwgc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vLS0tLSBIZWxwZXIgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXByaXZhdGUgdm9pZCBkaXNwbGF5TWVzc2FnZURpYWxvZyhUaHJvd2FibGUgdCwgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZ1dyaXRlciBtc2c9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbXNnLndyaXRlKG1lc3NhZ2UpOwotCQkJbXNnLndyaXRlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsIHx8IGV4Y2VwdGlvbk1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCW1zZy53cml0ZShDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeGNlcHRpb25EaWFsb2cuc2VlRXJyb3JMb2dNZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW1zZy53cml0ZShleGNlcHRpb25NZXNzYWdlKTsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2cudG9TdHJpbmcoKSk7CQkJCi0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lDb21wYXJlQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSUNvbXBhcmVDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2Y0MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSUNvbXBhcmVDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZVVJOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBDb21wYXJlIFVJLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkCi0gKiBvciBleHRlbmRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wYXJlQ29udGV4dElkcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYPSBDb21wYXJlVUkuUExVR0lOX0lEICsgJy4nOwotCQotCS8vIERpYWxvZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUSU9OX0RJQUxPRz0gUFJFRklYICsgImVkaXRpb25fZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFX0VESVRPUj0gUFJFRklYICsgImNvbXBhcmVfZWRpdG9yX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUQ0hfSU5QVVRfV0laQVJEX1BBR0U9IFBSRUZJWCArICJwYXRjaF9pbnB1dF93aXphcmRfcGFnZV9jb250ZXh0IjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVENIX1BSRVZJRVdfV0laQVJEX1BBR0U9IFBSRUZJWCArICJwYXRjaF9wcmV2aWV3X3dpemFyZF9wYWdlX2NvbnRleHQiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0ZST01fSElTVE9SWV9ESUFMT0c9IFBSRUZJWCArICJhZGRfZnJvbV9oaXN0b3J5X2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVfRElBTE9HPSBQUkVGSVggKyAiY29tcGFyZV9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFX1dJVEhfRURJVElPTl9ESUFMT0c9IFBSRUZJWCArICJjb21wYXJlX3dpdGhfZWRpdGlvbl9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX1dJVEhfRURJVElPTl9ESUFMT0c9IFBSRUZJWCArICJyZXBsYWNlX3dpdGhfZWRpdGlvbl9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBWaWV3ZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FUkdFX1ZJRVc9IFBSRUZJWCArICJ0ZXh0X21lcmdlX3ZpZXdfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9DT01QQVJFX1ZJRVc9IFBSRUZJWCArICJpbWFnZV9jb21wYXJlX3ZpZXdfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfQ09NUEFSRV9WSUVXPSBQUkVGSVggKyAiYmluYXJ5X2NvbXBhcmVfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJRkZfVklFVz0gUFJFRklYICsgImRpZmZfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEFjdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9CQUxfTkVYVF9ESUZGX0FDVElPTj0gUFJFRklYICsgImdsb2JhbF9uZXh0X2RpZmZfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX1BSRVZJT1VTX0RJRkZfQUNUSU9OPSBQUkVGSVggKyAiZ2xvYmFsX3ByZXZpb3VzX2RpZmZfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVYVF9ESUZGX0FDVElPTj0gUFJFRklYICsgIm5leHRfZGlmZl9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSU9VU19ESUZGX0FDVElPTj0gUFJFRklYICsgInByZXZpb3VzX2RpZmZfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX1dISVRFU1BBQ0VfQUNUSU9OPSBQUkVGSVggKyAiaWdub3JlX3doaXRlc3BhY2VfYWN0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFX1BSRUZFUkVOQ0VfUEFHRT0gUFJFRklYICsgImNvbXBhcmVfcHJlZmVyZW5jZV9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JTmF2aWdhdGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lOYXZpZ2F0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzhkMDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lOYXZpZ2F0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hdmlnYXRhYmxlIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BVklHQVRPUl9QUk9QRVJUWT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuTmF2aWdhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIGF0IGVuZCBvciBiZWdpbm5pbmcuCi0JICovCi0JYm9vbGVhbiBnb3RvRGlmZmVyZW5jZShib29sZWFuIG5leHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSU9wZW5hYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JT3BlbmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1ZWZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JT3BlbmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi0vKgotICogRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVuYWJsZSB7Ci0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOQUJMRV9QUk9QRVJUWT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuT3BlbmFibGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3BlbnMgdGhlIHNlbGVjdGVkIGVsZW1lbnQKLQkgKi8KLQl2b2lkIG9wZW5TZWxlY3RlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSVJlc291cmNlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzg1Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSVJlc291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCUlSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSVNhdmFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lTYXZhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0M2JmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSVNhdmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNhdmFibGUgewotCQotCXZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lWaWV3ZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JVmlld2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZlMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lWaWV3ZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQSBmYWN0b3J5IG9iamVjdCBmb3IgY3JlYXRpbmcgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+cyBmcm9tIGEgZGVzY3JpcHRvci4KLSAqIDxwPgotICogSXQgaXMgdXNlZCB3aGVuIHJlZ2lzdGVyaW5nIGEgdmlld2VyIGZvciBhIHNwZWNpZmljIHR5cGUKLSAqIGluIDxjb2RlPkNvbXBhcmVVSVBsdWdpbi5yZWdpc3RlckNvbnRlbnRWaWV3ZXJEZXNjcmlwdG9yPC9jb2RlPiBhbmQKLSAqIGluIDxjb2RlPkNvbXBhcmVVSVBsdWdpbi5yZWdpc3RlclN0cnVjdHVyZVZpZXdlckRlc2NyaXB0b3I8L2NvZGU+LgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JU3RydWN0dXJlQ3JlYXRvcgotICogQHNlZSBDb21wYXJlVUlQbHVnaW4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlld2VyRGVzY3JpcHRvciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHZpZXdlciBmcm9tIHRoaXMgZGVzY3JpcHRvciB1bmRlciB0aGUgZ2l2ZW4gU1RXIHBhcmVudCBjb250cm9sLgotCSAqIElmIHRoZSBjdXJyZW50IHZpZXdlciBoYXMgdGhlIHNhbWUgdHlwZSBhcyBhIG5ldyB2aWV3ZXIKLQkgKiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgZnJlZSB0byByZXR1cm4gdGhlIGN1cnJlbnQgdmlld2VyIGluc3RlYWQuCi0JICoKLQkgKiBAcGFyYW0gY3VycmVudFZpZXdlciB0aGUgY3VycmVudCB2aWV3ZXIgd2hpY2ggaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIG5ldyB2aWV3ZXIuCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIHBhcmVudCBjb250cm9sIHVuZGVyIHdoaWNoIHRoZSBuZXcgdmlld2VyIGhhcyB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBjb25maWcgYSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gdGhlIG5ldyB2aWV3ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KLQkgKiBAcmV0dXJuIGEgbmV3IHZpZXdlciBvciB0aGUgY3VycmVudCB2aWV3ZXIuCi0JICovCi0JVmlld2VyIGNyZWF0ZVZpZXdlcihWaWV3ZXIgY3VycmVudFZpZXdlciwgQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lnbm9yZVdoaXRlU3BhY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0lnbm9yZVdoaXRlU3BhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiN2I0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JZ25vcmVXaGl0ZVNwYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSA8Y29kZT5JQ29tcGFyZUNvbmZpZ3VyYXRpb24uSUdOT1JFX1dTPC9jb2RlPiBwcm9wZXJ0eSBvZiBhbgotICogPGNvZGU+SUNvbXBhcmVDb25maWd1cmF0aW9uPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIElnbm9yZVdoaXRlU3BhY2VBY3Rpb24gZXh0ZW5kcyBDaGFuZ2VQcm9wZXJ0eUFjdGlvbiB7Ci0KLQlwdWJsaWMgSWdub3JlV2hpdGVTcGFjZUFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIENvbXBhcmVDb25maWd1cmF0aW9uIGNjKSB7Ci0JCXN1cGVyKGJ1bmRsZSwgY2MsICJhY3Rpb24uSWdub3JlV2hpdGVTcGFjZS4iLCBDb21wYXJlQ29uZmlndXJhdGlvbi5JR05PUkVfV0hJVEVTUEFDRSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZUNhbnZhcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkNGRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZUNhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBIDxjb2RlPkNhbnZhczwvY29kZT4gc2hvd2luZyBhIHNpbmdsZSBjZW50ZXJlZCBTV1QgPGNvZGU+SW1hZ2U8L2NvZGU+LgotICogSWYgdGhlIDxjb2RlPkltYWdlPC9jb2RlPiBpcyBsYXJnZXIgdGhhbiB0aGUgPGNvZGU+Q2FudmFzPGNvZGU+LAotICogPGNvZGU+U2Nyb2xsYmFyczwvY29kZT4gd2lsbCBhcHBlYXIuCi0gKi8KLWNsYXNzIEltYWdlQ2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKLQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCi0JLyoKLQkgKiBDcmVhdGUgYSBuZXcgSW1hZ2VDYW52YXMgd2l0aCB0aGUgZ2l2ZW4gU1dUIHN0eWxlYml0cy4KLQkgKiAoU1dULkhfU0NST0xMIGFuZCBTV1QuVl9TQ1JPTEwgYXJlIGF1dG9tdGljYWxseSBhZGRlZCkuCi0JICovCi0JcHVibGljIEltYWdlQ2FudmFzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotCQlTY3JvbGxCYXIgc2I9IGdldEhvcml6b250YWxCYXIoKTsKLQkJc2Iuc2V0SW5jcmVtZW50KDIwKTsKLQkJc2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXJlcGFpbnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2I9IGdldFZlcnRpY2FsQmFyKCk7Ci0JCXNiLnNldEluY3JlbWVudCgyMCk7Ci0JCXNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlyZXBhaW50KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVTY3JvbGxiYXJzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlwYWludChldmVudC5nYyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogU2V0IHRoZSBTV1QgSW1hZ2UgdG8gdXNlIGFzIHRoZSBJbWFnZUNhbnZhcyBjb250ZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWcpIHsKLQkJZkltYWdlPSBpbWc7Ci0KLQkJaWYgKCFpc0Rpc3Bvc2VkKCkpIHsKLQkJCWdldEhvcml6b250YWxCYXIoKS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQlnZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJCXVwZGF0ZVNjcm9sbGJhcnMoKTsKLQkJCWdldFBhcmVudCgpLmxheW91dCgpOwotCQkJcmVkcmF3KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBhaW50KCkgewotCQlpZiAoIWlzRGlzcG9zZWQoKSkgewotCQkJR0MgZ2M9IG5ldyBHQyh0aGlzKTsKLQkJCXBhaW50KGdjKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcGFpbnQoR0MgZ2MpIHsKLQkJaWYgKGZJbWFnZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzPSBmSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYT0gZ2V0Q2xpZW50QXJlYSgpOwotCi0JCQlpbnQgeDsKLQkJCWlmIChib3VuZHMud2lkdGggPCBjbGllbnRBcmVhLndpZHRoKQotCQkJCXg9IChjbGllbnRBcmVhLndpZHRoIC0gYm91bmRzLndpZHRoKSAvIDI7Ci0JCQllbHNlCi0JCQkJeD0gLWdldEhvcml6b250YWxCYXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJaW50IHk7Ci0JCQlpZiAoYm91bmRzLmhlaWdodCA8IGNsaWVudEFyZWEuaGVpZ2h0KQotCQkJCXk9IChjbGllbnRBcmVhLmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQkJCWVsc2UKLQkJCQl5PSAtZ2V0VmVydGljYWxCYXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJZ2MuZHJhd0ltYWdlKGZJbWFnZSwgeCwgeSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXZvaWQgdXBkYXRlU2Nyb2xsYmFycygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcz0gZkltYWdlICE9IG51bGwgPyBmSW1hZ2UuZ2V0Qm91bmRzKCkgOiBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApOwotCQlQb2ludCBzaXplPSBnZXRTaXplKCk7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhPSBnZXRDbGllbnRBcmVhKCk7Ci0KLQkJU2Nyb2xsQmFyIGhvcml6b250YWw9IGdldEhvcml6b250YWxCYXIoKTsKLQkJaWYgKGJvdW5kcy53aWR0aCA8PSBjbGllbnRBcmVhLndpZHRoKSB7Ci0JCQlob3Jpem9udGFsLnNldFZpc2libGUoZmFsc2UpOwotCQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24oMCk7Ci0JCX0gZWxzZSB7Ci0JCQlob3Jpem9udGFsLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS53aWR0aCAtIGhvcml6b250YWwuZ2V0SW5jcmVtZW50KCkpOwotCQkJaW50IG1heD0gYm91bmRzLndpZHRoICsgKHNpemUueCAtIGNsaWVudEFyZWEud2lkdGgpOwotCQkJaG9yaXpvbnRhbC5zZXRNYXhpbXVtKG1heCk7Ci0JCQlob3Jpem9udGFsLnNldFRodW1iKHNpemUueCA+IG1heCA/IG1heCA6IHNpemUueCk7Ci0JCQlob3Jpem9udGFsLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCQlTY3JvbGxCYXIgdmVydGljYWw9IGdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChib3VuZHMuaGVpZ2h0IDw9IGNsaWVudEFyZWEuaGVpZ2h0KSB7Ci0JCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXZlcnRpY2FsLnNldFNlbGVjdGlvbigwKTsKLQkJfSBlbHNlIHsKLQkJCXZlcnRpY2FsLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS5oZWlnaHQgLSB2ZXJ0aWNhbC5nZXRJbmNyZW1lbnQoKSk7Ci0JCQlpbnQgbWF4PSBib3VuZHMuaGVpZ2h0ICsgKHNpemUueSAtIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldE1heGltdW0obWF4KTsKLQkJCXZlcnRpY2FsLnNldFRodW1iKHNpemUueSA+IG1heCA/IG1heCA6IHNpemUueSk7Ci0JCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjg2ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VNZXJnZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuQ29udGVudE1lcmdlVmlld2VyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEltYWdlTWVyZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50TWVyZ2VWaWV3ZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSW1hZ2VNZXJnZVZpZXdlclJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHJpdmF0ZSBPYmplY3QgZkxlZnRJbWFnZTsKLQlwcml2YXRlIE9iamVjdCBmUmlnaHRJbWFnZTsKLQotCXByaXZhdGUgSW1hZ2VDYW52YXMgZkFuY2VzdG9yOwotCXByaXZhdGUgSW1hZ2VDYW52YXMgZkxlZnQ7Ci0JcHJpdmF0ZSBJbWFnZUNhbnZhcyBmUmlnaHQ7Ci0JCi0JCQkKLQlwdWJsaWMgSW1hZ2VNZXJnZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGVzLCBDb21wYXJlQ29uZmlndXJhdGlvbiBtcCkgewotCQlzdXBlcihzdHlsZXMsIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSksIG1wKTsKLQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCBJQ29tcGFyZUNvbnRleHRJZHMuSU1BR0VfQ09NUEFSRV9WSUVXKTsKLQotCQlidWlsZENvbnRyb2wocGFyZW50KTsKLQkJU3RyaW5nIHRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKGdldFJlc291cmNlQnVuZGxlKCksICJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCWdldENvbnRyb2woKS5zZXREYXRhKENvbXBhcmVVSS5DT01QQVJFX1ZJRVdFUl9USVRMRSwgdGl0bGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnQoT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQotCQlzZXRJbnB1dChmQW5jZXN0b3IsIGFuY2VzdG9yKTsKLQkJCi0JCWZMZWZ0SW1hZ2U9IGxlZnQ7Ci0JCXNldElucHV0KGZMZWZ0LCBsZWZ0KTsKLQkJCi0JCWZSaWdodEltYWdlPSByaWdodDsKLQkJc2V0SW5wdXQoZlJpZ2h0LCByaWdodCk7Ci0JfQotCQotCS8qCi0JICogV2UgY2FuJ3QgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiBlaXRoZXIgc2lkZSB3ZSBqdXN0IHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBieXRlW10gZ2V0Q29udGVudHMoYm9vbGVhbiBsZWZ0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWZBbmNlc3Rvcj0gbmV3IEltYWdlQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PX0ZPQ1VTKTsKLQkJZkxlZnQ9IG5ldyBJbWFnZUNhbnZhcyhjb21wb3NpdGUsIFNXVC5OT19GT0NVUyk7Ci0JCWZSaWdodD0gbmV3IEltYWdlQ2FudmFzKGNvbXBvc2l0ZSwgU1dULk5PX0ZPQ1VTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldElucHV0KEltYWdlQ2FudmFzIGNhbnZhcywgT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChjYW52YXMgIT0gbnVsbCkgewotCi0JCQlJbnB1dFN0cmVhbSBzdHJlYW09IG51bGw7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQkJSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzY2E9IChJU3RyZWFtQ29udGVudEFjY2Vzc29yKSBpbnB1dDsKLQkJCQlpZiAoc2NhICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbT0gc2NhLmdldENvbnRlbnRzKCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIE5lZWRXb3JrCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUltYWdlIGltYWdlPSBudWxsOwkJCQotCQkJRGlzcGxheSBkaXNwbGF5PSBjYW52YXMuZ2V0RGlzcGxheSgpOwotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW1hZ2U9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQkJfQotCi0JCQljYW52YXMuc2V0SW1hZ2UoaW1hZ2UpOwotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQljYW52YXMuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FudmFzLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzaXplQW5jZXN0b3IoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKHdpZHRoID4gMCkgewotCQkJZkFuY2VzdG9yLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmQW5jZXN0b3Iuc2V0Qm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQl9IGVsc2UgewotCQkJZkFuY2VzdG9yLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzaXplTGVmdFJpZ2h0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoMSwgaW50IGNlbnRlcldpZHRoLCBpbnQgd2lkdGgyLCBpbnQgaGVpZ2h0KSB7Ci0JCWZMZWZ0LnNldEJvdW5kcyh4LCB5LCB3aWR0aDEsIGhlaWdodCk7Ci0JCWZSaWdodC5zZXRCb3VuZHMoeCt3aWR0aDErY2VudGVyV2lkdGgsIHksIHdpZHRoMiwgaGVpZ2h0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29weShib29sZWFuIGxlZnRUb1JpZ2h0KSB7Ci0JCWlmIChsZWZ0VG9SaWdodCkgewotCQkJZlJpZ2h0SW1hZ2U9IGZMZWZ0SW1hZ2U7Ci0JCQlzZXRJbnB1dChmUmlnaHQsIGZSaWdodEltYWdlKTsKLQkJCXNldFJpZ2h0RGlydHkodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmTGVmdEltYWdlPSBmUmlnaHRJbWFnZTsKLQkJCXNldElucHV0KGZMZWZ0LCBmTGVmdEltYWdlKTsKLQkJCXNldExlZnREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VNZXJnZVZpZXdlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0ltYWdlTWVyZ2VWaWV3ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOTkxM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VNZXJnZVZpZXdlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQSBmYWN0b3J5IG9iamVjdCBmb3IgdGhlIDxjb2RlPkltYWdlTWVyZ2VWaWV3ZXI8L2NvZGU+LgotICogVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvbmx5IG9iamVjdHMgd2l0aCBhIGRlZmF1bHQKLSAqIGNvbnN0cnVjdG9yIGNhbiBiZSBjcmVhdGVkIHZpYSBhbiBleHRlbnNpb24gcG9pbnQKLSAqICh0aGlzIHByZWNsdWRlcyBWaWV3ZXJzKS4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlTWVyZ2VWaWV3ZXJDcmVhdG9yIGltcGxlbWVudHMgSVZpZXdlckNyZWF0b3IgewotCi0JcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gbXApIHsKLQkJcmV0dXJuIG5ldyBJbWFnZU1lcmdlVmlld2VyKHBhcmVudCwgU1dULk5VTEwsIG1wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9JbWFnZU1lcmdlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhN2E5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvSW1hZ2VNZXJnZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEAoIylJbWFnZU1lcmdlVmlld2VyUmVzb3VyY2VzLnByb3BlcnRpZXMKLSMKLSMgUmVzb3VyY2Ugc3RyaW5ncyBmb3IgSW1hZ2VNZXJnZVZpZXdlci5qYXZhCi0KLXRpdGxlPSBJbWFnZSBDb21wYXJlCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEFjdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWFjdGlvbi5Db3B5TGVmdFRvUmlnaHQubGFiZWw9IENvcHkgTGVmdCB0byBSaWdodAotYWN0aW9uLkNvcHlMZWZ0VG9SaWdodC50b29sdGlwPSBDb3B5IEltYWdlIGZyb20gTGVmdCB0byBSaWdodAotYWN0aW9uLkNvcHlMZWZ0VG9SaWdodC5pbWFnZT0gZWxjbDE2L2NvcHlfcl9jby5naWYKLQotYWN0aW9uLkNvcHlSaWdodFRvTGVmdC5sYWJlbD0gQ29weSBSaWdodCB0byBMZWZ0Ci1hY3Rpb24uQ29weVJpZ2h0VG9MZWZ0LnRvb2x0aXA9IENvcHkgSW1hZ2UgZnJvbSBSaWdodCB0byBMZWZ0Ci1hY3Rpb24uQ29weVJpZ2h0VG9MZWZ0LmltYWdlPSBlbGNsMTYvY29weV9sX2NvLmdpZgotCi1hY3Rpb24uRW5hYmxlQW5jZXN0b3IubGFiZWw9IEVuYWJsZSBBbmNlc3RvciBQYW5lCi1hY3Rpb24uRW5hYmxlQW5jZXN0b3IudG9vbHRpcD0gQ29udHJvbCBWaXNpYmlsaXR5IG9mIEFuY2VzdG9yIFBhbmUKLWFjdGlvbi5FbmFibGVBbmNlc3Rvci5pbWFnZT0gZWxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NDZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9MaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqIAotICogQSBzcGVjaWFsaXplZCBjb250ZW50IHByb3ZpZGVyIHRvIHNob3cgYSBsaXN0IG9mIGVkaXRvciBwYXJ0cy4KLSAqLyAKLXB1YmxpYyBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCUxpc3QgZkNvbnRlbnRzOwkKLQotCXB1YmxpYyBMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dCkKLQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkgCi0JCQlmQ29udGVudHM9IChMaXN0KW5ld0lucHV0OwotCQllbHNlCi0JCQlmQ29udGVudHM9IG51bGw7Ci0JCS8vIHdlIHVzZSBhIGZpeGVkIHNldC4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgbykgewotCQlyZXR1cm4gZkNvbnRlbnRzICE9IG51bGwgJiYgIWZDb250ZW50cy5jb250YWlucyhvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9MaXN0RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9MaXN0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzI2ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotcHVibGljIGNsYXNzIExpc3REaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25EaWFsb2cgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBmQ29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBPYmplY3QgZklucHV0OwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmQWRkQ2FuY2VsQnV0dG9uOwotCQotCXB1YmxpYyBMaXN0RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlmQWRkQ2FuY2VsQnV0dG9uPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJZklucHV0PSBpbnB1dDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHNwKXsKLQkJZkNvbnRlbnRQcm92aWRlcj0gc3A7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgbHApewotCQlmTGFiZWxQcm92aWRlcj0gbHA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWRkQ2FuY2VsQnV0dG9uKGJvb2xlYW4gYWRkQ2FuY2VsQnV0dG9uKSB7Ci0JCWZBZGRDYW5jZWxCdXR0b249IGFkZENhbmNlbEJ1dHRvbjsKLQl9Ci0JCi0JcHVibGljIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCl7Ci0JCXJldHVybiBmVGFibGVWaWV3ZXI7Ci0JfQotCQkJCi0JcHVibGljIGJvb2xlYW4gaGFzRmlsdGVycygpewotCQlyZXR1cm4gZlRhYmxlVmlld2VyLmdldEZpbHRlcnMoKSAhPSBudWxsICYmIGZUYWJsZVZpZXdlci5nZXRGaWx0ZXJzKCkubGVuZ3RoICE9IDA7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFKTsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoISBmQWRkQ2FuY2VsQnV0dG9uKQotCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWVsc2UKLQkJCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsJCi0JfQkKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIHBhcmVudD0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQljcmVhdGVNZXNzYWdlQXJlYShwYXJlbnQpOwotCQlmVGFibGVWaWV3ZXI9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIGdldFRhYmxlU3R5bGUoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZkNvbnRlbnRQcm92aWRlcik7Ci0JCVRhYmxlIHRhYmxlPSBmVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoZkxhYmVsUHJvdmlkZXIpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZklucHV0KTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50PSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDE1KTsKLQkJZ2Qud2lkdGhIaW50PSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTUpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0VGFibGVTdHlsZSgpIHsKLQkJcmV0dXJuIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL01lcmdlU291cmNlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVNvdXJjZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDU3ODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL01lcmdlU291cmNlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0vKioKLSAqIEV4dGVuZHMgdGhlIEpGYWNlIFNvdXJjZVZpZXdlciB3aXRoIHNvbWUgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIE1lcmdlU291cmNlVmlld2VyIGV4dGVuZHMgU291cmNlVmlld2VyCi0JCQkJCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElUZXh0TGlzdGVuZXIsIElNZW51TGlzdGVuZXIgewotCQkJCQkJCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0lEPSAidW5kbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPX0lEPSAicmVkbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVRfSUQ9ICJjdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWV9JRD0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEVfSUQ9ICJwYXN0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfSUQ9ICJkZWxldGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0FMTF9JRD0gInNlbGVjdEFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lEPSAic2F2ZSI7IC8vJE5PTi1OTFMtMSQKLQotCWNsYXNzIFRleHRPcGVyYXRpb25BY3Rpb24gZXh0ZW5kcyBNZXJnZVZpZXdlckFjdGlvbiB7Ci0JCQotCQlwcml2YXRlIGludCBmT3BlcmF0aW9uQ29kZTsKLQkJCi0JCVRleHRPcGVyYXRpb25BY3Rpb24oaW50IG9wZXJhdGlvbkNvZGUsIGJvb2xlYW4gbXV0YWJsZSwgYm9vbGVhbiBzZWxlY3Rpb24sIGJvb2xlYW4gY29udGVudCkgewotCQkJc3VwZXIobXV0YWJsZSwgc2VsZWN0aW9uLCBjb250ZW50KTsKLQkJCWZPcGVyYXRpb25Db2RlPSBvcGVyYXRpb25Db2RlOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChpc0VuYWJsZWQoKSkKLQkJCQlkb09wZXJhdGlvbihmT3BlcmF0aW9uQ29kZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gZk9wZXJhdGlvbkNvZGUgIT0gLTEgJiYgY2FuRG9PcGVyYXRpb24oZk9wZXJhdGlvbkNvZGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQl0aGlzLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0JcHJpdmF0ZSBQb3NpdGlvbiBmUmVnaW9uOwotCXByaXZhdGUgYm9vbGVhbiBmRW5hYmxlZD0gdHJ1ZTsKLQlwcml2YXRlIEhhc2hNYXAgZkFjdGlvbnM9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZlJlbWVtYmVyZWREb2N1bWVudDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZkFkZFNhdmVBY3Rpb249IHRydWU7Ci0JCi0JCi0JcHVibGljIE1lcmdlU291cmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSkgewotCQlzdXBlcihwYXJlbnQsIG51bGwsIFNXVC5IX1NDUk9MTCArIFNXVC5WX1NDUk9MTCk7Ci0JCQotCQlmUmVzb3VyY2VCdW5kbGU9IGJ1bmRsZTsKLQkJCi0JCU1lbnVNYW5hZ2VyIG1lbnU9IG5ldyBNZW51TWFuYWdlcigpOwotCQltZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCVN0eWxlZFRleHQgdGU9IGdldFRleHRXaWRnZXQoKTsKLQkJdGUuc2V0TWVudShtZW51LmNyZWF0ZUNvbnRleHRNZW51KHRlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbWVtYmVyRG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotLy8JCWlmIChkb2MgIT0gbnVsbCAmJiBmUmVtZW1iZXJlZERvY3VtZW50ICE9IG51bGwpIHsKLS8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJNZXJnZVNvdXJjZVZpZXdlci5yZW1lbWJlckRvY3VtZW50OiBmUmVtZW1iZXJlZERvY3VtZW50ICE9IG51bGw6IHNob3VsZG4ndCBoYXBwZW4iKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQkJZlJlbWVtYmVyZWREb2N1bWVudD0gZG9jOwotCX0KLQkKLQlwdWJsaWMgSURvY3VtZW50IGdldFJlbWVtYmVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZSZW1lbWJlcmVkRG9jdW1lbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGhpZGVTYXZlQWN0aW9uKCkgewotCQlmQWRkU2F2ZUFjdGlvbj0gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KSB7Ci0JCVN0eWxlZFRleHQgdGU9IGdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRlICE9IG51bGwpCi0JCQl0ZS5zZXRGb250KGZvbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJU3R5bGVkVGV4dCB0ZT0gZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGUgIT0gbnVsbCkKLQkJCXRlLnNldEJhY2tncm91bmQoY29sb3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoZW5hYmxlZCAhPSBmRW5hYmxlZCkgewotCQkJZkVuYWJsZWQ9IGVuYWJsZWQ7Ci0JCQlTdHlsZWRUZXh0IGM9IGdldFRleHRXaWRnZXQoKTsKLQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQljLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJRGlzcGxheSBkPSBjLmdldERpc3BsYXkoKTsKLQkJCQljLnNldEJhY2tncm91bmQoZW5hYmxlZCA/IGQuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkgOiBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKFBvc2l0aW9uIHJlZ2lvbikgewotCQlmUmVnaW9uPSByZWdpb247Ci0JfQotCQotCXB1YmxpYyBQb3NpdGlvbiBnZXRSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRyb2xPa1RvVXNlKCkgewotCQlTdHlsZWRUZXh0IHQ9IGdldFRleHRXaWRnZXQoKTsKLQkJcmV0dXJuIHQgIT0gbnVsbCAmJiAhdC5pc0Rpc3Bvc2VkKCk7Ci0JfQotCQkJCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCkKLQkJCXNldFNlbGVjdGVkUmFuZ2UocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGluZUJhY2tncm91bmQoUG9zaXRpb24gcG9zaXRpb24sIENvbG9yIGMpIHsKLQkJU3R5bGVkVGV4dCB0PSBnZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ICE9IG51bGwgJiYgIXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlQb2ludCByZWdpb249IG5ldyBQb2ludCgwLCAwKTsKLQkJCWdldExpbmVSYW5nZShwb3NpdGlvbiwgcmVnaW9uKTsKLQkJCi0JCQlyZWdpb24ueC09IGdldERvY3VtZW50UmVnaW9uT2Zmc2V0KCk7Ci0JCQotCQkJdHJ5IHsKLQkJCQl0LnNldExpbmVCYWNrZ3JvdW5kKHJlZ2lvbi54LCByZWdpb24ueSwgYyk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXRMaW5lQmFja2dyb3VuZCgpIHsKLQkJU3R5bGVkVGV4dCB0PSBnZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ICE9IG51bGwgJiYgIXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpbnQgbGluZXM9IGdldExpbmVDb3VudCgpOwotCQkJdC5zZXRMaW5lQmFja2dyb3VuZCgwLCBsaW5lcywgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIG51bWJlciBvZiBsaW5lcyBpbiBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCUlSZWdpb24gcmVnaW9uPSBnZXRWaXNpYmxlUmVnaW9uKCk7Ci0KLQkJaW50IGxlbmd0aD0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gMDsKLQkJCi0JCUlEb2N1bWVudCBkb2M9IGdldERvY3VtZW50KCk7Ci0JCWludCBzdGFydExpbmU9IDA7Ci0JCWludCBlbmRMaW5lPSAwOwotCi0JCWludCBzdGFydD0gcmVnaW9uLmdldE9mZnNldCgpOwotCQl0cnkgewotCQkJc3RhcnRMaW5lPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQl9Ci0JCXRyeSB7Ci0JCQllbmRMaW5lPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0K2xlbmd0aCk7Ci0JCX0gY2F0Y2goQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJfQotCQkKLQkJcmV0dXJuIGVuZExpbmUtc3RhcnRMaW5lKzE7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Vmlld3BvcnRMaW5lcygpIHsKLQkJU3R5bGVkVGV4dCB0ZT0gZ2V0VGV4dFdpZGdldCgpOwotCQlSZWN0YW5nbGUgY2xBcmVhPSB0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCWlmICghY2xBcmVhLmlzRW1wdHkoKSkKLQkJCXJldHVybiBjbEFyZWEuaGVpZ2h0IC8gdGUuZ2V0TGluZUhlaWdodCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZpZXdwb3J0SGVpZ2h0KCkgewotCQlTdHlsZWRUZXh0IHRlPSBnZXRUZXh0V2lkZ2V0KCk7Ci0JCVJlY3RhbmdsZSBjbEFyZWE9IHRlLmdldENsaWVudEFyZWEoKTsKLQkJaWYgKCFjbEFyZWEuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGNsQXJlYS5oZWlnaHQ7Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgbGluZXMKLQkgKi8KLQlwdWJsaWMgaW50IGdldERvY3VtZW50UmVnaW9uT2Zmc2V0KCkgewotCQlpbnQgc3RhcnQ9IGdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJSURvY3VtZW50IGRvYz0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCX0gY2F0Y2goQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKSB7Ci0JCVN0eWxlZFRleHQgc3Q9IGdldFRleHRXaWRnZXQoKTsKLQkJaW50IGxpbmVIZWlnaHQ9IHN0LmdldExpbmVIZWlnaHQoKTsKLQkJcmV0dXJuIGdldFRvcEluc2V0KCkgLSAoKGdldERvY3VtZW50UmVnaW9uT2Zmc2V0KCkqbGluZUhlaWdodCkgKyBzdC5nZXRUb3BQaXhlbCgpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IGxpbmUgYW5kIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0JICogU3RhcnRpbmcgbGluZSBudW1iZXIgaXMgMCBiYXNlZC4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TGluZVJhbmdlKFBvc2l0aW9uIHAsIFBvaW50IHJlZ2lvbikgewotCQkKLQkJSURvY3VtZW50IGRvYz0gZ2V0RG9jdW1lbnQoKTsKLQkJCi0JCWlmIChwID09IG51bGwgfHwgZG9jID09IG51bGwpIHsKLQkJCXJlZ2lvbi54PSAwOwotCQkJcmVnaW9uLnk9IDA7Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCQotCQlpbnQgc3RhcnQ9IHAuZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGg9IHAuZ2V0TGVuZ3RoKCk7Ci0JCQotCQlpbnQgc3RhcnRMaW5lPSAwOwotCQl0cnkgewotCQkJc3RhcnRMaW5lPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQl9Ci0JCQotCQlpbnQgbGluZUNvdW50PSAwOwotCQkKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0vLwkJCS8vIGlmIHJhbmdlIGxlbmd0aCBpcyAwIGFuZCBpZiByYW5nZSBzdGFydHMgYSBuZXcgbGluZQotLy8JCQl0cnkgewotLy8JCQkJaWYgKHN0YXJ0ID09IGRvYy5nZXRMaW5lU3RhcnRPZmZzZXQoc3RhcnRMaW5lKSkgewotLy8JCQkJCWxpbmVzLS07Ci0vLwkJCQl9Ci0vLwkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLS8vCQkJCWxpbmVzLS07Ci0vLwkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJaW50IGVuZExpbmU9IDA7Ci0JCQl0cnkgewotCQkJCWVuZExpbmU9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQgKyBsZW5ndGggLSAxKTsJLy8gd2h5IC0xPwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJCWxpbmVDb3VudD0gZW5kTGluZS1zdGFydExpbmUrMTsKLQkJfQotCQkJCQotCQlyZWdpb24ueD0gc3RhcnRMaW5lOwotCQlyZWdpb24ueT0gbGluZUNvdW50OwotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQkKLQkvKgotCSAqIFNjcm9sbCBUZXh0UGFydCB0byB0aGUgZ2l2ZW4gbGluZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2c2Nyb2xsKGludCBsaW5lKSB7Ci0KLQkJaW50IHNyY1ZpZXdTaXplPSBnZXRMaW5lQ291bnQoKTsKLQkJaW50IHNyY0V4dGVudFNpemU9IGdldFZpZXdwb3J0TGluZXMoKTsKLQotCQlpZiAoc3JjVmlld1NpemUgPiBzcmNFeHRlbnRTaXplKSB7Ci0KLQkJCWlmIChsaW5lIDwgMCkKLQkJCQlsaW5lPSAwOwotCi0JCQlpbnQgY3A9IGdldFRvcEluZGV4KCk7Ci0JCQlpZiAoY3AgIT0gbGluZSkKLQkJCQlzZXRUb3BJbmRleChsaW5lICsgZ2V0RG9jdW1lbnRSZWdpb25PZmZzZXQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwgTWVyZ2VWaWV3ZXJBY3Rpb24gYWN0aW9uKSB7Ci0JCWZBY3Rpb25zLnB1dChhY3Rpb25JZCwgYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIE1lcmdlVmlld2VyQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJTWVyZ2VWaWV3ZXJBY3Rpb24gYWN0aW9uPSAoTWVyZ2VWaWV3ZXJBY3Rpb24pIGZBY3Rpb25zLmdldChhY3Rpb25JZCk7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkgewotCQkJYWN0aW9uPSBjcmVhdGVBY3Rpb24oYWN0aW9uSWQpOwotCQkJaWYgKGFjdGlvbiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlpZiAoYWN0aW9uLmlzQ29udGVudERlcGVuZGVudCgpKQotCQkJCWFkZFRleHRMaXN0ZW5lcih0aGlzKTsKLQkJCWlmIChhY3Rpb24uaXNTZWxlY3Rpb25EZXBlbmRlbnQoKSkKLQkJCQlhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCi0JCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihhY3Rpb24sIGZSZXNvdXJjZUJ1bmRsZSwgImFjdGlvbi4iICsgYWN0aW9uSWQgKyAiLiIpOwkJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZBY3Rpb25zLnB1dChhY3Rpb25JZCwgYWN0aW9uKTsKLQkJfQotCQlpZiAoYWN0aW9uLmlzRWRpdGFibGVEZXBlbmRlbnQoKSAmJiAhaXNFZGl0YWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBNZXJnZVZpZXdlckFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7Ci0JCWlmIChVTkRPX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oVU5ETywgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlpZiAoUkVET19JRC5lcXVhbHMoYWN0aW9uSWQpKQotCQkJcmV0dXJuIG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFJFRE8sIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJaWYgKENVVF9JRC5lcXVhbHMoYWN0aW9uSWQpKQotCQkJcmV0dXJuIG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKENVVCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQlpZiAoQ09QWV9JRC5lcXVhbHMoYWN0aW9uSWQpKQotCQkJcmV0dXJuIG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKENPUFksIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChQQVNURV9JRC5lcXVhbHMoYWN0aW9uSWQpKQotCQkJcmV0dXJuIG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFBBU1RFLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlpZiAoREVMRVRFX0lELmVxdWFscyhhY3Rpb25JZCkpCi0JCQlyZXR1cm4gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oREVMRVRFLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlpZiAoU0VMRUNUX0FMTF9JRC5lcXVhbHMoYWN0aW9uSWQpKQotCQkJcmV0dXJuIG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNFTEVDVF9BTEwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgZT0gZkFjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlNZXJnZVZpZXdlckFjdGlvbiBhY3Rpb249IChNZXJnZVZpZXdlckFjdGlvbikgZS5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uLmlzU2VsZWN0aW9uRGVwZW5kZW50KCkpCi0JCQkJYWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQkJCQkKLQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0RXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgZT0gZkFjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlNZXJnZVZpZXdlckFjdGlvbiBhY3Rpb249IChNZXJnZVZpZXdlckFjdGlvbikgZS5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uLmlzQ29udGVudERlcGVuZGVudCgpKQotCQkJCWFjdGlvbi51cGRhdGUoKTsKLQkJfQotCX0KLQkJCi0JLyoKLQkgKiBBbGxvd3MgdGhlIHZpZXdlciB0byBhZGQgbWVudXMgYW5kL29yIHRvb2xzIHRvIHRoZSBjb250ZXh0IG1lbnUuCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCJ1bmRvIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZE1lbnUobWVudSwgVU5ET19JRCk7Ci0JCWFkZE1lbnUobWVudSwgUkVET19JRCk7Ci0JCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImNjcCIpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRNZW51KG1lbnUsIENVVF9JRCk7Ci0JCWFkZE1lbnUobWVudSwgQ09QWV9JRCk7Ci0JCWFkZE1lbnUobWVudSwgUEFTVEVfSUQpOwotCQlhZGRNZW51KG1lbnUsIERFTEVURV9JRCk7Ci0JCWFkZE1lbnUobWVudSwgU0VMRUNUX0FMTF9JRCk7Ci0KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCJmaW5kIikpOyAvLyROT04tTkxTLTEkCi0JCS8vYWRkTWVudShtZW51LCBGSU5EX0lEKTsKLQkJCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInNhdmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZBZGRTYXZlQWN0aW9uKQotCQkJYWRkTWVudShtZW51LCBTQVZFX0lEKTsKLQkJCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInJlc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIFN0cmluZyBhY3Rpb25JZCkgewotCQlJQWN0aW9uIGFjdGlvbj0gZ2V0QWN0aW9uKGFjdGlvbklkKTsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJbWVudS5hZGQoYWN0aW9uKTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoKSB7Ci0JCQotCQlyZW1vdmVUZXh0TGlzdGVuZXIodGhpcyk7Ci0JCXJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCi0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVZpZXdlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VWaWV3ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1Njc2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVZpZXdlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVyZ2VWaWV3ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZk11dGFibGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZTZWxlY3Rpb247Ci0JcHJpdmF0ZSBib29sZWFuIGZDb250ZW50OwotCQotCXB1YmxpYyBNZXJnZVZpZXdlckFjdGlvbihib29sZWFuIG11dGFibGUsIGJvb2xlYW4gc2VsZWN0aW9uLCBib29sZWFuIGNvbnRlbnQpIHsKLQkJZk11dGFibGU9IG11dGFibGU7Ci0JCWZTZWxlY3Rpb249IHNlbGVjdGlvbjsKLQkJZkNvbnRlbnQ9IGNvbnRlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3Rpb25EZXBlbmRlbnQoKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnREZXBlbmRlbnQoKSB7Ci0JCXJldHVybiBmQ29udGVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZURlcGVuZGVudCgpIHsKLQkJcmV0dXJuIGZNdXRhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhNjlmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9NZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLklNZXJnZVZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiBBZGFwdHMgYW55IDxjb2RlPkNvbnRlbnRNZXJnZVZpZXdlcjwvY29kZT4gdG8gd29yayBvbiBhbiA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPgotICogZS5nLiBhIDxjb2RlPkRpZmZOb2RlPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIE1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSU1lcmdlVmlld2VyQ29udGVudFByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIENvbXBhcmVDb25maWd1cmF0aW9uIGZDb21wYXJlQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmQW5jZXN0b3JFcnJvcjsKLQlwcml2YXRlIFN0cmluZyBmTGVmdEVycm9yOwotCXByaXZhdGUgU3RyaW5nIGZSaWdodEVycm9yOwotCQkKLQlwdWJsaWMgTWVyZ2VWaWV3ZXJDb250ZW50UHJvdmlkZXIoQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MpIHsKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBjYzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhhc0Vycm9yKCkgewotCQlyZXR1cm4gZkFuY2VzdG9yRXJyb3IgIT0gbnVsbCB8fCBmTGVmdEVycm9yICE9IG51bGwgfHwgZlJpZ2h0RXJyb3IgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCS8vIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBzaW5jZSB3ZSBoYXZlIG5vIHN0YXRlCi0JfQotCQotCS8vLS0tLSBhbmNlc3RvcgotCQkJCi0JcHVibGljIHZvaWQgc2V0QW5jZXN0b3JFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWZBbmNlc3RvckVycm9yPSBlcnJvck1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5jZXN0b3JMYWJlbChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkFuY2VzdG9yRXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBmQW5jZXN0b3JFcnJvcjsKLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbi5nZXRBbmNlc3RvckxhYmVsKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0QW5jZXN0b3JJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkFuY2VzdG9yRXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldEFuY2VzdG9ySW1hZ2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QW5jZXN0b3JDb250ZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCXJldHVybiAoKElDb21wYXJlSW5wdXQpIGVsZW1lbnQpLmdldEFuY2VzdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG93QW5jZXN0b3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJcmV0dXJuIHRydWU7CS8vIGZpeCBmb3IgIzQ1MjM5OiBTaG93IGFuY2VzdG9yIGZvciBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY2hhbmdlcwotCQkJLy9yZXR1cm4gKCgoSUNvbXBhcmVJbnB1dCllbGVtZW50KS5nZXRLaW5kKCkgJiBEaWZmZXJlbmNlci5ESVJFQ1RJT05fTUFTSykgPT0gRGlmZmVyZW5jZXIuQ09ORkxJQ1RJTkc7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLy0tLS0gbGVmdAotCQkJCQkKLQlwdWJsaWMgdm9pZCBzZXRMZWZ0RXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlmTGVmdEVycm9yPSBlcnJvck1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGVmdExhYmVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChmTGVmdEVycm9yICE9IG51bGwpCi0JCQlyZXR1cm4gZkxlZnRFcnJvcjsKLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbi5nZXRMZWZ0TGFiZWwoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRMZWZ0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMZWZ0RXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uLmdldExlZnRJbWFnZShlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRMZWZ0Q29udGVudChPYmplY3QgZWxlbWVudCkgewkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJcmV0dXJuICgoSUNvbXBhcmVJbnB1dCkgZWxlbWVudCkuZ2V0TGVmdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzTGVmdEVkaXRhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChoYXNFcnJvcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCU9iamVjdCBsZWZ0PSAoKElDb21wYXJlSW5wdXQpIGVsZW1lbnQpLmdldExlZnQoKTsKLQkJCWlmIChsZWZ0ID09IG51bGwpIHsKLQkJCQlJRGlmZkVsZW1lbnQgcGFyZW50PSAoKElEaWZmRWxlbWVudCllbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkJbGVmdD0gKChJQ29tcGFyZUlucHV0KSBwYXJlbnQpLmdldExlZnQoKTsKLQkJCX0KLQkJCWlmIChsZWZ0IGluc3RhbmNlb2YgSUVkaXRhYmxlQ29udGVudCkKLQkJCQlyZXR1cm4gKChJRWRpdGFibGVDb250ZW50KWxlZnQpLmlzRWRpdGFibGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUxlZnRDb250ZW50KE9iamVjdCBlbGVtZW50LCBieXRlW10gYnl0ZXMpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlJQ29tcGFyZUlucHV0IG5vZGU9IChJQ29tcGFyZUlucHV0KSBlbGVtZW50OwotCQkJaWYgKGJ5dGVzICE9IG51bGwpIHsKLQkJCQlJVHlwZWRFbGVtZW50IGxlZnQ9IG5vZGUuZ2V0TGVmdCgpOwotCQkJCS8vICM5ODY5OiBwcm9ibGVtIGlmIGxlZnQgaXMgbnVsbCAoYmVjYXVzZSBubyByZXNvdXJjZSBleGlzdHMgeWV0KSBub3RoaW5nIGlzIGRvbmUhCi0JCQkJaWYgKGxlZnQgPT0gbnVsbCkgewotCQkJCQlub2RlLmNvcHkoZmFsc2UpOwotCQkJCQlsZWZ0PSBub2RlLmdldExlZnQoKTsKLQkJCQl9Ci0JCQkJaWYgKGxlZnQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50KQotCQkJCQkoKElFZGl0YWJsZUNvbnRlbnQpbGVmdCkuc2V0Q29udGVudChieXRlcyk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSZXNvdXJjZUNvbXBhcmVJbnB1dC5NeURpZmZOb2RlKQotCQkJCQkoKFJlc291cmNlQ29tcGFyZUlucHV0Lk15RGlmZk5vZGUpbm9kZSkuZmlyZUNoYW5nZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlub2RlLmNvcHkoZmFsc2UpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCS8vLS0tLSByaWdodAotCQotCXB1YmxpYyB2b2lkIHNldFJpZ2h0RXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlmUmlnaHRFcnJvcj0gZXJyb3JNZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJpZ2h0TGFiZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZSaWdodEVycm9yICE9IG51bGwpCi0JCQlyZXR1cm4gZlJpZ2h0RXJyb3I7Ci0JCXJldHVybiBmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZ2V0UmlnaHRMYWJlbChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldFJpZ2h0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZSaWdodEVycm9yICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZDb21wYXJlQ29uZmlndXJhdGlvbi5nZXRSaWdodEltYWdlKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFJpZ2h0Q29udGVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpCi0JCQlyZXR1cm4gKChJQ29tcGFyZUlucHV0KSBlbGVtZW50KS5nZXRSaWdodCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSaWdodEVkaXRhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChoYXNFcnJvcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCU9iamVjdCByaWdodD0gKChJQ29tcGFyZUlucHV0KSBlbGVtZW50KS5nZXRSaWdodCgpOwotCQkJaWYgKHJpZ2h0ID09IG51bGwpIHsKLQkJCQlJRGlmZkNvbnRhaW5lciBwYXJlbnQ9ICgoSURpZmZFbGVtZW50KWVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KQotCQkJCQlyaWdodD0gKChJQ29tcGFyZUlucHV0KSBwYXJlbnQpLmdldFJpZ2h0KCk7Ci0JCQl9Ci0JCQlpZiAocmlnaHQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50KQotCQkJCXJldHVybiAoKElFZGl0YWJsZUNvbnRlbnQpcmlnaHQpLmlzRWRpdGFibGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmVSaWdodENvbnRlbnQoT2JqZWN0IGVsZW1lbnQsIGJ5dGVbXSBieXRlcykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCUlDb21wYXJlSW5wdXQgbm9kZT0gKElDb21wYXJlSW5wdXQpIGVsZW1lbnQ7Ci0JCQlpZiAoYnl0ZXMgIT0gbnVsbCkgewotCQkJCUlUeXBlZEVsZW1lbnQgcmlnaHQ9IG5vZGUuZ2V0UmlnaHQoKTsKLQkJCQkvLyAjOTg2OTogcHJvYmxlbSBpZiByaWdodCBpcyBudWxsIChiZWNhdXNlIG5vIHJlc291cmNlIGV4aXN0cyB5ZXQpIG5vdGhpbmcgaXMgZG9uZSEKLQkJCQlpZiAocmlnaHQgPT0gbnVsbCkgewotCQkJCQlub2RlLmNvcHkodHJ1ZSk7Ci0JCQkJCXJpZ2h0PSBub2RlLmdldFJpZ2h0KCk7Ci0JCQkJfQotCQkJCWlmIChyaWdodCBpbnN0YW5jZW9mIElFZGl0YWJsZUNvbnRlbnQpCi0JCQkJCSgoSUVkaXRhYmxlQ29udGVudClyaWdodCkuc2V0Q29udGVudChieXRlcyk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSZXNvdXJjZUNvbXBhcmVJbnB1dC5NeURpZmZOb2RlKQotCQkJCQkoKFJlc291cmNlQ29tcGFyZUlucHV0Lk15RGlmZk5vZGUpbm9kZSkuZmlyZUNoYW5nZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlub2RlLmNvcHkodHJ1ZSk7Ci0JCQl9CQkKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTnVsbFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvTnVsbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTlmNWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL051bGxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlVmlld2VyUGFuZTsKLQotLyoqCi0gKiBVc2VkIHdoZW5ldmVyIHRoZSBpbnB1dCBpcyBudWxsIG9yIG5vIHZpZXdlciBjYW4gYmUgZm91bmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsVmlld2VyIGV4dGVuZHMgQWJzdHJhY3RWaWV3ZXIgewotCi0JcHJpdmF0ZSBDb250cm9sIGZEdW1teTsKLQotCXB1YmxpYyBOdWxsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlmRHVtbXk9IG5ldyBUcmVlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUNvbXBhcmVWaWV3ZXJQYW5lLmNsZWFyVG9vbEJhcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmRHVtbXk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTFmOTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBbiBvdmVybGF5aW5nIHByZWZlcmVuY2Ugc3RvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlICBpbXBsZW1lbnRzIElQcmVmZXJlbmNlU3RvcmUgewotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZURlc2NyaXB0b3IgewotCQlwcml2YXRlIFR5cGVEZXNjcmlwdG9yKCkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgQk9PTEVBTj0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBET1VCTEU9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgRkxPQVQ9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgSU5UPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIExPTkc9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgU1RSSU5HPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlLZXkgewotCQkKLQkJVHlwZURlc2NyaXB0b3IgZkRlc2NyaXB0b3I7Ci0JCVN0cmluZyBmS2V5OwotCQkKLQkJcHVibGljIE92ZXJsYXlLZXkoVHlwZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RyaW5nIGtleSkgewotCQkJZkRlc2NyaXB0b3I9IGRlc2NyaXB0b3I7Ci0JCQlmS2V5PSBrZXk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkJCQotCQkvKgotCQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlPdmVybGF5S2V5IGtleT0gZmluZE92ZXJsYXlLZXkoZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQlpZiAoa2V5ICE9IG51bGwpCi0JCQkJcHJvcGFnYXRlUHJvcGVydHkoZlBhcmVudCwga2V5LCBmU3RvcmUpOyAKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlBhcmVudDsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGZPdmVybGF5S2V5czsKLQkKLQlwcml2YXRlIFByb3BlcnR5TGlzdGVuZXIgZlByb3BlcnR5TGlzdGVuZXI7Ci0JCi0JCi0JcHVibGljIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBwYXJlbnQsIE92ZXJsYXlLZXlbXSBvdmVybGF5S2V5cykgewotCQlmUGFyZW50PSBwYXJlbnQ7Ci0JCWZPdmVybGF5S2V5cz0gb3ZlcmxheUtleXM7Ci0JCWZTdG9yZT0gbmV3IFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwcml2YXRlIE92ZXJsYXlLZXkgZmluZE92ZXJsYXlLZXkoU3RyaW5nIGtleSkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZk92ZXJsYXlLZXlzW2ldLmZLZXkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZPdmVybGF5S2V5c1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvdmVycyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoZmluZE92ZXJsYXlLZXkoa2V5KSAhPSBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVByb3BlcnR5KElQcmVmZXJlbmNlU3RvcmUgb3JnaW4sIE92ZXJsYXlLZXkga2V5LCBJUHJlZmVyZW5jZVN0b3JlIHRhcmdldCkgewotCQkKLQkJaWYgKG9yZ2luLmlzRGVmYXVsdChrZXkuZktleSkpIHsKLQkJCWlmICghdGFyZ2V0LmlzRGVmYXVsdChrZXkuZktleSkpCi0JCQkJdGFyZ2V0LnNldFRvRGVmYXVsdChrZXkuZktleSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVR5cGVEZXNjcmlwdG9yIGQ9IGtleS5mRGVzY3JpcHRvcjsKLQkJaWYgKEJPT0xFQU4gPT0gZCkgewotCQkJCi0JCQlib29sZWFuIG9yaWdpblZhbHVlPSBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KTsKLQkJCWJvb2xlYW4gdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRCb29sZWFuKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQkJCQkKLQkJfSBlbHNlIGlmIChET1VCTEUgPT0gZCkgewotCQkJCi0JCQlkb3VibGUgb3JpZ2luVmFsdWU9IG9yZ2luLmdldERvdWJsZShrZXkuZktleSk7Ci0JCQlkb3VibGUgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXREb3VibGUoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCQkKLQkJfSBlbHNlIGlmIChGTE9BVCA9PSBkKSB7Ci0JCQkKLQkJCWZsb2F0IG9yaWdpblZhbHVlPSBvcmdpbi5nZXRGbG9hdChrZXkuZktleSk7Ci0JCQlmbG9hdCB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldEZsb2F0KGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQkJCQkKLQkJfSBlbHNlIGlmIChJTlQgPT0gZCkgewotCi0JCQlpbnQgb3JpZ2luVmFsdWU9IG9yZ2luLmdldEludChrZXkuZktleSk7Ci0JCQlpbnQgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRJbnQoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7Ci0KLQkJCWxvbmcgb3JpZ2luVmFsdWU9IG9yZ2luLmdldExvbmcoa2V5LmZLZXkpOwotCQkJbG9uZyB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldExvbmcoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0gZWxzZSBpZiAoU1RSSU5HID09IGQpIHsKLQotCQkJU3RyaW5nIG9yaWdpblZhbHVlPSBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpOwotCQkJU3RyaW5nIHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0U3RyaW5nKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBudWxsICYmIG9yaWdpblZhbHVlICE9IG51bGwgJiYgIXRhcmdldFZhbHVlLmVxdWFscyhvcmlnaW5WYWx1ZSkpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wYWdhdGUoKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlwcm9wYWdhdGVQcm9wZXJ0eShmU3RvcmUsIGZPdmVybGF5S2V5c1tpXSwgZlBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0LCBib29sZWFuIGZvcmNlSW5pdGlhbGl6YXRpb24pIHsKLQkJVHlwZURlc2NyaXB0b3IgZD0ga2V5LmZEZXNjcmlwdG9yOwotCQlpZiAoQk9PTEVBTiA9PSBkKSB7Ci0JCQkKLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgdHJ1ZSk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0Qm9vbGVhbihrZXkuZktleSkpOwotCQkJCi0JCX0gZWxzZSBpZiAoRE9VQkxFID09IGQpIHsKLQkJCQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBEKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RG91YmxlKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdERvdWJsZShrZXkuZktleSkpOwotCQkJCi0JCX0gZWxzZSBpZiAoRkxPQVQgPT0gZCkgewotCQkJCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDEuMEYpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRGbG9hdChrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRGbG9hdChrZXkuZktleSkpOwotCQkJCi0JCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKLQkJCQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0SW50KGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEludChrZXkuZktleSkpOwotCQkJCi0JCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7Ci0JCQkKLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMUwpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRMb25nKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdExvbmcoa2V5LmZLZXkpKTsKLQkJCQotCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7Ci0JCQkKLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgIjEiKTsJLy8kTk9OLU5MUy0xJAotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0U3RyaW5nKGtleS5mS2V5KSk7Ci0JCQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2FkKCkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJbG9hZFByb3BlcnR5KGZQYXJlbnQsIGZPdmVybGF5S2V5c1tpXSwgZlN0b3JlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZERlZmF1bHRzKCkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJc2V0VG9EZWZhdWx0KGZPdmVybGF5S2V5c1tpXS5mS2V5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCWlmIChmUHJvcGVydHlMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lcj0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKLQkJCWZQYXJlbnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyICE9IG51bGwpICB7Ci0JCQlmUGFyZW50LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQkJZlByb3BlcnR5TGlzdGVuZXI9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJZlN0b3JlLmZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjY29udGFpbnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuY29udGFpbnMobmFtZSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEJvb2xlYW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHREb3VibGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHREb3VibGUobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdEZsb2F0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRJbnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRJbnQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdExvbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdExvbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREb3VibGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEZsb2F0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRGbG9hdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRJbnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0SW50KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldExvbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRMb25nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldFN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjaXNEZWZhdWx0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5pc0RlZmF1bHQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjbmVlZHNTYXZpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCkgewotCQlyZXR1cm4gZlN0b3JlLm5lZWRzU2F2aW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjcHV0VmFsdWUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnB1dFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFRvRGVmYXVsdChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCWZTdG9yZS5zZXRUb0RlZmF1bHQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9SZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTc5NzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGNsYXNzIFJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbiBleHRlbmRzIEVkaXRpb25BY3Rpb24gewotCQkKLQlwdWJsaWMgUmVwbGFjZVdpdGhFZGl0aW9uQWN0aW9uKCkgewotCQlzdXBlcih0cnVlLCAib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5SZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlmSGVscENvbnRleHRJZD0gSUNvbXBhcmVDb250ZXh0SWRzLlJFUExBQ0VfV0lUSF9FRElUSU9OX0RJQUxPRzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9SZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRlN2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1JlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEAoIylSZXBsYWNlV2l0aEVkaXRpb25BY3Rpb24ucHJvcGVydGllcwotIwotIyBSZXNvdXJjZXMgZm9yIFJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbi5qYXZhCi0KLXRpdGxlPSBSZXBsYWNlIGZyb20gTG9jYWwgSGlzdG9yeQotCi10cmVlVGl0bGVGb3JtYXQ9IExvY2FsIEhpc3Rvcnkgb2YgJyd7MH0nJwotZGF0ZUljb249IG9iajE2L2RheV9vYmouZ2lmCi10aW1lSWNvbj0gb2JqMTYvcmVzb3VyY2Vfb2JqLmdpZgotCi10cmVlRm9ybWF0PSB7MH0KLXdvcmtzcGFjZVRyZWVGb3JtYXQ9IHswfSAoV29ya3NwYWNlIEZpbGUpCi1wYXJzZUVycm9yRm9ybWF0PSB7MH0gKFBhcnNlIEVycm9yKQotCi1lZGl0aW9uTGFiZWw9IExvY2FsIEhpc3RvcnkgKHswfSkKLXdvcmtzcGFjZUVkaXRpb25MYWJlbD0gV29ya3NwYWNlIEZpbGUKLQotdGFyZ2V0TGFiZWw9IHswfQotCi10b2RheUZvcm1hdD0gVG9kYXkgKHswfSkKLXllc3RlcmRheUZvcm1hdD0gWWVzdGVyZGF5ICh7MH0pCi1kYXlGb3JtYXQ9IHswfQotCi1idXR0b25MYWJlbD0gUmVwbGFjZQotCi1ub0xvY2FsSGlzdG9yeUVycm9yPSBObyBsb2NhbCBoaXN0b3J5IGF2YWlsYWJsZSBmb3Igc2VsZWN0ZWQgcmVzb3VyY2UuCi1yZXBsYWNlRXJyb3I9Q2Fubm90IHJlcGxhY2UgcmVzb3VyY2UgKHJlYXNvbjogezB9KS4KLQotdGFza05hbWU9UmVwbGFjaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9SZXBsYWNlV2l0aFByZXZpb3VzRWRpdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVwbGFjZVdpdGhQcmV2aW91c0VkaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYTEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9SZXBsYWNlV2l0aFByZXZpb3VzRWRpdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGNsYXNzIFJlcGxhY2VXaXRoUHJldmlvdXNFZGl0aW9uQWN0aW9uIGV4dGVuZHMgRWRpdGlvbkFjdGlvbiB7Ci0JCQotCXB1YmxpYyBSZXBsYWNlV2l0aFByZXZpb3VzRWRpdGlvbkFjdGlvbigpIHsKLQkJc3VwZXIodHJ1ZSwKLQkJCSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbiIpOwkvLyROT04tTkxTLTEkCi0JCWZQcmV2aW91cz0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9SZXNpemFibGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Jlc2l6YWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRhYjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Jlc2l6YWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHJlc2l6YWJsZSBEaWFsb2dzIHdpdGggcGVyc2lzdGVudCB3aW5kb3cgYm91bmRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzaXphYmxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElBTE9HX0JPVU5EU19LRVk9ICJSZXNpemFibGVEaWFsb2dCb3VuZHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFg9ICJ4IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBZPSAieSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lEVEg9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVJR0hUPSAiaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBmQnVuZGxlOwotCXByaXZhdGUgUmVjdGFuZ2xlIGZOZXdCb3VuZHM7Ci0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZlNldHRpbmdzOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0SWQ7Ci0KLQotCXB1YmxpYyBSZXNpemFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFIHwgU1dULk1BWCk7Ci0JCQotCQlmQnVuZGxlPSBidW5kbGU7Ci0JCQotCQlmU2V0dGluZ3M9IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SGVscENvbnRleHRJZChTdHJpbmcgY29udGV4dElkKSB7Ci0JCWZDb250ZXh0SWQ9IGNvbnRleHRJZDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChTaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCWlmIChmQ29udGV4dElkICE9IG51bGwpCi0JCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAobmV3U2hlbGwsIGZDb250ZXh0SWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCQotCQlpbnQgd2lkdGg9IDA7Ci0JCWludCBoZWlnaHQ9IDA7Ci0JCQotCQlmaW5hbCBTaGVsbCBzPSBnZXRTaGVsbCgpOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQlzLmFkZENvbnRyb2xMaXN0ZW5lcigKLQkJCQluZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGFyZzApIHsKLQkJCQkJCWZOZXdCb3VuZHM9IHMuZ2V0Qm91bmRzKCk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGFyZzApIHsKLQkJCQkJCWZOZXdCb3VuZHM9IHMuZ2V0Qm91bmRzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlJRGlhbG9nU2V0dGluZ3MgYm91bmRzPSBmU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfQk9VTkRTX0tFWSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJvdW5kcyA9PSBudWxsKSB7Ci0JCQlpZiAoZkJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJd2lkdGg9IFV0aWxpdGllcy5nZXRJbnRlZ2VyKGZCdW5kbGUsIFdJRFRILCAwKTsKLQkJCQloZWlnaHQ9IFV0aWxpdGllcy5nZXRJbnRlZ2VyKGZCdW5kbGUsIEhFSUdIVCwgMCk7Ci0JCQkJU2hlbGwgc2hlbGw9IGdldFBhcmVudFNoZWxsKCk7Ci0JCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQkJUG9pbnQgcGFyZW50U2l6ZT0gc2hlbGwuZ2V0U2l6ZSgpOwotCQkJCQlpZiAod2lkdGggPD0gMCkKLQkJCQkJCXdpZHRoPSBwYXJlbnRTaXplLngtMzAwOwotCQkJCQlpZiAoaGVpZ2h0IDw9IDApCi0JCQkJCQloZWlnaHQ9IHBhcmVudFNpemUueS0yMDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTaGVsbCBzaGVsbD0gZ2V0UGFyZW50U2hlbGwoKTsKLQkJCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwYXJlbnRTaXplPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoPSBwYXJlbnRTaXplLngtMTAwOwotCQkJCQloZWlnaHQ9IHBhcmVudFNpemUueS0xMDA7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHdpZHRoIDwgNzAwKQotCQkJCXdpZHRoPSA3MDA7Ci0JCQlpZiAoaGVpZ2h0IDwgNTAwKQotCQkJCWhlaWdodD0gNTAwOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQl3aWR0aD0gYm91bmRzLmdldEludChXSURUSCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoPSA3MDA7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWhlaWdodD0gYm91bmRzLmdldEludChIRUlHSFQpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloZWlnaHQ9IDUwMDsKLQkJCX0KLQkJfQkKLQkKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxMb2NhdGlvbihQb2ludCBpbml0aWFsU2l6ZSkgewotCQlQb2ludCBsb2M9IHN1cGVyLmdldEluaXRpYWxMb2NhdGlvbihpbml0aWFsU2l6ZSk7Ci0JCQotCQlJRGlhbG9nU2V0dGluZ3MgYm91bmRzPSBmU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfQk9VTkRTX0tFWSk7Ci0JCWlmIChib3VuZHMgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb2MueD0gYm91bmRzLmdldEludChYKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQkJdHJ5IHsKLQkJCQlsb2MueT0gYm91bmRzLmdldEludChZKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9Ci0JCXJldHVybiBsb2M7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlib29sZWFuIGNsb3NlZD0gc3VwZXIuY2xvc2UoKTsKLQkJaWYgKGNsb3NlZCAmJiBmTmV3Qm91bmRzICE9IG51bGwpCi0JCQlzYXZlQm91bmRzKGZOZXdCb3VuZHMpOwotCQlyZXR1cm4gY2xvc2VkOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlQm91bmRzKFJlY3RhbmdsZSBib3VuZHMpIHsKLQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ0JvdW5kcz0gZlNldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX0JPVU5EU19LRVkpOwotCQlpZiAoZGlhbG9nQm91bmRzID09IG51bGwpIHsKLQkJCWRpYWxvZ0JvdW5kcz0gbmV3IERpYWxvZ1NldHRpbmdzKERJQUxPR19CT1VORFNfS0VZKTsKLQkJCWZTZXR0aW5ncy5hZGRTZWN0aW9uKGRpYWxvZ0JvdW5kcyk7Ci0JCX0KLQkJZGlhbG9nQm91bmRzLnB1dChYLCBib3VuZHMueCk7Ci0JCWRpYWxvZ0JvdW5kcy5wdXQoWSwgYm91bmRzLnkpOwotCQlkaWFsb2dCb3VuZHMucHV0KFdJRFRILCBib3VuZHMud2lkdGgpOwotCQlkaWFsb2dCb3VuZHMucHV0KEhFSUdIVCwgYm91bmRzLmhlaWdodCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVzb3VyY2VDb21wYXJlSW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1Jlc291cmNlQ29tcGFyZUlucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzJkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvUmVzb3VyY2VDb21wYXJlSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotCi0KLS8qKgotICogQSB0d28td2F5IG9yIHRocmVlLXdheSBjb21wYXJlIGZvciBhcmJpdHJhcnkgSVJlc291cmNlcy4KLSAqLwotY2xhc3MgUmVzb3VyY2VDb21wYXJlSW5wdXQgZXh0ZW5kcyBDb21wYXJlRWRpdG9ySW5wdXQgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTk9STUFMSVpFX0NBU0U9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZUaHJlZVdheT0gZmFsc2U7Ci0JcHJpdmF0ZSBPYmplY3QgZlJvb3Q7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlQ29tcGFyYXRvciBmQW5jZXN0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlQ29tcGFyYXRvciBmTGVmdDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGZSaWdodDsKLQlwcml2YXRlIElSZXNvdXJjZSBmQW5jZXN0b3JSZXNvdXJjZTsKLQlwcml2YXRlIElSZXNvdXJjZSBmTGVmdFJlc291cmNlOwotCXByaXZhdGUgSVJlc291cmNlIGZSaWdodFJlc291cmNlOwotCXByaXZhdGUgRGlmZlRyZWVWaWV3ZXIgZkRpZmZWaWV3ZXI7Ci0JcHJpdmF0ZSBJQWN0aW9uIGZPcGVuQWN0aW9uOwotCQotCWNsYXNzIE15RGlmZk5vZGUgZXh0ZW5kcyBEaWZmTm9kZSB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5PSBmYWxzZTsKLQkJcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZMYXN0SWQ7Ci0JCXByaXZhdGUgU3RyaW5nIGZMYXN0TmFtZTsKLQkJCi0JCQotCQlwdWJsaWMgTXlEaWZmTm9kZShJRGlmZkNvbnRhaW5lciBwYXJlbnQsIGludCBkZXNjcmlwdGlvbiwgSVR5cGVkRWxlbWVudCBhbmNlc3RvciwgSVR5cGVkRWxlbWVudCBsZWZ0LCBJVHlwZWRFbGVtZW50IHJpZ2h0KSB7Ci0JCQlzdXBlcihwYXJlbnQsIGRlc2NyaXB0aW9uLCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZpcmVDaGFuZ2UoKSB7Ci0JCQlzdXBlci5maXJlQ2hhbmdlKCk7Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJCWZEaXJ0eT0gdHJ1ZTsKLQkJCWlmIChmRGlmZlZpZXdlciAhPSBudWxsKQotCQkJCWZEaWZmVmlld2VyLnJlZnJlc2godGhpcyk7Ci0JCX0KLQkJdm9pZCBjbGVhckRpcnR5KCkgewotCQkJZkRpcnR5PSBmYWxzZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlpZiAoZkxhc3ROYW1lID09IG51bGwpCi0JCQkJZkxhc3ROYW1lPSBzdXBlci5nZXROYW1lKCk7Ci0JCQlpZiAoZkRpcnR5KQotCQkJCXJldHVybiAnPCcgKyBmTGFzdE5hbWUgKyAnPic7Ci0JCQlyZXR1cm4gZkxhc3ROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgSVR5cGVkRWxlbWVudCBnZXRJZCgpIHsKLQkJCUlUeXBlZEVsZW1lbnQgaWQ9IHN1cGVyLmdldElkKCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZkxhc3RJZDsKLQkJCWZMYXN0SWQ9IGlkOwotCQkJcmV0dXJuIGlkOwotCQl9Ci0JfQotCQotCXN0YXRpYyBjbGFzcyBGaWx0ZXJlZEJ1ZmZlcmVkUmVzb3VyY2VOb2RlIGV4dGVuZHMgQnVmZmVyZWRSZXNvdXJjZU5vZGUgewotCQlGaWx0ZXJlZEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJc3VwZXIocmVzb3VyY2UpOwotCQl9Ci0JCXByb3RlY3RlZCBJU3RydWN0dXJlQ29tcGFyYXRvciBjcmVhdGVDaGlsZChJUmVzb3VyY2UgY2hpbGQpIHsKLQkJCVN0cmluZyBuYW1lPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQlpZiAoQ29tcGFyZVVJUGx1Z2luLmdldERlZmF1bHQoKS5maWx0ZXIobmFtZSwgY2hpbGQgaW5zdGFuY2VvZiBJQ29udGFpbmVyLCBmYWxzZSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmVkQnVmZmVyZWRSZXNvdXJjZU5vZGUoY2hpbGQpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ3JlYXRlcyBhbiBjb21wYXJlIGVkaXRvciBpbnB1dCBmb3IgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKi8KLQlSZXNvdXJjZUNvbXBhcmVJbnB1dChDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0JCQkKLQlwdWJsaWMgVmlld2VyIGNyZWF0ZURpZmZWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmRGlmZlZpZXdlcj0gbmV3IERpZmZUcmVlVmlld2VyKHBhcmVudCwgZ2V0Q29tcGFyZUNvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCi0JCQkJaWYgKGZPcGVuQWN0aW9uID09IG51bGwpIHsKLQkJCQkJZk9wZW5BY3Rpb249IG5ldyBBY3Rpb24oKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGFuZGxlT3BlbihudWxsKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJVXRpbGl0aWVzLmluaXRBY3Rpb24oZk9wZW5BY3Rpb24sIGdldEJ1bmRsZSgpLCAiYWN0aW9uLkNvbXBhcmVDb250ZW50cy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkKLQkJCQlib29sZWFuIGVuYWJsZT0gZmFsc2U7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQkJaWYgKHNzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudD0gc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE15RGlmZk5vZGUpIHsKLQkJCQkJCQlJVHlwZWRFbGVtZW50IHRlPSAoKE15RGlmZk5vZGUpIGVsZW1lbnQpLmdldElkKCk7Ci0JCQkJCQkJaWYgKHRlICE9IG51bGwpCi0JCQkJCQkJCWVuYWJsZT0gIUlUeXBlZEVsZW1lbnQuRk9MREVSX1RZUEUuZXF1YWxzKHRlLmdldFR5cGUoKSk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQllbmFibGU9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZk9wZW5BY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCQotCQkJCW1hbmFnZXIuYWRkKGZPcGVuQWN0aW9uKTsKLQkJCQkKLQkJCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBmRGlmZlZpZXdlcjsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHMpIHsKLQkJCi0JCUlSZXNvdXJjZVtdIHNlbGVjdGlvbj0gVXRpbGl0aWVzLmdldFJlc291cmNlcyhzKTsKLQotCQlmVGhyZWVXYXk9IHNlbGVjdGlvbi5sZW5ndGggPT0gMzsKLQkJCi0JCWZBbmNlc3RvclJlc291cmNlPSBudWxsOwotCQlmTGVmdFJlc291cmNlPSBzZWxlY3Rpb25bMF07Ci0JCWZSaWdodFJlc291cmNlPSBzZWxlY3Rpb25bMV07Ci0JCWlmIChmVGhyZWVXYXkpIHsKLQkJCWZMZWZ0UmVzb3VyY2U9IHNlbGVjdGlvblsxXTsJCQotCQkJZlJpZ2h0UmVzb3VyY2U9IHNlbGVjdGlvblsyXTsKLQkJfQotCQkKLQkJZkFuY2VzdG9yPSBudWxsOwotCQlmTGVmdD0gZ2V0U3RydWN0dXJlKGZMZWZ0UmVzb3VyY2UpOwotCQlmUmlnaHQ9IGdldFN0cnVjdHVyZShmUmlnaHRSZXNvdXJjZSk7Ci0JCQkJCQotCQlpZiAoZlRocmVlV2F5KSB7Ci0JCQlmQW5jZXN0b3JSZXNvdXJjZT0gc2VsZWN0aW9uWzBdOwotCQkJZkFuY2VzdG9yPSBnZXRTdHJ1Y3R1cmUoZkFuY2VzdG9yUmVzb3VyY2UpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIGNvbXBhcmUgY2FuIGJlIGV4ZWN1dGVkIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJU2VsZWN0aW9uIHMpIHsKLQkJCi0JCUlSZXNvdXJjZVtdIHNlbGVjdGlvbj0gVXRpbGl0aWVzLmdldFJlc291cmNlcyhzKTsKLQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPCAyIHx8IHNlbGVjdGlvbi5sZW5ndGggPiAzKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZUaHJlZVdheT0gc2VsZWN0aW9uLmxlbmd0aCA9PSAzOwotCQkKLQkJZkxlZnRSZXNvdXJjZT0gc2VsZWN0aW9uWzBdOwotCQlmUmlnaHRSZXNvdXJjZT0gc2VsZWN0aW9uWzFdOwotCQlpZiAoZlRocmVlV2F5KSB7Ci0JCQlmTGVmdFJlc291cmNlPSBzZWxlY3Rpb25bMV07CQkKLQkJCWZSaWdodFJlc291cmNlPSBzZWxlY3Rpb25bMl07Ci0JCX0KLQkJCQkJCQkKLQkJaWYgKCFjb21wYXJhYmxlKGZMZWZ0UmVzb3VyY2UsIGZSaWdodFJlc291cmNlKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZlRocmVlV2F5KSB7Ci0JCQlmQW5jZXN0b3JSZXNvdXJjZT0gc2VsZWN0aW9uWzBdOwotCQkJCi0JCQlpZiAoIWNvbXBhcmFibGUoZkxlZnRSZXNvdXJjZSwgZlJpZ2h0UmVzb3VyY2UpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgaW1hZ2VzIGluIHRoZSBjb21wYXJlIGNvbmZpZ3VyYXRpb24uCi0JICovCi0Jdm9pZCBpbml0aWFsaXplQ29tcGFyZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUNvbXBhcmVDb25maWd1cmF0aW9uIGNjPSBnZXRDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQlpZiAoZkxlZnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQljYy5zZXRMZWZ0TGFiZWwoYnVpbGRMYWJlbChmTGVmdFJlc291cmNlKSk7Ci0JCQljYy5zZXRMZWZ0SW1hZ2UoQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlKGZMZWZ0UmVzb3VyY2UpKTsKLQkJfQotCQlpZiAoZlJpZ2h0UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJY2Muc2V0UmlnaHRMYWJlbChidWlsZExhYmVsKGZSaWdodFJlc291cmNlKSk7Ci0JCQljYy5zZXRSaWdodEltYWdlKENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZShmUmlnaHRSZXNvdXJjZSkpOwotCQl9Ci0JCWlmIChmVGhyZWVXYXkgJiYgZkFuY2VzdG9yUmVzb3VyY2UgIT0gbnVsbCkgewkJCQotCQkJY2Muc2V0QW5jZXN0b3JMYWJlbChidWlsZExhYmVsKGZBbmNlc3RvclJlc291cmNlKSk7Ci0JCQljYy5zZXRBbmNlc3RvckltYWdlKENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZShmQW5jZXN0b3JSZXNvdXJjZSkpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggcmVzb3VyY2VzIGFyZSBlaXRoZXIgc3RydWN0dXJlZCBvciB1bnN0cnVjdHVyZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmFibGUoSVJlc291cmNlIGMxLCBJUmVzb3VyY2UgYzIpIHsKLQkJcmV0dXJuIGhhc1N0cnVjdHVyZShjMSkgPT0gaGFzU3RydWN0dXJlKGMyKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGhhcyBhIHN0cnVjdHVyZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzU3RydWN0dXJlKElSZXNvdXJjZSBpbnB1dCkgewotCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJRmlsZSBmaWxlPSAoSUZpbGUpIGlucHV0OwotCQkJU3RyaW5nIHR5cGU9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXR5cGU9IG5vcm1hbGl6ZUNhc2UodHlwZSk7Ci0JCQkJcmV0dXJuICJKQVIiLmVxdWFscyh0eXBlKSB8fCAiWklQIi5lcXVhbHModHlwZSk7CS8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQ3JlYXRlcyBhIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGlucHV0LgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+Ci0JICogY2FuIGJlIGZvdW5kIGZvciB0aGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGdldFN0cnVjdHVyZShJUmVzb3VyY2UgaW5wdXQpIHsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0JCQlyZXR1cm4gbmV3IEZpbHRlcmVkQnVmZmVyZWRSZXNvdXJjZU5vZGUoaW5wdXQpOwotCQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJU3RydWN0dXJlQ29tcGFyYXRvciBybj0gbmV3IEZpbHRlcmVkQnVmZmVyZWRSZXNvdXJjZU5vZGUoaW5wdXQpOwotCQkJSUZpbGUgZmlsZT0gKElGaWxlKSBpbnB1dDsKLQkJCVN0cmluZyB0eXBlPSBub3JtYWxpemVDYXNlKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKTsKLQkJCWlmICgiSkFSIi5lcXVhbHModHlwZSkgfHwgIlpJUCIuZXF1YWxzKHR5cGUpKSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IFppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yKCkuZ2V0U3RydWN0dXJlKHJuKTsKLQkJCXJldHVybiBybjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBQZXJmb3JtcyBhIHR3by13YXkgb3IgdGhyZWUtd2F5IGRpZmYgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgcHJlcGFyZUlucHV0KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQkKLQkJdHJ5IHsKLQkJCS8vIGZpeCBmb3IgUFIgMUdGTUxGQjogSVRQVUk6V0lOMjAwMCAtIGZpbGVzIHRoYXQgYXJlIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtIGFwcGVhciBhcyBlbXB0eQkJCQkJCQkKLQkJCWZMZWZ0UmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgcG0pOwotCQkJZlJpZ2h0UmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgcG0pOwotCQkJaWYgKGZUaHJlZVdheSAmJiBmQW5jZXN0b3JSZXNvdXJjZSAhPSBudWxsKQotCQkJCWZBbmNlc3RvclJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIHBtKTsKLQkJCS8vIGVuZCBmaXgJCQkJCQkKLQkJCQkKLQkJCXBtLmJlZ2luVGFzayhVdGlsaXRpZXMuZ2V0U3RyaW5nKCJSZXNvdXJjZUNvbXBhcmUudGFza05hbWUiKSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmcgbGVmdExhYmVsPSBmTGVmdFJlc291cmNlLmdldE5hbWUoKTsKLQkJCVN0cmluZyByaWdodExhYmVsPSBmUmlnaHRSZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkKLQkJCVN0cmluZyB0aXRsZTsKLQkJCWlmIChmVGhyZWVXYXkpIHsJCQkKLQkJCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJSZXNvdXJjZUNvbXBhcmUudGhyZWVXYXkudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBhbmNlc3RvckxhYmVsPSBmQW5jZXN0b3JSZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJdGl0bGU9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHthbmNlc3RvckxhYmVsLCBsZWZ0TGFiZWwsIHJpZ2h0TGFiZWx9KTsJCi0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoIlJlc291cmNlQ29tcGFyZS50d29XYXkudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRpdGxlPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBTdHJpbmdbXSB7bGVmdExhYmVsLCByaWdodExhYmVsfSk7Ci0JCQl9Ci0JCQlzZXRUaXRsZSh0aXRsZSk7Ci0JCQkKLQkJCURpZmZlcmVuY2VyIGQ9IG5ldyBEaWZmZXJlbmNlcigpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IHZpc2l0KE9iamVjdCBwYXJlbnQsIGludCBkZXNjcmlwdGlvbiwgT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQkJCXJldHVybiBuZXcgTXlEaWZmTm9kZSgoSURpZmZDb250YWluZXIpIHBhcmVudCwgZGVzY3JpcHRpb24sIChJVHlwZWRFbGVtZW50KWFuY2VzdG9yLCAoSVR5cGVkRWxlbWVudClsZWZ0LCAoSVR5cGVkRWxlbWVudClyaWdodCk7Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJZlJvb3Q9IGQuZmluZERpZmZlcmVuY2VzKGZUaHJlZVdheSwgcG0sIG51bGwsIGZBbmNlc3RvciwgZkxlZnQsIGZSaWdodCk7Ci0JCQlyZXR1cm4gZlJvb3Q7Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQl9IGZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCWlmIChmTGVmdFJlc291cmNlICE9IG51bGwgJiYgZlJpZ2h0UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxlZnRMYWJlbD0gZkxlZnRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcmlnaHRMYWJlbD0gZlJpZ2h0UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwkJCQotCQkJaWYgKGZUaHJlZVdheSkgewkJCQotCQkJCVN0cmluZyBmb3JtYXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoIlJlc291cmNlQ29tcGFyZS50aHJlZVdheS50b29sdGlwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgYW5jZXN0b3JMYWJlbD0gZkFuY2VzdG9yUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBTdHJpbmdbXSB7YW5jZXN0b3JMYWJlbCwgbGVmdExhYmVsLCByaWdodExhYmVsfSk7Ci0JCQl9Ci0JCQlTdHJpbmcgZm9ybWF0PSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJSZXNvdXJjZUNvbXBhcmUudHdvV2F5LnRvb2x0aXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHtsZWZ0TGFiZWwsIHJpZ2h0TGFiZWx9KTsKLQkJfQotCQkvLyBmYWxsIGJhY2sKLQkJcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTGFiZWwoSVJlc291cmNlIHIpIHsKLQkJU3RyaW5nIG49IHIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlpZiAobi5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKQotCQkJcmV0dXJuIG4uc3Vic3RyaW5nKDEpOwotCQlyZXR1cm4gbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZUNoYW5nZXMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5zYXZlQ2hhbmdlcyhwbSk7Ci0JCWlmIChmUm9vdCBpbnN0YW5jZW9mIERpZmZOb2RlKSB7Ci0JCQl0cnkgewotCQkJCWNvbW1pdChwbSwgKERpZmZOb2RlKSBmUm9vdCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChmRGlmZlZpZXdlciAhPSBudWxsKQotCQkJCQlmRGlmZlZpZXdlci5yZWZyZXNoKCk7CQkJCQotCQkJCXNldERpcnR5KGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIFJlY3Vyc2l2ZWx5IHdhbGtzIHRoZSBkaWZmIHRyZWUgYW5kIGNvbW1pdHMgYWxsIGNoYW5nZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21taXQoSVByb2dyZXNzTW9uaXRvciBwbSwgRGlmZk5vZGUgbm9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBNeURpZmZOb2RlKQkJCi0JCQkoKE15RGlmZk5vZGUpbm9kZSkuY2xlYXJEaXJ0eSgpOwotCQkKLQkJSVR5cGVkRWxlbWVudCBsZWZ0PSBub2RlLmdldExlZnQoKTsKLQkJaWYgKGxlZnQgaW5zdGFuY2VvZiBCdWZmZXJlZFJlc291cmNlTm9kZSkKLQkJCSgoQnVmZmVyZWRSZXNvdXJjZU5vZGUpIGxlZnQpLmNvbW1pdChwbSk7Ci0JCQkKLQkJSVR5cGVkRWxlbWVudCByaWdodD0gbm9kZS5nZXRSaWdodCgpOwotCQlpZiAocmlnaHQgaW5zdGFuY2VvZiBCdWZmZXJlZFJlc291cmNlTm9kZSkKLQkJCSgoQnVmZmVyZWRSZXNvdXJjZU5vZGUpIHJpZ2h0KS5jb21taXQocG0pOwotCi0JCUlEaWZmRWxlbWVudFtdIGNoaWxkcmVuPSBub2RlLmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJRGlmZkVsZW1lbnQgZWxlbWVudD0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWZmTm9kZSkKLQkJCQkJY29tbWl0KHBtLCAoRGlmZk5vZGUpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUFkYXB0YWJsZS5nZXRBZGFwdGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElGaWxlW10uY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCSAgICBIYXNoU2V0IGNvbGxlY3Rvcj0gbmV3IEhhc2hTZXQoKTsKLQkJICAgIGNvbGxlY3REaXJ0eVJlc291cmNlcyhmUm9vdCwgY29sbGVjdG9yKTsKLQkJICAgIHJldHVybiAoSUZpbGVbXSkgY29sbGVjdG9yLnRvQXJyYXkobmV3IElGaWxlW2NvbGxlY3Rvci5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3REaXJ0eVJlc291cmNlcyhPYmplY3QgbywgU2V0IGNvbGxlY3RvcikgewotCQlpZiAobyBpbnN0YW5jZW9mIERpZmZOb2RlKSB7Ci0JCSAgICBEaWZmTm9kZSBub2RlPSAoRGlmZk5vZGUpIG87Ci0JCQkKLQkJCUlUeXBlZEVsZW1lbnQgbGVmdD0gbm9kZS5nZXRMZWZ0KCk7Ci0JCQlpZiAobGVmdCBpbnN0YW5jZW9mIEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKSB7Ci0JCQkgICAgQnVmZmVyZWRSZXNvdXJjZU5vZGUgYm49IChCdWZmZXJlZFJlc291cmNlTm9kZSkgbGVmdDsKLQkJCSAgICBpZiAoYm4uaXNEaXJ0eSgpKSB7Ci0JCQkgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZT0gYm4uZ2V0UmVzb3VyY2UoKTsKLQkJCSAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JCQkgICAgICAgICAgICBjb2xsZWN0b3IuYWRkKHJlc291cmNlKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJCUlUeXBlZEVsZW1lbnQgcmlnaHQ9IG5vZGUuZ2V0UmlnaHQoKTsKLQkJCWlmIChyaWdodCBpbnN0YW5jZW9mIEJ1ZmZlcmVkUmVzb3VyY2VOb2RlKSB7Ci0JCQkgICAgQnVmZmVyZWRSZXNvdXJjZU5vZGUgYm49IChCdWZmZXJlZFJlc291cmNlTm9kZSkgcmlnaHQ7Ci0JCQkgICAgaWYgKGJuLmlzRGlydHkoKSkgewotCQkJICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2U9IGJuLmdldFJlc291cmNlKCk7Ci0JCQkgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJICAgICAgICAgICAgY29sbGVjdG9yLmFkZChyZXNvdXJjZSk7Ci0JCQkgICAgfQotCQkJfQotCQkJCQotCQkJSURpZmZFbGVtZW50W10gY2hpbGRyZW49IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlEaWZmRWxlbWVudCBlbGVtZW50PSBjaGlsZHJlbltpXTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWZmTm9kZSkKLQkJCQkJICAgIGNvbGxlY3REaXJ0eVJlc291cmNlcyhlbGVtZW50LCBjb2xsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplQ2FzZShTdHJpbmcgcykgewotCQlpZiAoTk9STUFMSVpFX0NBU0UgJiYgcyAhPSBudWxsKQotCQkJcmV0dXJuIHMudG9VcHBlckNhc2UoKTsKLQkJcmV0dXJuIHM7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TaG93UHNldWRvQ29uZmxpY3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TaG93UHNldWRvQ29uZmxpY3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWEzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU2hvd1BzZXVkb0NvbmZsaWN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgPGNvZGU+SUNvbXBhcmVDb25maWd1cmF0aW9uLlNIT1dfUFNFVURPX0NPTkZMSUNUUzwvY29kZT4gcHJvcGVydHkgb2YgYW4KLSAqIDxjb2RlPklDb21wYXJlQ29uZmlndXJhdGlvbjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93UHNldWRvQ29uZmxpY3RzIGV4dGVuZHMgQ2hhbmdlUHJvcGVydHlBY3Rpb24gewotCi0JcHVibGljIFNob3dQc2V1ZG9Db25mbGljdHMoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjYykgewotCQlzdXBlcihidW5kbGUsIGNjLCAiYWN0aW9uLlNob3dQc2V1ZG9Db25mbGljdHMuIiwgQ29tcGFyZUNvbmZpZ3VyYXRpb24uU0hPV19QU0VVRE9fQ09ORkxJQ1RTKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1NpbXBsZVRleHRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1NpbXBsZVRleHRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YTdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TaW1wbGVUZXh0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklDb21wYXJlSW5wdXQ7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVRleHRWaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdFZpZXdlciB7Ci0JCQotCXByaXZhdGUgU291cmNlVmlld2VyIGZTb3VyY2VWaWV3ZXI7Ci0JcHJpdmF0ZSBJQ29tcGFyZUlucHV0IGZJbnB1dDsKLQkKLQkKLQlTaW1wbGVUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZlNvdXJjZVZpZXdlcj0gbmV3IFNvdXJjZVZpZXdlcihwYXJlbnQsIG51bGwsIFNXVC5IX1NDUk9MTCArIFNXVC5WX1NDUk9MTCk7Ci0JCWZTb3VyY2VWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCX0KLQkJCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZTb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgewotCQkJZlNvdXJjZVZpZXdlci5zZXREb2N1bWVudChuZXcgRG9jdW1lbnQoZ2V0U3RyaW5nKGlucHV0KSkpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJZklucHV0PSAoSUNvbXBhcmVJbnB1dCkgaW5wdXQ7Ci0JCQlJVHlwZWRFbGVtZW50IGxlZnQ9IGZJbnB1dC5nZXRMZWZ0KCk7Ci0JCQlmU291cmNlVmlld2VyLnNldERvY3VtZW50KG5ldyBEb2N1bWVudChnZXRTdHJpbmcobGVmdCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlyZXR1cm4gZklucHV0OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGlucHV0KSB7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBVdGlsaXRpZXMucmVhZFN0cmluZygoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgaW5wdXQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU3RyZWFtTWVyZ2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvU3RyZWFtTWVyZ2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThhZjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1N0cmVhbU1lcmdlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JU3RyZWFtTWVyZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLS8qKgotICogQSBmYWN0b3J5IHByb3h5IGZvciBjcmVhdGluZyBhIFN0cnVjdHVyZUNyZWF0b3IuCi0gKi8KLWNsYXNzIFN0cmVhbU1lcmdlckRlc2NyaXB0b3IgewotICAgIAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19BVFRSSUJVVEU9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudDsKLQkKLQkvKgotCSAqIENyZWF0ZXMgYSBuZXcgc29ydGVyIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJlYW1NZXJnZXJEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZFbGVtZW50PSBlbGVtZW50OwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBzdHJlYW0gbWVyZ2VyIGZyb20gdGhpcyBub2RlLgotCSAqLwotCXB1YmxpYyBJU3RyZWFtTWVyZ2VyIGNyZWF0ZVN0cmVhbU1lcmdlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVN0cmVhbU1lcmdlcilmRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX0FUVFJJQlVURSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCS8vRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZXgsIFNlYXJjaE1lc3NhZ2VzLmdldFN0cmluZygiU2VhcmNoLkVycm9yLmNyZWF0ZVNvcnRlci50aXRsZSIpLCBTZWFyY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlNlYXJjaC5FcnJvci5jcmVhdGVTb3J0ZXIubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0V4Y2VwdGlvbkhhbmRsZXIuZGlzcGxheU1lc3NhZ2VEaWFsb2coZXgsIFNlYXJjaE1lc3NhZ2VzLmdldFN0cmluZygiU2VhcmNoLkVycm9yLmNyZWF0ZVNvcnRlci50aXRsZSIpLCBTZWFyY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlNlYXJjaC5FcnJvci5jcmVhdGVTb3J0ZXIubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1N0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9TdHJ1Y3R1cmVDcmVhdG9yRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM2NmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1N0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDcmVhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBwcm94eSBmb3IgY3JlYXRpbmcgYSBTdHJ1Y3R1cmVDcmVhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlQ3JlYXRvckRlc2NyaXB0b3IgewotICAgIAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19BVFRSSUJVVEU9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OU19BVFRSSUJVVEU9ICJleHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotICAgIAotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotCQotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBzb3J0ZXIgbm9kZSB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZUNyZWF0b3JEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZFbGVtZW50PSBlbGVtZW50OwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBzb3J0ZXIgZnJvbSB0aGlzIG5vZGUuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVDcmVhdG9yIGNyZWF0ZVN0cnVjdHVyZUNyZWF0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElTdHJ1Y3R1cmVDcmVhdG9yKWZFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NfQVRUUklCVVRFKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJQ29tcGFyZVVJUGx1Z2luLmxvZyhleC5nZXRTdGF0dXMoKSk7Ci0JCQkvL0V4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGV4LCBTZWFyY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlNlYXJjaC5FcnJvci5jcmVhdGVTb3J0ZXIudGl0bGUiKSwgU2VhcmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTZWFyY2guRXJyb3IuY3JlYXRlU29ydGVyLm1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy9FeGNlcHRpb25IYW5kbGVyLmRpc3BsYXlNZXNzYWdlRGlhbG9nKGV4LCBTZWFyY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlNlYXJjaC5FcnJvci5jcmVhdGVTb3J0ZXIudGl0bGUiKSwgU2VhcmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTZWFyY2guRXJyb3IuY3JlYXRlU29ydGVyLm1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZSBjcmVhdG9yJ3MgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEF0dHJpYnV0ZShFWFRFTlNJT05TX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGFiRm9sZGVyTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9UYWJGb2xkZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkNTlhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9UYWJGb2xkZXJMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBUYWJGb2xkZXJMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplIChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkKLQkJCXJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLQkJCQotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlpbnQgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCWludCBtYXhXaWR0aCA9IDAsIG1heEhlaWdodCA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2ldOwotCQkJUG9pbnQgcHQgPSBjaGlsZC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLQkJCW1heFdpZHRoID0gTWF0aC5tYXggKG1heFdpZHRoLCBwdC54KTsKLQkJCW1heEhlaWdodCA9IE1hdGgubWF4IChtYXhIZWlnaHQsIHB0LnkpOwotCQl9Ci0JCQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQltYXhXaWR0aD0gd0hpbnQ7Ci0JCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkKLQkJCW1heEhlaWdodD0gaEhpbnQ7Ci0JCQotCQlyZXR1cm4gbmV3IFBvaW50KG1heFdpZHRoLCBtYXhIZWlnaHQpOwkKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxheW91dCAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVJlY3RhbmdsZSByZWN0PSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dE1lcmdlVmlld2VyQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dE1lcmdlVmlld2VyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNhYTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1RleHRNZXJnZVZpZXdlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyOwotCi0vKioKLSAqIEEgZmFjdG9yeSBvYmplY3QgZm9yIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+LgotICogVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvbmx5IG9iamVjdHMgd2l0aCBhIGRlZmF1bHQKLSAqIGNvbnN0cnVjdG9yIGNhbiBiZSBjcmVhdGVkIHZpYSBhbiBleHRlbnNpb24gcG9pbnQKLSAqICh0aGlzIHByZWNsdWRlcyBWaWV3ZXJzKS4KLSAqLwotcHVibGljIGNsYXNzIFRleHRNZXJnZVZpZXdlckNyZWF0b3IgaW1wbGVtZW50cyBJVmlld2VyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBtcCkgewotCQlyZXR1cm4gbmV3IFRleHRNZXJnZVZpZXdlcihwYXJlbnQsIG1wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9UZXh0Vmlld2VyQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVGV4dFZpZXdlckNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1YzBlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9UZXh0Vmlld2VyQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvcjsKLQotCi0vKioKLSAqIEEgZmFjdG9yeSBvYmplY3QgZm9yIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+LgotICogVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvbmx5IG9iamVjdHMgd2l0aCBhIGRlZmF1bHQKLSAqIGNvbnN0cnVjdG9yIGNhbiBiZSBjcmVhdGVkIHZpYSBhbiBleHRlbnNpb24gcG9pbnQKLSAqICh0aGlzIHByZWNsdWRlcyBWaWV3ZXJzKS4KLSAqLwotcHVibGljIGNsYXNzIFRleHRWaWV3ZXJDcmVhdG9yIGltcGxlbWVudHMgSVZpZXdlckNyZWF0b3IgewotCi0JcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tcGFyZUNvbmZpZ3VyYXRpb24gbXApIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXh0Vmlld2VyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVG9rZW5Db21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Ub2tlbkNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMTI3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9Ub2tlbkNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuSVRva2VuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSA8Y29kZT5JVG9rZW5Db21wYXJhdG9yPC9jb2RlPiBpbnRlcmZhY2UgZm9yIHdvcmRzIChvciB0b2tlbnMpCi0gKiBpbiBhIHN0cmluZy4KLSAqIEEgPGNvZGU+VG9rZW5Db21wYXJhdG9yPC9jb2RlPiBpcyB1c2VkIGFzIHRoZSBpbnB1dCBmb3IgdGhlIDxjb2RlPlJhbmdlRGlmZmVyZW5jZXI8L2NvZGU+Ci0gKiBlbmdpbmUgdG8gcGVyZm9ybSBhIHRva2VuIG9yaWVudGVkIGNvbXBhcmUgb24gc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIFRva2VuQ29tcGFyYXRvciBpbXBsZW1lbnRzIElUb2tlbkNvbXBhcmF0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRFc2NhcGU9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBpbnQgZkNvdW50OwotCXByaXZhdGUgaW50W10gZlN0YXJ0czsKLQlwcml2YXRlIGludFtdIGZMZW5ndGhzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPlRva2VuQ29tcGFyYXRvcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRoYXQgaXMgc3BsaXQgaW50byB0b2tlbgotCSAqLwotCXB1YmxpYyBUb2tlbkNvbXBhcmF0b3IoU3RyaW5nIHRleHQpIHsKLQkJCi0JCUFzc2VydC5pc05vdE51bGwodGV4dCk7Ci0KLQkJZlRleHQ9IHRleHQ7Ci0JCQotCQlpbnQgbGVuZ3RoPSBmVGV4dC5sZW5ndGgoKTsKLQkJZlN0YXJ0cz0gbmV3IGludFtsZW5ndGhdOwkvLyBwZXNzaW1pc3RpYyBhc3N1bXB0aW9uIQotCQlmTGVuZ3Rocz0gbmV3IGludFtsZW5ndGhdOwotCQlmQ291bnQ9IDA7Ci0JCQotCQljaGFyIGxhc3RDYXRlZ29yeT0gMDsJLy8gMDogbm8gY2F0ZWdvcnkKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGM9IGZUZXh0LmNoYXJBdChpKTsKLQkJCQotCQkJY2hhciBjYXRlZ29yeT0gJz8nOwkvLyB1bnNwZWNpZmllZCBjYXRlZ29yeQotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0JCQkJY2F0ZWdvcnk9ICcgJzsJLy8gd2hpdGUgc3BhY2UgY2F0ZWdvcnkKLQkJCWVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKQotCQkJCWNhdGVnb3J5PSAnMCc7CS8vIGRpZ2l0cwotCQkJZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGMpKQotCQkJCWNhdGVnb3J5PSAnYSc7CS8vIGxldHRlcnMKLQkJCQotCQkJaWYgKGNhdGVnb3J5ICE9IGxhc3RDYXRlZ29yeSkgewotCQkJCS8vIHN0YXJ0IGEgbmV3IHRva2VuCi0JCQkJZlN0YXJ0c1tmQ291bnQrK109IGk7Ci0JCQkJbGFzdENhdGVnb3J5PSBjYXRlZ29yeTsKLQkJCX0KLQkJCWZMZW5ndGhzW2ZDb3VudC0xXSsrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5Ub2tlbkNvbXBhcmF0b3I8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0aGF0IGlzIHNwbGl0IGludG8gdG9rZW4KLQkgKiBAcGFyYW0gc2hvdWxkRXNjYXBlCi0JICovCi0JcHVibGljIFRva2VuQ29tcGFyYXRvcihTdHJpbmcgdGV4dCwgYm9vbGVhbiBzaG91bGRFc2NhcGUpIHsKLQkJdGhpcyh0ZXh0KTsKLQkJZlNob3VsZEVzY2FwZT0gc2hvdWxkRXNjYXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0b2tlbiBpbiB0aGUgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiBudW1iZXIgb2YgdG9rZW4gaW4gdGhlIHN0cmluZwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmFuZ2VDb3VudCgpIHsKLQkJcmV0dXJuIGZDb3VudDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElUb2tlbkNvbXBhcmF0b3IuZ2V0VG9rZW5TdGFydAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VG9rZW5TdGFydChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgZkNvdW50KQotCQkJcmV0dXJuIGZTdGFydHNbaW5kZXhdOwotCQlyZXR1cm4gZlRleHQubGVuZ3RoKCk7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJVG9rZW5Db21wYXJhdG9yLmdldFRva2VuTGVuZ3RoCi0JICovCi0JcHVibGljIGludCBnZXRUb2tlbkxlbmd0aChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgZkNvdW50KQotCQkJcmV0dXJuIGZMZW5ndGhzW2luZGV4XTsKLQkJcmV0dXJuIDA7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgdG9rZW4gZ2l2ZW4gYnkgdGhlIGZpcnN0IGluZGV4Ci0JICogbWF0Y2hlcyBhIHRva2VuIHNwZWNpZmllZCBieSB0aGUgb3RoZXIgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4gYW5kIGluZGV4LgotCSAqCi0JICogQHBhcmFtIHRoaXNJbmRleAl0aGUgbnVtYmVyIG9mIHRoZSB0b2tlbiB3aXRoaW4gdGhpcyByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIG90aGVyIHRoZSByYW5nZSBjb21wYXJhdG9yIHRvIGNvbXBhcmUgdGhpcyB3aXRoCi0JICogQHBhcmFtIG90aGVySW5kZXggdGhlIG51bWJlciBvZiB0aGUgdG9rZW4gd2l0aGluIHRoZSBvdGhlciBjb21wYXJhdG9yCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdG9rZW4gYXJlIGVxdWFsCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmFuZ2VzRXF1YWwoaW50IHRoaXNJbmRleCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlciwgaW50IG90aGVySW5kZXgpIHsKLQkJaWYgKG90aGVyICE9IG51bGwgJiYgZ2V0Q2xhc3MoKSA9PSBvdGhlci5nZXRDbGFzcygpKSB7Ci0JCQlUb2tlbkNvbXBhcmF0b3IgdGM9IChUb2tlbkNvbXBhcmF0b3IpIG90aGVyOwotCQkJaW50IHRoaXNMZW49IGdldFRva2VuTGVuZ3RoKHRoaXNJbmRleCk7Ci0JCQlpbnQgb3RoZXJMZW49IHRjLmdldFRva2VuTGVuZ3RoKG90aGVySW5kZXgpOwotCQkJaWYgKHRoaXNMZW4gPT0gb3RoZXJMZW4pCi0JCQkJcmV0dXJuIGZUZXh0LnJlZ2lvbk1hdGNoZXMoZmFsc2UsIGdldFRva2VuU3RhcnQodGhpc0luZGV4KSwgdGMuZlRleHQsIHRjLmdldFRva2VuU3RhcnQob3RoZXJJbmRleCksIHRoaXNMZW4pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEFib3J0cyB0aGUgY29tcGFyaXNvbiBpZiB0aGUgbnVtYmVyIG9mIHRva2VucyBpcyB0b28gbGFyZ2UuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBhYm9ydCBhIHRva2VuIGNvbXBhcmlzb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBza2lwUmFuZ2VDb21wYXJpc29uKGludCBsZW5ndGgsIGludCBtYXgsIElSYW5nZUNvbXBhcmF0b3Igb3RoZXIpIHsKLQotCQlpZiAoIWZTaG91bGRFc2NhcGUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdldFJhbmdlQ291bnQoKSA8IDUwIHx8IG90aGVyLmdldFJhbmdlQ291bnQoKSA8IDUwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChtYXggPCAxMDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGxlbmd0aCA8IDEwMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAobWF4ID4gODAwKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKGxlbmd0aCA8IG1heCAvIDQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLS8vCQkvL1N0cmluZyBpbj0gInByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgeyI7Ci0vLwkJLy9TdHJpbmcgaW49ICJmb3IgKGludCBqPSAwOyBqIDwgbC0xOyBqKyspIHsiOwotLy8JCVN0cmluZyBpbj0gImZvciBkbyAgICBpPSAxMjM7IGkrKyI7Ci0vLwkJVG9rZW5Db21wYXJhdG9yIHRjPSBuZXcgVG9rZW5Db21wYXJhdG9yKGluLCBmYWxzZSk7Ci0vLwkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJuOiAiICsgdGMuZ2V0UmFuZ2VDb3VudCgpKTsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oaW4pOwotLy8JCQotLy8JCWludCBwPSAwOwotLy8JCWZvciAoaW50IGk9IDA7IGkgPCB0Yy5nZXRSYW5nZUNvdW50KCk7IGkrKykgewotLy8JCQlpbnQgbD0gdGMuZ2V0VG9rZW5MZW5ndGgoaSk7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnQoIjwiKTsKLS8vCQkJCi0vLwkJCWZvciAoaW50IGo9IDA7IGogPCBsLTE7IGorKykKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAiKTsKLS8vCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0vLwkJCi0vLwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4dHJhY3Q6IDwiICsgdGMuZXh0cmFjdCgxNiwgMSkgKyAiPiIpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjE2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBhbmQgdXRpbGl0eSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgVXRpbGl0aWVzIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBY3Rpb24oSUtleUJpbmRpbmdTZXJ2aWNlIGticywgSUFjdGlvbiBhLCBTdHJpbmcgaWQpIHsKLQkJaWYgKGticyAhPSBudWxsKSB7Ci0JCQlhLnNldEFjdGlvbkRlZmluaXRpb25JZChpZCk7Ci0JCQlrYnMucmVnaXN0ZXJBY3Rpb24oYSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFydFNpdGUgZmluZFNpdGUoQ29udHJvbCBjKSB7Ci0JCXdoaWxlIChjICE9IG51bGwgJiYgIWMuaXNEaXNwb3NlZCgpKSB7Ci0JCQlPYmplY3QgZGF0YT0gYy5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0KQotCQkJCXJldHVybiAoKElXb3JrYmVuY2hQYXJ0KWRhdGEpLmdldFNpdGUoKTsKLQkJCWM9IGMuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQWN0aW9uQmFycyBmaW5kQWN0aW9uQmFycyhDb250cm9sIGMpIHsKLQkJd2hpbGUgKGMgIT0gbnVsbCAmJiAhYy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCU9iamVjdCBkYXRhPSBjLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgQ29tcGFyZUVkaXRvcikKLQkJCQlyZXR1cm4gKChDb21wYXJlRWRpdG9yKWRhdGEpLmdldEFjdGlvbkJhcnMoKTsKLQkJCQkKLQkJCS8vIFBSIDFHRFZaVjc6IElUUFZDTTpXSU45OCAtIENUUkwgKyBDIGRvZXMgbm90IHdvcmsgaW4gSmF2YSBzb3VyY2UgY29tcGFyZQotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBJVmlld1BhcnQpCi0JCQkJcmV0dXJuICgoSVZpZXdQYXJ0KWRhdGEpLmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQkJLy8gZW5kIFBSIDFHRFZaVjcKLQkJCQotCQkJYz0gYy5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW5hYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZW5hYmxlKSB7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbj0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCWNoaWxkcmVuW2ldLnNldEVuYWJsZWQoZW5hYmxlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihDb21wYXJlQ29uZmlndXJhdGlvbiBjYywgU3RyaW5nIGtleSwgYm9vbGVhbiBkZmx0KSB7Ci0JCWlmIChjYyAhPSBudWxsKSB7Ci0JCQlPYmplY3QgdmFsdWU9IGNjLmdldFByb3BlcnR5KGtleSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJCXJldHVybiAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZGZsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShMaXN0ZW5lckxpc3QgbGwsIE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChsbCAhPSBudWxsKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50PSBudWxsOwotCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBsbC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsPSAoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQkJZXZlbnQ9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZSwgcHJvcGVydHksIG9sZCwgbmV3VmFsdWUpOwotCQkJCWwucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9rVG9Vc2UoV2lkZ2V0IHdpZGdldCkgewotCQlyZXR1cm4gd2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBpbnRlcm5hbEdldFJlc291cmNlcyhJU2VsZWN0aW9uIHNlbGVjdGlvbiwgQ2xhc3MgdHlwZSkgewotCQkKLQkJQXJyYXlMaXN0IHRtcD0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkKLQkJCU9iamVjdFtdIHM9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQkJCi0JCQlmb3IgKGludCBpPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJCQotCQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gbnVsbDsKLQkJCQkKLQkJCQlPYmplY3Qgbz0gc1tpXTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKG8pKSB7Ci0JCQkJCXJlc291cmNlPSAoSVJlc291cmNlKSBvOwotCQkJCQkJCi0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCQlJQWRhcHRhYmxlIGE9IChJQWRhcHRhYmxlKSBvOwotCQkJCQlPYmplY3QgYWRhcHRlcj0gYS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJCWlmICh0eXBlLmlzSW5zdGFuY2UoYWRhcHRlcikpCi0JCQkJCQlyZXNvdXJjZT0gKElSZXNvdXJjZSkgYWRhcHRlcjsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCXRtcC5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdG1wOwotCX0KLQkKLQkvKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogZXh0cmFjdCBhbGwgYWNjZXNzaWJsZSA8Y29kZT5JUmVzb3VyY2VzPC9jb2RlPiBmcm9tIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiBOZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHRtcD0gaW50ZXJuYWxHZXRSZXNvdXJjZXMoc2VsZWN0aW9uLCBJUmVzb3VyY2UuY2xhc3MpOwotCQlyZXR1cm4gKElSZXNvdXJjZVtdKSB0bXAudG9BcnJheShuZXcgSVJlc291cmNlW3RtcC5zaXplKCldKTsKLQl9Ci0JCi0JLyoKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IGV4dHJhY3QgYWxsIGFjY2Vzc2libGUgPGNvZGU+SUZpbGVzPC9jb2RlPiBmcm9tIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiBOZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZVtdIGdldEZpbGVzKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFycmF5TGlzdCB0bXA9IGludGVybmFsR2V0UmVzb3VyY2VzKHNlbGVjdGlvbiwgSUZpbGUuY2xhc3MpOwotCQlyZXR1cm4gKElGaWxlW10pIHRtcC50b0FycmF5KG5ldyBJRmlsZVt0bXAuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gcmVhZEJ5dGVzKElucHV0U3RyZWFtIGluKSB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3M9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsJCQotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYz0gaW4ucmVhZCgpOwotCQkJCWlmIChjID09IC0xKQotCQkJCQlicmVhazsKLQkJCQlib3Mud3JpdGUoYyk7Ci0JCQl9Ci0JCQkJCQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQl9IGZpbmFsbHkgewotCQkJVXRpbGl0aWVzLmNsb3NlKGluKTsKLQkJCXRyeSB7Ci0JCQkJYm9zLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gYm9zLnRvQnl0ZUFycmF5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWNvblBhdGgoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXJldHVybiAiaWNvbnMvZnVsbC8iOwkvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgZ2l2ZW4gQWN0aW9uIGZyb20gYSBSZXNvdXJjZUJ1bmRsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEFjdGlvbihJQWN0aW9uIGEsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCkgewotCQkKLQkJU3RyaW5nIGxhYmVsS2V5PSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b29sdGlwS2V5PSAidG9vbHRpcCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGltYWdlS2V5PSAiaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZXNjcmlwdGlvbktleT0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCWxhYmVsS2V5PSBwcmVmaXggKyBsYWJlbEtleTsKLQkJCXRvb2x0aXBLZXk9IHByZWZpeCArIHRvb2x0aXBLZXk7Ci0JCQlpbWFnZUtleT0gcHJlZml4ICsgaW1hZ2VLZXk7Ci0JCQlkZXNjcmlwdGlvbktleT0gcHJlZml4ICsgZGVzY3JpcHRpb25LZXk7Ci0JCX0KLQkJCi0JCWEuc2V0VGV4dChnZXRTdHJpbmcoYnVuZGxlLCBsYWJlbEtleSwgbGFiZWxLZXkpKTsKLQkJYS5zZXRUb29sVGlwVGV4dChnZXRTdHJpbmcoYnVuZGxlLCB0b29sdGlwS2V5LCBudWxsKSk7Ci0JCWEuc2V0RGVzY3JpcHRpb24oZ2V0U3RyaW5nKGJ1bmRsZSwgZGVzY3JpcHRpb25LZXksIG51bGwpKTsKLQkJCi0JCVN0cmluZyByZWxQYXRoPSBnZXRTdHJpbmcoYnVuZGxlLCBpbWFnZUtleSwgbnVsbCk7Ci0JCWlmIChyZWxQYXRoICE9IG51bGwgJiYgcmVsUGF0aC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkKLQkJCVN0cmluZyBkUGF0aDsKLQkJCVN0cmluZyBlUGF0aDsKLQkJCQotCQkJaWYgKHJlbFBhdGguaW5kZXhPZigiLyIpID49IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwYXRoPSByZWxQYXRoLnN1YnN0cmluZygxKTsKLQkJCQlkUGF0aD0gJ2QnICsgcGF0aDsKLQkJCQllUGF0aD0gJ2UnICsgcGF0aDsKLQkJCX0gZWxzZSB7Ci0JCQkJZFBhdGg9ICJkbGNsMTYvIiArIHJlbFBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCQllUGF0aD0gImVsY2wxNi8iICsgcmVsUGF0aDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlJbWFnZURlc2NyaXB0b3IgaWQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoZFBhdGgpOwkvLyB3ZSBzZXQgdGhlIGRpc2FibGVkIGltYWdlIGZpcnN0IChzZWUgUFIgMUdEREU4NykKLQkJCWlmIChpZCAhPSBudWxsKQotCQkJCWEuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaWQpOwotCQkJaWQ9IENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoZVBhdGgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlhLnNldEltYWdlRGVzY3JpcHRvcihpZCk7Ci0JCQkJYS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihpZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRUb2dnbGVBY3Rpb24oSUFjdGlvbiBhLCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIGJvb2xlYW4gY2hlY2tlZCkgewotCi0JCVN0cmluZyB0b29sdGlwPSBudWxsOwotCQlpZiAoY2hlY2tlZCkKLQkJCXRvb2x0aXA9IGdldFN0cmluZyhidW5kbGUsIHByZWZpeCArICJ0b29sdGlwLmNoZWNrZWQiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl0b29sdGlwPSBnZXRTdHJpbmcoYnVuZGxlLCBwcmVmaXggKyAidG9vbHRpcC51bmNoZWNrZWQiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAodG9vbHRpcCA9PSBudWxsKQotCQkJdG9vbHRpcD0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJlZml4ICsgInRvb2x0aXAiLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKHRvb2x0aXAgIT0gbnVsbCkKLQkJCWEuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0JCQkKLQkJU3RyaW5nIGRlc2NyaXB0aW9uPSBudWxsOwotCQlpZiAoY2hlY2tlZCkKLQkJCWRlc2NyaXB0aW9uPSBnZXRTdHJpbmcoYnVuZGxlLCBwcmVmaXggKyAiZGVzY3JpcHRpb24uY2hlY2tlZCIsIG51bGwpOwkvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWRlc2NyaXB0aW9uPSBnZXRTdHJpbmcoYnVuZGxlLCBwcmVmaXggKyAiZGVzY3JpcHRpb24udW5jaGVja2VkIiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlkZXNjcmlwdGlvbj0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJlZml4ICsgImRlc2NyaXB0aW9uIiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJYS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCBTdHJpbmcgZGZsdFZhbHVlKSB7Ci0JCQotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGZsdFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0JCQotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSwgbmV3IFN0cmluZ1tdIHsgYXJnIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBOZWVkV29yawotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ29tcGFyZVVJLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29tcGFyZVVJLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSksIG5ldyBTdHJpbmdbXSB7IGFyZyB9KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0JCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbXBhcmVVSS5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhrZXkpLCBuZXcgU3RyaW5nW10geyBhcmcwLCBhcmcxIH0pOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoYnVuZGxlLCBrZXksIGtleSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludGVnZXIoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCBpbnQgZGZsdFZhbHVlKSB7Ci0JCQotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHM9IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCQlpZiAocyAhPSBudWxsKQotCQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGZsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBjb250YWlucyByZXNvdXJjZXMgdGhhdCBkb24ndAotCSAqIGhhdmUgb3ZlcmxhcHBpbmcgcGF0aHMgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIAotCSAqLwotCS8qCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0aW9uTm9uT3ZlcmxhcHBpbmcoKSB0aHJvd3MgVGVhbUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0JCS8vIGFsbG93IG9wZXJhdGlvbiBmb3Igbm9uLW92ZXJsYXBwaW5nIHJlc291cmNlIHNlbGVjdGlvbnMKLQkJaWYocmVzb3VyY2VzLmxlbmd0aD4wKSB7Ci0JCQlMaXN0IHZhbGlkUGF0aHMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJCi0JCQkJLy8gb25seSBhbGxvdyBjdnMgcmVzb3VyY2VzIHRvIGJlIHNlbGVjdGVkCi0JCQkJaWYoUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKHJlc291cmNlLmdldFByb2plY3QoKSwgQ1ZTUHJvdmlkZXJQbHVnaW4uZ2V0VHlwZUlkKCkpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBjaGVjayBpZiB0aGlzIHJlc291cmNlIG92ZXJsYXBzIG90aGVyIHNlbGVjdGlvbnMJCQotCQkJCUlQYXRoIHJlc291cmNlRnVsbFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJCWlmKCF2YWxpZFBhdGhzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsaWRQYXRocy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBpdC5uZXh0KCk7Ci0JCQkJCQlpZihwYXRoLmlzUHJlZml4T2YocmVzb3VyY2VGdWxsUGF0aCkgfHwgCi0JCQkJCSAgICAgICByZXNvdXJjZUZ1bGxQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdmFsaWRQYXRocy5hZGQocmVzb3VyY2VGdWxsUGF0aCk7Ci0JCQkJCi0JCQkJLy8gZW5zdXJlIHRoYXQgcmVzb3VyY2VzIGFyZSBtYW5hZ2VkCi0JCQkJSUNWU1Jlc291cmNlIGN2c1Jlc291cmNlID0gQ1ZTV29ya3NwYWNlUm9vdC5nZXRDVlNSZXNvdXJjZUZvcihyZXNvdXJjZSk7Ci0JCQkJaWYoY3ZzUmVzb3VyY2UuaXNGb2xkZXIoKSkgewotCQkJCQlpZiggISAoKElDVlNGb2xkZXIpY3ZzUmVzb3VyY2UpLmlzQ1ZTRm9sZGVyKCkpIHJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiggISBjdnNSZXNvdXJjZS5pc01hbmFnZWQoKSkgcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JKi8KLQkKLQkvKiB2YWxpZGF0ZSBlZGl0IHV0aWxpdGllcyAqLwotCQotCS8qKgotCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYW4gdmFsaWRhdGVFZGl0IGNhbGwgaGFzIGNoYW5nZWQgdGhlCi0JICogY29udGVudCBvZiBhIGZpbGUgb24gZGlzay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURBVEVfRURJVF9QUk9CTEVNPSAxMDAwNDsJCi0JCi0JLyoKLQkgKiBNYWtlcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzIGNvbW1pdHRhYmxlLiBDb21taXR0YWJsZSBtZWFucyB0aGF0IGFsbAotCSAqIHJlc291cmNlcyBhcmUgd3JpdGVhYmxlIGFuZCB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZXMgaGFzbid0Ci0JICogY2hhbmdlZCBieSBjYWxsaW5nIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4gZm9yIGEgZ2l2ZW4gZmlsZSBvbgotCSAqIDx0dD5JV29ya3NwYWNlPC90dD4uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyB0aGUgcmVzb3VyY2VzIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gc2hlbGwgdGhlIFNoZWxsIHBhc3NlZCB0byA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+IGFzIGEgY29udGV4dAotCSAqIEByZXR1cm4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgcmVzb3VyY2VzIGFyZSBjb21taXR0YWJsZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZUVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGVbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VzKG5ldyBJUmVzb3VyY2VbXSB7IHJlc291cmNlIH0sIHNoZWxsLCB0aXRsZSk7Ci0JfQotCQotCS8qCi0JICogTWFrZXMgdGhlIGdpdmVuIHJlc291cmNlcyBjb21taXR0YWJsZS4gQ29tbWl0dGFibGUgbWVhbnMgdGhhdCBhbGwKLQkgKiByZXNvdXJjZXMgYXJlIHdyaXRlYWJsZSBhbmQgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2VzIGhhc24ndAotCSAqIGNoYW5nZWQgYnkgY2FsbGluZyA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+IGZvciBhIGdpdmVuIGZpbGUgb24KLQkgKiA8dHQ+SVdvcmtzcGFjZTwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHJlc291cmNlcyB0byBiZSBjaGVja2VkCi0JICogQHBhcmFtIHNoZWxsIHRoZSBTaGVsbCBwYXNzZWQgdG8gPGNvZGU+dmFsaWRhdGVFZGl0PC9jb2RlPiBhcyBhIGNvbnRleHQKLQkgKiBAcmV0dXJuIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIHJlc291cmNlcyBhcmUgY29tbWl0dGFibGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjdmFsaWRhdGVFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VzKExpc3QgcmVzb3VyY2VzLCBTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCUlSZXNvdXJjZSByW109IChJUmVzb3VyY2VbXSkgcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JCXJldHVybiB2YWxpZGF0ZVJlc291cmNlcyhyLCBzaGVsbCwgdGl0bGUpOwotCX0KLQkKLQkvKgotCSAqIE1ha2VzIHRoZSBnaXZlbiByZXNvdXJjZXMgY29tbWl0dGFibGUuIENvbW1pdHRhYmxlIG1lYW5zIHRoYXQgYWxsCi0JICogcmVzb3VyY2VzIGFyZSB3cml0ZWFibGUgYW5kIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlcyBoYXNuJ3QKLQkgKiBjaGFuZ2VkIGJ5IGNhbGxpbmcgPGNvZGU+dmFsaWRhdGVFZGl0PC9jb2RlPiBmb3IgYSBnaXZlbiBmaWxlIG9uCi0JICogPHR0PklXb3Jrc3BhY2U8L3R0Pi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSByZXNvdXJjZXMgdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBzaGVsbCB0aGUgU2hlbGwgcGFzc2VkIHRvIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4gYXMgYSBjb250ZXh0Ci0JICogQHJldHVybiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCByZXNvdXJjZXMgYXJlIGNvbW1pdHRhYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3ZhbGlkYXRlRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZVtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUpIHsKLQkJCi0JCS8vIGdldCBhbGwgcmVhZG9ubHkgZmlsZXMKLQkJTGlzdCByZWFkT25seUZpbGVzPSBnZXRSZWFkb25seUZpbGVzKHJlc291cmNlcyk7Ci0JCWlmIChyZWFkT25seUZpbGVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQkvLyBnZXQgdGltZXN0YW1wcyBvZiByZWFkb25seSBmaWxlcyBiZWZvcmUgdmFsaWRhdGVFZGl0Ci0JCU1hcCBvbGRUaW1lU3RhbXBzPSBjcmVhdGVNb2RpZmljYXRpb25TdGFtcE1hcChyZWFkT25seUZpbGVzKTsKLQkJCi0JCUlGaWxlW10gZmlsZXM9IChJRmlsZVtdKSByZWFkT25seUZpbGVzLnRvQXJyYXkobmV3IElGaWxlW3JlYWRPbmx5RmlsZXMuc2l6ZSgpXSk7Ci0JCUlTdGF0dXMgc3RhdHVzPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBzaGVsbCk7Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBnZXRTdHJpbmcoIlZhbGlkYXRlRWRpdC5lcnJvci51bmFibGVfdG9fcGVyZm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQotCQlJU3RhdHVzIG1vZGlmaWVkPSBudWxsOwotCQlNYXAgbmV3VGltZVN0YW1wcz0gY3JlYXRlTW9kaWZpY2F0aW9uU3RhbXBNYXAocmVhZE9ubHlGaWxlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gb2xkVGltZVN0YW1wcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlGaWxlIGZpbGU9IChJRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlJU3RhdHVzIGVudHJ5PSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUNvbXBhcmVVSVBsdWdpbi5nZXRQbHVnaW5JZCgpLAotCQkJCQkJCQlWQUxJREFURV9FRElUX1BST0JMRU0sCi0JCQkJCQkJCWdldEZvcm1hdHRlZFN0cmluZygiVmFsaWRhdGVFZGl0LmVycm9yLnN0aWxsUmVhZG9ubHkiLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJbW9kaWZpZWQ9IGFkZFN0YXR1cyhtb2RpZmllZCwgZW50cnkpOwotCQkJfSBlbHNlIGlmICghIG9sZFRpbWVTdGFtcHMuZ2V0KGZpbGUpLmVxdWFscyhuZXdUaW1lU3RhbXBzLmdldChmaWxlKSkpIHsKLQkJCQlJU3RhdHVzIGVudHJ5PSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUNvbXBhcmVVSVBsdWdpbi5nZXRQbHVnaW5JZCgpLAotCQkJCQkJCQlWQUxJREFURV9FRElUX1BST0JMRU0sCi0JCQkJCQkJCWdldEZvcm1hdHRlZFN0cmluZygiVmFsaWRhdGVFZGl0LmVycm9yLmZpbGVNb2RpZmllZCIsIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQludWxsKTsKLQkJCQltb2RpZmllZD0gYWRkU3RhdHVzKG1vZGlmaWVkLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBnZXRTdHJpbmcoIlZhbGlkYXRlRWRpdC5lcnJvci51bmFibGVfdG9fcGVyZm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBtb2RpZmllZCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UmVhZG9ubHlGaWxlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLQkJTGlzdCByZWFkT25seUZpbGVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gcmVzb3VyY2VzW2ldOwotCQkJUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcz0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlQXR0cmlidXRlcyAhPSBudWxsICYmIHJlc291cmNlQXR0cmlidXRlcy5pc1JlYWRPbmx5KCkpCQotCQkJCXJlYWRPbmx5RmlsZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gcmVhZE9ubHlGaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgY3JlYXRlTW9kaWZpY2F0aW9uU3RhbXBNYXAoTGlzdCBmaWxlcykgewotCQlNYXAgbWFwPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGZpbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUlGaWxlIGZpbGU9IChJRmlsZSlpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQoZmlsZSwgbmV3IExvbmcoZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBhZGRTdGF0dXMoSVN0YXR1cyBzdGF0dXMsIElTdGF0dXMgZW50cnkpIHsKLQkJCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBlbnRyeTsKLQkJCQotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJKChNdWx0aVN0YXR1cylzdGF0dXMpLmFkZChlbnRyeSk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJTXVsdGlTdGF0dXMgcmVzdWx0PSBuZXcgTXVsdGlTdGF0dXMoQ29tcGFyZVVJUGx1Z2luLmdldFBsdWdpbklkKCksCi0JCQlWQUxJREFURV9FRElUX1BST0JMRU0sCi0JCQlnZXRTdHJpbmcoIlZhbGlkYXRlRWRpdC5lcnJvci51bmFibGVfdG9fcGVyZm9ybSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAKLQkJcmVzdWx0LmFkZChzdGF0dXMpOwotCQlyZXN1bHQuYWRkKGVudHJ5KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLy8gZW5jb2RpbmcKLQkKLQkvKgotCSAqIFJldHVybnMgbnVsbCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3RyaW5nKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIHBhcnQ9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IHJlYWQ9IDA7Ci0JCQlyZWFkZXI9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGVuY29kaW5nKSk7Ci0KLQkJCXdoaWxlICgocmVhZD0gcmVhZGVyLnJlYWQocGFydCkpICE9IC0xKQotCQkJCWJ1ZmZlci5hcHBlbmQocGFydCwgMCwgcmVhZCk7Ci0JCQkKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJLy8gTmVlZFdvcmsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoYXJzZXQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElFbmNvZGVkU3RvcmFnZSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChJRW5jb2RlZFN0b3JhZ2UpcmVzb3VyY2UpLmdldENoYXJzZXQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBmYWxsICB0aHJvdWdoCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgcywgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCWJ5dGVbXSBieXRlcz0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlieXRlcz0gcy5nZXRCeXRlcyhlbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCWJ5dGVzPSBzLmdldEJ5dGVzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ5dGVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRTdHJpbmcoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzYSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpcz0gc2EuZ2V0Q29udGVudHMoKTsKLQkJU3RyaW5nIGVuY29kaW5nPSBudWxsOwotCQlpZiAoc2EgaW5zdGFuY2VvZiBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvcikKLQkJCWVuY29kaW5nPSAoKElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKXNhKS5nZXRDaGFyc2V0KCk7Ci0JCWlmIChlbmNvZGluZyA9PSBudWxsKQotCQkJZW5jb2Rpbmc9IFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQlyZXR1cm4gVXRpbGl0aWVzLnJlYWRTdHJpbmcoaXMsIGVuY29kaW5nKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSW5wdXRTdHJlYW0gaXMpIHsKLQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVmlld2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVmlld2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBiMDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL1ZpZXdlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBDcmVhdGVzIDxjb2RlPlZpZXdlcjwvY29kZT5zIGZyb20gYW4gPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFZpZXdlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJVmlld2VyRGVzY3JpcHRvciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTlNfQVRUUklCVVRFPSAiZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uOwotCXByaXZhdGUgSVZpZXdlckNyZWF0b3IgZlZpZXdlckNyZWF0b3I7Ci0JcHJpdmF0ZSBDbGFzcyBmVmlld2VyQ2xhc3M7Ci0KLQlwdWJsaWMgVmlld2VyRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCWZDb25maWd1cmF0aW9uPSBjb25maWc7Ci0JfQotCi0JcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoVmlld2VyIGN1cnJlbnRWaWV3ZXIsIENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIG1wKSB7Ci0JCQotCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIuZ2V0Q2xhc3MoKSA9PSBmVmlld2VyQ2xhc3MpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZXVzZWQgdmlld2VyOiAiICsgY3VycmVudFZpZXdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKLQkJfQotCQkKLQkJaWYgKGZWaWV3ZXJDcmVhdG9yID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZlZpZXdlckNyZWF0b3I9IChJVmlld2VyQ3JlYXRvcikgZkNvbmZpZ3VyYXRpb24uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSSUJVVEUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gTmVlZFdvcmsKLQkJCX0KLQkJfQotCi0JCWlmIChmVmlld2VyQ3JlYXRvciAhPSBudWxsKSB7Ci0JCQlWaWV3ZXIgdmlld2VyPSBmVmlld2VyQ3JlYXRvci5jcmVhdGVWaWV3ZXIocGFyZW50LCBtcCk7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJZlZpZXdlckNsYXNzPSB2aWV3ZXIuZ2V0Q2xhc3MoKTsKLQkJCXJldHVybiB2aWV3ZXI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShFWFRFTlNJT05TX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvVmlld2VyU3dpdGNoaW5nQ2FuY2VsbGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9WaWV3ZXJTd2l0Y2hpbmdDYW5jZWxsZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyMzZmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9WaWV3ZXJTd2l0Y2hpbmdDYW5jZWxsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsOwotCi0KLXB1YmxpYyBjbGFzcyBWaWV3ZXJTd2l0Y2hpbmdDYW5jZWxsZWQgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL0xpbmVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9tZXJnZS9MaW5lQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUzNDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL0xpbmVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgSVJhbmdlQ29tcGFyYXRvciBicmVha3MgYW4gaW5wdXQgc3RyZWFtIGludG8gbGluZXMuCi0gKi8KLWNsYXNzIExpbmVDb21wYXJhdG9yIGltcGxlbWVudHMgSVJhbmdlQ29tcGFyYXRvciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGZMaW5lczsKLQotICAgIHB1YmxpYyBMaW5lQ29tcGFyYXRvcihJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGVuY29kaW5nKSk7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBBcnJheUxpc3QgYXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGFyLmFkZChsaW5lKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAJCS8vIHNpbGVudGx5IGlnbm9yZWQKLSAgICAgICAgfQotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLS8vICAgICAgICB9Ci0gICAgICAgIGZMaW5lcyA9IChTdHJpbmdbXSkgYXIudG9BcnJheShuZXcgU3RyaW5nW2FyLnNpemUoKV0pOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRMaW5lKGludCBpeCkgewotICAgICAgICByZXR1cm4gZkxpbmVzW2l4XTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuSVJhbmdlQ29tcGFyYXRvciNnZXRSYW5nZUNvdW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJhbmdlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBmTGluZXMubGVuZ3RoOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yI3Jhbmdlc0VxdWFsKGludCwgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3IsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByYW5nZXNFcXVhbChpbnQgdGhpc0luZGV4LCBJUmFuZ2VDb21wYXJhdG9yIG90aGVyLAotICAgICAgICAgICAgaW50IG90aGVySW5kZXgpIHsKLSAgICAgICAgU3RyaW5nIHMxID0gZkxpbmVzW3RoaXNJbmRleF07Ci0gICAgICAgIFN0cmluZyBzMiA9ICgoTGluZUNvbXBhcmF0b3IpIG90aGVyKS5mTGluZXNbb3RoZXJJbmRleF07Ci0gICAgICAgIHJldHVybiBzMS5lcXVhbHMoczIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yI3NraXBSYW5nZUNvbXBhcmlzb24oaW50LCBpbnQsIG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5JUmFuZ2VDb21wYXJhdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNraXBSYW5nZUNvbXBhcmlzb24oaW50IGxlbmd0aCwgaW50IG1heExlbmd0aCwgSVJhbmdlQ29tcGFyYXRvciBvdGhlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhjYmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL01lcmdlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLm1lcmdlOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWNsYXNzIE1lcmdlTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuTWVyZ2VNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLQlwcml2YXRlIE1lcmdlTWVzc2FnZXMoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvbWVyZ2UvTWVyZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTExM2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL01lcmdlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVGV4dEF1dG9NZXJnZS5pbnB1dEVuY29kaW5nRXJyb3I9IFVuc3VwcG9ydGVkIGVuY29kaW5nIGZvciBpbnB1dCBzdHJlYW1zCi1UZXh0QXV0b01lcmdlLm91dHB1dEVuY29kaW5nRXJyb3I9IFVuc3VwcG9ydGVkIGVuY29kaW5nIGZvciBvdXRwdXQgc3RyZWFtcwotVGV4dEF1dG9NZXJnZS5vdXRwdXRJT0Vycm9yPSBJTyBlcnJvciBvbiB3cml0aW5nCi1UZXh0QXV0b01lcmdlLmNvbmZsaWN0PSBDb25mbGljdDogY2Fubm90IGF1dG8gbWVyZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL1RleHRTdHJlYW1NZXJnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL21lcmdlL1RleHRTdHJlYW1NZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjNTA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9tZXJnZS9UZXh0U3RyZWFtTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLlJhbmdlRGlmZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuUmFuZ2VEaWZmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIEEgc2ltcGxlIG1lcmdlciBmb3Igc3RyZWFtcyBjb250YWluaW5nIHRleHQgbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0U3RyZWFtTWVyZ2VyIGltcGxlbWVudHMgSVN0cmVhbU1lcmdlciB7Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuSUF1dG9NZXJnZXIjYXV0b21lcmdlKGphdmEuaW8uT3V0cHV0U3RyZWFtLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUVuY29kZWRTdG9yYWdlLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUVuY29kZWRTdG9yYWdlLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUVuY29kZWRTdG9yYWdlLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAgICovCi0gICAgcHVibGljIElTdGF0dXMgbWVyZ2UoT3V0cHV0U3RyZWFtIG91dHB1dCwgU3RyaW5nIG91dHB1dEVuY29kaW5nLAotCQkJSW5wdXRTdHJlYW0gYW5jZXN0b3IsIFN0cmluZyBhbmNlc3RvckVuY29kaW5nLAotCQkJSW5wdXRTdHJlYW0gdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0RW5jb2RpbmcsCi0JCQlJbnB1dFN0cmVhbSBvdGhlciwgU3RyaW5nIG90aGVyRW5jb2RpbmcsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgCi0gICAgICAgIExpbmVDb21wYXJhdG9yIGEsIHQsIG87Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGE9IG5ldyBMaW5lQ29tcGFyYXRvcihhbmNlc3RvciwgYW5jZXN0b3JFbmNvZGluZyk7Ci0gICAgICAgICAgICB0PSBuZXcgTGluZUNvbXBhcmF0b3IodGFyZ2V0LCB0YXJnZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICBvPSBuZXcgTGluZUNvbXBhcmF0b3Iob3RoZXIsIG90aGVyRW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvbXBhcmVVSS5QTFVHSU5fSUQsIDEsIE1lcmdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0QXV0b01lcmdlLmlucHV0RW5jb2RpbmdFcnJvciIpLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYXIgbGluZVNlcGFyYXRvcj0gJ1xuJzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmFuZ2VEaWZmZXJlbmNlW10gZGlmZnMgPSBSYW5nZURpZmZlcmVuY2VyLmZpbmRSYW5nZXMobW9uaXRvciwgYSwgdCwgbyk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlmZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSYW5nZURpZmZlcmVuY2UgcmQgPSBkaWZmc1tpXTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJkLmtpbmQoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgUmFuZ2VEaWZmZXJlbmNlLkFOQ0VTVE9SOgkvLyBwc2V1ZG8gY29uZmxpY3QKLSAgICAgICAgICAgICAgICBjYXNlIFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRToKLSAgICAgICAgICAgICAgICBjYXNlIFJhbmdlRGlmZmVyZW5jZS5SSUdIVDoKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHJkLnJpZ2h0U3RhcnQoKTsgaiA8IHJkLnJpZ2h0RW5kKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHM9IG8uZ2V0TGluZShqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShzLmdldEJ5dGVzKG91dHB1dEVuY29kaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUobGluZVNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFJhbmdlRGlmZmVyZW5jZS5MRUZUOgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcmQubGVmdFN0YXJ0KCk7IGogPCByZC5sZWZ0RW5kKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHM9IHQuZ2V0TGluZShqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShzLmdldEJ5dGVzKG91dHB1dEVuY29kaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUobGluZVNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29tcGFyZVVJLlBMVUdJTl9JRCwgQ09ORkxJQ1QsIE1lcmdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJUZXh0QXV0b01lcmdlLmNvbmZsaWN0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29tcGFyZVVJLlBMVUdJTl9JRCwgMSwgTWVyZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlRleHRBdXRvTWVyZ2Uub3V0cHV0RW5jb2RpbmdFcnJvciIpLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb21wYXJlVUkuUExVR0lOX0lELCAxLCBNZXJnZU1lc3NhZ2VzLmdldFN0cmluZygiVGV4dEF1dG9NZXJnZS5vdXRwdXRJT0Vycm9yIiksIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9BdHRpYy9MaW5lUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9BdHRpYy9MaW5lUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjI1ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvQXR0aWMvTGluZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnBhdGNoOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgTGluZVJlYWRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhhdmVDaGFyPSBmYWxzZTsKLQlwcml2YXRlIGludCBmTGFzdENoYXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZTYXdFT0Y9IGZhbHNlOwotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZlJlYWRlcjsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZVNpbmdsZUNSPSBmYWxzZTsKLQkKLQkKLQkvKiBwYWNrYWdlICovIExpbmVSZWFkZXIoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7Ci0JCWZSZWFkZXI9IHJlYWRlcjsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWFkZXIpOwotCX0KLQotCXZvaWQgaWdub3JlU2luZ2xlQ1IoKSB7Ci0JCWZJZ25vcmVTaW5nbGVDUj0gdHJ1ZTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBsaW5lIG9mIHRleHQuIEEgbGluZSBpcyBjb25zaWRlcmVkIHRvIGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9uZQotICAgICAqIG9mIGEgbGluZSBmZWVkICgnXG4nKSwgYSBjYXJyaWFnZSByZXR1cm4gKCdccicpLCBvciBhIGNhcnJpYWdlIHJldHVybgotICAgICAqIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IGEgbGluZWZlZWQuCi0gICAgICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgbGluZSBpbmNsdWRpbmcKLSAgICAgKgl0aGUgbGluZS10ZXJtaW5hdGlvbiBjaGFyYWN0ZXJzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZW5kIG9mIHRoZQotICAgICAqCXN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0JLyogcGFja2FnZSAqLyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgc2I9IG51bGw7Ci0JCQkJCi0JCXdoaWxlICghZlNhd0VPRikgewotCQkJaW50IGM9IHJlYWRDaGFyKCk7Ci0JCQlpZiAoYyA9PSAtMSkgewotCQkJCWZTYXdFT0Y9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc2IgPT0gbnVsbCkKLQkJCQlzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKChjaGFyKWMpOwotCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQlicmVhazsKLQkJCWlmIChjID09ICdccicpIHsKLQkJCQljPSByZWFkQ2hhcigpOwotCQkJCWlmIChjID09IC0xKSB7Ci0JCQkJCWZTYXdFT0Y9IHRydWU7Ci0JCQkJCWJyZWFrOwkvLyBFT0YKLQkJCQl9Ci0JCQkJaWYgKGMgIT0gJ1xuJykgewotCQkJCQlpZiAoZklnbm9yZVNpbmdsZUNSKSB7Ci0JCQkJCQlzYi5hcHBlbmQoKGNoYXIpYyk7CQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZkhhdmVDaGFyPSB0cnVlOwotCQkJCQlmTGFzdENoYXI9IGM7Ci0JCQkJfSBlbHNlCi0JCQkJCXNiLmFwcGVuZCgoY2hhciljKTsJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChzYiAhPSBudWxsKQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiBwYWNrYWdlICovIHZvaWQgY2xvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCX0KLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBMaXN0IHJlYWRMaW5lcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJd2hpbGUgKChsaW5lPSByZWFkTGluZSgpKSAhPSBudWxsKQotCQkJCWxpbmVzLmFkZChsaW5lKTsKLQkJCXJldHVybiBsaW5lczsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vIE5lZWRXb3JrCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZXJyb3Igd2hpbGUgcmVhZGluZyBmaWxlOiAiICsgZmlsZU5hbWUgKyAiKCIgKyBleCArICIpIik7Ci0JCX0gZmluYWxseSB7Ci0JCQljbG9zZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgd2l0aG91dAotCSAqIGNvdW50aW5nIGEgdHJhaWxpbmcgbGluZSBzZXBhcmF0b3IuCi0JICovCi0JLyogcGFja2FnZSAqLyBpbnQgbGluZUNvbnRlbnRMZW5ndGgoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgbGVuZ3RoPSBsaW5lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpPSBsZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWNoYXIgYz0gbGluZS5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSdcbicgfHwgYyA9PSAnXHInKQotCQkJCWxlbmd0aC0tOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCQotCS8vLS0tLSBwcml2YXRlCi0JCi0JcHJpdmF0ZSBpbnQgcmVhZENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkhhdmVDaGFyKSB7Ci0JCQlmSGF2ZUNoYXI9IGZhbHNlOwotCQkJcmV0dXJuIGZMYXN0Q2hhcjsKLQkJfQotCQlyZXR1cm4gZlJlYWRlci5yZWFkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvQ29tcGFyZVdpdGhQYXRjaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvQ29tcGFyZVdpdGhQYXRjaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ2NWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0NvbXBhcmVXaXRoUGF0Y2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGFyZVdpdGhQYXRjaEFjdGlvbiBleHRlbmRzIEJhc2VDb21wYXJlQWN0aW9uIHsKLQotCXN0YXRpYyBjbGFzcyBQYXRjaFdpemFyZERpYWxvZyBleHRlbmRzIFdpemFyZERpYWxvZyB7Ci0JCi0JCVBhdGNoV2l6YXJkRGlhbG9nKFNoZWxsIHBhcmVudCwgSVdpemFyZCB3aXphcmQpIHsKLQkJCXN1cGVyKHBhcmVudCwgd2l6YXJkKTsKLQkJCQotCQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJCXNldE1pbmltdW1QYWdlU2l6ZSg3MDAsIDUwMCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKHNlbGVjdGlvbikubGVuZ3RoID09IDE7Ci0JfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkJhc2VDb21wYXJlQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBhdGNoV2l6YXJkIHdpemFyZD0gbmV3IFBhdGNoV2l6YXJkKHNlbGVjdGlvbik7Ci0JCQotCQlpZiAoYXJlQWxsRWRpdG9yc1NhdmVkKCkpIHsKLQkJCVBhdGNoV2l6YXJkRGlhbG9nIGRpYWxvZz0gbmV3IFBhdGNoV2l6YXJkRGlhbG9nKENvbXBhcmVVSVBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhcmVBbGxFZGl0b3JzU2F2ZWQoKXsKLQkJaWYgKENvbXBhcmVVSVBsdWdpbi5nZXREaXJ0eUVkaXRvcnMoKS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoISBzYXZlQWxsRGlydHlFZGl0b3JzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNoZWxsIHNoZWxsPSBDb21wYXJlVUlQbHVnaW4uZ2V0U2hlbGwoKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgaXNuJ3QgY2FuY2VsYWJsZS4KLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb249IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJYm9vbGVhbiBhdXRvQnVpbGQ9IGRlc2NyaXB0aW9uLmlzQXV0b0J1aWxkaW5nKCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoZmFsc2UpOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkucnVuKGZhbHNlLCBmYWxzZSwgY3JlYXRlUnVubmFibGUoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotCQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCBzaGVsbCwgUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoQWN0aW9uLkV4Y2VwdGlvblRpdGxlIiksIFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeGNlcHRpb24iKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCBzaGVsbCwgUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoQWN0aW9uLkV4Y2VwdGlvblRpdGxlIiksIFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeGNlcHRpb24iKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBmYWxzZTsJCQkKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIENhbid0IGhhcHBlbi4gT3BlcmF0aW9uIGlzbid0IGNhbmNlbGFibGUuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBjcmVhdGVSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkJCUlFZGl0b3JQYXJ0W10gZWRpdG9yc1RvU2F2ZT0gQ29tcGFyZVVJUGx1Z2luLmdldERpcnR5RWRpdG9ycygpOwotCQkJCXBtLmJlZ2luVGFzayhQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hBY3Rpb24uU2F2aW5nRGlydHlFZGl0b3JzVGFzayIpLCBlZGl0b3JzVG9TYXZlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgZWRpdG9yc1RvU2F2ZS5sZW5ndGg7IGkrKykgewotCQkJCQllZGl0b3JzVG9TYXZlW2ldLmRvU2F2ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxKSk7Ci0JCQkJCXBtLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJcG0uZG9uZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYXZlQWxsRGlydHlFZGl0b3JzKCkgewotCQlpZiAoQ29tcGFyZVByZWZlcmVuY2VQYWdlLmdldFNhdmVBbGxFZGl0b3JzKCkpIC8vbXVzdCBzYXZlIGV2ZXJ5dGhpbmcKLQkJCXJldHVybiB0cnVlOwotCQlMaXN0RGlhbG9nIGRpYWxvZz0gbmV3IExpc3REaWFsb2coQ29tcGFyZVVJUGx1Z2luLmdldFNoZWxsKCkpIHsKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCUNvbXBvc2l0ZSByZXN1bHQ9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQlmaW5hbCBCdXR0b24gY2hlY2s9IG5ldyBCdXR0b24ocmVzdWx0LCBTV1QuQ0hFQ0spOwotCQkJCWNoZWNrLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoQWN0aW9uLkFsd2F5c1NhdmVRdWVzdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoZWNrLnNldFNlbGVjdGlvbihDb21wYXJlUHJlZmVyZW5jZVBhZ2UuZ2V0U2F2ZUFsbEVkaXRvcnMoKSk7Ci0JCQkJY2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zZXRTYXZlQWxsRWRpdG9ycyhjaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJCWFwcGx5RGlhbG9nRm9udChyZXN1bHQpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRUaXRsZShQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hBY3Rpb24uU2F2ZUFsbFF1ZXN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRBZGRDYW5jZWxCdXR0b24odHJ1ZSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRjaEFjdGlvbi5TYXZlQWxsRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJZGlhbG9nLnNldElucHV0KEFycmF5cy5hc0xpc3QoQ29tcGFyZVVJUGx1Z2luLmdldERpcnR5RWRpdG9ycygpKSk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSzsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9EaWZmLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9EaWZmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzAzZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvRGlmZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnBhdGNoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyOwotCi0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgRGlmZiB7Ci0JCQotCUlQYXRoIGZPbGRQYXRoLCBmTmV3UGF0aDsKLQlsb25nIGZPbGREYXRlLCBmTmV3RGF0ZTsJLy8gaWYgMDogbm8gZmlsZQotCUxpc3QgZkh1bmtzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JYm9vbGVhbiBmTWF0Y2hlcz0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0VuYWJsZWQyPSB0cnVlOwotCVN0cmluZyBmUmVqZWN0ZWQ7Ci0KLQkKLSAJLyogcGFja2FnZSAqLyBEaWZmKElQYXRoIG9sZFBhdGgsIGxvbmcgb2xkRGF0ZSwgSVBhdGggbmV3UGF0aCwgbG9uZyBuZXdEYXRlKSB7Ci0JCWZPbGRQYXRoPSBvbGRQYXRoOwotCQlmT2xkRGF0ZT0gb2xkUGF0aCA9PSBudWxsID8gMCA6IG9sZERhdGU7Ci0JCWZOZXdQYXRoPSBuZXdQYXRoOwotCQlmTmV3RGF0ZT0gbmV3UGF0aCA9PSBudWxsID8gMCA6IG5ld0RhdGU7CQotCX0KLQkKLQlib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZJc0VuYWJsZWQyOwotCX0KLQkKLQl2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBiKSB7Ci0JCWZJc0VuYWJsZWQyPSBiOwotCX0KLQkKLQl2b2lkIHJldmVyc2UoKSB7Ci0JCUlQYXRoIHRwPSBmT2xkUGF0aDsKLQkJZk9sZFBhdGg9IGZOZXdQYXRoOwotCQlmTmV3UGF0aD0gdHA7Ci0JCQotCQlsb25nIHQ9IGZPbGREYXRlOwotCQlmT2xkRGF0ZT0gZk5ld0RhdGU7Ci0JCWZOZXdEYXRlPSB0OwotCQkKLQkJSXRlcmF0b3IgaXRlcj0gZkh1bmtzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSHVuayBodW5rPSAoSHVuaykgaXRlci5uZXh0KCk7Ci0JCQlodW5rLnJldmVyc2UoKTsKLQkJfQotCX0KLQkKLQlIdW5rW10gZ2V0SHVua3MoKSB7Ci0JCXJldHVybiAoSHVua1tdKSBmSHVua3MudG9BcnJheShuZXcgSHVua1tmSHVua3Muc2l6ZSgpXSk7Ci0JfQotCi0JSVBhdGggZ2V0UGF0aCgpIHsKLQkJaWYgKGZPbGRQYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gZk9sZFBhdGg7Ci0JCXJldHVybiBmTmV3UGF0aDsKLQl9Ci0JCi0Jdm9pZCBmaW5pc2goKSB7Ci0JCWlmIChmSHVua3Muc2l6ZSgpID09IDEpIHsKLQkJCUh1bmsgaD0gKEh1bmspIGZIdW5rcy5nZXQoMCk7Ci0JCQlpZiAoaC5mTmV3TGVuZ3RoID09IDApIHsKLQkJCQlmTmV3RGF0ZT0gMDsKLQkJCQlmTmV3UGF0aD0gZk9sZFBhdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogcGFja2FnZSAqLyB2b2lkIGFkZChIdW5rIGh1bmspIHsKLQkJZkh1bmtzLmFkZChodW5rKTsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBpbnQgZ2V0VHlwZSgpIHsKLQkJaWYgKGZPbGREYXRlID09IDApCi0JCQlyZXR1cm4gRGlmZmVyZW5jZXIuQURESVRJT047Ci0JCWlmIChmTmV3RGF0ZSA9PSAwKQotCQkJcmV0dXJuIERpZmZlcmVuY2VyLkRFTEVUSU9OOwotCQlyZXR1cm4gRGlmZmVyZW5jZXIuQ0hBTkdFOwotCX0KLQkKLQkvKiBwYWNrYWdlICovIFN0cmluZyBnZXREZXNjcmlwdGlvbihpbnQgc3RyaXApIHsKLQkJSVBhdGggcGF0aD0gZk9sZFBhdGg7Ci0JCWlmIChmT2xkRGF0ZSA9PSAwKQotCQkJcGF0aD0gZk5ld1BhdGg7Ci0JCWlmIChzdHJpcCA+IDAgJiYgc3RyaXAgPCBwYXRoLnNlZ21lbnRDb3VudCgpKQotCQkJcGF0aD0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHN0cmlwKTsKLQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSHVuay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSHVuay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQ1ODRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0h1bmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgSHVuayBkZXNjcmliZXMgYSByYW5nZSBvZiBjaGFuZ2VkIGxpbmVzIGFuZCBzb21lIGNvbnRleHQgbGluZXMuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSHVuayB7Ci0JCi0JRGlmZiBmUGFyZW50OwotCWludCBmT2xkU3RhcnQsIGZPbGRMZW5ndGg7Ci0JaW50IGZOZXdTdGFydCwgZk5ld0xlbmd0aDsKLQlTdHJpbmdbXSBmTGluZXM7Ci0JYm9vbGVhbiBmTWF0Y2hlcz0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0VuYWJsZWQ9IHRydWU7Ci0JCi0JCi0JLyogcGFja2FnZSAqLyBIdW5rKERpZmYgcGFyZW50LCBpbnRbXSBvbGRSYW5nZSwgaW50W10gbmV3UmFuZ2UsIExpc3QgbGluZXMpIHsKLQkJCi0JCWZQYXJlbnQ9IHBhcmVudDsKLQkJaWYgKGZQYXJlbnQgIT0gbnVsbCkKLQkJCWZQYXJlbnQuYWRkKHRoaXMpOwotCQkKLQkJaWYgKG9sZFJhbmdlWzBdID4gMCkKLQkJCWZPbGRTdGFydD0gb2xkUmFuZ2VbMF0tMTsJLy8gbGluZSBudW1iZXIgc3RhcnQgYXQgMCEKLQkJZWxzZQotCQkJZk9sZFN0YXJ0PSAwOwotCQlmT2xkTGVuZ3RoPSBvbGRSYW5nZVsxXTsKLQkJaWYgKG5ld1JhbmdlWzBdID4gMCkKLQkJCWZOZXdTdGFydD0gbmV3UmFuZ2VbMF0tMTsJLy8gbGluZSBudW1iZXIgc3RhcnQgYXQgMCEKLQkJZWxzZQotCQkJZk5ld1N0YXJ0PSAwOwotCQlmTmV3TGVuZ3RoPSBuZXdSYW5nZVsxXTsKLQkJCi0JCWZMaW5lcz0gKFN0cmluZ1tdKSBsaW5lcy50b0FycmF5KG5ldyBTdHJpbmdbbGluZXMuc2l6ZSgpXSk7Ci0JfQotCQkKLQlib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZJc0VuYWJsZWQ7Ci0JfQotCQotCXZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotCQlmSXNFbmFibGVkPSBlbmFibGU7Ci0JfQotCQotCXZvaWQgcmV2ZXJzZSgpIHsKLQkJaW50IHQ9IGZPbGRTdGFydDsKLQkJZk9sZFN0YXJ0PSBmTmV3U3RhcnQ7Ci0JCWZOZXdTdGFydD0gdDsKLQkJCi0JCXQ9IGZPbGRMZW5ndGg7Ci0JCWZPbGRMZW5ndGg9IGZOZXdMZW5ndGg7Ci0JCWZOZXdMZW5ndGg9IHQ7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgZkxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbGluZT0gZkxpbmVzW2ldOwotCQkJY2hhciBjPSBsaW5lLmNoYXJBdCgwKTsKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnKyc6Ci0JCQkJZkxpbmVzW2ldPSAnLScgKyBsaW5lLnN1YnN0cmluZygxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJy0nOgotCQkJCWZMaW5lc1tpXT0gJysnICsgbGluZS5zdWJzdHJpbmcoMSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGh1bmsuCi0JICogRWFjaCBsaW5lIHN0YXJ0cyB3aXRoIGEgY29udHJvbCBjaGFyYWN0ZXIuIFRoZWlyIG1lYW5pbmcgaXMgYXMgZm9sbG93czoKLQkgKiA8dWw+Ci0JICogPGxpPgotCSAqICcrJzogYWRkIHRoZSBsaW5lCi0JICogPGxpPgotCSAqICctJzogZGVsZXRlIHRoZSBsaW5lCi0JICogPGxpPgotCSAqICcgJzogbm8gY2hhbmdlLCBjb250ZXh0IGxpbmUKLQkgKiA8L3VsPgotCSAqLwotCVN0cmluZyBnZXRDb250ZW50KCkgewotCQlTdHJpbmdCdWZmZXIgc2I9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMaW5lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxpbmU9IGZMaW5lc1tpXTsKLQkJCXNiLmFwcGVuZChsaW5lLnN1YnN0cmluZygwLCBQYXRjaGVyLmxlbmd0aChsaW5lKSkpOwotCQkJc2IuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGl2ZSBTdHJpbmcgZm9yIHRoaXMgaHVuay4KLQkgKiBJdCBpcyBpbiB0aGUgZm9ybSBvbGRfc3RhcnQsb2xkX2xlbmd0aCAtPiBuZXdfc3RhcnQsbmV3X2xlbmd0aC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmT2xkU3RhcnQpKTsKLQkJc2IuYXBwZW5kKCcsJyk7Ci0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZPbGRMZW5ndGgpKTsKLQkJc2IuYXBwZW5kKCIgLT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZk5ld1N0YXJ0KSk7Ci0JCXNiLmFwcGVuZCgnLCcpOwotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmTmV3TGVuZ3RoKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlTdHJpbmcgZ2V0UmVqZWN0ZWREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nQnVmZmVyIHNiPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiQEAgLSIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZPbGRTdGFydCkpOwotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZk9sZExlbmd0aCkpOwotCQlzYi5hcHBlbmQoIiArIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZk5ld1N0YXJ0KSk7Ci0JCXNiLmFwcGVuZCgnLCcpOwotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmTmV3TGVuZ3RoKSk7Ci0JCXNiLmFwcGVuZCgiIEBAIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSW5wdXRQYXRjaFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0lucHV0UGF0Y2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWYzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvSW5wdXRQYXRjaFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuSUNvbXBhcmVDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLQotLyogcGFja2FnZSAqLyBjbGFzcyBJbnB1dFBhdGNoUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLy8gY29uc3RhbnRzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEg9IDI1MDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT01CT19ISVNUT1JZX0xFTkdUSD0gNTsKLQkKLQkvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfTkFNRT0gIlBhdGNoV2l6YXJkUGFnZTEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX1BBVENIX0ZJTEVTX0lEPSBQQUdFX05BTUUgKyAiLlBBVENIX0ZJTEVTIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9VU0VfQ0xJUEJPQVJEX0lEPSBQQUdFX05BTUUgKyAiLlVTRV9DTElQQk9BUkQiOwkvLyROT04tTkxTLTEkCi0JCi0Jc3RhdGljIGZpbmFsIGNoYXIgU0VQQVJBVE9SID0gU3lzdGVtLmdldFByb3BlcnR5ICgiZmlsZS5zZXBhcmF0b3IiKS5jaGFyQXQgKDApOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZTaG93RXJyb3I9IGZhbHNlOwotCQotCS8vIFNXVCB3aWRnZXRzCi0JcHJpdmF0ZSBCdXR0b24gZlVzZUNsaXBib2FyZEJ1dHRvbjsKLQlwcml2YXRlIENvbWJvIGZQYXRjaEZpbGVOYW1lRmllbGQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlBhdGNoRmlsZUJyb3dzZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmVXNlUGF0Y2hGaWxlQnV0dG9uOwotCXByaXZhdGUgR3JvdXAgZlBhdGNoRmlsZUdyb3VwOwotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIGZQYXRjaFRhcmdldHM7Ci0JcHJpdmF0ZSBQYXRjaFdpemFyZCBmUGF0Y2hXaXphcmQ7Ci0KLQotCUlucHV0UGF0Y2hQYWdlKFBhdGNoV2l6YXJkIHB3KSB7Ci0JCXN1cGVyKCJJbnB1dFBhdGNoUGFnZSIsIFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS50aXRsZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZQYXRjaFdpemFyZD0gcHc7Ci0JCXNldE1lc3NhZ2UoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLm1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoKLQkgKiBHZXQgYSBwYXRoIGZyb20gdGhlIHN1cHBsaWVkIHRleHQgd2lkZ2V0LgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldFBhdGhGcm9tVGV4dChUZXh0IHRleHRGaWVsZCkgewotCQlyZXR1cm4gKG5ldyBQYXRoKHRleHRGaWVsZC5nZXRUZXh0KCkpKS5tYWtlQWJzb2x1dGUoKTsKLQl9Ci0KLQkvKiBwYWNrYWdlICovIFN0cmluZyBnZXRQYXRjaE5hbWUoKSB7Ci0JCWlmIChnZXRVc2VDbGlwYm9hcmQoKSkKLQkJCXJldHVybiBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuQ2xpcGJvYXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdldFBhdGNoRmlsZVBhdGgoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0JCUxhYmVsIGw9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsJCi0JCWwuc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuU2VsZWN0SW5wdXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVpbGRJbnB1dEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CS8vIGEgc3BhY2VyCQkKLQkJCi0JCWJ1aWxkUGF0Y2hGaWxlR3JvdXAoY29tcG9zaXRlKTsJCQotCQkJCi0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQotCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBJQ29tcGFyZUNvbnRleHRJZHMuUEFUQ0hfSU5QVVRfV0laQVJEX1BBR0UpOwotCX0KLQkKLQkvKiAobm9uLUphdmFEb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIElXaXphcmRQYWdlLgotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJCQotCQlQYXRjaGVyIHBhdGNoZXI9ICgoUGF0Y2hXaXphcmQpIGdldFdpemFyZCgpKS5nZXRQYXRjaGVyKCk7Ci0JCQotCQlTdHJpbmcgc291cmNlOwotCQkvLyBDcmVhdGUgYSByZWFkZXIgZm9yIHRoZSBpbnB1dAotCQlSZWFkZXIgcmVhZGVyPSBudWxsOwotCQlpZiAoZ2V0VXNlQ2xpcGJvYXJkKCkpIHsKLQkJCUNvbnRyb2wgYz0gZ2V0Q29udHJvbCgpOwotCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCUNsaXBib2FyZCBjbGlwYm9hcmQ9IG5ldyBDbGlwYm9hcmQoYy5nZXREaXNwbGF5KCkpOwotCQkJCU9iamVjdCBvPSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJCXJlYWRlcj0gbmV3IFN0cmluZ1JlYWRlcigoU3RyaW5nKW8pOwotCQkJfQotCQkJc291cmNlPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuQ2xpcGJvYXJkLnRpdGxlIik7CS8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBwYXRjaEZpbGVQYXRoPSBnZXRQYXRjaEZpbGVQYXRoKCk7Ci0JCQlpZiAocGF0Y2hGaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZGVyPSBuZXcgRmlsZVJlYWRlcihwYXRjaEZpbGVQYXRoKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobnVsbCwKLQkJCQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5QYXRjaEVycm9yRGlhbG9nLnRpdGxlIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5QYXRjaEZpbGVOb3RGb3VuZC5tZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJc291cmNlPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuUGF0Y2hGaWxlLnRpdGxlIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gcGFyc2UgdGhlIGlucHV0Ci0JCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwYXRjaGVyLnBhcnNlKG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobnVsbCwKLQkJCQkJUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlBhdGNoRXJyb3JEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlBhcnNlRXJyb3IubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCQkKLQkJRGlmZltdIGRpZmZzPSBwYXRjaGVyLmdldERpZmZzKCk7Ci0JCWlmIChkaWZmcyA9PSBudWxsIHx8IGRpZmZzLmxlbmd0aCA9PSAwKSB7Ci0JCQlTdHJpbmcgZm9ybWF0PSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuTm9EaWZmc0ZvdW5kLmZvcm1hdCIpOwkvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbWVzc2FnZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgU3RyaW5nW10geyBzb3VyY2UgfSk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihudWxsLAotCQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5QYXRjaEVycm9yRGlhbG9nLnRpdGxlIiksIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQkKLQkJLy8gaWYgc2VsZWN0ZWQgdGFyZ2V0IGlzIGZpbGUgZW5zdXJlIHRoYXQgcGF0Y2ggZmlsZQotCQkvLyBjb250YWlucyBvbmx5IGEgcGF0Y2ggZm9yIGEgc2luZ2xlIGZpbGUKLQkJSVJlc291cmNlIHRhcmdldD0gZlBhdGNoV2l6YXJkLmdldFRhcmdldCgpOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUgJiYgZGlmZnMubGVuZ3RoID4gMSkgewotCQkJU3RyaW5nIGZvcm1hdD0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlNpbmdsZUZpbGVFcnJvci5mb3JtYXQiKTsJLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1lc3NhZ2U9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgc291cmNlIH0pOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obnVsbCwKLQkJCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuUGF0Y2hFcnJvckRpYWxvZy50aXRsZSIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJCi0JCS8vIGd1ZXNzIHByZWZpeCBjb3VudAotCQlpbnQgZ3Vlc3M9IDA7IC8vIGd1ZXNzUHJlZml4KGRpZmZzKTsKLQkJcGF0Y2hlci5zZXRTdHJpcFByZWZpeFNlZ21lbnRzKGd1ZXNzKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQl9Ci0JCQkKLQkvKiAobm9uLUphdmFEb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIElXaXphcmRQYWdlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQkvLyB3ZSBjYW4ndCBjYWxsIGdldE5leHRQYWdlIHRvIGRldGVybWluZSBpZiBmbGlwcGluZyBpcyBhbGxvd2VkIHNpbmNlIGNvbXB1dGluZwotCQkvLyB0aGUgbmV4dCBwYWdlIGlzIHF1aXRlIGV4cGVuc2l2ZS4gU28gd2Ugc2F5IHllcyBpZiB0aGUgcGFnZSBpcyBjb21wbGV0ZS4KLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRFbmFibGVQYXRjaEZpbGUoYm9vbGVhbiBlbmFibGUpIHsKLQkJZlBhdGNoRmlsZU5hbWVGaWVsZC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZQYXRjaEZpbGVCcm93c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qCi0JICoJQ3JlYXRlIHRoZSBncm91cCBmb3Igc2VsZWN0aW5nIHRoZSBwYXRjaCBmaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGF0Y2hGaWxlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJZlBhdGNoRmlsZUdyb3VwPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZQYXRjaEZpbGVHcm91cC5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5TZWxlY3RQYXRjaC50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDM7Ci0JCWZQYXRjaEZpbGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZlBhdGNoRmlsZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gMXN0IHJvdwotCQlmVXNlUGF0Y2hGaWxlQnV0dG9uPSBuZXcgQnV0dG9uKGZQYXRjaEZpbGVHcm91cCwgU1dULlJBRElPKTsKLQkJZlVzZVBhdGNoRmlsZUJ1dHRvbi5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnB1dFBhdGNoUGFnZS5GaWxlQnV0dG9uLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZQYXRjaEZpbGVOYW1lRmllbGQ9IG5ldyBDb21ibyhmUGF0Y2hGaWxlR3JvdXAsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCS8vZ2QuaG9yaXpvbnRhbEluZGVudD0gODsKLQkJZ2Qud2lkdGhIaW50PSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJZlBhdGNoRmlsZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWZQYXRjaEZpbGVCcm93c2VCdXR0b249IG5ldyBCdXR0b24oZlBhdGNoRmlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWZQYXRjaEZpbGVCcm93c2VCdXR0b24uc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuQ2hvb3NlRmlsZUJ1dHRvbi50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWZQYXRjaEZpbGVCcm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQotCQkvLyAybmQgcm93Ci0JCWZVc2VDbGlwYm9hcmRCdXR0b249IG5ldyBCdXR0b24oZlBhdGNoRmlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlmVXNlQ2xpcGJvYXJkQnV0dG9uLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlVzZUNsaXBib2FyZEJ1dHRvbi50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC5ob3Jpem9udGFsU3Bhbj0gMjsKLQkJZlVzZUNsaXBib2FyZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCi0JCS8vIEFkZCBsaXN0ZW5lcnMKLQkJZlVzZVBhdGNoRmlsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZlNob3dFcnJvcj0gdHJ1ZTsKLQkJCQkJc2V0RW5hYmxlUGF0Y2hGaWxlKCFnZXRVc2VDbGlwYm9hcmQoKSk7Ci0JCQkJCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmUGF0Y2hGaWxlTmFtZUZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZXRTb3VyY2VOYW1lKGZQYXRjaEZpbGVOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZQYXRjaEZpbGVOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIoCi0JCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWZTaG93RXJyb3I9IHRydWU7Ci0JCQkJCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmUGF0Y2hGaWxlQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQloYW5kbGVQYXRjaEZpbGVCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQkJCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJLy9mUGF0Y2hGaWxlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5wdXRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlQYXRjaFdpemFyZCBwdz0gKFBhdGNoV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJSVJlc291cmNlIHRhcmdldD0gcHcuZ2V0VGFyZ2V0KCk7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSB0YXJnZXQuZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3Q9IHdvcmtzcGFjZS5nZXRSb290KCk7Ci0JCQotCQlUcmVlIHRyZWU9IG5ldyBUcmVlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludD0gMjAwOwotCQl0cmVlLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJZlBhdGNoVGFyZ2V0cz0gbmV3IENoZWNrYm94VHJlZVZpZXdlcih0cmVlKTsKLQkJZlBhdGNoVGFyZ2V0cy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotCQlmUGF0Y2hUYXJnZXRzLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCQlmUGF0Y2hUYXJnZXRzLnNldFNvcnRlcihuZXcgV29ya2JlbmNoVmlld2VyU29ydGVyKCkpOwotCQlmUGF0Y2hUYXJnZXRzLnNldElucHV0KHJvb3QpOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCWZQYXRjaFRhcmdldHMuZXhwYW5kVG9MZXZlbCh0YXJnZXQsIDApOwotCQkJZlBhdGNoVGFyZ2V0cy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGFyZ2V0KSk7Ci0JCX0KLQkJCi0JCS8vIHJlZ2lzdGVyIGxpc3RlbmVycwotCQlmUGF0Y2hUYXJnZXRzLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWZQYXRjaFdpemFyZC5zZXRUYXJnZXRzKFV0aWxpdGllcy5nZXRSZXNvdXJjZXMoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQkJdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhpcyBwYWdlJ3MgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCkgewotCQkKLQkJU3RyaW5nIGVycm9yPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBmUGF0Y2hUYXJnZXRzLmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGFueVNlbGVjdGVkPSBzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJaWYgKCFhbnlTZWxlY3RlZCkKLQkJCWVycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuTm90aGluZ1NlbGVjdGVkLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWJvb2xlYW4gZ290UGF0Y2g9IGZhbHNlOwotCQlpZiAoZ2V0VXNlQ2xpcGJvYXJkKCkpIHsKLQkJCUNvbnRyb2wgYz0gZ2V0Q29udHJvbCgpOwotCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCUNsaXBib2FyZCBjbGlwYm9hcmQ9IG5ldyBDbGlwYm9hcmQoYy5nZXREaXNwbGF5KCkpOwotCQkJCU9iamVjdCBvPSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHM9ICgoU3RyaW5nKSBvKS50cmltKCk7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID4gMCkKLQkJCQkJCWdvdFBhdGNoPSB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLkNsaXBib2FyZElzRW1wdHkubWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlCi0JCQkJCWVycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuTm9UZXh0SW5DbGlwYm9hcmQubWVzc2FnZSIpOwkJCQkJIC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZQotCQkJCWVycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuQ291bGROb3RSZWFkQ2xpcGJvYXJkLm1lc3NhZ2UiKTsJCQkJCSAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgcGF0aD0gZlBhdGNoRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJRmlsZSBmaWxlPSBuZXcgRmlsZShwYXRoKTsKLQkJCQlnb3RQYXRjaD0gZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpICYmIGZpbGUubGVuZ3RoKCkgPiAwOwotCQkJCWlmICghZ290UGF0Y2gpCi0JCQkJCWVycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiSW5wdXRQYXRjaFBhZ2UuQ2Fubm90TG9jYXRlUGF0Y2gubWVzc2FnZSIpICsgcGF0aDsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLk5vRmlsZU5hbWUubWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXNldFBhZ2VDb21wbGV0ZShhbnlTZWxlY3RlZCAmJiBnb3RQYXRjaCk7Ci0JCWlmIChmU2hvd0Vycm9yKQotCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGF0Y2hGaWxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRmlsZURpYWxvZyBkaWFsb2c9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJZGlhbG9nLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIklucHV0UGF0Y2hQYWdlLlNlbGVjdFBhdGNoRmlsZURpYWxvZy50aXRsZSIpKTsJCSAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwYXRjaEZpbGVQYXRoPSBnZXRQYXRjaEZpbGVQYXRoKCk7Ci0JCWlmIChwYXRjaEZpbGVQYXRoICE9IG51bGwpIHsKLQkJCWludCBsYXN0U2VnbWVudD0gcGF0Y2hGaWxlUGF0aC5sYXN0SW5kZXhPZihTRVBBUkFUT1IpOwotCQkJaWYgKGxhc3RTZWdtZW50ID4gMCkgewotCQkJCXBhdGNoRmlsZVBhdGg9IHBhdGNoRmlsZVBhdGguc3Vic3RyaW5nKDAsIGxhc3RTZWdtZW50KTsKLQkJCX0KLQkJfQotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwYXRjaEZpbGVQYXRoKTsKLQkJU3RyaW5nIHJlcz0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcGF0Y2hGaWxlUGF0aD0gZGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZpbHRlclBhdGg9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQlJUGF0aCBwYXRoPSBmaWx0ZXJQYXRoLmFwcGVuZChwYXRjaEZpbGVQYXRoKS5tYWtlQWJzb2x1dGUoKTsJCi0JCXBhdGNoRmlsZVBhdGg9IHBhdGgudG9PU1N0cmluZygpOwotCQkvL2ZEaWFsb2dTZXR0aW5ncy5wdXQoSVVJQ29uc3RhbnRzLkRJQUxPR1NUT1JFX0xBU1RFWFRKQVIsIGZpbHRlclBhdGgudG9PU1N0cmluZygpKTsKLQkJCi0JCWZQYXRjaEZpbGVOYW1lRmllbGQuc2V0VGV4dChwYXRjaEZpbGVQYXRoKTsKLQkJLy9zZXRTb3VyY2VOYW1lKHBhdGNoRmlsZVBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzb3VyY2UgbmFtZSBvZiB0aGUgaW1wb3J0IHRvIGJlIHRoZSBzdXBwbGllZCBwYXRoLgotCSAqIEFkZHMgdGhlIG5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlCi0JICogc291cmNlIGNvbWJvIGFuZCBzZWxlY3RzIGl0LgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gYmUgYWRkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VOYW1lKFN0cmluZyBwYXRoKSB7Ci0JCi0JCWlmIChwYXRoLmxlbmd0aCgpID4gMCkgewotCQotCQkJU3RyaW5nW10gY3VycmVudEl0ZW1zPSBmUGF0Y2hGaWxlTmFtZUZpZWxkLmdldEl0ZW1zKCk7Ci0JCQlpbnQgc2VsZWN0aW9uSW5kZXg9IC0xOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGN1cnJlbnRJdGVtcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoY3VycmVudEl0ZW1zW2ldLmVxdWFscyhwYXRoKSkKLQkJCQkJc2VsZWN0aW9uSW5kZXg9IGk7Ci0JCQkKLQkJCWlmIChzZWxlY3Rpb25JbmRleCA8IDApIHsJLy8gbm90IGZvdW5kIGluIGhpc3RvcnkKLQkJCQlpbnQgb2xkTGVuZ3RoPSBjdXJyZW50SXRlbXMubGVuZ3RoOwotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zPSBuZXcgU3RyaW5nW29sZExlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEl0ZW1zLCAwLCBuZXdJdGVtcywgMCwgb2xkTGVuZ3RoKTsKLQkJCQluZXdJdGVtc1tvbGRMZW5ndGhdPSBwYXRoOwotCQkJCWZQYXRjaEZpbGVOYW1lRmllbGQuc2V0SXRlbXMobmV3SXRlbXMpOwotCQkJCXNlbGVjdGlvbkluZGV4PSBvbGRMZW5ndGg7Ci0JCQl9Ci0JCQlmUGF0Y2hGaWxlTmFtZUZpZWxkLnNlbGVjdChzZWxlY3Rpb25JbmRleCk7Ci0JCi0JCQkvL3Jlc2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICoJVGhlIEZpbmlzaCBidXR0b24gd2FzIHByZXNzZWQuIFRyeSB0byBkbyB0aGUgcmVxdWlyZWQgd29yayBub3cgYW5kIGFuc3dlcgotCSAqCWEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuIElmIGZhbHNlIGlzIHJldHVybmVkIHRoZW4gdGhlIHdpemFyZCB3aWxsCi0JICoJbm90IGNsb3NlLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotLy8JCWlmICghZW5zdXJlU291cmNlSXNWYWxpZCgpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCXNhdmVXaWRnZXRWYWx1ZXMoKTsKLQkKLS8vCQlJdGVyYXRvciByZXNvdXJjZXNFbnVtID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotLy8JCUxpc3QgZmlsZVN5c3RlbU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJd2hpbGUgKHJlc291cmNlc0VudW0uaGFzTmV4dCgpKSB7Ci0vLwkJCWZpbGVTeXN0ZW1PYmplY3RzLmFkZCgKLS8vCQkJCSgoRmlsZVN5c3RlbUVsZW1lbnQpIHJlc291cmNlc0VudW0ubmV4dCgpKS5nZXRGaWxlU3lzdGVtT2JqZWN0KCkpOwotLy8JCX0KLS8vCQotLy8JCWlmIChmaWxlU3lzdGVtT2JqZWN0cy5zaXplKCkgPiAwKQotLy8JCQlyZXR1cm4gaW1wb3J0UmVzb3VyY2VzKGZpbGVTeXN0ZW1PYmplY3RzKTsKLS8vCQotLy8JCU1lc3NhZ2VEaWFsb2cKLS8vCQkJLm9wZW5JbmZvcm1hdGlvbigKLS8vCQkJCWdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0vLwkJCQlEYXRhVHJhbnNmZXJNZXNzYWdlcy5nZXRTdHJpbmcoIkRhdGFUcmFuc2Zlci5pbmZvcm1hdGlvbiIpLCAvLyROT04tTkxTLTEkCi0vLwkJCQlEYXRhVHJhbnNmZXJNZXNzYWdlcy5nZXRTdHJpbmcoIkZpbGVJbXBvcnQubm9uZVNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCi0vLwkKLS8vCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqCVVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkCi0JICoJbGFzdCB0aW1lIHRoaXMgd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJCi0JCWJvb2xlYW4gdXNlQ2xpcGJvYXJkPSBmYWxzZTsKLQkJCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCQotCQkJdXNlQ2xpcGJvYXJkPSBzZXR0aW5ncy5nZXRCb29sZWFuKFNUT1JFX1VTRV9DTElQQk9BUkRfSUQpOwotCi0JCQkvLyBzZXQgZmlsZW5hbWVzIGhpc3RvcnkKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9QQVRDSF9GSUxFU19JRCk7Ci0JCQlpZiAoc291cmNlTmFtZXMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJCWlmIChzb3VyY2VOYW1lc1tpXSAhPSBudWxsICYmIHNvdXJjZU5hbWVzW2ldLmxlbmd0aCgpID4gMCkKLQkJCQkJCWZQYXRjaEZpbGVOYW1lRmllbGQuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJCQotCQkJLy8gc2V0IHBhdGNoIGZpbGUgcGF0aAotCQkJU3RyaW5nIHBhdGNoRmlsZVBhdGg9IHNldHRpbmdzLmdldChTVE9SRV9QQVRDSF9GSUxFU19JRCk7Ci0JCQlpZiAocGF0Y2hGaWxlUGF0aCAhPSBudWxsKQotCQkJCXNldFNvdXJjZU5hbWUocGF0Y2hGaWxlUGF0aCk7Ci0JCX0KLQkJCi0JCS8vIHNldCAnVXNlIENsaXBib2FyZCcgcmFkaW8gYnV0dG9ucwotCQlzZXRVc2VDbGlwYm9hcmQodXNlQ2xpcGJvYXJkKTsKLQl9Ci0JCi0JLyoqCi0JICogCVNpbmNlIEZpbmlzaCB3YXMgcHJlc3NlZCwgd3JpdGUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgZGlhbG9nIHN0b3JlIHNvIHRoYXQgdGhleQotCSAqCXdpbGwgcGVyc2lzdCBpbnRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyB3aXphcmQgcGFnZQotCSAqLwotCXZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJCi0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfVVNFX0NMSVBCT0FSRF9JRCwgZ2V0VXNlQ2xpcGJvYXJkKCkpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX1BBVENIX0ZJTEVTX0lELCBnZXRQYXRjaEZpbGVQYXRoKCkpOwotCQkJCi0JCQkvLyB1cGRhdGUgc291cmNlIG5hbWVzIGhpc3RvcnkKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9QQVRDSF9GSUxFU19JRCk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkKLQkJCQlzb3VyY2VOYW1lcz0gbmV3IFN0cmluZ1swXTsKLQkKLQkJCXNvdXJjZU5hbWVzPSBhZGRUb0hpc3Rvcnkoc291cmNlTmFtZXMsIGdldFBhdGNoRmlsZVBhdGgoKSk7Ci0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfUEFUQ0hfRklMRVNfSUQsIHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQkKLQkvLyBzdGF0aWMgaGVscGVycwotCQkKLQlwcml2YXRlIHZvaWQgc2V0VXNlQ2xpcGJvYXJkKGJvb2xlYW4gdXNlQ2xpcGJvYXJkKSB7Ci0JCWlmICh1c2VDbGlwYm9hcmQpCi0JCQlmVXNlQ2xpcGJvYXJkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZWxzZQotCQkJZlVzZVBhdGNoRmlsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNldEVuYWJsZVBhdGNoRmlsZSghdXNlQ2xpcGJvYXJkKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdldFVzZUNsaXBib2FyZCgpIHsKLQkJaWYgKGZVc2VDbGlwYm9hcmRCdXR0b24gIT0gbnVsbCkKLQkJCXJldHVybiBmVXNlQ2xpcGJvYXJkQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0Y2hGaWxlUGF0aCgpIHsKLQkJaWYgKGZQYXRjaEZpbGVOYW1lRmllbGQgIT0gbnVsbCkKLQkJCXJldHVybiBmUGF0Y2hGaWxlTmFtZUZpZWxkLmdldFRleHQoKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfSAKLQotCS8qCi0JICogQWRkcyBhbiBlbnRyeSB0byBhIGhpc3RvcnksIHdoaWxlIHRha2luZyBjYXJlIG9mIGR1cGxpY2F0ZSBoaXN0b3J5IGl0ZW1zCi0JICogYW5kIGV4Y2Vzc2l2ZWx5IGxvbmcgaGlzdG9yaWVzLiBUaGUgYXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQgYWxsIGhpc3RvcmllcwotCSAqIHNob3VsZCBiZSBvZiBsZW5ndGggPGNvZGU+Q09NQk9fSElTVE9SWV9MRU5HVEg8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGhpc3RvcnkgdGhlIGN1cnJlbnQgaGlzdG9yeQotCSAqIEBwYXJhbSBuZXdFbnRyeSB0aGUgZW50cnkgdG8gYWRkIHRvIHRoZSBoaXN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBhZGRUb0hpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSwgU3RyaW5nIG5ld0VudHJ5KSB7Ci0JCWphdmEudXRpbC5BcnJheUxpc3QgbD0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoamF2YS51dGlsLkFycmF5cy5hc0xpc3QoaGlzdG9yeSkpOwotCi0JCWwucmVtb3ZlKG5ld0VudHJ5KTsKLQkJbC5hZGQoMCxuZXdFbnRyeSk7Ci0JCi0JCS8vIHNpbmNlIG9ubHkgb25lIG5ldyBpdGVtIHdhcyBhZGRlZCwgd2UgY2FuIGJlIG92ZXIgdGhlIGxpbWl0Ci0JCS8vIGJ5IGF0IG1vc3Qgb25lIGl0ZW0KLQkJaWYgKGwuc2l6ZSgpID4gQ09NQk9fSElTVE9SWV9MRU5HVEgpCi0JCQlsLnJlbW92ZShDT01CT19ISVNUT1JZX0xFTkdUSCk7Ci0JCQotCQlyZXR1cm4gKFN0cmluZ1tdKSBsLnRvQXJyYXkobmV3IFN0cmluZ1tsLnNpemUoKV0pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvTGluZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvTGluZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWIyNWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL0xpbmVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKiBwYWNrYWdlICovIGNsYXNzIExpbmVSZWFkZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGZIYXZlQ2hhcj0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZkxhc3RDaGFyOwotCXByaXZhdGUgYm9vbGVhbiBmU2F3RU9GPSBmYWxzZTsKLQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGZSZWFkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVTaW5nbGVDUj0gZmFsc2U7Ci0JCi0JCi0JLyogcGFja2FnZSAqLyBMaW5lUmVhZGVyKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewotCQlmUmVhZGVyPSByZWFkZXI7Ci0JCUFzc2VydC5pc05vdE51bGwocmVhZGVyKTsKLQl9Ci0KLQl2b2lkIGlnbm9yZVNpbmdsZUNSKCkgewotCQlmSWdub3JlU2luZ2xlQ1I9IHRydWU7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgbGluZSBvZiB0ZXh0LiBBIGxpbmUgaXMgY29uc2lkZXJlZCB0byBiZSB0ZXJtaW5hdGVkIGJ5IGFueSBvbmUKLSAgICAgKiBvZiBhIGxpbmUgZmVlZCAoJ1xuJyksIGEgY2FycmlhZ2UgcmV0dXJuICgnXHInKSwgb3IgYSBjYXJyaWFnZSByZXR1cm4KLSAgICAgKiBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSBhIGxpbmVmZWVkLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIGxpbmUgaW5jbHVkaW5nCi0gICAgICoJdGhlIGxpbmUtdGVybWluYXRpb24gY2hhcmFjdGVycywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVuZCBvZiB0aGUKLSAgICAgKglzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotCS8qIHBhY2thZ2UgKi8gU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIHNiPSBudWxsOwotCQkJCQotCQl3aGlsZSAoIWZTYXdFT0YpIHsKLQkJCWludCBjPSByZWFkQ2hhcigpOwotCQkJaWYgKGMgPT0gLTEpIHsKLQkJCQlmU2F3RU9GPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHNiID09IG51bGwpCi0JCQkJc2I9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgoY2hhciljKTsKLQkJCWlmIChjID09ICdcbicpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkJYz0gcmVhZENoYXIoKTsKLQkJCQlpZiAoYyA9PSAtMSkgewotCQkJCQlmU2F3RU9GPSB0cnVlOwotCQkJCQlicmVhazsJLy8gRU9GCi0JCQkJfQotCQkJCWlmIChjICE9ICdcbicpIHsKLQkJCQkJaWYgKGZJZ25vcmVTaW5nbGVDUikgewotCQkJCQkJc2IuYXBwZW5kKChjaGFyKWMpOwkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWZIYXZlQ2hhcj0gdHJ1ZTsKLQkJCQkJZkxhc3RDaGFyPSBjOwotCQkJCX0gZWxzZQotCQkJCQlzYi5hcHBlbmQoKGNoYXIpYyk7CQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2IgIT0gbnVsbCkKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlKCkgewotCQl0cnkgewotCQkJZlJlYWRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQl9Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gTGlzdCByZWFkTGluZXMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCXdoaWxlICgobGluZT0gcmVhZExpbmUoKSkgIT0gbnVsbCkKLQkJCQlsaW5lcy5hZGQobGluZSk7Ci0JCQlyZXR1cm4gbGluZXM7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBOZWVkV29yawotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImVycm9yIHdoaWxlIHJlYWRpbmcgZmlsZTogIiArIGZpbGVOYW1lICsgIigiICsgZXggKyAiKSIpOwotCQl9IGZpbmFsbHkgewotCQkJY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGhvdXQKLQkgKiBjb3VudGluZyBhIHRyYWlsaW5nIGxpbmUgc2VwYXJhdG9yLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gaW50IGxpbmVDb250ZW50TGVuZ3RoKFN0cmluZyBsaW5lKSB7Ci0JCWlmIChsaW5lID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IGxlbmd0aD0gbGluZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0gbGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQljaGFyIGM9IGxpbmUuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0nXG4nIHx8IGMgPT0gJ1xyJykKLQkJCQlsZW5ndGgtLTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQkKLQkvLy0tLS0gcHJpdmF0ZQotCQotCXByaXZhdGUgaW50IHJlYWRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZIYXZlQ2hhcikgewotCQkJZkhhdmVDaGFyPSBmYWxzZTsKLQkJCXJldHVybiBmTGFzdENoYXI7Ci0JCX0KLQkJcmV0dXJuIGZSZWFkZXIucmVhZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoRXJyb3JEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZmI2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaEVycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotcHVibGljIGNsYXNzIFBhdGNoRXJyb3JEaWFsb2cgewotCQotCXByaXZhdGUgUGF0Y2hFcnJvckRpYWxvZygpIHsKLQkJLy8gbm8gaW5zdGFuY2UuCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc4MDVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnBhdGNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaE1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEU9ICJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnBhdGNoLlBhdGNoTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9CVU5ETEUpOwotCi0JcHJpdmF0ZSBQYXRjaE1lc3NhZ2VzKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL2ludGVybmFsL3BhdGNoL1BhdGNoTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllYWU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgJ0NvbXBhcmUgd2l0aCBQYXRjaCcgQWN0aW9uCi0jCi1QYXRjaEFjdGlvbi5FeGNlcHRpb25UaXRsZT1TYXZpbmcgUmVzb3VyY2VzCi1QYXRjaEFjdGlvbi5FeGNlcHRpb249VW5leHBlY3RlZCBleGNlcHRpb24uIFNlZSBsb2cgZm9yIGRldGFpbHMKLVBhdGNoQWN0aW9uLlNhdmluZ0RpcnR5RWRpdG9yc1Rhc2s9U2F2aW5nIGRpcnR5IGVkaXRvcnMKLVBhdGNoQWN0aW9uLkFsd2F5c1NhdmVRdWVzdGlvbj0mQWx3YXlzIHNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHBhdGNoaW5nCi1QYXRjaEFjdGlvbi5TYXZlQWxsUXVlc3Rpb249U2F2ZSBhbGwgbW9kaWZpZWQgcmVzb3VyY2VzCi1QYXRjaEFjdGlvbi5TYXZlQWxsRGVzY3JpcHRpb249QWxsIG1vZGlmaWVkIHJlc291cmNlcyBoYXZlIHRvIGJlIHNhdmVkIGJlZm9yZSB0aGlzIG9wZXJhdGlvbi5cbkNsaWNrICdPSycgdG8gY29uZmlybSBvciBjbGljayAnQ2FuY2VsJy4KLQotIwotIyBQYXRjaFdpemFyZAotIwotUGF0Y2hXaXphcmQudGl0bGU9QXBwbHkgUGF0Y2gKLVBhdGNoV2l6YXJkLnVuZXhwZWN0ZWRFeGNlcHRpb24ubWVzc2FnZT0gVW5leHBlY3RlZCBleGNlcHRpb24gd2hpbGUgYXBwbHlpbmcgdGhlIHBhdGNoLiBTZWUgbG9nIGZvciBhIGRldGFpbGVkIGVycm9yIGRlc2NyaXB0aW9uLgotCi0jCi0jIElucHV0UGF0Y2hQYWdlCi0jCi1JbnB1dFBhdGNoUGFnZS50aXRsZT0gUGF0Y2ggSW5wdXQgU3BlY2lmaWNhdGlvbgotSW5wdXRQYXRjaFBhZ2UubWVzc2FnZT0gRGVmaW5lIHRoZSByZXNvdXJjZSB0byBwYXRjaCBhbmQgdGhlIHBhdGNoIHRvIGFwcGx5Ci1JbnB1dFBhdGNoUGFnZS5DbGlwYm9hcmQ9Q2xpcGJvYXJkCi1JbnB1dFBhdGNoUGFnZS5TZWxlY3RJbnB1dD1TZWxlY3QgYSBzaW5nbGUgZmlsZSBvciBmb2xkZXIgdG8gcGF0Y2g6Ci1JbnB1dFBhdGNoUGFnZS5QYXRjaEVycm9yRGlhbG9nLnRpdGxlPVBhdGNoIEVycm9yCi1JbnB1dFBhdGNoUGFnZS5QYXRjaEVycm9yRGlhbG9nPVBhdGNoIEVycm9yCi1JbnB1dFBhdGNoUGFnZS5TZWxlY3RQYXRjaC50aXRsZT1TZWxlY3QgUGF0Y2gKLUlucHV0UGF0Y2hQYWdlLkZpbGVCdXR0b24udGV4dD1GaWwmZQotSW5wdXRQYXRjaFBhZ2UuQ2hvb3NlRmlsZUJ1dHRvbi50ZXh0PSZCcm93c2UuLi4KLUlucHV0UGF0Y2hQYWdlLlVzZUNsaXBib2FyZEJ1dHRvbi50ZXh0PSZDbGlwYm9hcmQKLUlucHV0UGF0Y2hQYWdlLk5vdGhpbmdTZWxlY3RlZC5tZXNzYWdlPVNlbGVjdCBhIGZpbGUgb3IgZm9sZGVyIHRvIGJlIHBhdGNoZWQKLUlucHV0UGF0Y2hQYWdlLkNsaXBib2FyZElzRW1wdHkubWVzc2FnZT1DbGlwYm9hcmQgaXMgZW1wdHkKLUlucHV0UGF0Y2hQYWdlLk5vVGV4dEluQ2xpcGJvYXJkLm1lc3NhZ2U9Q2xpcGJvYXJkIGRvZXMgbm90IGNvbnRhaW4gdGV4dAotSW5wdXRQYXRjaFBhZ2UuQ291bGROb3RSZWFkQ2xpcGJvYXJkLm1lc3NhZ2U9Q2Fubm90IHJldHJpZXZlIGNsaXBib2FyZCBjb250ZW50cwotSW5wdXRQYXRjaFBhZ2UuQ2Fubm90TG9jYXRlUGF0Y2gubWVzc2FnZT1DYW5ub3QgbG9jYXRlIHBhdGNoIGZpbGU6IAotSW5wdXRQYXRjaFBhZ2UuTm9GaWxlTmFtZS5tZXNzYWdlPU5vIGZpbGUgbmFtZQotI1NJIC0gU2VsZWN0IGZpbGUgbmFtZSAgICA/Ci1JbnB1dFBhdGNoUGFnZS5TZWxlY3RQYXRjaEZpbGVEaWFsb2cudGl0bGU9U2VsZWN0IFBhdGNoIEZpbGUKLUlucHV0UGF0Y2hQYWdlLlBhdGNoRmlsZU5vdEZvdW5kLm1lc3NhZ2U9UGF0Y2ggZmlsZSBub3QgZm91bmQuCi1JbnB1dFBhdGNoUGFnZS5QYXJzZUVycm9yLm1lc3NhZ2U9RXJyb3Igd2hpbGUgcGFyc2luZyBwYXRjaAotSW5wdXRQYXRjaFBhZ2UuQ2xpcGJvYXJkLnRpdGxlPUNsaXBib2FyZAotSW5wdXRQYXRjaFBhZ2UuUGF0Y2hGaWxlLnRpdGxlPVBhdGNoIGZpbGUKLUlucHV0UGF0Y2hQYWdlLk5vRGlmZnNGb3VuZC5mb3JtYXQ9ezB9IGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcGF0Y2guCi1JbnB1dFBhdGNoUGFnZS5TaW5nbGVGaWxlRXJyb3IuZm9ybWF0PXswfSBjb250YWlucyBtdWx0aXBsZSBwYXRjaGVzLiBZb3UgY2Fubm90IGFwcGx5IHRoZW0gdG8gYSBzaW5nbGUgZmlsZS4KLQotIwotIyBQcmV2aWV3UGF0Y2hQYWdlCi0jCi1QcmV2aWV3UGF0Y2hQYWdlLnRpdGxlPSBWZXJpZnkgUGF0Y2gKLVByZXZpZXdQYXRjaFBhZ2UubWVzc2FnZT0gVGhlIHRyZWUgc2hvd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXRjaC5cbkEgY2hlY2tlZCBpdGVtIGluZGljYXRlcyB0aGF0IGEgcGF0Y2ggY2FuIGJlIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5LiBUbyByZW1vdmUgYW4gaXRlbSwgY2xlYXIgaXRzIGNoZWNrYm94LgotUHJldmlld1BhdGNoUGFnZS5MZWZ0LnRpdGxlPSBPcmlnaW5hbAotUHJldmlld1BhdGNoUGFnZS5SaWdodC50aXRsZT0gUmVzdWx0Ci1QcmV2aWV3UGF0Y2hQYWdlLlBhdGNoT3B0aW9ucy50aXRsZT1QYXRjaCBPcHRpb25zCi1QcmV2aWV3UGF0Y2hQYWdlLklnbm9yZVNlZ21lbnRzLnRleHQ9Jklnbm9yZSBsZWFkaW5nIHBhdGggbmFtZSBzZWdtZW50czoKLVByZXZpZXdQYXRjaFBhZ2UuUmV2ZXJzZVBhdGNoLnRleHQ9JlJldmVyc2UgcGF0Y2gKLVByZXZpZXdQYXRjaFBhZ2UuRnV6ekZhY3Rvci50ZXh0PSZNYXhpbXVtIGZ1enogZmFjdG9yOgotUHJldmlld1BhdGNoUGFnZS5GdXp6RmFjdG9yLnRvb2x0aXA9QWxsb3cgQ29udGV4dCB0byBTaGlmdCBUaGlzIE51bWJlciBvZiBMaW5lcyBmcm9tIHRoZSBPcmlnaW5hbCBMb2NhdGlvbgotUHJldmlld1BhdGNoUGFnZS5JZ25vcmVXaGl0ZXNwYWNlLnRleHQ9SWdub3JlICZ3aGl0ZSBzcGFjZQotUHJldmlld1BhdGNoUGFnZS5Ob05hbWUudGV4dD1ubyBuYW1lCi1QcmV2aWV3UGF0Y2hQYWdlLkZpbGVFeGlzdHMuZXJyb3I9KGZpbGUgYWxyZWFkeSBleGlzdHMpCi1QcmV2aWV3UGF0Y2hQYWdlLkZpbGVEb2VzTm90RXhpc3QuZXJyb3I9KGZpbGUgZG9lcyBub3QgZXhpc3QpCi1QcmV2aWV3UGF0Y2hQYWdlLk5vTWF0Y2guZXJyb3I9KG5vIG1hdGNoKQotUHJldmlld1BhdGNoUGFnZS5GaWxlSXNSZWFkT25seS5lcnJvcj0oZmlsZSBpcyByZWFkLW9ubHkpCi1QcmV2aWV3UGF0Y2hQYWdlLkd1ZXNzRnV6ei50ZXh0PSAmR3Vlc3MKLVByZXZpZXdQYXRjaFBhZ2UuR3Vlc3NGdXp6UHJvZ3Jlc3MudGV4dD0gR3Vlc3NpbmcgRnV6eiBGYWN0b3IuLi4KLVByZXZpZXdQYXRjaFBhZ2UuR3Vlc3NGdXp6UHJvZ3Jlc3MuZm9ybWF0PSB7MH0gKGh1bmsgI3sxfSkKLQotIwotIyBQYXRjaGVyCi0jCi1QYXRjaGVyLkVycm9yRGlhbG9nLnRpdGxlPXRpdGxlCi1QYXRjaGVyLkRlbGV0ZUVycm9yLm1lc3NhZ2U9RXJyb3Igd2hpbGUgZGVsZXRpbmcgcmVzb3VyY2UKLVBhdGNoZXIuVXBkYXRlRXJyb3IubWVzc2FnZT1FcnJvciB3aGlsZSB1cGRhdGluZyByZXNvdXJjZQotUGF0Y2hlci5SZWZyZXNoRXJyb3IubWVzc2FnZT1FcnJvciB3aGlsZSByZWZyZXNoaW5nIGZyb20gbG9jYWwKLVBhdGNoZXIuTWFya2VyLm1lc3NhZ2U9UmVqZWN0ZWQgcGF0Y2gKLVBhdGNoZXIuVGFzay5tZXNzYWdlPVBhdGNoaW5nCi0KLSMKLSMgUGF0Y2hDb21wYXJlSW5wdXQKLSMKLVBhdGNoQ29tcGFyZUlucHV0LlJpZ2h0VGl0bGUuZm9ybWF0PSBQYXRjaDogezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzYTk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnBhdGNoOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLio7Ci0KLQotLyogcGFja2FnZSAqLyBjbGFzcyBQYXRjaFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JCi0JLy8gZGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBESUFMT0dfU0VUVElOR1NfS0VZPSAiUGF0Y2hXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gZkhhc05ld0RpYWxvZ1NldHRpbmdzOwotCQotCXByaXZhdGUgSW5wdXRQYXRjaFBhZ2UgZlBhdGNoV2l6YXJkUGFnZTsKLQkKLQlwcml2YXRlIFBhdGNoZXIgZlBhdGNoZXI7Ci0JcHJpdmF0ZSBJUmVzb3VyY2UgZlRhcmdldDsKLQotCQkKLQkvKgotCSAqIENyZWF0ZXMgYSB3aXphcmQgZm9yIGFwcGx5aW5nIGEgcGF0Y2ggZmlsZSB0byB0aGUgd29ya3NwYWNlLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gUGF0Y2hXaXphcmQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCi0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKENvbXBhcmVVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIndpemJhbi9hcHBseXBhdGNoX3dpemJhbi5naWYiKSk7CS8vJE5PTi1OTFMtMSQKLQkJc2V0V2luZG93VGl0bGUoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGNoV2l6YXJkLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJc2V0VGFyZ2V0cyhVdGlsaXRpZXMuZ2V0UmVzb3VyY2VzKHNlbGVjdGlvbikpOwotCi0JCWZQYXRjaGVyPSBuZXcgUGF0Y2hlcigpOwotCQkJCQotCQlJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3M9IENvbXBhcmVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb249IHdvcmtiZW5jaFNldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdTX0tFWSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkKLQkJCWZIYXNOZXdEaWFsb2dTZXR0aW5ncz0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCQlmSGFzTmV3RGlhbG9nU2V0dGluZ3M9IGZhbHNlOwotCQkJc2V0RGlhbG9nU2V0dGluZ3Moc2VjdGlvbik7Ci0JCX0JCi0JfQotCQotCVBhdGNoZXIgZ2V0UGF0Y2hlcigpIHsKLQkJcmV0dXJuIGZQYXRjaGVyOwotCX0KLQkKLQlJUmVzb3VyY2UgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gZlRhcmdldDsKLQl9Ci0JCi0Jdm9pZCBzZXRUYXJnZXRzKElSZXNvdXJjZVtdIHRhcmdldHMpIHsKLQkJaWYgKHRhcmdldHMgIT0gbnVsbCAmJiB0YXJnZXRzLmxlbmd0aCA+IDApCi0JCQlmVGFyZ2V0PSB0YXJnZXRzWzBdOwkvLyByaWdodCBub3cgd2UgY2FuIG9ubHkgZGVhbCB3aXRoIGEgc2luZ2xlIHNlbGVjdGlvbgotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCQotCQlhZGRQYWdlKGZQYXRjaFdpemFyZFBhZ2U9IG5ldyBJbnB1dFBhdGNoUGFnZSh0aGlzKSk7Ci0JCWFkZFBhZ2UobmV3IFByZXZpZXdQYXRjaFBhZ2UodGhpcykpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElXaXphcmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkKLQkJZlBhdGNoZXIuc2V0TmFtZShmUGF0Y2hXaXphcmRQYWdlLmdldFBhdGNoTmFtZSgpKTsKLQotCQl0cnkgewotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZUYXJnZXQuZ2V0UHJvamVjdCgpKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZQYXRjaGVyLmFwcGx5QWxsKGdldFRhcmdldCgpLCBtb25pdG9yLCBnZXRTaGVsbCgpLCBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hXaXphcmQudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsCi0JCQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRjaFdpemFyZC50aXRsZSIpLAkvLyROT04tTkxTLTEkIAotCQkJCQlQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hXaXphcmQudW5leHBlY3RlZEV4Y2VwdGlvbi5tZXNzYWdlIikpOwkvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNhbm5vdCBoYXBwZW4KLQkJCS8vIE5lZWRXb3JrOiB1c2UgYXNzZXJ0IQotCQl9Ci0JCQotCQkvLyBTYXZlIHRoZSBkaWFsb2cgc2V0dGluZ3MKLQkJaWYgKGZIYXNOZXdEaWFsb2dTZXR0aW5ncykgewotCQkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzPSBDb21wYXJlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbj0gd29ya2JlbmNoU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfU0VUVElOR1NfS0VZKTsKLQkJCXNlY3Rpb249IHdvcmtiZW5jaFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX0tFWSk7Ci0JCQlzZXREaWFsb2dTZXR0aW5ncyhzZWN0aW9uKTsKLQkJfQotCQkKLQkJZlBhdGNoV2l6YXJkUGFnZS5zYXZlV2lkZ2V0VmFsdWVzKCk7Ci0JCS8vZlByZXZpZXdQYXRjaFBhZ2Uuc2F2ZVdpZGdldFZhbHVlcygpOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGQyZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyOwotCi0vKioKLSAqIEEgUGF0Y2hlciAKLSAqIC0ga25vd3MgaG93IHRvIHBhcnNlIHZhcmlvdXMgcGF0Y2ggZmlsZSBmb3JtYXRzIGludG8gc29tZSBpbi1tZW1vcnkgc3RydWN0dXJlLAotICogLSBob2xkcyBvbnRvIHRoZSBwYXJzZWQgZGF0YSBhbmQgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gYXBwbHlpbmcgdGhlIHBhdGNoZXMsCi0gKiAtIGtub3dzIGhvdyB0byBhcHBseSB0aGUgcGF0Y2hlcyB0byBmaWxlcyBhbmQgZm9sZGVycy4KLSAqLwotcHVibGljIGNsYXNzIFBhdGNoZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZfTlVMTD0gIi9kZXYvbnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVKRUNUX0ZJTEVfRVhURU5TSU9OPSAiLnJlaiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX1RZUEU9ICJvcmcuZWNsaXBzZS5jb21wYXJlLnJlamVjdGVkUGF0Y2hNYXJrZXIiOwkvLyROT04tTkxTLTEkCi0KLQkvLyBkaWZmIGZvcm1hdHMKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUPSAwOwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVEPSAxOwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PUk1BTD0gMjsKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTklGSUVEPSAzOwotCQotCS8vIHdlIHJlY29nbml6ZSB0aGUgZm9sbG93aW5nIGRhdGUvdGltZSBmb3JtYXRzCi0JcHJpdmF0ZSBzdGF0aWMgRGF0ZUZvcm1hdFtdIERBVEVfRk9STUFUUz0gbmV3IERhdGVGb3JtYXRbXSB7Ci0JCW5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUgTU1NIGRkIGtrOm1tOnNzIHl5eXkiKSwgLy8kTk9OLU5MUy0xJAotCQluZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBrazptbTpzcyIpLCAvLyROT04tTkxTLTEkCi0JCW5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUgTU1NIGRkIGtrOm1tOnNzIHl5eXkiLCBMb2NhbGUuVVMpIC8vJE5PTi1OTFMtMSQKLQl9OwotCQkKLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIERpZmZbXSBmRGlmZnM7Ci0JLy8gcGF0Y2ggb3B0aW9ucwotCXByaXZhdGUgaW50IGZTdHJpcFByZWZpeFNlZ21lbnRzOwotCXByaXZhdGUgaW50IGZGdXp6OwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlV2hpdGVzcGFjZT0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVMaW5lRGVsaW1pdGVyPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmUHJlc2VydmVMaW5lRGVsaW1pdGVycz0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZXZlcnNlPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFkanVzdFNoaWZ0PSB0cnVlOwotCQotCQotCVBhdGNoZXIoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JLy8tLS0tIG9wdGlvbnMKLQkKLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWU9IG5hbWU7Ci0JfQotCQotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBEaWZmcyBhZnRlciBhIHN1Y2Vzc2Z1bGwgY2FsbCB0byA8Y29kZT5wYXJzZTwvY29kZT4uCi0JICogSWYgPGNvZGU+cGFyc2U8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCURpZmZbXSBnZXREaWZmcygpIHsKLQkJcmV0dXJuIGZEaWZmczsKLQl9Ci0JCi0JSVBhdGggZ2V0UGF0aChEaWZmIGRpZmYpIHsKLQkJSVBhdGggcGF0aD0gZGlmZi5nZXRQYXRoKCk7Ci0JCWlmIChmU3RyaXBQcmVmaXhTZWdtZW50cyA+IDAgJiYgZlN0cmlwUHJlZml4U2VnbWVudHMgPCBwYXRoLnNlZ21lbnRDb3VudCgpKQotCQkJcGF0aD0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGZTdHJpcFByZWZpeFNlZ21lbnRzKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5ldyB2YWx1ZSBkaWZmZXJzIGZyb20gb2xkLgotCSAqLwotCWJvb2xlYW4gc2V0U3RyaXBQcmVmaXhTZWdtZW50cyhpbnQgc3RyaXApIHsKLQkJaWYgKHN0cmlwICE9IGZTdHJpcFByZWZpeFNlZ21lbnRzKSB7Ci0JCQlmU3RyaXBQcmVmaXhTZWdtZW50cz0gc3RyaXA7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCWludCBnZXRTdHJpcFByZWZpeFNlZ21lbnRzKCkgewotCQlyZXR1cm4gZlN0cmlwUHJlZml4U2VnbWVudHM7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIG9sZC4KLQkgKi8KLQlib29sZWFuIHNldEZ1enooaW50IGZ1enopIHsKLQkJaWYgKGZ1enogIT0gZkZ1enopIHsKLQkJCWZGdXp6PSBmdXp6OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSBvbGQuCi0JICovCi0JYm9vbGVhbiBzZXRSZXZlcnNlZChib29sZWFuIHJldmVyc2UpIHsKLQkJaWYgKGZSZXZlcnNlICE9IHJldmVyc2UpIHsKLQkJCWZSZXZlcnNlPSByZXZlcnNlOwotCQkJCi0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkRpZmZzLmxlbmd0aDsgaSsrKQotCQkJCWZEaWZmc1tpXS5yZXZlcnNlKCk7Ci0JCQkJCQkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8qCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIG9sZC4KLQkgKi8KLQlib29sZWFuIHNldElnbm9yZVdoaXRlc3BhY2UoYm9vbGVhbiBpZ25vcmVXaGl0ZXNwYWNlKSB7Ci0JCWlmIChpZ25vcmVXaGl0ZXNwYWNlICE9IGZJZ25vcmVXaGl0ZXNwYWNlKSB7Ci0JCQlmSWdub3JlV2hpdGVzcGFjZT0gaWdub3JlV2hpdGVzcGFjZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8vLS0tLSBwYXJzaW5nIHBhdGNoIGZpbGVzCi0JCQotCS8qIHBhY2thZ2UgKi8gdm9pZCBwYXJzZShCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxpc3QgZGlmZnM9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGxpbmU9IG51bGw7Ci0JCWJvb2xlYW4gcmVyZWFkPSBmYWxzZTsKLQkJU3RyaW5nIGRpZmZBcmdzPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWU9IG51bGw7Ci0JCQotCQlMaW5lUmVhZGVyIGxyPSBuZXcgTGluZVJlYWRlcihyZWFkZXIpOwotCQlpZiAoISJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpCS8vJE5PTi1OTFMtMSQKLQkJCWxyLmlnbm9yZVNpbmdsZUNSKCk7Ci0JCQotCQkvLyByZWFkIGxlYWRpbmcgZ2FyYmFnZQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFyZXJlYWQpCi0JCQkJbGluZT0gbHIucmVhZExpbmUoKTsKLQkJCXJlcmVhZD0gZmFsc2U7Ci0JCQlpZiAobGluZSA9PSBudWxsKQotCQkJCWJyZWFrOwotCQkJaWYgKGxpbmUubGVuZ3RoKCkgPCA0KQotCQkJCWNvbnRpbnVlOwkvLyB0b28gc2hvcnQKLQkJCQkJCQkJCi0JCQkvLyByZW1lbWJlciBzb21lIGluZm9zCi0JCQlpZiAobGluZS5zdGFydHNXaXRoKCJJbmRleDogIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZpbGVOYW1lPSBsaW5lLnN1YnN0cmluZyg3KS50cmltKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobGluZS5zdGFydHNXaXRoKCJkaWZmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWRpZmZBcmdzPSBsaW5lLnN1YnN0cmluZyg0KS50cmltKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIi0tLSAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbGluZT0gcmVhZFVuaWZpZWREaWZmKGRpZmZzLCBsciwgbGluZSwgZGlmZkFyZ3MsIGZpbGVOYW1lKTsKLQkJCQlkaWZmQXJncz0gZmlsZU5hbWU9IG51bGw7Ci0JCQkJcmVyZWFkPSB0cnVlOwotCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIioqKiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbGluZT0gcmVhZENvbnRleHREaWZmKGRpZmZzLCBsciwgbGluZSwgZGlmZkFyZ3MsIGZpbGVOYW1lKTsKLQkJCQlkaWZmQXJncz0gZmlsZU5hbWU9IG51bGw7Ci0JCQkJcmVyZWFkPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlsci5jbG9zZSgpOwotCQkKLQkJZkRpZmZzPSAoRGlmZltdKSBkaWZmcy50b0FycmF5KG5ldyBEaWZmW2RpZmZzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgZGlmZgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlYWRVbmlmaWVkRGlmZihMaXN0IGRpZmZzLCBMaW5lUmVhZGVyIHJlYWRlciwgU3RyaW5nIGxpbmUsIFN0cmluZyBhcmdzLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJCQkJCQotCQlTdHJpbmdbXSBvbGRBcmdzPSBzcGxpdChsaW5lLnN1YnN0cmluZyg0KSk7Ci0KLQkJLy8gcmVhZCBpbmZvIGFib3V0IG5ldyBmaWxlCi0JCWxpbmU9IHJlYWRlci5yZWFkTGluZSgpOwotCQlpZiAobGluZSA9PSBudWxsIHx8ICFsaW5lLnN0YXJ0c1dpdGgoIisrKyAiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGxpbmU7Ci0JCQkKLQkJU3RyaW5nW10gbmV3QXJncz0gc3BsaXQobGluZS5zdWJzdHJpbmcoNCkpOwotCQotCQlEaWZmIGRpZmY9IG5ldyBEaWZmKGV4dHJhY3RQYXRoKG9sZEFyZ3MsIDAsIGZpbGVOYW1lKSwgZXh0cmFjdERhdGUob2xkQXJncywgMSksCi0JCQkJICAgCQkJZXh0cmFjdFBhdGgobmV3QXJncywgMCwgZmlsZU5hbWUpLCBleHRyYWN0RGF0ZShuZXdBcmdzLCAxKSk7Ci0JCWRpZmZzLmFkZChkaWZmKTsKLQkJCQkgICAKLQkJaW50W10gb2xkUmFuZ2U9IG5ldyBpbnRbMl07Ci0JCWludFtdIG5ld1JhbmdlPSBuZXcgaW50WzJdOwotCQlMaXN0IGxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIHJlYWQgbGluZXMgb2YgaHVuawotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkKLQkJCQlsaW5lPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQlpZiAobGluZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCi0JCQkJaWYgKHJlYWRlci5saW5lQ29udGVudExlbmd0aChsaW5lKSA9PSAwKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBmb3VuZCBlbXB0eSBsaW5lIGluIGh1bms7IGlnbm9yZWQiKTsKLQkJCQkJLy9saW5lcy5hZGQoJyAnICsgbGluZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQljaGFyIGM9IGxpbmUuY2hhckF0KDApOwotCQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ0AnOgotCQkJCQlpZiAobGluZS5zdGFydHNXaXRoKCJAQCAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBmbHVzaCBvbGQgaHVuawotCQkJCQkJaWYgKGxpbmVzLnNpemUoKSA+IDApIHsKLQkJCQkJCQluZXcgSHVuayhkaWZmLCBvbGRSYW5nZSwgbmV3UmFuZ2UsIGxpbmVzKTsKLQkJCQkJCQlsaW5lcy5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCS8vIGZvcm1hdDogQEAgLW9sZFN0YXJ0LG9sZExlbmd0aCArbmV3U3RhcnQsbmV3TGVuZ3RoIEBACi0JCQkJCQlleHRyYWN0UGFpcihsaW5lLCAnLScsIG9sZFJhbmdlKTsKLQkJCQkJCWV4dHJhY3RQYWlyKGxpbmUsICcrJywgbmV3UmFuZ2UpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnICc6Ci0JCQkJY2FzZSAnKyc6Ci0JCQkJY2FzZSAnLSc6Ci0JCQkJCWxpbmVzLmFkZChsaW5lKTsKLQkJCQkJY29udGludWU7Ci0JCQkJY2FzZSAnXFwnOgotCQkJCQlpZiAobGluZS5zdGFydHNXaXRoKCJObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIiwgMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGxhc3RJbmRleD0gbGluZXMuc2l6ZSgpOwotCQkJCQkJaWYgKGxhc3RJbmRleCA+IDApIHsKLQkJCQkJCQlsaW5lPSAoU3RyaW5nKSBsaW5lcy5nZXQobGFzdEluZGV4LTEpOwotCQkJCQkJCWludCBlbmQ9IGxpbmUubGVuZ3RoKCktMTsKLQkJCQkJCQljaGFyIGxjPSBsaW5lLmNoYXJBdChlbmQpOwotCQkJCQkJCWlmIChsYyA9PSAnXG4nKSB7Ci0JCQkJCQkJCWVuZC0tOwotCQkJCQkJCQlpZiAoZW5kID4gMCAmJiBsaW5lLmNoYXJBdChlbmQtMSkgPT0gJ1xyJykKLQkJCQkJCQkJCWVuZC0tOwotCQkJCQkJCX0gZWxzZSBpZiAobGMgPT0gJ1xyJykgewotCQkJCQkJCQllbmQtLTsKLQkJCQkJCQl9Ci0JCQkJCQkJbGluZT0gbGluZS5zdWJzdHJpbmcoMCwgZW5kKTsKLQkJCQkJCQlsaW5lcy5zZXQobGFzdEluZGV4LTEsIGxpbmUpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlpbnQgYTE9IGMsIGEyPSAwOwotCQkJCQkJaWYgKGxpbmUubGVuZ3RoKCkgPiAxKQotCQkJCQkJCWEyPSBsaW5lLmNoYXJBdCgxKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhcjogIiArIGExICsgIiAiICsgYTIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobGluZXMuc2l6ZSgpID4gMCkKLQkJCQluZXcgSHVuayhkaWZmLCBvbGRSYW5nZSwgbmV3UmFuZ2UsIGxpbmVzKTsKLQkJCWRpZmYuZmluaXNoKCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IGxpbmUgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBkaWZmCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZENvbnRleHREaWZmKExpc3QgZGlmZnMsIExpbmVSZWFkZXIgcmVhZGVyLCBTdHJpbmcgbGluZSwgU3RyaW5nIGFyZ3MsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZ1tdIG9sZEFyZ3M9IHNwbGl0KGxpbmUuc3Vic3RyaW5nKDQpKTsKLQkJCi0JCS8vIHJlYWQgaW5mbyBhYm91dCBuZXcgZmlsZQotCQlsaW5lPSByZWFkZXIucmVhZExpbmUoKTsKLQkJaWYgKGxpbmUgPT0gbnVsbCB8fCAhbGluZS5zdGFydHNXaXRoKCItLS0gIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBsaW5lOwotCQkKLQkJU3RyaW5nW10gbmV3QXJncz0gc3BsaXQobGluZS5zdWJzdHJpbmcoNCkpOwotCQkJCQkJCi0JCURpZmYgZGlmZj0gbmV3IERpZmYoZXh0cmFjdFBhdGgob2xkQXJncywgMCwgZmlsZU5hbWUpLCBleHRyYWN0RGF0ZShvbGRBcmdzLCAxKSwKLQkJCQkgICAJCQlleHRyYWN0UGF0aChuZXdBcmdzLCAwLCBmaWxlTmFtZSksIGV4dHJhY3REYXRlKG5ld0FyZ3MsIDEpKTsKLQkJZGlmZnMuYWRkKGRpZmYpOwotCQkJCSAgIAotCQlpbnRbXSBvbGRSYW5nZT0gbmV3IGludFsyXTsKLQkJaW50W10gbmV3UmFuZ2U9IG5ldyBpbnRbMl07Ci0JCUxpc3Qgb2xkTGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBuZXdMaW5lcz0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGxpbmVzPSBvbGRMaW5lczsKLQkJCi0JCXRyeSB7Ci0JCQkvLyByZWFkIGxpbmVzIG9mIGh1bmsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCi0JCQkJbGluZT0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGxpbmU7Ci0JCQkJCi0JCQkJaW50IGw9IGxpbmUubGVuZ3RoKCk7Ci0JCQkJaWYgKGwgPT0gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGwgPiAxKSB7Ci0JCQkJCXN3aXRjaCAobGluZS5jaGFyQXQoMCkpIHsKLQkJCQkJY2FzZSAnKic6CQotCQkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiKioqKioqKioqKioqKioqIikpIHsJLy8gbmV3IGh1bmsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGZsdXNoIG9sZCBodW5rCi0JCQkJCQkJaWYgKG9sZExpbmVzLnNpemUoKSA+IDAgfHwgbmV3TGluZXMuc2l6ZSgpID4gMCkgewotCQkJCQkJCQluZXcgSHVuayhkaWZmLCBvbGRSYW5nZSwgbmV3UmFuZ2UsIHVuaWZ5TGluZXMob2xkTGluZXMsIG5ld0xpbmVzKSk7Ci0JCQkJCQkJCW9sZExpbmVzLmNsZWFyKCk7Ci0JCQkJCQkJCW5ld0xpbmVzLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiKioqICIpKSB7CS8vIG9sZCByYW5nZSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gZm9ybWF0OiAqKiogb2xkU3RhcnQsb2xkRW5kICoqKgotCQkJCQkJCWV4dHJhY3RQYWlyKGxpbmUsICcgJywgb2xkUmFuZ2UpOwotCQkJCQkJCW9sZFJhbmdlWzFdPSBvbGRSYW5nZVsxXS1vbGRSYW5nZVswXSsxOwotCQkJCQkJCWxpbmVzPSBvbGRMaW5lczsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICcgJzoJLy8gY29udGV4dCBsaW5lCi0JCQkJCWNhc2UgJysnOgkvLyBhZGRpdGlvbgotCQkJCQljYXNlICchJzoJLy8gY2hhbmdlCi0JCQkJCQlpZiAobGluZS5jaGFyQXQoMSkgPT0gJyAnKSB7Ci0JCQkJCQkJbGluZXMuYWRkKGxpbmUpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJy0nOgotCQkJCQkJaWYgKGxpbmUuY2hhckF0KDEpID09ICcgJykgewkvLyBkZWxldGlvbgotCQkJCQkJCWxpbmVzLmFkZChsaW5lKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIi0tLSAiKSkgewkvLyBuZXcgcmFuZ2UgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGZvcm1hdDogKioqIG5ld1N0YXJ0LG5ld0VuZCAqKioKLQkJCQkJCQlleHRyYWN0UGFpcihsaW5lLCAnICcsIG5ld1JhbmdlKTsKLQkJCQkJCQluZXdSYW5nZVsxXT0gbmV3UmFuZ2VbMV0tbmV3UmFuZ2VbMF0rMTsKLQkJCQkJCQlsaW5lcz0gbmV3TGluZXM7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gZmx1c2ggbGFzdCBodW5rCi0JCQlpZiAob2xkTGluZXMuc2l6ZSgpID4gMCB8fCBuZXdMaW5lcy5zaXplKCkgPiAwKQotCQkJCW5ldyBIdW5rKGRpZmYsIG9sZFJhbmdlLCBuZXdSYW5nZSwgdW5pZnlMaW5lcyhvbGRMaW5lcywgbmV3TGluZXMpKTsKLQkJCWRpZmYuZmluaXNoKCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDcmVhdGVzIGEgTGlzdCBvZiBsaW5lcyBpbiB0aGUgdW5pZmllZCBmb3JtYXQgZnJvbQotCSAqIHR3byBMaXN0cyBvZiBsaW5lcyBpbiB0aGUgJ2NsYXNzaWMnIGZvcm1hdC4KLQkgKi8KLQlwcml2YXRlIExpc3QgdW5pZnlMaW5lcyhMaXN0IG9sZExpbmVzLCBMaXN0IG5ld0xpbmVzKSB7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJU3RyaW5nW10gb2w9IChTdHJpbmdbXSkgb2xkTGluZXMudG9BcnJheShuZXcgU3RyaW5nW29sZExpbmVzLnNpemUoKV0pOwotCQlTdHJpbmdbXSBubD0gKFN0cmluZ1tdKSBuZXdMaW5lcy50b0FycmF5KG5ldyBTdHJpbmdbbmV3TGluZXMuc2l6ZSgpXSk7Ci0JCQotCQlpbnQgb2k9IDAsIG5pPSAwOwotCQkKLQkJd2hpbGUgKHRydWUpIHsKLQkJCQotCQkJY2hhciBvYz0gMDsKLQkJCVN0cmluZyBvPSBudWxsOwotCQkJaWYgKG9pIDwgb2wubGVuZ3RoKSB7Ci0JCQkJbz0gb2xbb2ldOwotCQkJCW9jPSBvLmNoYXJBdCgwKTsKLQkJCX0KLQkJCQotCQkJY2hhciBuYz0gMDsKLQkJCVN0cmluZyBuPSBudWxsOwotCQkJaWYgKG5pIDwgbmwubGVuZ3RoKSB7Ci0JCQkJbj0gbmxbbmldOwotCQkJCW5jPSBuLmNoYXJBdCgwKTsKLQkJCX0KLQkJCQotCQkJLy8gRU9GCi0JCQlpZiAob2MgPT0gMCAmJiBuYyA9PSAwKQotCQkJCWJyZWFrOwotCQkJCQotCQkJLy8gZGVsZXRpb24gaW4gb2xkCi0JCQlpZiAob2MgPT0gJy0nKSB7Ci0JCQkJZG8gewotCQkJCQlyZXN1bHQuYWRkKCctJyArIG8uc3Vic3RyaW5nKDIpKTsKLQkJCQkJb2krKzsKLQkJCQkJaWYgKG9pID49IG9sLmxlbmd0aCkKLQkJCQkJCWJyZWFrOwotCQkJCQlvPSBvbFtvaV07Ci0JCQkJfSB3aGlsZSAoby5jaGFyQXQoMCkgPT0gJy0nKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJLy8gYWRkaXRpb24gaW4gbmV3Ci0JCQlpZiAobmMgPT0gJysnKSB7Ci0JCQkJZG8gewotCQkJCQlyZXN1bHQuYWRkKCcrJyArIG4uc3Vic3RyaW5nKDIpKTsKLQkJCQkJbmkrKzsKLQkJCQkJaWYgKG5pID49IG5sLmxlbmd0aCkKLQkJCQkJCWJyZWFrOwotCQkJCQluPSBubFtuaV07Ci0JCQkJfSB3aGlsZSAobi5jaGFyQXQoMCkgPT0gJysnKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJLy8gZGlmZmVyaW5nIGxpbmVzIG9uIGJvdGggc2lkZXMKLQkJCWlmIChvYyA9PSAnIScgJiYgbmMgPT0gJyEnKSB7Ci0JCQkJLy8gcmVtb3ZlIG9sZAotCQkJCWRvIHsKLQkJCQkJcmVzdWx0LmFkZCgnLScgKyBvLnN1YnN0cmluZygyKSk7Ci0JCQkJCW9pKys7Ci0JCQkJCWlmIChvaSA+PSBvbC5sZW5ndGgpCi0JCQkJCQlicmVhazsKLQkJCQkJbz0gb2xbb2ldOwotCQkJCX0gd2hpbGUgKG8uY2hhckF0KDApID09ICchJyk7Ci0JCQkJCi0JCQkJLy8gYWRkIG5ldwotCQkJCWRvIHsKLQkJCQkJcmVzdWx0LmFkZCgnKycgKyBuLnN1YnN0cmluZygyKSk7Ci0JCQkJCW5pKys7Ci0JCQkJCWlmIChuaSA+PSBubC5sZW5ndGgpCi0JCQkJCQlicmVhazsKLQkJCQkJbj0gbmxbbmldOwotCQkJCX0gd2hpbGUgKG4uY2hhckF0KDApID09ICchJyk7Ci0JCQkJCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNvbnRleHQgbGluZXMKLQkJCWlmIChvYyA9PSAnICcgJiYgbmMgPT0gJyAnKSB7Ci0JCQkJZG8gewotCQkJCQlBc3NlcnQuaXNUcnVlKG8uZXF1YWxzKG4pLCAibm9uIG1hdGNoaW5nIGNvbnRleHQgbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHQuYWRkKCcgJyArIG8uc3Vic3RyaW5nKDIpKTsKLQkJCQkJb2krKzsKLQkJCQkJbmkrKzsKLQkJCQkJaWYgKG9pID49IG9sLmxlbmd0aCB8fCBuaSA+PSBubC5sZW5ndGgpCi0JCQkJCQlicmVhazsKLQkJCQkJbz0gb2xbb2ldOwotCQkJCQluPSBubFtuaV07Ci0JCQkJfSB3aGlsZSAoby5jaGFyQXQoMCkgPT0gJyAnICYmIG4uY2hhckF0KDApID09ICcgJyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvYyA9PSAnICcpIHsKLQkJCQlkbyB7Ci0JCQkJCXJlc3VsdC5hZGQoJyAnICsgby5zdWJzdHJpbmcoMikpOwotCQkJCQlvaSsrOwotCQkJCQlpZiAob2kgPj0gb2wubGVuZ3RoKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW89IG9sW29pXTsKLQkJCQl9IHdoaWxlIChvLmNoYXJBdCgwKSA9PSAnICcpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobmMgPT0gJyAnKSB7Ci0JCQkJZG8gewotCQkJCQlyZXN1bHQuYWRkKCcgJyArIG4uc3Vic3RyaW5nKDIpKTsKLQkJCQkJbmkrKzsKLQkJCQkJaWYgKG5pID49IG5sLmxlbmd0aCkKLQkJCQkJCWJyZWFrOwotCQkJCQluPSBubFtuaV07Ci0JCQkJfSB3aGlsZSAobi5jaGFyQXQoMCkgPT0gJyAnKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgInVuZXhwZWN0ZWQgY2hhciA8IiArIG9jICsgIj4gPCIgKyBuYyArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qCi0JICogQnJlYWtzIHRoZSBnaXZlbiBzdHJpbmcgaW50byB0YWIgc2VwYXJhdGVkIHN1YnN0cmluZ3MuCi0JICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIGZyb20gZWFjaCB0b2tlbi4KLQkgKi8gCi0JcHJpdmF0ZSBTdHJpbmdbXSBzcGxpdChTdHJpbmcgbGluZSkgewotCQlMaXN0IGw9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0PSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUsICJcdCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHRva2VuPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAodG9rZW4ubGVuZ3RoKCkgPiAwKQotIAkJCQlsLmFkZCh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbC50b0FycmF5KG5ldyBTdHJpbmdbbC5zaXplKCldKTsKLQl9Ci0JCi0JLyoKLQkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgdGltZS9kYXRlIGluIG1pbGxpc2Vjb25kcyBvciAtMSBvbiBlcnJvcgotCSAqLwotCXByaXZhdGUgbG9uZyBleHRyYWN0RGF0ZShTdHJpbmdbXSBhcmdzLCBpbnQgbikgewotCQlpZiAobiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQlTdHJpbmcgbGluZT0gYXJnc1tuXTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBEQVRFX0ZPUk1BVFMubGVuZ3RoOyBpKyspIHsKLQkJCQlEQVRFX0ZPUk1BVFNbaV0uc2V0TGVuaWVudCh0cnVlKTsKLQkJCQl0cnkgewotCQkJCQlEYXRlIGRhdGU9IERBVEVfRk9STUFUU1tpXS5wYXJzZShsaW5lKTsKLQkJCQkJcmV0dXJuIGRhdGUuZ2V0VGltZSgpOwkJCi0JCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiY2FuJ3QgcGFyc2UgZGF0ZTogPCIgKyBsaW5lICsgIj4iKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyBudWxsIGlmIGZpbGUgbmFtZSBpcyAiL2Rldi9udWxsIi4KLQkgKi8KLQlwcml2YXRlIElQYXRoIGV4dHJhY3RQYXRoKFN0cmluZ1tdIGFyZ3MsIGludCBuLCBTdHJpbmcgcGF0aDIpIHsKLQkJaWYgKG4gPCBhcmdzLmxlbmd0aCkgewotCQkJU3RyaW5nIHBhdGg9IGFyZ3Nbbl07Ci0JCQlpZiAoREVWX05VTEwuZXF1YWxzKHBhdGgpKQotCQkJCXJldHVybiBudWxsOwotCQkJaW50IHBvcz0gcGF0aC5sYXN0SW5kZXhPZignOicpOwotCQkJaWYgKHBvcyA+PSAwKQotCQkJCXBhdGg9IHBhdGguc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQlpZiAocGF0aDIgIT0gbnVsbCAmJiAhcGF0aDIuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhdGggbWlzbWF0Y2g6ICIgKyBwYXRoMik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoPSBwYXRoMjsKLQkJCX0KLQkJCXJldHVybiBuZXcgUGF0aChwYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBUcmllcyB0byBleHRyYWN0IHR3byBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KLQkgKiBUaGUgcGFyc2luZyBvZiB0aGUgbGluZSBzdGFydHMgYXQgdGhlIHBvc2l0aW9uIGFmdGVyCi0JICogdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGdpdmVuIGNoYXJhY3RlciBzdGFydCBhbiBlbmRzCi0JICogYXQgdGhlIGZpcnN0IGJsYW5rIChvciB0aGUgZW5kIG9mIHRoZSBsaW5lKS4KLQkgKiBJZiBvbmx5IGEgc2luZ2xlIG51bWJlciBpcyBmb3VuZCB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UuCi0JICogSW4gdGhpcyBjYXNlIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgaXMgc2V0IHRvIDEuCi0JICogSWYgYW4gZXJyb3Igb2NjdXJzIHRoZSByYW5nZSAtMSwtMSBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXh0cmFjdFBhaXIoU3RyaW5nIGxpbmUsIGNoYXIgc3RhcnQsIGludFtdIHBhaXIpIHsKLQkJcGFpclswXT0gcGFpclsxXT0gLTE7Ci0JCWludCBzdGFydFBvcz0gbGluZS5pbmRleE9mKHN0YXJ0KTsKLQkJaWYgKHN0YXJ0UG9zIDwgMCkgewotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhcnNpbmcgZXJyb3IgaW4gZXh0cmFjdFBhaXI6IGNvdWxkbid0IGZpbmQgXCciICsgc3RhcnQgKyAiXCciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJbGluZT0gbGluZS5zdWJzdHJpbmcoc3RhcnRQb3MrMSk7Ci0JCWludCBlbmRQb3M9IGxpbmUuaW5kZXhPZignICcpOwotCQlpZiAoZW5kUG9zIDwgMCkgewotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhcnNpbmcgZXJyb3IgaW4gZXh0cmFjdFBhaXI6IGNvdWxkbid0IGZpbmQgZW5kIGJsYW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlsaW5lPSBsaW5lLnN1YnN0cmluZygwLCBlbmRQb3MpOwotCQlpbnQgY29tbWE9IGxpbmUuaW5kZXhPZignLCcpOwotCQlpZiAoY29tbWEgPj0gMCkgewotCQkJcGFpclswXT0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygwLCBjb21tYSkpOwotCQkJcGFpclsxXT0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZyhjb21tYSsxKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWlyWzBdPSAxOwotCQkJcGFpclsxXT0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZyhjb21tYSsxKSk7Ci0JCX0KLQl9Ci0JCi0JLy8tLS0tIGFwcGx5aW5nIGEgcGF0Y2ggZmlsZQotCQotCS8qCi0JICogVHJpZXMgdG8gcGF0Y2ggdGhlIGdpdmVuIGxpbmVzIHdpdGggdGhlIHNwZWNpZmllZCBEaWZmLgotCSAqIEFueSBodW5rIHRoYXQgY291bGRuJ3QgYmUgYXBwbGllZCBpcyByZXR1cm5lZCBpbiB0aGUgbGlzdCBmYWlsZWRIdW5rcy4KLQkgKi8KLQkvKiBwYWNrYWdlICovIHZvaWQgcGF0Y2goRGlmZiBkaWZmLCBMaXN0IGxpbmVzLCBMaXN0IGZhaWxlZEh1bmtzKSB7Ci0JCQotCQlpbnQgc2hpZnQ9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXI9IGRpZmYuZkh1bmtzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSHVuayBodW5rPSAoSHVuaykgaXRlci5uZXh0KCk7Ci0JCQlodW5rLmZNYXRjaGVzPSBmYWxzZTsKLQkJCXNoaWZ0PSBwYXRjaChodW5rLCBsaW5lcywgc2hpZnQsIGZhaWxlZEh1bmtzKTsKLQkJfQotCX0KLQotCS8qCi0JICogVHJpZXMgdG8gYXBwbHkgdGhlIHNwZWNpZmllZCBodW5rIHRvIHRoZSBnaXZlbiBsaW5lcy4KLQkgKiBJZiB0aGUgaHVuayBjYW5ub3QgYmUgYXBwbGllZCBhdCB0aGUgb3JpZ2luYWwgcG9zaXRpb24KLQkgKiB0aGUgbWV0aG9kcyB0cmllcyBGdXp6IGxpbmVzIGJlZm9yZSBhbmQgYWZ0ZXIuCi0JICogSWYgdGhpcyBmYWlscyB0aGUgSHVuayBpcyBhZGRlZCB0byB0aGUgZ2l2ZW4gbGlzdCBvZiBmYWlsZWQgaHVua3MuCi0JICovCi0JcHJpdmF0ZSBpbnQgcGF0Y2goSHVuayBodW5rLCBMaXN0IGxpbmVzLCBpbnQgc2hpZnQsIExpc3QgZmFpbGVkSHVua3MpIHsKLQkJaWYgKHRyeVBhdGNoKGh1bmssIGxpbmVzLCBzaGlmdCkpIHsKLQkJCWlmIChodW5rLmlzRW5hYmxlZCgpKQotCQkJCXNoaWZ0Kz0gZG9QYXRjaChodW5rLCBsaW5lcywgc2hpZnQpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBmb3VuZD0gZmFsc2U7Ci0JCQlpbnQgb2xkU2hpZnQ9IHNoaWZ0OwotCQkJCQkJCi0JCQlmb3IgKGludCBpPSAxOyBpIDw9IGZGdXp6OyBpKyspIHsKLQkJCQlpZiAodHJ5UGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0LWkpKSB7Ci0JCQkJCWlmIChmQWRqdXN0U2hpZnQpCi0JCQkJCQlzaGlmdC09IGk7Ci0JCQkJCWZvdW5kPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghIGZvdW5kKSB7Ci0JCQkJZm9yIChpbnQgaT0gMTsgaSA8PSBmRnV6ejsgaSsrKSB7Ci0JCQkJCWlmICh0cnlQYXRjaChodW5rLCBsaW5lcywgc2hpZnQraSkpIHsKLQkJCQkJCWlmIChmQWRqdXN0U2hpZnQpCi0JCQkJCQkJc2hpZnQrPSBpOwotCQkJCQkJZm91bmQ9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhdGNoZWQgaHVuayBhdCBvZmZzZXQ6ICIgKyAoc2hpZnQtb2xkU2hpZnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNoaWZ0Kz0gZG9QYXRjaChodW5rLCBsaW5lcywgc2hpZnQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmFpbGVkSHVua3MgIT0gbnVsbCkgewotCQkJCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiZmFpbGVkIGh1bmsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmYWlsZWRIdW5rcy5hZGQoaHVuayk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzaGlmdDsKLQl9Ci0JCi0JLyoKLQkgKiBUcmllcyB0byBhcHBseSB0aGUgZ2l2ZW4gaHVuayBvbiB0aGUgc3BlY2lmaWVkIGxpbmVzLgotCSAqIFRoZSBwYXJhbWV0ZXIgc2hpZnQgaXMgYWRkZWQgdG8gdGhlIGxpbmUgbnVtYmVycyBnaXZlbgotCSAqIGluIHRoZSBodW5rLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0cnlQYXRjaChIdW5rIGh1bmssIExpc3QgbGluZXMsIGludCBzaGlmdCkgewotCQlpbnQgcG9zPSBodW5rLmZPbGRTdGFydCArIHNoaWZ0OwotCQlpbnQgZGVsZXRlTWF0Y2hlcz0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGh1bmsuZkxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcz0gaHVuay5mTGluZXNbaV07Ci0JCQlBc3NlcnQuaXNUcnVlKHMubGVuZ3RoKCkgPiAwKTsKLQkJCVN0cmluZyBsaW5lPSBzLnN1YnN0cmluZygxKTsKLQkJCWNoYXIgY29udHJvbENoYXI9IHMuY2hhckF0KDApOwotCQkJaWYgKGNvbnRyb2xDaGFyID09ICcgJykgewkvLyBjb250ZXh0IGxpbmVzCi0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGxpbmVzLnNpemUoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKGxpbmVzTWF0Y2gobGluZSwgKFN0cmluZykgbGluZXMuZ2V0KHBvcykpKSB7Ci0JCQkJCQlwb3MrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2xDaGFyID09ICctJykgewotCQkJCS8vIGRlbGV0ZWQgbGluZXMKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQlpZiAocG9zIDwgMCB8fCBwb3MgPj0gbGluZXMuc2l6ZSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAobGluZXNNYXRjaChsaW5lLCAoU3RyaW5nKSBsaW5lcy5nZXQocG9zKSkpIHsKLQkJCQkJCWRlbGV0ZU1hdGNoZXMrKzsKLQkJCQkJCXBvcysrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGRlbGV0ZU1hdGNoZXMgPD0gMCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJcG9zKys7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjb250cm9sQ2hhciA9PSAnKycpIHsKLQkJCQkvLyBhZGRlZCBsaW5lcwotCQkJCS8vIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIGEgJ3RyeScKLQkJCX0gZWxzZQotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJ0cnlQYXRjaDogdW5rbm93biBjb250cm9sIGNoYXJhY3RlcjogIiArIGNvbnRyb2xDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGludCBkb1BhdGNoKEh1bmsgaHVuaywgTGlzdCBsaW5lcywgaW50IHNoaWZ0KSB7Ci0JCWludCBwb3M9IGh1bmsuZk9sZFN0YXJ0ICsgc2hpZnQ7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBodW5rLmZMaW5lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHM9IGh1bmsuZkxpbmVzW2ldOwotCQkJQXNzZXJ0LmlzVHJ1ZShzLmxlbmd0aCgpID4gMCk7Ci0JCQlTdHJpbmcgbGluZT0gcy5zdWJzdHJpbmcoMSk7Ci0JCQljaGFyIGNvbnRyb2xDaGFyPSBzLmNoYXJBdCgwKTsKLQkJCWlmIChjb250cm9sQ2hhciA9PSAnICcpIHsJLy8gY29udGV4dCBsaW5lcwotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCUFzc2VydC5pc1RydWUocG9zIDwgbGluZXMuc2l6ZSgpLCAiZG9QYXRjaDogaW5jb25zaXN0ZW5jeSBpbiBjb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGxpbmVzTWF0Y2gobGluZSwgKFN0cmluZykgbGluZXMuZ2V0KHBvcykpKSB7Ci0JCQkJCQlwb3MrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXBvcysrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY29udHJvbENoYXIgPT0gJy0nKSB7Ci0JCQkJLy8gZGVsZXRlZCBsaW5lcwkJCQkKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQlBc3NlcnQuaXNUcnVlKHBvcyA8IGxpbmVzLnNpemUoKSwgImRvUGF0Y2g6IGluY29uc2lzdGVuY3kgaW4gZGVsZXRlZCBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChsaW5lc01hdGNoKGxpbmUsIChTdHJpbmcpIGxpbmVzLmdldChwb3MpKSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcG9zKys7Ci0JCQkJfQotCQkJCWxpbmVzLnJlbW92ZShwb3MpOwotCQkJfSBlbHNlIGlmIChjb250cm9sQ2hhciA9PSAnKycpIHsKLQkJCQkvLyBhZGRlZCBsaW5lcwotCQkJCWxpbmVzLmFkZChwb3MsICBsaW5lKTsKLQkJCQlwb3MrKzsKLQkJCX0gZWxzZQotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJkb1BhdGNoOiB1bmtub3duIGNvbnRyb2wgY2hhcmFjdGVyOiAiICsgY29udHJvbENoYXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaHVuay5mTWF0Y2hlcz0gdHJ1ZTsKLQkJcmV0dXJuIGh1bmsuZk5ld0xlbmd0aCAtIGh1bmsuZk9sZExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseUFsbChJUmVzb3VyY2UgdGFyZ2V0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlmaW5hbCBpbnQgV09SS19VTklUPSAxMDsKLQkJCi0JCWludCBpOwotCQkKLQkJSUZpbGUgc2luZ2xlRmlsZT0gbnVsbDsJLy8gZmlsZSB0byBiZSBwYXRjaGVkCi0JCUlDb250YWluZXIgY29udGFpbmVyPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCWNvbnRhaW5lcj0gKElDb250YWluZXIpIHRhcmdldDsKLQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXNpbmdsZUZpbGU9IChJRmlsZSkgdGFyZ2V0OwotCQkJY29udGFpbmVyPSBzaW5nbGVGaWxlLmdldFBhcmVudCgpOwotCQl9IGVsc2UgewotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCX0KLQkJCi0JCS8vIGdldCBhbGwgZmlsZXMgdG8gYmUgbW9kaWZpZWQgaW4gb3JkZXIgdG8gY2FsbCB2YWxpZGF0ZUVkaXQKLQkJTGlzdCBsaXN0PSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzaW5nbGVGaWxlICE9IG51bGwpCi0JCQlsaXN0LmFkZChzaW5nbGVGaWxlKTsKLQkJZWxzZSB7Ci0JCQlmb3IgKGk9IDA7IGkgPCBmRGlmZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlEaWZmIGRpZmY9IGZEaWZmc1tpXTsKLQkJCQlpZiAoZGlmZi5pc0VuYWJsZWQoKSkgewotCQkJCQlzd2l0Y2ggKGRpZmYuZ2V0VHlwZSgpKSB7Ci0JCQkJCWNhc2UgRGlmZmVyZW5jZXIuQ0hBTkdFOgotCQkJCQkJbGlzdC5hZGQoY3JlYXRlUGF0aChjb250YWluZXIsIGdldFBhdGgoZGlmZikpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghIFV0aWxpdGllcy52YWxpZGF0ZVJlc291cmNlcyhsaXN0LCBzaGVsbCwgdGl0bGUpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hlci5UYXNrLm1lc3NhZ2UiKTsJLy8kTk9OLU5MUy0xJAotCQkJcG0uYmVnaW5UYXNrKG1lc3NhZ2UsIGZEaWZmcy5sZW5ndGgqV09SS19VTklUKTsKLQkJfQotCQkKLQkJZm9yIChpPSAwOyBpIDwgZkRpZmZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkKLQkJCWludCB3b3JrVGlja3M9IFdPUktfVU5JVDsKLQkJCQotCQkJRGlmZiBkaWZmPSBmRGlmZnNbaV07Ci0JCQlpZiAoZGlmZi5pc0VuYWJsZWQoKSkgewotCQkJCQotCQkJCUlQYXRoIHBhdGg9IGdldFBhdGgoZGlmZik7Ci0JCQkJaWYgKHBtICE9IG51bGwpCi0JCQkJCXBtLnN1YlRhc2socGF0aC50b1N0cmluZygpKTsKLQkJCQotCQkJCUlGaWxlIGZpbGU9IHNpbmdsZUZpbGUgIT0gbnVsbAotCQkJCQkJCQk/IHNpbmdsZUZpbGUKLQkJCQkJCQkJOiBjcmVhdGVQYXRoKGNvbnRhaW5lciwgcGF0aCk7Ci0JCQkJCQotCQkJCUxpc3QgZmFpbGVkPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCByZXN1bHQ9IG51bGw7Ci0JCQkJCi0JCQkJaW50IHR5cGU9IGRpZmYuZ2V0VHlwZSgpOwotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRGlmZmVyZW5jZXIuQURESVRJT046Ci0JCQkJCS8vIHBhdGNoIGl0IGFuZCBjb2xsZWN0IHJlamVjdGVkIGh1bmtzCi0JCQkJCXJlc3VsdD0gYXBwbHkoZGlmZiwgZmlsZSwgdHJ1ZSwgZmFpbGVkKTsKLQkJCQkJc3RvcmUoY3JlYXRlU3RyaW5nKHJlc3VsdCksIGZpbGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIHdvcmtUaWNrcykpOwotCQkJCQl3b3JrVGlja3MtPSBXT1JLX1VOSVQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRGlmZmVyZW5jZXIuREVMRVRJT046Ci0JCQkJCWZpbGUuZGVsZXRlKHRydWUsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIHdvcmtUaWNrcykpOwotCQkJCQl3b3JrVGlja3MtPSBXT1JLX1VOSVQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRGlmZmVyZW5jZXIuQ0hBTkdFOgotCQkJCQkvLyBwYXRjaCBpdCBhbmQgY29sbGVjdCByZWplY3RlZCBodW5rcwotCQkJCQlyZXN1bHQ9IGFwcGx5KGRpZmYsIGZpbGUsIGZhbHNlLCBmYWlsZWQpOwotCQkJCQlzdG9yZShjcmVhdGVTdHJpbmcocmVzdWx0KSwgZmlsZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgd29ya1RpY2tzKSk7Ci0JCQkJCXdvcmtUaWNrcy09IFdPUktfVU5JVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKGZhaWxlZC5zaXplKCkgPiAwKSB7Ci0JCQkJCUlQYXRoIHBwPSBudWxsOwotCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCXBwPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQkJCXBwPSBwcC5hcHBlbmQocGF0aC5sYXN0U2VnbWVudCgpICsgUkVKRUNUX0ZJTEVfRVhURU5TSU9OKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlwcD0gbmV3IFBhdGgocGF0aC5sYXN0U2VnbWVudCgpICsgUkVKRUNUX0ZJTEVfRVhURU5TSU9OKTsKLQkJCQkJZmlsZT0gY3JlYXRlUGF0aChjb250YWluZXIsIHBwKTsKLQkJCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQkJc3RvcmUoZ2V0UmVqZWN0ZWQoZmFpbGVkKSwgZmlsZSwgcG0pOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlcj0gZmlsZS5jcmVhdGVNYXJrZXIoTUFSS0VSX1RZUEUpOwotCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUGF0Y2hlci5NYXJrZXIubWVzc2FnZSIpKTsJLy8kTk9OLU5MUy0xJAotCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwgSU1hcmtlci5QUklPUklUWV9ISUdIKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBOZWVkV29yawotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpCi0JCQkJCWJyZWFrOwotCQkJCWlmICh3b3JrVGlja3MgPiAwKQotCQkJCQlwbS53b3JrZWQod29ya1RpY2tzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIFJlYWRzIHRoZSBjb250ZW50cyBmcm9tIHRoZSBnaXZlbiBmaWxlIGFuZCByZXR1cm5zIHRoZW0gYXMKLQkgKiBhIExpc3Qgb2YgbGluZXMuCi0JICovCi0JTGlzdCBsb2FkKElGaWxlIGZpbGUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCUxpc3QgbGluZXM9IG51bGw7Ci0JCWlmICghY3JlYXRlICYmIGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcmVhZCBjdXJyZW50IGNvbnRlbnRzCi0JCQlJbnB1dFN0cmVhbSBpcz0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXM9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkKLQkJCQlSZWFkZXIgc3RyZWFtUmVhZGVyPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbVJlYWRlcj0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBVdGlsaXRpZXMuZ2V0Q2hhcnNldChmaWxlKSk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCXN0cmVhbVJlYWRlcj0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKLQkJCQl9Ci0JCQkJCi0JCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyPSBuZXcgQnVmZmVyZWRSZWFkZXIoc3RyZWFtUmVhZGVyKTsKLQkJCQlMaW5lUmVhZGVyIGxyPSBuZXcgTGluZVJlYWRlcihyZWFkZXIpOwotCQkJCWlmICghImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkJLy8kTk9OLU5MUy0xJAotCQkJCQlsci5pZ25vcmVTaW5nbGVDUigpOwotCQkJCWxpbmVzPSBsci5yZWFkTGluZXMoKTsKLQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsaW5lcyA9PSBudWxsKQotCQkJbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGxpbmVzOwotCX0KLQkKLQlMaXN0IGFwcGx5KERpZmYgZGlmZiwgSUZpbGUgZmlsZSwgYm9vbGVhbiBjcmVhdGUsIExpc3QgZmFpbGVkSHVua3MpIHsKLQkJTGlzdCBsaW5lcz0gbG9hZChmaWxlLCBjcmVhdGUpOwotCQlwYXRjaChkaWZmLCBsaW5lcywgZmFpbGVkSHVua3MpOwotCQlyZXR1cm4gbGluZXM7Ci0JfQotCQotCS8qCi0JICogQ29udmVydHMgdGhlIHN0cmluZyBpbnRvIGJ5dGVzIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgZ2l2ZW4gZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmUoU3RyaW5nIGNvbnRlbnRzLCBJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlieXRlW10gYnl0ZXM7Ci0JCXRyeSB7Ci0JCQlieXRlcz0gY29udGVudHMuZ2V0Qnl0ZXMoVXRpbGl0aWVzLmdldENoYXJzZXQoZmlsZSkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHgpIHsKLQkJCS8vIHVzZXMgZGVmYXVsdCBlbmNvZGluZwotCQkJYnl0ZXM9IGNvbnRlbnRzLmdldEJ5dGVzKCk7Ci0JCX0KLQkJCi0JCUlucHV0U3RyZWFtIGlzPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQl0cnkgewotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaWxlLnNldENvbnRlbnRzKGlzLCBmYWxzZSwgdHJ1ZSwgcG0pOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlLmNyZWF0ZShpcywgZmFsc2UsIHBtKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb25jYXRlbmF0ZXMgYWxsIHN0cmluZ3MgZm91bmQgaW4gdGhlIGdpdmVuIExpc3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RyaW5nKExpc3QgbGluZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXI9IGxpbmVzLml0ZXJhdG9yKCk7Ci0JCWlmIChmUHJlc2VydmVMaW5lRGVsaW1pdGVycykgewotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQkJCXNiLmFwcGVuZCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsaW5lU2VwYXJhdG9yPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBsaW5lPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCWludCBsPSBsZW5ndGgobGluZSk7Ci0JCQkJaWYgKGwgPCBsaW5lLmxlbmd0aCgpKSB7CS8vIGxpbmUgaGFzIGRlbGltaXRlcgotCQkJCQlzYi5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgbCkpOwotCQkJCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2IuYXBwZW5kKGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UmVqZWN0ZWQoTGlzdCBmYWlsZWRIdW5rcykgewotCQlpZiAoZmFpbGVkSHVua3Muc2l6ZSgpIDw9IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyBsaW5lU2VwYXJhdG9yPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXI9IGZhaWxlZEh1bmtzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSHVuayBodW5rPSAoSHVuaykgaXRlci5uZXh0KCk7Ci0JCQlzYi5hcHBlbmQoaHVuay5nZXRSZWplY3RlZERlc2NyaXB0aW9uKCkpOwotCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJc2IuYXBwZW5kKGh1bmsuZ2V0Q29udGVudCgpKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBFbnN1cmVzIHRoYXQgYSBmaWxlIHdpdGggdGhlIGdpdmVuIHBhdGggZXhpc3RzIGluCi0JICogdGhlIGdpdmVuIGNvbnRhaW5lci4gRm9sZGVyIGFyZSBjcmVhdGVkIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcml2YXRlIElGaWxlIGNyZWF0ZVBhdGgoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlJRm9sZGVyIGY9IGNvbnRhaW5lci5nZXRGb2xkZXIocGF0aC51cHRvU2VnbWVudCgxKSk7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpCi0JCQkJZi5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJcmV0dXJuIGNyZWF0ZVBhdGgoZiwgcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJfQotCQkvLyBhIGxlYWYKLQkJcmV0dXJuIGNvbnRhaW5lci5nZXRGaWxlKHBhdGgpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVycyByZW1vdmVkLgotCSAqIFdoaXRlc3BhY2UgaXMgZGVmaW5lZCBieSA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKC4uLik8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpcFdoaXRlU3BhY2UoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQljaGFyIGM9IHMuY2hhckF0KGkpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotCQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBDb21wYXJlcyB0d28gc3RyaW5ncy4KLQkgKiBJZiBmSWdub3JlV2hpdGVzcGFjZSBpcyB0cnVlIHdoaXRlc3BhY2UgaXMgaWdub3JlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGluZXNNYXRjaChTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMikgewotCQlpZiAoZklnbm9yZVdoaXRlc3BhY2UpCi0JCQlyZXR1cm4gc3RyaXBXaGl0ZVNwYWNlKGxpbmUxKS5lcXVhbHMoc3RyaXBXaGl0ZVNwYWNlKGxpbmUyKSk7Ci0JCWlmIChmSWdub3JlTGluZURlbGltaXRlcikgewotCQkJaW50IGwxPSBsZW5ndGgobGluZTEpOwotCQkJaW50IGwyPSBsZW5ndGgobGluZTIpOwotCQkJaWYgKGwxICE9IGwyKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBsaW5lMS5yZWdpb25NYXRjaGVzKDAsIGxpbmUyLCAwLCBsMSk7Ci0JCX0KLQkJcmV0dXJuIGxpbmUxLmVxdWFscyhsaW5lMik7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIChleGx1ZGluZyBhIGxpbmUgZGVsaW1pdGVyIENSLCBMRiwgQ1IvTEYpCi0JICogb2YgdGhlIGdpdmVuIHN0cmluZy4KLQkgKi8KLQkvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgbGVuZ3RoKFN0cmluZyBzKSB7Ci0JCWludCBsPSBzLmxlbmd0aCgpOwotCQlpZiAobCA+IDApIHsKLQkJCWNoYXIgYz0gcy5jaGFyQXQobC0xKTsKLQkJCWlmIChjID09ICdccicpCi0JCQkJcmV0dXJuIGwtMTsKLQkJCWlmIChjID09ICdcbicpIHsKLQkJCQlpZiAobCA+IDEgJiYgcy5jaGFyQXQobC0yKSA9PSAnXHInKQotCQkJCQlyZXR1cm4gbC0yOwotCQkJCXJldHVybiBsLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JaW50IGNhbGN1bGF0ZUZ1enooSHVuayBodW5rLCBMaXN0IGxpbmVzLCBpbnQgc2hpZnQsIElQcm9ncmVzc01vbml0b3IgcG0sIGludFtdIGZ1enopIHsKLQkJCi0JCWh1bmsuZk1hdGNoZXM9IGZhbHNlOwotCQlpZiAodHJ5UGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0KSkgewotCQkJc2hpZnQrPSBkb1BhdGNoKGh1bmssIGxpbmVzLCBzaGlmdCk7Ci0JCQlmdXp6WzBdPSAwOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBmb3VuZD0gZmFsc2U7Ci0JCQlpbnQgaHVnZUZ1eno9IGxpbmVzLnNpemUoKTsJLy8gdGhlIG1heGltdW0gd2UgbmVlZCBmb3IgdGhpcyBmaWxlCi0JCQlmdXp6WzBdPSAtMjsJLy8gbm90IGZvdW5kCi0JCQkKLQkJCWZvciAoaW50IGk9IDE7IGkgPD0gaHVnZUZ1eno7IGkrKykgewotCQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJZnV6elswXT0gLTE7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlpZiAodHJ5UGF0Y2goaHVuaywgbGluZXMsIHNoaWZ0LWkpKSB7Ci0JCQkJCWZ1enpbMF09IGk7Ci0JCQkJCWlmIChmQWRqdXN0U2hpZnQpCi0JCQkJCQlzaGlmdC09IGk7Ci0JCQkJCWZvdW5kPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghIGZvdW5kKSB7Ci0JCQkJZm9yIChpbnQgaT0gMTsgaSA8PSBodWdlRnV6ejsgaSsrKSB7Ci0JCQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCWZ1enpbMF09IC0xOwotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkJCQkJaWYgKHRyeVBhdGNoKGh1bmssIGxpbmVzLCBzaGlmdCtpKSkgewotCQkJCQkJZnV6elswXT0gaTsKLQkJCQkJCWlmIChmQWRqdXN0U2hpZnQpCi0JCQkJCQkJc2hpZnQrPSBpOwotCQkJCQkJZm91bmQ9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGZvdW5kKQotCQkJCXNoaWZ0Kz0gZG9QYXRjaChodW5rLCBsaW5lcywgc2hpZnQpOwotCQl9Ci0JCXJldHVybiBzaGlmdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QcmV2aWV3UGF0Y2hQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9pbnRlcm5hbC9wYXRjaC9QcmV2aWV3UGF0Y2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNWQ1YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvaW50ZXJuYWwvcGF0Y2gvUHJldmlld1BhdGNoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLnBhdGNoOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5EaWZmSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JQ29tcGFyZUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci4qOwotCi0KLS8qKgotICogU2hvd3MgdGhlIHBhcnNlZCBwYXRjaCBmaWxlIGFuZCBhbnkgbWlzbWF0Y2hlcwotICogYmV0d2VlbiBmaWxlcywgaHVua3MgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAqIHJlc291cmNlcy4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBQcmV2aWV3UGF0Y2hQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JCQotCS8qKgotCSAqIFVzZWQgd2l0aCBDb21wYXJlSW5wdXQKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSHVua0lucHV0IGltcGxlbWVudHMgSVR5cGVkRWxlbWVudCwgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNj0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZDb250ZW50OwotCQlTdHJpbmcgZlR5cGU7Ci0JCQotCQlIdW5rSW5wdXQoU3RyaW5nIHR5cGUsIFN0cmluZyBzKSB7Ci0JCQlmVHlwZT0gdHlwZTsKLQkJCWZDb250ZW50PSBzOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5Ob05hbWUudGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIGZUeXBlOwotCQl9Ci0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHsKLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVXRpbGl0aWVzLmdldEJ5dGVzKGZDb250ZW50LCBVVEZfMTYpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB7Ci0JCQlyZXR1cm4gVVRGXzE2OwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIFBhdGNoV2l6YXJkIGZQYXRjaFdpemFyZDsKLQkKLQlwcml2YXRlIFRyZWUgZlRyZWU7Ci0JcHJpdmF0ZSBDb21ibyBmU3RyaXBQcmVmaXhTZWdtZW50czsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZIdW5rVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGZJZ25vcmVXaGl0ZXNwYWNlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGZSZXZlcnNlUGF0Y2hCdXR0b247Ci0JcHJpdmF0ZSBUZXh0IGZGdXp6RmllbGQ7Ci0JCi0JcHJpdmF0ZSBJbWFnZVtdIGZJbWFnZXM9IG5ldyBJbWFnZVs2XTsJCi0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JCi0JCi0JLyogcGFja2FnZSAqLyBQcmV2aWV3UGF0Y2hQYWdlKFBhdGNoV2l6YXJkIHB3KSB7Ci0JCXN1cGVyKCJQcmV2aWV3UGF0Y2hQYWdlIiwJLy8kTk9OLU5MUy0xJCAKLQkJCVBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLnRpdGxlIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQotCQlzZXRNZXNzYWdlKFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLm1lc3NhZ2UiKSk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCWZQYXRjaFdpemFyZD0gcHc7Ci0JCS8vc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCi0JCWludCB3PSAxNjsKLQkJCi0JCUltYWdlRGVzY3JpcHRvciBhZGRJZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvYWRkX292LmdpZiIpOwkvLyROT04tTkxTLTEkCi0JCUltYWdlRGVzY3JpcHRvciBkZWxJZD0gQ29tcGFyZVVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib3ZyMTYvZGVsX292LmdpZiIpOwkvLyROT04tTkxTLTEkCi0KLQkJSW1hZ2VEZXNjcmlwdG9yIGVycklkPSBDb21wYXJlVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvdnIxNi9lcnJvcl9vdi5naWYiKTsJLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBlcnJJbT0gZXJySWQuY3JlYXRlSW1hZ2UoKTsKLQkJCi0JCWZJbWFnZXNbMF09IG5ldyBEaWZmSW1hZ2UobnVsbCwgbnVsbCwgdykuY3JlYXRlSW1hZ2UoKTsKLQkJZkltYWdlc1sxXT0gbmV3IERpZmZJbWFnZShudWxsLCBhZGRJZCwgdykuY3JlYXRlSW1hZ2UoKTsKLQkJZkltYWdlc1syXT0gbmV3IERpZmZJbWFnZShudWxsLCBkZWxJZCwgdykuY3JlYXRlSW1hZ2UoKTsKLQotCQlmSW1hZ2VzWzNdPSBuZXcgRGlmZkltYWdlKGVyckltLCBudWxsLCB3KS5jcmVhdGVJbWFnZSgpOwotCQlmSW1hZ2VzWzRdPSBuZXcgRGlmZkltYWdlKGVyckltLCBhZGRJZCwgdykuY3JlYXRlSW1hZ2UoKTsKLQkJZkltYWdlc1s1XT0gbmV3IERpZmZJbWFnZShlcnJJbSwgZGVsSWQsIHcpLmNyZWF0ZUltYWdlKCk7Ci0JCQotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb249IG5ldyBDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQkKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldExlZnRFZGl0YWJsZShmYWxzZSk7Ci0JCWZDb21wYXJlQ29uZmlndXJhdGlvbi5zZXRMZWZ0TGFiZWwoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuTGVmdC50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnNldFJpZ2h0RWRpdGFibGUoZmFsc2UpOwotCQlmQ29tcGFyZUNvbmZpZ3VyYXRpb24uc2V0UmlnaHRMYWJlbChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5SaWdodC50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIFdpemFyZFBhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAodmlzaWJsZSkKLQkJCWJ1aWxkVHJlZSgpOwotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCX0KLQotCUltYWdlIGdldEltYWdlKERpZmYgZGlmZikgewotCQlpZiAoZGlmZi5mTWF0Y2hlcykgewotCQkJc3dpdGNoIChkaWZmLmdldFR5cGUoKSkgewotCQkJY2FzZSBEaWZmZXJlbmNlci5BRERJVElPTjoKLQkJCQlyZXR1cm4gZkltYWdlc1sxXTsKLQkJCWNhc2UgRGlmZmVyZW5jZXIuREVMRVRJT046Ci0JCQkJcmV0dXJuIGZJbWFnZXNbMl07Ci0JCQl9Ci0JCQlyZXR1cm4gZkltYWdlc1swXTsKLQkJfQotCQlzd2l0Y2ggKGRpZmYuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgRGlmZmVyZW5jZXIuQURESVRJT046Ci0JCQlyZXR1cm4gZkltYWdlc1s0XTsKLQkJY2FzZSBEaWZmZXJlbmNlci5ERUxFVElPTjoKLQkJCXJldHVybiBmSW1hZ2VzWzVdOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VzWzNdOwotCX0KLQkKLQlJbWFnZSBnZXRJbWFnZShIdW5rIGh1bmspIHsKLQkJaWYgKGh1bmsuZk1hdGNoZXMpCi0JCQlyZXR1cm4gZkltYWdlc1swXTsKLQkJcmV0dXJuIGZJbWFnZXNbM107Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgSUNvbXBhcmVDb250ZXh0SWRzLlBBVENIX1BSRVZJRVdfV0laQVJEX1BBR0UpOwkJCi0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQkKLQkJYnVpbGRQYXRjaE9wdGlvbnNHcm91cChjb21wb3NpdGUpOwotCQkKLQkJU3BsaXR0ZXIgc3BsaXR0ZXI9IG5ldyBTcGxpdHRlcihjb21wb3NpdGUsIFNXVC5WRVJUSUNBTCk7Ci0JCXNwbGl0dGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0KLQkJCi0JCS8vIHRvcCBwYW5lIHNob3dpbmcgZGlmZnMgYW5kIGh1bmtzIGluIGEgY2hlY2sgYm94IHRyZWUgCi0JCWZUcmVlPSBuZXcgVHJlZShzcGxpdHRlciwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCQlmVHJlZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQkKLQkJLy8gYm90dG9tIHBhbmUgc2hvd2luZyBodW5rcyBpbiBjb21wYXJlIHZpZXdlciAKLQkJZkh1bmtWaWV3ZXI9IG5ldyBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZShzcGxpdHRlciwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKSB7Ci0JCQlwcm90ZWN0ZWQgVmlld2VyIGdldFZpZXdlcihWaWV3ZXIgb2xkVmlld2VyLCBPYmplY3QgaW5wdXQpIHsKLQkJCQlyZXR1cm4gQ29tcGFyZVVJLmZpbmRDb250ZW50Vmlld2VyKG9sZFZpZXdlciwgKElDb21wYXJlSW5wdXQpaW5wdXQsIHRoaXMsIGZDb21wYXJlQ29uZmlndXJhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JCWdkPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCQlmSHVua1ZpZXdlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCS8vIHJlZ2lzdGVyIGxpc3RlbmVycwotCQkKLQkJZlRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVRyZWVJdGVtIHRpPSAoVHJlZUl0ZW0pIGUuaXRlbTsKLQkJCQkJT2JqZWN0IGRhdGE9IGUuaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLQkJCQkJCWJvb2xlYW4gY2hlY2tlZD0gdGkuZ2V0Q2hlY2tlZCgpOwotCQkJCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBIdW5rKSB7Ci0JCQkJCQkJSHVuayBodW5rPSAoSHVuaykgZGF0YTsKLQkJCQkJCQljaGVja2VkPSBjaGVja2VkICYmIGh1bmsuZk1hdGNoZXM7Ci0JCQkJCQkJLy9odW5rLnNldEVuYWJsZWQoY2hlY2tlZCk7Ci0JCQkJCQkJdGkuc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkJCQkJCQl1cGRhdGVHcmF5ZWRTdGF0ZSh0aSk7Ci0JCQkJCQl9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBEaWZmKSB7Ci0JCQkJCQkJdXBkYXRlQ2hlY2tlZFN0YXRlKHRpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChkYXRhIGluc3RhbmNlb2YgSHVuaykKLQkJCQkJCQlQcmV2aWV3UGF0Y2hQYWdlLnRoaXMuZkh1bmtWaWV3ZXIuc2V0SW5wdXQoY3JlYXRlSW5wdXQoKEh1bmspZGF0YSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCVByZXZpZXdQYXRjaFBhZ2UudGhpcy5mSHVua1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZlRyZWUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmIChmSW1hZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZJbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChmSW1hZ2VzW2ldID09IG51bGwpCi0JCQkJCQkJZkltYWdlc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJZkltYWdlcz0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvLyBjcmVhdGluZyB0cmVlJ3MgY29udGVudAotCQlidWlsZFRyZWUoKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwkJCi0JfQotCQotCS8qCi0JICoJQ3JlYXRlIHRoZSBncm91cCBmb3Igc2V0dGluZyB2YXJpb3VzIHBhdGNoIG9wdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRQYXRjaE9wdGlvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlHcmlkTGF5b3V0IGdsOwotCQlHcmlkRGF0YSBnZDsKLQkJTGFiZWwgbDsKLQkJCQkKLQkJZmluYWwgUGF0Y2hlciBwYXRjaGVyPSBmUGF0Y2hXaXphcmQuZ2V0UGF0Y2hlcigpOwotCQkKLQkJR3JvdXAgZ3JvdXA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5QYXRjaE9wdGlvbnMudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2w9IG5ldyBHcmlkTGF5b3V0KCk7IGdsLm51bUNvbHVtbnM9IDQ7IGdsLm1hcmdpbkhlaWdodD0gMDsKLQkJZ3JvdXAuc2V0TGF5b3V0KGdsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8vIDFzdCByb3cKLQkJCi0JCUNvbXBvc2l0ZSBwYWlyPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdsPSBuZXcgR3JpZExheW91dCgpOyBnbC5udW1Db2x1bW5zPSAyOyBnbC5tYXJnaW5IZWlnaHQ9IGdsLm1hcmdpbldpZHRoPSAwOwotCQlwYWlyLnNldExheW91dChnbCk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJcGFpci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCQlsPSBuZXcgTGFiZWwocGFpciwgU1dULk5PTkUpOwotCQkJbC5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLklnbm9yZVNlZ21lbnRzLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJZlN0cmlwUHJlZml4U2VnbWVudHM9IG5ldyBDb21ibyhwYWlyLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSB8IFNXVC5TSU1QTEUpOwotCQkJaW50IHByZWZpeENudD0gcGF0Y2hlci5nZXRTdHJpcFByZWZpeFNlZ21lbnRzKCk7Ci0JCQlTdHJpbmcgcHJlZml4PSBJbnRlZ2VyLnRvU3RyaW5nKHByZWZpeENudCk7Ci0JCQlmU3RyaXBQcmVmaXhTZWdtZW50cy5hZGQocHJlZml4KTsKLQkJCWZTdHJpcFByZWZpeFNlZ21lbnRzLnNldFRleHQocHJlZml4KTsKLQkJCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZlN0cmlwUHJlZml4U2VnbWVudHMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlhZGRTcGFjZXIoZ3JvdXApOwotCQkKLQkJZlJldmVyc2VQYXRjaEJ1dHRvbj0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJZlJldmVyc2VQYXRjaEJ1dHRvbi5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLlJldmVyc2VQYXRjaC50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhZGRTcGFjZXIoZ3JvdXApOwotCQkKLQkJLy8gMm5kIHJvdwotCQlwYWlyPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdsPSBuZXcgR3JpZExheW91dCgpOyBnbC5udW1Db2x1bW5zPSAzOyBnbC5tYXJnaW5IZWlnaHQ9IGdsLm1hcmdpbldpZHRoPSAwOwotCQlwYWlyLnNldExheW91dChnbCk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJcGFpci5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkJCWw9IG5ldyBMYWJlbChwYWlyLCBTV1QuTk9ORSk7Ci0JCQlsLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuRnV6ekZhY3Rvci50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQlsLnNldFRvb2xUaXBUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkZ1enpGYWN0b3IudG9vbHRpcCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlsLnNldExheW91dERhdGEoZ2QpOwotCQkJCQkJCi0JCQlmRnV6ekZpZWxkPSBuZXcgVGV4dChwYWlyLCBTV1QuQk9SREVSKTsKLQkJCWZGdXp6RmllbGQuc2V0VGV4dCgiMiIpOyAvLyROT04tTkxTLTEkCi0JCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUiB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsgZ2Qud2lkdGhIaW50PSAzMDsKLQkJCWZGdXp6RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCQlCdXR0b24gYj0gbmV3IEJ1dHRvbihwYWlyLCBTV1QuUFVTSCk7Ci0JCQliLnNldFRleHQoUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuR3Vlc3NGdXp6LnRleHQiKSk7CS8vJE5PTi1OTFMtMSQKLQkJCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWludCBmdXp6PSBndWVzc0Z1enpGYWN0b3IocGF0Y2hlcik7Ci0JCQkJCQlpZiAoZnV6eiA+PSAwKQotCQkJCQkJCWZGdXp6RmllbGQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGZ1enopKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQliLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJYWRkU3BhY2VyKGdyb3VwKTsKLQkJCi0JCWZJZ25vcmVXaGl0ZXNwYWNlQnV0dG9uPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmSWdub3JlV2hpdGVzcGFjZUJ1dHRvbi5zZXRUZXh0KFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLklnbm9yZVdoaXRlc3BhY2UudGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYWRkU3BhY2VyKGdyb3VwKTsKLQkJCQkKLQkJLy8gcmVnaXN0ZXIgbGlzdGVuZXJzCi0JCQkKLQkJaWYgKGZTdHJpcFByZWZpeFNlZ21lbnRzICE9IG51bGwpIAotCQkJZlN0cmlwUHJlZml4U2VnbWVudHMuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWlmIChwYXRjaGVyLnNldFN0cmlwUHJlZml4U2VnbWVudHMoZ2V0U3RyaXBQcmVmaXhTZWdtZW50cygpKSkKLQkJCQkJCQl1cGRhdGVUcmVlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlmUmV2ZXJzZVBhdGNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAocGF0Y2hlci5zZXRSZXZlcnNlZChmUmV2ZXJzZVBhdGNoQnV0dG9uLmdldFNlbGVjdGlvbigpKSkKLQkJCQkJCXVwZGF0ZVRyZWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZJZ25vcmVXaGl0ZXNwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAocGF0Y2hlci5zZXRJZ25vcmVXaGl0ZXNwYWNlKGZJZ25vcmVXaGl0ZXNwYWNlQnV0dG9uLmdldFNlbGVjdGlvbigpKSkKLQkJCQkJCXVwZGF0ZVRyZWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlmRnV6ekZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAocGF0Y2hlci5zZXRGdXp6KGdldEZ1enpGYWN0b3IoKSkpCi0JCQkJCQl1cGRhdGVUcmVlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIGludCBndWVzc0Z1enpGYWN0b3IoZmluYWwgUGF0Y2hlciBwYXRjaGVyKSB7Ci0JCWZpbmFsIGludCBzdHJpcD0gZ2V0U3RyaXBQcmVmaXhTZWdtZW50cygpOwotCQlmaW5hbCBpbnRbXSByZXN1bHQ9IG5ldyBpbnRbMV07Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCB0cnVlLAotCQkJLy9UaW1lb3V0Q29udGV4dC5ydW4odHJ1ZSwgR1VFU1NfVElNRU9VVCwgZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQkJbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJcmVzdWx0WzBdPSBndWVzcyhwYXRjaGVyLCBtb25pdG9yLCBzdHJpcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gTmVlZFdvcmsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIE5lZWRXb3JrCi0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwcml2YXRlIGludCBndWVzcyhQYXRjaGVyIHBhdGNoZXIsIElQcm9ncmVzc01vbml0b3IgcG0sIGludCBzdHJpcCkgewotCQkKLQkJRGlmZltdIGRpZmZzPSBwYXRjaGVyLmdldERpZmZzKCk7Ci0JCWlmIChkaWZmcyA9PSBudWxsIHx8IGRpZmZzLmxlbmd0aCA8PSAwKQotCQkJcmV0dXJuIC0xOwotCQkKLQkJLy8gbm93IGNvbGxlY3QgZmlsZXMgYW5kIGRldGVybWluZSAid29yayIKLQkJSUZpbGVbXSBmaWxlcz0gbmV3IElGaWxlW2RpZmZzLmxlbmd0aF07Ci0JCWludCB3b3JrPSAwOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZGlmZnMubGVuZ3RoOyBpKyspIHsKLQkJCURpZmYgZGlmZj0gZGlmZnNbaV07Ci0JCQlpZiAoZGlmZiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRpZmYuZ2V0VHlwZSgpICE9IERpZmZlcmVuY2VyLkFERElUSU9OKSB7Ci0JCQkJSVBhdGggcD0gZGlmZi5mT2xkUGF0aDsKLQkJCQlpZiAoc3RyaXAgPiAwICYmIHN0cmlwIDwgcC5zZWdtZW50Q291bnQoKSkKLQkJCQkJcD0gcC5yZW1vdmVGaXJzdFNlZ21lbnRzKHN0cmlwKTsKLQkJCQlJRmlsZSBmaWxlPSBleGlzdHNJblNlbGVjdGlvbihwKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWZpbGVzW2ldPSBmaWxlOwotCQkJCQl3b3JrKz0gZGlmZi5mSHVua3Muc2l6ZSgpOwotCQkJCX0KLQkJCX0JCi0JCX0KLQkJCi0JCS8vIGRvIHRoZSAid29yayIKLQkJaW50W10gZnV6elJlZj0gbmV3IGludFsxXTsKLQkJU3RyaW5nIGZvcm1hdD0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuR3Vlc3NGdXp6UHJvZ3Jlc3MuZm9ybWF0Iik7CS8vJE5PTi1OTFMtMSQKLQkJcG0uYmVnaW5UYXNrKFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkd1ZXNzRnV6elByb2dyZXNzLnRleHQiKSwgd29yayk7CS8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWludCBmdXp6PSAwOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpZmZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRGlmZiBkPSBkaWZmc1tpXTsKLQkJCQlJRmlsZSBmaWxlPSBmaWxlc1tpXTsKLQkJCQlpZiAoZCAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCkgewotCQkJCQlMaXN0IGxpbmVzPSBwYXRjaGVyLmxvYWQoZmlsZSwgZmFsc2UpOwotCQkJCQlTdHJpbmcgbmFtZT0gZC5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCQkJSXRlcmF0b3IgaXRlcj0gZC5mSHVua3MuaXRlcmF0b3IoKTsKLQkJCQkJaW50IHNoaWZ0PSAwOwotCQkJCQlmb3IgKGludCBoY250PSAxOyBpdGVyLmhhc05leHQoKTsgaGNudCsrKSB7Ci0JCQkJCQlwbS5zdWJUYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IFN0cmluZ1tdIHsgbmFtZSwgSW50ZWdlci50b1N0cmluZyhoY250KSB9ICkpOwotCQkJCQkJSHVuayBoPSAoSHVuaykgaXRlci5uZXh0KCk7Ci0JCQkJCQlzaGlmdD0gcGF0Y2hlci5jYWxjdWxhdGVGdXp6KGgsIGxpbmVzLCBzaGlmdCwgcG0sIGZ1enpSZWYpOwotCQkJCQkJaW50IGY9IGZ1enpSZWZbMF07Ci0JCQkJCQlpZiAoZiA9PSAtMSkJLy8gY2FuY2VsCi0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQkJaWYgKGYgPiBmdXp6KQotCQkJCQkJCWZ1eno9IGY7Ci0JCQkJCQlwbS53b3JrZWQoMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZnV6ejsKLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQkKLQlJQ29tcGFyZUlucHV0IGNyZWF0ZUlucHV0KEh1bmsgaHVuaykgewotCQkKLQkJU3RyaW5nW10gbGluZXM9IGh1bmsuZkxpbmVzOwotCQlTdHJpbmdCdWZmZXIgbGVmdD0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgcmlnaHQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxpbmU9IGxpbmVzW2ldOwotCQkJU3RyaW5nIHJlc3Q9IGxpbmUuc3Vic3RyaW5nKDEpOwotCQkJc3dpdGNoIChsaW5lLmNoYXJBdCgwKSkgewotCQkJY2FzZSAnICc6Ci0JCQkJbGVmdC5hcHBlbmQocmVzdCk7Ci0JCQkJcmlnaHQuYXBwZW5kKHJlc3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnLSc6Ci0JCQkJbGVmdC5hcHBlbmQocmVzdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcrJzoKLQkJCQlyaWdodC5hcHBlbmQocmVzdCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCURpZmYgZGlmZj0gaHVuay5mUGFyZW50OwotCQlJUGF0aCBwYXRoPSBkaWZmLmdldFBhdGgoKTsKLQkJU3RyaW5nIHR5cGU9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkKLQkJcmV0dXJuIG5ldyBEaWZmTm9kZShuZXcgSHVua0lucHV0KHR5cGUsIGxlZnQudG9TdHJpbmcoKSksIG5ldyBIdW5rSW5wdXQodHlwZSwgcmlnaHQudG9TdHJpbmcoKSkpOwotCX0JCQotCQotCS8qKgotCSAqIEJ1aWxkcyBhIHRyZWUgZnJvbSBsaXN0IG9mIERpZmZzLgotCSAqIEFzIGEgc2lkZSBlZmZlY3QgaXQgY2FsY3VsYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMKLQkgKiBpbiBhbGwgcGF0aHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZSgpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQlpZiAoZlRyZWUgIT0gbnVsbCAmJiAhZlRyZWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmVHJlZS5yZW1vdmVBbGwoKTsKLQkJCWZIdW5rVmlld2VyLnNldElucHV0KG51bGwpOwotCQkJCi0JCQlpbnQgbGVuZ3RoPSA5OTsKLQkJCQotCQkJRGlmZltdIGRpZmZzPSBmUGF0Y2hXaXphcmQuZ2V0UGF0Y2hlcigpLmdldERpZmZzKCk7CQkJCi0JCQlpZiAoZGlmZnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBkaWZmcy5sZW5ndGg7IGkrKykgewotCQkJCQlEaWZmIGRpZmY9IGRpZmZzW2ldOwotCQkJCQlUcmVlSXRlbSBkPSBuZXcgVHJlZUl0ZW0oZlRyZWUsIFNXVC5OVUxMKTsKLQkJCQkJZC5zZXREYXRhKGRpZmYpOwotCQkJCQlkLnNldEltYWdlKGdldEltYWdlKGRpZmYpKTsKLQkJCQkJCi0JCQkJCWlmIChkaWZmLmZPbGRQYXRoICE9IG51bGwpCi0JCQkJCQlsZW5ndGg9IE1hdGgubWluKGxlbmd0aCwgZGlmZi5mT2xkUGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCWlmIChkaWZmLmZOZXdQYXRoICE9IG51bGwpCi0JCQkJCQlsZW5ndGg9IE1hdGgubWluKGxlbmd0aCwgZGlmZi5mTmV3UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCQotCQkJCQlqYXZhLnV0aWwuTGlzdCBodW5rcz0gZGlmZi5mSHVua3M7Ci0JCQkJCWphdmEudXRpbC5JdGVyYXRvciBpdGVyPSBodW5rcy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUh1bmsgaHVuaz0gKEh1bmspIGl0ZXIubmV4dCgpOwotCQkJCQkJVHJlZUl0ZW0gaD0gbmV3IFRyZWVJdGVtKGQsIFNXVC5OVUxMKTsKLQkJCQkJCWguc2V0RGF0YShodW5rKTsKLQkJCQkJCWguc2V0VGV4dChodW5rLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZTdHJpcFByZWZpeFNlZ21lbnRzICE9IG51bGwgJiYgbGVuZ3RoICE9IDk5KQotCQkJCWZvciAoaW50IGk9IDE7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQkJZlN0cmlwUHJlZml4U2VnbWVudHMuYWRkKEludGVnZXIudG9TdHJpbmcoaSkpOwotCQl9Ci0JCQotCQl1cGRhdGVUcmVlKCk7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZXhpc3RzSW5TZWxlY3Rpb24oSVBhdGggcGF0aCkgewotCQlJUmVzb3VyY2UgdGFyZ2V0PSBmUGF0Y2hXaXphcmQuZ2V0VGFyZ2V0KCk7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSkgewkvLyBzcGVjaWFsIGNhc2UKLQkJCUlGaWxlIGZpbGU9IChJRmlsZSkgdGFyZ2V0OwotCQkJaWYgKG1hdGNoZXMoZmlsZS5nZXRGdWxsUGF0aCgpLCBwYXRoKSkKLQkJCQlyZXR1cm4gZmlsZTsKLQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlJQ29udGFpbmVyIGM9IChJQ29udGFpbmVyKSB0YXJnZXQ7Ci0JCQlpZiAoYy5leGlzdHMocGF0aCkpCi0JCQkJcmV0dXJuIGMuZ2V0RmlsZShwYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgcGF0aCBjb21wbGV0ZWx5IG1hdGNoZXMgdGhlIGVuZCBvZiBmdWxscGF0aAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKElQYXRoIGZ1bGxwYXRoLCBJUGF0aCBwYXRoKSB7Ci0JCQotCQlmb3IgKElQYXRoIHA9IGZ1bGxwYXRoOyBwYXRoLnNlZ21lbnRDb3VudCgpIDw9IHAuc2VnbWVudENvdW50KCk7IHA9IHAucmVtb3ZlRmlyc3RTZWdtZW50cygxKSkgewotCQkJaWYgKHAuZXF1YWxzKHBhdGgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyBsYWJlbCBhbmQgY2hlY2tlZCBzdGF0ZSBvZiB0cmVlIGl0ZW1zLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUcmVlKCkgewotCQlpZiAoZlRyZWUgPT0gbnVsbCB8fCBmVHJlZS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCWludCBzdHJpcD0gZ2V0U3RyaXBQcmVmaXhTZWdtZW50cygpOwotCQlUcmVlSXRlbVtdIGNoaWxkcmVuPSBmVHJlZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW09IGNoaWxkcmVuW2ldOwotCQkJRGlmZiBkaWZmPSAoRGlmZikgaXRlbS5nZXREYXRhKCk7Ci0JCQlkaWZmLmZNYXRjaGVzPSBmYWxzZTsKLQkJCVN0cmluZyBlcnJvcj0gbnVsbDsKLQkJCQotCQkJYm9vbGVhbiBjcmVhdGU9IGZhbHNlOwkKLQkJCUlGaWxlIGZpbGU9IG51bGw7Ci0JCQlpZiAoZGlmZi5nZXRUeXBlKCkgPT0gRGlmZmVyZW5jZXIuQURESVRJT04pIHsKLQkJCQlJUGF0aCBwPSBkaWZmLmZOZXdQYXRoOwotCQkJCWlmIChzdHJpcCA+IDAgJiYgc3RyaXAgPCBwLnNlZ21lbnRDb3VudCgpKQotCQkJCQlwPSBwLnJlbW92ZUZpcnN0U2VnbWVudHMoc3RyaXApOwotCQkJCWZpbGU9IGV4aXN0c0luU2VsZWN0aW9uKHApOwotCQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQkJZGlmZi5mTWF0Y2hlcz0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBmaWxlIGFscmVhZHkgZXhpc3RzCi0JCQkJCWVycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5GaWxlRXhpc3RzLmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY3JlYXRlPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlJUGF0aCBwPSBkaWZmLmZPbGRQYXRoOwotCQkJCWlmIChzdHJpcCA+IDAgJiYgc3RyaXAgPCBwLnNlZ21lbnRDb3VudCgpKQotCQkJCQlwPSBwLnJlbW92ZUZpcnN0U2VnbWVudHMoc3RyaXApOwotCQkJCWZpbGU9IGV4aXN0c0luU2VsZWN0aW9uKHApOwotCQkJCWRpZmYuZk1hdGNoZXM9IGZhbHNlOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkvLyBmaWxlIGlzIHJlYWRvbmx5Ci0JCQkJCQllcnJvcj0gUGF0Y2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByZXZpZXdQYXRjaFBhZ2UuRmlsZUlzUmVhZE9ubHkuZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZT0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRpZmYuZk1hdGNoZXM9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBmaWxlIGRvZXNuJ3QgZXhpc3QKLQkJCQkJZXJyb3I9IFBhdGNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmV2aWV3UGF0Y2hQYWdlLkZpbGVEb2VzTm90RXhpc3QuZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJQXJyYXlMaXN0IGZhaWxlZEh1bmtzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlQYXRjaGVyIHBhdGNoZXI9IGZQYXRjaFdpemFyZC5nZXRQYXRjaGVyKCk7Ci0JCQlwYXRjaGVyLnNldEZ1enooZ2V0RnV6ekZhY3RvcigpKTsKLQkJCXBhdGNoZXIuYXBwbHkoZGlmZiwgZmlsZSwgY3JlYXRlLCBmYWlsZWRIdW5rcyk7Ci0KLQkJCWlmIChmYWlsZWRIdW5rcy5zaXplKCkgPiAwKQotCQkJCWRpZmYuZlJlamVjdGVkPSBmUGF0Y2hXaXphcmQuZ2V0UGF0Y2hlcigpLmdldFJlamVjdGVkKGZhaWxlZEh1bmtzKTsKLQkJCQotCQkJaW50IGNoZWNrZWRTdWJzPSAwOwkvLyBjb3VudHMgY2hlY2tlZCBodW5rIGl0ZW1zCi0JCQlUcmVlSXRlbVtdIGh1bmtJdGVtcz0gaXRlbS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaD0gMDsgaCA8IGh1bmtJdGVtcy5sZW5ndGg7IGgrKykgewotCQkJCUh1bmsgaHVuaz0gKEh1bmspIGh1bmtJdGVtc1toXS5nZXREYXRhKCk7Ci0JCQkJYm9vbGVhbiBmYWlsZWQ9IGZhaWxlZEh1bmtzLmNvbnRhaW5zKGh1bmspOwotCQkJCVN0cmluZyBodW5rRXJyb3I9IG51bGw7Ci0JCQkJaWYgKGZhaWxlZCkKLQkJCQkJaHVua0Vycm9yPSBQYXRjaE1lc3NhZ2VzLmdldFN0cmluZygiUHJldmlld1BhdGNoUGFnZS5Ob01hdGNoLmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWJvb2xlYW4gY2hlY2s9ICFmYWlsZWQ7Ci0JCQkJaHVua0l0ZW1zW2hdLnNldENoZWNrZWQoY2hlY2spOwotCQkJCWlmIChjaGVjaykKLQkJCQkJY2hlY2tlZFN1YnMrKzsKLQotCQkJCVN0cmluZyBodW5rTGFiZWw9IGh1bmsuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoaHVua0Vycm9yICE9IG51bGwpCi0JCQkJCWh1bmtMYWJlbCs9ICIgICAiICsgaHVua0Vycm9yOyAvLyROT04tTkxTLTEkCi0JCQkJaHVua0l0ZW1zW2hdLnNldFRleHQoaHVua0xhYmVsKTsKLQkJCQlodW5rSXRlbXNbaF0uc2V0SW1hZ2UoZ2V0SW1hZ2UoaHVuaykpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgbGFiZWw9IGRpZmYuZ2V0RGVzY3JpcHRpb24oc3RyaXApOwotCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJbGFiZWwrPSAiICAgICIgKyBlcnJvcjsgLy8kTk9OLU5MUy0xJAotCQkJaXRlbS5zZXRUZXh0KGxhYmVsKTsKLQkJCWl0ZW0uc2V0SW1hZ2UoZ2V0SW1hZ2UoZGlmZikpOwotCQkJaXRlbS5zZXRDaGVja2VkKGNoZWNrZWRTdWJzID4gMCk7Ci0JCQlib29sZWFuIGdyYXk9IChjaGVja2VkU3VicyA+IDAgJiYgIGNoZWNrZWRTdWJzIDwgaHVua0l0ZW1zLmxlbmd0aCk7Ci0JCQlpdGVtLnNldEdyYXllZChncmF5KTsKLQkJCWl0ZW0uc2V0RXhwYW5kZWQoZ3JheSk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHVwZGF0ZU1vZGVsKCkpOwotCX0KLQkKLQkvKgotCSAqIFVwZGF0ZXMgdGhlIGdyYXkgc3RhdGUgb2YgdGhlIGdpdmVuIGRpZmYgYW5kIHRoZSBjaGVja2VkIHN0YXRlIG9mIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlKFRyZWVJdGVtIGRpZmZJdGVtKSB7Ci0JCWJvb2xlYW4gY2hlY2tlZD0gZGlmZkl0ZW0uZ2V0Q2hlY2tlZCgpOwotCQkvLyBjaGVjayB3aGV0aGVyIHdlIGNhbiBlbmFibGUgYWxsIGh1bmtzCi0JCVRyZWVJdGVtW10gaHVua3M9IGRpZmZJdGVtLmdldEl0ZW1zKCk7Ci0JCWludCBjaGVja2VkQ291bnQ9IDA7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykgewotCQkJSHVuayBodW5rPSAoSHVuaykgaHVua3NbaV0uZ2V0RGF0YSgpOwotCQkJaWYgKGNoZWNrZWQpIHsKLQkJCQlpZiAoaHVuay5mTWF0Y2hlcykgewotCQkJCQlodW5rc1tpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCQljaGVja2VkQ291bnQrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWh1bmtzW2ldLnNldENoZWNrZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWRpZmZJdGVtLnNldEdyYXllZChjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA8IGh1bmtzLmxlbmd0aCk7Ci0JCWRpZmZJdGVtLnNldENoZWNrZWQoY2hlY2tlZENvdW50ID4gMCk7Ci0JCQotCQlzZXRQYWdlQ29tcGxldGUodXBkYXRlTW9kZWwoKSk7Ci0JfQotCQotCS8qCi0JICogVXBkYXRlcyB0aGUgZ3JheSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gaXRlbXMgcGFyZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmF5ZWRTdGF0ZShUcmVlSXRlbSBodW5rKSB7Ci0JCVRyZWVJdGVtIGRpZmY9IGh1bmsuZ2V0UGFyZW50SXRlbSgpOwotCQlUcmVlSXRlbVtdIGh1bmtzPSBkaWZmLmdldEl0ZW1zKCk7Ci0JCWludCBjaGVja2VkPSAwOwotCQlmb3IgKGludCBpPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspCi0JCQlpZiAoaHVua3NbaV0uZ2V0Q2hlY2tlZCgpKQotCQkJCWNoZWNrZWQrKzsKLQkJZGlmZi5zZXRDaGVja2VkKGNoZWNrZWQgPiAwKTsKLQkJZGlmZi5zZXRHcmF5ZWQoY2hlY2tlZCA+IDAgJiYgY2hlY2tlZCA8IGh1bmtzLmxlbmd0aCk7Ci0JCQotCQlzZXRQYWdlQ29tcGxldGUodXBkYXRlTW9kZWwoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTcGFjZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludD0gMjA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRTdHJpcFByZWZpeFNlZ21lbnRzKCkgewotCQlpbnQgc3RyaXBQcmVmaXhTZWdtZW50cz0gMDsKLQkJaWYgKGZTdHJpcFByZWZpeFNlZ21lbnRzICE9IG51bGwpIHsKLQkJCVN0cmluZyBzPSBmU3RyaXBQcmVmaXhTZWdtZW50cy5nZXRUZXh0KCk7Ci0JCQl0cnkgewotCQkJCXN0cmlwUHJlZml4U2VnbWVudHM9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyaXBQcmVmaXhTZWdtZW50czsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0RnV6ekZhY3RvcigpIHsKLQkJaW50IGZ1enpGYWN0b3I9IDA7Ci0JCWlmIChmRnV6ekZpZWxkICE9IG51bGwpIHsKLQkJCVN0cmluZyBzPSBmRnV6ekZpZWxkLmdldFRleHQoKTsKLQkJCXRyeSB7Ci0JCQkJZnV6ekZhY3Rvcj0gSW50ZWdlci5wYXJzZUludChzKTsKLQkJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfQotCQl9Ci0JCXJldHVybiBmdXp6RmFjdG9yOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVNb2RlbCgpIHsKLQkJYm9vbGVhbiBhdExlYXN0T25lSXNFbmFibGVkPSBmYWxzZTsKLQkJaWYgKGZUcmVlICE9IG51bGwgJiYgIWZUcmVlLmlzRGlzcG9zZWQoKSkgewotCQkJVHJlZUl0ZW0gW10gZGlmZkl0ZW1zPSBmVHJlZS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpZmZJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGRpZmZJdGVtPSBkaWZmSXRlbXNbaV07Ci0JCQkJT2JqZWN0IGRhdGE9IGRpZmZJdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIERpZmYpIHsKLQkJCQkJRGlmZiBkaWZmPSAoRGlmZikgZGF0YTsKLQkJCQkJYm9vbGVhbiBiPSBkaWZmSXRlbS5nZXRDaGVja2VkKCk7Ci0JCQkJCWRpZmYuc2V0RW5hYmxlZChiKTsKLQkJCQkJaWYgKGIpIHsKLQkJCQkJCVRyZWVJdGVtIFtdIGh1bmtJdGVtcz0gZGlmZkl0ZW0uZ2V0SXRlbXMoKTsKLQkJCQkJCWZvciAoaW50IGo9IDA7IGogPCBodW5rSXRlbXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQlUcmVlSXRlbSBodW5rSXRlbT0gaHVua0l0ZW1zW2pdOwotCQkJCQkJCWRhdGE9IGh1bmtJdGVtLmdldERhdGEoKTsKLQkJCQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEh1bmspIHsKLQkJCQkJCQkJSHVuayBodW5rPSAoSHVuaykgZGF0YTsKLQkJCQkJCQkJYj0gaHVua0l0ZW0uZ2V0Q2hlY2tlZCgpOwotCQkJCQkJCQlodW5rLnNldEVuYWJsZWQoYik7Ci0JCQkJCQkJCWlmIChiKSB7Ci0JCQkJCQkJCQlhdExlYXN0T25lSXNFbmFibGVkPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhdExlYXN0T25lSXNFbmFibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmZmI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbk5UOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBwZXJmb3JtaW5nIHN0cnVjdHVyYWwgYW5kIHRleHR1YWwKLWNvbXBhcmUgb3BlcmF0aW9ucyBvbiBhcmJpdHJhcnkgZGF0YSBhbmQgZGlzcGxheWluZyB0aGUgcmVzdWx0cy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci0KLVRoZSBjbGFzcyA8Yj5Db21wYXJlVUk8L2I+IGRlZmluZXMgdGhlIGVudHJ5IHBvaW50IHRvIGluaXRpYXRlIGEgY29uZmlndXJhYmxlCi1jb21wYXJlIG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgcmVzb3VyY2VzLiBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJlIGlzCi1vcGVuZWQgaW50byBhIGNvbXBhcmUgZWRpdG9yIHdoZXJlIHRoZSBkZXRhaWxzIGNhbiBiZSBicm93c2VkIGFuZCBlZGl0ZWQKLWluIGR5bmFtaWNhbGx5IHNlbGVjdGVkIHN0cnVjdHVyZSBhbmQgY29udGVudCB2aWV3ZXJzLgotPHA+Ci0KLUEgY29tcGFyZSBvcGVyYXRpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBhcyBhIHN1YmNsYXNzIG9mIDxiPkNvbXBhcmVFZGl0b3JJbnB1dDwvYj4uCi1BIDxiPkNvbXBhcmVFZGl0b3JJbnB1dDwvYj4gcnVucyBhIChwb3RlbnRpYWxseSBsZW5ndGh5KSBjb21wYXJlIG9wZXJhdGlvbgotdW5kZXIgcHJvZ3Jlc3MgbW9uaXRvciBjb250cm9sLCBjcmVhdGVzIGEgVUkgZm9yIGRyaWxsaW5nLWRvd24gaW50byB0aGUKLWNvbXBhcmUgcmVzdWx0cywgdHJhY2tzIHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgcmVzdWx0IGluIGNhc2Ugb2YgbWVyZ2UsCi1hbmQgc2F2ZXMgYW55IGNoYW5nZXMgdGhhdCBvY2N1cmVkIGR1cmluZyBhIG1lcmdlLgotPHA+Ci0KLVRoZSA8Yj5OYXZpZ2F0aW9uQWN0aW9uPC9iPiBpcyB1c2VkIHRvIG5hdmlnYXRlIChzdGVwKSB0aHJvdWdoIHRoZSBpbmRpdmlkdWFsCi1kaWZmZXJlbmNlcyBvZiBhIDxiPkNvbXBhcmVFZGl0b3JJbnB1dDwvYj4uCi08cD4KLQotQW4gaW5zdGFuY2Ugb2YgPGI+Q29tcGFyZUNvbmZpZ3VyYXRpb248L2I+IGNvbmZpZ3VyZXMgdmFyaW91cyBVSSBhc3BlY3RzCi1vZiBjb21wYXJlL21lcmdlIHZpZXdlcnMgbGlrZSB0aXRsZSBsYWJlbHMgYW5kIGltYWdlcywgb3Igd2hldGhlciBhIHNpZGUKLW9mIGEgbWVyZ2Ugdmlld2VyIGlzIGVkaXRhYmxlLiBJdCBpcyBwYXNzZWQgdG8gdGhlIDxiPkNvbXBhcmVFZGl0b3JJbnB1dDwvYj4KLW9uIGNyZWF0aW9uLgotPHA+Ci0KLVdoZW4gaW1wbGVtZW50aW5nIGEgaGllcmFyY2hpY2FsIGNvbXBhcmUgb3BlcmF0aW9uIGFzIGEgc3ViY2xhc3Mgb2YKLTxiPkNvbXBhcmVFZGl0b3JJbnB1dDwvYj4gY2xpZW50cyBoYXZlIHRvIHByb3ZpZGUgYSB0cmVlIG9mIG9iamVjdHMgd2hlcmUgZWFjaAotbm9kZSBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UKLTxiPm9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNvbXBhcmF0b3I8L2I+LgotVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgaGllcmFyY2hpY2FsIGRpZmZlcmVuY2luZyBlbmdpbmUKLSg8Yj5vcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyPC9iPikgdG8gd2FsayB0aGUgdHJlZS4KLTxicj4KLUluIGFkZGl0aW9uIGV2ZXJ5IGxlYWYgb2YgdGhlIHRyZWUgbXVzdCBpbXBsZW1lbnQgdGhlIDxiPklTdHJlYW1Db250ZW50QWNjZXNzb3I8L2I+Ci1vciA8Yj5JRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvYj4KLWludGVyZmFjZXMgaW4gb3JkZXIgdG8gZ2l2ZSB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSBhY2Nlc3MgdG8gaXRzIHN0cmVhbSBjb250ZW50Ci1hbmQgdG8gaXRzIGVuY29kaW5nICh3aXRoIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKS4KLTxwPgotCi1UaGUgYWJzdHJhY3QgY2xhc3MgPGI+QnVmZmVyZWRDb250ZW50PC9iPiBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLWZvciB0aGUgPGI+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvYj4gYW5kIDxiPklDb250ZW50Q2hhbmdlTm90aWZpZXI8L2I+IGludGVyZmFjZXMuCi1JdHMgc3ViY2xhc3MgPGI+UmVzb3VyY2VOb2RlPC9iPiBhZGRzIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUKLTxiPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9iPiBhbmQgPGI+SVR5cGVkRWxlbWVudDwvYj4gaW50ZXJmYWNlcwotYmFzZWQgb24gRWNsaXBzZSB3b3JrYmVuY2ggcmVzb3VyY2VzIChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UpLiAKLUl0IGNhbiBiZSB1c2VkIHdpdGhvdXQgbW9kaWZpY2F0aW9uIGFzIHRoZSBpbnB1dCB0byB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZS4KLTxwPgotCi1UaGUgPGI+WmlwRmlsZVN0cnVjdHVyZUNyZWF0b3I8L2I+IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZQotPGI+b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JU3RydWN0dXJlQ3JlYXRvcjwvYj4gaW50ZXJmYWNlCi1hbmQgbWFrZXMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGFyY2hpdmUgYXZhaWxhYmxlIGFzIGEKLWhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgb2YgPGI+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2I+cyB3aGljaCBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkCi1ieSB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSAoPGI+b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmZXJlbmNlcjwvYj4pLgotSXQgaXMgYSBnb29kIGV4YW1wbGUgZm9yIGhvdyB0byBtYWtlIHN0cnVjdHVyZWQgZmlsZXMgYXZhaWxhYmxlIHRvIHRoZSBoaWVyYXJjaGljYWwgCi1jb21wYXJlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIENvbXBhcmUgcGx1Z2luLgotPHA+Ci0KLVRoZSA8Yj5FZGl0aW9uU2VsZWN0aW9uRGlhbG9nPC9iPiBpcyBhIHNpbXBsZSBzZWxlY3Rpb24gZGlhbG9nIHdoZXJlCi1vbmUgaW5wdXQgZWxlbWVudCBjYW4gYmUgY29tcGFyZWQgYWdhaW5zdCBhIGxpc3Qgb2YgaGlzdG9yaWMgdmFyaWFudHMgKDxpPmVkaXRpb25zPC9pPikKLW9mIHRoZSBzYW1lIGlucHV0IGVsZW1lbnQuIFRoZSBkaWFsb2cgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZ1bmN0aW9ucwotbGlrZSA8aT4iUmVwbGFjZSB3aXRoIFZlcnNpb24iPC9pPiBvciA8aT4iUmVwbGFjZSB3aXRoIEVkaXRpb24iPC9pPiBvbiB3b3JrYmVuY2ggcmVzb3VyY2VzLgotPHA+Ci0KLUluIGFkZGl0aW9uIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBzdWJzZWN0aW9uIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0oZS5nLiBhIG1ldGhvZCBpbiBhIEphdmEgc291cmNlIGZpbGUpIGJ5IG1lYW5zIG9mIGEgPGk+cGF0aDwvaT4uIEluIHRoaXMKLWNhc2UgdGhlIGRpYWxvZyBjb21wYXJlcyBvbmx5IHRoZSBzdWJzZWN0aW9uIChhcyBzcGVjaWZpZWQgYnkgdGhlIHBhdGgpCi13aXRoIHRoZSBjb3JyZXNwb25kaW5nIHN1YnNlY3Rpb24gaW4gdGhlIGxpc3Qgb2YgZWRpdGlvbnMuIFRoaXMgZnVuY3Rpb25hbGl0eQotY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IDxpPiJSZXBsYWNlIHdpdGggTWV0aG9kIEVkaXRpb24iPC9pPiBmb3IgdGhlIEphdmEKLWxhbmd1YWdlLgotPHA+Ci0KLVRoZSA8Yj5FZGl0aW9uU2VsZWN0aW9uRGlhbG9nPC9iPiByZXF1aXJlcyB0aGF0IHRoZSBlZGl0aW9ucyBpbXBsZW1lbnQKLXRoZSA8Yj5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9iPiBhbmQgPGI+SU1vZGlmaWNhdGlvbkRhdGU8L2I+IGludGVyZmFjZXMuCi1UaGUgPGI+SGlzdG9yeUl0ZW08L2I+IGlzIGEgY29udmVuaWVuY2UgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZXNlIGludGVyZmFjZXMKLWZvciA8Yj5JRmlsZVN0YXRlPC9iPiBvYmplY3RzLgotPHA+Ci0KLQotVGhlIDxiPkNvbXBhcmVWaWV3ZXJQYW5lPC9iPiBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoaWNoIHByb3ZpZGVzCi1hIGxhYmVsIGFuZCBsb2NhbCB0b29sYmFyIGZvciBhIGNvbXBhcmUgdmlld2VyIChvciBhbnkgb3RoZXIgc3ViY2xhc3Mgb2YgYSAKLUpGYWNlIDxiPlZpZXdlcjwvYj4pLgotPGJyPgotSXRzIGFic3RyYWN0IHN1YmNsYXNzIDxiPkNvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lPC9iPiBzdXBwb3J0cyA8aT5keW5hbWljCi12aWV3ZXIgc3dpdGNoaW5nPC9pPiwgdGhhdCBpcyB0aGUgdmlld2VyIGluc3RhbGxlZCBpbiB0aGUgcGFuZSBpcyBkeW5hbWljYWxseSAKLWRldGVybWluZWQgYnkgdGhlIHBhbmUncyBpbnB1dCBvYmplY3QuCi1Cb3RoIGNsYXNzZXMgYXJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgY29tcGFyZSB2aWV3ZXJzIG91dHNpZGUgdGhlIGNvbnRleHQgb2YKLWEgY29tcGFyZSBlZGl0b3IsIGZvciBleGFtcGxlIGluIGEgZGlhbG9nIG9yIHdpemFyZC4KLTxwPgotCi1BIDxiPlNwbGl0dGVyPC9iPiBpcyBhbiBleHRlbnNpb24gb2YgYSBTYXNoRm9ybSB0aGF0IHN1cHBvcnRzIG5lc3RpbmcsIG1heGltaXppbmcgb2YgcGFuZXMsCi1hbmQgcHJvcGFnYXRpbmcgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgcGFuZXMuCi08cD4KLQotVGhlIGludGVyZmFjZSA8Yj5JU3RyZWFtTWVyZ2VyPC9iPiBkZWZpbmVzIGEgc2luZ2xlIG9wZXJhdGlvbiBmb3IgcGVyZm9ybWluZyBhIHRocmVlLXdheSBtZXJnZSBvbiB0aHJlZQotaW5wdXQgc3RyZWFtcy4gVGhlIG1lcmdlZCByZXN1bHQgaXMgd3JpdHRlbiB0byBhbiBvdXRwdXQgc3RyZWFtLgotPGJyPgotQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aGVuIGNvbnRyaWJ1dGluZyBuZXcgbWVyZ2VycyB0byB0aGUKLTxjb2RlPm9yZy5lY2xpcHNlLmNvbXBhcmUuc3RyZWFtTWVyZ2VyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotTmV3IDxiPklTdHJlYW1NZXJnZXI8L2I+cyBjYW4gYmUgY3JlYXRlZCBmb3IgcmVnaXN0ZXJlZCB0eXBlcyB3aXRoIHRoZSBjcmVhdGVTdHJlYW1NZXJnZXIgbWV0aG9kcyBvZiBDb21wYXJlVUkuCi0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9EaWZmZXJlbmNlc0l0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL0RpZmZlcmVuY2VzSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4NjZhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL0RpZmZlcmVuY2VzSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgY3VzdG9tIGl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBhIExpc3Qgb2YgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlczwvY29kZT4uCi0gKiBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIDxjb2RlPlJhbmdlRGlmZmVyZW5jZXI8L2NvZGU+LgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIERpZmZlcmVuY2VzSXRlcmF0b3IgewotCi0JTGlzdCBmUmFuZ2U7Ci0JaW50IGZJbmRleDsKLQlSYW5nZURpZmZlcmVuY2VbXSBmQXJyYXk7CQotCVJhbmdlRGlmZmVyZW5jZSBmRGlmZmVyZW5jZTsKLQkKLQkvKgotCSAqIENyZWF0ZXMgYSBkaWZmZXJlbmNlcyBpdGVyYXRvciBvbiBhbiBhcnJheSBvZiA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+cy4KLQkgKi8KLQlEaWZmZXJlbmNlc0l0ZXJhdG9yKFJhbmdlRGlmZmVyZW5jZVtdIGRpZmZlcmVuY2VSYW5nZXMpIHsKLQkJCi0JCWZBcnJheT0gZGlmZmVyZW5jZVJhbmdlczsKLQkJZkluZGV4PSAwOwotCQlmUmFuZ2U9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGZJbmRleCA8IGZBcnJheS5sZW5ndGgpCi0JCQlmRGlmZmVyZW5jZT0gZkFycmF5W2ZJbmRleCsrXTsKLQkJZWxzZQotCQkJZkRpZmZlcmVuY2U9IG51bGw7Ci0JfQotCi0JLyoKLQkgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFJhbmdlRGlmZmVyZW5jZXMKLQkgICovCi0JaW50IGdldENvdW50KCkgewotCQlyZXR1cm4gZlJhbmdlLnNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIEFwcGVuZHMgdGhlIGVkaXQgdG8gaXRzIGxpc3QgYW5kIG1vdmVzIHRvIHRoZSBuZXh0IDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4uCi0JICovCi0Jdm9pZCBuZXh0KCkgewotCQlmUmFuZ2UuYWRkKGZEaWZmZXJlbmNlKTsKLQkJaWYgKGZEaWZmZXJlbmNlICE9IG51bGwpIHsKLQkJCWlmIChmSW5kZXggPCBmQXJyYXkubGVuZ3RoKQotCQkJCWZEaWZmZXJlbmNlPSBmQXJyYXlbZkluZGV4KytdOwotCQkJZWxzZQotCQkJCWZEaWZmZXJlbmNlPSBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBEaWZmZXJlbmNlIGl0ZXJhdG9ycyBhcmUgdXNlZCBpbiBwYWlycy4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvdGhlciBpdGVyYXRvci4KLQkgKi8KLQlEaWZmZXJlbmNlc0l0ZXJhdG9yIG90aGVyKERpZmZlcmVuY2VzSXRlcmF0b3IgcmlnaHQsIERpZmZlcmVuY2VzSXRlcmF0b3IgbGVmdCkgewotCQlpZiAodGhpcyA9PSByaWdodCkKLQkJCXJldHVybiBsZWZ0OwotCQlyZXR1cm4gcmlnaHQ7Ci0JfQotCi0JLyoKLQkgICogUmVtb3ZlcyBhbGwgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPnMKLQkgICovCi0Jdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWZSYW5nZS5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvSVJhbmdlQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9JUmFuZ2VDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTllY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9JUmFuZ2VDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyOwotCi0vKioKLSAqIEZvciBicmVha2luZyBhbiBvYmplY3QgdG8gY29tcGFyZSBpbnRvIGEgc2VxdWVuY2Ugb2YgY29tcGFyYWJsZSBlbnRpdGllcy4KLSAqIDxwPgotICogSXQgaXMgdXNlZCBieSA8Y29kZT5SYW5nZURpZmZlcmVuY2VyPC9jb2RlPiB0byBmaW5kIGxvbmdlc3Qgc2VxdWVuY2VzIG9mCi0gKiBtYXRjaGluZyBhbmQgbm9uLW1hdGNoaW5nIHJhbmdlcy4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIHRvIGNvbXBhcmUgdHdvIHRleHQgZG9jdW1lbnRzIGFuZCBmaW5kIGxvbmdlc3QgY29tbW9uIHNlcXVlbmNlcwotICogb2YgbWF0Y2hpbmcgYW5kIG5vbi1tYXRjaGluZyBsaW5lcywgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgYnJlYWsgdGhlIGRvY3VtZW50Ci0gKiBpbnRvIGxpbmVzLiA8Y29kZT5nZXRSYW5nZUNvdW50PC9jb2RlPiB3b3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgCi0gKiBkb2N1bWVudCwgYW5kIDxjb2RlPnJhbmdlc0VxdWFsPC9jb2RlPiB3b3VsZCBjb21wYXJlIGEgc3BlY2lmaWVkIGxpbmUgZ2l2ZW4gCi0gKiB3aXRoIG9uZSBpbiBhbm90aGVyIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+LgotICogPC9wPgotICogPHA+Ci0gKiBDbGllbnRzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2U7IHRoZXJlIGlzIG5vIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSYW5nZUNvbXBhcmF0b3IgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbXBhcmFibGUgZW50aXRpZXMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcGFyYWJsZSBlbnRpdGllcyAKLQkgKi8KLQlpbnQgZ2V0UmFuZ2VDb3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21wYXJhYmxlIGVudGl0eSBnaXZlbiBieSB0aGUgZmlyc3QgaW5kZXgKLQkgKiBtYXRjaGVzIGFuIGVudGl0eSBzcGVjaWZpZWQgYnkgdGhlIG90aGVyIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+IGFuZCBpbmRleC4KLQkgKgotCSAqIEBwYXJhbSB0aGlzSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjb21wYXJhYmxlIGVudGl0eSB3aXRoaW4gdGhpcyA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPgotCSAqIEBwYXJhbSBvdGhlciB0aGUgSVJhbmdlQ29tcGFyYXRvciB0byBjb21wYXJlIHRoaXMgd2l0aAotCSAqIEBwYXJhbSBvdGhlckluZGV4IHRoZSBpbmRleCBvZiB0aGUgY29tcGFyYWJsZSBlbnRpdHkgd2l0aGluIHRoZSBvdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbXBhcmFibGUgZW50aXRpZXMgYXJlIGVxdWFsCi0JICovCi0JYm9vbGVhbiByYW5nZXNFcXVhbChpbnQgdGhpc0luZGV4LCBJUmFuZ2VDb21wYXJhdG9yIG90aGVyLCBpbnQgb3RoZXJJbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYSBjb21wYXJpc29uIHNob3VsZCBiZSBza2lwcGVkIGJlY2F1c2UgaXQgd291bGQgYmUgdG9vIGNvc3RseSAob3IgbGVuZ3RoeSkuCi0JICogCi0JICogQHBhcmFtIGxlbmd0aCBhIG51bWJlciBvbiB3aGljaCB0byBiYXNlIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHRvIHJldHVybgotCSAqIAk8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBAcGFyYW0gbWF4TGVuZ3RoIGFub3RoZXIgbnVtYmVyIG9uIHdoaWNoIHRvIGJhc2UgdGhlIGRlY2lzaW9uIHdoZXRoZXIgdG8gcmV0dXJuCi0JICoJPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPiB0byBjb21wYXJlIHdpdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGF2b2lkIGEgdG9vIGxlbmd0aHkgcmFuZ2UgY29tcGFyaXNvbgotCSAqLwotCWJvb2xlYW4gc2tpcFJhbmdlQ29tcGFyaXNvbihpbnQgbGVuZ3RoLCBpbnQgbWF4TGVuZ3RoLCBJUmFuZ2VDb21wYXJhdG9yIG90aGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvTGlua2VkUmFuZ2VEaWZmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL0xpbmtlZFJhbmdlRGlmZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQ1ZjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvTGlua2VkUmFuZ2VEaWZmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyOwotCi0vKiBwYWNrYWdlICovIGNsYXNzIExpbmtlZFJhbmdlRGlmZmVyZW5jZSBleHRlbmRzIFJhbmdlRGlmZmVyZW5jZSB7Ci0KLQlzdGF0aWMgZmluYWwgaW50IElOU0VSVD0gMDsKLQlzdGF0aWMgZmluYWwgaW50IERFTEVURT0gMTsKLQotCUxpbmtlZFJhbmdlRGlmZmVyZW5jZSBmTmV4dDsKLQotCS8qCi0JICogQ3JlYXRlcyBhIExpbmtlZFJhbmdlRGlmZmVyZW5jZSBhbiBpbml0aWFsaXplcyBpdCB0byB0aGUgZXJyb3Igc3RhdGUKLQkgKi8KLQlMaW5rZWRSYW5nZURpZmZlcmVuY2UoKSB7Ci0JCXN1cGVyKEVSUk9SKTsKLQkJZk5leHQ9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDb25zdHJ1Y3RzIGFuZCBsaW5rcyBhIExpbmtlUmFuZ2VEaWZmZXJlbmNlIHRvIGFub3RoZXIgTGlua2VkUmFuZ2VEaWZmZXJlbmNlCi0JICovCi0JTGlua2VkUmFuZ2VEaWZmZXJlbmNlKExpbmtlZFJhbmdlRGlmZmVyZW5jZSBuZXh0LCBpbnQgb3BlcmF0aW9uKSB7Ci0JCXN1cGVyKG9wZXJhdGlvbik7Ci0JCWZOZXh0PSBuZXh0OwotCX0KLQotCS8qCi0JICogRm9sbG93cyB0aGUgbmV4dCBsaW5rCi0JICovCi0JTGlua2VkUmFuZ2VEaWZmZXJlbmNlIGdldE5leHQoKSB7Ci0JCXJldHVybiBmTmV4dDsKLQl9Ci0KLQlib29sZWFuIGlzRGVsZXRlKCkgewotCQlyZXR1cm4ga2luZCgpID09IERFTEVURTsKLQl9Ci0KLQlib29sZWFuIGlzSW5zZXJ0KCkgewotCQlyZXR1cm4ga2luZCgpID09IElOU0VSVDsKLQl9Ci0KLQkvKgotCSAqIFNldHMgdGhlIG5leHQgbGluayBvZiB0aGlzIExpbmtlZFJhbmdlRGlmZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TmV4dChMaW5rZWRSYW5nZURpZmZlcmVuY2UgbmV4dCkgewotCQlmTmV4dD0gbmV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9SYW5nZURpZmZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0MmRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXI7Ci0KLS8qKgotICogRGVzY3JpcHRpb24gb2YgYSBjaGFuZ2UgYmV0d2VlbiB0d28gb3IgdGhyZWUgcmFuZ2VzIG9mIGNvbXBhcmFibGUgZW50aXRpZXMuCi0gKiA8cD4KLSAqIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4gb2JqZWN0cyBhcmUgdGhlIGVsZW1lbnRzIG9mIGEgY29tcGFyZSByZXN1bHQgcmV0dXJuZWQgZnJvbQotICogdGhlIDxjb2RlPlJhbmdlRGlmZmVyZW5jZXI8L2NvZGU+IDxjb2RlPmZpbmQqIDwvY29kZT4gbWV0aG9kcy4KLSAqIENsaWVudHMgdXNlIHRoZXNlIG9iamVjdHMgYXMgdGhleSBhcmUgcmV0dXJuZWQgZnJvbSB0aGUgZGlmZmVyZW5jZXIuCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDxwPgotICogTm90ZTogQSByYW5nZSBpbiB0aGUgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiBvYmplY3QgaXMgZ2l2ZW4gYXMgYSBzdGFydCBpbmRleAotICogYW5kIGxlbmd0aCBpbiB0ZXJtcyBvZiBjb21wYXJhYmxlIGVudGl0aWVzLiBIb3dldmVyLCB0aGVzZSBlbnRpdHkgaW5kaWNlcyBhbmQgY291bnRzCi0gKiBhcmUgbm90IG5lY2Vzc2FyaWx5IGNoYXJhY3RlciBwb3NpdGlvbnMuIEZvciBleGFtcGxlLCBpZiBhbiBlbnRpdHkgcmVwcmVzZW50cyBhIGxpbmUKLSAqIGluIGEgZG9jdW1lbnQsIHRoZSBzdGFydCBpbmRleCB3b3VsZCBiZSBhIGxpbmUgbnVtYmVyIGFuZCB0aGUgY291bnQgd291bGQgYmUgaW4gbGluZXMuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBSYW5nZURpZmZlcmVuY2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZURpZmZlcmVuY2UgewotCi0JLyoqIFR3by13YXkgY2hhbmdlIGNvbnN0YW50IGluZGljYXRpbmcgbm8gY2hhbmdlLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PQ0hBTkdFPSAwOwotCS8qKiBUd28td2F5IGNoYW5nZSBjb25zdGFudCBpbmRpY2F0aW5nIHR3by13YXkgY2hhbmdlIChzYW1lIGFzIDxjb2RlPlJJR0hUPC9jb2RlPikgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOR0U9IDI7Ci0KLQkvKiogVGhyZWUtd2F5IGNoYW5nZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgY2hhbmdlIGluIGJvdGggcmlnaHQgYW5kIGxlZnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORkxJQ1Q9IDE7Ci0JLyoqIFRocmVlLXdheSBjaGFuZ2UgY29uc3RhbnQgaW5kaWNhdGluZyBhIGNoYW5nZSBpbiByaWdodC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBSSUdIVD0gMjsKLQkvKiogVGhyZWUtd2F5IGNoYW5nZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgY2hhbmdlIGluIGxlZnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTEVGVD0gMzsKLQkvKioKLQkgKiBUaHJlZS13YXkgY2hhbmdlIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHNhbWUgY2hhbmdlIGluIGJvdGggcmlnaHQgYW5kIGxlZnQsCi0JICogdGhhdCBpcyBvbmx5IHRoZSBhbmNlc3RvciBpcyBkaWZmZXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQU5DRVNUT1I9IDQ7Ci0JCi0JLyoqIENvbnN0YW50IGluZGljYXRpbmcgYW4gdW5rbm93biBjaGFuZ2Uga2luZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUj0gNTsKLQotCS8qKiB0aGUga2luZCBvZiBjaGFuZ2U6IE5PQ0hBTkdFLCBDSEFOR0UsIExFRlQsIFJJR0hULCBBTkNFU1RPUiwgQ09ORkxJQ1QsIEVSUk9SICovCi0JaW50IGZLaW5kOwotCi0JaW50IGZMZWZ0U3RhcnQ7Ci0JaW50IGZMZWZ0TGVuZ3RoOwotCWludCBmUmlnaHRTdGFydDsKLQlpbnQgZlJpZ2h0TGVuZ3RoOwotCWludCBsQW5jZXN0b3JTdGFydDsKLQlpbnQgbEFuY2VzdG9yTGVuZ3RoOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmFuZ2UgZGlmZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBjaGFuZ2Uga2luZC4KLQkgKgotCSAqIEBwYXJhbSBjaGFuZ2VLaW5kIHRoZSBraW5kIG9mIGNoYW5nZQotCSAqLwotCS8qIHBhY2thZ2UgKi8gUmFuZ2VEaWZmZXJlbmNlKGludCBjaGFuZ2VLaW5kKSB7Ci0JCWZLaW5kPSBjaGFuZ2VLaW5kOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBjaGFuZ2Uga2luZAotCSAqIGFuZCBsZWZ0IGFuZCByaWdodCByYW5nZXMuCi0JICoKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBjaGFuZ2UKLQkgKiBAcGFyYW0gcmlnaHRTdGFydCBzdGFydCBpbmRleCBvZiBlbnRpdHkgb24gcmlnaHQgc2lkZQotCSAqIEBwYXJhbSByaWdodExlbmd0aCBudW1iZXIgb2YgZW50aXRpZXMgb24gcmlnaHQgc2lkZQotCSAqIEBwYXJhbSBsZWZ0U3RhcnQgc3RhcnQgaW5kZXggb2YgZW50aXR5IG9uIGxlZnQgc2lkZQotCSAqIEBwYXJhbSBsZWZ0TGVuZ3RoIG51bWJlciBvZiBlbnRpdGllcyBvbiBsZWZ0IHNpZGUKLQkgKi8KLQkvKiBwYWNrYWdlICovIFJhbmdlRGlmZmVyZW5jZShpbnQga2luZCwgaW50IHJpZ2h0U3RhcnQsIGludCByaWdodExlbmd0aCwgaW50IGxlZnRTdGFydCwgaW50IGxlZnRMZW5ndGgpIHsKLQkJZktpbmQ9IGtpbmQ7Ci0JCWZSaWdodFN0YXJ0PSByaWdodFN0YXJ0OwotCQlmUmlnaHRMZW5ndGg9IHJpZ2h0TGVuZ3RoOwotCQlmTGVmdFN0YXJ0PSBsZWZ0U3RhcnQ7Ci0JCWZMZWZ0TGVuZ3RoPSBsZWZ0TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBjaGFuZ2Uga2luZAotCSAqIGFuZCBsZWZ0LCByaWdodCwgYW5kIGFuY2VzdG9yIHJhbmdlcy4KLQkgKgotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIGNoYW5nZQotCSAqIEBwYXJhbSByaWdodFN0YXJ0IHN0YXJ0IGluZGV4IG9mIGVudGl0eSBvbiByaWdodCBzaWRlCi0JICogQHBhcmFtIHJpZ2h0TGVuZ3RoIG51bWJlciBvZiBlbnRpdGllcyBvbiByaWdodCBzaWRlCi0JICogQHBhcmFtIGxlZnRTdGFydCBzdGFydCBpbmRleCBvZiBlbnRpdHkgb24gbGVmdCBzaWRlCi0JICogQHBhcmFtIGxlZnRMZW5ndGggbnVtYmVyIG9mIGVudGl0aWVzIG9uIGxlZnQgc2lkZQotCSAqIEBwYXJhbSBhbmNlc3RvclN0YXJ0IHN0YXJ0IGluZGV4IG9mIGVudGl0eSBvbiBhbmNlc3RvciBzaWRlCi0JICogQHBhcmFtIGFuY2VzdG9yTGVuZ3RoIG51bWJlciBvZiBlbnRpdGllcyBvbiBhbmNlc3RvciBzaWRlCi0JICovCi0JLyogcGFja2FnZSAqLyBSYW5nZURpZmZlcmVuY2UoaW50IGtpbmQsIGludCByaWdodFN0YXJ0LCBpbnQgcmlnaHRMZW5ndGgsIGludCBsZWZ0U3RhcnQsIGludCBsZWZ0TGVuZ3RoLAotCQkJCQkJCQkJaW50IGFuY2VzdG9yU3RhcnQsIGludCBhbmNlc3Rvckxlbmd0aCkgewotCQl0aGlzKGtpbmQsIHJpZ2h0U3RhcnQsIHJpZ2h0TGVuZ3RoLCBsZWZ0U3RhcnQsIGxlZnRMZW5ndGgpOwotCQlsQW5jZXN0b3JTdGFydD0gYW5jZXN0b3JTdGFydDsKLQkJbEFuY2VzdG9yTGVuZ3RoPSBhbmNlc3Rvckxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UsIG9uZSBvZgotCSAqIDxjb2RlPk5PQ0hBTkdFPC9jb2RlPiwgPGNvZGU+Q0hBTkdFPC9jb2RlPiwgPGNvZGU+TEVGVDwvY29kZT4sIDxjb2RlPlJJR0hUPC9jb2RlPiwKLQkgKiA8Y29kZT5BTkNFU1RPUjwvY29kZT4sIDxjb2RlPkNPTkZMSUNUPC9jb2RlPiwgPGNvZGU+RVJST1I8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBraW5kKCkgewotCQlyZXR1cm4gZktpbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgYW5jZXN0b3Igc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGFuY2VzdG9yIHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IGFuY2VzdG9yU3RhcnQoKSB7Ci0JCXJldHVybiBsQW5jZXN0b3JTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgb24gdGhlIGFuY2VzdG9yIHNpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgb24gdGhlIGFuY2VzdG9yIHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IGFuY2VzdG9yTGVuZ3RoKCkgewotCQlyZXR1cm4gbEFuY2VzdG9yTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSBhbmNlc3RvciBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgZW5kIGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGFuY2VzdG9yIHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IGFuY2VzdG9yRW5kKCkgewotCQlyZXR1cm4gbEFuY2VzdG9yU3RhcnQgKyBsQW5jZXN0b3JMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgcmlnaHQgc2lkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIHJpZ2h0IHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IHJpZ2h0U3RhcnQoKSB7Ci0JCXJldHVybiBmUmlnaHRTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgb24gdGhlIHJpZ2h0IHNpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgb24gdGhlIHJpZ2h0IHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IHJpZ2h0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlJpZ2h0TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBpbmRleCBvZiB0aGUgZW50aXR5IHJhbmdlIG9uIHRoZSByaWdodCBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgZW5kIGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIHJpZ2h0IHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IHJpZ2h0RW5kKCkgewotCQlyZXR1cm4gZlJpZ2h0U3RhcnQgKyBmUmlnaHRMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgbGVmdCBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgbGVmdCBzaWRlCi0JICovCi0JcHVibGljIGludCBsZWZ0U3RhcnQoKSB7Ci0JCXJldHVybiBmTGVmdFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRpdGllcyBvbiB0aGUgbGVmdCBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIG9uIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQlwdWJsaWMgaW50IGxlZnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVmdExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgaW5kZXggb2YgdGhlIGVudGl0eSByYW5nZSBvbiB0aGUgbGVmdCBzaWRlLgotCSAqCi0JICogQHJldHVybiB0aGUgZW5kIGluZGV4IG9mIHRoZSBlbnRpdHkgcmFuZ2Ugb24gdGhlIGxlZnQgc2lkZQotCSAqLwotCXB1YmxpYyBpbnQgbGVmdEVuZCgpIHsKLQkJcmV0dXJuIGZMZWZ0U3RhcnQgKyBmTGVmdExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRpdGllcyBpbiB0aGUgbGVmdCwgcmlnaHQsIGFuZCBhbmNlc3RvciBzaWRlcyBvZiB0aGlzIHJhbmdlLgotCSAqCi0JICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50aXRpZXMgaW4gdGhlIGxlZnQsIHJpZ2h0LCBhbmQgYW5jZXN0b3Igc2lkZXMgb2YgdGhpcyByYW5nZQotCSAqLwotCXB1YmxpYyBpbnQgbWF4TGVuZ3RoKCkgewotCQlyZXR1cm4gTWF0aC5tYXgoZlJpZ2h0TGVuZ3RoLCBNYXRoLm1heChmTGVmdExlbmd0aCwgbEFuY2VzdG9yTGVuZ3RoKSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9yYW5nZWRpZmZlcmVuY2VyL1JhbmdlRGlmZmVyZW5jZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvUmFuZ2VEaWZmZXJlbmNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjJjM2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvUmFuZ2VEaWZmZXJlbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SYW5nZURpZmZlcmVuY2VyPC9jb2RlPiBmaW5kcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gb3IgdGhyZWUgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIGRpZmZlcmVuY2VyLCBjbGllbnRzIHByb3ZpZGUgYW4gPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT4KLSAqIHRoYXQgYnJlYWtzIHRoZWlyIGlucHV0IGRhdGEgaW50byBhIHNlcXVlbmNlIG9mIGNvbXBhcmFibGUgZW50aXRpZXMuIFRoZSBkaWZmZXJlbmNlcgotICogcmV0dXJucyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdGhlc2Ugc2VxdWVuY2VzIGFzIGFuIGFycmF5IG9mIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT4gb2JqZWN0cwotICogKDxjb2RlPmZpbmREaWZmZXJlbmNlczwvY29kZT4gbWV0aG9kcykuCi0gKiBFdmVyeSA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+IHJlcHJlc2VudHMgYSBzaW5nbGUga2luZCBvZiBkaWZmZXJlbmNlCi0gKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmFuZ2VzIG9mIHRoZSB1bmRlcmx5aW5nIGNvbXBhcmFibGUgZW50aXRpZXMgaW4gdGhlCi0gKiBsZWZ0LCByaWdodCwgYW5kIG9wdGlvbmFsbHkgYW5jZXN0b3Igc2lkZXMuCi0gKiA8cD4KLSAqIEFsdGVybmF0aXZlbHksIHRoZSA8Y29kZT5maW5kUmFuZ2VzPC9jb2RlPiBtZXRob2RzIG5vdCBvbmx5IHJldHVybiBvYmplY3RzIGZvcgotICogdGhlIGRpZmZlcmluZyByYW5nZXMgYnV0IGZvciBub24tZGlmZmVyaW5nIHJhbmdlcyB0b28uCi0gKiA8cD4KLSAqIFRoZSBhbGdvcml0aG0gdXNlZCBpcyBhbiBvYmplY3RpZmllZCB2ZXJzaW9uIG9mIG9uZSBkZXNjcmliZWQgaW46Ci0gKiA8aXQ+QSBGaWxlIENvbXBhcmlzb24gUHJvZ3JhbSw8L2l0PiBieSBXZWJiIE1pbGxlciBhbmQgRXVnZW5lIFcuIE15ZXJzLCAKLSAqIFNvZnR3YXJlIFByYWN0aWNlIGFuZCBFeHBlcmllbmNlLCBWb2wuIDE1LCBOb3YuIDE5ODUuCi0gKgotICogQHNlZSBJUmFuZ2VDb21wYXJhdG9yCi0gKiBAc2VlIFJhbmdlRGlmZmVyZW5jZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmFuZ2VEaWZmZXJlbmNlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZ2VEaWZmZXJlbmNlW10gRU1QVFlfUkVTVUxUPSBuZXcgUmFuZ2VEaWZmZXJlbmNlWzBdOwotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBOb24gaW5zdGFudGlhdGlhYmxlIQotCSAqLwotCXByaXZhdGUgUmFuZ2VEaWZmZXJlbmNlcigpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIFRoZSBkaWZmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgYW4gYXJyYXkgb2YgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPnMuCi0JICogSWYgbm8gZGlmZmVyZW5jZXMgYXJlIGRldGVjdGVkIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJhbmdlIGRpZmZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyBkaWZmZXJlbmNlcyB3ZXJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBmaW5kRGlmZmVyZW5jZXMoSVJhbmdlQ29tcGFyYXRvciBsZWZ0LCBJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0KSB7Ci0JCXJldHVybiBmaW5kRGlmZmVyZW5jZXMoKElQcm9ncmVzc01vbml0b3IpbnVsbCwgbGVmdCwgcmlnaHQpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIFRoZSBkaWZmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgYW4gYXJyYXkgb2YgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPnMuCi0JICogSWYgbm8gZGlmZmVyZW5jZXMgYXJlIGRldGVjdGVkIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBwbSBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZGlmZmVyZW5jZXMgd2VyZSBmb3VuZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlRGlmZmVyZW5jZVtdIGZpbmREaWZmZXJlbmNlcyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIElSYW5nZUNvbXBhcmF0b3IgcmlnaHQpIHsKLQotCQkvLyBhc3NlcnQgdGhhdCBib3RoIElSYW5nZUNvbXBhcmF0b3JzIGFyZSBvZiB0aGUgc2FtZSBjbGFzcwotCQlBc3NlcnQuaXNUcnVlKHJpZ2h0LmdldENsYXNzKCkuZXF1YWxzKGxlZnQuZ2V0Q2xhc3MoKSkpOwotCi0JCWludCByaWdodFNpemU9IHJpZ2h0LmdldFJhbmdlQ291bnQoKTsKLQkJaW50IGxlZnRTaXplPSBsZWZ0LmdldFJhbmdlQ291bnQoKTsKLQkJLy8KLQkJLy8gRGlmZmVyZW5jZXMgbWF0cml4OgotCQkvLyBvbmx5IHRoZSBsYXN0IGQgb2YgZWFjaCBkaWFnb25hbCBpcyBzdG9yZWQsIGkuZS4sIGxhc3REaWFnb25hbFtrXSA9IHJvdyBvZiBkICAgIAotCQkvLwotCQlpbnQgZGlhZ0xlbj0gMiAqIE1hdGgubWF4KHJpZ2h0U2l6ZSwgbGVmdFNpemUpOyAvLyBib3VuZCBvbiB0aGUgc2l6ZSBvZiBlZGl0IHNjcmlwdAotCQlpbnQgbWF4RGlhZ29uYWw9IGRpYWdMZW47Ci0JCWludCBsYXN0RGlhZ29uYWxbXT0gbmV3IGludFtkaWFnTGVuICsgMV07IC8vIHRoZSByb3cgY29udGFpbmluZyB0aGUgbGFzdCBkCi0JCS8vIG9uIGRpYWdvbmFsIGsgKGxhc3REaWFnb25hbFtrXSA9IHJvdykKLQkJaW50IG9yaWdpbj0gZGlhZ0xlbiAvIDI7IC8vIG9yaWdpbiBvZiBkaWFnb25hbCAwCi0KLQkJLy8gc2NyaXB0IGNvcnJlc3BvbmRpbmcgdG8gZFtrXSAKLQkJTGlua2VkUmFuZ2VEaWZmZXJlbmNlIHNjcmlwdFtdPSBuZXcgTGlua2VkUmFuZ2VEaWZmZXJlbmNlW2RpYWdMZW4gKyAxXTsKLQkJaW50IHJvdywgY29sOwotCi0JCS8vIGZpbmQgY29tbW9uIHByZWZpeAotCQlmb3IgKHJvdz0gMDsgcm93IDwgcmlnaHRTaXplICYmIHJvdyA8IGxlZnRTaXplICYmIHJhbmdlc0VxdWFsKHJpZ2h0LCByb3csIGxlZnQsIHJvdykgPT0gdHJ1ZTspCi0JCQlyb3crKzsKLQotCQlsYXN0RGlhZ29uYWxbb3JpZ2luXT0gcm93OwotCQlzY3JpcHRbb3JpZ2luXT0gbnVsbDsKLQkJaW50IGxvd2VyPSAocm93ID09IHJpZ2h0U2l6ZSkgPyBvcmlnaW4gKyAxIDogb3JpZ2luIC0gMTsKLQkJaW50IHVwcGVyPSAocm93ID09IGxlZnRTaXplKSA/IG9yaWdpbiAtIDEgOiBvcmlnaW4gKyAxOwotCi0JCWlmIChsb3dlciA+IHVwcGVyKQotCQkJcmV0dXJuIEVNUFRZX1JFU1VMVDsKLQkJCQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZmluZERpZmZlcmVuY2VzOiAiICsgbWF4RGlhZ29uYWwgKyAiICIgKyBsb3dlciArICIgIiArIHVwcGVyKTsKLQkJCi0JCS8vIGZvciBlYWNoIHZhbHVlIG9mIHRoZSBlZGl0IGRpc3RhbmNlCi0JCWZvciAoaW50IGQ9IDE7IGQgPD0gbWF4RGlhZ29uYWw7ICsrZCkgeyAvLyBkIGlzIHRoZSBjdXJyZW50IGVkaXQgZGlzdGFuY2UKLQkJCQotCQkJaWYgKHBtICE9IG51bGwpCi0JCQkJcG0ud29ya2VkKDEpOwotCi0JCQlpZiAocmlnaHQuc2tpcFJhbmdlQ29tcGFyaXNvbihkLCBtYXhEaWFnb25hbCwgbGVmdCkpCi0JCQkJcmV0dXJuIEVNUFRZX1JFU1VMVDsgLy8gc2hvdWxkIGJlIHNvbWV0aGluZyB3ZSBhbHJlYWR5IGZvdW5kCi0KLQkJCS8vIGZvciBlYWNoIHJlbGV2YW50IGRpYWdvbmFsICgtZCwgLWQrMiAuLi4sIGQtMiwgZCkKLQkJCWZvciAoaW50IGs9IGxvd2VyOyBrIDw9IHVwcGVyOyBrICs9IDIpIHsgLy8gayBpcyB0aGUgY3VycmVudCBkaWFnb25hbAotCQkJCUxpbmtlZFJhbmdlRGlmZmVyZW5jZSBlZGl0OwotCi0JCQkJaWYgKHBtICE9IG51bGwgJiYgcG0uaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm4gRU1QVFlfUkVTVUxUOwotCi0JCQkJaWYgKGsgPT0gb3JpZ2luIC0gZCB8fCBrICE9IG9yaWdpbiArIGQgJiYgbGFzdERpYWdvbmFsW2sgKyAxXSA+PSBsYXN0RGlhZ29uYWxbayAtIDFdKSB7Ci0JCQkJCS8vCi0JCQkJCS8vIG1vdmUgZG93bgotCQkJCQkvLwotCQkJCQlyb3c9IGxhc3REaWFnb25hbFtrICsgMV0gKyAxOwotCQkJCQllZGl0PSBuZXcgTGlua2VkUmFuZ2VEaWZmZXJlbmNlKHNjcmlwdFtrICsgMV0sIExpbmtlZFJhbmdlRGlmZmVyZW5jZS5ERUxFVEUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCS8vIG1vdmUgcmlnaHQKLQkJCQkJLy8KLQkJCQkJcm93PSBsYXN0RGlhZ29uYWxbayAtIDFdOwotCQkJCQllZGl0PSBuZXcgTGlua2VkUmFuZ2VEaWZmZXJlbmNlKHNjcmlwdFtrIC0gMV0sIExpbmtlZFJhbmdlRGlmZmVyZW5jZS5JTlNFUlQpOwotCQkJCX0KLQkJCQljb2w9IHJvdyArIGsgLSBvcmlnaW47Ci0JCQkJZWRpdC5mUmlnaHRTdGFydD0gcm93OwotCQkJCWVkaXQuZkxlZnRTdGFydD0gY29sOwotCQkJCUFzc2VydC5pc1RydWUoayA+PSAwICYmIGsgPD0gbWF4RGlhZ29uYWwpOwotCQkJCXNjcmlwdFtrXT0gZWRpdDsKLQotCQkJCS8vIHNsaWRlIGRvd24gdGhlIGRpYWdvbmFsIGFzIGZhciBhcyBwb3NzaWJsZSAKLQkJCQl3aGlsZSAocm93IDwgcmlnaHRTaXplICYmIGNvbCA8IGxlZnRTaXplICYmIHJhbmdlc0VxdWFsKHJpZ2h0LCByb3csIGxlZnQsIGNvbCkgPT0gdHJ1ZSkgewotCQkJCQkrK3JvdzsKLQkJCQkJKytjb2w7Ci0JCQkJfQotCi0JCQkJQXNzZXJ0LmlzVHJ1ZShrID49IDAgJiYgayA8PSBtYXhEaWFnb25hbCk7IC8vIFVucmVhc29uYWJsZSB2YWx1ZSBmb3IgZGlhZ29uYWwgaW5kZXgKLQkJCQlsYXN0RGlhZ29uYWxba109IHJvdzsKLQotCQkJCWlmIChyb3cgPT0gcmlnaHRTaXplICYmIGNvbCA9PSBsZWZ0U2l6ZSkgewotCQkJCQkvL3Nob3dTY3JpcHQoc2NyaXB0W2tdLCByaWdodCwgbGVmdCk7Ci0JCQkJCXJldHVybiBjcmVhdGVEaWZmZXJlbmNlc1JhbmdlcyhzY3JpcHRba10pOwotCQkJCX0KLQkJCQlpZiAocm93ID09IHJpZ2h0U2l6ZSkKLQkJCQkJbG93ZXI9IGsgKyAyOwotCQkJCWlmIChjb2wgPT0gbGVmdFNpemUpCi0JCQkJCXVwcGVyPSBrIC0gMjsKLQkJCX0KLQkJCS0tbG93ZXI7Ci0JCQkrK3VwcGVyOwotCQl9Ci0JCS8vIHRvbyBtYW55IGRpZmZlcmVuY2VzCi0JCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdGhyZWUgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIFRoZSBkaWZmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgYSBsaXN0IG9mIDxjb2RlPlJhbmdlRGlmZmVyZW5jZTwvY29kZT5zLgotCSAqIElmIG5vIGRpZmZlcmVuY2VzIGFyZSBkZXRlY3RlZCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgotCSAqIElmIHRoZSBhbmNlc3RvciByYW5nZSBjb21wYXJhdG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBhIHR3by13YXkKLQkgKiBjb21wYXJpc29uIGlzIHBlcmZvcm1lZC4KLQkgKiAKLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZGlmZmVyZW5jZXMgd2VyZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlW10gZmluZERpZmZlcmVuY2VzKElSYW5nZUNvbXBhcmF0b3IgYW5jZXN0b3IsIElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgSVJhbmdlQ29tcGFyYXRvciByaWdodCkgewotCQlyZXR1cm4gZmluZERpZmZlcmVuY2VzKG51bGwsIGFuY2VzdG9yLCBsZWZ0LCByaWdodCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbmRzIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyB0aHJlZSA8Y29kZT5JUmFuZ2VDb21wYXJhdG9yPC9jb2RlPnMuCi0JICogVGhlIGRpZmZlcmVuY2VzIGFyZSByZXR1cm5lZCBhcyBhIGxpc3Qgb2YgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPnMuCi0JICogSWYgbm8gZGlmZmVyZW5jZXMgYXJlIGRldGVjdGVkIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCi0JICogSWYgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3IgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGEgdHdvLXdheQotCSAqIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkLgotCSAqIAotCSAqIEBwYXJhbSBwbSBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZGlmZmVyZW5jZXMgd2VyZSBmb3VuZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlRGlmZmVyZW5jZVtdIGZpbmREaWZmZXJlbmNlcyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJUmFuZ2VDb21wYXJhdG9yIGFuY2VzdG9yLCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIElSYW5nZUNvbXBhcmF0b3IgcmlnaHQpIHsKLQotCQlpZiAoYW5jZXN0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBmaW5kRGlmZmVyZW5jZXMocG0sIGxlZnQsIHJpZ2h0KTsKLQotCQlSYW5nZURpZmZlcmVuY2VbXSBsZWZ0QW5jZXN0b3JTY3JpcHQ9IG51bGw7Ci0JCVJhbmdlRGlmZmVyZW5jZVtdIHJpZ2h0QW5jZXN0b3JTY3JpcHQ9IGZpbmREaWZmZXJlbmNlcyhwbSwgYW5jZXN0b3IsIHJpZ2h0KTsKLQkJaWYgKHJpZ2h0QW5jZXN0b3JTY3JpcHQgIT0gbnVsbCkKLQkJCWxlZnRBbmNlc3RvclNjcmlwdD0gZmluZERpZmZlcmVuY2VzKHBtLCBhbmNlc3RvciwgbGVmdCk7Ci0JCWlmIChyaWdodEFuY2VzdG9yU2NyaXB0ID09IG51bGwgfHwgbGVmdEFuY2VzdG9yU2NyaXB0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEaWZmZXJlbmNlc0l0ZXJhdG9yIG15SXRlcj0gbmV3IERpZmZlcmVuY2VzSXRlcmF0b3IocmlnaHRBbmNlc3RvclNjcmlwdCk7Ci0JCURpZmZlcmVuY2VzSXRlcmF0b3IgeW91ckl0ZXI9IG5ldyBEaWZmZXJlbmNlc0l0ZXJhdG9yKGxlZnRBbmNlc3RvclNjcmlwdCk7Ci0KLQkJTGlzdCBkaWZmMz0gbmV3IEFycmF5TGlzdCgpOwotCQlkaWZmMy5hZGQobmV3IFJhbmdlRGlmZmVyZW5jZShSYW5nZURpZmZlcmVuY2UuRVJST1IpKTsgLy8gYWRkIGEgc2VudGluZWwKLQotCQlpbnQgY2hhbmdlUmFuZ2VTdGFydD0gMDsKLQkJaW50IGNoYW5nZVJhbmdlRW5kPSAwOwotCQkvLwotCQkvLyBDb21iaW5lIHRoZSB0d28gdHdvLXdheSBlZGl0IHNjcmlwdHMgaW50byBvbmUKLQkJLy8KLQkJd2hpbGUgKG15SXRlci5mRGlmZmVyZW5jZSAhPSBudWxsIHx8IHlvdXJJdGVyLmZEaWZmZXJlbmNlICE9IG51bGwpIHsKLQotCQkJRGlmZmVyZW5jZXNJdGVyYXRvciBzdGFydFRocmVhZDsKLQkJCW15SXRlci5yZW1vdmVBbGwoKTsKLQkJCXlvdXJJdGVyLnJlbW92ZUFsbCgpOwotCQkJLy8KLQkJCS8vIHRha2UgdGhlIG5leHQgZGlmZiB0aGF0IGlzIGNsb3NlciB0byB0aGUgc3RhcnQKLQkJCS8vCi0JCQlpZiAobXlJdGVyLmZEaWZmZXJlbmNlID09IG51bGwpCi0JCQkJc3RhcnRUaHJlYWQ9IHlvdXJJdGVyOwotCQkJZWxzZSBpZiAoeW91ckl0ZXIuZkRpZmZlcmVuY2UgPT0gbnVsbCkKLQkJCQlzdGFydFRocmVhZD0gbXlJdGVyOwotCQkJZWxzZSB7IC8vIG5vdCBhdCBlbmQgb2YgYm90aCBzY3JpcHRzIHRha2UgdGhlIGxvd2VzdCByYW5nZQotCQkJCWlmIChteUl0ZXIuZkRpZmZlcmVuY2UuZkxlZnRTdGFydCA8PSB5b3VySXRlci5mRGlmZmVyZW5jZS5mTGVmdFN0YXJ0KSAvLyAyIC0+IGNvbW1vbiAoQW5jZXN0b3IpIGNoYW5nZSByYW5nZQotCQkJCQlzdGFydFRocmVhZD0gbXlJdGVyOwotCQkJCWVsc2UKLQkJCQkJc3RhcnRUaHJlYWQ9IHlvdXJJdGVyOwotCQkJfQotCQkJY2hhbmdlUmFuZ2VTdGFydD0gc3RhcnRUaHJlYWQuZkRpZmZlcmVuY2UuZkxlZnRTdGFydDsKLQkJCWNoYW5nZVJhbmdlRW5kPSBzdGFydFRocmVhZC5mRGlmZmVyZW5jZS5sZWZ0RW5kKCk7Ci0KLQkJCXN0YXJ0VGhyZWFkLm5leHQoKTsKLQkJCS8vCi0JCQkvLyBjaGVjayBmb3Igb3ZlcmxhcHBpbmcgY2hhbmdlcyB3aXRoIG90aGVyIHRocmVhZAotCQkJLy8gbWVyZ2Ugb3ZlcmxhcHBpbmcgY2hhbmdlcyB3aXRoIHRoaXMgcmFuZ2UKLQkJCS8vCi0JCQlEaWZmZXJlbmNlc0l0ZXJhdG9yIG90aGVyPSBzdGFydFRocmVhZC5vdGhlcihteUl0ZXIsIHlvdXJJdGVyKTsKLQkJCXdoaWxlIChvdGhlci5mRGlmZmVyZW5jZSAhPSBudWxsICYmIG90aGVyLmZEaWZmZXJlbmNlLmZMZWZ0U3RhcnQgPD0gY2hhbmdlUmFuZ2VFbmQpIHsKLQkJCQlpbnQgbmV3TWF4PSBvdGhlci5mRGlmZmVyZW5jZS5sZWZ0RW5kKCk7Ci0JCQkJb3RoZXIubmV4dCgpOwotCQkJCWlmIChuZXdNYXggPj0gY2hhbmdlUmFuZ2VFbmQpIHsKLQkJCQkJY2hhbmdlUmFuZ2VFbmQ9IG5ld01heDsKLQkJCQkJb3RoZXI9IG90aGVyLm90aGVyKG15SXRlciwgeW91ckl0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWRpZmYzLmFkZChjcmVhdGVSYW5nZURpZmZlcmVuY2UzKG15SXRlciwgeW91ckl0ZXIsIGRpZmYzLCByaWdodCwgbGVmdCwgY2hhbmdlUmFuZ2VTdGFydCwgY2hhbmdlUmFuZ2VFbmQpKTsKLQkJfQotCi0JCS8vIHJlbW92ZSBzZW50aW5lbAotCQlkaWZmMy5yZW1vdmUoMCk7Ci0JCXJldHVybiAoUmFuZ2VEaWZmZXJlbmNlW10pIGRpZmYzLnRvQXJyYXkoRU1QVFlfUkVTVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdHdvIDxjb2RlPklSYW5nZUNvbXBhcmF0b3I8L2NvZGU+cy4KLQkgKiBJbiBjb250cmFzdCB0byA8Y29kZT5maW5kRGlmZmVyZW5jZXM8L2NvZGU+LCB0aGUgcmVzdWx0Ci0JICogY29udGFpbnMgPGNvZGU+UmFuZ2VEaWZmZXJlbmNlPC9jb2RlPiBlbGVtZW50cyBmb3Igbm9uLWRpZmZlcmluZyByYW5nZXMgdG9vLgotCSAqIAotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJhbmdlIGRpZmZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBmaW5kUmFuZ2VzKElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgSVJhbmdlQ29tcGFyYXRvciByaWdodCkgewotCQlyZXR1cm4gZmluZFJhbmdlcygoSVByb2dyZXNzTW9uaXRvciludWxsLCBsZWZ0LCByaWdodCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbmRzIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyB0d28gPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIEluIGNvbnRyYXN0IHRvIDxjb2RlPmZpbmREaWZmZXJlbmNlczwvY29kZT4sIHRoZSByZXN1bHQKLQkgKiBjb250YWlucyA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+IGVsZW1lbnRzIGZvciBub24tZGlmZmVyaW5nIHJhbmdlcyB0b28uCi0JICogCi0JICogQHBhcmFtIHBtIGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcwotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJhbmdlIGRpZmZlcmVuY2VzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2VEaWZmZXJlbmNlW10gZmluZFJhbmdlcyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJUmFuZ2VDb21wYXJhdG9yIGxlZnQsIElSYW5nZUNvbXBhcmF0b3IgcmlnaHQpIHsKLQkJUmFuZ2VEaWZmZXJlbmNlW10gaW49IGZpbmREaWZmZXJlbmNlcyhwbSwgbGVmdCwgcmlnaHQpOwotCQlMaXN0IG91dD0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVJhbmdlRGlmZmVyZW5jZSByZDsKLQotCQlpbnQgbXN0YXJ0PSAwOwotCQlpbnQgeXN0YXJ0PSAwOwotCi0JCWZvciAoaW50IGk9IDA7IGkgPCBpbi5sZW5ndGg7IGkrKykgewotCQkJUmFuZ2VEaWZmZXJlbmNlIGVzPSBpbltpXTsKLQotCQkJcmQ9IG5ldyBSYW5nZURpZmZlcmVuY2UoUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFLCBtc3RhcnQsIGVzLnJpZ2h0U3RhcnQoKSAtIG1zdGFydCwgeXN0YXJ0LCBlcy5sZWZ0U3RhcnQoKSAtIHlzdGFydCk7Ci0JCQlpZiAocmQubWF4TGVuZ3RoKCkgIT0gMCkKLQkJCQlvdXQuYWRkKHJkKTsKLQotCQkJb3V0LmFkZChlcyk7Ci0KLQkJCW1zdGFydD0gZXMucmlnaHRFbmQoKTsKLQkJCXlzdGFydD0gZXMubGVmdEVuZCgpOwotCQl9Ci0JCXJkPSBuZXcgUmFuZ2VEaWZmZXJlbmNlKFJhbmdlRGlmZmVyZW5jZS5OT0NIQU5HRSwgbXN0YXJ0LCByaWdodC5nZXRSYW5nZUNvdW50KCkgLSBtc3RhcnQsIHlzdGFydCwgbGVmdC5nZXRSYW5nZUNvdW50KCkgLSB5c3RhcnQpOwotCQlpZiAocmQubWF4TGVuZ3RoKCkgPiAwKQotCQkJb3V0LmFkZChyZCk7Ci0KLQkJcmV0dXJuIChSYW5nZURpZmZlcmVuY2VbXSkgb3V0LnRvQXJyYXkoRU1QVFlfUkVTVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdGhyZWUgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIEluIGNvbnRyYXN0IHRvIDxjb2RlPmZpbmREaWZmZXJlbmNlczwvY29kZT4sIHRoZSByZXN1bHQKLQkgKiBjb250YWlucyA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+IGVsZW1lbnRzIGZvciBub24tZGlmZmVyaW5nIHJhbmdlcyB0b28uCi0JICogSWYgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3IgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGEgdHdvLXdheQotCSAqIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkLgotCSAqIAotCSAqIEBwYXJhbSBhbmNlc3RvciB0aGUgYW5jZXN0b3IgcmFuZ2UgY29tcGFyYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IHJhbmdlIGNvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJhbmdlIGRpZmZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBmaW5kUmFuZ2VzKElSYW5nZUNvbXBhcmF0b3IgYW5jZXN0b3IsIElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgSVJhbmdlQ29tcGFyYXRvciByaWdodCkgewotCQlyZXR1cm4gZmluZFJhbmdlcyhudWxsLCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdGhyZWUgPGNvZGU+SVJhbmdlQ29tcGFyYXRvcjwvY29kZT5zLgotCSAqIEluIGNvbnRyYXN0IHRvIDxjb2RlPmZpbmREaWZmZXJlbmNlczwvY29kZT4sIHRoZSByZXN1bHQKLQkgKiBjb250YWlucyA8Y29kZT5SYW5nZURpZmZlcmVuY2U8L2NvZGU+IGVsZW1lbnRzIGZvciBub24tZGlmZmVyaW5nIHJhbmdlcyB0b28uCi0JICogSWYgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3IgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGEgdHdvLXdheQotCSAqIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkLgotCSAqIAotCSAqIEBwYXJhbSBwbSBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGFuY2VzdG9yIHJhbmdlIGNvbXBhcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCByYW5nZSBjb21wYXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCByYW5nZSBjb21wYXJhdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByYW5nZSBkaWZmZXJlbmNlcwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlRGlmZmVyZW5jZVtdIGZpbmRSYW5nZXMoSVByb2dyZXNzTW9uaXRvciBwbSwgSVJhbmdlQ29tcGFyYXRvciBhbmNlc3RvciwgSVJhbmdlQ29tcGFyYXRvciBsZWZ0LCBJUmFuZ2VDb21wYXJhdG9yIHJpZ2h0KSB7Ci0KLQkJaWYgKGFuY2VzdG9yID09IG51bGwpCi0JCQlyZXR1cm4gZmluZFJhbmdlcyhwbSwgbGVmdCwgcmlnaHQpOwotCi0JCVJhbmdlRGlmZmVyZW5jZVtdIGluPSBmaW5kRGlmZmVyZW5jZXMocG0sIGFuY2VzdG9yLCBsZWZ0LCByaWdodCk7Ci0JCUxpc3Qgb3V0PSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJUmFuZ2VEaWZmZXJlbmNlIHJkOwotCi0JCWludCBtc3RhcnQ9IDA7Ci0JCWludCB5c3RhcnQ9IDA7Ci0JCWludCBhc3RhcnQ9IDA7Ci0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGluLmxlbmd0aDsgaSsrKSB7Ci0JCQlSYW5nZURpZmZlcmVuY2UgZXM9IGluW2ldOwotCi0JCQlyZD0gbmV3IFJhbmdlRGlmZmVyZW5jZShSYW5nZURpZmZlcmVuY2UuTk9DSEFOR0UsIG1zdGFydCwgZXMucmlnaHRTdGFydCgpIC0gbXN0YXJ0LCB5c3RhcnQsIGVzLmxlZnRTdGFydCgpIC0geXN0YXJ0LCBhc3RhcnQsIGVzLmFuY2VzdG9yU3RhcnQoKSAtIGFzdGFydCk7Ci0JCQlpZiAocmQubWF4TGVuZ3RoKCkgPiAwKQotCQkJCW91dC5hZGQocmQpOwotCi0JCQlvdXQuYWRkKGVzKTsKLQotCQkJbXN0YXJ0PSBlcy5yaWdodEVuZCgpOwotCQkJeXN0YXJ0PSBlcy5sZWZ0RW5kKCk7Ci0JCQlhc3RhcnQ9IGVzLmFuY2VzdG9yRW5kKCk7Ci0JCX0KLQkJcmQ9IG5ldyBSYW5nZURpZmZlcmVuY2UoUmFuZ2VEaWZmZXJlbmNlLk5PQ0hBTkdFLCBtc3RhcnQsIHJpZ2h0LmdldFJhbmdlQ291bnQoKSAtIG1zdGFydCwgeXN0YXJ0LCBsZWZ0LmdldFJhbmdlQ291bnQoKSAtIHlzdGFydCwgYXN0YXJ0LCBhbmNlc3Rvci5nZXRSYW5nZUNvdW50KCkgLSBhc3RhcnQpOwotCQlpZiAocmQubWF4TGVuZ3RoKCkgPiAwKQotCQkJb3V0LmFkZChyZCk7Ci0KLQkJcmV0dXJuIChSYW5nZURpZmZlcmVuY2VbXSkgb3V0LnRvQXJyYXkoRU1QVFlfUkVTVUxUKTsKLQl9Ci0KLQkvLy0tLS0gcHJpdmF0ZSBtZXRob2RzCi0KLQkvKgotCSAqIENyZWF0ZXMgYSBWZWN0b3Igb2YgRGlmZmVyZW5jZXNSYW5nZXMgb3V0IG9mIHRoZSBMaW5rZWRSYW5nZURpZmZlcmVuY2UuCi0JICogSXQgY29hbGVzY2VzIGFkamFjZW50IGNoYW5nZXMuCi0JICogSW4gYWRkaXRpb24sIGluZGljZXMgYXJlIGNoYW5nZWQgc3VjaCB0aGF0IHRoZSByYW5nZXMgYXJlIDEpIG9wZW4sIGkuZSwKLQkgKiB0aGUgZW5kIG9mIHRoZSByYW5nZSBpcyBub3QgaW5jbHVkZWQsIGFuZCAyKSBhcmUgemVybyBiYXNlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBSYW5nZURpZmZlcmVuY2VbXSBjcmVhdGVEaWZmZXJlbmNlc1JhbmdlcyhMaW5rZWRSYW5nZURpZmZlcmVuY2Ugc3RhcnQpIHsKLQotCQlMaW5rZWRSYW5nZURpZmZlcmVuY2UgZXA9IHJldmVyc2VEaWZmZXJlbmNlcyhzdGFydCk7Ci0JCUFycmF5TGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJUmFuZ2VEaWZmZXJlbmNlIGVzPSBudWxsOwotCi0JCXdoaWxlIChlcCAhPSBudWxsKSB7Ci0JCQllcz0gbmV3IFJhbmdlRGlmZmVyZW5jZShSYW5nZURpZmZlcmVuY2UuQ0hBTkdFKTsKLQotCQkJaWYgKGVwLmlzSW5zZXJ0KCkpIHsKLQkJCQllcy5mUmlnaHRTdGFydD0gZXAuZlJpZ2h0U3RhcnQgKyAxOwotCQkJCWVzLmZMZWZ0U3RhcnQ9IGVwLmZMZWZ0U3RhcnQ7Ci0JCQkJUmFuZ2VEaWZmZXJlbmNlIGI9IGVwOwotCQkJCWRvIHsKLQkJCQkJZXA9IGVwLmdldE5leHQoKTsKLQkJCQkJZXMuZkxlZnRMZW5ndGgrKzsKLQkJCQl9IHdoaWxlIChlcCAhPSBudWxsICYmIGVwLmlzSW5zZXJ0KCkgJiYgZXAuZlJpZ2h0U3RhcnQgPT0gYi5mUmlnaHRTdGFydCk7Ci0JCQl9IGVsc2UgewotCQkJCWVzLmZSaWdodFN0YXJ0PSBlcC5mUmlnaHRTdGFydDsKLQkJCQllcy5mTGVmdFN0YXJ0PSBlcC5mTGVmdFN0YXJ0OwotCi0JCQkJUmFuZ2VEaWZmZXJlbmNlIGE9IGVwOwotCQkJCS8vCi0JCQkJLy8gZGVsZXRlZCBsaW5lcwotCQkJCS8vCi0JCQkJZG8gewotCQkJCQlhPSBlcDsKLQkJCQkJZXA9IGVwLmdldE5leHQoKTsKLQkJCQkJZXMuZlJpZ2h0TGVuZ3RoKys7Ci0JCQkJfSB3aGlsZSAoZXAgIT0gbnVsbCAmJiBlcC5pc0RlbGV0ZSgpICYmIGVwLmZSaWdodFN0YXJ0ID09IGEuZlJpZ2h0U3RhcnQgKyAxKTsKLQotCQkJCWJvb2xlYW4gY2hhbmdlPSAoZXAgIT0gbnVsbCAmJiBlcC5pc0luc2VydCgpICYmIGVwLmZSaWdodFN0YXJ0ID09IGEuZlJpZ2h0U3RhcnQpOwotCi0JCQkJaWYgKGNoYW5nZSkgewotCQkJCQlSYW5nZURpZmZlcmVuY2UgYj0gZXA7Ci0JCQkJCS8vCi0JCQkJCS8vIHJlcGxhY2VtZW50IGxpbmVzCi0JCQkJCS8vCi0JCQkJCWRvIHsKLQkJCQkJCWVwPSBlcC5nZXROZXh0KCk7Ci0JCQkJCQllcy5mTGVmdExlbmd0aCsrOwotCQkJCQl9IHdoaWxlIChlcCAhPSBudWxsICYmIGVwLmlzSW5zZXJ0KCkgJiYgZXAuZlJpZ2h0U3RhcnQgPT0gYi5mUmlnaHRTdGFydCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXMuZkxlZnRMZW5ndGg9IDA7Ci0JCQkJfQotCQkJCWVzLmZMZWZ0U3RhcnQrKzsgLy8gbWVhbmluZyBvZiByYW5nZSBjaGFuZ2VzIGZyb20gImluc2VydCBhZnRlciIsIHRvICJyZXBsYWNlIHdpdGgiCi0KLQkJCX0KLQkJCS8vCi0JCQkvLyB0aGUgc2NyaXB0IGNvbW1hbmRzIGFyZSAxIGJhc2VkLCBzdWJ0cmFjdCBvbmUgdG8gbWFrZSB0aGVtIHplcm8gYmFzZWQKLQkJCS8vCi0JCQllcy5mUmlnaHRTdGFydC0tOwotCQkJZXMuZkxlZnRTdGFydC0tOwotCQkJcmVzdWx0LmFkZChlcyk7Ci0JCX0KLQkJcmV0dXJuIChSYW5nZURpZmZlcmVuY2VbXSkgcmVzdWx0LnRvQXJyYXkoRU1QVFlfUkVTVUxUKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5SYW5nZURpZmZlcmVuY2UzPC9jb2RlPiBnaXZlbiB0aGUKLQkgKiBzdGF0ZSBvZiB0d28gRGlmZmVyZW5jZUl0ZXJhdG9ycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBSYW5nZURpZmZlcmVuY2UgY3JlYXRlUmFuZ2VEaWZmZXJlbmNlMyhEaWZmZXJlbmNlc0l0ZXJhdG9yIG15SXRlciwgRGlmZmVyZW5jZXNJdGVyYXRvciB5b3VySXRlciwgTGlzdCBkaWZmMywgCi0JCUlSYW5nZUNvbXBhcmF0b3IgcmlnaHQsIElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgaW50IGNoYW5nZVJhbmdlU3RhcnQsICBpbnQgY2hhbmdlUmFuZ2VFbmQpIHsKLQotCQlpbnQgcmlnaHRTdGFydCwgcmlnaHRFbmQ7Ci0JCWludCBsZWZ0U3RhcnQsIGxlZnRFbmQ7Ci0JCWludCBraW5kPSBSYW5nZURpZmZlcmVuY2UuRVJST1I7Ci0JCVJhbmdlRGlmZmVyZW5jZSBsYXN0PSAoUmFuZ2VEaWZmZXJlbmNlKSBkaWZmMy5nZXQoZGlmZjMuc2l6ZSgpIC0gMSk7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZSgobXlJdGVyLmdldENvdW50KCkgIT0gMCB8fCB5b3VySXRlci5nZXRDb3VudCgpICE9IDApKTsJLy8gQXQgbGVhc3Qgb25lIHJhbmdlIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5Ci0JCS8vCi0JCS8vIGZpbmQgY29ycmVzcG9uZGluZyBsaW5lcyB0byBmQ2hhbmdlUmFuZ2VTdGFydC9FbmQgaW4gcmlnaHQgYW5kIGxlZnQKLQkJLy8KLQkJaWYgKG15SXRlci5nZXRDb3VudCgpID09IDApIHsgLy8gb25seSBsZWZ0IGNoYW5nZWQKLQkJCXJpZ2h0U3RhcnQ9IGNoYW5nZVJhbmdlU3RhcnQgLSBsYXN0LmFuY2VzdG9yRW5kKCkgKyBsYXN0LnJpZ2h0RW5kKCk7Ci0JCQlyaWdodEVuZD0gY2hhbmdlUmFuZ2VFbmQgLSBsYXN0LmFuY2VzdG9yRW5kKCkgKyBsYXN0LnJpZ2h0RW5kKCk7Ci0JCQlraW5kPSBSYW5nZURpZmZlcmVuY2UuTEVGVDsKLQkJfSBlbHNlIHsKLQkJCVJhbmdlRGlmZmVyZW5jZSBmPSAoUmFuZ2VEaWZmZXJlbmNlKSBteUl0ZXIuZlJhbmdlLmdldCgwKTsKLQkJCVJhbmdlRGlmZmVyZW5jZSBsPSAoUmFuZ2VEaWZmZXJlbmNlKSBteUl0ZXIuZlJhbmdlLmdldChteUl0ZXIuZlJhbmdlLnNpemUoKSAtIDEpOwotCQkJcmlnaHRTdGFydD0gY2hhbmdlUmFuZ2VTdGFydCAtIGYuZkxlZnRTdGFydCArIGYuZlJpZ2h0U3RhcnQ7Ci0JCQlyaWdodEVuZD0gY2hhbmdlUmFuZ2VFbmQgLSBsLmxlZnRFbmQoKSArIGwucmlnaHRFbmQoKTsKLQkJfQotCi0JCWlmICh5b3VySXRlci5nZXRDb3VudCgpID09IDApIHsgLy8gb25seSByaWdodCBjaGFuZ2VkCi0JCQlsZWZ0U3RhcnQ9IGNoYW5nZVJhbmdlU3RhcnQgLSBsYXN0LmFuY2VzdG9yRW5kKCkgKyBsYXN0LmxlZnRFbmQoKTsKLQkJCWxlZnRFbmQ9IGNoYW5nZVJhbmdlRW5kIC0gbGFzdC5hbmNlc3RvckVuZCgpICsgbGFzdC5sZWZ0RW5kKCk7Ci0JCQlraW5kPSBSYW5nZURpZmZlcmVuY2UuUklHSFQ7Ci0JCX0gZWxzZSB7Ci0JCQlSYW5nZURpZmZlcmVuY2UgZj0gKFJhbmdlRGlmZmVyZW5jZSkgeW91ckl0ZXIuZlJhbmdlLmdldCgwKTsKLQkJCVJhbmdlRGlmZmVyZW5jZSBsPSAoUmFuZ2VEaWZmZXJlbmNlKSB5b3VySXRlci5mUmFuZ2UuZ2V0KHlvdXJJdGVyLmZSYW5nZS5zaXplKCkgLSAxKTsKLQkJCWxlZnRTdGFydD0gY2hhbmdlUmFuZ2VTdGFydCAtIGYuZkxlZnRTdGFydCArIGYuZlJpZ2h0U3RhcnQ7Ci0JCQlsZWZ0RW5kPSBjaGFuZ2VSYW5nZUVuZCAtIGwubGVmdEVuZCgpICsgbC5yaWdodEVuZCgpOwotCQl9Ci0KLQkJaWYgKGtpbmQgPT0gUmFuZ2VEaWZmZXJlbmNlLkVSUk9SKSB7IC8vIG92ZXJsYXBwaW5nIGNoYW5nZSAoY29uZmxpY3QpIC0+IGNvbXBhcmUgdGhlIGNoYW5nZWQgcmFuZ2VzCi0JCQlpZiAocmFuZ2VTcGFuc0VxdWFsKHJpZ2h0LCByaWdodFN0YXJ0LCByaWdodEVuZCAtIHJpZ2h0U3RhcnQsIGxlZnQsIGxlZnRTdGFydCwgbGVmdEVuZCAtIGxlZnRTdGFydCkpCi0JCQkJa2luZD0gUmFuZ2VEaWZmZXJlbmNlLkFOQ0VTVE9SOwotCQkJZWxzZQotCQkJCWtpbmQ9IFJhbmdlRGlmZmVyZW5jZS5DT05GTElDVDsKLQkJfQotCQlyZXR1cm4gbmV3IFJhbmdlRGlmZmVyZW5jZShraW5kLCByaWdodFN0YXJ0LCByaWdodEVuZCAtIHJpZ2h0U3RhcnQsIGxlZnRTdGFydCwgbGVmdEVuZCAtIGxlZnRTdGFydCwgY2hhbmdlUmFuZ2VTdGFydCwgY2hhbmdlUmFuZ2VFbmQgLSBjaGFuZ2VSYW5nZVN0YXJ0KTsKLQl9Ci0KLQkvKgotCSAqIFRlc3RzIGlmIHR3byByYW5nZXMgYXJlIGVxdWFsCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByYW5nZXNFcXVhbChJUmFuZ2VDb21wYXJhdG9yIGEsIGludCBhaSwgSVJhbmdlQ29tcGFyYXRvciBiLCBpbnQgYmkpIHsKLQkJcmV0dXJuIGEucmFuZ2VzRXF1YWwoYWksIGIsIGJpKTsKLQl9Ci0KLQkvKgotCSAqIFRlc3RzIHdoZXRoZXIgPGNvZGU+cmlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5sZWZ0PC9sZWZ0PiBjaGFuZ2VkIGluIHRoZSBzYW1lIHdheQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmFuZ2VTcGFuc0VxdWFsKElSYW5nZUNvbXBhcmF0b3IgcmlnaHQsIGludCByaWdodFN0YXJ0LCBpbnQgcmlnaHRMZW4sIElSYW5nZUNvbXBhcmF0b3IgbGVmdCwgaW50IGxlZnRTdGFydCwgaW50IGxlZnRMZW4pIHsKLQkJaWYgKHJpZ2h0TGVuID09IGxlZnRMZW4pIHsKLQkJCWludCBpPSAwOwotCQkJZm9yIChpPSAwOyBpIDwgcmlnaHRMZW47IGkrKykgewotCQkJCWlmICghcmFuZ2VzRXF1YWwocmlnaHQsIHJpZ2h0U3RhcnQgKyBpLCBsZWZ0LCBsZWZ0U3RhcnQgKyBpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaSA9PSByaWdodExlbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBSZXZlcnNlcyB0aGUgcmFuZ2UgZGlmZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaW5rZWRSYW5nZURpZmZlcmVuY2UgcmV2ZXJzZURpZmZlcmVuY2VzKExpbmtlZFJhbmdlRGlmZmVyZW5jZSBzdGFydCkgewotCQlMaW5rZWRSYW5nZURpZmZlcmVuY2UgZXAsIGJlaGluZCwgYWhlYWQ7Ci0KLQkJYWhlYWQ9IHN0YXJ0OwotCQllcD0gbnVsbDsKLQkJd2hpbGUgKGFoZWFkICE9IG51bGwpIHsKLQkJCWJlaGluZD0gZXA7Ci0JCQllcD0gYWhlYWQ7Ci0JCQlhaGVhZD0gYWhlYWQuZ2V0TmV4dCgpOwotCQkJZXAuc2V0TmV4dChiZWhpbmQpOwotCQl9Ci0JCXJldHVybiBlcDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3JhbmdlZGlmZmVyZW5jZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODA2OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvcmFuZ2VkaWZmZXJlbmNlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luTlQ7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIGZpbmRpbmcgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KLXR3byBvciB0aHJlZSBzZXF1ZW5jZXMgb2YgY29tcGFyYWJsZSBlbnRpdGllcy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci0KLVRoZSBjbGFzcyA8Yj5SYW5nZURpZmZlcmVuY2VyPC9iPiBmaW5kcyBsb25nZXN0IHNlcXVlbmNlcyBvZiBtYXRjaGluZyBhbmQKLW5vbi1tYXRjaGluZyBjb21wYXJhYmxlIGVudGl0aWVzLiBJdHMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLWFuIG9iamVjdGlmaWVkIHZlcnNpb24gb2YgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW46Ci08aT5BIEZpbGUgQ29tcGFyaXNvbiBQcm9ncmFtLDwvaT4gYnkgV2ViYiBNaWxsZXIgYW5kIEV1Z2VuZSBXLiBNeWVycywKLVNvZnR3YXJlIFByYWN0aWNlIGFuZCBFeHBlcmllbmNlLCBWb2wuIDE1LCBOb3YuIDE5ODUuCi08cD4KLQotQ2xpZW50cyBtdXN0IHN1cHBseSB0aGUgaW5wdXQgdG8gdGhlIGRpZmZlcmVuY2VyIGFzIGFuIGltcGxlbWVudGF0aW9uCi1vZiB0aGUgPGI+SVJhbmdlQ29tcGFyYXRvcjwvYj4gaW50ZXJmYWNlLgotQW4gPGI+SVJhbmdlQ29tcGFyYXRvcjwvYj4gYnJlYWtzIHRoZSBpbnB1dCBkYXRhIGludG8gYSBzZXF1ZW5jZQotb2YgZW50aXRpZXMgYW5kIHByb3ZpZGVzIGEgbWV0aG9kIGZvciBjb21wYXJpbmcKLW9uZSBlbnRpdHkgd2l0aCB0aGUgZW50aXR5IGluIGFub3RoZXIgPGI+SVJhbmdlQ29tcGFyYXRvcjwvYj4uCi08cD4KLQotRm9yIGV4YW1wbGUsIHRvIGNvbXBhcmUgdHdvIHRleHQgZG9jdW1lbnRzIGFuZCBmaW5kIGxvbmdlc3QgY29tbW9uCi1zZXF1ZW5jZXMgb2YgbWF0Y2hpbmcgYW5kIG5vbi1tYXRjaGluZyBsaW5lcywKLXRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Yj5JUmFuZ2VDb21wYXJhdG9yPC9iPiAKLW11c3QgYnJlYWsgdGhlIGRvY3VtZW50IGludG8gbGluZXMgYW5kIHByb3ZpZGUgYSBtZXRob2QgZm9yIHRlc3RpbmcKLXdoZXRoZXIgdHdvIGxpbmVzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotU2VlIDxiPm9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuRG9jTGluZUNvbXBhcmF0b3I8L2I+IGZvciBob3cgdGhpcyBjYW4gYmUgZG9uZS4KLTxwPgotCi1UaGUgZGlmZmVyZW5jZXIgcmV0dXJucyB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgdGhlc2Ugc2VxdWVuY2VzIGFzIGFuCi1hcnJheSBvZiA8Yj5SYW5nZURpZmZlcmVuY2U8L2I+IG9iamVjdHMuCi1FdmVyeSBzaW5nbGUgPGI+UmFuZ2VEaWZmZXJlbmNlPC9iPiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZQotKG5vIGNoYW5nZSwgY2hhbmdlLCBhZGRpdGlvbiwgZGVsZXRpb24pIGFuZCB0aGUgY29ycmVzcG9uZGluZyByYW5nZXMKLW9mIHRoZSB1bmRlcmx5aW5nIGNvbXBhcmFibGUgZW50aXRpZXMgaW4gdGhlIHR3byBvciB0aHJlZSBpbnB1dHMuCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmNTVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpZmYgY29udGFpbmVyIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCwgb3IgZnVydGhlciBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlmZkNvbnRhaW5lciBleHRlbmRzIERpZmZFbGVtZW50IGltcGxlbWVudHMgSURpZmZDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSURpZmZFbGVtZW50W10gZmdFbXB0eUFycmF5PSBuZXcgSURpZmZFbGVtZW50WzBdOwotCXByaXZhdGUgQXJyYXlMaXN0IGZDaGlsZHJlbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQga2luZCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LiAKLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdW5kZXIgd2hpY2ggdGhlIG5ldyBjb250YWluZXIgaXMgYWRkZWQgYXMgYSBjaGlsZCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0ga2luZCBvZiBkaWZmZXJlbmNlIChkZWZpbmVkIGluIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPikuCi0JICovCi0JcHVibGljIERpZmZDb250YWluZXIoSURpZmZDb250YWluZXIgcGFyZW50LCBpbnQga2luZCkgewotCQlzdXBlcihwYXJlbnQsIGtpbmQpOwotCX0KLQkKLQkvKioKLQkgKiBUcmllcyB0byBmaW5kIHRoZSBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBjaGlsZCBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIG5hbWUgb2YgdGhlIGNoaWxkIHRvIGZpbmQKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IHdpdGggYSBtYXRjaGluZyBuYW1lCi0JICovCi0JcHVibGljIElEaWZmRWxlbWVudCBmaW5kQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSURpZmZFbGVtZW50IGNoaWxkPSAoSURpZmZFbGVtZW50KSBjaGlsZHJlbltpXTsKLQkJCWlmIChuYW1lLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEaWZmQ29udGFpbmVyLmFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChJRGlmZkVsZW1lbnQgZGlmZikgewotCQlpZiAoZkNoaWxkcmVuID09IG51bGwpCi0JCQlmQ2hpbGRyZW49IG5ldyBBcnJheUxpc3QoKTsKLQkJZkNoaWxkcmVuLmFkZChkaWZmKTsKLQkJZGlmZi5zZXRQYXJlbnQodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIHRoaXMgY29udGFpbmVyLgotCSAqIElmIHRoZSBjb250YWluZXIgYmVjb21lcyBlbXB0eSBpdCBpcyByZW1vdmVkIGZyb20gaXRzIGNvbnRhaW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUb1Jvb3QoSURpZmZFbGVtZW50IGNoaWxkKSB7Ci0JCWlmIChmQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZkNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQobnVsbCk7Ci0JCQlpZiAoZkNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0JCQkJSURpZmZDb250YWluZXIgcD0gZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHAgIT0gbnVsbCkKLQkJCQkJcC5yZW1vdmVUb1Jvb3QodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCAobm9uLXJlY3Vyc2l2ZWx5KSBmcm9tIHRoaXMgY29udGFpbmVyLgotCSAqCi0JICogQHBhcmFtIGNoaWxkIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJRGlmZkVsZW1lbnQgY2hpbGQpIHsKLQkJaWYgKGZDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmQ2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQkJCWNoaWxkLnNldFBhcmVudChudWxsKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEaWZmQ29udGFpbmVyLmhhc0NoaWxkcmVuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBmQ2hpbGRyZW4gIT0gbnVsbCAmJiBmQ2hpbGRyZW4uc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEaWZmQ29udGFpbmVyLmdldENoaWxkcmVuCi0JICovCi0JcHVibGljIElEaWZmRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlpZiAoZkNoaWxkcmVuICE9IG51bGwpCi0JCQlyZXR1cm4gKElEaWZmRWxlbWVudFtdKSBmQ2hpbGRyZW4udG9BcnJheShmZ0VtcHR5QXJyYXkpOwotCQlyZXR1cm4gZmdFbXB0eUFycmF5OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OGZmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVR5cGVkRWxlbWVudDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5JRGlmZkVsZW1lbnQ8L2NvZGU+IGludGVyZmFjZS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgYWRkIGJlaGF2aW9yIGFuZCBzdGF0ZSwgYW5kIG1heSBvdmVycmlkZSA8Y29kZT5nZXRJbWFnZTwvY29kZT4KLSAqIGFuZCA8Y29kZT5nZXRUeXBlPC9jb2RlPiB0byBzdWl0LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlmZkVsZW1lbnQgaW1wbGVtZW50cyBJRGlmZkVsZW1lbnQgewotCi0JcHJpdmF0ZSBpbnQgZktpbmQ7Ci0JcHJpdmF0ZSBJRGlmZkNvbnRhaW5lciBmUGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWZmRWxlbWVudDwvY29kZT4gYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50LgotCSAqIElmIHBhcmVudCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlIG5ldyBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhpcyBjaGlsZDsgaWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoaXMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGEgY2hpbGQKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgRGlmZkVsZW1lbnQoSURpZmZDb250YWluZXIgcGFyZW50LCBpbnQga2luZCkgewotCQlmUGFyZW50PSBwYXJlbnQ7Ci0JCWZLaW5kPSBraW5kOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5EaWZmRWxlbWVudDwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JVHlwZWRJbnB1dDwvY29kZT4KLQkgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgcmUtaW1wbGVtZW50IHRvIHByb3ZpZGUKLQkgKiBhbiBpbWFnZSBmb3IgdGhpcyBlbGVtZW50LgotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+RGlmZkVsZW1lbnQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+SVR5cGVkRWxlbWVudDwvY29kZT4KLQkgKiBtZXRob2QgcmV0dXJucyA8Y29kZT5JVHlwZWRFbGVtZW50LlVOS05PV05fVFlQRTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5Ci0JICogcmUtaW1wbGVtZW50IHRvIHByb3ZpZGUgYSB0eXBlIGZvciB0aGlzIGVsZW1lbnQuCi0JICogQHJldHVybiA8Y29kZT5JVHlwZWRFbGVtZW50LlVOS05PV05fVFlQRTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUga2luZCBvZiBkaWZmZXJlbmNlIGZvciB0aGlzIGVsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0ga2luZCBzZXQgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZSB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cwotCSAqIEBzZWUgRGlmZmVyZW5jZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKGludCBraW5kKSB7Ci0JCWZLaW5kPSBraW5kOwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSURpZmZFbGVtZW50LmdldEtpbmQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBmS2luZDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEaWZmRWxlbWVudC5nZXRQYXJlbnQKLQkgKi8KLQlwdWJsaWMgSURpZmZDb250YWluZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZlBhcmVudDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElEaWZmRWxlbWVudC5zZXRQYXJlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSURpZmZDb250YWluZXIgcGFyZW50KSB7Ci0JCWZQYXJlbnQ9IHBhcmVudDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTAzMGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVXRpbGl0aWVzOwotCi0vKioKLSAqIERpZmYgbm9kZSBhcmUgdXNlZCBhcyB0aGUgY29tcGFyZSByZXN1bHQgb2YgdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUuCi0gKiBTaW5jZSBpdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5JVHlwZWRFbGVtZW50PC9jb2RlPiBhbmQgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4KLSAqIGludGVyZmFjZXMgaXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgdG8gZGlzcGxheSB0aGUKLSAqIGNvbXBhcmUgcmVzdWx0IGluIGEgPGNvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+IGFuZCBhcyB0aGUgaW5wdXQgdG8gYW55IG90aGVyCi0gKiBjb21wYXJlL21lcmdlIHZpZXdlci4KLSAqIDxwPgotICogPGNvZGU+RGlmZk5vZGU8L2NvZGU+cyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBwZXJmb3JtaW5nCi0gKiBhIGNvbXBhcmUgd2l0aCB0aGUgPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+LgotICogPHA+Ci0gKiBDbGllbnRzIHR5cGljYWxseSB1c2UgdGhpcyBjbGFzcyBhcyBpcywgYnV0IG1heSBzdWJjbGFzcyBpZiByZXF1aXJlZC4KLSAqIAotICogQHNlZSBEaWZmVHJlZVZpZXdlcgotICogQHNlZSBEaWZmZXJlbmNlcgotICovCi1wdWJsaWMgY2xhc3MgRGlmZk5vZGUgZXh0ZW5kcyBEaWZmQ29udGFpbmVyIGltcGxlbWVudHMgSVR5cGVkRWxlbWVudCwgSUNvbXBhcmVJbnB1dCB7Ci0KLQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZkFuY2VzdG9yOwotCXByaXZhdGUgSVR5cGVkRWxlbWVudCBmTGVmdDsKLQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZlJpZ2h0OwotCXByaXZhdGUgYm9vbGVhbiBmRG9udEV4cGFuZDsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZTd2FwU2lkZXM7Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpZmZOb2RlPC9jb2RlPiBhbmQgaW5pdGlhbGl6ZXMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB1bmRlciB3aGljaCB0aGUgbmV3IGNvbnRhaW5lciBpcyBhZGRlZCBhcyBhIGNoaWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGtpbmQgb2YgZGlmZmVyZW5jZSAoZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4pCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBjb21tb24gYW5jZXN0b3IgaW5wdXQgdG8gYSBjb21wYXJlCi0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgaW5wdXQgdG8gYSBjb21wYXJlCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBpbnB1dCB0byBhIGNvbXBhcmUKLQkgKi8KLQlwdWJsaWMgRGlmZk5vZGUoSURpZmZDb250YWluZXIgcGFyZW50LCBpbnQga2luZCwgSVR5cGVkRWxlbWVudCBhbmNlc3RvciwgSVR5cGVkRWxlbWVudCBsZWZ0LCBJVHlwZWRFbGVtZW50IHJpZ2h0KSB7Ci0JCXRoaXMocGFyZW50LCBraW5kKTsKLQkJZkFuY2VzdG9yPSBhbmNlc3RvcjsKLQkJZkxlZnQ9IGxlZnQ7Ci0JCWZSaWdodD0gcmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWZmTm9kZTwvY29kZT4gd2l0aCBkaWZmIGtpbmQgPGNvZGU+RGlmZmVyZW5jZXIuQ0hBTkdFPC9jb2RlPgotCSAqIGFuZCBpbml0aWFsaXplcyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCi0JICoKLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBpbnB1dCB0byBhIGNvbXBhcmUKLQkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGlucHV0IHRvIGEgY29tcGFyZQotCSAqLwotCXB1YmxpYyBEaWZmTm9kZShJVHlwZWRFbGVtZW50IGxlZnQsIElUeXBlZEVsZW1lbnQgcmlnaHQpIHsKLQkJdGhpcyhudWxsLCBEaWZmZXJlbmNlci5DSEFOR0UsIG51bGwsIGxlZnQsIHJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpZmZOb2RlPC9jb2RlPiBhbmQgaW5pdGlhbGl6ZXMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotCSAqCi0JICogQHBhcmFtIGtpbmQgb2YgZGlmZmVyZW5jZSAoZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4pCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBjb21tb24gYW5jZXN0b3IgaW5wdXQgdG8gYSBjb21wYXJlCi0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgaW5wdXQgdG8gYSBjb21wYXJlCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBpbnB1dCB0byBhIGNvbXBhcmUKLQkgKi8KLQlwdWJsaWMgRGlmZk5vZGUoaW50IGtpbmQsIElUeXBlZEVsZW1lbnQgYW5jZXN0b3IsIElUeXBlZEVsZW1lbnQgbGVmdCwgSVR5cGVkRWxlbWVudCByaWdodCkgewotCQl0aGlzKG51bGwsIGtpbmQsIGFuY2VzdG9yLCBsZWZ0LCByaWdodCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWZmTm9kZTwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gZGlmZiBraW5kLgotCSAqCi0JICogQHBhcmFtIGtpbmQgb2YgZGlmZmVyZW5jZSAoZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4pCi0JICovCi0JcHVibGljIERpZmZOb2RlKGludCBraW5kKSB7Ci0JCXN1cGVyKG51bGwsIGtpbmQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlmZk5vZGU8L2NvZGU+IGFuZCBpbml0aWFsaXplcyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHVuZGVyIHdoaWNoIHRoZSBuZXcgY29udGFpbmVyIGlzIGFkZGVkIGFzIGEgY2hpbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0ga2luZCBvZiBkaWZmZXJlbmNlIChkZWZpbmVkIGluIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPikKLQkgKi8KLQlwdWJsaWMgRGlmZk5vZGUoSURpZmZDb250YWluZXIgcGFyZW50LCBpbnQga2luZCkgewotCQlzdXBlcihwYXJlbnQsIGtpbmQpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIGZvciBjaGFuZ2VzIG9mIHRoaXMgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4uCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcihJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lciA9PSBudWxsKQotCQkJZkxpc3RlbmVyPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCWZMaXN0ZW5lci5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBVbnJlZ2lzdGVycyBhIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+IGxpc3RlbmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKElDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZMaXN0ZW5lci5yZW1vdmUobGlzdGVuZXIpOwotCQkJaWYgKGZMaXN0ZW5lci5pc0VtcHR5KCkpCi0JCQkJZkxpc3RlbmVyPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNlbmRzIG91dCBub3RpZmljYXRpb24gdGhhdCBhIGNoYW5nZSBoYXMgb2NjdXJlZCBvbiB0aGUgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNoYW5nZSgpIHsKLQkJaWYgKGZMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lci5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspCi0JCQkJKChJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkuY29tcGFyZUlucHV0Q2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLQotCS8vLS0tLSBnZXR0ZXJzICYgc2V0dGVycwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZGUgc2hvdWxkbid0IGF1dG9tYXRpY2FsbHkgYmUgZXhwYW5kZWQgaW4KLQkgKiBhIDwvY29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5vZGUgc2hvdWxkbid0IGF1dG9tYXRpY2FsbHkgYmUgZXhwYW5kZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkb250RXhwYW5kKCkgewotCQlyZXR1cm4gZkRvbnRFeHBhbmQ7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciB0aGlzIG5vZGUgaXMgbm90IGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgd2hlbiBkaXNwbGF5ZWQgaW4KLQkgKiBhIDwvY29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZG9udEV4cGFuZCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGlzIG5vZGUgaXMgbm90IGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgaW4gPC9jb2RlPkRpZmZUcmVlVmlld2VyPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvbnRFeHBhbmQoYm9vbGVhbiBkb250RXhwYW5kKSB7Ci0JCWZEb250RXhwYW5kPSBkb250RXhwYW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IG5vdC08Y29kZT5udWxsPC9jb2RlPiBpbnB1dCBvZiB0aGlzIG5vZGUuCi0JICogTWV0aG9kIGNoZWNrcyB0aGUgdGhyZWUgaW5wdXRzIGluIHRoZSBvcmRlcjogYW5jZXN0b3IsIHJpZ2h0LCBsZWZ0LgotCSAqCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm90LTxjb2RlPm51bGw8L2NvZGU+IGlucHV0IG9mIHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IGdldElkKCkgewotCQlpZiAoZkFuY2VzdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gZkFuY2VzdG9yOwotCQlpZiAoZlJpZ2h0ICE9IG51bGwpCi0JCQlyZXR1cm4gZlJpZ2h0OwotCQlyZXR1cm4gZkxlZnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgKG5vbi08Y29kZT5udWxsPC9jb2RlPikgbmFtZSBvZiB0aGUgbGVmdCBvciByaWdodCBzaWRlIGlmIHRoZXkgYXJlIGlkZW50aWNhbC4KLQkgKiBPdGhlcndpc2UgYm90aCBuYW1lcyBhcmUgY29uY2F0ZW5hdGVkIChzZXBhcmF0ZWQgd2l0aCBhIHNsYXNoICgnLycpKS4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSByZS1pbXBsZW1lbnQgdG8gcHJvdmlkZSBhIGRpZmZlcmVudCBuYW1lIGZvciB0aGlzIG5vZGUuCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgcmlnaHQ9IG51bGw7Ci0JCWlmIChmUmlnaHQgIT0gbnVsbCkKLQkJCXJpZ2h0PSBmUmlnaHQuZ2V0TmFtZSgpOwotCi0JCVN0cmluZyBsZWZ0PSBudWxsOwotCQlpZiAoZkxlZnQgIT0gbnVsbCkKLQkJCWxlZnQ9IGZMZWZ0LmdldE5hbWUoKTsKLQotCQlpZiAocmlnaHQgPT0gbnVsbCAmJiBsZWZ0ID09IG51bGwpIHsKLQkJCWlmIChmQW5jZXN0b3IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZkFuY2VzdG9yLmdldE5hbWUoKTsKLQkJCXJldHVybiBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJEaWZmTm9kZS5ub05hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gbGVmdDsKLQkJaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiByaWdodDsKLQotCQlpZiAocmlnaHQuZXF1YWxzKGxlZnQpKQotCQkJcmV0dXJuIHJpZ2h0OwotCQkJCi0JCVN0cmluZyBzMTsKLQkJU3RyaW5nIHMyOwotCQkKLQkJaWYgKGZTd2FwU2lkZXMpIHsKLQkJCXMxPSBsZWZ0OwotCQkJczI9IHJpZ2h0OwotCQl9IGVsc2UgewotCQkJczE9IHJpZ2h0OwotCQkJczI9IGxlZnQ7Ci0JCX0KLQkJCi0JCVN0cmluZyBmbXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoIkRpZmZOb2RlLm5hbWVGb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm10LCBuZXcgU3RyaW5nW10geyBzMSwgczIgfSk7Ci0JfQotCQotCXZvaWQgc3dhcFNpZGVzKGJvb2xlYW4gc3dhcCkgewotCQlmU3dhcFNpZGVzPSBzd2FwOwotCX0KLQkJCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJVHlwZWRFbGVtZW50LmdldEltYWdlCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlJVHlwZWRFbGVtZW50IGlkPSBnZXRJZCgpOwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXJldHVybiBpZC5nZXRJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElUeXBlZEVsZW1lbnQuZ2V0VHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVR5cGVkRWxlbWVudCBpZD0gZ2V0SWQoKTsKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlyZXR1cm4gaWQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gSVR5cGVkRWxlbWVudC5VTktOT1dOX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYW5jZXN0b3IgaW5wdXQgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBhbmNlc3RvciBpbnB1dAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbmNlc3RvcihJVHlwZWRFbGVtZW50IGFuY2VzdG9yKSB7Ci0JICAgIGZBbmNlc3Rvcj0gYW5jZXN0b3I7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUNvbXBhcmVJbnB1dC5nZXRBbmNlc3RvcgotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IGdldEFuY2VzdG9yKCkgewotCQlyZXR1cm4gZkFuY2VzdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsZWZ0IGlucHV0IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBsZWZ0IHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWZ0IGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGVmdChJVHlwZWRFbGVtZW50IGxlZnQpIHsKLQkJZkxlZnQ9IGxlZnQ7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUNvbXBhcmVJbnB1dC5nZXRMZWZ0Ci0JICovCi0JcHVibGljIElUeXBlZEVsZW1lbnQgZ2V0TGVmdCgpIHsKLQkJcmV0dXJuIGZMZWZ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJpZ2h0IGlucHV0IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSByaWdodCB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcmlnaHQgaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodChJVHlwZWRFbGVtZW50IHJpZ2h0KSB7Ci0JCWZSaWdodD0gcmlnaHQ7Ci0JfQotCQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUNvbXBhcmVJbnB1dC5nZXRSaWdodAotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IGdldFJpZ2h0KCkgewotCQlyZXR1cm4gZlJpZ2h0OwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUNvbXBhcmVJbnB1dC5jb3B5Ci0JICovCi0JcHVibGljIHZvaWQgY29weShib29sZWFuIGxlZnRUb1JpZ2h0KSB7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJEaWZmTm9kZS5jb3B5OiAiICsgbGVmdFRvUmlnaHQpOwotCQkKLQkJSURpZmZDb250YWluZXIgcGE9IGdldFBhcmVudCgpOwotCQlpZiAocGEgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQlJQ29tcGFyZUlucHV0IHBhcmVudD0gKElDb21wYXJlSW5wdXQpIHBhOwotCQkJT2JqZWN0IGRzdFBhcmVudD0gbGVmdFRvUmlnaHQgPyBwYXJlbnQuZ2V0UmlnaHQoKSA6IHBhcmVudC5nZXRMZWZ0KCk7Ci0JCQkKLQkJCWlmIChkc3RQYXJlbnQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50KSB7Ci0JCQkJSVR5cGVkRWxlbWVudCBkc3Q9IGxlZnRUb1JpZ2h0ID8gZ2V0UmlnaHQoKSA6IGdldExlZnQoKTsKLQkJCQlJVHlwZWRFbGVtZW50IHNyYz0gbGVmdFRvUmlnaHQgPyBnZXRMZWZ0KCkgOiBnZXRSaWdodCgpOwotCQkJCWRzdD0gKChJRWRpdGFibGVDb250ZW50KWRzdFBhcmVudCkucmVwbGFjZShkc3QsIHNyYyk7Ci0JCQkJaWYgKGxlZnRUb1JpZ2h0KQotCQkJCQlzZXRSaWdodChkc3QpOwotCQkJCWVsc2UKLQkJCQkJc2V0TGVmdChkc3QpOwotCQkJCQotCQkJCS8vc2V0S2luZChEaWZmZXJlbmNlci5OT19DSEFOR0UpOwotCQkJCQotCQkJCWZpcmVDaGFuZ2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIE9iamVjdC5oYXNoQ29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCVN0cmluZ1tdIHBhdGg9IGdldFBhdGgodGhpcywgMCk7Ci0JCWludCBoYXNoQ29kZT0gMTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkgICAgCVN0cmluZyBzPSBwYXRoW2ldOwotCSAgIAkgCWhhc2hDb2RlPSAoMzEqaGFzaENvZGUpICsgKHMgIT0gbnVsbCA/IHMuaGFzaENvZGUoKSA6IDApOwotCQl9Ci0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBPYmplY3QuZXF1YWxzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgIT0gbnVsbCAmJiBnZXRDbGFzcygpID09IG90aGVyLmdldENsYXNzKCkpIHsKLQkJCVN0cmluZ1tdIHBhdGgxPSBnZXRQYXRoKHRoaXMsIDApOwotCQkJU3RyaW5nW10gcGF0aDI9IGdldFBhdGgoKERpZmZOb2RlKSBvdGhlciwgMCk7Ci0JCQlpZiAocGF0aDEubGVuZ3RoICE9IHBhdGgyLmxlbmd0aCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgcGF0aDEubGVuZ3RoOyBpKyspCi0JCQkJaWYgKCEgcGF0aDFbaV0uZXF1YWxzKHBhdGgyW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFBhdGgoSVR5cGVkRWxlbWVudCBlbCwgaW50IGxldmVsKSB7Ci0JCVN0cmluZ1tdIHBhdGg9IG51bGw7Ci0JCWlmIChlbCBpbnN0YW5jZW9mIElEaWZmQ29udGFpbmVyKSB7Ci0JCQlJRGlmZkNvbnRhaW5lciBwYXJlbnQ9ICgoSURpZmZDb250YWluZXIpZWwpLmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCXBhdGg9IGdldFBhdGgocGFyZW50LCBsZXZlbCsxKTsKLQkJfQotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcGF0aD0gbmV3IFN0cmluZ1tsZXZlbCsxXTsKLQkJcGF0aFsocGF0aC5sZW5ndGgtMSktbGV2ZWxdPSBlbC5nZXROYW1lKCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDM4N2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLQotLyoqCi0gKiBBIHRyZWUgdmlld2VyIHRoYXQgd29ya3Mgb24gb2JqZWN0cyBpbXBsZW1lbnRpbmcKLSAqIHRoZSA8Y29kZT5JRGlmZkNvbnRhaW5lcjwvY29kZT4gYW5kIDxjb2RlPklEaWZmRWxlbWVudDwvY29kZT4gaW50ZXJmYWNlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlCi0gKiB0aGlzIHBhY2thZ2UuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBJRGlmZkNvbnRhaW5lcgotICogQHNlZSBJRGlmZkVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIERpZmZUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7Ci0JCi0Jc3RhdGljIGNsYXNzIERpZmZWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQotCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBub2RlKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIERpZmZOb2RlKSB7Ci0JCQkJT2JqZWN0IG89ICgoRGlmZk5vZGUpIG5vZGUpLmdldElkKCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBEb2N1bWVudFJhbmdlTm9kZSkKLQkJCQkJcmV0dXJuICgoRG9jdW1lbnRSYW5nZU5vZGUpIG8pLmdldFR5cGVDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0JCi0KLQljbGFzcyBEaWZmVmlld2VyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQkJCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLQkJfQotCQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpbnB1dENoYW5nZWQoRGlmZlRyZWVWaWV3ZXIudGhpcywgZ2V0SW5wdXQoKSwgbnVsbCk7Ci0JCX0KLQkJCQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkVsZW1lbnQpIAotCQkJCXJldHVybiAoKElEaWZmRWxlbWVudCllbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkNvbnRhaW5lcikgCi0JCQkJcmV0dXJuICgoSURpZmZDb250YWluZXIpZWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElEaWZmQ29udGFpbmVyKQotCQkJCXJldHVybiAoKElEaWZmQ29udGFpbmVyKWVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCX0JCQkJCi0JfQotCQotCS8qCi0JICogVGFrZXMgY2FyZSBvZiBzd2FwcGluZyBsZWZ0IGFuZCByaWdodCBpZiBmTGVmdElzTG9jYWwKLQkgKiBpcyB0cnVlLgotCSAqLwotCWNsYXNzIERpZmZWaWV3ZXJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkVsZW1lbnQpCi0JCQkJcmV0dXJuICgoSURpZmZFbGVtZW50KWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQkJCQotCQkJcmV0dXJuIFV0aWxpdGllcy5nZXRTdHJpbmcoZkJ1bmRsZSwgImRlZmF1bHRMYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElEaWZmRWxlbWVudCkgewotCQkJCUlEaWZmRWxlbWVudCBpbnB1dD0gKElEaWZmRWxlbWVudCkgZWxlbWVudDsKLQkJCQkKLQkJCQlpbnQga2luZD0gaW5wdXQuZ2V0S2luZCgpOwotCQkJCWlmIChmTGVmdElzTG9jYWwpIHsKLQkJCQkJc3dpdGNoIChraW5kICYgRGlmZmVyZW5jZXIuRElSRUNUSU9OX01BU0spIHsKLQkJCQkJY2FzZSBEaWZmZXJlbmNlci5MRUZUOgotCQkJCQkJa2luZD0gKGtpbmQgJn4gRGlmZmVyZW5jZXIuTEVGVCkgfCBEaWZmZXJlbmNlci5SSUdIVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERpZmZlcmVuY2VyLlJJR0hUOgotCQkJCQkJa2luZD0gKGtpbmQgJn4gRGlmZmVyZW5jZXIuUklHSFQpIHwgRGlmZmVyZW5jZXIuTEVGVDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmQ29tcGFyZUNvbmZpZ3VyYXRpb24uZ2V0SW1hZ2UoaW5wdXQuZ2V0SW1hZ2UoKSwga2luZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBGaWx0ZXJTYW1lIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGlmZkVsZW1lbnQpCi0JCQkJcmV0dXJuICgoKElEaWZmRWxlbWVudCllbGVtZW50KS5nZXRLaW5kKCkgJiBEaWZmZXJlbmNlci5QU0VVRE9fQ09ORkxJQ1QpID09IDA7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZCdW5kbGU7Ci0JcHJpdmF0ZSBDb21wYXJlQ29uZmlndXJhdGlvbiBmQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci0JLyogcGFja2FnZSAqLyBib29sZWFuIGZMZWZ0SXNMb2NhbDsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBBY3Rpb24gZkNvcHlMZWZ0VG9SaWdodEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIGZFbXB0eU1lbnVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZkV4cGFuZEFsbEFjdGlvbjsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB2aWV3ZXIgZm9yIHRoZSBnaXZlbiBTV1QgdHJlZSBjb250cm9sIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHBhcmFtIHRyZWUgdGhlIHRyZWUgY29udHJvbAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZpZXdlcgotCSAqLwotCXB1YmxpYyBEaWZmVHJlZVZpZXdlcihUcmVlIHRyZWUsIENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIodHJlZSk7Ci0JCWluaXRpYWxpemUoY29uZmlndXJhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBTV1QgcGFyZW50IGFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIFNXVCBjb250cm9sIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdmlld2VyCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmlld2VyCi0JICovCi0JcHVibGljIERpZmZUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIobmV3IFRyZWUocGFyZW50LCBTV1QuTVVMVEkpKTsKLQkJaW5pdGlhbGl6ZShjb25maWd1cmF0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQ29tcGFyZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkKLQkJQ29udHJvbCB0cmVlPSBnZXRDb250cm9sKCk7Ci0JCQotCQlJTmF2aWdhdGFibGUgbmF2PSBuZXcgSU5hdmlnYXRhYmxlKCkgewotCQkJcHVibGljIGJvb2xlYW4gZ290b0RpZmZlcmVuY2UoYm9vbGVhbiBuZXh0KSB7Ci0JCQkJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCQkJcmV0dXJuIGludGVybmFsTmF2aWdhdGUobmV4dCwgdHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCXRyZWUuc2V0RGF0YShJTmF2aWdhdGFibGUuTkFWSUdBVE9SX1BST1BFUlRZLCBuYXYpOwotCQkKLQkJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCUlPcGVuYWJsZSBvcGVuYWJsZT0gbmV3IElPcGVuYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW5TZWxlY3RlZCgpIHsKLQkJCQlpbnRlcm5hbE9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJdHJlZS5zZXREYXRhKElPcGVuYWJsZS5PUEVOQUJMRV9QUk9QRVJUWSwgb3BlbmFibGUpOwotCQkKLQkJZkxlZnRJc0xvY2FsPSBVdGlsaXRpZXMuZ2V0Qm9vbGVhbihjb25maWd1cmF0aW9uLCAiTEVGVF9JU19MT0NBTCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyZWUuc2V0RGF0YShDb21wYXJlVUkuQ09NUEFSRV9WSUVXRVJfVElUTEUsIGdldFRpdGxlKCkpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQ9IHRyZWUuZ2V0UGFyZW50KCk7Ci0JCQotCQlmQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuRGlmZlRyZWVWaWV3ZXJSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSBDb21wYXJlQ29uZmlndXJhdGlvbiAKLQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBjb25maWd1cmF0aW9uOwotCQlpZiAoZkNvbXBhcmVDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlEaWZmVHJlZVZpZXdlci50aGlzLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9CQkJCQotCQotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IERpZmZWaWV3ZXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IERpZmZWaWV3ZXJMYWJlbFByb3ZpZGVyKCkpOwotCQkKLQkJYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2UpIHsKLQkJCQkJdXBkYXRlQWN0aW9ucygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCQkJCQkJCQkKLQkJc2V0U29ydGVyKG5ldyBEaWZmVmlld2VyU29ydGVyKCkpOwotCQkKLQkJVG9vbEJhck1hbmFnZXIgdGJtPSBDb21wYXJlVmlld2VyUGFuZS5nZXRUb29sQmFyTWFuYWdlcihwYXJlbnQpOwotCQlpZiAodGJtICE9IG51bGwpIHsKLQkJCXRibS5yZW1vdmVBbGwoKTsKLQkJCQotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJtZXJnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJtb2RlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJuYXZpZ2F0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWNyZWF0ZVRvb2xJdGVtcyh0Ym0pOwotCQkJdXBkYXRlQWN0aW9ucygpOwotCQkJCi0JCQl0Ym0udXBkYXRlKHRydWUpOwotCQl9Ci0JCQotCQlNZW51TWFuYWdlciBtbT0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCW1tLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbW0uYWRkTWVudUxpc3RlbmVyKAotCQkJbmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtbTIpIHsKLQkJCQkJZmlsbENvbnRleHRNZW51KG1tMik7Ci0JCQkJCWlmIChtbTIuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpZiAoZkVtcHR5TWVudUFjdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJZkVtcHR5TWVudUFjdGlvbj0gbmV3IEFjdGlvbihVdGlsaXRpZXMuZ2V0U3RyaW5nKGZCdW5kbGUsICJlbXB0eU1lbnVJdGVtIikpIHsJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyBsZWZ0IGVtcHR5Ci0JCQkJCQkJfTsKLQkJCQkJCQlmRW1wdHlNZW51QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJbW0yLmFkZChmRW1wdHlNZW51QWN0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQkJdHJlZS5zZXRNZW51KG1tLmNyZWF0ZUNvbnRleHRNZW51KHRyZWUpKTsKLQl9Ci0JCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2aWV3ZXIncyBuYW1lLgotCSAqCi0JICogQHJldHVybiB0aGUgdmlld2VyJ3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCVN0cmluZyB0aXRsZT0gVXRpbGl0aWVzLmdldFN0cmluZyhmQnVuZGxlLCAidGl0bGUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGl0bGUgPT0gbnVsbCkKLQkJCXRpdGxlPSBVdGlsaXRpZXMuZ2V0U3RyaW5nKCJEaWZmVHJlZVZpZXdlci50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0aXRsZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqCi0JICogQHJldHVybiB0aGUgdmlld2VyJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGZCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgdmlld2VyLgotCSAqCi0JICogQHJldHVybiB0aGUgY29tcGFyZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgdmlld2VyCi0JICovCi0JcHVibGljIENvbXBhcmVDb25maWd1cmF0aW9uIGdldENvbXBhcmVDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZkNvbXBhcmVDb25maWd1cmF0aW9uOwotCX0KLQkJCQotCS8qKgotCSAqIENhbGxlZCBvbiB0aGUgdmlld2VyIGRpc3Bvc2FsLgotCSAqIFVucmVnaXN0ZXJzIGZyb20gdGhlIGNvbXBhcmUgY29uZmlndXJhdGlvbi4KLQkgKiBDbGllbnRzIG1heSBleHRlbmQgaWYgdGhleSBoYXZlIHRvIGRvIGFkZGl0aW9uYWwgY2xlYW51cC4KLQkgKiBAcGFyYW0gZXZlbnQgZGlzcG9zZSBldmVudCB0aGF0IHRyaWdnZXJlZCBjYWxsIHRvIHRoaXMgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZShEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCi0JCWlmIChmQ29tcGFyZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJaWYgKGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICE9IG51bGwpCi0JCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJZkNvbXBhcmVDb25maWd1cmF0aW9uPSBudWxsOwotCQl9Ci0JCWZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBudWxsOwotCQkKLQkJc3VwZXIuaGFuZGxlRGlzcG9zZShldmVudCk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNrcyBwcm9wZXJ0eSBjaGFuZ2VzIG9mIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdC4KLQkgKiBDbGllbnRzIG1heSBleHRlbmQgdG8gdHJhY2sgdGhlaXIgb3duIHByb3BlcnR5IGNoYW5nZXMuCi0JICogQHBhcmFtIGV2ZW50IHByb3BlcnR5IGNoYW5nZSBldmVudCB0aGF0IHRyaWdnZXJlZCBjYWxsIHRvIHRoaXMgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgaW4sIE9iamVjdCBvbGRJbnB1dCkgewotCQlzdXBlci5pbnB1dENoYW5nZWQoaW4sIG9sZElucHV0KTsKLQkJCi0JCWlmIChpbiAhPSBvbGRJbnB1dCkgewotCQkJaW5pdGlhbFNlbGVjdGlvbigpOwotCQkJdXBkYXRlQWN0aW9ucygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaG9vayBtZXRob2QgaXMgY2FsbGVkIGZyb20gd2l0aGluIDxjb2RlPmlucHV0Q2hhbmdlZDwvY29kZT4KLQkgKiBhZnRlciBhIG5ldyBpbnB1dCBoYXMgYmVlbiBzZXQgYnV0IGJlZm9yZSBhbnkgY29udHJvbHMgYXJlIHVwZGF0ZWQuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPm5hdmlnYXRlKHRydWUpPC9jb2RlPgotCSAqIHRvIHNlbGVjdCBhbmQgZXhwYW5kIHRoZSBmaXJzdCBsZWFmIG5vZGUuCi0JICogQ2xpZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFyZSBmcmVlIHRvIGRlY2lkZSB3aGV0aGVyCi0JICogdGhleSB3YW50IHRvIGNhbGwgdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxTZWxlY3Rpb24oKSB7Ci0JCW5hdmlnYXRlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gYXZvaWQgZXhwYW5kaW5nIDxjb2RlPkRpZmZOb2RlPC9jb2RlPnMgdGhhdCBzaG91bGRuJ3QgZXhwYW5kLgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGV4cGFuZAotICAgICAqIEBwYXJhbSBsZXZlbCBub24tbmVnYXRpdmUgbGV2ZWwsIG9yIDxjb2RlPkFMTF9MRVZFTFM8L2NvZGU+IHRvIGNvbGxhcHNlIGFsbCBsZXZlbHMgb2YgdGhlIHRyZWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEV4cGFuZFRvTGV2ZWwoV2lkZ2V0IG5vZGUsIGludCBsZXZlbCkgewotCQkJCQotCQlPYmplY3QgZGF0YT0gbm9kZS5nZXREYXRhKCk7Ci0JCQotCQlpZiAoZG9udEV4cGFuZChkYXRhKSkKLQkJCXJldHVybjsKLQkJCi0JCXN1cGVyLmludGVybmFsRXhwYW5kVG9MZXZlbChub2RlLCBsZXZlbCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaG9vayBtZXRob2QgaXMgY2FsbGVkIGZyb20gd2l0aGluIDxjb2RlPmludGVybmFsRXhwYW5kVG9MZXZlbDwvY29kZT4KLQkgKiB0byBjb250cm9sIHdoZXRoZXIgYSBnaXZlbiBtb2RlbCBub2RlIHNob3VsZCBiZSBleHBhbmRlZCBvciBub3QuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgaXMgYSA8Y29kZT5EaWZmTm9kZTwvY29kZT4gYW5kCi0JICogY2FsbHMgPGNvZGU+ZG9udEV4cGFuZCgpPC9jb2RlPiBvbiBpdC4KLQkgKiBDbGllbnRzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYXJlIGZyZWUgdG8gZGVjaWRlIHdoZXRoZXIKLQkgKiB0aGV5IHdhbnQgdG8gY2FsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gbyB0aGUgbW9kZWwgb2JqZWN0IHRvIGJlIGV4cGFuZGVkCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSBub2RlIHNob3VsZCBiZSBleHBhbmRlZCwgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcHJldmVudCBleHBhbmRpbmcKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9udEV4cGFuZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIERpZmZOb2RlICYmICgoRGlmZk5vZGUpbykuZG9udEV4cGFuZCgpOwotCX0KLQkKLQkvLy0tLS0gbWVyZ2UgYWN0aW9uIHN1cHBvcnQKLQotCS8qKgotCSAqIFRoaXMgZmFjdG9yeSBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSB2aWV3ZXIncyBjb250cm9scyBoYXZlIGJlZW4gY3JlYXRlZC4KLQkgKiBJdCBpbnN0YWxscyBmb3VyIGFjdGlvbnMgaW4gdGhlIGdpdmVuIDxjb2RlPlRvb2xCYXJNYW5hZ2VyPC9jb2RlPi4gVHdvIGFjdGlvbnMKLQkgKiBhbGxvdyBmb3IgY29weWluZyBvbmUgc2lkZSBvZiBhIDxjb2RlPkRpZmZOb2RlPC9jb2RlPiB0byB0aGUgb3RoZXIgc2lkZS4KLQkgKiBUd28gb3RoZXIgYWN0aW9ucyBhcmUgZm9yIG5hdmlnYXRpbmcgZnJvbSBvbmUgbm9kZSB0byB0aGUgbmV4dCAocHJldmlvdXMpLgotCSAqIDxwPgotCSAqIENsaWVudHMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhcmUgZnJlZSB0byBkZWNpZGUgd2hldGhlciB0aGV5IHdhbnQgdG8gY2FsbAotCSAqIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIHRvb2xiYXJNYW5hZ2VyIHRoZSB0b29sYmFyIG1hbmFnZXIgZm9yIHdoaWNoIHRvIGFkZCB0aGUgYWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRvb2xJdGVtcyhUb29sQmFyTWFuYWdlciB0b29sYmFyTWFuYWdlcikgewotCQkKLS8vCQlmQ29weUxlZnRUb1JpZ2h0QWN0aW9uPSBuZXcgQWN0aW9uKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQljb3B5U2VsZWN0ZWQodHJ1ZSk7Ci0vLwkJCX0KLS8vCQl9OwotLy8JCVV0aWxpdGllcy5pbml0QWN0aW9uKGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24sIGZCdW5kbGUsICJhY3Rpb24uVGFrZUxlZnQuIik7Ci0vLwkJdG9vbGJhck1hbmFnZXIuYXBwZW5kVG9Hcm91cCgibWVyZ2UiLCBmQ29weUxlZnRUb1JpZ2h0QWN0aW9uKTsKLQotLy8JCWZDb3B5UmlnaHRUb0xlZnRBY3Rpb249IG5ldyBBY3Rpb24oKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCWNvcHlTZWxlY3RlZChmYWxzZSk7Ci0vLwkJCX0KLS8vCQl9OwotLy8JCVV0aWxpdGllcy5pbml0QWN0aW9uKGZDb3B5UmlnaHRUb0xlZnRBY3Rpb24sIGZCdW5kbGUsICJhY3Rpb24uVGFrZVJpZ2h0LiIpOwotLy8JCXRvb2xiYXJNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm1lcmdlIiwgZkNvcHlSaWdodFRvTGVmdEFjdGlvbik7Ci0JCQotLy8JCWZOZXh0QWN0aW9uPSBuZXcgQWN0aW9uKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQluYXZpZ2F0ZSh0cnVlKTsKLS8vCQkJfQotLy8JCX07Ci0vLwkJVXRpbGl0aWVzLmluaXRBY3Rpb24oZk5leHRBY3Rpb24sIGZCdW5kbGUsICJhY3Rpb24uTmV4dERpZmYuIik7IC8vJE5PTi1OTFMtMSQKLS8vCQl0b29sYmFyTWFuYWdlci5hcHBlbmRUb0dyb3VwKCJuYXZpZ2F0aW9uIiwgZk5leHRBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLS8vCQlmUHJldmlvdXNBY3Rpb249IG5ldyBBY3Rpb24oKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCW5hdmlnYXRlKGZhbHNlKTsKLS8vCQkJfQotLy8JCX07Ci0vLwkJVXRpbGl0aWVzLmluaXRBY3Rpb24oZlByZXZpb3VzQWN0aW9uLCBmQnVuZGxlLCAiYWN0aW9uLlByZXZEaWZmLiIpOyAvLyROT04tTkxTLTEkCi0vLwkJdG9vbGJhck1hbmFnZXIuYXBwZW5kVG9Hcm91cCgibmF2aWdhdGlvbiIsIGZQcmV2aW91c0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGFkZCBhY3Rpb25zIHRvIHRoZSB2aWV3ZXIncyBjb250ZXh0IG1lbnUuCi0JICogSXQgaW5zdGFsbHMgYWN0aW9ucyBmb3IgZXhwYW5kaW5nIHRyZWUgbm9kZXMsIGNvcHlpbmcgb25lIHNpZGUgb2YgYSA8Y29kZT5EaWZmTm9kZTwvY29kZT4gdG8gdGhlIG90aGVyIHNpZGUuCi0JICogQ2xpZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFyZSBmcmVlIHRvIGRlY2lkZSB3aGV0aGVyIHRoZXkgd2FudCB0byBjYWxsCi0JICogdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gbWFuYWdlciB0aGUgbWVudSBtYW5hZ2VyIGZvciB3aGljaCB0byBhZGQgdGhlIGFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJaWYgKGZFeHBhbmRBbGxBY3Rpb24gPT0gbnVsbCkgewotCQkJZkV4cGFuZEFsbEFjdGlvbj0gbmV3IEFjdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWV4cGFuZFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCQlVdGlsaXRpZXMuaW5pdEFjdGlvbihmRXhwYW5kQWxsQWN0aW9uLCBmQnVuZGxlLCAiYWN0aW9uLkV4cGFuZEFsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlib29sZWFuIGVuYWJsZT0gZmFsc2U7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBlbGVtZW50cz0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQ9IGVsZW1lbnRzLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElEaWZmQ29udGFpbmVyKSB7Ci0JCQkJCWlmICgoKElEaWZmQ29udGFpbmVyKWVsZW1lbnQpLmhhc0NoaWxkcmVuKCkpIHsKLQkJCQkJCWVuYWJsZT0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZFeHBhbmRBbGxBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotCi0JCW1hbmFnZXIuYWRkKGZFeHBhbmRBbGxBY3Rpb24pOwotCQkKLQkJaWYgKGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24gIT0gbnVsbCkKLQkJCW1hbmFnZXIuYWRkKGZDb3B5TGVmdFRvUmlnaHRBY3Rpb24pOwotCQlpZiAoZkNvcHlSaWdodFRvTGVmdEFjdGlvbiAhPSBudWxsKQotCQkJbWFuYWdlci5hZGQoZkNvcHlSaWdodFRvTGVmdEFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogRXhwYW5kcyB0byBpbmZpbml0eSBhbGwgaXRlbXMgaW4gdGhlIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhwYW5kU2VsZWN0aW9uKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgZWxlbWVudHM9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBuZXh0PSBlbGVtZW50cy5uZXh0KCk7Ci0JCQkJZXhwYW5kVG9MZXZlbChuZXh0LCBBTExfTEVWRUxTKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyBvbmUgc2lkZSBvZiBhbGwgPGNvZGU+RGlmZk5vZGU8L2NvZGU+cyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gdG8gdGhlIG90aGVyIHNpZGUuCi0JICogQ2FsbGVkIGZyb20gdGhlIChpbnRlcm5hbCkgYWN0aW9ucyBmb3IgY29weWluZyB0aGUgc2lkZXMgb2YgYSA8Y29kZT5EaWZmTm9kZTwvY29kZT4uCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUuIAotCSAqIAotCSAqIEBwYXJhbSBsZWZ0VG9SaWdodCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgbGVmdCBzaWRlIGlzIGNvcGllZCB0byB0aGUgcmlnaHQgc2lkZS4KLQkgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIHJpZ2h0IHNpZGUgaXMgY29waWVkIHRvIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5U2VsZWN0ZWQoYm9vbGVhbiBsZWZ0VG9SaWdodCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgZT0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQ9IGUubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkKLQkJCQkJY29weU9uZSgoSUNvbXBhcmVJbnB1dCkgZWxlbWVudCwgbGVmdFRvUmlnaHQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB0byBjb3B5IG9uZSBzaWRlIG9mIHRoZSBnaXZlbiBub2RlIHRvIHRoZSBvdGhlci4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVsZWdhdGVzIHRoZSBjYWxsIHRvIDxjb2RlPklDb21wYXJlSW5wdXQuY29weSguLi4pPC9jb2RlPi4KLQkgKiBDbGllbnRzIG1heSBvdmVycmlkZS4gCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gY29weQotCSAqIEBwYXJhbSBsZWZ0VG9SaWdodCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgbGVmdCBzaWRlIGlzIGNvcGllZCB0byB0aGUgcmlnaHQgc2lkZS4KLQkgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIHJpZ2h0IHNpZGUgaXMgY29waWVkIHRvIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5T25lKElDb21wYXJlSW5wdXQgbm9kZSwgYm9vbGVhbiBsZWZ0VG9SaWdodCkgewotCQkKLQkJbm9kZS5jb3B5KGxlZnRUb1JpZ2h0KTsKLQkJCi0JCS8vIHVwZGF0ZSBub2RlJ3MgaW1hZ2UKLQkJdXBkYXRlKG5ldyBPYmplY3RbXSB7IG5vZGUgfSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIG5leHQgKG9yIHByZXZpb3VzKSBub2RlIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlbGVjdGlvbiB0aGUgZmlyc3QgKGxhc3QpIG5vZGUgaW4gdGhlIHRyZWUgaXMgc2VsZWN0ZWQuCi0JICogV3JhcHMgYXJvdW5kIGF0IGVuZCBvciBiZWdpbm5pbmcuCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUuIAotCSAqCi0JICogQHBhcmFtIG5leHQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG5leHQgbm9kZSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIHRoZSBwcmV2aW91cyBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbmF2aWdhdGUoYm9vbGVhbiBuZXh0KSB7CQotCQkvLyBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkJaW50ZXJuYWxOYXZpZ2F0ZShuZXh0LCBmYWxzZSk7Ci0JfQotCQotCS8vLS0tLSBwcml2YXRlCi0JCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgbmV4dCAob3IgcHJldmlvdXMpIG5vZGUgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2VsZWN0aW9uIHRoZSBmaXJzdCAobGFzdCkgbm9kZSBpbiB0aGUgdHJlZSBpcyBzZWxlY3RlZC4KLQkgKiBXcmFwcyBhcm91bmQgYXQgZW5kIG9yIGJlZ2lubmluZy4KLQkgKiBDbGllbnRzIG1heSBvdmVycmlkZS4gCi0JICoKLQkgKiBAcGFyYW0gbmV4dCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgbmV4dCBub2RlIGlzIHNlbGVjdGVkLCBvdGhlcndpc2UgdGhlIHByZXZpb3VzIG5vZGUKLQkgKiBAcGFyYW0gZmlyZU9wZW4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4gYW4gb3BlbiBldmVudCBpcyBmaXJlZC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGVuZCAob3IgYmVnaW5uaW5nKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpbnRlcm5hbE5hdmlnYXRlKGJvb2xlYW4gbmV4dCwgYm9vbGVhbiBmaXJlT3BlbikgewotCQkKLQkJQ29udHJvbCBjPSBnZXRDb250cm9sKCk7Ci0JCWlmICghKGMgaW5zdGFuY2VvZiBUcmVlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlUcmVlIHRyZWU9IChUcmVlKSBjOwotCQlUcmVlSXRlbSBpdGVtPSBudWxsOwotCQlUcmVlSXRlbSBjaGlsZHJlbltdPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQotCQkJaXRlbT0gY2hpbGRyZW5bMF07Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCWNoaWxkcmVuPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7Ci0JCQkJaXRlbT0gY2hpbGRyZW5bMF07Ci0JCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldEl0ZW1Db3VudCgpIDw9IDApIHsKLQkJCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oaXRlbSwgZmlyZU9wZW4pOwkJCQkvLyBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpdGVtPSBmaW5kTmV4dFByZXYoaXRlbSwgbmV4dCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJCWJyZWFrOwotCQkJaWYgKGl0ZW0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJaW50ZXJuYWxTZXRTZWxlY3Rpb24oaXRlbSwgZmlyZU9wZW4pOwkvLyBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVJdGVtIGZpbmROZXh0UHJldihUcmVlSXRlbSBpdGVtLCBib29sZWFuIG5leHQpIHsKLQkJCi0JCWlmIChpdGVtID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVRyZWVJdGVtIGNoaWxkcmVuW109IG51bGw7Ci0KLQkJaWYgKCFuZXh0KSB7Ci0JCQotCQkJVHJlZUl0ZW0gcGFyZW50PSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQljaGlsZHJlbj0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQllbHNlCi0JCQkJY2hpbGRyZW49IGl0ZW0uZ2V0UGFyZW50KCkuZ2V0SXRlbXMoKTsKLQkJCQotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCS8vIGdvdG8gcHJldmlvdXMgY2hpbGQKLQkJCQlpbnQgaW5kZXg9IDA7Ci0JCQkJZm9yICg7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKQotCQkJCQlpZiAoY2hpbGRyZW5baW5kZXhdID09IGl0ZW0pCi0JCQkJCQlicmVhazsKLQkJCQkKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCQotCQkJCQlpdGVtPSBjaGlsZHJlbltpbmRleC0xXTsKLQkJCQkJCi0JCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQljcmVhdGVDaGlsZHJlbihpdGVtKTsKLQkJCQkJCWludCBuPSBpdGVtLmdldEl0ZW1Db3VudCgpOwotCQkJCQkJaWYgKG4gPD0gMCkKLQkJCQkJCQlicmVhazsKLQkJCQkJCQkKLQkJCQkJCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQkJCQlpdGVtPSBpdGVtLmdldEl0ZW1zKClbbi0xXTsKLQkJCQkJfQotCi0JCQkJCS8vIHByZXZpb3VzCi0JCQkJCXJldHVybiBpdGVtOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ28gdXAKLQkJCWl0ZW09IHBhcmVudDsKLQkJCQkJCi0JCX0gZWxzZSB7Ci0JCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQkJY3JlYXRlQ2hpbGRyZW4oaXRlbSk7Ci0JCQkKLQkJCWlmIChpdGVtLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCS8vIGhhcyBjaGlsZHJlbjogZ28gZG93bgotCQkJCWNoaWxkcmVuPSBpdGVtLmdldEl0ZW1zKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuWzBdOwotCQkJfQotCQkJCi0JCQl3aGlsZSAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJY2hpbGRyZW49IG51bGw7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50PSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJCWNoaWxkcmVuPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCQllbHNlCi0JCQkJCWNoaWxkcmVuPSBpdGVtLmdldFBhcmVudCgpLmdldEl0ZW1zKCk7Ci0JCQkJCi0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQkvLyBnb3RvIG5leHQgY2hpbGQKLQkJCQkJaW50IGluZGV4PSAwOwotCQkJCQlmb3IgKDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspCi0JCQkJCQlpZiAoY2hpbGRyZW5baW5kZXhdID09IGl0ZW0pCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCQlpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGgtMSkgewotCQkJCQkJLy8gbmV4dAotCQkJCQkJcmV0dXJuIGNoaWxkcmVuW2luZGV4KzFdOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIGdvIHVwCi0JCQkJaXRlbT0gcGFyZW50OwotCQkJfQotCQl9Ci0JCQkJCi0JCXJldHVybiBpdGVtOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXRTZWxlY3Rpb24oVHJlZUl0ZW0gdGksIGJvb2xlYW4gZmlyZU9wZW4pIHsKLQkJaWYgKHRpICE9IG51bGwpIHsKLQkJCU9iamVjdCBkYXRhPSB0aS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEpOwotCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQkJCUlTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbj0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGZpcmVPcGVuICYmIGN1cnJlbnRTZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZXF1YWxzKGN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0JCQkJCWZpcmVPcGVuKG5ldyBPcGVuRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQkJCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRWRpdGFibGUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gbGVmdCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCUlDb21wYXJlSW5wdXQgZGlmZj0gKElDb21wYXJlSW5wdXQpIGVsZW1lbnQ7Ci0JCQlPYmplY3Qgc2lkZT0gbGVmdCA/IGRpZmYuZ2V0TGVmdCgpIDogZGlmZi5nZXRSaWdodCgpOwotCQkJaWYgKHNpZGUgPT0gbnVsbCAmJiBkaWZmIGluc3RhbmNlb2YgSURpZmZFbGVtZW50KSB7Ci0JCQkJSURpZmZDb250YWluZXIgY29udGFpbmVyPSAoKElEaWZmRWxlbWVudClkaWZmKS5nZXRQYXJlbnQoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUNvbXBhcmVJbnB1dCkgewotCQkJCQlJQ29tcGFyZUlucHV0IHBhcmVudD0gKElDb21wYXJlSW5wdXQpIGNvbnRhaW5lcjsKLQkJCQkJc2lkZT0gbGVmdCA/IHBhcmVudC5nZXRMZWZ0KCkgOiBwYXJlbnQuZ2V0UmlnaHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2lkZSBpbnN0YW5jZW9mIElFZGl0YWJsZUNvbnRlbnQpCi0JCQkJcmV0dXJuICgoSUVkaXRhYmxlQ29udGVudCkgc2lkZSkuaXNFZGl0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCB1cGRhdGVBY3Rpb25zKCkgewotCQlpbnQgbGVmdFRvUmlnaHQ9IDA7Ci0JCWludCByaWdodFRvTGVmdD0gMDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUl0ZXJhdG9yIGU9IHNzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudD0gZS5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGFyZUlucHV0KSB7Ci0JCQkJCWlmIChpc0VkaXRhYmxlKGVsZW1lbnQsIGZhbHNlKSkKLQkJCQkJCWxlZnRUb1JpZ2h0Kys7Ci0JCQkJCWlmIChpc0VkaXRhYmxlKGVsZW1lbnQsIHRydWUpKQotCQkJCQkJcmlnaHRUb0xlZnQrKzsKLQkJCQkJaWYgKGxlZnRUb1JpZ2h0ID4gMCAmJiByaWdodFRvTGVmdCA+IDApCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZkV4cGFuZEFsbEFjdGlvbiAhPSBudWxsKQotCQkJCWZFeHBhbmRBbGxBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQkJfQotCQlpZiAoZkNvcHlMZWZ0VG9SaWdodEFjdGlvbiAhPSBudWxsKQotCQkJZkNvcHlMZWZ0VG9SaWdodEFjdGlvbi5zZXRFbmFibGVkKGxlZnRUb1JpZ2h0ID4gMCk7Ci0JCWlmIChmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uICE9IG51bGwpCi0JCQlmQ29weVJpZ2h0VG9MZWZ0QWN0aW9uLnNldEVuYWJsZWQocmlnaHRUb0xlZnQgPiAwKTsKLQl9Ci0JCi0JLyoKLQkgKiBGaXggZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMDYKLQkgKi8gCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsT3BlbigpICB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlmaXJlT3BlbihuZXcgT3BlbkV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmVHJlZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvRGlmZlRyZWVWaWV3ZXJSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxMjY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmVHJlZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEAoIylEaWZmVHJlZVZpZXdlclJlc291cmNlcy5wcm9wZXJ0aWVzCi0jCi0jIFJlc291cmNlIHN0cmluZ3MgZm9yIERpZmZUcmVlVmlld2VyLmphdmEKLQotdGl0bGU9IFN0cnVjdHVyZSBDb21wYXJlCi1kZWZhdWx0TGFiZWw9IDxubyBuYW1lPgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEdW1teSBtZW51IGl0ZW0gZm9yIGVtcHR5IGNvbnRleHQgbWVudQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZW1wdHlNZW51SXRlbT0gPEVtcHR5IE1lbnU+Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEFjdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWFjdGlvbi5TbWFydC5sYWJlbD1TbWFydAotYWN0aW9uLlNtYXJ0LnRvb2x0aXA9R3Vlc3MgU2ltaWxhciBFbGVtZW50cwotYWN0aW9uLlNtYXJ0LmltYWdlPXNtYXJ0bW9kZV9jby5naWYKLQotYWN0aW9uLkV4cGFuZEFsbC5sYWJlbD1FeHBhbmQgQWxsCi1hY3Rpb24uRXhwYW5kQWxsLnRvb2x0aXA9RXhwYW5kIEFsbCBOb2RlcwotCi1hY3Rpb24uQ29tcGFyZUNvbnRlbnRzLmxhYmVsPSBTaG93IENvbnRlbnQgQ29tcGFyaXNvbgotYWN0aW9uLkNvbXBhcmVDb250ZW50cy50b29sdGlwPSBTaG93IENvbnRlbnQgQ29tcGFyaXNvbgotCi1hY3Rpb24uTmV4dERpZmYubGFiZWw9TmV4dAotYWN0aW9uLk5leHREaWZmLnRvb2x0aXA9U2VsZWN0IE5leHQgQ2hhbmdlCi1hY3Rpb24uTmV4dERpZmYuaW1hZ2U9bmV4dF9uYXYuZ2lmCi0KLWFjdGlvbi5QcmV2RGlmZi5sYWJlbD1QcmV2aW91cwotYWN0aW9uLlByZXZEaWZmLnRvb2x0aXA9U2VsZWN0IFByZXZpb3VzIENoYW5nZQotYWN0aW9uLlByZXZEaWZmLmltYWdlPXByZXZfbmF2LmdpZgotCi1hY3Rpb24uVGFrZUxlZnQubGFiZWw9Q29weSBMZWZ0IHRvIFJpZ2h0Ci1hY3Rpb24uVGFrZUxlZnQudG9vbHRpcD1Db3B5IFNlbGVjdGVkIE5vZGVzIGZyb20gTGVmdCB0byBSaWdodAotYWN0aW9uLlRha2VMZWZ0LmltYWdlPWNvcHljb250X3JfY28uZ2lmCi0KLWFjdGlvbi5UYWtlUmlnaHQubGFiZWw9Q29weSBSaWdodCB0byBMZWZ0Ci1hY3Rpb24uVGFrZVJpZ2h0LnRvb2x0aXA9Q29weSBTZWxlY3RlZCBOb2RlcyBmcm9tIFJpZ2h0IHRvIExlZnQKLWFjdGlvbi5UYWtlUmlnaHQuaW1hZ2U9Y29weWNvbnRfbF9jby5naWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZlcmVuY2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9EaWZmZXJlbmNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg1ZTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RpZmZlcmVuY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIEEgZ2VuZXJpYyB0d28td2F5IG9yIHRocmVlLXdheSBkaWZmZXJlbmNpbmcgZW5naW5lLgotICogPHA+Ci0gKiBUaGUgZW5naW5lIGlzIHVzZWQgYnkgY2FsbGluZyBvbmUgb2YgdGhlIDxjb2RlPmZpbmREaWZmZXJlbmNlczwvY29kZT4gbWV0aG9kcyBhbmQgcGFzc2luZwotICogaW4gdGhlIG9iamVjdHMgdG8gY29tcGFyZS4KLSAqIFRoZSBlbmdpbmUgY2FsbHMgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9uIHRoZSBpbnB1dCBvYmplY3RzIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmU6Ci0gKiA8VUw+Ci0gKiA8TEk+PGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+OiBmb3IgZW51bWVyYXRpbmcgdGhlIGNoaWxkcmVuIG9mIGFuIG9iamVjdCAoaWYgYW55KSwKLSAqIDxMST48Y29kZT5jb250ZW50c0VxdWFsPC9jb2RlPjogZm9yIGNvbXBhcmluZyB0aGUgY29udGVudCBvZiBsZWFmIG9iamVjdHMsIHRoYXQgaXMsIG9iamVjdHMgd2l0aG91dCBjaGlsZHJlbiwKLSAqIDxMST48Y29kZT52aXNpdDwvY29kZT46IGZvciBldmVyeSBwYWlyIG9mIGNvbXBhcmVkIG9iamVjdCB0aGUgY29tcGFyZSByZXN1bHQgaXMgcGFzc2VkIGluLgotICogPC9VTD4KLSAqIENsaWVudHMgbWF5IHVzZSBhcyBpcywgb3Igc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHRocmVlIGhvb2tzLiAKLSAqIEhvd2V2ZXIgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxyZWFkeSBkZWFscyB3aXRoIHRoZSB0eXBpY2FsIGNhc2U6Ci0gKiA8VUw+Ci0gKiA8TEk+PGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+OiB0cmllcyB0byBhcHBseSB0aGUgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+Ci0gKiAJaW50ZXJmYWNlIHRvIGVudW1lcmF0ZSB0aGUgY2hpbGRyZW4sCi0gKiA8TEk+PGNvZGU+Y29udGVudHNFcXVhbDwvY29kZT46IHRyaWVzIHRvIGFwcGx5IHRoZSA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPiBpbnRlcmZhY2UKLSAqCXRvIHBlcmZvcm0gYSBieXRlLXdpc2UgY29udGVudCBjb21wYXJpc29uLAotICogPExJPjxjb2RlPnZpc2l0PC9jb2RlPjogY3JlYXRlcyBhIDxjb2RlPkRpZmZOb2RlPC9jb2RlPiBmb3IgYW55IGRldGVjdGVkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGFyZWQgb2JqZWN0cyBhbmQKLSAqCWxpbmtzIGl0IHVuZGVyIGEgcGFyZW50IG5vZGUgZWZmZWN0aXZlbHkgY3JlYXRpbmcgYSB0cmVlIG9mIGRpZmZlcmVuY2VzLgotICogPC9VTD4KLSAqIFRoZSBkaWZmZXJlbnQga2luZCBvZiBjaGFuZ2VzIGRldGVjdGVkIGJ5IHRoZSBlbmdpbmUgYXJlIGRlY29kZWQgYXMgZm9sbG93czoKLSAqIEluIHRoZSB0d28td2F5IGNhc2Ugb25seSBOT19DSEFOR0UsIEFERElUSU9OLCBERUxFVElPTiwgYW5kIENIQU5HRSBhcmUgdXNlZC4KLSAqIEluIHRoZSB0aHJlZS13YXkgY2FzZSB0aGVzZSBjb25zdGFudHMgYXJlIGJpdHdpc2UgT1JlZCB3aXRoIG9uZSBvZiBkaXJlY3Rpb25hbCBjb25zdGFudHMKLSAqIExFRlQsIFJJR0hULCBhbmQgQ09ORkxJQ1RJTkcuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmZXJlbmNlciB7Ci0JCi0JLy8gVGhlIGtpbmQgb2YgZGlmZmVyZW5jZXMuCi0JLyoqCi0JICogRGlmZmVyZW5jZSBjb25zdGFudCAodmFsdWUgMCkgaW5kaWNhdGluZyBubyBkaWZmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRT0gMDsKLQkvKioKLQkgKiBEaWZmZXJlbmNlIGNvbnN0YW50ICh2YWx1ZSAxKSBpbmRpY2F0aW5nIG9uZSBzaWRlIHdhcyBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERJVElPTj0gMTsKLQkvKioKLQkgKiBEaWZmZXJlbmNlIGNvbnN0YW50ICh2YWx1ZSAyKSBpbmRpY2F0aW5nIG9uZSBzaWRlIHdhcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVUSU9OPSAyOwotCS8qKgotCSAqIERpZmZlcmVuY2UgY29uc3RhbnQgKHZhbHVlIDMpIGluZGljYXRpbmcgc2lkZSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRT0gMzsKLQotCS8qKgotCSAqIEJpdCBtYXNrICh2YWx1ZSAzKSBmb3IgZXh0cmFjdGluZyB0aGUga2luZCBvZiBkaWZmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9UWVBFX01BU0s9IDM7Ci0KLQkvLyBUaGUgZGlyZWN0aW9uIG9mIGEgdGhyZWUtd2F5IGNoYW5nZS4KLQkvKioKLQkgKiBUaHJlZS13YXkgY2hhbmdlIGNvbnN0YW50ICh2YWx1ZSA0KSBpbmRpY2F0aW5nIGEgY2hhbmdlIG9uIGxlZnQgc2lkZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUPSA0OwotCQotCS8qKgotCSAqIFRocmVlLXdheSBjaGFuZ2UgY29uc3RhbnQgKHZhbHVlIDgpIGluZGljYXRpbmcgYSBjaGFuZ2Ugb24gcmlnaHQgc2lkZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVD0gODsKLQkKLQkvKioKLQkgKiBUaHJlZS13YXkgY2hhbmdlIGNvbnN0YW50ICh2YWx1ZSAxMikgaW5kaWNhdGluZyBhIGNoYW5nZSBvbiBsZWZ0IGFuZAotCSAqIHJpZ2h0IHNpZGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZMSUNUSU5HPSAxMjsKLQotCS8qKgotCSAqIEJpdCBtYXNrICh2YWx1ZSAxMikgZm9yIGV4dHJhY3RpbmcgdGhlIGRpcmVjdGlvbiBvZiBhIHRocmVlLXdheSBjaGFuZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX01BU0s9IDEyOwotCi0JLyoqCi0JICogQ29uc3RhbnQgKHZhbHVlIDE2KSBpbmRpY2F0aW5nIGEgY2hhbmdlIG9uIGxlZnQgYW5kIAotCSAqIHJpZ2h0IHNpZGUgKHdpdGggcmVzcGVjdCB0byBhbmNlc3RvcikgYnV0IGxlZnQgYW5kIHJpZ2h0IGFyZSBpZGVudGljYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFNFVURPX0NPTkZMSUNUPSAxNjsKLQotCQotCXN0YXRpYyBjbGFzcyBOb2RlIHsKLQkJTGlzdCBmQ2hpbGRyZW47Ci0JCWludCBmQ29kZTsKLQkJT2JqZWN0IGZBbmNlc3RvcjsKLQkJT2JqZWN0IGZMZWZ0OwotCQlPYmplY3QgZlJpZ2h0OwotCQkKLQkJTm9kZSgpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJfQotCQlOb2RlKE5vZGUgcGFyZW50LCBPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCXBhcmVudC5hZGQodGhpcyk7Ci0JCQlmQW5jZXN0b3I9IGFuY2VzdG9yOwotCQkJZkxlZnQ9IGxlZnQ7Ci0JCQlmUmlnaHQ9IHJpZ2h0OwotCQl9Ci0JCXZvaWQgYWRkKE5vZGUgY2hpbGQpIHsKLQkJCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkKLQkJCQlmQ2hpbGRyZW49IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZDaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0JCU9iamVjdCB2aXNpdChEaWZmZXJlbmNlciBkLCBPYmplY3QgcGFyZW50LCBpbnQgbGV2ZWwpIHsKLQkJCWlmIChmQ29kZSA9PSBOT19DSEFOR0UpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvL2R1bXAobGV2ZWwpOwotCQkJT2JqZWN0IGRhdGE9IGQudmlzaXQocGFyZW50LCBmQ29kZSwgZkFuY2VzdG9yLCBmTGVmdCwgZlJpZ2h0KTsKLQkJCWlmIChmQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGk9IGZDaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQlOb2RlIG49IChOb2RlKSBpLm5leHQoKTsKLQkJCQkJbi52aXNpdChkLCBkYXRhLCBsZXZlbCsxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGF0YTsKLQkJfQotLy8JCXByaXZhdGUgdm9pZCBkdW1wKGludCBsZXZlbCkgewotLy8JCQlTdHJpbmcgbmFtZT0gbnVsbDsKLS8vCQkJaWYgKGZBbmNlc3RvciBpbnN0YW5jZW9mIElUeXBlZEVsZW1lbnQpCi0vLwkJCQluYW1lPSAoKElUeXBlZEVsZW1lbnQpZkFuY2VzdG9yKS5nZXROYW1lKCk7Ci0vLwkJCWlmIChuYW1lID09IG51bGwgJiYgZkxlZnQgaW5zdGFuY2VvZiBJVHlwZWRFbGVtZW50KQotLy8JCQkJbmFtZT0gKChJVHlwZWRFbGVtZW50KWZMZWZ0KS5nZXROYW1lKCk7Ci0vLwkJCWlmIChuYW1lID09IG51bGwgJiYgZlJpZ2h0IGluc3RhbmNlb2YgSVR5cGVkRWxlbWVudCkKLS8vCQkJCW5hbWU9ICgoSVR5cGVkRWxlbWVudClmUmlnaHQpLmdldE5hbWUoKTsKLS8vCQkJaWYgKG5hbWUgPT0gbnVsbCkKLS8vCQkJCW5hbWU9ICI/Pz8iOyAvLyROT04tTkxTLTEkCi0vLwkJCQotLy8JCQlmb3IgKGludCBpPSAwOyBpIDwgbGV2ZWw7IGkrKykKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCi0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXREaWZmVHlwZShmQ29kZSkgKyBuYW1lKTsKLS8vCQl9Ci0KLS8vCQlwcml2YXRlIFN0cmluZyBnZXREaWZmVHlwZShpbnQgY29kZSkgewotLy8JCQlTdHJpbmcgZGlyPSAiICI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJc3dpdGNoIChjb2RlICYgRElSRUNUSU9OX01BU0spIHsKLS8vCQkJY2FzZSBMRUZUOgotLy8JCQkJZGlyPSAiPiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIFJJR0hUOgotLy8JCQkJZGlyPSAiPCI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIENPTkZMSUNUSU5HOgotLy8JCQkJZGlyPSAiISI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCVN0cmluZyBjaGFuZ2U9ICI9IjsgLy8kTk9OLU5MUy0xJAotLy8JCQlzd2l0Y2ggKGNvZGUgJiBDSEFOR0VfVFlQRV9NQVNLKSB7Ci0vLwkJCWNhc2UgQURESVRJT046Ci0vLwkJCQljaGFuZ2U9ICIrIjsgLy8kTk9OLU5MUy0xJAotLy8JCQkJYnJlYWs7Ci0vLwkJCWNhc2UgREVMRVRJT046Ci0vLwkJCQljaGFuZ2U9ICItIjsgLy8kTk9OLU5MUy0xJAotLy8JCQkJYnJlYWs7Ci0vLwkJCWNhc2UgQ0hBTkdFOgotLy8JCQkJY2hhbmdlPSAiIyI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCXJldHVybiBkaXIgKyBjaGFuZ2UgKyAiICI7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0JfSAKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRpZmZlcmVuY2luZyBlbmdpbmUuCi0JICovCi0JcHVibGljIERpZmZlcmVuY2VyKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSBvbiB0aGUgdGhyZWUgaW5wdXQgb2JqZWN0cy4gSWYgdGhyZWVXYXkgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYSAKLQkgKiB0aHJlZS13YXkgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQsIG90aGVyd2lzZSBhIHR3by13YXkgY29tcGFyZSAoaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBhbmNlc3RvciBhcmd1bWVudCBpcyBpZ25vcmVkKS4KLQkgKiBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyBwYXNzZWQgdG8gdGhlIG1ldGhvZCA8Y29kZT51cGRhdGVQcm9ncmVzczwvY29kZT4gd2hpY2ggaXMgY2FsbGVkIGZvciBldmVyeSBub2RlIG9yCi0JICogbGVhZiBjb21wYXJlLiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSB0b3AtbW9zdCBjYWxsIHRvIG1ldGhvZCA8Y29kZT52aXNpdDwvY29kZT4uCi0JICogQXQgbW9zdCB0d28gb2YgdGhlIGFuY2VzdG9yLCBsZWZ0LCBhbmQgcmlnaHQgcGFyYW1ldGVycyBhcmUgYWxsb3dlZCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSB0aHJlZVdheSBpZiA8Y29kZT50cnVlPC9jb2RlPiBhIHRocmVlLXdheSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIGEgdHdvLXdheSBjb21wYXJlCi0JICogQHBhcmFtIHBtIGEgcHJvZ3Jlc3MgbW9uaXRvciB3aGljaCBpcyBwYXNzZWQgdG8gbWV0aG9kIDxjb2RlPnVwZGF0ZVByb2dyZXNzPC9jb2RlPgotCSAqIEBwYXJhbSBkYXRhIGEgY2xpZW50IGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHRvcC1sZXZlbCBjYWxsIHRvIDxjb2RlPnZpc2l0PC9jb2RlPgotCSAqIEBwYXJhbSBhbmNlc3RvciB0aGUgYW5jZXN0b3Igb2JqZWN0IG9mIHRoZSBjb21wYXJlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCi0JICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgb2JqZWN0IG9mIHRoZSBjb21wYXJlIAotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgb2JqZWN0IG9mIHRoZSBjb21wYXJlCi0JICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHRvcCBtb3N0IGNhbGwgdG8gbWV0aG9kIDxjb2RlPnZpc2l0PC9jb2RlPiwKLQkgKiAgIHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdCBmaW5kRGlmZmVyZW5jZXMoYm9vbGVhbiB0aHJlZVdheSwgSVByb2dyZXNzTW9uaXRvciBwbSwgT2JqZWN0IGRhdGEsIE9iamVjdCBhbmNlc3RvciwgT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQkKLQkJTm9kZSByb290PSBuZXcgTm9kZSgpOwotCQkKLQkJaW50IGNvZGU9IHRyYXZlcnNlKHRocmVlV2F5LCByb290LCBwbSwgdGhyZWVXYXkgPyBhbmNlc3RvciA6IG51bGwsIGxlZnQsIHJpZ2h0KTsKLQkJCQkKLQkJaWYgKGNvZGUgIT0gTk9fQ0hBTkdFKSB7Ci0JCQlMaXN0IGw9IHJvb3QuZkNoaWxkcmVuOwotCQkJaWYgKGwuc2l6ZSgpID4gMCkgewotCQkJCU5vZGUgZmlyc3Q9IChOb2RlKWwuZ2V0KDApOwotCQkJCXJldHVybiBmaXJzdC52aXNpdCh0aGlzLCBkYXRhLCAwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBUcmF2ZXJzZSB0cmVlIGluIHBvc3RvcmRlci4KLQkgKi8KLQlwcml2YXRlIGludCB0cmF2ZXJzZShib29sZWFuIHRocmVlV2F5LCBOb2RlIHBhcmVudCwgSVByb2dyZXNzTW9uaXRvciBwbSwgT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQkJCi0JCU9iamVjdFtdIGFuY2VzdG9yQ2hpbGRyZW49IGdldENoaWxkcmVuKGFuY2VzdG9yKTsKLQkJT2JqZWN0W10gcmlnaHRDaGlsZHJlbj0gZ2V0Q2hpbGRyZW4ocmlnaHQpOwotCQlPYmplY3RbXSBsZWZ0Q2hpbGRyZW49IGdldENoaWxkcmVuKGxlZnQpOwotCQkKLQkJaW50IGNvZGU9IE5PX0NIQU5HRTsKLQkJCi0JCU5vZGUgbm9kZT0gbmV3IE5vZGUocGFyZW50LCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCQkJCi0JCWJvb2xlYW4gY29udGVudD0gdHJ1ZTsJLy8gd2UgcmVzZXQgdGhpcyBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjaGlsZAotCQkKLQkJaWYgKCgodGhyZWVXYXkgJiYgYW5jZXN0b3JDaGlsZHJlbiAhPSBudWxsKSB8fCAhdGhyZWVXYXkpCi0JCQkJCSAmJiByaWdodENoaWxkcmVuICE9IG51bGwgJiYgbGVmdENoaWxkcmVuICE9IG51bGwpIHsKLQkJCS8vIHdlIG9ubHkgcmVjdXJzZSBkb3duIGlmIG5vIGxlZyBpcyBudWxsCi0JCQkvLyBhIG5vZGUKLQkJCQotCQkJU2V0IGFsbFNldD0gbmV3IEhhc2hTZXQoMjApOwotCQkJTWFwIGFuY2VzdG9yU2V0PSBudWxsOwotCQkJTWFwIHJpZ2h0U2V0PSBudWxsOwotCQkJTWFwIGxlZnRTZXQ9IG51bGw7Ci0JCQkJCQkKLQkJCWlmIChhbmNlc3RvckNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlhbmNlc3RvclNldD0gbmV3IEhhc2hNYXAoMTApOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBhbmNlc3RvckNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBhbmNlc3RvckNoaWxkPSBhbmNlc3RvckNoaWxkcmVuW2ldOwotCQkJCQlhbmNlc3RvclNldC5wdXQoYW5jZXN0b3JDaGlsZCwgYW5jZXN0b3JDaGlsZCk7Ci0JCQkJCWFsbFNldC5hZGQoYW5jZXN0b3JDaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmlnaHRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJcmlnaHRTZXQ9IG5ldyBIYXNoTWFwKDEwKTsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgcmlnaHRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgcmlnaHRDaGlsZD0gcmlnaHRDaGlsZHJlbltpXTsKLQkJCQkJcmlnaHRTZXQucHV0KHJpZ2h0Q2hpbGQsIHJpZ2h0Q2hpbGQpOwotCQkJCQlhbGxTZXQuYWRkKHJpZ2h0Q2hpbGQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxlZnRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJbGVmdFNldD0gbmV3IEhhc2hNYXAoMTApOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBsZWZ0Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGxlZnRDaGlsZD0gbGVmdENoaWxkcmVuW2ldOwotCQkJCQlsZWZ0U2V0LnB1dChsZWZ0Q2hpbGQsIGxlZnRDaGlsZCk7Ci0JCQkJCWFsbFNldC5hZGQobGVmdENoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQkKLQkJCUl0ZXJhdG9yIGU9IGFsbFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGtleUNoaWxkPSBlLm5leHQoKTsKLQkJCQkKLQkJCQljb250ZW50PSBmYWxzZTsKLQkJCQkKLQkJCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCQkKLQkJCQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQkJCi0JCQkJCXVwZGF0ZVByb2dyZXNzKHBtLCBrZXlDaGlsZCk7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCBhbmNlc3RvckNoaWxkPSBhbmNlc3RvclNldCAhPSBudWxsID8gYW5jZXN0b3JTZXQuZ2V0KGtleUNoaWxkKSA6IG51bGw7Ci0JCQkJT2JqZWN0IGxlZnRDaGlsZD0gbGVmdFNldCAhPSBudWxsID8gbGVmdFNldC5nZXQoa2V5Q2hpbGQpIDogbnVsbDsKLQkJCQlPYmplY3QgcmlnaHRDaGlsZD0gcmlnaHRTZXQgIT0gbnVsbCA/IHJpZ2h0U2V0LmdldChrZXlDaGlsZCkgOiBudWxsOwotCQkJCQotCQkJCWludCBjPSB0cmF2ZXJzZSh0aHJlZVdheSwgbm9kZSwgcG0sIGFuY2VzdG9yQ2hpbGQsIGxlZnRDaGlsZCwgcmlnaHRDaGlsZCk7Ci0JCQkKLQkJCQlpZiAoKGMgJiBDSEFOR0VfVFlQRV9NQVNLKSAhPSBOT19DSEFOR0UpIHsKLQkJCQkJY29kZXw9IENIQU5HRTsJLy8gZGVsZXRpb25zIGFuZCBhZGRpdGlvbnMgb2YgY2hpbGQgcmVzdWx0IGluIGEgY2hhbmdlIG9mIHRoZSBjb250YWluZXIKLQkJCQkJY29kZXw9IChjICYgRElSRUNUSU9OX01BU0spOwkvLyBpbmNvbWluZyAmIG91dGdvaW5nIGFyZSBqdXN0IG9yZWQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGVudCkJCQkvLyBhIGxlYWYKLQkJCWNvZGU9IGNvbXBhcmUodGhyZWVXYXksIGFuY2VzdG9yLCBsZWZ0LCByaWdodCk7Ci0JCQkJCQkJCQotCQlub2RlLmZDb2RlPSBjb2RlOwotCQkJCQkJCQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGZvciBldmVyeSBub2RlIG9yIGxlYWYgY29tcGFyaXNvbi4KLQkgKiBUaGUgZGlmZmVyZW5jaW5nIGVuZ2luZSBwYXNzZXMgaW4gdGhlIGlucHV0IG9iamVjdHMgb2YgdGhlIGNvbXBhcmUgYW5kIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUuCi0JICogVGhlIGRhdGEgb2JqZWN0IGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB0aGUgPGNvZGU+dmlzaXQ8L2NvZGU+IG1ldGhvZCBvbiB0aGUgcGFyZW50IGlucHV0LgotCSAqIEl0IGNhbiBiZSBjb25zaWRlcmVkIHRoZSAicGFyZW50IiByZWZlcmVuY2UgYW5kIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGEgdHJlZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBuZXcKLQkgKiA8Y29kZT5EaWZmTm9kZTwvY29kZT4gd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICoKLQkgKiBAcGFyYW0gZGF0YSBvYmplY3QgcmV0dXJuZWQgZnJvbSBwYXJlbnQgY2FsbCB0byA8Y29kZT52aXNpdDwvY29kZT4sCi0JICogICBwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoZSB0aHJlZSBpbnB1dHMKLQkgKiBAcGFyYW0gYW5jZXN0b3IgdGhlIGNvbXBhcmUgYW5jZXN0b3Igb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGlucHV0cwotCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IGlucHV0IHRvIHRoZSBjb21wYXJlCi0JICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBpbnB1dCB0byB0aGUgY29tcGFyZQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCwgcG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHZpc2l0KE9iamVjdCBkYXRhLCBpbnQgcmVzdWx0LCBPYmplY3QgYW5jZXN0b3IsIE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJcmV0dXJuIG5ldyBEaWZmTm9kZSgoSURpZmZDb250YWluZXIpIGRhdGEsIHJlc3VsdCwgKElUeXBlZEVsZW1lbnQpYW5jZXN0b3IsIChJVHlwZWRFbGVtZW50KWxlZnQsIChJVHlwZWRFbGVtZW50KXJpZ2h0KTsKLQl9Ci0JCi0JLyoKLQkgKiBQZXJmb3JtcyBhIDItd2F5IG9yIDMtd2F5IGNvbXBhcmUgb2YgdGhlIGdpdmVuIGxlYWYgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gaW50ZWdlcgotCSAqIGRlc2NyaWJpbmcgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZS4KLQkgKi8KLQlwcml2YXRlIGludCBjb21wYXJlKGJvb2xlYW4gdGhyZWV3YXksIE9iamVjdCBhbmNlc3RvciwgT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQkKLQkJaW50IGRlc2NyaXB0aW9uPSBOT19DSEFOR0U7Ci0JCQotCQlpZiAodGhyZWV3YXkpIHsKLQkJCWlmIChhbmNlc3RvciA9PSBudWxsKSB7Ci0JCQkJaWYgKGxlZnQgPT0gbnVsbCkgewotCQkJCQlpZiAocmlnaHQgPT0gbnVsbCkgewotCQkJCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCQkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkZXNjcmlwdGlvbj0gUklHSFQgfCBBRERJVElPTjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyaWdodCA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbj0gTEVGVCB8IEFERElUSU9OOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZGVzY3JpcHRpb249IENPTkZMSUNUSU5HIHwgQURESVRJT047Ci0JCQkJCQlpZiAoY29udGVudHNFcXVhbChsZWZ0LCByaWdodCkpCi0JCQkJCQkJZGVzY3JpcHRpb258PSBQU0VVRE9fQ09ORkxJQ1Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChsZWZ0ID09IG51bGwpIHsKLQkJCQkJaWYgKHJpZ2h0ID09IG51bGwpIHsKLQkJCQkJCWRlc2NyaXB0aW9uPSBDT05GTElDVElORyB8IERFTEVUSU9OIHwgUFNFVURPX0NPTkZMSUNUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGNvbnRlbnRzRXF1YWwoYW5jZXN0b3IsIHJpZ2h0KSkJCQotCQkJCQkJCWRlc2NyaXB0aW9uPSBMRUZUIHwgREVMRVRJT047Ci0JCQkJCQllbHNlCi0JCQkJCQkJZGVzY3JpcHRpb249IENPTkZMSUNUSU5HIHwgQ0hBTkdFOwkKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyaWdodCA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoY29udGVudHNFcXVhbChhbmNlc3RvciwgbGVmdCkpCQotCQkJCQkJCWRlc2NyaXB0aW9uPSBSSUdIVCB8IERFTEVUSU9OOwotCQkJCQkJZWxzZQotCQkJCQkJCWRlc2NyaXB0aW9uPSBDT05GTElDVElORyB8IENIQU5HRTsJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlib29sZWFuIGF5PSBjb250ZW50c0VxdWFsKGFuY2VzdG9yLCBsZWZ0KTsKLQkJCQkJCWJvb2xlYW4gYW09IGNvbnRlbnRzRXF1YWwoYW5jZXN0b3IsIHJpZ2h0KTsKLQkJCQkJCQotCQkJCQkJaWYgKGF5ICYmIGFtKSB7Ci0JCQkJCQkJLy8gZW1wdHkKLQkJCQkJCX0gZWxzZSBpZiAoYXkgJiYgIWFtKSB7Ci0JCQkJCQkJZGVzY3JpcHRpb249IFJJR0hUIHwgQ0hBTkdFOwotCQkJCQkJfSBlbHNlIGlmICghYXkgJiYgYW0pIHsKLQkJCQkJCQlkZXNjcmlwdGlvbj0gTEVGVCB8IENIQU5HRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZGVzY3JpcHRpb249IENPTkZMSUNUSU5HIHwgQ0hBTkdFOwotCQkJCQkJCWlmIChjb250ZW50c0VxdWFsKGxlZnQsIHJpZ2h0KSkKLQkJCQkJCQkJZGVzY3JpcHRpb258PSBQU0VVRE9fQ09ORkxJQ1Q7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7CS8vIHR3byB3YXkgY29tcGFyZSBpZ25vcmVzIGFuY2VzdG9yCi0JCQlpZiAobGVmdCA9PSBudWxsKSB7Ci0JCQkJaWYgKHJpZ2h0ID09IG51bGwpIHsKLQkJCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdGlvbj0gQURESVRJT047Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmlnaHQgPT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdGlvbj0gREVMRVRJT047Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCEgY29udGVudHNFcXVhbChsZWZ0LCByaWdodCkpCi0JCQkJCQlkZXNjcmlwdGlvbj0gQ0hBTkdFOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQkJCQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCQkKLQkvKioKLQkgKiBQZXJmb3JtcyBhIGNvbnRlbnQgY29tcGFyZSBvbiB0aGUgdHdvIGdpdmVuIGlucHV0cy4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uCi0JICogcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBib3RoIGlucHV0cyBpbXBsZW1lbnQgPGNvZGU+SVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvY29kZT4KLQkgKiBhbmQgdGhlaXIgYnl0ZSBjb250ZW50cyBpcyBpZGVudGljYWwuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGltcGxlbWVudCAKLQkgKiBhIGRpZmZlcmVudCBjb250ZW50IGNvbXBhcmUgb24gdGhlIGdpdmVuIGlucHV0cy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gaW5wdXQxIGZpcnN0IGlucHV0IHRvIGNvbnRlbnRzIGNvbXBhcmUKLQkgKiBAcGFyYW0gaW5wdXQyIHNlY29uZCBpbnB1dCB0byBjb250ZW50cyBjb21wYXJlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb250ZW50IGlzIGVxdWFsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGVudHNFcXVhbChPYmplY3QgaW5wdXQxLCBPYmplY3QgaW5wdXQyKSB7Ci0JCQotCQlpZiAoaW5wdXQxID09IGlucHV0MikKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCUlucHV0U3RyZWFtIGlzMT0gZ2V0U3RyZWFtKGlucHV0MSk7Ci0JCUlucHV0U3RyZWFtIGlzMj0gZ2V0U3RyZWFtKGlucHV0Mik7Ci0JCQotCQlpZiAoaXMxID09IG51bGwgJiYgaXMyID09IG51bGwpCS8vIG5vIGJ5dGUgY29udGVudHMKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJdHJ5IHsKLQkJCWlmIChpczEgPT0gbnVsbCB8fCBpczIgPT0gbnVsbCkJLy8gb25seSBvbmUgaGFzIGNvbnRlbnRzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBjMT0gaXMxLnJlYWQoKTsKLQkJCQlpbnQgYzI9IGlzMi5yZWFkKCk7Ci0JCQkJaWYgKGMxID09IC0xICYmIGMyID09IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAoYzEgIT0gYzIpCi0JCQkJCWJyZWFrOwotCQkJCQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJLy8gTmVlZFdvcmsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpczEgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlzMS5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJCWlmIChpczIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlzMi5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogVHJpZXMgdG8gcmV0dXJuIGFuIElucHV0U3RyZWFtIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9iamVjdCBub3QgYW4gSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcgotCSAqIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0JICovCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKElTdHJlYW1Db250ZW50QWNjZXNzb3IpbykuZ2V0Q29udGVudHMoKTsKLQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIE5lZWRXb3JrCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4uCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgaW5wdXQgCi0JICogaW1wbGVtZW50cyB0aGUgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+IGludGVyZmFjZS4gSWYgeWVzIGl0IGlzIHVzZWQKLQkgKiB0byByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgY2hpbGRyZW4uIE90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBpbXBsZW1lbnQgYSBkaWZmZXJlbnQgc3RyYXRlZ3kgdG8gZW51bWVyYXRlIGNoaWxkcmVuLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgb2JqZWN0IGZvciB3aGljaCB0byByZXR1cm4gY2hpbGRyZW4KLQkgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0cnVjdHVyZUNvbXBhcmF0b3IpCi0JCQlyZXR1cm4gKChJU3RydWN0dXJlQ29tcGFyYXRvcilpbnB1dCkuZ2V0Q2hpbGRyZW4oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBmb3IgZXZlcnkgbGVhZiBvciBub2RlIGNvbXBhcmUgdG8gdXBkYXRlIHByb2dyZXNzIGluZm9ybWF0aW9uLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gc2hvd3MgdGhlIG5hbWUgb2YgdGhlIGlucHV0IG9iamVjdAotCSAqIGFzIGEgc3VidGFzay4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgcmVwb3J0aW5nIHByb2dyZXNzCi0JICogQHBhcmFtIG5vZGUgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ncmVzcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJVHlwZWRFbGVtZW50KSB7Ci0JCQlTdHJpbmcgbmFtZT0gKChJVHlwZWRFbGVtZW50KW5vZGUpLmdldE5hbWUoKTsKLQkJCVN0cmluZyBmbXQ9IFV0aWxpdGllcy5nZXRTdHJpbmcoIkRpZmZlcmVuY2VyLnByb2dyZXNzRm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtc2c9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZtdCwgbmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKLQkJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKG1zZyk7Ci0JCQkvL3Byb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RvY3VtZW50UmFuZ2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9Eb2N1bWVudFJhbmdlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDIyZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0RvY3VtZW50UmFuZ2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5JRG9jdW1lbnRSYW5nZTsKLQotCi0vKioKLSAqIEEgZG9jdW1lbnQgcmFuZ2Ugbm9kZSByZXByZXNlbnRzIGEgc3RydWN0dXJhbCBlbGVtZW50Ci0gKiB3aGVuIHBlcmZvcm1pbmcgYSBzdHJ1Y3R1cmUgY29tcGFyZSBvZiBkb2N1bWVudHMuCi0gKiA8Y29kZT5Eb2N1bWVudFJhbmdlTm9kZXM8L2NvZGU+IGFyZSBjcmVhdGVkIHdoaWxlIHBhcnNpbmcgdGhlIGRvY3VtZW50IGFuZCByZXByZXNlbnQKLSAqIGEgc2VtYW50aWMgZW50aXR5IChlLmcuIGEgSmF2YSBjbGFzcyBvciBtZXRob2QpLgotICogQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcGFyc2luZyBhIDxjb2RlPkRvY3VtZW50UmFuZ2VOb2RlPC9jb2RlPiBtYXBzIHRvIGEgcmFuZ2UKLSAqIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGRvY3VtZW50LgotICogPHA+Ci0gKiBTaW5jZSBhIDxjb2RlPkRvY3VtZW50UmFuZ2VOb2RlPC9jb2RlPiBpbXBsZW1lbnRzIHRoZSA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4KLSAqIGFuZCA8Y29kZT5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9jb2RlPiBpbnRlcmZhY2VzIGl0IGNhbiBiZSB1c2VkIGFzIGlucHV0IHRvIHRoZQotICogZGlmZmVyZW5jaW5nIGVuZ2luZS4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBwZXJmb3JtCi0gKiBhIHN0cnVjdHVyYWwgZGlmZiBvbiBhIGRvY3VtZW50IGFuZCBoYXZlIHRoZSBub2RlcyBhbmQgbGVhdmVzIG9mIHRoZSBjb21wYXJlIGVhc2lseSBtYXAKLSAqIHRvIGNoYXJhY3RlciByYW5nZXMgd2l0aGluIHRoZSBkb2N1bWVudC4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgYWRkIGFkZGl0aW9uYWwgc3RhdGUgY29sbGVjdGVkIHdoaWxlIHBhcnNpbmcgdGhlIGRvY3VtZW50LgotICogPC9wPiAKLSAqIEBzZWUgRGlmZmVyZW5jZXIKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50UmFuZ2VOb2RlCi0JCWltcGxlbWVudHMgSURvY3VtZW50UmFuZ2UsIElTdHJ1Y3R1cmVDb21wYXJhdG9yLCBJRWRpdGFibGVDb250ZW50LCBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBPU19VUERBVEU9IHRydWU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNj0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkJhc2VEb2N1bWVudDsKLQlwcml2YXRlIFBvc2l0aW9uIGZSYW5nZTsgLy8gdGhlIHJhbmdlIGluIHRoZSBiYXNlIGRvY3VtZW50Ci0JcHJpdmF0ZSBpbnQgZlR5cGVDb2RlOwotCXByaXZhdGUgU3RyaW5nIGZJRDsKLQlwcml2YXRlIFBvc2l0aW9uIGZBcHBlbmRQb3NpdGlvbjsgLy8gYSBwb3NpdGlvbiB3aGVyZSB0byBpbnNlcnQgYSBjaGlsZCB0ZXh0dWFsbHkKLQlwcml2YXRlIEFycmF5TGlzdCBmQ2hpbGRyZW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRvY3VtZW50UmFuZ2VOb2RlPC9jb2RlPiBmb3IgdGhlIGdpdmVuIHJhbmdlIHdpdGhpbiB0aGUgc3BlY2lmaWVkCi0JICogZG9jdW1lbnQuIFRoZSA8Y29kZT50eXBlQ29kZTwvY29kZT4gaXMgdW5pbnRlcnByZXRlZCBjbGllbnQgZGF0YS4gVGhlIElEIGlzIHVzZWQgd2hlbiBjb21wYXJpbmcKLQkgKiB0d28gbm9kZXMgd2l0aCBlYWNoIG90aGVyOiBpLmUuIHRoZSBkaWZmZXJlbmNpbmcgZW5naW5lIHBlcmZvcm1zIGEgY29udGVudCBjb21wYXJlIAotCSAqIG9uIHR3byBub2RlcyBpZiB0aGVpciBJRHMgYXJlIGVxdWFsLgotCSAqCi0JICogQHBhcmFtIHR5cGVDb2RlIGEgdHlwZSBjb2RlIGZvciB0aGlzIG5vZGUKLQkgKiBAcGFyYW0gaWQgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBub2RlCi0JICogQHBhcmFtIGRvY3VtZW50IGRvY3VtZW50IG9uIHdoaWNoIHRoaXMgbm9kZSBpcyBiYXNlZCBvbgotCSAqIEBwYXJhbSBzdGFydCBzdGFydCBwb3NpdGlvbiBvZiByYW5nZSB3aXRoaW4gZG9jdW1lbnQKLQkgKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiByYW5nZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJhbmdlTm9kZShpbnQgdHlwZUNvZGUsIFN0cmluZyBpZCwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCi0JCWZUeXBlQ29kZT0gdHlwZUNvZGU7Ci0JCWZJRD0gaWQ7Ci0JCQotCQlmQmFzZURvY3VtZW50PSBkb2N1bWVudDsKLQkJZkJhc2VEb2N1bWVudC5hZGRQb3NpdGlvbkNhdGVnb3J5KFJBTkdFX0NBVEVHT1JZKTsKLQkJZlJhbmdlPSBuZXcgUG9zaXRpb24oc3RhcnQsIGxlbmd0aCk7Ci0JCQotCQlpZiAoUE9TX1VQREFURSkgewotCQkJdHJ5IHsKLQkJCQlkb2N1bWVudC5hZGRQb3NpdGlvbihSQU5HRV9DQVRFR09SWSwgZlJhbmdlKTsKLQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSURvY3VtZW50UmFuZ2UuZ2V0RG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkJhc2VEb2N1bWVudDsKLQl9Ci0JCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJRG9jdW1lbnRSYW5nZS5nZXRSYW5nZQotCSAqLwotCXB1YmxpYyBQb3NpdGlvbiBnZXRSYW5nZSgpIHsKLQkJcmV0dXJuIGZSYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBjb2RlIG9mIHRoaXMgbm9kZS4KLQkgKiBUaGUgdHlwZSBjb2RlIGlzIHVuaW50ZXJwcmV0ZWQgY2xpZW50IGRhdGEgd2hpY2ggY2FuIGJlIHNldCBpbiB0aGUgY29uc3RydWN0b3IuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIGNvZGUgb2YgdGhpcyBub2RlCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlQ29kZSgpIHsKLQkJcmV0dXJuIGZUeXBlQ29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIG5vZGUncyBpZC4KLQkgKiBJdCBpcyB1c2VkIGluIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kIDxjb2RlPmhhc2hjb2RlPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG5vZGUncyBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIG5vZGUncyBpZC4KLQkgKiBJdCBpcyB1c2VkIGluIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kIDxjb2RlPmhhc2hjb2RlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgbmV3IGlkIGZvciB0aGlzIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJZklEPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBub2RlIGFzIGEgY2hpbGQuCi0JICoKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBhZGQgYXMgYSBjaGlsZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKERvY3VtZW50UmFuZ2VOb2RlIG5vZGUpIHsKLQkJaWYgKGZDaGlsZHJlbiA9PSBudWxsKQotCQkJZkNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDaGlsZHJlbi5hZGQobm9kZSk7Ci0JfQotCi0JLyogKG5vbiBKYXZhZG9jKQotCSAqIHNlZSBJU3RydWN0dXJlQ29tcGFyYXRvci5nZXRDaGlsZHJlbgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGZDaGlsZHJlbiAhPSBudWxsKQotCQkJcmV0dXJuIGZDaGlsZHJlbi50b0FycmF5KCk7IAotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIHRoaXMgbm9kZS4KLQkgKgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotCQlnZXRSYW5nZSgpLnNldExlbmd0aChsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHJhbmdlIHRoYXQgY2FuIGJlIHVzZWQgdG8gKGxlZ2FsbHkpIGluc2VydAotCSAqIHRleHQgd2l0aG91dCBicmVha2luZyB0aGUgc3ludGF4IG9mIHRoZSBkb2N1bWVudC4KLQkgKiA8cD4KLQkgKiBFLmcuIHdoZW4gcGFyc2luZyBhIEphdmEgZG9jdW1lbnQgdGhlICJhcHBlbmQgcG9zaXRpb24iIG9mIGEgPGNvZGU+RG9jdW1lbnRSYW5nZU5vZGU8L2NvZGU+Ci0JICogcmVwcmVzZW50YXRpbmcgYSBKYXZhIGNsYXNzIGNvdWxkIGJlIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2tldC4KLQkgKiBJbnNlcnRpbmcgdGhlIHRleHQgb2YgYSBuZXcgbWV0aG9kIHRoZXJlIHdvdWxkIG5vdCBkaXN0dXJiIHRoZSBzeW50YXggb2YgdGhlIGNsYXNzLgotCSAqCi0JICogQHBhcmFtIHBvcyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIHdpdGhpbiB0aGUgdW5kZXJseWluZyBkb2N1bWVudCB3aGVyZSB0ZXh0IGNhbiBiZSBsZWdhbGx5IGluc2VydGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwZW5kUG9zaXRpb24oaW50IHBvcykgewotCQlpZiAoUE9TX1VQREFURSkgewotCQkJZkJhc2VEb2N1bWVudC5yZW1vdmVQb3NpdGlvbihmQXBwZW5kUG9zaXRpb24pOwotCQkJdHJ5IHsKLQkJCQlQb3NpdGlvbiBwPSBuZXcgUG9zaXRpb24ocG9zKTsKLQkJCQlmQmFzZURvY3VtZW50LmFkZFBvc2l0aW9uKFJBTkdFX0NBVEVHT1JZLCBwKTsKLQkJCQlmQXBwZW5kUG9zaXRpb249IHA7Ci0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc2lsZW50bHkgaWdub3JlZAotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmQXBwZW5kUG9zaXRpb249IG5ldyBQb3NpdGlvbihwb3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gdGhhdCBoYXMgYmVlbiBzZXQgd2l0aCA8Y29kZT5zZXRBcHBlbmRQb3NpdGlvbjwvY29kZT4uCi0JICogSWYgPGNvZGU+c2V0QXBwZW5kUG9zaXRpb248L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlcgotCSAqIG9mIHRoaXMgcmFuZ2UgaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcmV0dXJuIGEgcG9zaXRpb24gd2hlcmUgdGV4dCBjYW4gYmUgbGVnYWxseSBpbnNlcnRlZAotCSAqLwotCXB1YmxpYyBQb3NpdGlvbiBnZXRBcHBlbmRQb3NpdGlvbigpIHsKLQkJaWYgKGZBcHBlbmRQb3NpdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAoUE9TX1VQREFURSkgewotCQkJCXRyeSB7Ci0JCQkJCVBvc2l0aW9uIHA9IG5ldyBQb3NpdGlvbihmQmFzZURvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCQkJZkJhc2VEb2N1bWVudC5hZGRQb3NpdGlvbihSQU5HRV9DQVRFR09SWSwgcCk7Ci0JCQkJCWZBcHBlbmRQb3NpdGlvbj0gcDsKLQkJCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmQXBwZW5kUG9zaXRpb249IG5ldyBQb3NpdGlvbihmQmFzZURvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkFwcGVuZFBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIDxjb2RlPmdldElEPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgPGNvZGU+RG9jdW1lbnRSYW5nZU5vZGU8L2NvZGU+IGFnYWluc3QuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+RG9jdW1lbnRSYW5nZU5vZGVzPC9jb2RlPmFyZSBlcXVhbDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciAhPSBudWxsICYmIG90aGVyLmdldENsYXNzKCkgPT0gZ2V0Q2xhc3MoKSkgewotCQkJRG9jdW1lbnRSYW5nZU5vZGUgdG49IChEb2N1bWVudFJhbmdlTm9kZSkgb3RoZXI7Ci0JCQlyZXR1cm4gZlR5cGVDb2RlID09IHRuLmZUeXBlQ29kZSAmJiBmSUQuZXF1YWxzKHRuLmZJRCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcik7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gYmFzZWQgb24gPGNvZGU+Z2V0SUQ8L2NvZGU+LgotCSAqIEByZXR1cm4gYSBoYXNoY29kZSBmb3IgdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZJRC5oYXNoQ29kZSgpOwotCX0KLQotCS8qCi0JICogRmluZCBjb3JyZXNwb25kaW5nIHBvc2l0aW9uCi0JICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBmaW5kQ29ycmVzcG9uZGluZ1Bvc2l0aW9uKERvY3VtZW50UmFuZ2VOb2RlIG90aGVyUGFyZW50LCBEb2N1bWVudFJhbmdlTm9kZSBjaGlsZCkgewotCi0JCS8vIHdlIHRyeSB0byBmaW5kIGEgcHJlZGVjZXNzb3Igb2YgbGVmdCBOb2RlIHdoaWNoIGV4aXN0cyBvbiB0aGUgcmlnaHQgc2lkZQotCi0JCWlmIChjaGlsZCAhPSBudWxsICYmIGZDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgaXg9IG90aGVyUGFyZW50LmZDaGlsZHJlbi5pbmRleE9mKGNoaWxkKTsKLQkJCWlmIChpeCA+PSAwKSB7Ci0KLQkJCQlmb3IgKGludCBpPSBpeCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCURvY3VtZW50UmFuZ2VOb2RlIGMxPSAoRG9jdW1lbnRSYW5nZU5vZGUpIG90aGVyUGFyZW50LmZDaGlsZHJlbi5nZXQoaSk7Ci0JCQkJCWludCBpMj0gZkNoaWxkcmVuLmluZGV4T2YoYzEpOwotCQkJCQlpZiAoaTIgPj0gMCkgewotCQkJCQkJRG9jdW1lbnRSYW5nZU5vZGUgYz0gKERvY3VtZW50UmFuZ2VOb2RlKSBmQ2hpbGRyZW4uZ2V0KGkyKTsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kIGNvcnJlc3BvbmRpbmc6ICIgKyBpMiArICIgIiArIGMpOwotCQkJCQkJUG9zaXRpb24gcD0gYy5mUmFuZ2U7Ci0KLQkJCQkJCS8vdHJ5IHsKLQkJCQkJCVBvc2l0aW9uIHBvPSBuZXcgUG9zaXRpb24ocC5nZXRPZmZzZXQoKSArIHAuZ2V0TGVuZ3RoKCkgKyAxLCAwKTsKLQkJCQkJCS8vYy5mQmFzZURvY3VtZW50LmFkZFBvc2l0aW9uKFJBTkdFX0NBVEVHT1JZLCBwbyk7Ci0JCQkJCQlyZXR1cm4gcG87Ci0JCQkJCQkvL30gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvL30KLQkJCQkJCS8vYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpPSBpeDsgaSA8IG90aGVyUGFyZW50LmZDaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCQlEb2N1bWVudFJhbmdlTm9kZSBjMT0gKERvY3VtZW50UmFuZ2VOb2RlKSBvdGhlclBhcmVudC5mQ2hpbGRyZW4uZ2V0KGkpOwotCQkJCQlpbnQgaTI9IGZDaGlsZHJlbi5pbmRleE9mKGMxKTsKLQkJCQkJaWYgKGkyID49IDApIHsKLQkJCQkJCURvY3VtZW50UmFuZ2VOb2RlIGM9IChEb2N1bWVudFJhbmdlTm9kZSkgZkNoaWxkcmVuLmdldChpMik7Ci0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICBmb3VuZCBjb3JyZXNwb25kaW5nOiAiICsgaTIgKyAiICIgKyBjKTsKLQkJCQkJCVBvc2l0aW9uIHA9IGMuZlJhbmdlOwotCQkJCQkJLy90cnkgewotCQkJCQkJUG9zaXRpb24gcG89IG5ldyBQb3NpdGlvbihwLmdldE9mZnNldCgpLCAwKTsKLQkJCQkJCS8vYy5mQmFzZURvY3VtZW50LmFkZFBvc2l0aW9uKFJBTkdFX0NBVEVHT1JZLCBwbyk7Ci0JCQkJCQlyZXR1cm4gcG87Ci0JCQkJCQkvL30gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvL30KLQkJCQkJCS8vYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0QXBwZW5kUG9zaXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBzLCBEb2N1bWVudFJhbmdlTm9kZSBwYXJlbnQsIERvY3VtZW50UmFuZ2VOb2RlIGNoaWxkKSB7Ci0KLQkJUG9zaXRpb24gcD0gZmluZENvcnJlc3BvbmRpbmdQb3NpdGlvbihwYXJlbnQsIGNoaWxkKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmQmFzZURvY3VtZW50LnJlcGxhY2UocC5nZXRPZmZzZXQoKSwgcC5nZXRMZW5ndGgoKSwgcyk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNpbGVudGx5IGlnbm9yZWQKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElTdHJlYW1Db250ZW50QWNjZXNzb3IuZ2V0Q29udGVudHMKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB7Ci0JCVN0cmluZyBzOwotCQl0cnkgewotCQkJcz0gZkJhc2VEb2N1bWVudC5nZXQoZlJhbmdlLmdldE9mZnNldCgpLCBmUmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJcz0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVXRpbGl0aWVzLmdldEJ5dGVzKHMsIFVURl8xNikpOwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBzZWUgSUVkaXRhYmxlQ29udGVudC5pc0VkaXRhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElFZGl0YWJsZUNvbnRlbnQucmVwbGFjZQotCSAqLwotCXB1YmxpYyBJVHlwZWRFbGVtZW50IHJlcGxhY2UoSVR5cGVkRWxlbWVudCBjaGlsZCwgSVR5cGVkRWxlbWVudCBvdGhlcikgewotCi0JCURvY3VtZW50UmFuZ2VOb2RlIHNyYz0gbnVsbDsKLQkJU3RyaW5nIHNyY0NvbnRlbnRzPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKG90aGVyICE9IG51bGwpIHsKLQkJCXNyYz0gKERvY3VtZW50UmFuZ2VOb2RlKSBjaGlsZDsKLQkJCQotCQkJaWYgKG90aGVyIGluc3RhbmNlb2YgSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgewotCQkJCXRyeSB7Ci0JCQkJCXNyY0NvbnRlbnRzPSBVdGlsaXRpZXMucmVhZFN0cmluZygoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcilvdGhlcik7Ci0JCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIE5lZWRXb3JrCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNoaWxkID09IG51bGwpIC8vIG5vIGRlc3RpbmF0aW9uOiB3ZSBoYXZlIHRvIGFkZCB0aGUgY29udGVudHMgaW50byB0aGUgcGFyZW50Ci0JCQlhZGQoc3JjQ29udGVudHMsIG51bGwsIHNyYyk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQkKLQkvKiAobm9uIEphdmFkb2MpCi0JICogc2VlIElFZGl0YWJsZUNvbnRlbnQuc2V0Q29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoYnl0ZVtdIGNvbnRlbnQpIHsKLQkJLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciNnZXRFbmNvZGluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgewotCQlyZXR1cm4gVVRGXzE2OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSUNvbXBhcmVJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSUNvbXBhcmVJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTIxMmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lDb21wYXJlSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHVzZWQgYXMgaW5wdXQgdG8gYSB0d28td2F5IG9yIHRocmVlLXdheSBjb21wYXJlIHZpZXdlci4KLSAqIEl0IGRlZmluZXMgQVBJIGZvciBhY2Nlc3NpbmcgdGhlIHRocmVlIHNpZGVzIGZvciB0aGUgY29tcGFyZSwKLSAqIGFuZCBhIG5hbWUgYW5kIGltYWdlIHdoaWNoIGlzIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoZSB0aHJlZSB3YXkgaW5wdXQKLSAqIGluIHRoZSBVSSwgZm9yIGV4YW1wbGUsIGluIGEgdGl0bGUgYmFyLgotICogPHA+Ci0gKiBOb3RlOiBhdCBtb3N0IHR3byBzaWRlcyBvZiBhbiA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPiBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4sCi0gKiAoYXMgaXQgaXMgbm9ybWFsIGZvciBhZGRpdGlvbnMgb3IgZGVsZXRpb25zKSBidXQgbm90IGFsbCB0aHJlZS4KLSAqIDxwPgotICogPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4gcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcKLSAqIDxjb2RlPklDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcjwvY29kZT5zCi0gKiB0aGF0IGdldCBpbmZvcm1lZCBpZiBvbmUgKG9yIG1vcmUpCi0gKiBvZiB0aGUgdGhyZWUgc2lkZXMgb2YgYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4gb2JqZWN0IGNoYW5nZXMgaXRzIHZhbHVlLgotICogPHA+Ci0gKiBGb3IgZXhhbXBsZSB3aGVuIGFjY2VwdGluZyBhbiBpbmNvbWluZyBhZGRpdGlvbgotICogdGhlIChub24tPGNvZGU+bnVsbDwvY29kZT4pIGxlZnQgc2lkZSBvZiBhbiA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPgotICogaXMgY29waWVkIHRvIHRoZSByaWdodCBzaWRlIGJ5IG1lYW5zIG9mIG1ldGhvZCA8Y29kZT5jb3B5PC9jb2RlPi4KLSAqIFRoaXMgc2hvdWxkIHRyaWdnZXIgYSBjYWxsIHRvIDxjb2RlPmNvbXBhcmVJbnB1dENoYW5nZWQ8L2NvZGU+IG9mIHJlZ2lzdGVyZWQKLSAqIDxjb2RlPklDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcjwvY29kZT5zLiAKLSAqIDxwPgotICogQ2xpZW50cyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBvciB1c2UgdGhlIGNvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIAotICogPGNvZGU+RGlmZk5vZGU8L2NvZGU+LgotICogPC9wPgotICogCi0gKiBAc2VlIFN0cnVjdHVyZURpZmZWaWV3ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuQ29udGVudE1lcmdlVmlld2VyCi0gKiBAc2VlIERpZmZOb2RlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBhcmVJbnB1dCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5hbWUgb2YgaW5wdXQuCi0JICogVGhpcyBuYW1lIGlzIGRpc3BsYXllZCB3aGVuIHRoaXMgaW5wdXQgaXMgc2hvd24gaW4gYSB2aWV3ZXIuCi0JICogSW4gbWFueSBjYXNlcyB0aGlzIG5hbWUgaXMgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBub24tPGNvZGU+bnVsbDwvY29kZT4gc2lkZXMgb3IgYSBjb21iaW5hdGlvbgotCSAqIHRoZXJlb2YuCi0JICoKLQkgKiBAcmV0dXJuIG5hbWUgb2YgaW5wdXQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgcmVwcmVzZW50aW5nIHRoaXMgaW5wdXQuCi0JICogVGhpcyBpbWFnZSBpcyB0eXBpY2FsbHkgZGlzcGxheWVkIHdoZW4gdGhpcyBpbnB1dCBpcyBzaG93biBpbiBhIHZpZXdlci4KLQkgKiBJbiBtYW55IGNhc2VzIHRoaXMgaW1hZ2UgaXMgdGhlIGltYWdlIG9mIG9uZSBvZiB0aGUgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHNpZGVzLgotCSAqCi0JICogQHJldHVybiBpbWFnZSByZXByZXNlbnRpbmcgdGhpcyBpbnB1dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaWNvbiBzaG91bGQgYmUgc2hvd24KLQkgKi8KLQlJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JICogdGhyZWUgc2lkZXMgYW5jZXN0b3IsIGxlZnQgYW5kIHJpZ2h0LgotCSAqIFRoaXMgZmllbGQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPgotCSAqIGlzIHRoZSByZXN1bHQgb2YgYW5vdGhlciBjb21wYXJlLiBJbiB0aGlzIGNhc2UgaXQgaXMgdXNlZAotCSAqIHRvZ2V0aGVyIHdpdGggPGNvZGU+Z2V0SW1hZ2U8L2NvZGU+IHRvIGNvbXBvc2UgYSBpY29uCi0JICogd2hpY2ggcmVmbGVjdHMgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gb3IgdGhyZWUgZWxlbWVudHMuCi0JICoKLQkgKiBAcmV0dXJuIGtpbmQgb2YgZGlmZmVyZW5jZSAoc2VlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPikKLQkgKi8KLQlpbnQgZ2V0S2luZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9yIHNpZGUgb2YgdGhpcyBpbnB1dC4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaW5wdXQgaGFzIG5vIGFuY2VzdG9yCi0JICogb3IgaW4gdGhlIHR3by13YXkgY29tcGFyZSBjYXNlLgotCSAqCi0JICogQHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhpcyBpbnB1dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlJVHlwZWRFbGVtZW50IGdldEFuY2VzdG9yKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVmdCBzaWRlIG9mIHRoaXMgaW5wdXQuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBsZWZ0IHNpZGUgKGRlbGV0aW9uIG9yIGFkZGl0aW9uKS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxlZnQgc2lkZSBvZiB0aGlzIGlucHV0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCUlUeXBlZEVsZW1lbnQgZ2V0TGVmdCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpZ2h0IHNpZGUgb2YgdGhpcyBpbnB1dC4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHJpZ2h0IHNpZGUgKGRlbGV0aW9uIG9yIGFkZGl0aW9uKS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJpZ2h0IHNpZGUgb2YgdGhpcyBpbnB1dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlJVHlwZWRFbGVtZW50IGdldFJpZ2h0KCk7Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uLgotCSAqIElmIHRoZSBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRoZSBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIgZm9yIGNoYW5nZXMgb2YgdGhpcyBpbnB1dAotCSAqLwotCXZvaWQgYWRkQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIoSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBVbnJlZ2lzdGVycyB0aGUgZ2l2ZW4gbGlzdGVuZXIuCi0JICogSWYgdGhlIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZCB0aGUgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHVucmVnaXN0ZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKElDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogQ29weSBvbmUgc2lkZSAoc291cmNlKSB0byB0aGUgb3RoZXIgc2lkZSAoZGVzdGluYXRpb24pIGRlcGVuZGluZyBvbiB0aGUgCi0JICogdmFsdWUgb2YgPGNvZGU+bGVmdFRvUmlnaHQ8L2NvZGU+LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbQotCSAqIGEgbWVyZ2Ugdmlld2VyIGlmIGEgY29ycmVzcG9uZGluZyBhY3Rpb24gKCJ0YWtlIGxlZnQiIG9yICJ0YWtlIHJpZ2h0IikKLQkgKiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqIDxwPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaGFuZGxlIHRoZSBmb2xsb3dpbmcgY2FzZXM6Ci0JICogPFVMPgotCSAqIDxMST4KLQkgKiBpZiB0aGUgc291cmNlIHNpZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgZGVsZXRlZCwKLQkgKiA8TEk+Ci0JICogaWYgdGhlIGRlc3RpbmF0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIGNyZWF0ZWQKLQkgKiBhbmQgZmlsbGVkIHdpdGggdGhlIGNvbnRlbnRzIGZyb20gdGhlIHNvdXJjZSwKLQkgKiA8TEk+Ci0JICogaWYgYm90aCBzaWRlcyBhcmUgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHRoZSBjb250ZW50cyBvZiBzb3VyY2UgbXVzdCBiZSBjb3BpZWQgdG8gZGVzdGluYXRpb24uCi0JICogPC9VTD4KLQkgKiBJbiBhZGRpdGlvbiB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHNlbmQgb3V0IG5vdGlmaWNhdGlvbiB0byB0aGUgcmVnaXN0ZXJlZAotCSAqIDxjb2RlPklDb21wYXJlSW5wdXRDaGFuZ2VMaXN0ZW5lcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGxlZnRUb1JpZ2h0IGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBsZWZ0IHNpZGUgaXMgY29waWVkIHRvIHRoZSByaWdodCBzaWRlLgotCSAqIElmIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGUgcmlnaHQgc2lkZSBpcyBjb3BpZWQgdG8gdGhlIGxlZnQgc2lkZQotCSAqLwotCXZvaWQgY29weShib29sZWFuIGxlZnRUb1JpZ2h0KTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlMzcxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi0vKioKLSAqIExpc3RlbmVyIHRoYXQgZ2V0cyBpbmZvcm1lZCBpZiBvbmUgKG9yIG1vcmUpCi0gKiBvZiB0aGUgdGhyZWUgc2lkZXMgb2YgYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4gb2JqZWN0IGNoYW5nZXMgaXRzIHZhbHVlLgotICogPHA+Ci0gKiBGb3IgZXhhbXBsZSB3aGVuIGFjY2VwdGluZyBhbiBpbmNvbWluZyBhZGRpdGlvbgotICogdGhlIChub24tbnVsbCkgbGVmdCBzaWRlIG9mIGFuIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+Ci0gKiBpcyBjb3BpZWQgdG8gdGhlIHJpZ2h0IHNpZGUgKHdoaWNoIHdhcyA8Y29kZT5udWxsPC9jb2RlPikuCi0gKiBUaGlzIHRyaWdnZXJzIGEgY2FsbCB0byA8Y29kZT5jb21wYXJlSW5wdXRDaGFuZ2VkPC9jb2RlPiBvZiByZWdpc3RlcmVkCi0gKiA8Y29kZT5JQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXI8L2NvZGU+LiAKLSAqIDxwPgotICogTm90ZSBob3dldmVyLCB0aGF0IGxpc3RlbmVyIGFyZSBub3QgaW5mb3JtZWQgaWYgdGhlIGNvbnRlbnQgb2Ygb25lIG9mIHRoZSBzaWRlcyBjaGFuZ2VzLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEl0IGlzIGFsc28gaW1wbGVtZW50ZWQgYnkgdmlld2VycyB0aGF0IHRha2UgCi0gKiBhbiA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPiBhcyBpbnB1dC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tcGFyZUlucHV0Q2hhbmdlTGlzdGVuZXIgewotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuZXZlciB0aGUgdmFsdWUgKG5vdCB0aGUgY29udGVudCkgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIHRocmVlIHNpZGVzIAotIAkgKiBvZiBhIDxjb2RlPklDb21wYXJlSW5wdXQ8L2NvZGU+IGhhcyBjaGFuZ2VkLgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSB0aGUgPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4gdGhhdCBoYXMgY2hhbmdlZAotCSAqLwotCXZvaWQgY29tcGFyZUlucHV0Q2hhbmdlZChJQ29tcGFyZUlucHV0IHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JRGlmZkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSURpZmZDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1ZjhiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JRGlmZkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLS8qKgotICogPGNvZGU+SURpZmZDb250YWluZXI8L2NvZGU+IGlzIGEgPGNvZGU+SURpZmZFbGVtZW50PC9jb2RlPiB3aXRoIGNoaWxkcmVuLgotICogPHA+Ci0gKiA8Y29kZT5JRGlmZkNvbnRhaW5lcjwvY29kZT4gYXJlIHRoZSBpbm5lciBub2RlcyBkaXNwbGF5ZWQKLSAqIGJ5IHRoZSA8Y29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4uCi0gKiA8Y29kZT5JRGlmZkNvbnRhaW5lcjwvY29kZT4gYXJlIHR5cGljYWxseSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgcGVyZm9ybWluZwotICogYSBjb21wYXJlIHdpdGggdGhlIDxjb2RlPkRpZmZlcmVuY2VyPC9jb2RlPi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBvciB1c2Ugb25lIG9mIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMsCi0gKiA8Y29kZT5EaWZmQ29udGFpbmVyPC9jb2RlPiBvciA8Y29kZT5EaWZmTm9kZTwvY29kZT4uCi0gKgotICogQHNlZSBEaWZmZXJlbmNlcgotICogQHNlZSBEaWZmVHJlZVZpZXdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWZmQ29udGFpbmVyIGV4dGVuZHMgSURpZmZFbGVtZW50IHsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbnRhaW5lciBoYXMgYXQgbGVhc3Qgb25lIGNoaWxkLgotCSAqIEluIHNvbWUgY2FzZXMgdGhpcyBtZXRob2RzIGF2b2lkcyBoYXZpbmcgdG8gY2FsbCB0aGUKLQkgKiBwb3RlbnRpYWwgbW9yZSBjb3N0bHkgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udGFpbmVyIGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQgCi0JICovCi0JYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb250YWluZXIuCi0JICogSWYgdGhpcyBjb250YWluZXIgaGFzIG5vIGNoaWxkcmVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkIChub3QgPGNvZGU+bnVsbDwvY29kZT4pLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29udGFpbmVyIGFzIGFuIGFycmF5Ci0JICovCi0JSURpZmZFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNoaWxkIHRvIHRoaXMgY29udGFpbmVyLgotCSAqIElmIHRoZSBjaGlsZCBpcyBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGlzIGNvbnRhaW5lciwgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQkgKgotCSAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgdG8gYmUgYWRkZWQgdG8gdGhpcyBjb250YWluZXIKLQkgKi8KLQl2b2lkIGFkZChJRGlmZkVsZW1lbnQgY2hpbGQpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNoaWxkIGZyb20gdGhpcyBjb250YWluZXIuCi0JICogSWYgdGhlIGNvbnRhaW5lciBiZWNvbWVzIGVtcHR5IGl0IGlzIHJlbW92ZWQgZnJvbSBpdHMgY29udGFpbmVyLgotCSAqIElmIHRoZSBjaGlsZCBpcyBub3QgY29udGFpbmVkIGluIHRoaXMgY29udGFpbmVyLCB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqCi0JICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBjb250YWluZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVRvUm9vdChJRGlmZkVsZW1lbnQgY2hpbGQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvSURpZmZFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JRGlmZkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlNDU4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JRGlmZkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JVHlwZWRFbGVtZW50OwotCi0vKioKLSAqIEFuIDxjb2RlPklEaWZmRWxlbWVudDwvY29kZT4gaXMgdXNlZCBpbiB0aGUgPGNvZGU+RGlmZlRyZWVWaWV3ZXI8L2NvZGU+Ci0gKiB0byBkaXNwbGF5IHRoZSBraW5kIG9mIGNoYW5nZSBkZXRlY3RlZCBhcyB0aGUgcmVzdWx0IG9mIGEgdHdvLXdheSBvciB0aHJlZS13YXkgY29tcGFyZS4KLSAqIDxwPgotICogVGhlIGJhc2UgaW50ZXJmYWNlIDxjb2RlPklUeXBlZEVsZW1lbnQ8L2NvZGU+IHByb3ZpZGVzIGEgbmFtZSwgYSB0eXBlLCBhbmQgYW4gaW1hZ2UuCi0gKiA8Y29kZT5JRGlmZkVsZW1lbnQ8L2NvZGU+IGFkZHMgQVBJIGZvciBtYWludGFpbmluZyBhIHBhcmVudCByZWxhdGlvbnNoaXAuCi0gKiA8cD4KLSAqIDxjb2RlPkRpZmZUcmVlVmlld2VyPC9jb2RlPiB3b3JrcyBvbiBhIHRyZWUgb2YgPGNvZGU+SURpZmZFbGVtZW50czwvY29kZT4uCi0gKiBMZWFmIGVsZW1lbnRzIG11c3QgaW1wbGVtZW50IHRoZQotICogPGNvZGU+SURpZmZFbGVtZW50PC9jb2RlPiBpbnRlcmZhY2UsIGlubmVyIG5vZGVzIHRoZSA8Y29kZT5JRGlmZkNvbnRhaW5lcjwvY29kZT4gaW50ZXJmYWNlLgotICogPHA+Ci0gKiA8Y29kZT5JRGlmZkVsZW1lbnQ8L2NvZGU+cyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBwZXJmb3JtaW5nCi0gKiBhIGNvbXBhcmUgd2l0aCB0aGUgPGNvZGU+RGlmZmVyZW5jZXI8L2NvZGU+LgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIG9yIHVzZSBvbmUgb2YgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywKLSAqIDxjb2RlPkRpZmZFbGVtZW50PC9jb2RlPiwgPGNvZGU+RGlmZkNvbnRhaW5lcjwvY29kZT4sIG9yIDxjb2RlPkRpZmZOb2RlPC9jb2RlPi4KLSAqCi0gKiBAc2VlIERpZmZUcmVlVmlld2VyCi0gKiBAc2VlIERpZmZFbGVtZW50Ci0gKiBAc2VlIERpZmZDb250YWluZXIKLSAqIEBzZWUgRGlmZk5vZGUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlmZkVsZW1lbnQgZXh0ZW5kcyBJVHlwZWRFbGVtZW50IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UgYXMgZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGRpZmZlcmVuY2UgYXMgZGVmaW5lZCBpbiA8Y29kZT5EaWZmZXJlbmNlcjwvY29kZT4KLQkgKi8KLQlpbnQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgZWxlbWVudC4KLQkgKiBJZiB0aGUgb2JqZWN0IGlzIHRoZSByb290IG9mIGEgaGllcmFyY2h5IDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaGFzIG5vIHBhcmVudAotCSAqLwotCUlEaWZmQ29udGFpbmVyIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgZWxlbWVudC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG5ldyBwYXJlbnQgb2YgdGhpcyBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCi0JICogICBlbGVtZW50IGlzIHRvIGhhdmUgbm8gcGFyZW50Ci0JICovCi0Jdm9pZCBzZXRQYXJlbnQoSURpZmZDb250YWluZXIgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JU3RydWN0dXJlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA1YmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBjb21wYXJlIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmVzLgotICogSXQgaXMgdXNlZCBieSB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZS4KLSAqIDxwPgotICogQ2xpZW50cyB0eXBpY2FsbHkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGluIGFuIGFkYXB0b3IgY2xhc3Mgd2hpY2ggCi0gKiB3cmFwcGVycyB0aGUgb2JqZWN0cyB0byBiZSBjb21wYXJlZC4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuUmVzb3VyY2VOb2RlCi0gKiBAc2VlIERpZmZlcmVuY2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZUNvbXBhcmF0b3IgewotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoaXMgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSB3aXRoIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG9iamVjdCwgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuCi0JICovCi0JT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBzb21lIG90aGVyIG9iamVjdCBpcyAiZXF1YWwgdG8iIHRoaXMgb25lCi0JICogd2l0aCByZXNwZWN0IHRvIGEgc3RydWN0dXJhbCBjb21wYXJpc29uLiBGb3IgZXhhbXBsZSwgd2hlbiBjb21wYXJpbmcKLQkgKiBKYXZhIGNsYXNzIG1ldGhvZHMsIDxjb2RlPmVxdWFsczwvY29kZT4gd291bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdHdvIG1ldGhvZHMgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmUgKHRoZSBhcmd1bWVudCBuYW1lcyBhbmQgdGhlIAotCSAqIG1ldGhvZCBib2R5IG1pZ2h0IGRpZmZlcikuCi0JICoKLQkgKiBAcGFyYW0gb3RoZXIgdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgYXJndW1lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9JU3RydWN0dXJlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUwZmIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL0lTdHJ1Y3R1cmVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gY3JlYXRlIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBvZgotICogPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+cyBmb3IgYSBnaXZlbiBpbnB1dCBvYmplY3QuCi0gKiBJbiBhZGRpdGlvbiwgaXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgbG9jYXRpbmcgYSBwYXRoIGluIHRoZSBoaWVyYXJjaGljYWwgc3RydWN0dXJlCi0gKiBhbmQgdG8gbWFwIGEgbm9kZSBvZiB0aGlzIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IG9iamVjdC4KLSAqIDxwPgotICogU3RydWN0dXJlIGNyZWF0b3JzIGFyZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgY29udGV4dHM6Ci0gKiA8dWw+Ci0gKiA8bGk+Ci0gKiB0aGUgPGNvZGU+U3RydWN0dXJlRGlmZlZpZXdlcjwvY29kZT4gdXNlcyBhbiA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvcjwvY29kZT4gdG8KLSAqIGJ1aWxkIHR3byAob3IgdGhyZWUpIHRyZWUgc3RydWN0dXJlcyBvZiBpdHMgaW5wdXQgZWxlbWVudHMgKG1ldGhvZCA8Y29kZT5nZXRTdHJ1Y3R1cmU8L2NvZGU+KS4KLSAqIFRoZXNlIHRyZWVzIGFyZSB0aGVuIGNvbXBhcmVkIHdpdGggZWFjaCBvdGhlciBieSBtZWFucyBvZiB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZSBhbmQgZGlzcGxheWVkCi0gKiB3aXRoIHRoZSA8Y29kZT5EaWZmVHJlZVZpZXdlcjwvY29kZT4sCi0gKiA8L2xpPgotICogPGxpPgotICogdGhlIDxjb2RlPlJlcGxhY2VXaXRoRWRpdGlvbkRpYWxvZzwvY29kZT4gdXNlcyBhbiA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvcjwvY29kZT4KLSAqIHRvIG1hcCBhIHBhdGggYmFjayB0byBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCi0gKiA8L2xpPgotICogPC91bD4KLSAqIEEgPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJld3JpdGluZyB0aGUgdHJlZSBwcm9kdWNlZCBieSB0aGUgZGlmZmVyZW5jaW5nCi0gKiBlbmdpbmUgdG8gc3VwcG9ydCAic21hcnQiIHN0cnVjdHVyYWwgZGlmZmVyZW5jaW5nLiBFLmcuIGNlcnRhaW4gcGF0dGVybnMgb2YgcGFpcnMgb2YgImFkZGl0aW9uIgotICogYW5kICJkZWxldGlvbiIgbm9kZXMgY2FuIGJlIGRldGVjdGVkIGFzIHJlbmFtZXMgYW5kIG1lcmdlZCBpbnRvIGEgc2luZ2xlIG5vZGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZTsgdGhlcmUgaXMgbm8gc3RhbmRhcmQgaW1wbGVtZW50YXRpb24uCi0gKiA8L3A+Ci0gKgotICogQHNlZSBTdHJ1Y3R1cmVEaWZmVmlld2VyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuRWRpdGlvblNlbGVjdGlvbkRpYWxvZwotICogQHNlZSBEaWZmZXJlbmNlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVDcmVhdG9yIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGl2ZSBuYW1lIHdoaWNoIGNhbiBiZSB1c2VkIGluIHRoZSBVSSBvZiB0aGUgPGNvZGU+U3RydWN0dXJlRGlmZlZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhpcyA8Y29kZT5JU3RydWN0dXJlQ3JlYXRvcjwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRyZWUgc3RydWN0dXJlIGNvbnNpc3Rpbmcgb2YgPGNvZGU+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2NvZGU+cwotCSAqIGZyb20gdGhlIGdpdmVuIG9iamVjdCBhbmQgcmV0dXJucyBpdHMgcm9vdCBvYmplY3QuCi0JICogSW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kIHR5cGljYWxseSBpbnZvbHZlcyBwYXJzaW5nIHRoZSBpbnB1dCBvYmplY3QuCi0JICogSW4gY2FzZSBvZiBhbiBlcnJvciAoZS5nLiBhIHBhcnNpbmcgZXJyb3IpIHRoZSB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSB0cmVlIG9mIDxjb2RlPklTdHJ1Y3R1cmVDb21wYXJhdG9yPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgc3RydWN0dXJlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2Ugb2YgZXJyb3IKLQkgKi8KLQlJU3RydWN0dXJlQ29tcGFyYXRvciBnZXRTdHJ1Y3R1cmUoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNpbmdsZSBub2RlIHNwZWNpZmllZCBieSBwYXRoIGZyb20gdGhlIGdpdmVuIGlucHV0IG9iamVjdC4KLQkgKiBJbiBjYXNlIG9mIGFuIGVycm9yIChlLmcuIGEgcGFyc2luZyBlcnJvcikgdGhlIHZhbHVlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gPGNvZGU+Z2V0U3RydWN0dXJlPC9jb2RlPiBidXQgaW4KLQkgKiBjb250cmFzdCB0byA8Y29kZT5nZXRTdHJ1Y3R1cmU8L2NvZGU+IG9ubHkgYSBzaW5nbGUgbm9kZSB3aXRob3V0IGFueSBjaGlsZHJlbiBtdXN0IGJlIHJldHVybmVkLgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIDxjb2RlPlJlcGxhY2VXaXRoRWRpdGlvbkRpYWxvZzwvY29kZT4gdG8gbG9jYXRlIGEgc3ViIGVsZW1lbnQKLQkgKiAoZS5nLiBhIG1ldGhvZCkgd2l0aGluIGFuIGlucHV0IG9iamVjdCAoZS5nLiBhIGZpbGUgY29udGFpbmluZyBzb3VyY2UgY29kZSkuCi0JICogPHA+Ci0JICogT25lIChub3Qgb3B0aW1pemVkKSBhcHByb2FjaCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaXMgY2FsbGluZyA8Y29kZT5nZXRTdHJ1Y3R1cmUoaW5wdXQpPC9jb2RlPgotCSAqIHRvIGJ1aWxkIHRoZSBmdWxsIHRyZWUsIGFuZCB0aGVuIGZpbmRpbmcgdGhhdCBub2RlIHdpdGhpbiB0aGUgdHJlZSB0aGF0IGlzIHNwZWNpZmllZAotCSAqIGJ5IDxjb2RlPnBhdGg8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSBzeW50YXggb2YgPGNvZGU+cGF0aDwvY29kZT4gaXMgbm90IHNwZWNpZmllZCwgYmVjYXVzZSBpdCBpcyB0cmVhdGVkIGJ5IHRoZSBjb21wYXJlIHN1YnN5c3RlbQotCSAqIGFzIGFuIG9wYXF1ZSBlbnRpdHkgYW5kIGlzIG5vdCBmdXJ0aGVyIGludGVycHJldGVkLiBDbGllbnRzIHVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eQotCSAqIHdpbGwgcGFzcyBhIHZhbHVlIG9mIDxjb2RlPnBhdGg8L2NvZGU+IHRvIHRoZSA8Y29kZT5zZWxlY3RFZGl0aW9uPC9jb2RlPgotCSAqIG1ldGhvZCBvZiA8Y29kZT5SZXBsYWNlV2l0aEVkaXRpb25EaWFsb2c8L2NvZGU+IGFuZCB3aWxsIHJlY2VpdmUgdGhpcyB2YWx1ZSB1bmNoYW5nZWQKLQkgKiBhcyBhbiBhcmd1bWVudCB0byA8Y29kZT5sb2NhdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhdGggc3BlY2lmaWVzIGEgc3ViIG9iamVjdCB3aXRoaW4gdGhlIGlucHV0IG9iamVjdAotCSAqIEBwYXJhbSBpbnB1dCB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGUgbm9kZSBzcGVjaWZpZWQgYnkgPGNvZGU+cGF0aDwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5FZGl0aW9uU2VsZWN0aW9uRGlhbG9nI3NlbGVjdEVkaXRpb24KLQkgKi8KLQlJU3RydWN0dXJlQ29tcGFyYXRvciBsb2NhdGUoT2JqZWN0IHBhdGgsIE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbm9kZSBhcyBhIHN0cmluZyBmb3IgdGhlIHB1cnBvc2UKLQkgKiBvZiBwZXJmb3JtaW5nIGEgY29udGVudCBjb21wYXJpc29uIG9ubHkgKHRoYXQgaXMgdGhlIHN0cmluZyB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIHRoZSBVSSkuCi0JICogSWYgPGNvZGU+aWdub3JlV2hpdGVzcGFjZTwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYWxsIGNoYXJhY3RlciBzZXF1ZW5jZXMgY29uc2lkZXJlZAotCSAqIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmV0dXJuZWQgc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBpZ25vcmVXaGl0ZXNwYWNlIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSByZXR1cm5lZCBzdHJpbmcgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlc3BhY2UKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgY29udGVudHMgb2YgdGhlIGdpdmVuIG5vZGUKLQkgKi8KLQlTdHJpbmcgZ2V0Q29udGVudHMoT2JqZWN0IG5vZGUsIGJvb2xlYW4gaWdub3JlV2hpdGVzcGFjZSk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgYSBjb3B5IG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgb24gYSB0cmVlIG5vZGUuCi0JICoKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBmb3Igd2hpY2ggdG8gc2F2ZSB0aGUgbmV3IGNvbnRlbnQKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBzdHJ1Y3R1cmUgdHJlZSB3YXMgY3JlYXRlZCBpbiA8Y29kZT5nZXRTdHJ1Y3R1cmU8L2NvZGU+Ci0JICovCi0Jdm9pZCBzYXZlKElTdHJ1Y3R1cmVDb21wYXJhdG9yIG5vZGUsIE9iamVjdCBpbnB1dCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL1N0cnVjdHVyZURpZmZWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL1N0cnVjdHVyZURpZmZWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiYzYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2NvbXBhcmUvb3JnL2VjbGlwc2UvY29tcGFyZS9zdHJ1Y3R1cmVtZXJnZXZpZXdlci9TdHJ1Y3R1cmVEaWZmVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLio7Ci0KLQotLyoqCi0gKiBBIGRpZmYgdHJlZSB2aWV3ZXIgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgPGNvZGU+SVN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+Ci0gKiB0byByZXRyaWV2ZSBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW5wdXQgb2JqZWN0IChhbiA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPikKLSAqIGFuZCBwZXJmb3JtIGEgdHdvLXdheSBvciB0aHJlZS13YXkgY29tcGFyZSBvbiBpdC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlCi0gKiB0aGlzIHBhY2thZ2UuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBJU3RydWN0dXJlQ3JlYXRvcgotICogQHNlZSBJQ29tcGFyZUlucHV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVEaWZmVmlld2VyIGV4dGVuZHMgRGlmZlRyZWVWaWV3ZXIgewotCQkKLQlwcml2YXRlIERpZmZlcmVuY2VyIGZEaWZmZXJlbmNlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlRocmVlV2F5PSBmYWxzZTsKLQkKLQlwcml2YXRlIElUeXBlZEVsZW1lbnQgZkFuY2VzdG9ySW5wdXQ7Ci0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZMZWZ0SW5wdXQ7Ci0JcHJpdmF0ZSBJVHlwZWRFbGVtZW50IGZSaWdodElucHV0OwotCQotCXByaXZhdGUgSVN0cnVjdHVyZUNvbXBhcmF0b3IgZkFuY2VzdG9yU3RydWN0dXJlOwotCXByaXZhdGUgSVN0cnVjdHVyZUNvbXBhcmF0b3IgZkxlZnRTdHJ1Y3R1cmU7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlQ29tcGFyYXRvciBmUmlnaHRTdHJ1Y3R1cmU7Ci0JCi0JcHJpdmF0ZSBJU3RydWN0dXJlQ3JlYXRvciBmU3RydWN0dXJlQ3JlYXRvcjsKLQlwcml2YXRlIElEaWZmQ29udGFpbmVyIGZSb290OwotCXByaXZhdGUgSUNvbnRlbnRDaGFuZ2VMaXN0ZW5lciBmQ29udGVudENoYW5nZWRMaXN0ZW5lcjsKLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZQYXJlbnQ7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdmlld2VyIGZvciB0aGUgZ2l2ZW4gU1dUIHRyZWUgY29udHJvbCB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSB0cmVlIHRoZSB0cmVlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlRGlmZlZpZXdlcihUcmVlIHRyZWUsIENvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIodHJlZSwgY29uZmlndXJhdGlvbik7Ci0JCUNvbXBvc2l0ZSBjPSB0cmVlLmdldFBhcmVudCgpOwotCQlpZiAoYyBpbnN0YW5jZW9mIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lKQotCQkJZlBhcmVudD0gKENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lKSBjOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdmlld2VyIHVuZGVyIHRoZSBnaXZlbiBTV1QgcGFyZW50IHdpdGggdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU1dUIGNvbnRyb2wgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlRGlmZlZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSkKLQkJCWZQYXJlbnQ9IChDb21wYXJlVmlld2VyU3dpdGNoaW5nUGFuZSkgcGFyZW50OwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkKLQkJc2V0QXV0b0V4cGFuZExldmVsKDMpOwotCQkKLQkJZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXI9IG5ldyBJQ29udGVudENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udGVudENoYW5nZWQoSUNvbnRlbnRDaGFuZ2VOb3RpZmllciBjaGFuZ2VkKSB7Ci0JCQkJU3RydWN0dXJlRGlmZlZpZXdlci50aGlzLmNvbnRlbnRDaGFuZ2VkKGNoYW5nZWQpOwotCQkJfQotCQl9OwotCQluZXcgSUNvbXBhcmVJbnB1dENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tcGFyZUlucHV0Q2hhbmdlZChJQ29tcGFyZUlucHV0IGlucHV0KSB7Ci0JCQkJU3RydWN0dXJlRGlmZlZpZXdlci50aGlzLmNvbXBhcmVJbnB1dENoYW5nZWQoaW5wdXQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSA8Y29kZT5TdHJ1Y3R1cmVEaWZmVmlld2VyPC9jb2RlPiB3aXRoIGEgc3RydWN0dXJlIGNyZWF0b3IuCi0JICogVGhlIHN0cnVjdHVyZSBjcmVhdG9yIGlzIHVzZWQgdG8gY3JlYXRlIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZQotCSAqIGZvciBlYWNoIHNpZGUgb2YgdGhlIHZpZXdlcidzIGlucHV0IGVsZW1lbnQgb2YgdHlwZSA8Y29kZT5JQ29tcGFyZUlucHV0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVDcmVhdG9yIHRoZSBuZXcgc3RydWN0dXJlIGNyZWF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVDcmVhdG9yKElTdHJ1Y3R1cmVDcmVhdG9yIHN0cnVjdHVyZUNyZWF0b3IpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVDcmVhdG9yICE9IHN0cnVjdHVyZUNyZWF0b3IpIHsKLQkJCWZTdHJ1Y3R1cmVDcmVhdG9yPSBzdHJ1Y3R1cmVDcmVhdG9yOwotCQkJQ29udHJvbCB0cmVlPSBnZXRDb250cm9sKCk7Ci0JCQlpZiAodHJlZSAhPSBudWxsICYmICF0cmVlLmlzRGlzcG9zZWQoKSkKLQkJCQl0cmVlLnNldERhdGEoQ29tcGFyZVVJLkNPTVBBUkVfVklFV0VSX1RJVExFLCBnZXRUaXRsZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmUgY3JlYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqIHN0cnVjdHVyZSBjcmVhdG9yIGhhcyBiZWVuIHNldCB3aXRoIDxjb2RlPnNldFN0cnVjdHVyZUNyZWF0b3I8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlIGNyZWF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZUNyZWF0b3IgZ2V0U3RydWN0dXJlQ3JlYXRvcigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVDcmVhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBSZWltcGxlbWVudGVkIHRvIGdldCB0aGUgZGVzY3JpcHRpdmUgdGl0bGUgZm9yIHRoaXMgdmlld2VyIGZyb20gdGhlIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPi4KLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIncyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0TmFtZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGl0bGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBiZWNhdXNlIHRoZSBpbnB1dCBvZiB0aGlzIHZpZXdlciBpcyBub3QgaWRlbnRpY2FsIHRvIHRoZSByb290IG9mIHRoZSB0cmVlLgotCSAqIFRoZSB0cmVlJ3Mgcm9vdCBpcyBhIElEaWZmQ29udGFpbmVyIHRoYXQgd2FzIHJldHVybmVkIGZyb20gdGhlIG1ldGhvZCA8Y29kZT5kaWZmPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByb290IG9mIHRoZSBkaWZmIHRyZWUgcHJvZHVjZWQgYnkgbWV0aG9kIDxjb2RlPmRpZmY8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gZlJvb3Q7Ci0JfQotCQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKiBPdmVycmlkZGVuIHRvIGNyZWF0ZSB0aGUgY29tcGFyYWJsZSBzdHJ1Y3R1cmVzIGZyb20gdGhlIGlucHV0IG9iamVjdAotCSAqIGFuZCB0byBmZWVkIHRoZW0gdGhyb3VnaCB0aGUgZGlmZmVyZW5jaW5nIGVuZ2luZS4gTm90ZTogZm9yIHRoaXMgdmlld2VyCi0JICogdGhlIHZhbHVlIGZyb20gPGNvZGU+Z2V0SW5wdXQ8L2NvZGU+IGlzIG5vdCBpZGVudGljYWwgdG8gPGNvZGU+Z2V0Um9vdDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5wdXRDaGFuZ2VkKE9iamVjdCBpbnB1dCwgT2JqZWN0IG9sZElucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElDb21wYXJlSW5wdXQpIHsKLQkJCWNvbXBhcmVJbnB1dENoYW5nZWQoKElDb21wYXJlSW5wdXQpIGlucHV0KTsKLQkJCWlmIChpbnB1dCAhPSBvbGRJbnB1dCkKLQkJCQlpbml0aWFsU2VsZWN0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJZXhwYW5kVG9MZXZlbCgyKTsKLQl9Ci0KLQkvKiAobm9uIEphdmFkb2MpCi0JICogT3ZlcnJpZGRlbiB0byB1bnJlZ2lzdGVyIGFsbCBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZShEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCi0JCWNvbXBhcmVJbnB1dENoYW5nZWQobnVsbCk7Ci0JCQotCQlmQ29udGVudENoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQkJCQkKLQkJc3VwZXIuaGFuZGxlRGlzcG9zZShldmVudCk7Ci0JfQotCQotCS8qKgotCSAqIFJlY3JlYXRlcyB0aGUgY29tcGFyYWJsZSBzdHJ1Y3R1cmVzIGZvciB0aGUgaW5wdXQgc2lkZXMuCi0JICogQHBhcmFtIGlucHV0IHRoaXMgdmlld2VyJ3MgbmV3IGlucHV0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcGFyZUlucHV0Q2hhbmdlZChJQ29tcGFyZUlucHV0IGlucHV0KSB7Ci0JCUlUeXBlZEVsZW1lbnQgdD0gbnVsbDsKLQkJYm9vbGVhbiBjaGFuZ2VkPSBmYWxzZTsKLQkJCi0JCWlmIChpbnB1dCAhPSBudWxsKQotCQkJdD0gaW5wdXQuZ2V0QW5jZXN0b3IoKTsKLQkJCQotCQlmVGhyZWVXYXk9ICh0ICE9IG51bGwpOwotCQkKLQkJaWYgKHQgIT0gZkFuY2VzdG9ySW5wdXQpIHsKLQkJCWlmIChmQW5jZXN0b3JJbnB1dCBpbnN0YW5jZW9mIElDb250ZW50Q2hhbmdlTm90aWZpZXIpCi0JCQkJKChJQ29udGVudENoYW5nZU5vdGlmaWVyKWZBbmNlc3RvcklucHV0KS5yZW1vdmVDb250ZW50Q2hhbmdlTGlzdGVuZXIoZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXIpOwotCQkJZkFuY2VzdG9ySW5wdXQ9IHQ7Ci0JCQlpZiAoZkFuY2VzdG9ySW5wdXQgIT0gbnVsbCkgewotCQkJCWZBbmNlc3RvclN0cnVjdHVyZT0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0U3RydWN0dXJlKGZBbmNlc3RvcklucHV0KTsKLQkJCQljaGFuZ2VkPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJZkFuY2VzdG9yU3RydWN0dXJlPSBudWxsOwotCQkJaWYgKGZBbmNlc3RvcklucHV0IGluc3RhbmNlb2YgSUNvbnRlbnRDaGFuZ2VOb3RpZmllcikKLQkJCQkoKElDb250ZW50Q2hhbmdlTm90aWZpZXIpZkFuY2VzdG9ySW5wdXQpLmFkZENvbnRlbnRDaGFuZ2VMaXN0ZW5lcihmQ29udGVudENoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWlmIChpbnB1dCAhPSBudWxsKQotCQkJdD0gaW5wdXQuZ2V0TGVmdCgpOwotCQlpZiAodCAhPSBmTGVmdElucHV0KSB7Ci0JCQlpZiAoZkxlZnRJbnB1dCBpbnN0YW5jZW9mIElDb250ZW50Q2hhbmdlTm90aWZpZXIpCi0JCQkJKChJQ29udGVudENoYW5nZU5vdGlmaWVyKWZMZWZ0SW5wdXQpLnJlbW92ZUNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihmQ29udGVudENoYW5nZWRMaXN0ZW5lcik7Ci0JCQlmTGVmdElucHV0PSB0OwotCQkJaWYgKGZMZWZ0SW5wdXQgIT0gbnVsbCkgewotCQkJCWZMZWZ0U3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZkxlZnRJbnB1dCk7Ci0JCQkJY2hhbmdlZD0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCWZMZWZ0U3RydWN0dXJlPSBudWxsOwotCQkJaWYgKGZMZWZ0SW5wdXQgaW5zdGFuY2VvZiBJQ29udGVudENoYW5nZU5vdGlmaWVyKQotCQkJCSgoSUNvbnRlbnRDaGFuZ2VOb3RpZmllcilmTGVmdElucHV0KS5hZGRDb250ZW50Q2hhbmdlTGlzdGVuZXIoZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCXQ9IGlucHV0LmdldFJpZ2h0KCk7Ci0JCWlmICh0ICE9IGZSaWdodElucHV0KSB7Ci0JCQlpZiAoZlJpZ2h0SW5wdXQgaW5zdGFuY2VvZiBJQ29udGVudENoYW5nZU5vdGlmaWVyKQotCQkJCSgoSUNvbnRlbnRDaGFuZ2VOb3RpZmllcilmUmlnaHRJbnB1dCkucmVtb3ZlQ29udGVudENoYW5nZUxpc3RlbmVyKGZDb250ZW50Q2hhbmdlZExpc3RlbmVyKTsKLQkJCWZSaWdodElucHV0PSB0OwotCQkJaWYgKGZSaWdodElucHV0ICE9IG51bGwpIHsKLQkJCQlmUmlnaHRTdHJ1Y3R1cmU9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldFN0cnVjdHVyZShmUmlnaHRJbnB1dCk7Ci0JCQkJY2hhbmdlZD0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCWZSaWdodFN0cnVjdHVyZT0gbnVsbDsKLQkJCWlmIChmUmlnaHRJbnB1dCBpbnN0YW5jZW9mIElDb250ZW50Q2hhbmdlTm90aWZpZXIpCi0JCQkJKChJQ29udGVudENoYW5nZU5vdGlmaWVyKWZSaWdodElucHV0KS5hZGRDb250ZW50Q2hhbmdlTGlzdGVuZXIoZkNvbnRlbnRDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlpZiAoY2hhbmdlZCkKLQkJCWRpZmYoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+ZGlmZjwvY29kZT4gd2hlbmV2ZXIgdGhlIGJ5dGUgY29udGVudHMgY2hhbmdlcy4KLQkgKiBAcGFyYW0gY2hhbmdlZCB0aGUgb2JqZWN0IHRoYXQgc2VudCBvdXQgdGhlIG5vdGlmaWNhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnRlbnRDaGFuZ2VkKElDb250ZW50Q2hhbmdlTm90aWZpZXIgY2hhbmdlZCkgewotCQkKLQkJaWYgKGZTdHJ1Y3R1cmVDcmVhdG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJaWYgKGNoYW5nZWQgIT0gbnVsbCkgewotCQkJaWYgKGNoYW5nZWQgPT0gZkFuY2VzdG9ySW5wdXQpIHsKLQkJCQlmQW5jZXN0b3JTdHJ1Y3R1cmU9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldFN0cnVjdHVyZShmQW5jZXN0b3JJbnB1dCk7Ci0JCQl9IGVsc2UgaWYgKGNoYW5nZWQgPT0gZkxlZnRJbnB1dCkgewotCQkJCWZMZWZ0U3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZkxlZnRJbnB1dCk7Ci0JCQl9IGVsc2UgaWYgKGNoYW5nZWQgPT0gZlJpZ2h0SW5wdXQpIHsKLQkJCQlmUmlnaHRTdHJ1Y3R1cmU9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldFN0cnVjdHVyZShmUmlnaHRJbnB1dCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlmQW5jZXN0b3JTdHJ1Y3R1cmU9IGZTdHJ1Y3R1cmVDcmVhdG9yLmdldFN0cnVjdHVyZShmQW5jZXN0b3JJbnB1dCk7Ci0JCQlmTGVmdFN0cnVjdHVyZT0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0U3RydWN0dXJlKGZMZWZ0SW5wdXQpOwotCQkJZlJpZ2h0U3RydWN0dXJlPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRTdHJ1Y3R1cmUoZlJpZ2h0SW5wdXQpOwotCQl9Ci0JCQotCQlkaWZmKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gd2l0aGluIDxjb2RlPmRpZmYoKTwvY29kZT4gYmVmb3JlIHRoZSBkaWZmZXJlbmNlCi0JICogdHJlZSBpcyBiZWluZyBidWlsdC4KLQkgKiBDbGllbnRzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biBwcmUtcHJvY2Vzc2luZy4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotCSAqIEBwYXJhbSBhbmNlc3RvciB0aGUgYW5jZXN0b3IgaW5wdXQgdG8gdGhlIGRpZmZlcmVuY2luZyBvcGVyYXRpb24KLQkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBpbnB1dCB0byB0aGUgZGlmZmVyZW5jaW5nIG9wZXJhdGlvbgotCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgaW5wdXQgdG8gdGhlIGRpZmZlcmVuY2luZyBvcGVyYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlRGlmZkhvb2soSVN0cnVjdHVyZUNvbXBhcmF0b3IgYW5jZXN0b3IsIElTdHJ1Y3R1cmVDb21wYXJhdG9yIGxlZnQsIElTdHJ1Y3R1cmVDb21wYXJhdG9yIHJpZ2h0KSB7Ci0JCS8vIHdlIGRvIG5vdGhpbmcgaGVyZQotCX0KLQkKLQkvKioKLQkgKiBSdW5zIHRoZSBkaWZmZXJlbmNlIGVuZ2luZSBhbmQgcmVmcmVzaGVzIHRoZSB0cmVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZmYoKSB7Ci0JCQotCQlwcmVEaWZmSG9vayhmQW5jZXN0b3JTdHJ1Y3R1cmUsIGZMZWZ0U3RydWN0dXJlLCBmUmlnaHRTdHJ1Y3R1cmUpOwotCQkJCQkJCQotCQlTdHJpbmcgbWVzc2FnZT0gbnVsbDsKLQkJCi0JCWlmICgoZlRocmVlV2F5ICYmIGZBbmNlc3RvclN0cnVjdHVyZSA9PSBudWxsKSB8fCBmTGVmdFN0cnVjdHVyZSA9PSBudWxsIHx8IGZSaWdodFN0cnVjdHVyZSA9PSBudWxsKSB7Ci0JCQkvLyBjb3VsZCBub3QgZ2V0IHN0cnVjdHVyZSBvZiBvbmUgKG9yIG1vcmUpIG9mIHRoZSBsZWdzCi0JCQlmUm9vdD0gbnVsbDsKLQkJCW1lc3NhZ2U9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlN0cnVjdHVyZURpZmZWaWV3ZXIuU3RydWN0dXJlRXJyb3IiKTsJLy8kTk9OLU5MUy0xJAotCQkJCi0JCX0gZWxzZSB7CS8vIGNhbGN1bGF0ZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28gKG9yIHRocmVlKSBzdHJ1Y3R1cmVzCi0KLQkJCWlmIChmRGlmZmVyZW5jZXIgPT0gbnVsbCkKLQkJCQlmRGlmZmVyZW5jZXI9IG5ldyBEaWZmZXJlbmNlcigpIHsKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gY29udGVudHNFcXVhbChPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJcmV0dXJuIFN0cnVjdHVyZURpZmZWaWV3ZXIudGhpcy5jb250ZW50c0VxdWFsKG8xLCBvMik7Ci0JCQkJCX0KLQkJCQkJcHJvdGVjdGVkIE9iamVjdCB2aXNpdChPYmplY3QgZGF0YSwgaW50IHJlc3VsdCwgT2JqZWN0IGFuY2VzdG9yLCBPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQkJCQlPYmplY3Qgbz0gc3VwZXIudmlzaXQoZGF0YSwgcmVzdWx0LCBhbmNlc3RvciwgbGVmdCwgcmlnaHQpOwotCQkJCQkJaWYgKGZMZWZ0SXNMb2NhbCAmJiBvIGluc3RhbmNlb2YgRGlmZk5vZGUpCi0JCQkJCQkJKChEaWZmTm9kZSlvKS5zd2FwU2lkZXMoZkxlZnRJc0xvY2FsKTsKLQkJCQkJCXJldHVybiBvOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQotCQkJZlJvb3Q9IChJRGlmZkNvbnRhaW5lcikgZkRpZmZlcmVuY2VyLmZpbmREaWZmZXJlbmNlcyhmVGhyZWVXYXksIG51bGwsIG51bGwsCi0JCQkJCWZBbmNlc3RvclN0cnVjdHVyZSwgZkxlZnRTdHJ1Y3R1cmUsIGZSaWdodFN0cnVjdHVyZSk7Ci0JCQkJCQotCQkJaWYgKGZSb290ID09IG51bGwgfHwgZlJvb3QuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgewotCQkJCW1lc3NhZ2U9IENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlN0cnVjdHVyZURpZmZWaWV3ZXIuTm9TdHJ1Y3R1cmFsRGlmZmVyZW5jZXMiKTsJLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlwb3N0RGlmZkhvb2soZkRpZmZlcmVuY2VyLCBmUm9vdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZQYXJlbnQgIT0gbnVsbCkKLQkJCWZQYXJlbnQuc2V0VGl0bGVBcmd1bWVudChtZXNzYWdlKTsKLQkJCQotCQlyZWZyZXNoKGdldFJvb3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiA8Y29kZT5kaWZmKCk8L2NvZGU+IGFmdGVyIHRoZSBkaWZmZXJlbmNlCi0JICogdHJlZSBoYXMgYmVlbiBidWlsdC4KLQkgKiBDbGllbnRzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biBwb3N0LXByb2Nlc3NpbmcuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQkgKiBAcGFyYW0gZGlmZmVyZW5jZXIgdGhlIGRpZmZlcmVuY2VyIHVzZWQgdG8gcGVyZm9ybSB0aGUgZGlmZmVyZW5jaW5nCi0JICogQHBhcmFtIHJvb3QgdGhlIG5vbi08Y29kZT5udWxsPC9jb2RlPiByb290IG5vZGUgb2YgdGhlIGRpZmZlcmVuY2UgdHJlZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0RGlmZkhvb2soRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXIsIElEaWZmQ29udGFpbmVyIHJvb3QpIHsKLQkJLy8gd2UgZG8gbm90aGluZyBoZXJlCi0JfQotCQotCS8qCi0JICogUGVyZm9ybXMgYSBieXRlIGNvbXBhcmUgb24gdGhlIGdpdmVuIG9iamVjdHMuCi0JICogQ2FsbGVkIGZyb20gdGhlIGRpZmZlcmVuY2UgZW5naW5lLgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3RydWN0dXJlIGNyZWF0b3IgaGFzIGJlZW4gc2V0LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250ZW50c0VxdWFsKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWlmIChmU3RydWN0dXJlQ3JlYXRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGlnbm9yZVdoaXRlU3BhY2U9IFV0aWxpdGllcy5nZXRCb29sZWFuKGdldENvbXBhcmVDb25maWd1cmF0aW9uKCksIENvbXBhcmVDb25maWd1cmF0aW9uLklHTk9SRV9XSElURVNQQUNFLCBmYWxzZSk7CQkKLQkJCVN0cmluZyBzMT0gZlN0cnVjdHVyZUNyZWF0b3IuZ2V0Q29udGVudHMobzEsIGlnbm9yZVdoaXRlU3BhY2UpOwotCQkJU3RyaW5nIHMyPSBmU3RydWN0dXJlQ3JlYXRvci5nZXRDb250ZW50cyhvMiwgaWdub3JlV2hpdGVTcGFjZSk7Ci0JCQlpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBzMS5lcXVhbHMoczIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2tzIHByb3BlcnR5IGNoYW5nZXMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgotCSAqIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHRyYWNrIHRoZWlyIG93biBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqIEluIHRoaXMgY2FzZSB0aGV5IG11c3QgY2FsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHByb3BlcnR5IGNoYW5nZWQgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBrZXk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCWlmIChrZXkuZXF1YWxzKENvbXBhcmVDb25maWd1cmF0aW9uLklHTk9SRV9XSElURVNQQUNFKSkKLQkJCWRpZmYoKTsKLQkJZWxzZQotCQkJc3VwZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCX0KLQkJCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBjYWxsIHRoZSA8Y29kZT5zYXZlPC9jb2RlPiBtZXRob2Qgb24gdGhlIHN0cnVjdHVyZSBjcmVhdG9yIGFmdGVyCi0JICogbm9kZXMgaGF2ZSBiZWVuIGNvcGllZCBmcm9tIG9uZSBzaWRlIHRvIHRoZSBvdGhlciBzaWRlIG9mIGFuIGlucHV0IG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBsZWZ0VG9SaWdodCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgbGVmdCBzaWRlIGlzIGNvcGllZCB0byB0aGUgcmlnaHQgc2lkZS4KLQkgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIHJpZ2h0IHNpZGUgaXMgY29waWVkIHRvIHRoZSBsZWZ0IHNpZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5U2VsZWN0ZWQoYm9vbGVhbiBsZWZ0VG9SaWdodCkgewotCQlzdXBlci5jb3B5U2VsZWN0ZWQobGVmdFRvUmlnaHQpOwotCQkKLQkJaWYgKGZTdHJ1Y3R1cmVDcmVhdG9yICE9IG51bGwpCi0JCQlmU3RydWN0dXJlQ3JlYXRvci5zYXZlKAotCQkJCQkJCWxlZnRUb1JpZ2h0ID8gZlJpZ2h0U3RydWN0dXJlIDogZkxlZnRTdHJ1Y3R1cmUsCi0JCQkJCQkJbGVmdFRvUmlnaHQgPyBmUmlnaHRJbnB1dCA6IGZMZWZ0SW5wdXQpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9jb21wYXJlL29yZy9lY2xpcHNlL2NvbXBhcmUvc3RydWN0dXJlbWVyZ2V2aWV3ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDI1N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvY29tcGFyZS9vcmcvZWNsaXBzZS9jb21wYXJlL3N0cnVjdHVyZW1lcmdldmlld2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5OVDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgZmluZGluZyBhbmQgZGlzcGxheWluZyB0aGUgZGlmZmVyZW5jZXMKLWJldHdlZW4gaGllcmFyY2hpY2FsbHkgc3RydWN0dXJlZCBkYXRhLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLQotVGhlIGNsYXNzIDxiPkRpZmZlcmVuY2VyPC9iPiBpcyBhIGRpZmZlcmVuY2luZyBlbmdpbmUgZm9yIGhpZXJhcmNoaWNhbGx5Ci1zdHJ1Y3R1cmVkIGRhdGEuIEl0IHRha2VzIHR3byBvciB0aHJlZSBpbnB1dHMgYW5kIHBlcmZvcm1zIGEgdHdvLXdheSBvcgotdGhyZWUtd2F5IGNvbXBhcmUgb24gdGhlbS4KLTxwPgotCi1JZiB0aGUgaW5wdXQgZWxlbWVudHMgdG8gdGhlIGRpZmZlcmVuY2luZyBlbmdpbmUgaW1wbGVtZW50IHRoZSA8Yj5JU3RydWN0dXJlQ29tcGFyYXRvcjwvYj4KLWludGVyZmFjZSB0aGUgZW5naW5lIHJlY3Vyc2l2ZWx5IGFwcGxpZXMgaXRzZWxmIHRvIHRoZSBjaGlsZHJlbiBvZgotdGhlIGlucHV0IGVsZW1lbnQuIExlYWYgZWxlbWVudHMgbXVzdCBpbXBsZW1lbnQgdGhlIDxiPm9yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjwvYj4KLWludGVyZmFjZSBzbyB0aGF0IHRoZSBkaWZmZXJlbmNlciBjYW4gcGVyZm9ybSBhIGJ5dGV3aXNlIGNvbXBhcmlzb24gb24gdGhlaXIgY29udGVudHMuCi08cD4KLQotT25lIGdvb2QgZXhhbXBsZSBmb3IgdGhpcyBpcyA8Yj5vcmcuZWNsaXBzZS5jb21wYXJlLlJlc291cmNlTm9kZTwvYj4gd2hpY2ggaW1wbGVtZW50cyBib3RoIGludGVyZmFjZXMKLShhbmQgbW9yZSkgZm9yIEVjbGlwc2Ugd29ya3NwYWNlIHJlc291cmNlcyAob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKS4KLTxwPgotCi1Bbm90aGVyIGV4YW1wbGUgaXMgdGhlIDxiPkRvY3VtZW50UmFuZ2VOb2RlPC9iPiB3aGljaCBjYW4gYmUgdXNlZCB0byBjb21wYXJlIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmVzCi10aGF0IGFyZSBzdXBlcmltcG9zZWQgb24gYSBkb2N1bWVudCwgdGhhdCBpcyB3aGVyZSBub2RlcyBhbmQgbGVhZnMgY29ycmVzcG9uZCB0byByYW5nZXMgaW4gYSBkb2N1bWVudAotKDxiPm9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLklEb2N1bWVudFJhbmdlPC9iPikuCi08YnI+Ci1UeXBpY2FsbHkgPGI+RG9jdW1lbnRSYW5nZU5vZGU8L2I+cyBhcmUgY3JlYXRlZCB3aGlsZSBwYXJzaW5nIGEgZG9jdW1lbnQgYW5kIHRoZXkgcmVwcmVzZW50Ci10aGUgc2VtYW50aWMgZW50aXRpZXMgb2YgdGhlIGRvY3VtZW50IChlLmcuIGEgSmF2YSBjbGFzcywgbWV0aG9kIG9yIGZpZWxkKS4KLVRoZSB0d28gc3ViY2xhc3NlcyA8Yj5KYXZhTm9kZTwvYj4gKGluIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5jb21wYXJlKQotYW5kIDxiPlByb3BlcnR5Tm9kZTwvYj4gKGluIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5jb21wYXJlKSBhcmUgZ29vZCBleGFtcGxlcyBmb3IgdGhpcy4KLTxwPgotCi1CeSBkZWZhdWx0IHRoZSBkaWZmZXJlbmNpbmcgZW5naW5lIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24KLWFzIGEgdHJlZSBvZiA8Yj5EaWZmTm9kZTwvYj4gb2JqZWN0cy4gSG93ZXZlciwgdGhpcyBjYW4gYmUgY2hhbmdlZCBieSBvdmVycmlkaW5nCi1hIHNpbmdsZSBtZXRob2Qgb2YgdGhlIGVuZ2luZS4KLTxwPgotCi1FdmVyeSA8Yj5EaWZmTm9kZTwvYj4gZGVzY3JpYmVzIHRoZSBjaGFuZ2VzIGFtb25nIHRoZSB0d28gb3IgdGhyZWUgaW5wdXRzLgotPHA+Ci0KLUEgdHJlZSBvZiA8Yj5EaWZmTm9kZXM8L2I+IGNhbiBiZSBkaXNwbGF5ZWQgaW4gYSA8Yj5EaWZmVHJlZVZpZXdlcjwvYj4uCi1UaGUgPGI+RGlmZlRyZWVWaWV3ZXI8L2I+IHJlcXVpcmVzIHRoYXQgaW5uZXIgbm9kZXMgb2YgdGhlIHRyZWUgaW1wbGVtZW50Ci10aGUgPGI+SURpZmZDb250YWluZXI8L2I+IGludGVyZmFjZSBhbmQgbGVhZnMgdGhlIDxiPklEaWZmRWxlbWVudDwvYj4gaW50ZXJmYWNlLgotPHA+Ci0KLVRoZSB0eXBpY2FsIHN0ZXBzIHRvIGNvbXBhcmUgaGllcmFyY2hpY2FsbHkgc3RydWN0dXJlZCBkYXRhIGFuZCB0byBkaXNwbGF5Ci10aGUgZGlmZmVyZW5jZXMgd291bGQgYmUgdG86Ci08dWw+Ci08bGk+Ci1tYXAgdGhlIGlucHV0IGRhdGEgaW50byBhIHRyZWUgb2YgPGI+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2I+IGFuZCA8Yj5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9iPnMsPC9saT4KLQotPGxpPgotcGVyZm9ybSB0aGUgY29tcGFyZSBvcGVyYXRpb24gYnkgbWVhbnMgb2YgdGhlIDxiPkRpZmZlcmVuY2VyPC9iPiwgYW5kPC9saT4KLQotPGxpPgotZmVlZCB0aGUgZGlmZmVyZW5jaW5nIHJlc3VsdCBpbnRvIHRoZSA8Yj5EaWZmVHJlZVZpZXdlcjwvYj4uPC9saT4KLQotPC91bD4KLQotVGhlIDxiPlN0cnVjdHVyZURpZmZWaWV3ZXI8L2I+IGlzIGEgc3BlY2lhbGl6ZWQgPGI+RGlmZlRyZWVWaWV3ZXI8L2I+Ci10aGF0IGF1dG9tYXRlcyB0aGUgdGhyZWUgc3RlcHMgZnJvbSBhYm92ZS4gSXQgdGFrZXMgYSBzaW5nbGUgaW5wdXQgb2JqZWN0Ci1vZiB0eXBlIDxiPklDb21wYXJlSW5wdXQ8L2I+IGZyb20gd2hpY2ggaXQgcmV0cmlldmVzIHRoZSB0d28gb3IgdGhyZWUKLWlucHV0IGVsZW1lbnRzIHRvIGNvbXBhcmUuIFRoZW4gaXQgdXNlcyBhIDxiPklTdHJ1Y3R1cmVDcmVhdG9yPC9iPiB0bwotZXh0cmFjdCBhIHRyZWUgb2YgPGI+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L2I+IGFuZCA8Yj5JU3RyZWFtQ29udGVudEFjY2Vzc29yPC9iPgotZnJvbSB0aGVtLiBUaGVzZSB0cmVlcyBhcmUgdGhlbiBjb21wYXJlZCB3aXRoIHRoZSBkaWZmZXJlbmNpbmcgZW5naW5lIGFuZAotdGhlIHJlc3VsdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIHRyZWUgdmlld2VyLgotPHA+Ci0KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjE4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9hbmNlc3RvcnBhbmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5X2xfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJlMmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvY29weV9sX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvY29weV9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvY29weV9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiNDJhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHlfcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHljb250X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5Y29udF9sX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1MzljZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L2NvcHljb250X2xfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5Y29udF9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvY29weWNvbnRfcl9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNmFiZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9jb3B5Y29udF9yX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvbmV4dF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9uZXh0X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWNmOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9uZXh0X25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3ByZXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvcHJldl9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODg0MWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvcHJldl9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9zbWFydG1vZGVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9zbWFydG1vZGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRhYzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvc21hcnRtb2RlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kbGNsMTYvc3luY3BhbmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jcGFuZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTQ4MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jcGFuZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2RsY2wxNi90d293YXljb21wYXJlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkZWYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZGxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2R0b29sMTYvY29uZmxpY3RfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25mbGljdF9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4YzcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25mbGljdF9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9kdG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2R0b29sMTYvaWdub3Jld3NfZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMmYwYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2R0b29sMTYvaWdub3Jld3NfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2FuY2VzdG9ycGFuZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDY4NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9hbmNlc3RvcnBhbmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5X2xfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI5OTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvY29weV9sX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvY29weV9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvY29weV9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1OTgxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHlfcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHljb250X2xfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5Y29udF9sX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyYjFlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L2NvcHljb250X2xfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5Y29udF9yX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvY29weWNvbnRfcl9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmQ1MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9jb3B5Y29udF9yX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvbmV4dF9uYXYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9uZXh0X25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MmIxODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9uZXh0X25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3ByZXZfbmF2LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvcHJldl9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTFlODg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvcHJldl9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9zbWFydG1vZGVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9zbWFydG1vZGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJkZGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvc21hcnRtb2RlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9lbGNsMTYvc3luY3BhbmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jcGFuZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDRjMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jcGFuZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2VsY2wxNi90d293YXljb21wYXJlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3ODhiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZWxjbDE2L3R3b3dheWNvbXBhcmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V0b29sMTYvY29uZmxpY3RfZWRpdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25mbGljdF9lZGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhN2QxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25mbGljdF9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9ldG9vbDE2L2lnbm9yZXdzX2VkaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V0b29sMTYvaWdub3Jld3NfZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjJlNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V0b29sMTYvaWdub3Jld3NfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXZpZXcxNi9jb21wYXJlX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL2V2aWV3MTYvY29tcGFyZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NDliYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvZXZpZXcxNi9jb21wYXJlX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL29iajE2L2RheV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL29iajE2L2RheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vYmoxNi9kYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vYmoxNi9yZXNvdXJjZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL29iajE2L3Jlc291cmNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDRlMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL29iajE2L3Jlc291cmNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvYWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9hZGRfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTIzYTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9hZGRfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY2hnX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjhkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY2hnX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jb25mYWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jb25mYWRkX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMDFlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY29uZmFkZF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY29uZmNoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvY29uZmNoZ19vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODA1ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NvbmZjaGdfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NvbmZkZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2NvbmZkZWxfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODBjMGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9jb25mZGVsX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9kZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2RlbF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDIwN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2RlbF9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0M2EyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2luYWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9pbmFkZF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTlmNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2luYWRkX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9pbmNoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvaW5jaGdfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQ0YTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9pbmNoZ19vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvaW5kZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L2luZGVsX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczYTY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvaW5kZWxfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L291dGFkZF9vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvb3V0YWRkX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmYjI5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvb3V0YWRkX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9vdXRjaGdfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L291dGNoZ19vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzIxZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L291dGNoZ19vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvb3V0ZGVsX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9vdXRkZWxfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTgyZTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9vdXRkZWxfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3JfaW5hZGRfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3JfaW5hZGRfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWMwY2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX2luYWRkX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX2luY2hnX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX2luY2hnX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzMGMwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9pbmNoZ19vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9pbmRlbF9vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9pbmRlbF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2FiNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3JfaW5kZWxfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3Jfb3V0YWRkX292LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX291dGFkZF9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjA3NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3Jfb3V0YWRkX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX291dGNoZ19vdi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9vdXRjaGdfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JhMWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvaWNvbnMvZnVsbC9vdnIxNi9yX291dGNoZ19vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9vdXRkZWxfb3YuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL292cjE2L3Jfb3V0ZGVsX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2YjhiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvb3ZyMTYvcl9vdXRkZWxfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9pY29ucy9mdWxsL3dpemJhbi9hcHBseXBhdGNoX3dpemJhbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGx5cGF0Y2hfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmMGM1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGx5cGF0Y2hfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvb2xkX2J1aWxkbm90ZXNfY29tcGFyZV8zXzAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvb2xkX2J1aWxkbm90ZXNfY29tcGFyZV8zXzAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNDNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL29sZF9idWlsZG5vdGVzX2NvbXBhcmVfM18wLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5OVDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8dGl0bGU+RWNsaXBzZSBQbGF0Zm9ybSBSZWxlYXNlIE5vdGVzIC0gRGVza3RvcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4gCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1Db21wYXJlPC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAxN3RoIDIwMDQgKFJDMykKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NDgiPjM3NjQ4PC9hPjogRXhjZXB0aW9ucyBhZnRlciBvbmUgb2YgdGhlIGNvbXBhcmUgdmlld2VyIGlucHV0cyBnb3QgZGVsZXRlZDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDExdGggMjAwNCAoUkMyKQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTQ2MCI+NjU0NjA8L2E+OiBJbXByb3ZlIGVuY29kaW5nIGZhbGwgYmFjayBiZWhhdmlvciBmb3IgSGlzdG9yeUl0ZW1zPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTk5OCI+NjE5OTg8L2E+OiBiYWQgaWRlYSB0byBzdWJjbGFzcyBFcnJvciBmb3Igb3JkaW5hcnkgZXhjZXB0aW9uczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkyMzIiPjU5MjMyPC9hPjogREJDUzogY29tcGFyZSBpbXByb3Blcmx5IGluIEVVQy1KUCBlbmNvZGluZyBwcm9qZWN0IG9uIHdvcmtiZW5jaCBlbmNvZGluZyBNUzkzMjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjU1MTUiPjY1NTE1PC9hPjogTG9jYWwgSGlzdG9yeSBhbHdheXMgc2F5cyAiUGFyc2luZyBFcnJvcjsgbm8gc3RydWN0dXJlZCBSZXBsYWNlIEF2YWlsYWJsZSI8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MzMzIj41NTMzMzwvYT46IE5QRSBpbiBUZXh0TWVyZ2VWaWV3ZXIuaW50ZXJwb2xhdGU8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1ODc2Ij41NTg3NjwvYT46IFZpZXdlcjogVGV4dCBub3QgcmVwYWludGVkIHdoZW4gbW92aW5nIHNhc2ggYW5kIHRoZW4gY2xpY2tpbmcgb24gc2Nyb2xsIGJhcnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1MjA1Ij42NTIwNTwvYT46IENvbXBhcmUgZWRpdG9yIGRvZXNuJ3QgdXBkYXRlIGNvcnJlY3RseSB3aGlsZSBzY3JvbGxpbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNTQ1Ij42MjU0NTwvYT46IGJpbmFyeSBjb21wYXJlIHRleHQgaW5zZXJ0aW9uIGN1cnNvciBpcyB2ZXJ5IGxhcmdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Njg3NSI+NTY4NzU8L2E+OiBSZXNpemluZyBBcHBseSBQYXRjaCBkaWFsb2cgZG9lc24ndCByZXNpemUgdHJlZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDc2NDAiPjQ3NjQwPC9hPjogTW92ZSByaWdodCB0byBsZWZ0IG1pc3BsYWNlZCB0aGUgbW92ZWQgdGV4dDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjYyNzIiPjY2MjcyPC9hPjogcmVtb3ZlIHBhY2thZ2VzIHByZWZpeGVzIHRhZyBmcm9tIHBsdWdpbi54bWw8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0NjE3Ij42NDYxNzwvYT46IE5vdCBwcm9tcHRlZCB0byBzYXZlIGRpcnR5IGNvbXBhcmUgZWRpdG9yPGJyPgotCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDI4dGggMjAwNCAoUkMxKQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjM1NiI+IzYyMzU2PC9hPjogVXNlIHByb2dyZXNzIHNlcnZpY2Ugd2hlbiBydW5uaW5nIGNvbXBhcmUgaW5wdXQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0NTA1Ij4jNjQ1MDU8L2E+OiBSZW1vdmUgdW51c2VkIGNsYXNzIENvbG9yRWRpdG9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzYxMCI+IzYzNjEwPC9hPjogQ29sb3JzIGFuZCBGb250czogVGV4dCBDb21wYXJlIEFwcGVhcmFuY2UgLSZndDsgVGV4dCBDb21wYXJlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTk5NiI+IzYxOTk2PC9hPjogYmFkIGlkZWEgdG8gc3ViY2xhc3MgRXJyb3IgZm9yIG9yZGluYXJ5IGV4Y2VwdGlvbnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNjA4Ij4jNjM2MDg8L2E+OiBNaWdyYXRlIHRvIGltcHJvdmVkIG1vZGFsIHByb2dyZXNzIHN1cHBvcnQ8YnI+Ci0KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXkgMTF0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1hZGRlZCAzLjAgdGFnIHRvIHN0cmVhbU1lcmdlcnMgc2NoZW1hIGZpbGU8YnI+Ci11cGRhdGVkIGFydHdvcms8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDR0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwMzgzIj4jNjAzODM8L2E+OiBDb3B5IEFsbCBub24tY29uZmxpY3RpbmcgY2hhbmdlcyBmcm9tIHJpZ2h0LXRvLWxlZnQgZXJhc2UgbGVmdC10by1yaWdodCBjaGFuZ2VzISEhPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTI3MyI+IzU5MjczPC9hPjogdGFyZ2V0IFRleHRNZXJnZVZpZXdlckNyZWF0b3Igbm90IGZvdW5kPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEFwcmlsIDI3dGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDkxNCI+IzUwOTE0PC9hPjogQXBwbHkgUGF0Y2ggZGlhbG9nIGRvZXNuJ3QgaW5pdGlhbGl6ZSBmaWxlIGJyb3dzZSBkaWFsb2c8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgQXByaWwgMjB0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MDkxIj4jNTQwOTE8L2E+OiBBbGxvdyBoZWFkbGVzcyBkaWZmIGFuZCBtZXJnZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTE3OTEiPiM1MTc5MTwvYT46IEFsbG93IGJpbmRpbmcgZmlsZW5hbWVzIHRvIGNvbXBhcmUgZXh0ZW5zaW9uczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTIyNjEiPiM1MjI2MTwvYT46IERpZmZOb2RlIGlzIG1pc3Npbmcgc2V0QW5jZXN0b3IoKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkyMDQiPiM1OTIwNDwvYT46IE5QRSBpbiBDb21wYXJlVUlQbHVnaW4kQ29tcGFyZVJlZ2lzdHJ5LnNlYXJjaCguLi4pPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEFwcmlsIDEzdGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotbmV3IGFydHdvcmsKLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCAyM3JkIDIwMDQgKE04KQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkxNCI+IzIwOTE0PC9hPjogQ29sb3JpemVkIERpZmYvY29tcGFyZSBvdXRwdXQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MzQ4Ij4jNTUzNDg8L2E+OiBOUEUgaW4gVGV4dE1lcmdlVmlld2VyLmludGVycG9sYXRlPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDl0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNzU0Ij4jNTM3NTQ8L2E+OiBQcm92aWRlIGEgcmVzaXplIGFmZm9yZGFuY2UgaW4gdGhlIHNpZGUgYnkgc2lkZSBjb21wYXJlIHBhcnQ8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggMnRoIDIwMDQKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDI3MzEiPiM0MjczMTwvYT46IFN5bmNocm9uaXplIGhvcml6b250YWwgc2Nyb2xsaW5nIGluIGNvbXBhcmUgZWRpdG9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc4Ij4jMjI3ODwvYT46IERDUjogV291bGQgbGlrZSBjb3VwbGVkIGhvcml6b250YWwgc2Nyb2xsaW5nIGluIGNvbXBhcmUgYnJvd3NlciAoMUdFSk5ITyk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMzY4Ij4jNTMzNjg8L2E+OiBMYXlvdXQgcHJvYmxlbSB3aXRoIGZvY3VzIHJpbmc8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgMTd0aCAyMDA0Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNTkzIj4jNTE1OTM8L2E+OiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYXQgb3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaC5QYXRjaFdpemFyZC5zZXRUYXJnZXRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjA1NSI+IzUyMDU1PC9hPjogTWV0aG9kIGNvbXBhcmUgaXMgYnJva2VuPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDEwdGggMjAwNCAoTTcpCi0KLTxoMj4KLUFQSSBBZGRpdGlvbnM8L2gyPgotQWRkZWQgbmV3IGludGVyZmFjZSBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvcjsgZGVwcmVjYXRlZCBJU3RyZWFtQ29udGVudEFjY2Vzc29yRXh0ZW5zaW9uMjxicj4KLUFkZGVkIGZpcnN0IGN1dCBvZiBvdXRsaW5lIHZpZXcgc3VwcG9ydC4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDI3dGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDU2NSI+IzUwNTY1PC9hPjogW1ByZWZlcmVuY2VzXSBQcmVmIHBhZ2UgV29ya2JlbmNoL0NvbXBhcmUvUGF0Y2g7IG5vIG1uZW1vbmljIGZvciAiRmlsdGVyZWQgTWVtYmVycyI8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSAxM3RoIDIwMDQKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk2OTUiPiM0OTY5NTwvYT46IEFwcGx5IFBhdGNoIHdpemFyZCBpcyBsZWFraW5nIDcgSW1hZ2VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTgwMyI+IzQ5ODAzPC9hPjogUmVwbGFjZSB3aXRoIGxvY2FsIGhpc3RvcnkgbGVha3MgMiBpbWFnZXM8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSA2dGggMjAwNAotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjMyOSI+IzMyMzI5PC9hPjogU3VwcG9ydCBmaWx0ZXJzIGZvciBjb21wYXJlPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDE4dGggKE02KSAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ3ODY2Ij4jNDc4NjY8L2E+OiBJbnRlcm5hbCBlcnJvciBpbiBzeW5jaHJvbml6ZSBwZXJzcGVjdGl2ZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDUyMzkiPiM0NTIzOTwvYT46IFNob3cgYW5jZXN0b3IgZm9yIGluY29taW5nIGFuZCBvdXRnb2luZyBjaGFuZ2VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00MTgxNSI+IzQxODE1PC9hPjogSW50ZXJuYWwgZXJyb3IgY29tcGFyaW5nIHdpdGggcmVwb3NpdG9yeTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDY3MDkiPiM0NjcwOTwvYT46IFBhdGNoV2l6YXJkIHNob3VsZCB1c2Ugc2NoZWR1bGluZyBydWxlIG9uIHByb2plY3Q8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTm92ZW1iZXIgMjV0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1yZW1vdmVkIHVzZSBvZiBkZXByZWNhdGVkIHN5bWJvbHMKLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAxOXRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDY4MDUiPiM0NjgwNTwvYT46IHByZXBhcmUgQ29tcGFyZSBmb3IgZW5jb2Rpbmcgc3VwcG9ydDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDY4NzciPiM0Njg3NzwvYT46IFJlbW92ZSBkZXBlbmRhbmNpZXMgb24gWGVyY2VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00Njk3NyI+IzQ2OTc3PC9hPjogQ29tcGFyaW5nL21lcmdpbmcgdHdvIGxvY2FsIGZpbGVzIHNjcmV3cyB1cCB0aGUgY29udGVudDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBBdWd1c3QgMjZ0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQwNzI3Ij4jNDA3Mjc8L2E+OiBBbGxvdyBuYXZpZ2F0aW9uIHdvcmtmbG93IGNvbnRyb2wgZnJvbSBvdGhlciB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODc3MCI+IzM4NzcwPC9hPjogQ29tcGFyZUVkaXRvciBzaG91bGQgaW1wbGVtZW50IElSZXVzYWJsZUVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzk3NTciPiMzOTc1NzwvYT46IFNvbWUgY29tcGFyZSBvcGVyYXRpb25zIGZhaWwgb24gcmVzb3VyY2VzIHRoYXQgZG8gbm90IGV4aXN0PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTM4MCI+IzM1MzgwPC9hPjogUmVwbGFjZSB3aXRoIExvY2FsIEhpc3RvcnkgYW5kIHJlYWQtb25seSByZXNvdXJjZXM8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVseSAxNXRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg4MzYiPiMzODgzNjwvYT46IENvbXBhcmVFZGl0b3JJbnB1dCBjbGVhcnMgZGlydHkgc3RhdGUgdG9vIHF1aWNrbHk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NzcwIj4jMzg3NzA8L2E+OiBDb21wYXJlRWRpdG9yIHNob3VsZCBpbXBsZW1lbnQgSVJldXNhYmxlRWRpdG9yPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bHkgMXN0IDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg4MDgiPiMzODgwODwvYT46IE5QRSBpbiBsb2cgZmlsZSB3aGVuIHJlc3RvcmluZyBmaWxlcyBmcm9tIGhpc3RvcnkuPGJyPgotZml4ZWQgbWlub3IgZXJyb3IgaW4gc2NoZW1hIGZpbGVzCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAyNHRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3NzAiPiMzODc3MDwvYT46IENvbXBhcmVFZGl0b3Igc2hvdWxkIGltcGxlbWVudCBJUmV1c2FibGVFZGl0b3I8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSAxMHRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3MTMiPiMzODcxMzwvYT46IENvbXBhcmUgd2l0aCAtPiBFYWNoIG90aGVyIGlzIG5vdCBlbmFibGVkPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgM3JkIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzc1MzEiPiMzNzUzMTwvYT46IHRoZSBqYXZhZG9jIG9mIENvbXBhcmVWaWV3ZXJQYW5lLnNldEltYWdlKEltYWdlKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzgyNjIiPiMzODI2MjwvYT46IEFwcGx5IHBhdGNoIGFwcGxpZXMgdW5jaGVja2VkIGNoYW5nZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2Mzk5Ij4jMzYzOTk8L2E+OiBDb21wYXJlIGRpZCByZXRyaWV2ZSBlbnRpcmUgcmVtb3RlIFpJUCBjb250ZW50cyBvbiBzZWxlY3Rpb24gY2hhbmdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODE5OCI+IzM4MTk4PC9hPjogVFZUMjE6ICBTdHJpbmdzIGFyZSBub3QgZXh0ZXJuYWxpemVkPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1haSAyN3RoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzc4NDkiPiMzNzg0OTwvYT46ICJJZ25vcmUgd2hpdGVzcGFjZSIgaWdub3JlcyBhbHNvIGNsb3NpbmcgYnJhY2tldHM/IT88YnI+Ci0KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNzU4MiI+IzM3NTgyPC9hPjogSWdub3JlIHdoaXRlc3BhY2Ugb3B0aW9uIHNob3VsZCBiZSBhIGJ1dHRvbiBpbiB0aGUgY29tcGFyZSBlZGl0b3I8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggMjd0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1GaXhlZCA1IEphdmFkb2Mgd2FybmluZ3MKLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCAyNHRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLVVwZGF0ZWQgc2NoZW1hIGNvcHlyaWdodCBub3RpY2VzPGJyPgotdXBkYXRlZCBqYXZhZG9jCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggMTl0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1GaXhlZCB3b3JkaW5nIGluIHByb3BlcnRpZXMgZmlsZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MTMwIj4jMzUxMzA8L2E+OiBEaWFsb2dzIGRvIG5vdCBzZXQgdGhlIGRpYWxvZyBmb250PGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDE0dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDczMiI+IzM0NzMyPC9hPjogQ29tcGFyZS9QYXRjaCBwcmVmZXJlbmNlIHBhZ2UgbW5lbW9uaWM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0Njk2Ij4jMzQ2OTY8L2E+OiBUaXRsZSBjYXNpbmcgaXNzdWVzPGJyPgotCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWFyY2ggNnRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0MDUiPiMyNzQwNTwvYT46IFNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbmV3IGZvbnQgcHJvcG9nYXRpb24gc3VwcG9ydDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyNTUiPiMyNDI1NTwvYT46IEludGVybmFsIGVycm9yIHdoZW4gaW52b2tpbmcgIlJlc3RvcmUgZnJvbSBMb2NhbCBIaXN0b3J5IiBpbiBPdXRsaW5lIHZpZXc8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzM3Ij4jMzI3Mzc8L2E+OiBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbjogQ29tcGFyZS9wYXRjaCBwcmVmZXJlbmNlIHBhZ2U8YnI+Ci0KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXJjaCA0dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjc2OSI+IzMyNzY5PC9hPjogTWlzc2luZyBtbmV1bW9uaWMgaW4gY29tcGFyZSBwcmVmZXJlbmNlIHBhZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzk4Ij4jMzI3OTg8L2E+OiBObyBtbmVtb25pYyBmb3IgQ29tcGFyZVByZWZlcmVuY2VQYWdlLnVzZVNpbmdsZUxpbmUubGFiZWw8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjA3Ij4jMzIyMDc8L2E+OiBXb3JkaW5nOiAiT3BlbiB3aXRoIENvbXBhcmUgRWRpdG9yIiBhY3Rpb24gaW4gc3luYyB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODE5MCI+IzI4MTkwPC9hPjogTWlkZGxlIGFyZWEgc2hvdWxkIGFjdCBsaWtlIHNhc2g8YnI+Ci1hZGRlZCByZXF1aXJlZCBJRHMgZm9yIGNvbXBhcmUgdmlld2VycyBpbiBwbHVnaW4ueG1sPGJyPgotCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgMjB0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjQ4Ij4jMjAyNDg8L2E+OiBbQ29tcGFyZV0gSGF2ZSB0byBwZXJmb3JtIHR3byBhY3Rpb25zIHRvIHNlZSBkaWZmPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDE2NSI+IzI0MTY1PC9hPjogU2hvdWxkIGhhdmUgbWVudSBhY3Rpb24gZm9yIHNob3dpbmcgY29tcGFyZSBjb250ZW50czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMzIiPiMxMzMzMjwvYT46IGF1dG9zYXZlIGJlZm9yZSBwYXRjaGluZzogY2FuIGkgdW5kbz88YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDc3Ij4jMjQwNzc8L2E+OiBDb21wYXJpbmcgZmlsZSBuYW1lZCAncGxhdGZvcm1PcHRpb24nIGRvZXMgbm90IHVzZSB0ZXh0IGVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NTgiPiMyMzk1ODwvYT46IE5QRSBpbiBjb21wYXJlIHdpdGggcGF0Y2g8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDAyIj4jMjg0MDI8L2E+OiBDb21wYXJlQ29uZmlndXJhdGlvbiBsZWFrcyBJbWFnZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODQ0Ij4jMTM4NDQ8L2E+OiBUZXh0TWVyZ2VWaWV3ZXIgc2hvdWxkIGtlZXAgdHJhY2sgb2YgaXRzIHBvc3RlZCBydW5uYWJsZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzUzIj4jMTQzNTM8L2E+OiBDYW5ub3QgcGVyZm9ybSBtZXJnZSB3aXRoIGtleWJvYXJkIGFjY2VsZXJhdG9ycy9tbmVtb25pY3M8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgMTh0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMjMiPiM1MzIzPC9hPjogQ29tcGFyZSBkb2VzIG5vdCBoYW5kbGUgY29ycmVjdGx5IGNvbmZsaWN0cyBhdCBzYW1lIGxvY2F0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjAzNSI+IzI2MDM1PC9hPjogTG9jYWwgaGlzdG9yeSB1c2VzIHdyb25nIGNoYXJhY3RlciBlbmNvZGluZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NTQiPiMxNTY1NDwvYT46IENhbid0IG1heGltaXplIENvbXBhcmUgd2l0aCBMb2NhbCBIaXN0b3J5IHdpbmRvdzxicj4KLQotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEZlYnJ1YXJ5IDEzdGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTEzNiI+IzMxMTM2PC9hPjogUmVkIGljb24gdG9vIGludHJ1c2l2ZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEzNTciPiMzMTM1NzwvYT46IENvbXBhcmUgVmlldyAtLSBDb21wYXJlLXN0eWxlIG9wdGlvbiByZXF1aXJlZC48YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjMzIj4jMzE2MzM8L2E+OiBDYW5ub3QgYXBwbHkgcGF0Y2ggc3VjY2Vzc2Z1bGx5PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc1NCI+IzEwNzU0PC9hPjogQ29tcGFyZSBhY3Rpb25zIHNob3VsZCB0YXJnZXQgc291cmNlIHdpbmRvdzxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSAxMXRoIDIwMDMKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MDciPiMyNTUwNzwvYT46IENvbXBhcmUgdmlldyBwcmV2ZW50cyBDdHJsICsgRjYgd29ya2luZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NzEiPiMxODU3MTwvYT46IHBhdGNoOiBzY2FyeSBlcnJvciBkaWFsb2cgd2hlbiBubyBwYXRjaCBpbiBjbGlwYm9hcmQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODQwIj4jMjg4NDA8L2E+OiBTdHJhbmdlIGJlaGF2aW91cyBhcHBseWluZyBwYXRjaDxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSA2dGggMjAwMyAoTTUgYWthIFJDMCkKLQotPGgyPgotQVBJIEFkZGl0aW9uczwvaDI+Ci1BZGRlZCBuZXcgbWV0aG9kIEVkaXRpb25TZWxlY3Rpb25EaWFsb2cuZ2V0U2VsZWN0aW9uKCkKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjUiPiMzMDUyNTwvYT46ICJUZWFtIiBtZW51IGl0ZW0gbWlzc2luZyBhY2NlbGVyYXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyMDIiPiMyODIwMjwvYT46IGNvbnRlbnRtZXJnZXZpZXdlcnMgZG8gbm90IHdvcmsgd2l0aCBtaXhlZC1jYXNlIGV4dGVuc2lvbnM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTE0Ij4jMTkxMTQ8L2E+OiBSZXN0b3JlIEphdmEgRWxlbWVudCBmcm9tIExvY2FsIEhpc3Rvcnkgc2hvdWxkIGFsc28gcHJvdmlkZSBjaGVjayBib3hlcyBbY29tcGFyZV08YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDM2Ij4jMjg0MzY8L2E+OiBPdmVydmlldyBydWxlIGdyZWVuIG9ubHkgYWZ0ZXIgZm9jdXMgY2hhbmdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTc5MyI+IzI5NzkzPC9hPjogQXV0b21hdGljYWxseSBzdWdnZXN0IGEgZnV6eiBmYWN0b3Igd2hlbiBhcHBseWluZyBhIHBhdGNoPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgMjh0aCAyMDAzCi0KLTxoMj4KLUFQSSBBZGRpdGlvbnM8L2gyPgotQWRkZWQgbmV3IG1ldGhvZCBDb21wYXJlVUkuZmluZENvbnRlbnRWaWV3ZXIoLi4uLCBPYmplY3QgaW5wdXQsIC4uLikKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLVJlbW9jZWQgZG9jIGZvbGRlci48YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTk3Ij4jMjQ1OTc8L2E+OiBDb21wYXJlIFVJIEFQSSBpc3N1ZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzODgzIj4jMjM4ODM8L2E+OiBDb21wYXJlRGlhbG9nLmNvbW1pdEFjdGlvbi5sYWJlbCBzdHJpbmcgcmVzb3VyY2UgbmFtZSBpcyB3cm9uZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk3OTEiPiMyOTc5MTwvYT46IFJlbmFtZSAnQ29tcGFyZSB0byBQYXRjaCcgdG8gJ0FwcGx5IFBhdGNoJzxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDE0dGggMjAwMwotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotRXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBmaWxlcyBhZGRlZC48YnI+Ci1SZXNvbHZlIHN0YXR1cyBpbmRpY2F0b3IgaXMgb25seSBzaG93biBpZiB0aGVyZSBhcmUgaW5jb21pbmcgY2hhbmdlcy4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDd0aCAyMDAzCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mjc4Ij4jMjgyNzg8L2E+OiBUZXh0TWVyZ2VWaWV3ZXIgbGVha3MgQ29sb3Igb2JqZWN0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4NjQiPiMyNzg2NDwvYT46IExvYWQgb2YgQ29tcGFyZVVJIGZhaWxzIHdoZW4gbm90IHRyaWdnZXJlZCBpbiBVSSB0aHJlYWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mzg4Ij4jMjgzODg8L2E+OiBJbGxlZ2FsIEFyZ3VtZW50IEV4Y2VwdGlvbnMgaW4gY29tcGFyZSB2aWV3ZXI8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRGVjZW1iZXIgMTd0aCAyMDAyCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mzg4Ij4jMjgzODg8L2E+OiBJbGxlZ2FsIEFyZ3VtZW50IEV4Y2VwdGlvbnMgaW4gY29tcGFyZSB2aWV3ZXI8YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRGVjZW1iZXIgMTZ0aCAyMDAyCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci1GaXhlZCBhIHByb2JsZW0gd2l0aCB0cmltIGluIGNvbXBhcmUgdmlld2VyIG9uIE1hYyBPUyBYLjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyNzgiPiMyODI3ODwvYT46IFRleHRNZXJnZVZpZXdlciBsZWFrcyBDb2xvciBvYmplY3RzPGJyPgotCi08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDEzdGggMjAwMgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODAxMiI+IzI4MDEyPC9hPjogRG91YmxlLWNsaWNrIGJlaGF2aW5nIHN0cmFuZ2VseSBpbiBTeW5jaHJvbml6ZSBWaWV3PGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IERlY2VtYmVyIDEwdGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1UaGUgVGV4dG1lcmdldmlld2VyIHNwb3J0cyBhIGZpcnN0IGN1dCBvZiBhIG5ldyBVSSBmb3IgbGVmdC9yaWdodCBjb3B5aW5nLAotc2hvd2luZyB0aGUgJ3Jlc29sdmVkJyBzdGF0dXMgb2YgYSBjaGFuZ2UsIGFuZCB1c2VzIHNtb290aCBsaW5lcyB0bwotY29ubmVjdCB0aGUgZGlmZmVyaW5nIHJhbmdlcyBpbiB0aGUgbGVmdCBhbmQgcmlnaHQgcGFuZXMuCi1UaGUgbmV3IFVJIG9wdGlvbnMgYXJlIG9mZiBieSBkZWZhdWx0LiBZb3UgY2FuIHR1cm4gdGhlbSBvbgotd2l0aCB0aGUgdGhyZWUgJ2V4cGVyaW1lbnRhbCcgb3B0aW9ucyBvbiB0aGUgQ29tcGFyZSBwcmVmZXJlbmNlIHBhZ2UuCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3OTkzIj4jMjc5OTM8L2E+OiBJbmNvcnJlY3Qgc3RydWN0dXJlIGNvbXBhcmlzb248YnI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRGVjZW1iZXIgM3JkIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLU1hZGUgaW50ZXJuYWwgY2xhc3MgU3BsaXR0ZXIgcHVibGljIEFQSS4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MDciPiMyNDU5NzwvYT46IENvbXBhcmUgVUkgQVBJIGlzc3Vlczxicj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAyNnRoIDIwMDIKLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MDciPiMyMDk3NTwvYT46IENvbXBhcmUgcHJlZmVyZW5jZSBwYWdlIGhhcyBubyBGMSBoZWxwPGJyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEp1bmUgMjd0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLVVwZGF0ZWQgSmF2YURvYyBwYWNrYWdlLmh0bWwgZmlsZXMKLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDI1dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1VcGRhdGVkIEphdmFEb2MKLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDEydGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLVRoZXJlIHdlcmUgc2V2ZXJhbCBjb21wbGFpbnMgdGhhdCBjbGlja2luZyBvbiBhIHppcCBmaWxlIGluIHRoZSBsZWZ0IHBhbmUgKHN0cnVjdHVyZSBpbnB1dCBwYW5lKSBmZWVkcyBhbGwgb3RoZXIKLWNvbXBhcmUgcGFuZXMgKHNlZSBidWcgMTM3MzApLiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBpcyBleHBlbnNpdmUgKGZvciBleGFtcGxlIGEgbGFyZ2UgemlwIGZpbGUgdGhhdCBoYXMgCi10byBiZSByZWFkIGZyb20gYSByZXBvc2l0b3J5KS4gVG8gYXZvaWQgdGhvc2Ugc2l0dWF0aW9ucyB0aGUgbGVmdCBwYW5lIG5vdyBob25vcnMgc2luZ2xlIG9yIGRvdWJsZSBjbGljayBtb2RlIGFzIAotc2V0IGluIFByZWZlcmVuY2VzLT5Xb3JrYmVuY2guIFNvIGlmIHRoaXMgcHJlZmVyZW5jZSBpcyBzZXQgdG8gZG91YmxlIGNsaWNrIHRoZSB1c2VyIGhhcyB0byBkb3VibGUgY2xpY2sgb24gYSBmaWxlCi1pbiB0aGUgbGVmdCBwYW5lIHRvIGFjdHVhbGx5IGZlZWQgYWxsIG90aGVyIGNvbXBhcmUgcGFuZXMuCi0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSA4dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODgwNyI+IzE4ODA3PC9hPjogQ29tcGFyZSB3aXRoIHBhdGNoIGZhaWxzIGR1ZSB0byBtaXNzaW5nIExGPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzczMCI+IzEzNzMwPC9hPjogRW50aXJlIHppcGZpbGVzIGNvbnRlbnQgc2VudCBwcmlvciB3aGVuIGNvbXB1dGluZyBzeW5jaHJvbml6YXRpb24gdmlldyBjb250ZW50PGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDd0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNzMwIj4jMTM3MzA8L2E+OiBFbnRpcmUgemlwZmlsZXMgY29udGVudCBzZW50IHByaW9yIHdoZW4gY29tcHV0aW5nIHN5bmNocm9uaXphdGlvbiB2aWV3IGNvbnRlbnQ8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTUyIj4jMTQ5NTI8L2E+OiBEaWZmIEJyb3dzZXIgT3BlbnMgVG9vIFNtYWxsIC8gTm90IEVhc2lseSBSZXNpemFibGU8YnI+Ci0KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSnVuZSA2dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci1OZXcgY29uc3RhbnQgQ29tcGFyZVVJLlBMVUdJTl9JRAotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NDkiPiMxMzk0OTwvYT46IERCQ1M6IGJvZ3VzIGF0IHRleHQgY29tcGFyZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwMTMiPiMxOTAxMzwvYT46IGJhY2tncm9udWQgY29sb3I6IGlzIGl0IGhvbm9yZWQ/PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTIxNiI+IzE5MjE2PC9hPjogQWNjZXNzaWJpbGl0eSBpbiBXb3JrYmVuY2ggPiBDb21wYXJlID4gVGV4dCBDb21wYXJlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTM3MSI+IzE5MzcxPC9hPjogSmF2YSAmIENvbXBhcmUgZWRpdG9yJ3MgTmV4dC9QcmV2aW91cyB0b29sYmFyIGJ1dHRvbnMgc2hvdWxkbid0IGJlIHJldGFyZ2V0YWJsZTxicj4KLQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKdW5lIDFzdCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLU1hZGUgY2xhc3MgTmF2aWdhdGlvbkFjdGlvbiBwdWJsaWMuCi0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDA0Ij4jODAwNDwvYT46IEN0cmwrRSBiZWVwcyBldmVyeSB0aW1lPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgwMCI+IzE0ODAwPC9hPjogQ29tcGFyZSBWaWV3IGVhdHMgdGFiczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyMDAiPiMxODIwMDwvYT46IEJvdGggc2V0cyBvZiBhcnJvd3Mgc2F5ICJTZWxlY3QgTmV4dCBDaGFuZ2UiPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODIwNiI+IzE4MjA2PC9hPjogQ2FzaW5nLCB3b3JkaW5nIGlzc3VlIG9uICJMYXN0IFJlc291cmNlIHJlYWNoZWQiIHByb21wdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyODUiPiMxNjI4NTwvYT46IEFkZCBmcm9tIExvY2FsIEhpc3RvcnkgbmVlZHMgYSBkZXNjcmlwdGlvbiBsYWJlbDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MzEiPiMxNzQzMTwvYT46IEFjY2Vzc2liaWxpdHkgaXNzdWVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE0OCI+IzE4MTQ4PC9hPjogVXNpbmcgY29tYmluYXRpb25zIG9mIE5vIGFuZCBOZXh0IGZpbGUgYnV0dG9uIGJyZWFrIHdyYXBwaW5nPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE1MSI+IzE4MTUxPC9hPjogTmV4dCBGaWxlIGJ1dHRvbiBkb2VzIG5vdCBkaW5nIHdoZW4gb24gbGFzdCBmaWxlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjU3MCI+IzE2NTcwPC9hPjogQ29tcGFyZSByZWZ1c2VzIHRvIHNob3cgZnVydGhlciBkaWZmZXJlbmNlcyBpZiBub3QgaWdub3Jpbmcgd2hpdGVzcGFjZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzkwIj4jMTA3OTA8L2E+OiBQYXRjaCBkb2VzIG5vdCBhcHBseSBpZiBmaWxlIG5vdCBmb3VuZCBsb2NhbGx5PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY0MyI+IzEyNjQzPC9hPjogRXhwYW5kIGFsbCBkb2VzIG5vdCBkaXNhYmxlIHdoZW4gdGhlcmUgaXMgbm8gc2VsZWN0aW9uPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXkgMzFzdCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTE2Ij4jMTgxMTY8L2E+OiBDb21wYXJlIHZpZXcgZG9lcyBub3QgaW5oZXJpdCBKYXZhIGVkaXRvciBiYWNrZ3JvdW5kIGNvbG9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzE5MCI+IzEzMTkwPC9hPjogQ29tcGFyZSB3aXRoIFBhdGNoIGRvZXMgbm90IGFwcGx5IFBhdGNoLCBpZiBzaW5nbGUgZmlsZSBzZWxlY3RlZDxicj4KLQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXkgMzB0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Njk5Ij4jMTc2OTk8L2E+OiBKYXZhIEVkaXRvcjogTG9jYWwgSGlzdHJveSBtZW51IGVudHJpZXMgYXJlIGVuYWJsZWQgZm9yIHJlYWQtb25seSBmaWxlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyODMiPiMxNjI4MzwvYT46IEFkZCBmcm9tIExvY2FsIEhpc3RvcnkgaXRlbXMgYXJlIHVuc29ydGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjI4OCI+IzE2Mjg4PC9hPjogQWRkIGZyb20gTG9jYWwgSGlzdG9yeTogbGlzdCBvZiBhdmFpbGFibGUgZWRpdGlvbnMgZmxhc2hlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NjQiPiMxNzY2NDwvYT46IEFwcGx5aW5nIGEgcGF0Y2ggd2l0aCBkZWxldGVkIHBhY2thZ2UgZmFpbHM8YnI+Ci0KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDI5dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA0MCI+IzE0MDQwPC9hPjogUGxhdGZvcm0gaW50ZXJvcGVyYWJpbGl0eSBpc3N1ZSB3LnIudC4gQ29tcGFyZSBXaXRoIFBhdGNoPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc5MCI+IzE3NzkwPC9hPjogTWlzc2luZyBtbmVtb25pY3MgaW4gcGF0Y2ggc2VsZWN0aW9uIGRpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MTciPiMxMDkxNzwvYT46IFBhdGNoIHN1cHBvcnQgZG9lcyBub3QgdXNlIG1uZW1vbmljczxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDI4dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg4OSI+IzE3ODg5PC9hPjogU2hvdWxkIG5vdCBhc3N1bWUgdHlwZSBvZiBQcm9wZXJ0eUNoYW5nZUV2ZW50IHZhbHVlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NzgiPiMxNzY3ODwvYT46IEFwcGx5aW5nIGEgcGF0Y2ggZG9lcyBtYW55IGNvbXBpbGVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzUzNiI+IzE3NTM2PC9hPjogTlBFIGluIGNvbXBhcmU8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTIxIj4jMTcxMjE8L2E+OiBDYXNpbmcgb2YgbWVzc2FnZSB3aGVuIGVuZCBvZiBjaGFuZ2VzIG5lZWRzIHRvIGJlIHNlbnRlbmNlIHN0eWxlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzY0OCI+IzE3NjQ4PC9hPjogQ2FuJ3QgYXBwbHkgcGF0Y2ggdy9vIGlnbm9yaW5nIHdoaXRlc3BhY2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTM2Ij4jMTY5MzY8L2E+OiBDb21wYXJlIHdpdGggcGF0Y2ggcmVxdWlyZXMgIklnbm9yZSBXaGl0ZXNwYWNlIiB0byBiZSB0dXJuZWQgb2ZmPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBNYXkgMTh0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzcxIj4jMTQzNzE8L2E+OiBUZXh0TWVyZ2VWaWV3ZXIuc2FtZURvYygpIGlzIGJyb2tlbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNzgiPiMxNDM3ODwvYT46IENvbXBhcmVFZGl0b3JJbnB1dCBuZXZlciByZXNldHMgZGlydHluZXNzIGZsYWcgKGRldGFpbGVkKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2ODAiPiMxNDY4MDwvYT46IENvbXBhcmUgdW5yZWFkYWJsZSBpbiBoaWdoIGNvbnRyYXN0IGJsYWNrPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1MiI+IzE0OTUyPC9hPjogRGlmZiBCcm93c2VyIE9wZW5zIFRvbyBTbWFsbCAvIE5vdCBFYXNpbHkgUmVzaXphYmxlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc0MiI+IzE0NzQyPC9hPjogSWdub3JlIHdoaXRlc3BhY2UgcHJlZmVyZW5jZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2MjQiPiMxNDYyNDwvYT46IE5vIHZpc3VhbCBjdWUgd2hlbiBjb21wYXJlZCBmaWxlIHdyYXBzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYwNiI+IzEzNjA2PC9hPjogU3VwcG9ydCBtdWx0aXBsZSBzZWxlY3Rpb24gaW4gQWRkIGZyb20gbG9jYWwgaGlzdG9yeTxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgTWF5IDE2dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1CdW1wZWQgcGx1Z2luIHZlcnNpb24gbnVtYmVyIHRvIDIuMC4wPGJyPgotQWRhcHRlZCB0byBuZXcgZmluZEVkaXRvciBtZXRob2RzPGJyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM3MyI+IzgzNzM8L2E+OiBDb21wYXJlIFdpdGgtPlBhdGNoLi4uIG1pc3NpbmcgbW5lbW9uaWM8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzE5Ij4jMTI3MTk8L2E+OiAiU2hvdyBQc2V1ZG8tQ29uZmxpY3RzIiBzZXR0aW5nIGlzIHByb2JsZW1hdGljPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBBcHJpbCAzMHRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotQWxsIHN0cmluZ3MgTkxTZWQuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUxNSI+IzE0NTE1PC9hPjogamF2YSBjb21wYXJlIHVzZXMgaW50ZXJuYWwgamNvcmUgc2Nhbm5lcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3ODIiPiMxNDc4MjwvYT46IEFkZCBmcm9tIExvY2FsIEhpc3RvcnkgbWlzc2luZyBtbmVtb25pYzxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgQXByaWwgMTh0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLUFsbCBzdHJpbmdzIE5MU2VkLgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNTIiPiMxMzE1MjwvYT46IEludGVybmFsIGVycm9yIGluICJBZGQgZnJvbSBMb2NhbCBIaXN0b3J5Li4uIiBvbiBwYWNrYWdlczxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgQXByaWwgOXRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotTmV3IGNvbnRleHQgbWVudSBhY3Rpb24gJ0FkZCBGcm9tIExvY2FsIEhpc3RvcnknLiBKdXN0IHNlbGVjdCBhbnkgcmVzb3VyY2UgY29udGFpbmVyIGFuZAotJ0FkZCBGcm9tIExvY2FsIEhpc3RvcnknIHByZXNlbnRzIGFsbCBmaWxlcyB0aGF0IHdlcmUgZGVsZXRlZCBmcm9tIHRoZSB3b3Jrc3BhY2UgYnV0IGFyZQotc3RpbGwgaW4gdGhlIGxvY2FsIGhpc3RvcnkuIAotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLVRoZSBuZXcgJ0FkZCBGcm9tIExvY2FsIEhpc3RvcnknIHN1ZmZlcnMgZnJvbSAjMTI5MTUuIEl0IHdvcmtzIGlmIHRoZSBmaWxlcyB3ZXJlIGRlbGV0ZWQKLXdpdGhpbiB0aGUgc2FtZSBzZXNzaW9uLiBIb3dldmVyIGlmIHlvdSBzaHV0IGRvd24gYW5kIHJlc3RhcnQgYSB3b3Jrc3BhY2Ugc29tZSBkZWxldGVkCi1maWxlcyBhcmUgbm9yIGxpc3RlZC4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NzgiPiMxMTU3ODwvYT46IFBhdGNoOiBNaXNzaW5nIHJlc291cmNlIG9uIGRpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NzkiPiMxMTU3OTwvYT46IENvbXBhcmUgd2l0aCBQYXRjaCBzaG91bGQgYmUgZGlzYWJsZWQgb24gY2xvc2VkIHByb2plY3RzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwNyI+IzExOTA3PC9hPjogY2xpY2tpbmcgaW4gYmlyZCdzIGV5ZSB2aWV3IHNwb3RzIGRvZXMgbm90aGluZyBpZiBwYW5lcyBub3Qgc3luY2hlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MzYiPiMxMTUzNjwvYT46IE9wdGlvbiB0byB0dXJuIG9mZiBzdHJ1Y3R1cmVkIGNvbXBhcmlzb248YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjgyIj4jMTA2ODI8L2E+OiBOZWVkIGJldHRlciBVSSBmb3IgcmVjb3ZlcmluZyBkZWxldGlvbnMgZnJvbSBsb2NhbCBoaXN0b3J5PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ0NiI+IzExNDQ2PC9hPjogcHJvdmlkZSAiYWRkIGZyb20gbG9jYWwgaGlzdG9yeSIgZm9yIGNvbXBpbGF0aW9uIHVuaXRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjE1Ij4jODYxNTwvYT46IFN0eWxlZCBUZXh0IHdpZGdldCBkb2VzIG5vdCByZXNwb25kIHRvIHN5c3RlbSBjb2xvciBjaGFuZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2NzMiPiM5NjczPC9hPjogZWRpdG9yIGJhY2tncm91bmQgY29sb3IgLSBubyBlZmZlY3Qgb24gb3RoZXIgdmlld2Vyczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDIiPiMxMTY0MjwvYT46IENvbXBhcmUgZWRpdG9ycyBub3QgdXNpbmcgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0MzQiPiMxMDQzNDwvYT46IENvbXBhcmUgYnJvd3NlciBmYWlscyBzaWxlbnRseSBhbmQgZG9lcyBub3QgZ2l2ZSByZXN1bHQ8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDE4dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1GaXJzdCBjdXQgb2YgYSBiaXJkc2V5ZXZpZXcgZm9yIHRoZSB0ZXh0IGNvbXBhcmUgdmlld2VyLjxicj4KLSdDb21wYXJlIHdoaWNoIEVhY2ggb3RoZXInIGZvciBKYXZhIGVsZW1lbnRzLgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzY0MSI+IzM2NDE8L2E+OiBEQ1I6IENhbid0IGNvbXBhcmUgZnJvbSBvdXRsaW5lciAoMUdESEpLSyk8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDE0dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTMwNSI+IzExMzA1PC9hPjogQ2FuJ3QgY29tcGFyZSBhICJDIiBmaWxlPGJyPgotCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDEydGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1TdHJ1Y3R1cmUgQ29tcGFyZSB2aWV3ZXJzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuPGJyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNzkiPiMxMDM3OTwvYT46IENvbXBhcmUgd2l0aCBMb2NhbCBIaXN0b3J5IERpYWxvZzogbG93ZXIgcGFuZSBpcyBtaXNzaW5nIGEgYm9yZGVlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTc2OCI+Izk3Njg8L2E+OiAoZW1wdHktbWVudSkgaW4gY29tcGFyZSB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODQyIj4jOTg0MjwvYT46IEV4cGFuZCBBbGwgYWN0aW9uIG5lZWRlZCBpbiBzdHJ1Y3R1cmUgY29tcGFyZSB2aWV3PGJyPgotCi0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IE1hcmNoIDV0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4NjkiPiM5ODY5PC9hPjogTmVlZCBtb3JlIHN1cHBvcnQgZm9yIGNyZWF0aW5nL2RlbGV0aW5nIHJlc291cmNlczxicj4KLQotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSAyNnRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotUGF0Y2g6IGZvciBldmVyeSByZWplY3RlZCBmaWxlIGEgdGFzayBtYXJrZXIgaXMgYWRkZWQ8YnI+Ci1Db21wYXJlIHByZWZlcmVuY2UgcGFnZSBzaG93cyBvcHRpb25zIGluIGEgcHJldmlldzxicj4KLU5ldyBwcmVmZXJlbmNlIG9wdGlvbiBmb3IgYWRkaXRpb25hbCBjb21wYXJlIHN0YXR1cyBsaW5lIGluZm9ybWF0aW9uCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTQwIj4jOTU0MDwvYT46IENvbXBhcmUgd2l0aCBwYXRjaDogaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBjaGVjayBpdGVtcyB0aGF0IGNvdWxkIG5vdCBiZSBhcHBsaWVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTMyIj4jOTUzMjwvYT46IENvbXBhcmUgd2l0aCBwYXRjaDogbmV4dCBkaXNhYmxlZCBhbHRob3VnaCBjbGlwYm9hcmQgc3BlY2lmaWVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NjgxIj4jNzY4MTwvYT46IFN0cnVjdHVyZWQgcmVzdWx0cyBleHBhbmRzIGltcG9ydCBzdGF0ZW1lbnRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTcyIj4jOTU3MjwvYT46IERlYnVnZ2luZyB0cmFjZSBsZWZ0IGluIHN0YXR1cyBiYXI8YnI+Ci0KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRmVicnVhcnkgMTJ0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLVRoZSBwYXRjaCB3aXphcmQgbm8gbG9uZ2VyIG9wZW5zIGEgQ29tcGFyZSBFZGl0b3IgYnV0IGFwcGxpZXMgdGhlCi1wYXRjaCBkaXJlY3RseSB0byB0aGUgd29ya3NwYWNlLiBUaGlzIHdpbGwgYmUgdGhlIGRlZmF1bHQuCi1JbiB0aGUgZnV0dXJlIHRoZSBvbGQgYmVoYXZpb3Igb2Ygb3BlbmluZyB0aGUgQ29tcGFyZSBFZGl0b3Igd2lsbCBiZQotYW4gYWRkaXRpb25hbCBvcHRpb24gd2hlbiBmaW5pc2hpbmcgdGhlIHdpemFyZC4KLTxicj4KLVBhdGNoIHdpemFyZCBoYXMgYSAnUmV2ZXJzZScgb3B0aW9uIGZvciBhcHBseWluZyBhICJyZXZlcnNlZCIgcGF0Y2guCi1UaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byAndW5kbycgYSBwYXRjaC4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNTMiPiM5MTUzPC9hPjogTlBFIHdoZW4gY2xvc2luZyBzeW5jaHJvbml6ZSB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzMxIj4jOTMzMTwvYT46IE5QRSBkdXJpbmcgY29tcGFyZSB3aXRoIHN0cmVhbSB2ZXJzaW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzQ2Ij4jNjM0NjwvYT46IFByb2JsZW1zIHdpdGggUGF0Y2g8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3MjciPiM2NzI3PC9hPjogUGF0Y2g6ICoucmVqIGZpbGUgbXVzdCBiZSBzYXZlZCBpbiB3b3Jrc3BhY2U8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNTgiPiM3MzU4PC9hPjogSW50ZXJuYWwgRXJyb3IgaW4gQ29tcGFyZSB3aXRoIFBhdGNoIHdpdGggbmV3IGZpbGVzPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBGZWJydWFyeSA1dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1UaGUgc3RydWN0dXJlIGNvbXBhcmUgcGFuZSBvcGVucyB3aGVuIGEgcmVzb3VyY2UgaXMgc2VsZWN0ZWQuCi1JbiBwcmV2aW91cyB2ZXJzaW9uIGEgZG91YmxlIGNsaWNrIHdhcyByZXF1aXJlZC4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNjMiPiM1MDYzPC9hPjogU2hvdWxkIG5vdCBoYXZlIHRvIGRvdWJsZS1jbGljayB0byBvcGVuIFN0cnVjdHVyZSBDb21wYXJlPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjAyIj4jMjYwMjwvYT46IENvbXBhcmUgRlcgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgKDFHSzc5VUIpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA3Ij4jMjcwNzwvYT46IE1lcmdlIHZpZXdlciBzaG91bGQgYXNrIGZvciBzYXZlIGJlZm9yZSByZWxlYXNpbmcgKDFHSTlKWFMpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzcyIj4jMjc3MjwvYT46IERDUjogQXV0b21hdGljIHN0cnVjdHVyZSBjb21wYXJlICgxR0o2RVVZKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzgyOSI+IzM4Mjk8L2E+OiBTbWFydCByZW5hbWUgYnV0dG9uIGVuYWJsZWQgd2hlbiBubyBzbWFydG5lc3MgaXMgYXZhaWxhYmxlICgxR0VVVkhOKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4OSI+IzkwODk8L2E+OiBMb2NhbCBoaXN0b3J5IC0gU2VsZWN0aW5nIGl0ZW0gaW4gc3RydWN0dXJlZCBjb21wYXJlIGhhcyBubyBlZmZlY3Q8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIEJ1aWxkIElucHV0IEphbnVhcnkgMjl0aCAyMDAyCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNzEiPiM2MjcxPC9hPjogQ2FuJ3QgdGVsbCB3aGljaCBmaWxlIGlzIHdoaWNoIGluIENvbXBhcmUgYnJvd3Nlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxOSI+IzI1MTk8L2E+OiBuZXh0L3ByZXYgYXJyb3dzIGFjdGl2ZSB3aGVuIG9ubHkgb25lIGRpZmZlcmVuY2UgaW4gY29tcGFyZSAoMUdGSVFYMyk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNjMiPiM4MzYzPC9hPjogTlBFIGNvbXBhcmluZyB0d28gcmVzb3VyY2VzIGluIHRoZSBuYXZpZ2F0b3IuPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTAxIj4jMjUwMTwvYT46IEVtcHR5IG1lbnUgaW4gY29tcGFyZSBicm93c2VyICgxR0ZCUUtFKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1NCI+IzI4NTQ8L2E+OiBDb21wYXJlOiBTYXZlIGNvZGUgcGF0aCBwcm9ibGVtYXRpYyAoMUdKWUdBWCk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1NzQiPiM4NTc0PC9hPjogTm90IHN0cnVjdHVyZSBjb21wYXJlIGluIGNvbXBhcmUgd2l0aCBsb2NhbCBoaXN0b3J5PGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDIzdGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDg5Ij4jODA4OTwvYT46IFJlcGxhY2UgZnJvbSBsb2NhbCBoaXN0b3J5OiBwYXJzZSBlcnJvcjxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSAyMnRoIDIwMDIKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotRml4ZWQgYW4gaW5jb25zaXN0ZW5jeSBpbiB0aGUgYmluYXJ5IGNvbXBhcmUgdmlld2VyOgotaW5mbyBtZXNzYWdlIGRpZG4ndCBtYXRjaCArLy1pY29uIGluIHRoZSByZXNvdXJjZSBjb21wYXJlIHBhbmUuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODU5Ij4jMzg1OTwvYT46IHJlcGxhY2UgZnJvbSBoaXN0b3J5IGRvZXMgbm90IHdvcmsgZm9yIGVsZW1lbnRzIHdpdGggZXJyb3IgKDFHRVlJWjYpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTc3Ij4jNjE3NzwvYT46IERvdWJsZSBjbGljayBhY3Rpb24gZGFuZ2Vyb3VzIGluICdSZXN0b3JlIGZyb20gTG9jYWwgSGlzdG9yeSc8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MjEiPiM3ODIxPC9hPjogVGVhbSAyLjAgQ1ZTIHN5bmNocm9uemUgYnVnICduby1uYW1lJyBkaXJzLi48YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NzMiPiMyNzczPC9hPjogSmF2YSBzdHJ1Y3R1cmUgY29tcGFyZSBzaG91bGQgZ2l2ZSBiZXR0ZXIgaW5kaWNhdGlvbiB3aGVuIG5vIGNoYW5nZXMgKDFHSjZFTkUpPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBKYW51YXJ5IDE1dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1GaXhlZCBhIHByb2JsZW0gaW4gRGlmZk5vZGUuZ2V0TmFtZSgpYW5kIHRoZSBEaWZmVHJlZVZpZXdlcidzIGxhYmVsIHByb3ZpZGVyCi13aGVyZSB0aGUgbGVmdCBhbmQgcmlnaHQgaGFsZiBvZiBhIERpZmZOb2RlIGxhYmVsIHdvdWxkIGJlIHJldmVyc2VkIGJlY2F1c2UKLXRoZSAibGVmdElzTG9jYWwiIHByb3BlcnR5IG9mIGEgQ29tcGFyZUNvbmZpZ3VyYXRpb24gd2Fzbid0IG9iZXllZC4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTMiPiMxODkzPC9hPjogQ29tcGFyZSBWaWV3ZXIgZG9lc24ndCBzY3JvbGwgdG8gbGFzdCBsaW5lICgxR0JCMzROKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTgzOSI+IzU4Mzk8L2E+OiBVc2FiaWxpdHk6IEluaXRpYWwgZGlmZiBpcyBzb21ldGltZXMgbm90IGhvcml6b250YWxseSBhbGlnbmVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzI1Ij4jNTMyNTwvYT46IENvbXBhcmUgYWx3YXlzIHNjcm9sbCB0aGUgdGV4dCBwYW5lIHRvIHRoZSBleHRyZW1lIGxpbWl0PGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDQ4Ij4jNzA0ODwvYT46IEZpcnN0IGVsZW1lbnQgbm90IHNlbGVjdGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTQ4Ij4jMjU0ODwvYT46IFByb2plY3QgY29tcGFyZSBzaG91bGQgb3BlbiB2aWV3aW5nIHNlbGVjdGVkIGZpbGUgKDFHRk1SUDYpPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM4Ij4jMjkzODwvYT46IFJlcGxhY2UgZnJvbSBsb2NhbCBoaXN0b3J5IHNob3VsZCBzaG93IGJ1c3kgY3Vyc29yICgxR0tVMFAzKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NCI+Izc1OTQ8L2E+OiBNZW51IGVudHJ5ICJSZXBsYWNlIHdpdGggUHJldmlvdXMiIHNob3VsZG4ndCBoYXZlIGEgIi4uLiI8YnI+Ci1Xb3JrYXJvdW5kIGFkZGVkIGZvcjo8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczMjAiPiM3MzIwPC9hPjogTmV4dCBkaWZmIHNjcm9sbHMgd2hlbiBnb2luZyBpbnRvIGN1cnJlbnQgZGlmZjxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgSmFudWFyeSA4dGggMjAwMgotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci1BZGRlZCBtZXRob2RzIHRvIENvbXBhcmVVSSBwbHVnaW4gZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgYWxpYXNlcwotZm9yIHRoZSBmaWxlIGV4dGVuc2lvbiB0byBTdHJ1Y3R1cmVDb21wYXJlVmlld2VyIG1hcHBpbmcKLShhZGRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcywgcmVtb3ZlU3RydWN0dXJlVmlld2VyQWxpYXMpLgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgyOCI+IzY4Mjg8L2E+OiBTdXBwb3J0IHdpdGggcmVwbGFjZSB3aXRoIHByZXZpb3VzPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk2Ij4jMjM5NjwvYT46IFNhdmUgaW4gY29tcGFyZSBlZGl0b3JzIG5lZWRzIHByb2dyZXNzIGJhciAoMUdFWUY1OCk8YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNzEiPiM1MjcxPC9hPjogSkFScyBjb21wYXJlZCBhcyBzb3VyY2UgaW4gcmVsZWFzZSBicm93c2VyPGJyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTIxIj4jNTEyMTwvYT46IFJlcGxhY2Ugd2l0aCBQcmV2aW91cyAoZnJvbSBsb2NhbCBoaXN0b3J5KTxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgQnVpbGQgSW5wdXQgRGVjZW1iZXIgMTF0aCAyMDAxCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLUtleWJvYXJkIHNob3J0Y3V0cyBmb3IgJ0dvdG8gbmV4dCBEaWZmZXJlbmNlJyBhbmQgJ0dvdG8gcHJldmlvdXMgRGlmZmVyZW5jZScKLWNoYW5nZWQgdG8gQ29udHJvbC1FIGFuZCBDb250cm9sLVNoaWZ0LUUuPGJyPgotQmV0dGVyIE5MUyBzdXBwb3J0Ljxicj4KLVVwZGF0ZWQgZmlsZSAiYWJvdXQuaHRtbCIuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBEZWNlbWJlciA0dGggMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00MzgxIj4jNDM4MTwvYT46IFJlcGxhY2UgZnJvbSBsb2NhbCBoaXN0cm95IC0gd29ya3NwYWNlIGVsZW1lbnQgaW5jbHVkZWQgPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBCdWlsZCBJbnB1dCBOb3ZlbWJlciAyN3RoIDIwMDEKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjI5OCI+IzYyOTg8L2E+OiBSZXBsYWNlIHdpdGggTG9jYWwgSGlzdG9yeTogV29ya2JlbmNoIC0+IFdvcmtzcGFjZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTIzOCI+IzUyMzg8L2E+OiBDb21wYXJlIGZhaWxzIGlmIHRha2VzIG1vcmUgdGhhbiAyMCBzZWNvbmRzPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjEwLCBOb3ZlbWJlciAxMnRoLCAyMDAxCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLUZpcnN0IGN1dCBmb3IgJ3JlamVjdGVkIGh1bmsnIHN1cHBvcnQuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci1uZXcgY2xhc3NlcyBDb21wYXJlVmlld2VyUGFuZSBhbmQgQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmU8YnI+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotSW1wcm92ZWQgUGF0Y2ggd2l6YXJkLjxicj4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcyMyI+IzU3MjM8L2E+OiBBcHBseSBQYXRjaCBkaWFsb2cgaGFzIG5vIHJhZGlvIHNlbGVjdGlvbjxicj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGNsb3NlZDwvaDI+Ci0KLTxoMT4KLTxociBXSURUSD0iMTAwJSI+PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwNywgTm92ZW1iZXIgMXN0LCAyMDAxCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMzQiPiM1MzM0OiBJbnRlcm5hbCBlcnJvcnMgdXNpbmcgcGF0Y2ggdG9vbDwvYT48YnI+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNTAiPiM1MTUwOiBDb21wYXJlIHdpdGggcGF0Y2ggY2Fubm90IHJlYWQgVkNNJ3MgQ1ZTIHBhdGNoIGZpbGU8L2E+PGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjA0LCBPY3RvYmVyIDEydGgsIDIwMDEKLQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotRmlyc3QgY3V0IG9mIHBhdGNoIHN1cHBvcnQuCi0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAyLCBTZXB0ZW1iZXIgMjd0aCwgMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPGgzPgotQVBJIEFkZGl0aW9uczwvaDM+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08aDI+Ci1Lbm93biBkZWZpY2llbmNpZXM8L2gyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgotMUdLS1VBNTogSVRQVUk6V0lOTlQgLSBTZXZlcmU6IG1lbW9yeSBsZWFrIGluIHN5bmMgdmlldzxicj4KLTFHS0tHR1M6IElUUEpVSTpXSU4yMDAwIC0gKDEzNikgY29tcGFyZXMgemlwcyBhcyBzb3VyY2U8YnI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBjbG9zZWQ8L2gyPgotCi08aDE+Ci08aHIgV0lEVEg9IjEwMCUiPjwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDEsIFNlcHRlbWJlciAyMXN0LCAyMDAxCi0KLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLXJlbW92ZWQgZGlyZWN0aW9uIGljb24gaW4gVGV4dE1lcmdlVmlld2VyIGZvciB0d28td2F5IGNvbXBhcmUKLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08aDM+Ci1BUEkgQWRkaXRpb25zPC9oMz4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTxoMj4KLUtub3duIGRlZmljaWVuY2llczwvaDI+Ci0KLTxoMj4KLVByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+Ci0xR0pVUldKOiBJVFBVSTpXSU4yMDAwIC0gSGVicmV3ICsgSmFwYW5lc2U6IGNvbXBhcmUgdmlldyBkZWZhdWx0cyB0byBiaW5hcnk8YnI+Ci0xR0swMzg4OiBJVFBKQ09SRTpXSU4yMDAwIC0gcmVwbGFjZSB3aXRoIGxvY2FsIGhpc3Rvcnk6IHNlbGVjdGluZyAod29ya3NwYWNlKSBkZWxldGVzIHNvdXJjZTxicj4KLTFHSVRHMlY6IElUUFVJOldJTjIwMDAgLSBDb21wYXJpbmcgaHRtbCBmaWxlcyB1c2VzIGJpbmFyeSBjb21wYXJlPGJyPgotMUdKVzJUUDogSVRQSlVJOldJTjIwMDAgLSBqYXZhIGNvbXBhcmU6IHdoeSBiZWVwIGV2ZXJ5IHRpbWU/PGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLQotPGgxPgotPGhyIFdJRFRIPSIxMDAlIj48L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwLCBTZXB0ZW1iZXIgMTN0aCwgMjAwMQotCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci1JZiBub3Qgc3BlY2lmaWVkIG90aGVyd2lzZSBDb21wYXJlIHZpZXdlciBmb250IGlzIHRha2VuIGZyb20gd29ya2JlbmNoIHRleHQgZm9udDxicj4KLVRoZSBzaG9ydGN1dCBmb3IgIkdvdG8gTmV4dC9QcmV2aW91cyBEaWZmZXJlbmNlIiBpcyBDdHJsLUQvQ3RybC1TaGlmdC1ECi10byBhdm9pZCBhIGNsYXNoIHdpdGggQ3RybC1QIG9mIHRoZSBQcmludCBjb21tYW5kLgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTxoMz4KLUFQSSBBZGRpdGlvbnM8L2gzPgotbmV3IG1ldGhvZCBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nLnNldEhpZGVJZGVudGljYWxFbnRyaWVzKGJvb2xlYW4pPGJyPgotbmV3IG1ldGhvZCBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nLnNldFRhcmdldElzUmlnaHQoYm9vbGVhbik8YnI+Ci1uZXcgbWV0aG9kIEVkaXRpb25TZWxlY3Rpb25EaWFsb2cuc2V0QWRkTW9kZShib29sZWFuKTxicj4KLW5ldyBtZXRob2QgQ29tcGFyZUVkaXRvcklucHV0LnNhdmVDaGFuZ2VzKC4uLik8YnI+Ci1uZXcgbWV0aG9kIFRleHRNZXJnZVZpZXdlci5jcmVhdGVMaW5lQ29tcGFyYXRvcihJRG9jdW1lbnQgZG9jdW1lbnQsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGlnbm9yZVdoaXRlU3BhY2UpPGJyPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPGgyPgotS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLTFHRk1MRkI6IElUUFVJOldJTjIwMDAgLSBmaWxlcyB0aGF0IGFyZSBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbSBhcHBlYXIgYXMgZW1wdHk8YnI+Ci0xR0cwRUxNOiBJVFBWQ006QUxMIC0gTG9jYWwgaGlzdG9yeSBkaXNwbGF5ZWQgc29tZSBvZiBUb2RheSdzIGl0ZW1zIGFzIFllc3RlcmRheTxicj4KLTFHR05LSE46IElUUEpVSTpBTEwgLSBObyBwcm9ncmVzcyBkdXJpbmcgcmVwbGFjZSB3aXRoIGxvY2FsIGhpc3Rvcnk8YnI+Ci0xR0YySk5JOiBJVFBVSTpBTEwgLSAobWlub3IpQ29tcGFyZSBmYWlsZWQgdGl0bGUgc2hvdWxkIGJlIHRpdGxlIGNhc2U8YnI+Ci0xR0hCUEExOiBJVFBWQ006V0lOTlQgLSBDb21wYXJlIC0gbmV4dCBjaGFuZ2UgYXJyb3cgc3dpdGNoZXMgdG8gd3JvbmcgZmlsZTxicj4KLTFHR1FRSDM6IElUUEpVSTpXSU5OVCAtIENvbXBhcmUgaGlnaHRsaWdodHMgYSBub24tY2hhbmdlIGluc3RlYWQgb2YgdGhlIGNoYW5nZTxicj4KLTFHSTVETjk6IElUUFVJOldJTjIwMDAgLSBDb25mbGljdGluZyB0b2tlbiBkZWxldGlvbnMgZG9uJ3Qgc2hvdyB1cCBpbiB0ZXh0IGNvbXBhcmUgdmlld2VyPGJyPgotMUdJM0tVUjogSVRQSlVJOldJTjIwMDAgLSBDb21wYXJlOiBkb3VibGUtY2xpY2sgaW4gdmVyc2lvbnMgbGlzdCBjbG9zZXMgdmlldzxicj4KLTFHRkZSNEI6IElUUFVJOldJTjk4IC0gbG9jYWwgaGlzdG9yeSBpcyBtaXNsZWFkaW5nPGJyPgotMUdCTTBJTDogSVRQVUk6V0lOTlQgLSBDb21wYXJlRWRpdG9ySW5wdXQjc2F2ZSBzaG91bGQgdGhyb3cgQ29yZUV4Y2VwdGlvbjxicj4KLTFHSTk5TEU6IElUUFVJOkFMTCAtIENvbXBhcmUgdmlld2VyIGRvZXMgbm90IHNob3cgbGFzdCBsaW5lIHdoZW4gaG9yaXpvbnRhbCBzY3JvbGwgYmFyIGlzIHByZXNlbnQ8YnI+Ci0xR0JCMzROOiBJVFBKVUk6V0lOMjAwMCAtIENvbXBhcmUgVmlld2VyIGRvZXNuJ3Qgc2Nyb2xsIHRvIGxhc3QgbGluZTxicj4KLTFHR1o4RE86IElUUEpVSTpXSU4gLSBNZXJnZVZpZXdlciBpbnZhbGlkIHNlbGVjdGlvbiByYW5nZTxicj4KLTFHSUlCSE06IElUUFVJOldJTjIwMDAgLSBQcm9ibGVtcyB3aGVuIGNvbXBhcmluZyB6aXAgZmlsZXM8YnI+Ci0xR0lLS09aOiBJVFBVSTpBTEwgLSBhbHQgY29weXJpZ2h0IHRleHQgaW4gaHRtbCBkb2MgbmVlZHMgdXBkYXRlPGJyPgotMUdJVVJOQjogSVRQVUk6QUxMIC0gcHJvcGVydHkgZmlsZSBvZiBFZGl0aW9uU2VsZWN0aW9uRGlhbG9nIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9uczxicj4KLTFHSVVTNkw6IElUUFVJOkFMTCAtIFRleHRNZXJnZVZpZXdlciB1c2VzIGRlcHJlY2F0ZWQgVGhyZWFkLnN0b3AoKTxicj4KLTFHSTNIRFo6IElUUEpVSTpBTEwgLSBDb21wYXJlOiBjb25mbGljdHMgd2l0aCBubyBhbmNlc3RvciBkb2VzIG5vdCBzaG93IGRpZmZlcmVuY2VzPGJyPgotMUdFVVgwRDogSVRQSlVJOkFMTCAtIG5vdCBzdGF0ZSBhd2FyZSB0b29sYmFyIGJ1dHRvbiBpbiBjb21wYXJlPGJyPgotCi08aDI+Ci1Qcm9ibGVtIHJlcG9ydHMgY2xvc2VkPC9oMj4KLTFHRjlZOUM6IElUUFVJOldJTjIwMDAgLSBEQ1I6IG9ubHkgZ2V0IGFuY2VzdG9yIHBhbmUgY29udGVudHMgaWYgcGFuZSBpcyB2aXNpYmxlPGJyPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyZmVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUmVzb3VyY2Ugc3RyaW5ncyBmb3IgQ29tcGFyZSBQbHVnLWluCi0jCi1wbHVnaW5OYW1lPSBDb21wYXJlIFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jCi0jIEV4dGVuc2lvbiBwb2ludCBuYW1lcwotIwotc3RyZWFtTWVyZ2Vycz0gU3RyZWFtIE1lcmdlcgotc3RydWN0dXJlQ3JlYXRvcnM9IFN0cnVjdHVyZSBDcmVhdG9yCi1zdHJ1Y3R1cmVNZXJnZVZpZXdlcnM9IFN0cnVjdHVyZSBNZXJnZSBWaWV3ZXIKLWNvbnRlbnRNZXJnZVZpZXdlcnM9IENvbnRlbnQgTWVyZ2UgVmlld2VyCi1jb250ZW50Vmlld2Vycz0gQ29udGVudCBWaWV3ZXIKLQotIwotIyBDb21wYXJlVUlQbHVnaW4KLSMKLUNvbXBhcmVVSVBsdWdpbi5kaWFsb2dUaXRsZT1Db21wYXJlCi1Db21wYXJlVUlQbHVnaW4ubm9BY3RpdmVXb3JrYmVuY2hQYWdlPUNhbm5vdCBmaW5kIGFjdGl2ZSB3b3JrYmVuY2ggcGFnZQotQ29tcGFyZVVJUGx1Z2luLmNvbXBhcmVGYWlsZWQ9Q29tcGFyZSBGYWlsZWQKLUNvbXBhcmVVSVBsdWdpbi5vcGVuRWRpdG9yRXJyb3I9UHJvYmxlbXMgT3BlbmluZyBFZGl0b3IKLUNvbXBhcmVVSVBsdWdpbi5ub0RpZmZlcmVuY2VzPVRoZXJlIGFyZSBubyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBpbnB1dHMuCi0KLUNvbXBhcmVVSVBsdWdpbi50YXJnZXRJZEF0dHJpYnV0ZU1pc3Npbmc9dGFyZ2V0IGlkIGF0dHJpYnV0ZSAnJ3swfScnIG1pc3NpbmcKLUNvbXBhcmVVSVBsdWdpbi5jb250ZW50VHlwZU5vdEZvdW5kPWNvbnRlbnQgdHlwZSAnJ3swfScnIG5vdCBmb3VuZAotQ29tcGFyZVVJUGx1Z2luLnRhcmdldE5vdEZvdW5kPXRhcmdldCAnJ3swfScnIG5vdCBmb3VuZAotQ29tcGFyZVVJUGx1Z2luLnVuZXhwZWN0ZWRUYWc9ZXhwZWN0ZWQgdGFnICcnezF9JycsIGdvdCAnJ3swfScnCi0KLSMKLSMgQ29tcGFyZSBFZGl0b3IKLSMKLWRlZmF1bHRDb21wYXJlRWRpdG9yLm5hbWU9IERlZmF1bHQgQ29tcGFyZSBFZGl0b3IKLUNvbXBhcmVFZGl0b3Iuc2F2ZUVycm9yLnRpdGxlPSBTYXZlIEVycm9yCi1Db21wYXJlRWRpdG9yLmNhbnRTYXZlRXJyb3I9IENhbm5vdCBzYXZlIGNvbnRlbnRzICh7MH0pCi1Db21wYXJlRWRpdG9yLmludmFsaWRJbnB1dD1JbnZhbGlkIGlucHV0OiBub3QgYSBDb21wYXJlRWRpdG9ySW5wdXQKLUNvbXBhcmVFZGl0b3IuZXJyb3Iuc2V0aW5wdXQudGl0bGU9UHJvYmxlbSBvcGVuaW5nIGlucHV0Ci1Db21wYXJlRWRpdG9yLmVycm9yLnNldGlucHV0Lm1lc3NhZ2U9Q2Fubm90IG9wZW4gaW5wdXQ6Ci0KLSMKLSMgQ29tbWFuZHMKLSMKLWNvbXBhcmVDYXRlZ29yeS5uYW1lPSBDb21wYXJlCi1jb21wYXJlQ2F0ZWdvcnkuZGVzY3JpcHRpb249IENvbXBhcmUgY29tbWFuZCBjYXRlZ29yeQotCi1Db21tYW5kLmNvcHlSaWdodFRvTGVmdC5uYW1lPSBDb3B5IGZyb20gUmlnaHQgdG8gTGVmdAotQ29tbWFuZC5jb3B5UmlnaHRUb0xlZnQuZGVzY3JpcHRpb249IENvcHkgQ3VycmVudCBDaGFuZ2UgZnJvbSBSaWdodCB0byBMZWZ0Ci0KLUNvbW1hbmQuY29weUxlZnRUb1JpZ2h0Lm5hbWU9IENvcHkgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci1Db21tYW5kLmNvcHlMZWZ0VG9SaWdodC5kZXNjcmlwdGlvbj0gQ29weSBDdXJyZW50IENoYW5nZSBmcm9tIExlZnQgdG8gUmlnaHQKLQotQ29tbWFuZC5jb3B5QWxsUmlnaHRUb0xlZnQubmFtZT0gQ29weSBBbGwgZnJvbSBSaWdodCB0byBMZWZ0Ci1Db21tYW5kLmNvcHlBbGxSaWdodFRvTGVmdC5kZXNjcmlwdGlvbj0gQ29weSBBbGwgQ2hhbmdlcyBmcm9tIFJpZ2h0IHRvIExlZnQKLQotQ29tbWFuZC5jb3B5QWxsTGVmdFRvUmlnaHQubmFtZT0gQ29weSBBbGwgZnJvbSBMZWZ0IHRvIFJpZ2h0Ci1Db21tYW5kLmNvcHlBbGxMZWZ0VG9SaWdodC5kZXNjcmlwdGlvbj0gQ29weSBBbGwgQ2hhbmdlcyBmcm9tIExlZnQgdG8gUmlnaHQKLQotQ29tbWFuZC5zZWxlY3ROZXh0Q2hhbmdlLm5hbWU9IFNlbGVjdCBOZXh0IENoYW5nZQotQ29tbWFuZC5zZWxlY3ROZXh0Q2hhbmdlLmRlc2NyaXB0aW9uPSBTZWxlY3QgTmV4dCBDaGFuZ2UKLQotQ29tbWFuZC5zZWxlY3RQcmV2aW91c0NoYW5nZS5uYW1lPSBTZWxlY3QgUHJldmlvdXMgQ2hhbmdlCi1Db21tYW5kLnNlbGVjdFByZXZpb3VzQ2hhbmdlLmRlc2NyaXB0aW9uPSBTZWxlY3QgUHJldmlvdXMgQ2hhbmdlCi0KLQotIwotIyBDb250ZXh0IG1lbnUgJiBhY3Rpb25zCi0jCi1Db21wYXJlV2l0aE1lbnUubGFiZWw9IENvbXAmYXJlIFdpdGgKLQotQ29tcGFyZVdpdGhFYWNoT3RoZXJBY3Rpb24ubGFiZWw9ICZFYWNoIE90aGVyCi1Db21wYXJlV2l0aEVhY2hPdGhlckFjdGlvbi50b29sdGlwPSBDb21wYXJlIHRoZSBTZWxlY3RlZCBSZXNvdXJjZXMKLQotVGVhbU1lbnUubGFiZWw9IFQmZWFtCi0KLUNvbXBhcmVXaXRoUGF0Y2hBY3Rpb24ubGFiZWw9ICZBcHBseSBQYXRjaC4uLgotQ29tcGFyZVdpdGhQYXRjaEFjdGlvbi50b29sdGlwPSBBcHBseSBhIFBhdGNoIHRvIHRoZSBTZWxlY3RlZCBSZXNvdXJjZXMKLQotQ29tcGFyZVdpdGhIaXN0b3J5QWN0aW9uLmxhYmVsPSAmTG9jYWwgSGlzdG9yeS4uLgotQ29tcGFyZVdpdGhIaXN0b3J5QWN0aW9uLnRvb2x0aXA9IENvbXBhcmUgdGhlIFNlbGVjdGVkIFJlc291cmNlIHdpdGggTG9jYWwgSGlzdG9yeQotCi1SZXBsYWNlV2l0aE1lbnUubGFiZWw9IFJlcCZsYWNlIFdpdGgKLQotUmVwbGFjZUZyb21IaXN0b3J5QWN0aW9uLmxhYmVsPSAmTG9jYWwgSGlzdG9yeS4uLgotUmVwbGFjZUZyb21IaXN0b3J5QWN0aW9uLnRvb2x0aXA9IFJlcGxhY2UgdGhlIFNlbGVjdGVkIFJlc291cmNlIHdpdGggTG9jYWwgSGlzdG9yeQotCi1SZXBsYWNlV2l0aFByZXZpb3VzRnJvbUhpc3RvcnlBY3Rpb24ubGFiZWw9ICZQcmV2aW91cyBmcm9tIExvY2FsIEhpc3RvcnkKLVJlcGxhY2VXaXRoUHJldmlvdXNGcm9tSGlzdG9yeUFjdGlvbi50b29sdGlwPSBSZXBsYWNlIHRoZSBTZWxlY3RlZCBSZXNvdXJjZSB3aXRoIHRoZSBQcmV2aW91cyBmcm9tIExvY2FsIEhpc3RvcnkKLQotYWRkRnJvbUhpc3RvcnlBY3Rpb24ubGFiZWw9IFJlc3RvcmUgZnJvbSBMb2NhbCBIaXN0b3ImeS4uLgotYWRkRnJvbUhpc3RvcnlBY3Rpb24udG9vbHRpcD0gUmVzdG9yZSBEZWxldGVkIEZpbGVzIGZyb20gTG9jYWwgSGlzdG9yeQotCi0jCi0jIFByZWZlcmVuY2UgUGFnZQotIwotQ29tcGFyZVByZWZlcmVuY2VQYWdlLm5hbWU9IENvbXBhcmUvUGF0Y2gKLQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmdlbmVyYWxUYWIubGFiZWw9ICZHZW5lcmFsCi0KLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5zdHJ1Y3R1cmVDb21wYXJlLmxhYmVsPSAmT3BlbiBzdHJ1Y3R1cmUgY29tcGFyZSBhdXRvbWF0aWNhbGx5Ci1Db21wYXJlUHJlZmVyZW5jZVBhZ2Uuc2hvd01vcmVJbmZvLmxhYmVsPSAmU2hvdyBhZGRpdGlvbmFsIGNvbXBhcmUgaW5mb3JtYXRpb24gaW4gdGhlIHN0YXR1cyBsaW5lCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UuaWdub3JlV2hpdGVzcGFjZS5sYWJlbD0gSWdub3JlICZ3aGl0ZSBzcGFjZQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnNhdmVCZWZvcmVQYXRjaGluZy5sYWJlbD0gQSZ1dG9tYXRpY2FsbHkgc2F2ZSBkaXJ0eSBlZGl0b3JzIGJlZm9yZSBwYXRjaGluZwotCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UuZmlsdGVyLmRlc2NyaXB0aW9uPSBFbnRlciBtZW1iZXIgbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSAnQ29tcGFyZSBXaXRoIEVhY2ggT3RoZXInLlxuTGlzdCBpcyBjb21tYSBzZXBhcmF0ZWQgKGUuZy4gJyouY2xhc3MsIC5wcm9qZWN0LCBiaW4vJykKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5maWx0ZXIubGFiZWw9ICZGaWx0ZXJlZCBNZW1iZXJzOgotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmZpbHRlci5pbnZhbGlkc2VnbWVudC5lcnJvcj0gRmlsdGVyIGlzIGludmFsaWQ6IHswfQotCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UudGV4dENvbXBhcmVUYWIubGFiZWw9ICZUZXh0IENvbXBhcmUKLQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmluaXRpYWxseVNob3dBbmNlc3RvclBhbmUubGFiZWw9IEluaXRpYWxseSBzaG93IGEmbmNlc3RvciBwYW5lCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2Uuc2hvd1BzZXVkb0NvbmZsaWN0cy5sYWJlbD0gU2hvdyAmcHNldWRvIGNvbmZsaWN0cwotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnN5bmNocm9uaXplU2Nyb2xsaW5nLmxhYmVsPSBTeW5jaHJvbml6ZSAmc2Nyb2xsaW5nIGJldHdlZW4gcGFuZXMgaW4gY29tcGFyZSB2aWV3ZXJzCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UudXNlU2luZ2xlTGluZS5sYWJlbD0gQ29ubmVjdCAmcmFuZ2VzIHdpdGggc2luZ2xlIGxpbmUKLQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnByZXZpZXcubGFiZWw9IFByZXZpZXc6Ci1Db21wYXJlUHJlZmVyZW5jZVBhZ2UuYW5jZXN0b3IubGFiZWw9IENvbW1vbiBBbmNlc3RvcgotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmxlZnQubGFiZWw9IExvY2FsCi1Db21wYXJlUHJlZmVyZW5jZVBhZ2UucmlnaHQubGFiZWw9IFJlbW90ZQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmJhY2tncm91bmRDb2xvcjEubGFiZWw9IEJhYyZrZ3JvdW5kIENvbG9yOgotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmJhY2tncm91bmRDb2xvcjIubGFiZWw9IFMmeXN0ZW0gRGVmYXVsdAotQ29tcGFyZVByZWZlcmVuY2VQYWdlLmJhY2tncm91bmRDb2xvcjMubGFiZWw9IEMmdXN0b20KLQotIyBDb21wYXJlIGVkaXRvciBjb250ZW50cyBmb3IgQ29tcGFyZSBwcmV2aWV3IHBhZ2UKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS5wcmV2aWV3QW5jZXN0b3I9IDFcbjJcbjNcbmNvbmZsaWN0XG40XG41Ci1Db21wYXJlUHJlZmVyZW5jZVBhZ2UucHJldmlld0xlZnQ9IDFcbjJcbm91dGdvaW5nIGFkZGl0aW9uXG4zXG5vdXRnb2luZyBjaGFuZ2VcbjRcbnBzZXVkbyBjb25mbGljdFxuNQotQ29tcGFyZVByZWZlcmVuY2VQYWdlLnByZXZpZXdSaWdodD0gMVxuaW5jb21pbmcgYWRkaXRpb25cbmluY29taW5nIGFkZGl0aW9uXG4yXG4zXG5pbmNvbWluZyBjaGFuZ2VcbjRcbnBzZXVkbyBjb25mbGljdFxuNQotCi10ZXh0Q29tcGFyZUFwcGVhcmFuY2UubGFiZWw9VGV4dCBDb21wYXJlCi0KLWNvbXBhcmVJbmNvbWluZ0NvbG9yLmxhYmVsPSBJbmNvbWluZyBjaGFuZ2UgY29sb3IKLWNvbXBhcmVJbmNvbWluZ0NvbG9yLmRlc2NyaXB0aW9uPSBUaGUgY29sb3IgdXNlZCB0byBpbmRpY2F0ZSBhbiBpbmNvbWluZyBjaGFuZ2UgaW4gY29tcGFyZSBhbmQgbWVyZ2UgdG9vbHMuCi1jb21wYXJlT3V0Z29pbmdDb2xvci5sYWJlbD0gT3V0Z29pbmcgY2hhbmdlIGNvbG9yCi1jb21wYXJlT3V0Z29pbmdDb2xvci5kZXNjcmlwdGlvbj0gVGhlIGNvbG9yIHVzZWQgdG8gaW5kaWNhdGUgYW4gb3V0Z29pbmcgY2hhbmdlIGluIGNvbXBhcmUgYW5kIG1lcmdlIHRvb2xzLgotY29tcGFyZUNvbmZsaWN0Q29sb3IubGFiZWw9IENvbmZsaWN0aW5nIGNoYW5nZSBjb2xvcgotY29tcGFyZUNvbmZsaWN0Q29sb3IuZGVzY3JpcHRpb249IFRoZSBjb2xvciB1c2VkIHRvIGluZGljYXRlIGEgY29uZmxpY3RpbmcgY2hhbmdlIGluIGNvbXBhcmUgYW5kIG1lcmdlIHRvb2xzLgotY29tcGFyZVJlc29sdmVkQ29sb3IubGFiZWw9IFJlc29sdmVkIGNoYW5nZSBjb2xvcgotY29tcGFyZVJlc29sdmVkQ29sb3IuZGVzY3JpcHRpb249IFRoZSBjb2xvciB1c2VkIHRvIGluZGljYXRlIGEgcmVzb2x2ZWQgY2hhbmdlIGluIG1lcmdlIHRvb2xzLgotCi1jb21wYXJlRm9udERlZmluaXRvbi5sYWJlbD0gQ29tcGFyZSB0ZXh0IGZvbnQKLWNvbXBhcmVGb250RGVmaW5pdG9uLmRlc2NyaXB0aW9uPSBUaGUgY29tcGFyZSB0ZXh0IGZvbnQgaXMgdXNlZCBieSB0ZXh0dWFsIGNvbXBhcmUvbWVyZ2UgdG9vbHMuCi0KLSMgTmV3IFVJCi0jQ29tcGFyZVByZWZlcmVuY2VQYWdlLnVzZVNwbGluZXMubGFiZWw9IFVzZSBzcGxpbmVzIGluIGNlbnRlciBwYW5lbAotI0NvbXBhcmVQcmVmZXJlbmNlUGFnZS51c2VSZXNvbHZlVUkubGFiZWw9IFVzZSBuZXcgcmVzb2x2ZSBVSQotCi1Db21wYXJlRWRpdG9ySW5wdXQuZGVmYXVsdFRpdGxlPSBDb21wYXJlCi0KLSMKLSMgVG9vbGJhciBhY3Rpb25zCi0jCi1hY3Rpb24uSWdub3JlV2hpdGVTcGFjZS5sYWJlbD1JZ25vcmUgV2hpdGUgU3BhY2UKLWFjdGlvbi5JZ25vcmVXaGl0ZVNwYWNlLnRvb2x0aXA9SWdub3JlIFdoaXRlIFNwYWNlIFdoZXJlIEFwcGxpY2FibGUKLWFjdGlvbi5JZ25vcmVXaGl0ZVNwYWNlLmltYWdlPWV0b29sMTYvaWdub3Jld3NfZWRpdC5naWYKLQotYWN0aW9uLk5leHQubGFiZWw9TmV4dCBEaWZmZXJlbmNlCi1hY3Rpb24uTmV4dC50b29sdGlwPUdvIHRvIE5leHQgRGlmZmVyZW5jZQotYWN0aW9uLk5leHQuaW1hZ2U9ZWxjbDE2L25leHRfbmF2LmdpZgotCi1hY3Rpb24uUHJldmlvdXMubGFiZWw9UHJldmlvdXMgRGlmZmVyZW5jZQotYWN0aW9uLlByZXZpb3VzLnRvb2x0aXA9R28gdG8gUHJldmlvdXMgRGlmZmVyZW5jZQotYWN0aW9uLlByZXZpb3VzLmltYWdlPWVsY2wxNi9wcmV2X25hdi5naWYKLQotIwotIyBCdWlsdCBpbiBTdHJ1Y3R1cmUgQ3JlYXRvcnMKLSMKLVppcFN0cnVjdHVyZUNyZWF0b3IubmFtZT1aaXAgQXJjaGl2ZSBDb21wYXJlCi0KLSMKLSMgQ29tcGFyZSBEaWFsb2cKLSMKLUNvbXBhcmVEaWFsb2cuY29tbWl0QWN0aW9uLmxhYmVsPUNvbW1pdAotQ29tcGFyZURpYWxvZy5zYXZlRXJyb3JUaXRsZT1TYXZlIEVycm9yIAotQ29tcGFyZURpYWxvZy5zYXZlRXJyb3JNZXNzYWdlPUNhbm5vdCBzYXZlCi0KLSMKLSMgQ29tcGFyZSBXaXRoIEVhY2ggT3RoZXIKLSMKLVJlc291cmNlQ29tcGFyZS50YXNrTmFtZT1PcGVyYXRpb24gaW4gUHJvZ3Jlc3MuLi4KLVJlc291cmNlQ29tcGFyZS50d29XYXkudGl0bGU9Q29tcGFyZSAoezB9LXsxfSkKLVJlc291cmNlQ29tcGFyZS50d29XYXkudG9vbHRpcD1Ud28td2F5IGNvbXBhcmUgb2YgezB9IHdpdGggezF9Ci1SZXNvdXJjZUNvbXBhcmUudGhyZWVXYXkudGl0bGU9Q29tcGFyZSAoezB9LXsxfS17Mn0pCi1SZXNvdXJjZUNvbXBhcmUudGhyZWVXYXkudG9vbHRpcD1UaHJlZS13YXkgY29tcGFyZSBvZiB7MX0gYW5kIHsyfSByZWxhdGl2ZSB0byBjb21tb24gYW5jZXN0b3IgezB9Ci0KLSMKLSMgRGlmZlRyZWVWaWV3ZXIgJiBEaWZmTm9kZXMKLSMKLURpZmZUcmVlVmlld2VyLnRpdGxlPSBTdHJ1Y3R1cmUgQ29tcGFyZQotRGlmZk5vZGUubm9OYW1lPSA8bm8gbmFtZT4KLURpZmZOb2RlLm5hbWVGb3JtYXQ9IHswfSAvIHsxfQotCi0jCi0jIERpZmZlcmVuY2luZyBlbmdpbmUKLSMKLURpZmZlcmVuY2VyLnByb2dyZXNzRm9ybWF0PSBDb21wYXJpbmcgezB9Ci0KLSMKLSMgUGF0Y2g6IHJlamVjdGVkIHBhdGNoIG1hcmtlcnMKLSMKLXJlamVjdGVkUGF0Y2hNYXJrZXIubmFtZT0gUmVqZWN0ZWQgUGF0Y2gKLQotIwotIyBWYWxpZGF0ZUVkaXQKLSMKLVZhbGlkYXRlRWRpdC5lcnJvci51bmFibGVfdG9fcGVyZm9ybT0gT3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQuCi1WYWxpZGF0ZUVkaXQuZXJyb3IuZmlsZU1vZGlmaWVkPSBGaWxlICcnezB9JycgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BlcmF0aW9uLgotVmFsaWRhdGVFZGl0LmVycm9yLnN0aWxsUmVhZG9ubHk9IEZpbGUgJyd7MH0nJyBpcyByZWFkLW9ubHkuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzVkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZSIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuQ29tcGFyZVVJUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJjb21wYXJlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBDb21wYXJlIGV4dGVuc2lvbiBwb2ludCBkZWZpbml0aW9ucyAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InN0cmVhbU1lcmdlcnMiIG5hbWU9IiVzdHJlYW1NZXJnZXJzIiBzY2hlbWE9InNjaGVtYS9zdHJlYW1NZXJnZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InN0cnVjdHVyZUNyZWF0b3JzIiBuYW1lPSIlc3RydWN0dXJlQ3JlYXRvcnMiIHNjaGVtYT0ic2NoZW1hL3N0cnVjdHVyZUNyZWF0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InN0cnVjdHVyZU1lcmdlVmlld2VycyIgbmFtZT0iJXN0cnVjdHVyZU1lcmdlVmlld2VycyIgc2NoZW1hPSJzY2hlbWEvc3RydWN0dXJlTWVyZ2VWaWV3ZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRlbnRNZXJnZVZpZXdlcnMiIG5hbWU9IiVjb250ZW50TWVyZ2VWaWV3ZXJzIiBzY2hlbWE9InNjaGVtYS9jb250ZW50TWVyZ2VWaWV3ZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRlbnRWaWV3ZXJzIiBuYW1lPSIlY29udGVudFZpZXdlcnMiIHNjaGVtYT0ic2NoZW1hL2NvbnRlbnRWaWV3ZXJzLmV4c2QiLz4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0gICAgICA8dGhlbWVFbGVtZW50Q2F0ZWdvcnkKLSAgICAgICAgICAgIGxhYmVsPSIldGV4dENvbXBhcmVBcHBlYXJhbmNlLmxhYmVsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciI+Ci0gICAgICA8L3RoZW1lRWxlbWVudENhdGVnb3J5PgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVjb21wYXJlSW5jb21pbmdDb2xvci5sYWJlbCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciIKLSAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9CTFVFIgotICAgICAgICAgICAgaWQ9IklOQ09NSU5HX0NPTE9SIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb21wYXJlSW5jb21pbmdDb2xvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVjb21wYXJlT3V0Z29pbmdDb2xvci5sYWJlbCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciIKLSAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9CTEFDSyIKLSAgICAgICAgICAgIGlkPSJPVVRHT0lOR19DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY29tcGFyZU91dGdvaW5nQ29sb3IuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxjb2xvckRlZmluaXRpb24KLSAgICAgICAgICAgIGxhYmVsPSIlY29tcGFyZUNvbmZsaWN0Q29sb3IubGFiZWwiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRtZXJnZXZpZXdlci5UZXh0TWVyZ2VWaWV3ZXIiCi0gICAgICAgICAgICB2YWx1ZT0iQ09MT1JfUkVEIgotICAgICAgICAgICAgaWQ9IkNPTkZMSUNUSU5HX0NPTE9SIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb21wYXJlQ29uZmxpY3RDb2xvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29sb3JEZWZpbml0aW9uPgotICAgICAgPGNvbG9yRGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVjb21wYXJlUmVzb2x2ZWRDb2xvci5sYWJlbCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciIKLSAgICAgICAgICAgIHZhbHVlPSJDT0xPUl9HUkVFTiIKLSAgICAgICAgICAgIGlkPSJSRVNPTFZFRF9DT0xPUiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY29tcGFyZVJlc29sdmVkQ29sb3IuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbG9yRGVmaW5pdGlvbj4KLSAgICAgIDxmb250RGVmaW5pdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVjb21wYXJlRm9udERlZmluaXRvbi5sYWJlbCIKLSAgICAgICAgICAgIGRlZmF1bHRzVG89Im9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250IgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciI+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNvbXBhcmVGb250RGVmaW5pdG9uLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9mb250RGVmaW5pdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icmVqZWN0ZWRQYXRjaE1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVyZWplY3RlZFBhdGNoTWFya2VyLm5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiPgotICAgICAgPC9zdXBlcj4KLSAgICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L3BlcnNpc3RlbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiVkZWZhdWx0Q29tcGFyZUVkaXRvci5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L2NvbXBhcmVfdmlldy5naWYiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlRWRpdG9yIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlQ29tcGFyZVByZWZlcmVuY2VQYWdlLm5hbWUiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtiZW5jaCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPCEtLSBjb21tYW5kcyBhbmQgdGhlaXIgYmluZGluZ3MgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlY29tcGFyZUNhdGVnb3J5Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbXBhcmVDYXRlZ29yeS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnVpLmNhdGVnb3J5LmNvbXBhcmUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlQ29tbWFuZC5jb3B5UmlnaHRUb0xlZnQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQ29tbWFuZC5jb3B5UmlnaHRUb0xlZnQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnVpLmNhdGVnb3J5LmNvbXBhcmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb3B5UmlnaHRUb0xlZnQiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVDb21tYW5kLmNvcHlMZWZ0VG9SaWdodC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVDb21tYW5kLmNvcHlMZWZ0VG9SaWdodC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUudWkuY2F0ZWdvcnkuY29tcGFyZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvcHlMZWZ0VG9SaWdodCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJUNvbW1hbmQuY29weUFsbFJpZ2h0VG9MZWZ0Lm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbW1hbmQuY29weUFsbFJpZ2h0VG9MZWZ0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS51aS5jYXRlZ29yeS5jb21wYXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29weUFsbFJpZ2h0VG9MZWZ0Ij4KLSAgICAgIDwvY29tbWFuZD4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSIlQ29tbWFuZC5jb3B5QWxsTGVmdFRvUmlnaHQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQ29tbWFuZC5jb3B5QWxsTGVmdFRvUmlnaHQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnVpLmNhdGVnb3J5LmNvbXBhcmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb3B5QWxsTGVmdFRvUmlnaHQiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVDb21tYW5kLnNlbGVjdE5leHRDaGFuZ2UubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQ29tbWFuZC5zZWxlY3ROZXh0Q2hhbmdlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS51aS5jYXRlZ29yeS5jb21wYXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuc2VsZWN0TmV4dENoYW5nZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJUNvbW1hbmQuc2VsZWN0UHJldmlvdXNDaGFuZ2UubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQ29tbWFuZC5zZWxlY3RQcmV2aW91c0NoYW5nZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUudWkuY2F0ZWdvcnkuY29tcGFyZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLnNlbGVjdFByZXZpb3VzQ2hhbmdlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5SZXNvdXJjZU1hcHBpbmciCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5NZW51R3JvdXBzIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJVJlcGxhY2VXaXRoTWVudS5sYWJlbCIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJyZXBsYWNlV2l0aE1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0icmVwbGFjZVdpdGhHcm91cCI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJUNvbXBhcmVXaXRoTWVudS5sYWJlbCIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJjb21wYXJlV2l0aE1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iY29tcGFyZVdpdGhHcm91cCI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJVRlYW1NZW51LmxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9InRlYW0ubWFpbiI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJncm91cDEiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQWN0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ29tcGFyZVdpdGhFYWNoT3RoZXJBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlQ29tcGFyZVdpdGhFYWNoT3RoZXJBY3Rpb24udG9vbHRpcCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iY29tcGFyZVdpdGhNZW51L2NvbXBhcmVXaXRoR3JvdXAiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIyKyIKLSAgICAgICAgICAgICAgIGlkPSJjb21wYXJlV2l0aEVhY2hPdGhlciI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ29tcGFyZVdpdGhQYXRjaEFjdGlvbi5sYWJlbCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVDb21wYXJlV2l0aFBhdGNoQWN0aW9uLnRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5wYXRjaC5Db21wYXJlV2l0aFBhdGNoQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9InRlYW0ubWFpbi9ncm91cDEiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9ImNvbXBhcmVXaXRoUGF0Y2giPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLlJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbiI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVSZXBsYWNlV2l0aE1lbnUubGFiZWwiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0icmVwbGFjZVdpdGhNZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9InJlcGxhY2VXaXRoR3JvdXAiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVJlcGxhY2VGcm9tSGlzdG9yeUFjdGlvbi5sYWJlbCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVSZXBsYWNlRnJvbUhpc3RvcnlBY3Rpb24udG9vbHRpcCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlJlcGxhY2VXaXRoRWRpdGlvbkFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJyZXBsYWNlV2l0aE1lbnUvcmVwbGFjZVdpdGhHcm91cCIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0icmVwbGFjZUZyb21IaXN0b3J5Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVSZXBsYWNlV2l0aFByZXZpb3VzRnJvbUhpc3RvcnlBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlUmVwbGFjZVdpdGhQcmV2aW91c0Zyb21IaXN0b3J5QWN0aW9uLnRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5SZXBsYWNlV2l0aFByZXZpb3VzRWRpdGlvbkFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJyZXBsYWNlV2l0aE1lbnUvcmVwbGFjZVdpdGhHcm91cCIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0icmVwbGFjZVdpdGhQcmV2aW91c0Zyb21IaXN0b3J5Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlV2l0aEVkaXRpb25BY3Rpb24iPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ29tcGFyZVdpdGhNZW51LmxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9ImNvbXBhcmVXaXRoTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJjb21wYXJlV2l0aEdyb3VwIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVDb21wYXJlV2l0aEhpc3RvcnlBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlQ29tcGFyZVdpdGhIaXN0b3J5QWN0aW9uLnRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5Db21wYXJlV2l0aEVkaXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iY29tcGFyZVdpdGhNZW51L2NvbXBhcmVXaXRoR3JvdXAiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9ImNvbXBhcmVXaXRoSGlzdG9yeSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5BZGRGcm9tSGlzdG9yeUFjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFkZEZyb21IaXN0b3J5QWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFkZEZyb21IaXN0b3J5QWN0aW9uLnRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5BZGRGcm9tSGlzdG9yeUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJyZXBsYWNlV2l0aE1lbnUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9ImFkZEZyb21IaXN0b3J5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuc3RyZWFtTWVyZ2VycyI+Ci0gICAgICA8c3RyZWFtTWVyZ2VyCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ0eHQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZS5UZXh0U3RyZWFtTWVyZ2VyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuVGV4dFN0cmVhbU1lcmdlciI+Ci0gICAgICA8L3N0cmVhbU1lcmdlcj4KLSAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgIAkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiCi0gICAgICAJCXN0cmVhbU1lcmdlcklkPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLm1lcmdlLlRleHRTdHJlYW1NZXJnZXIiPgotICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlQ3JlYXRvcnMiPgotICAgICAgPHN0cnVjdHVyZUNyZWF0b3IKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9InppcCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLlppcEZpbGVTdHJ1Y3R1cmVDcmVhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuWmlwRmlsZVN0cnVjdHVyZUNyZWF0b3IiPgotICAgICAgPC9zdHJ1Y3R1cmVDcmVhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRNZXJnZVZpZXdlcnMiPgotICAgICAgPHZpZXdlcgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0iY2xhc3MsZXhlLGRsbCxiaW5hcnksemlwLGphciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkJpbmFyeUNvbXBhcmVWaWV3ZXJDcmVhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuQmluYXJ5Q29tcGFyZVZpZXdlckNyZWF0b3IiPgotICAgICAgPC92aWV3ZXI+Ci0gICAgICA8dmlld2VyCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ0eHQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5UZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuVGV4dE1lcmdlVmlld2VyQ3JlYXRvciI+Ci0gICAgICA8L3ZpZXdlcj4KLSAgICAgIDx2aWV3ZXIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9ImdpZixqcGciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5JbWFnZU1lcmdlVmlld2VyQ3JlYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlLkltYWdlTWVyZ2VWaWV3ZXJDcmVhdG9yIj4KLSAgICAgIDwvdmlld2VyPgotICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiCi0gICAgICAgICAgICBjb250ZW50TWVyZ2VWaWV3ZXJJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5UZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yIj4KLQkgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRWaWV3ZXJzIj4KLSAgICAgIDx2aWV3ZXIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9InR4dCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlRleHRWaWV3ZXJDcmVhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuVGV4dFZpZXdlckNyZWF0b3IiPgotICAgICAgPC92aWV3ZXI+Ci0gICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLSAgICAgICAgICAgIGNvbnRlbnRWaWV3ZXJJZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5UZXh0Vmlld2VyQ3JlYXRvciI+Ci0JICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL2NvbnRlbnRNZXJnZVZpZXdlcnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL2NvbnRlbnRNZXJnZVZpZXdlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxMjc1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9jb250ZW50TWVyZ2VWaWV3ZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuY29tcGFyZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuY29tcGFyZSIgaWQ9ImNvbnRlbnRNZXJnZVZpZXdlcnMiIG5hbWU9IkNvbnRlbnRNZXJnZSBWaWV3ZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgY29tcGFyZS9tZXJnZSAKLXZpZXdlcnMgZm9yIHNwZWNpZmljIGNvbnRlbnQgdHlwZXMuIFRoZSB2aWV3ZXIgaXMgZXhwZWN0ZWQgdG8gCi1leHRlbmQgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXImbHQ7L3NhbXAmZ3Q7LiAKLUhvd2V2ZXIsIHNpbmNlIHZpZXdlcnMgZG9uJmFwb3M7dCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgCi10aGUgZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoZSBmYWN0b3J5IGludGVyZmFjZSAKLWZvciB2aWV3ZXJzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3ImbHQ7L3NhbXAmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aWV3ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGVCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSB2aWV3ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgZmFjdG9yeSBmb3IgdGhlIAotY29udGVudCBtZXJnZSB2aWV3ZXIgYW5kIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciZsdDsvc2FtcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOm9yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIGUuZy4gJnF1b3Q7amF2YSwgZ2lmJnF1b3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlQmluZGluZyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudE1lcmdlVmlld2VySWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbXBhcmUvbWVyZ2Ugdmlld2VyIAotZm9yIHRleHQgZmlsZXMgKGV4dGVuc2lvbiAmcXVvdDt0eHQmcXVvdDspOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OyAKLSZsdDtleHRlbnNpb24gcG9pbnQgPSAmcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRNZXJnZVZpZXdlcnMmcXVvdDsmZ3Q7IAotICAgICAmbHQ7dmlld2VyIAotICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyJnF1b3Q7IAotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5UZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yJnF1b3Q7IAotICAgICAgICAgZXh0ZW5zaW9ucz0mcXVvdDt0eHQmcXVvdDsgCi0gICAgLyZndDsgCi0mbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY29udHJpYnV0ZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciZsdDsvY29kZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIENvbXBhcmUgVUkgcGx1Z2luIGRlZmluZXMgY29udGVudCB2aWV3ZXJzIGZvciB0ZXh0LCBiaW5hcnkgY29udGVudHMsIGFuZCBpbWFnZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9jb250ZW50Vmlld2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvY29udGVudFZpZXdlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwODg2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9jb250ZW50Vmlld2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmNvbXBhcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUiIGlkPSJjb250ZW50Vmlld2VycyIgbmFtZT0iQ29udGVudCBWaWV3ZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgCi12aWV3ZXJzIGZvciBzcGVjaWZpYyBjb250ZW50IHR5cGVzLiAKLVRoZXNlIHZpZXdlcnMgYXJlIHVzZWQgaW4gdGhlICZsdDtzYW1wJmd0O0VkaXRpb25TZWxlY3Rpb25EaWFsb2cmbHQ7L3NhbXAmZ3Q7IHdoZW4gcHJlc2VudGluZyBhbiBlZGl0aW9uIG9mIGEgcmVzb3VyY2Ugb3IgYSBzdWJzZWN0aW9uIHRoZXJlb2YuIFRoZSB2aWV3ZXIgaXMgZXhwZWN0ZWQgdG8gZXh0ZW5kICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyJmx0Oy9zYW1wJmd0Oy4gCi1Ib3dldmVyIHNpbmNlIHZpZXdlcnMgZG9uJmFwb3M7dCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciB0aGUgZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoZSBmYWN0b3J5IGludGVyZmFjZSBmb3Igdmlld2VycyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlQmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlld2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgdmlld2VyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGZhY3RvcnkgZm9yIHRoZSAKLWNvbnRlbnQgdmlld2VyIGFuZCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3ImbHQ7L3NhbXAmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjpvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9ucyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyBlLmcuICZxdW90O2phdmEsIGdpZiZxdW90OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRWaWV3ZXJJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgdmlld2VyIGZvciB0ZXh0IAotZmlsZXMgKGV4dGVuc2lvbiAmcXVvdDt0eHQmcXVvdDspOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQgPSAmcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRWaWV3ZXJzJnF1b3Q7Jmd0OyAKLSAgICAgJmx0O3ZpZXdlciAKLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVGV4dFZpZXdlciZxdW90OyAKLSAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVGV4dFZpZXdlckNyZWF0b3ImcXVvdDsgCi0gICAgICAgICBleHRlbnNpb25zPSZxdW90O3R4dCZxdW90OyAKLSAgICAvJmd0OyAKLSZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBjb250cmlidXRlZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yJmx0Oy9jb2RlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgQ29tcGFyZSBVSSBwbHVnaW4gZGVmaW5lcyBjb250ZW50IHZpZXdlcnMgZm9yIAotdGV4dCBhbmQgaW1hZ2VzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RyZWFtTWVyZ2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RyZWFtTWVyZ2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNiMjExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL3N0cmVhbU1lcmdlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5jb21wYXJlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb21wYXJlIiBpZD0ic3RyZWFtTWVyZ2VycyIgbmFtZT0iU3RyZWFtIE1lcmdlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIGEgc3RyZWFtIG1lcmdlciAKLWZvciBzcGVjaWZpYyBjb250ZW50IHR5cGVzLiBUaGUgc3RyZWFtIG1lcmdlciBpcyBleHBlY3RlZCB0byBwZXJmb3JtIGEgdGhyZWUtd2F5IG1lcmdlCi1vbiB0aHJlZSBpbnB1dCBzdHJlYW1zIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBhbiBvdXRwdXQgc3RyZWFtLgotVGhlIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbU1lcmdlciZsdDsvc2FtcCZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0cmVhbU1lcmdlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50VHlwZUJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0cmVhbU1lcmdlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhlIHN0cmVhbSBtZXJnZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbU1lcmdlciZsdDsvc2FtcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbU1lcmdlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbnMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgZS5nLiAmcXVvdDtqYXZhLCBwcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlQmluZGluZyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RyZWFtTWVyZ2VySWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzdHJlYW0gbWVyZ2VyIGZvciBwcm9wZXJ0eSBmaWxlcyAoZXh0ZW5zaW9uICZxdW90O3Byb3BlcnRpZXMmcXVvdDspOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQgPSAmcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLnN0cmVhbU1lcmdlcnMmcXVvdDsmZ3Q7IAotICAgICAmbHQ7c3RyZWFtTWVyZ2VyIAotICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZS5UZXh0U3RyZWFtTWVyZ2VyJnF1b3Q7IAotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5pbnRlcm5hbC5tZXJnZS5UZXh0U3RyZWFtTWVyZ2VyJnF1b3Q7IAotICAgICAgICAgZXh0ZW5zaW9ucz0mcXVvdDtwcm9wZXJ0aWVzJnF1b3Q7IAotICAgIC8mZ3Q7IAotJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dGVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbU1lcmdlciZsdDsvY29kZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIENvbXBhcmUgVUkgcGx1Z2luIGRlZmluZXMgYSBzdHJlYW0gbWVyZ2VyIGZvciBsaW5lIG9yaWVudGVkIHRleHQgZmlsZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJ1Y3R1cmVDcmVhdG9ycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RydWN0dXJlQ3JlYXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyZGZmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJ1Y3R1cmVDcmVhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmNvbXBhcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUiIGlkPSJzdHJ1Y3R1cmVDcmVhdG9ycyIgbmFtZT0iU3RydWN0dXJlIENyZWF0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgYSBzdHJ1Y3R1cmUgY3JlYXRvciAKLWZvciBzcGVjaWZpYyBjb250ZW50IHR5cGVzLiBUaGUgc3RydWN0dXJlIGNyZWF0b3IgaXMgZXhwZWN0ZWQgdG8gY3JlYXRlCi1hIHRyZWUgb2YgJmx0O3NhbXAmZ3Q7SVN0cnVjdHVyZUNvbXBhcmF0b3ImbHQ7L3NhbXAmZ3Q7cyBmb3IgYSBnaXZlbiBjb250ZW50LgotVGhpcyB0cmVlIGlzIHVzZWQgYXMgdGhlIGlucHV0IGZvciB0aGUgc3RydWN0dXJhbCBjb21wYXJlLgotVGhlIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNyZWF0b3ImbHQ7L3NhbXAmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdHJ1Y3R1cmVDcmVhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlQmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3RydWN0dXJlQ3JlYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhlIHN0cnVjdHVyZSBjcmVhdG9yCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDcmVhdG9yJmx0Oy9zYW1wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JU3RydWN0dXJlQ29tcGFyYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbnMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgZS5nLiAmcXVvdDtqYXZhLCBwcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlQmluZGluZyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RydWN0dXJlQ3JlYXRvcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzdHJ1Y3R1cmUgY3JlYXRvciBmb3IgCi1qYXZhIGZpbGVzIChleHRlbnNpb24gJnF1b3Q7amF2YSZxdW90Oyk6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludCA9ICZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlQ3JlYXRvcnMmcXVvdDsmZ3Q7IAotICAgICAmbHQ7c3RydWN0dXJlQ3JlYXRvciAKLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuSmF2YVN0cnVjdHVyZUNyZWF0b3ImcXVvdDsgCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLkphdmFTdHJ1Y3R1cmVDcmVhdG9yJnF1b3Q7IAotICAgICAgICAgZXh0ZW5zaW9ucz0mcXVvdDtqYXZhJnF1b3Q7IAotICAgIC8mZ3Q7IAotJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dGVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNyZWF0b3ImbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBDb21wYXJlIFVJIHBsdWdpbiBkZWZpbmVzIGEgc3RydWN0dXJlIGNyZWF0b3IgZm9yIHppcCBhcmNoaXZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL3N0cnVjdHVyZU1lcmdlVmlld2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RydWN0dXJlTWVyZ2VWaWV3ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDFkZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RydWN0dXJlTWVyZ2VWaWV3ZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuY29tcGFyZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuY29tcGFyZSIgaWQ9InN0cnVjdHVyZU1lcmdlVmlld2VycyIgbmFtZT0iU3RydWN0dXJlTWVyZ2UgVmlld2VycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIGNvbXBhcmUvbWVyZ2UgCi12aWV3ZXJzIGZvciBzdHJ1Y3R1cmFsIGNvbnRlbnQgdHlwZXMuIFRoZSB2aWV3ZXIgaXMgZXhwZWN0ZWQgdG8gCi1leHRlbmQgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXImbHQ7L3NhbXAmZ3Q7LiAKLUhvd2V2ZXIsIHNpbmNlIHZpZXdlcnMgZG9uJmFwb3M7dCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgCi10aGUgZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoZSBmYWN0b3J5IGludGVyZmFjZSAKLWZvciB2aWV3ZXJzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3ImbHQ7L3NhbXAmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aWV3ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGVCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSB2aWV3ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgZmFjdG9yeSBmb3IgdGhlIAotc3RydWN0dXJlIG1lcmdlIHZpZXdlciBhbmQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yJmx0Oy9zYW1wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI6b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbnMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgZS5nLiAmcXVvdDt6aXAsIGphciZxdW90OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cnVjdHVyZU1lcmdlVmlld2VySWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBjb21wYXJlL21lcmdlIHZpZXdlciAKLWZvciB6aXAgZmlsZXMgKGV4dGVuc2lvbiAmcXVvdDt6aXAmcXVvdDspOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQgPSAmcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZU1lcmdlVmlld2VycyZxdW90OyZndDsgCi0gICAgICZsdDt2aWV3ZXIgCi0gICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLlppcENvbXBhcmVWaWV3ZXImcXVvdDsgCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLlppcENvbXBhcmVWaWV3ZXJDcmVhdG9yJnF1b3Q7IAotICAgICAgICAgZXh0ZW5zaW9ucz0mcXVvdDt6aXAmcXVvdDsgCi0gICAgLyZndDsgCi0mbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY29udHJpYnV0ZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciZsdDsvY29kZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIENvbXBhcmUgVUkgcGx1Z2luIGRlZmluZXMgYSBzdHJ1Y3R1cmUgY29tcGFyZSAKLXZpZXdlciBmb3IgemlwIGFyY2hpdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMDlkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmNvbXBhcmUiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9Ii4uLy4uL3BsdWdpbi1leHBvcnQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iICB2YWx1ZT0ib3JnLmVjbGlwc2UuY29tcGFyZSIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS8ke3BsdWdpbn1fMy4xLjAiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAJPGVjbGlwc2UuaW5jcmVtZW50YWxCdWlsZCBwcm9qZWN0PSIke3BsdWdpbn0iIGtpbmQ9ImluY3IiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJidWlsZCI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iIC8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3R9IiAvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3R9IiAvPgotCQk8amFyIAotCQkJamFyZmlsZT0iJHtkZXN0fS9jb21wYXJlLmphciIKLQkJCWJhc2VkaXI9ImJpbiIKLQkJLz4KLQkJPGNvcHkgZmlsZT0icGx1Z2luLnhtbCIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgZmlsZT0icGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3R9L2ljb25zIj4KLQkJCTxmaWxlc2V0IGRpcj0iaWNvbnMiIC8+Ci0JCTwvY29weT4KLQkJPHppcCB6aXBmaWxlPSIke2Rlc3R9L2NvbXBhcmVzcmMuemlwIj4KLQkJICAgIDxmaWxlc2V0IGRpcj0iY29tcGFyZSIgLz4KLSAgCQk8L3ppcD4JCQkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL2NvbnRlbnRNZXJnZVZpZXdlcnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvY29udGVudE1lcmdlVmlld2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjEyNzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvY29udGVudE1lcmdlVmlld2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmNvbXBhcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUiIGlkPSJjb250ZW50TWVyZ2VWaWV3ZXJzIiBuYW1lPSJDb250ZW50TWVyZ2UgVmlld2VycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIGNvbXBhcmUvbWVyZ2UgCi12aWV3ZXJzIGZvciBzcGVjaWZpYyBjb250ZW50IHR5cGVzLiBUaGUgdmlld2VyIGlzIGV4cGVjdGVkIHRvIAotZXh0ZW5kICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyJmx0Oy9zYW1wJmd0Oy4gCi1Ib3dldmVyLCBzaW5jZSB2aWV3ZXJzIGRvbiZhcG9zO3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIAotdGhlIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgZmFjdG9yeSBpbnRlcmZhY2UgCi1mb3Igdmlld2VycyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlQmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlld2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgdmlld2VyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGZhY3RvcnkgZm9yIHRoZSAKLWNvbnRlbnQgbWVyZ2Ugdmlld2VyIGFuZCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3ImbHQ7L3NhbXAmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjpvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9ucyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyBlLmcuICZxdW90O2phdmEsIGdpZiZxdW90OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRNZXJnZVZpZXdlcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb21wYXJlL21lcmdlIHZpZXdlciAKLWZvciB0ZXh0IGZpbGVzIChleHRlbnNpb24gJnF1b3Q7dHh0JnF1b3Q7KToKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsgCi0mbHQ7ZXh0ZW5zaW9uIHBvaW50ID0gJnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzJnF1b3Q7Jmd0OyAKLSAgICAgJmx0O3ZpZXdlciAKLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyLlRleHRNZXJnZVZpZXdlciZxdW90OyAKLSAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuVGV4dE1lcmdlVmlld2VyQ3JlYXRvciZxdW90OyAKLSAgICAgICAgIGV4dGVuc2lvbnM9JnF1b3Q7dHh0JnF1b3Q7IAotICAgIC8mZ3Q7IAotJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dGVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3ImbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBDb21wYXJlIFVJIHBsdWdpbiBkZWZpbmVzIGNvbnRlbnQgdmlld2VycyBmb3IgdGV4dCwgYmluYXJ5IGNvbnRlbnRzLCBhbmQgaW1hZ2VzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9jb250ZW50Vmlld2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9jb250ZW50Vmlld2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTA4ODYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvY29udGVudFZpZXdlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5jb21wYXJlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb21wYXJlIiBpZD0iY29udGVudFZpZXdlcnMiIG5hbWU9IkNvbnRlbnQgVmlld2VycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIAotdmlld2VycyBmb3Igc3BlY2lmaWMgY29udGVudCB0eXBlcy4gCi1UaGVzZSB2aWV3ZXJzIGFyZSB1c2VkIGluIHRoZSAmbHQ7c2FtcCZndDtFZGl0aW9uU2VsZWN0aW9uRGlhbG9nJmx0Oy9zYW1wJmd0OyB3aGVuIHByZXNlbnRpbmcgYW4gZWRpdGlvbiBvZiBhIHJlc291cmNlIG9yIGEgc3Vic2VjdGlvbiB0aGVyZW9mLiBUaGUgdmlld2VyIGlzIGV4cGVjdGVkIHRvIGV4dGVuZCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciZsdDsvc2FtcCZndDsuIAotSG93ZXZlciBzaW5jZSB2aWV3ZXJzIGRvbiZhcG9zO3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgdGhlIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgZmFjdG9yeSBpbnRlcmZhY2UgZm9yIHZpZXdlcnMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciZsdDsvc2FtcCZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpZXdlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50VHlwZUJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXdlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhlIHZpZXdlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBmYWN0b3J5IGZvciB0aGUgCi1jb250ZW50IHZpZXdlciBhbmQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yJmx0Oy9zYW1wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI6b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbnMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgZS5nLiAmcXVvdDtqYXZhLCBnaWYmcXVvdDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGVCaW5kaW5nIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Vmlld2VySWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHZpZXdlciBmb3IgdGV4dCAKLWZpbGVzIChleHRlbnNpb24gJnF1b3Q7dHh0JnF1b3Q7KTogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50ID0gJnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50Vmlld2VycyZxdW90OyZndDsgCi0gICAgICZsdDt2aWV3ZXIgCi0gICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlRleHRWaWV3ZXImcXVvdDsgCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLlRleHRWaWV3ZXJDcmVhdG9yJnF1b3Q7IAotICAgICAgICAgZXh0ZW5zaW9ucz0mcXVvdDt0eHQmcXVvdDsgCi0gICAgLyZndDsgCi0mbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY29udHJpYnV0ZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciZsdDsvY29kZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIENvbXBhcmUgVUkgcGx1Z2luIGRlZmluZXMgY29udGVudCB2aWV3ZXJzIGZvciAKLXRleHQgYW5kIGltYWdlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RyZWFtTWVyZ2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJlYW1NZXJnZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmM2IyMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJlYW1NZXJnZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuY29tcGFyZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuY29tcGFyZSIgaWQ9InN0cmVhbU1lcmdlcnMiIG5hbWU9IlN0cmVhbSBNZXJnZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBhIHN0cmVhbSBtZXJnZXIgCi1mb3Igc3BlY2lmaWMgY29udGVudCB0eXBlcy4gVGhlIHN0cmVhbSBtZXJnZXIgaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSBhIHRocmVlLXdheSBtZXJnZQotb24gdGhyZWUgaW5wdXQgc3RyZWFtcyBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gYW4gb3V0cHV0IHN0cmVhbS4KLVRoZSBleHRlbnNpb24gcG9pbnQgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1NZXJnZXImbHQ7L3NhbXAmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdHJlYW1NZXJnZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGVCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdHJlYW1NZXJnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzdHJlYW0gbWVyZ2VyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1NZXJnZXImbHQ7L3NhbXAmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1NZXJnZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIGUuZy4gJnF1b3Q7amF2YSwgcHJvcGVydGllcyZxdW90OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmVhbU1lcmdlcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc3RyZWFtIG1lcmdlciBmb3IgcHJvcGVydHkgZmlsZXMgKGV4dGVuc2lvbiAmcXVvdDtwcm9wZXJ0aWVzJnF1b3Q7KTogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50ID0gJnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJlYW1NZXJnZXJzJnF1b3Q7Jmd0OyAKLSAgICAgJmx0O3N0cmVhbU1lcmdlciAKLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuVGV4dFN0cmVhbU1lcmdlciZxdW90OyAKLSAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuVGV4dFN0cmVhbU1lcmdlciZxdW90OyAKLSAgICAgICAgIGV4dGVuc2lvbnM9JnF1b3Q7cHJvcGVydGllcyZxdW90OyAKLSAgICAvJmd0OyAKLSZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBjb250cmlidXRlZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1NZXJnZXImbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBDb21wYXJlIFVJIHBsdWdpbiBkZWZpbmVzIGEgc3RyZWFtIG1lcmdlciBmb3IgbGluZSBvcmllbnRlZCB0ZXh0IGZpbGVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJ1Y3R1cmVDcmVhdG9ycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJ1Y3R1cmVDcmVhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJkZmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY2hlbWEvc3RydWN0dXJlQ3JlYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5jb21wYXJlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb21wYXJlIiBpZD0ic3RydWN0dXJlQ3JlYXRvcnMiIG5hbWU9IlN0cnVjdHVyZSBDcmVhdG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIGEgc3RydWN0dXJlIGNyZWF0b3IgCi1mb3Igc3BlY2lmaWMgY29udGVudCB0eXBlcy4gVGhlIHN0cnVjdHVyZSBjcmVhdG9yIGlzIGV4cGVjdGVkIHRvIGNyZWF0ZQotYSB0cmVlIG9mICZsdDtzYW1wJmd0O0lTdHJ1Y3R1cmVDb21wYXJhdG9yJmx0Oy9zYW1wJmd0O3MgZm9yIGEgZ2l2ZW4gY29udGVudC4KLVRoaXMgdHJlZSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBmb3IgdGhlIHN0cnVjdHVyYWwgY29tcGFyZS4KLVRoZSBleHRlbnNpb24gcG9pbnQgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDcmVhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RydWN0dXJlQ3JlYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50VHlwZUJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0cnVjdHVyZUNyZWF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzdHJ1Y3R1cmUgY3JlYXRvcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JU3RydWN0dXJlQ3JlYXRvciZsdDsvc2FtcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNvbXBhcmF0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIGUuZy4gJnF1b3Q7amF2YSwgcHJvcGVydGllcyZxdW90OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cnVjdHVyZUNyZWF0b3JJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc3RydWN0dXJlIGNyZWF0b3IgZm9yIAotamF2YSBmaWxlcyAoZXh0ZW5zaW9uICZxdW90O2phdmEmcXVvdDspOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQgPSAmcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZUNyZWF0b3JzJnF1b3Q7Jmd0OyAKLSAgICAgJmx0O3N0cnVjdHVyZUNyZWF0b3IgCi0gICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5jb21wYXJlLkphdmFTdHJ1Y3R1cmVDcmVhdG9yJnF1b3Q7IAotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5KYXZhU3RydWN0dXJlQ3JlYXRvciZxdW90OyAKLSAgICAgICAgIGV4dGVuc2lvbnM9JnF1b3Q7amF2YSZxdW90OyAKLSAgICAvJmd0OyAKLSZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBjb250cmlidXRlZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDcmVhdG9yJmx0Oy9jb2RlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgQ29tcGFyZSBVSSBwbHVnaW4gZGVmaW5lcyBhIHN0cnVjdHVyZSBjcmVhdG9yIGZvciB6aXAgYXJjaGl2ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL3N0cnVjdHVyZU1lcmdlVmlld2Vycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlL3NjaGVtYS9zdHJ1Y3R1cmVNZXJnZVZpZXdlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMWRkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NoZW1hL3N0cnVjdHVyZU1lcmdlVmlld2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmNvbXBhcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUiIGlkPSJzdHJ1Y3R1cmVNZXJnZVZpZXdlcnMiIG5hbWU9IlN0cnVjdHVyZU1lcmdlIFZpZXdlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBjb21wYXJlL21lcmdlIAotdmlld2VycyBmb3Igc3RydWN0dXJhbCBjb250ZW50IHR5cGVzLiBUaGUgdmlld2VyIGlzIGV4cGVjdGVkIHRvIAotZXh0ZW5kICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyJmx0Oy9zYW1wJmd0Oy4gCi1Ib3dldmVyLCBzaW5jZSB2aWV3ZXJzIGRvbiZhcG9zO3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIAotdGhlIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgZmFjdG9yeSBpbnRlcmZhY2UgCi1mb3Igdmlld2VycyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlQmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlld2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgdmlld2VyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGZhY3RvcnkgZm9yIHRoZSAKLXN0cnVjdHVyZSBtZXJnZSB2aWV3ZXIgYW5kIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvciZsdDsvc2FtcCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOm9yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIGUuZy4gJnF1b3Q7emlwLCBqYXImcXVvdDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGVCaW5kaW5nIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJ1Y3R1cmVNZXJnZVZpZXdlcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgY29tcGFyZS9tZXJnZSB2aWV3ZXIgCi1mb3IgemlwIGZpbGVzIChleHRlbnNpb24gJnF1b3Q7emlwJnF1b3Q7KTogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50ID0gJnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVNZXJnZVZpZXdlcnMmcXVvdDsmZ3Q7IAotICAgICAmbHQ7dmlld2VyIAotICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5aaXBDb21wYXJlVmlld2VyJnF1b3Q7IAotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5aaXBDb21wYXJlVmlld2VyQ3JlYXRvciZxdW90OyAKLSAgICAgICAgIGV4dGVuc2lvbnM9JnF1b3Q7emlwJnF1b3Q7IAotICAgIC8mZ3Q7IAotJmx0Oy9leHRlbnNpb24mZ3Q7IAotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dGVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3ImbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBDb21wYXJlIFVJIHBsdWdpbiBkZWZpbmVzIGEgc3RydWN0dXJlIGNvbXBhcmUgCi12aWV3ZXIgZm9yIHppcCBhcmNoaXZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMwOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5jb21wYXJlIiBkZWZhdWx0PSJleHBvcnQiIGJhc2VkaXI9Ii4uIj4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIuLi8uLi9wbHVnaW4tZXhwb3J0IiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvbXBhcmUiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiAgdmFsdWU9IiR7ZGVzdGRpcn0vJHtwbHVnaW59XzMuMS4wIiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgCTxlY2xpcHNlLmluY3JlbWVudGFsQnVpbGQgcHJvamVjdD0iJHtwbHVnaW59IiBraW5kPSJpbmNyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iYnVpbGQiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KLQkJPGphciAKLQkJCWphcmZpbGU9IiR7ZGVzdH0vY29tcGFyZS5qYXIiCi0JCQliYXNlZGlyPSJiaW4iCi0JCS8+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi54bWwiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSB0b2Rpcj0iJHtkZXN0fS9pY29ucyI+Ci0JCQk8ZmlsZXNldCBkaXI9Imljb25zIiAvPgotCQk8L2NvcHk+Ci0JCTx6aXAgemlwZmlsZT0iJHtkZXN0fS9jb21wYXJlc3JjLnppcCI+Ci0JCSAgICA8ZmlsZXNldCBkaXI9ImNvbXBhcmUiIC8+Ci0gIAkJPC96aXA+CQkJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZWFtLmN2cy51aS9zcmMvb3JnL2VjbGlwc2UvdGVhbS9pbnRlcm5hbC9jY3ZzL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpL3NyYy9vcmcvZWNsaXBzZS90ZWFtL2ludGVybmFsL2NjdnMvdWkvbWVzc2FnZXMucHJvcGVydGllcwppbmRleCBkNTE3ZTIwLi5hNDM1MmM1IDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpL3NyYy9vcmcvZWNsaXBzZS90ZWFtL2ludGVybmFsL2NjdnMvdWkvbWVzc2FnZXMucHJvcGVydGllcworKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpL3NyYy9vcmcvZWNsaXBzZS90ZWFtL2ludGVybmFsL2NjdnMvdWkvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMTI4OCw3ICsxMjg4LDcgQEAKIENvbXBhcmVQcmVmZXJlbmNlUGFnZS4yPUF1dG9tYXRpY2FsbHkgZW5hYmxlIGNvJm1taXQgc2V0IGdyb3VwaW5nIGluIENWUyBzeW5jaHJvbml6YXRpb25zCiBDb21wYXJlUHJlZmVyZW5jZVBhZ2UuMz1TaG93IHJldmlzaW9uICZjb21wYXJpc29ucyBpbiBhIGRpYWxvZwogQ29tcGFyZVByZWZlcmVuY2VQYWdlLjQ9Q29uJnNpZGVyIGZpbGUgY29udGVudHMgaW4gY29tcGFyaXNvbnMKLUNvbXBhcmVQcmVmZXJlbmNlUGFnZS42PVNlZSAnJ0NvbXBhcmUvUGF0Y2gnJyBmb3IgY29tcGFyZSBlZGl0b3IgcHJlZmVyZW5jZXMuCitDb21wYXJlUHJlZmVyZW5jZVBhZ2UuNj1TZWUgJyd7MH0nJyBmb3IgY29tcGFyZSBlZGl0b3IgcHJlZmVyZW5jZXMuCiAKIEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IuMz1QZXJmb3JtIEVkaXQ/CiBGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yLjQ9QSBDVlMgZWRpdCBub3RpZmljYXRpb24gaXMgcmVxdWlyZWQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyIGluIG9yZGVyIHRvIGFsbG93IGVkaXRpbmcgb2Ygb25lIG9yIG1vcmUgc2VsZWN0ZWQgZmlsZXMuIENvbnRpbnVlPwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzBmOTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiY2ZiZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvbXBhcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvbXBhcmUueG1sPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpmYWNlLnRleHQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnN3dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI2YWUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNUdWUgTm92IDMwIDE1OjUwOjQ5IENFVCAyMDA0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9JZE1hcHMvYW50X3Rlc3QueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvSWRNYXBzL2FudF90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4NzE3MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9JZE1hcHMvYW50X3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGlkbWFwIFNZU1RFTSAiaWRtYXAuZHRkIj4KLQotPGlkbWFwIG5hbWU9IkFOVCI+Ci0JPGVsZW1lbnQgc2lnbmF0dXJlPSJyb290LnByb2plY3QuIiBpZD0ibmFtZSIvPgotCTxlbGVtZW50IHNpZ25hdHVyZT0icm9vdC5wcm9qZWN0LnRhcmdldC4iIGlkPSJuYW1lIi8+Ci08L2lkbWFwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvSWRNYXBzL2lkbWFwLmR0ZCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL0lkTWFwcy9pZG1hcC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGEyZmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvSWRNYXBzL2lkbWFwLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IUVMRU1FTlQgaWRtYXAgKGVsZW1lbnQpKj4NCi08IUFUVExJU1QgaWRtYXQNCi0gICAgICAgICAgbmFtZSAgICAgIENEQVRBICNSRVFVSVJFRD4NCi08IUVMRU1FTlQgZWxlbWVudCBFTVBUWT4NCi08IUFUVExJU1QgZWxlbWVudA0KLSAgICAgICAgICBzaWduYXR1cmUgSUQgI1JFUVVJUkVEDQotICAgICAgICAgIGlkX2F0dHIgICBDREFUQSAjUkVRVUlSRUQ+DQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjBlMmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS54bWxjb21wYXJlZXhhbXBsZXMuamFyID0gc3JjLwotCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotCQkJCWFib3V0Lmh0bWwsXAotCQkJCXBsdWdpbi5wcm9wZXJ0aWVzLFwKLQkJCQlwbHVnaW4ueG1sLFwKLQkJCQlpY29ucy8sXAotCQkJCXhtbGNvbXBhcmVleGFtcGxlcy5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvQ3JlYXRlTmV3SURNYXBCdXR0b24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvQ3JlYXRlTmV3SURNYXBCdXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDdhODBiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0NyZWF0ZU5ld0lETWFwQnV0dG9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0VkaXRDb3B5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0VkaXRDb3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3ZWIxZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9FZGl0Q29weS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcENvbnRleHRNZW51LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0lETWFwQ29udGV4dE1lbnUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2YyMDUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0lETWFwQ29udGV4dE1lbnUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfR2VuZXJhbE1hdGNoaW5nLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0lETWFwX0dlbmVyYWxNYXRjaGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjcwNjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfR2VuZXJhbE1hdGNoaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0lETWFwX015UGx1Z2luLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0lETWFwX015UGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkZjE3MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9NeVBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9OZXdJRE1hcFNjaGVtZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9OZXdJRE1hcFNjaGVtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMWQyNzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfTmV3SURNYXBTY2hlbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfTmV3TWFwcGluZ19Db250ZXh0TWVudS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9OZXdNYXBwaW5nX0NvbnRleHRNZW51LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkMWRjOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9OZXdNYXBwaW5nX0NvbnRleHRNZW51LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL0lETWFwX05ld01hcHBpbmdfUHJlZmVyZW5jZVBhZ2UuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfTmV3TWFwcGluZ19QcmVmZXJlbmNlUGFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmUwMmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfTmV3TWFwcGluZ19QcmVmZXJlbmNlUGFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9TZWxlY3RNeVBsdWdpbi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9JRE1hcF9TZWxlY3RNeVBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTZjNzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvSURNYXBfU2VsZWN0TXlQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvT3JkZXJlZF9NeUFOVC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9PcmRlcmVkX015QU5ULmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyNzhmZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9PcmRlcmVkX015QU5ULmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL09yZGVyZWRfTmV3SURNYXBTY2hlbWUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvT3JkZXJlZF9OZXdJRE1hcFNjaGVtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWMwZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvT3JkZXJlZF9OZXdJRE1hcFNjaGVtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9PcmRlcmVkX05ld09yZGVyZWRFbnRyeV9Db250ZXh0TWVudS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9PcmRlcmVkX05ld09yZGVyZWRFbnRyeV9Db250ZXh0TWVudS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODgyOTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvT3JkZXJlZF9OZXdPcmRlcmVkRW50cnlfQ29udGV4dE1lbnUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvT3JkZXJlZF9OZXdPcmRlcmVkRW50cnlfUHJlZmVyZW5jZVBhZ2UuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvT3JkZXJlZF9OZXdPcmRlcmVkRW50cnlfUHJlZmVyZW5jZVBhZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg1ZDNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL09yZGVyZWRfTmV3T3JkZXJlZEVudHJ5X1ByZWZlcmVuY2VQYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL09yZGVyZWRfVW5vcmRlcmVkU2NoZW1lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL09yZGVyZWRfVW5vcmRlcmVkU2NoZW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4ZTU2Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9PcmRlcmVkX1Vub3JkZXJlZFNjaGVtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9QcmVmZXJlbmNlUGFnZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9QcmVmZXJlbmNlUGFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzkxMmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvUHJlZmVyZW5jZVBhZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvYWRkaWRtYXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvYWRkaWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmRhZDhiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL2FkZGlkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL2hnbGVnYWwuaHRtIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvaGdsZWdhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODcxYjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvaGdsZWdhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICA8TElOSyBSRUw9InN0eWxlc2hlZXQiIEhSRUY9Ii4uLy4uLy4uL2Jvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIiBUWVBFPSJ0ZXh0L2NzcyI+Ci0gIDx0aXRsZT5MZWdhbCBOb3RpY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+Ci08YSBOQU1FPSJOb3RpY2VzIj48L2E+Tm90aWNlczwvaDM+Ci0oYykgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvaWRNYXBwaW5nLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9pZE1hcHBpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkZTU1My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9pZE1hcHBpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlhNTCBDb21wYXJlIEV4dGVuc2lvbiBQb2ludHM6IGlkTWFwcGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzgwMDA4MCI+Ci0KLTxjZW50ZXI+Ci08aDE+Ci1pZE1hcHBpbmc8L2gxPjwvY2VudGVyPgotPGI+PGk+SWRlbnRpZmllcjogPC9pPjwvYj5vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5pZE1hcHBpbmcKLTxwPjxiPjxpPkRlc2NyaXB0aW9uOiA8L2k+PC9iPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0byBkZWZpbmUgaW50ZXJuYWwgWE1MIElEIE1hcHBpbmcKLXNjaGVtZXMgdXNpbmcgdGhlIDxpPm1hcHBpbmc8L2k+IGVsZW1lbnQuIFRoZXNlIHNjaGVtZXMgY2FuIHRoZW4gYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgYW4gWE1MIGNvbXBhcmUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgWE1MIGVsZW1lbnRzIGJ5IHRoZSB2YWx1ZSBvZiBhbgotYXR0cmlidXRlIG9yIHRoZSB0ZXh0IGluIGEgY2hpbGQgZWxlbWVudC4KLTxicj5BZGRpdGlvbmFsbHksIDxpPm9yZGVyZWQ8L2k+IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQgc2hvdWxkIGJlIGNvbXBhcmVkIGluIG9yZGVyZWQgZmFzaGlvbiBpbnN0ZWFkIG9mIHRoZQotZGVmYXVsdCB1bm9yZGVyZWQgd2F5LgotPHA+PGI+PGk+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9pPjwvYj4KLTxwPjx0dD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGlkbWFwIChtYXBwaW5nKik+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBpZG1hcDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBuYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DREFUQSAjUkVRVUlSRUQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZXh0ZW5zaW9uJm5ic3A7Ci1DREFUQTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyA+PC90dD4KLTx1bD4KLTxsaT4KLTxiPm5hbWU8L2I+IC0gdGhlIG5hbWUgb2YgdGhlIElEIE1hcHBpbmcgc2NoZW1lLiBTaG91bGQgYmUgdW5pcXVlLjwvbGk+Ci08bGk+Ci08Yj5leHRlbnNpb248L2I+IC0gKG9wdGlvbmFsKSBhIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElEIE1hcHBpbmcgU2NoZW1lLgotV2hlbiBjb21wYXJpbmcgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbiwgdGhlIGN1cnJlbnQgSUQgTWFwcGluZyBTY2hlbWUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVzZWQuCi08YnI+SWYgYW4gZXh0ZW5zaW9uIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBhbHNvIGJlIGFkZGVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUgb2YgdGhlIFhNTCBDb21wYXJlIFBsdWdpbi4KLUZvciBleGFtcGxlLCBpZiB3ZSBjcmVhdGUgYW4gSUQgTWFwcGluZyBTY2hlbWUgd2l0aCBleHRlbnNpb24gY2QsIHRoZSBwbHVnaW4ueG1sIG9mIHRoZSBYTUwgQ29tcGFyZSBQbHVnaW4gaXMgdXBkYXRlZCBhcyBmb2xsb3dzCi0odXBkYXRlIHNob3duIGluIGJvbGQpOgotPHR0PgotPHA+Jmx0O2V4dGVuc2lvbgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3BvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZU1lcmdlVmlld2VycyI+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0cnVjdHVyZU1lcmdlVmlld2VyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXh0ZW5zaW9ucz0ieG1sLGNsYXNzcGF0aCw8Yj5jZDwvYj4iCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUueG1sLlhNTFN0cnVjdHVyZVZpZXdlckNyZWF0b3IiPgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvc3RydWN0dXJlTWVyZ2VWaWV3ZXI+Ci08L3R0PgotPHA+PGI+V2FybmluZzogPC9iPklmIGFuIGV4dGVuc2lvbiBpcyBhc3NvY2lhdGVkIG1vcmUgdGhhbiBvbmNlLCBvbmx5IHRoZSBmaXJzdCBhc3NvY2lhdGlvbiB3aWxsIGJlIGNvbnNpZGVyZWQuCi1BbHNvLCBpbnRlcm5hbCBJRCBNYXBwaW5nIHNjaGVtZXMgaGF2ZSBwcmlvcml0eSBvdmVyIHVzZXIgSUQgTWFwcGluZyBzY2hlbWVzIHdoZW4gZHVwbGljYXRlIGV4dGVuc2lvbnMgYXJlIGRlZmluZWQuCi08cD48Yj5XYXJuaW5nOiA8L2I+V2hlbiBhbiBpbnRlcm5hbCBJRCBNYXBwaW5nIHNjaGVtZSB3aXRoIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiBpcyByZW1vdmVkIChmcm9tIGEgPHR0PnBsdWdpbi54bWw8L3R0PiksIHRoZSBYTUwgQ29tcGFyZSBwbHVnaW4gaGFzIHRvIGJlIHJlbG9hZGVkIHRvIGRpc2Fzc29jaWF0ZSBpdHNlbGYgZnJvbSB0aGUgZXh0ZW5zaW9uLgotSWYgbm90LCBvbiB0aGUgZmlyc3QgY29tcGFyZSBvZiBmaWxlcyB3aXRoIHRoaXMgZXh0ZW5zaW9uLCB0aGUgWE1MIENvbXBhcmUgcGx1Z2luIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBkZWZhdWx0IDxlbT5Vbm9yZGVyZWQ8L2VtPiBhbGdvcml0aG0uCi0oSG93ZXZlciwgYXQgdGhpcyBwb2ludCB0aGUgZXh0ZW5zaW9uIHdpbGwgaGF2ZSBiZWVuIGRpc2Fzc29jaWF0ZWQgZnJvbSB0aGUgWE1MIFBsdWdpbiwgYXMgdGhlIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQuKQotPC91bD4KLTxicj4KLTxwPjx0dD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIG1hcHBpbmcgRU1QVFk+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBtYXBwaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNpZ25hdHVyZSZuYnNwOwotQ0RBVEEgI1JFUVVJUkVEPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DREFUQSAjUkVRVUlSRUQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWQtc291cmNlICZuYnNwO0NEQVRBPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7ID48L3R0PgotPHVsPgotPGxpPgotPGI+c2lnbmF0dXJlPC9iPiAtIHRoZSBYTUwgcGF0aCBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgKHNlZSBleGFtcGxlcyBiZWxvdykuPC9saT4KLQotPGxpPgotPGI+aWQ8L2I+IC0gdGhlIGF0dHJpYnV0ZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBlbGVtZW50IG9yIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCBlbGVtZW50Ci13aG9zZSB0ZXh0IGlkZW50aWZpZXMgdGhpcyBlbGVtZW50LjwvbGk+Ci0KLTxsaT4KLTxiPmlkLXNvdXJjZTwvYj4gLSAob3B0aW9uYWwpIGlmIDxlbT5pZDwvZW0+IGlzIHRoZSBuYW1lIG9mIGEgY2hpbGQgZWxlbWVudCwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBtdXN0IGhhdmUKLXRoZSB2YWx1ZSA8ZW0+Ym9keTwvZW0+LiBJZiA8ZW0+aWQtc291cmNlPC9lbT4gaXMgbGVmdCBvdXQsIGl0IGlzIGFzc3VtZWQgdGhhdCA8ZW0+aWQ8L2VtPiBpcyBhbiBhdHRyaWJ1dGUuPC9saT4KLTwvdWw+Ci08YnI+Ci08cD48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBvcmRlcmVkIEVNUFRZPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1Qgb3JkZXJlZDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzaWduYXR1cmUmbmJzcDsKLUNEQVRBICNSRVFVSVJFRDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyA+PC90dD4KLTx1bD4KLTxsaT4KLTxiPnNpZ25hdHVyZTwvYj4gLSB0aGUgWE1MIHBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgZWxlbWVudCB3aG9zZSBkaXJlY3QgY2hpbGRyZW4gd2lsbCBiZSBjb21wYXJlZCBpbiBvcmRlcmVkIGZhc2hpb24gaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB1bm9yZGVyZWQgd2F5LjwvbGk+Ci08L2xpPgotPC91bD4KLTxiPjxpPkV4YW1wbGVzOjwvaT48L2I+Ci08YnI+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIElEIE1hcHBpbmdzIFNjaGVtZSBmb3IgQU5UIGZpbGVzLgotPGJyPjxpPnByb2plY3Q8L2k+IGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkIGJ5IGFuIGF0dHJpYnV0ZSA8aT5uYW1lPC9pPi4gPGk+dGFyZ2V0PC9pPiBlbGVtZW50cyAod2hpY2ggYXJlIGNoaWxkcmVuIG9mIDxpPnByb2plY3Q8L2k+KSBhcmUgYWxzbyBpZGVudGlmaWVkIGJ5IGFuIGF0dHJpYnV0ZSA8aT5uYW1lPC9pPi4KLUFsc28sIHRoZSBjaGlsZHJlbiBvZiA8aT50YXJnZXQ8L2k+IHdpbGwgYmUgY29tcGFyZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBkb2N1bWVudC4KLTx0dD4KLTxwPiZsdDtpZG1hcCBuYW1lPSJBTlQiPgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bWFwcGluZyBzaWduYXR1cmU9InByb2plY3QiIGlkPSJuYW1lIi8+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDttYXBwaW5nIHNpZ25hdHVyZT0icHJvamVjdD50YXJnZXQiIGlkPSJuYW1lIi8+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtvcmRlcmVkIHNpZ25hdHVyZT0icHJvamVjdD50YXJnZXQiLz4KLTxicj4mbHQ7aWRtYXA+Ci08L3R0PgotPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgY2FzZSB3aGVyZSB0aGUgdGV4dCBvZiBhIGNoaWxkIGVsZW1lbnQgaXMgdXNlZCBhcyBpZDoKLTx0dD4KLTxwPiZsdDtpZG1hcCBuYW1lPSJCb29rIENhdGFsb2ciIGV4dGVuc2lvbj0iYm9vayI+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDttYXBwaW5nIHNpZ25hdHVyZT0iY2F0YWxvZz5ib29rIiBpZD0iaXNibiIgaWQtc291cmNlPSJib2R5Ii8+Ci08YnI+Jmx0O2lkbWFwPgotPC90dD4KLTxwPjxiPjxpPlN1cHBsaWVkIEltcGxlbWVudGF0aW9uOjwvaT48L2I+Ci08YnI+VGhlIFhNTCBDb21wYXJlIHBsdWdpbiBkZWZpbmVzIGFuIElEIE1hcHBpbmcgc2NoZW1lIGZvciBFY2xpcHNlIDx0dD5wbHVnaW4ueG1sPC90dD4gZmlsZXMsIG9uZSBmb3IgPHR0Pi5jbGFzc3BhdGg8L3R0PiBmaWxlcyBhbmQgb25lIGZvciBBTlQgZmlsZXMuCi0KLTxwPjxhIGhyZWY9ImhnbGVnYWwuaHRtIj48aW1nIFNSQz0ibmdpYm1jcHkuZ2lmIiBBTFQ9IkNvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDAzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIgQk9SREVSPTAgaGVpZ2h0PTE0IHdpZHRoPTMyND48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvbmdpYm1jcHkuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvbmdpYm1jcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzg2ZTQzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL25naWJtY3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL3NtYXJ0bW9kZV9jby5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC9zbWFydG1vZGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJkZGRjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL3NtYXJ0bW9kZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC90dXRvcmlhbF9hbmRfZXhhbXBsZXMuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL3R1dG9yaWFsX2FuZF9leGFtcGxlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTFiYWZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2RvYy1odG1sL3R1dG9yaWFsX2FuZF9leGFtcGxlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+VHV0b3JpYWwgYW5kIEV4YW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLTxoMT5UdXRvcmlhbCBhbmQgRXhhbXBsZXM8L2gxPgotPGgyPjxhIGlkPSJpZF9tYXBwaW5nIiBuYW1lPSJpZF9tYXBwaW5nIj4KLUdlbmVyYWwgTWF0Y2hpbmcgdnMuIElEIE1hcHBpbmcgU2NoZW1lczo8YnI+SG93IHRvIGNyZWF0ZSBhbiBJRCBNYXBwaW5nIFNjaGVtZSB0byBpbXByb3ZlIGNvbXBhcmUgcmVzdWx0cwotPC9hPjwvaDI+Ci1Db25zaWRlciBhbiBleGFtcGxlIFhNTCBmaWxlIGluIHR3byBzbGlnaHRseSBkaWZmZXJlbnQgdmVyc2lvbnMsIGxlZnQgYW5kIHJpZ2h0LiBBc3N1bWUgdGhhdCB0aGUgZWxlbWVudCA8dHQ+ZXh0ZW5zaW9uLXBvaW50PC90dD4gaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSB0aGUgYXR0cmlidXRlIDx0dD5pZDwvdHQ+LgotVGhlIHRleHR1YWwgZGlmZmVyZW5jZXMgYXJlIHNob3duIGluIGJvbGQuCi08dGFibGU+Ci08dHI+Ci08dGQ+PHR0PgotPGJyPgotPHA+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwPiZsdDtwbHVnaW4KLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwO25hbWU9IiVQbHVnaW4ubmFtZSIKLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwO2lkPSJvcmcuZWNsaXBzZS51aSIKLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwO3ZlcnNpb249IjEuMCIKLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwO3Byb3ZpZGVyLW5hbWU9Ik9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwsIEluYy4iCi08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDtjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luIj4KLTxicj4KLTxicj4mbHQ7ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVFeHRQb2ludC5lZGl0b3JNZW51cyAiIGlkPSJlZGl0b3JBY3Rpb25zIi8+Ci08YnI+Jmx0O2V4dGVuc2lvbi1wb2ludCBuYW1lPSIlRXh0UG9pbnQucG9wdXBNZW51cyAiIGlkPSJwb3B1cE1lbnVzIi8+Ci08YnI+Jmx0O2V4dGVuc2lvbi1wb2ludCBuYW1lPSIlRXh0UG9pbnQuPGI+aW1wb3J0V2l6YXJkczwvYj4iIGlkPSI8Yj5pbXBvcnRXaXphcmRzPC9iPiIvPgotPGJyPgotPHA+Jmx0Oy9wbHVnaW4+Ci08L3R0PgotPC90ZD4KLTx0ZD4KLSZuYnNwOyZuYnNwOwotPC90ZD4KLTx0ZD48dHQ+Ci08cD4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHA+Jmx0O3BsdWdpbgotPGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZT0iJVBsdWdpbi5uYW1lIgotPGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7aWQ9Im9yZy5lY2xpcHNlLnVpIgotPGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7dmVyc2lvbj0iMS4wIgotPGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7cHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCwgSW5jLiIKLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwO2NsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW4iPgotPGJyPgotPGJyPiZsdDtleHRlbnNpb24tcG9pbnQgbmFtZT0iJUV4dFBvaW50LmVkaXRvck1lbnVzICIgaWQ9ImVkaXRvckFjdGlvbnMiLz4KLTxicj4mbHQ7ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVFeHRQb2ludC5wb3B1cE1lbnVzICIgaWQ9InBvcHVwTWVudXMiLz4KLTxicj4mbHQ7ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVFeHRQb2ludC48Yj5leHBvcnRXaXphcmRzPC9iPiIgaWQ9IjxiPmV4cG9ydFdpemFyZHM8L2I+Ii8+Ci08YnI+Ci08cD4mbHQ7L3BsdWdpbj4KLTwvdHQ+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08YnI+Ci1Bc3N1bWUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkLiBUaGUgc3RydWN0dXJhbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBkb2N1bWVudHMgY29uc2lzdHMgaW4gdGhlIDx0dD5leHRlbnNpb24tcG9pbnQ8L3R0PiBlbGVtZW50IG9uIHRoZSBsZWZ0IHdpdGggPHR0PmlkPSJpbXBvcnRXaXphcmRzIjwvdHQ+IGJlaW5nIHJlcGxhY2VkIG9uIHRoZSByaWdodCB3aXRoIGEgbmV3IDx0dD5leHRlbnNpb24tcG9pbnQ8L3R0PiB3aXRoIDx0dD5pZD0iZXhwb3J0V2l6YXJkcyI8L3R0Pi4KLVVzaW5nIHRoZSBnZW5lcmFsIG1hdGNoaW5nIGFsZ29yaXRobSBjYWxsZWQgPGVtPlVub3JkZXJlZDwvZW0+LCBiZWNhdXNlIGl0IGlnbm9yZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBYTUwgZWxlbWVudHMgYXBwZWFyIGluIHRoZSBkb2N1bWVudCwgd2Ugb2J0YWluIHRoZSBmb2xsb3dpbmcgdHJlZSBvZiBkaWZmZXJlbmNlcy4KLTxicj4KLTxicj4KLTxpbWcgc3JjPSJJRE1hcF9HZW5lcmFsTWF0Y2hpbmcuZ2lmIiBhbHQ9IkRpZmZlcmVuY2UgVHJlZSB1c2luZyBHZW5lcmFsIE1hdGNoaW5nIEFsZ29yaXRobSI+Ci08YnI+Ci08YnI+Ci1UaGUgZmlyc3QgdHdvIDx0dD5leHRlbnNpb24tcG9pbnQ8L3R0PiBlbGVtZW50cyBhcmUgaWRlbnRpY2FsIGFuZCBhcmUgdGhlcmVmb3JlIG1hdGNoZWQgYW5kIGFyZSBub3Qgc2hvd24gaW4gdGhlIGRpZmZlcmVuY2UgdHJlZS4gVGhlcmUgcmVtYWlucyB0aGUgdGhpcmQgPHR0PmV4dGVuc2lvbi1wb2ludDwvdHQ+IGVsZW1lbnQgb24gYm90aCBzaWRlcyB3aGljaCwgaGF2aW5nIHRoZSBzYW1lIGVsZW1lbnQgbmFtZSwgYXJlIGFsc28gbWF0Y2hlZC4KLVRoZSBkaWZmZXJlbmNlIHRyZWUgdGhlbiBzaG93cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdGhpcmQgPHR0PmV4dGVuc2lvbi1wb2ludDwvdHQ+IGVsZW1lbnQgbGVmdCBhbmQgdGhlIHRoaXJkIDx0dD5leHRlbnNpb24tcG9pbnQ8L3R0PiBlbGVtZW50IHJpZ2h0LgotVGhlc2UgZGlmZmVyZW5jZXMgY29uc2lzdCBpbiB0aGUgdmFsdWVzIG9mIHRoZSBhdHRyaWJ1dGVzIDx0dD5pZDwvdHQ+IGFuZCA8dHQ+bmFtZTwvdHQ+LgotPGJyPgotSG93ZXZlciwgdGhpcyBpcyBub3Qgd2hhdCB3ZSB3b3VsZCBsaWtlIHRvIHNlZS4gV2Ugd291bGQgbGlrZSB0aGUgZGlmZmVyZW5jZSB0cmVlIHRvIHNob3cgdXMgdGhhdCBhbiA8dHQ+ZXh0ZW5zaW9uLXBvaW50PC90dD4gZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsZWZ0IHNpZGUgYW5kIGEgbmV3IDx0dD5leHRlbnNpb24tcG9pbnQ8L3R0PiBlbGVtZW50IHdhcyBhZGRlZCBvbiB0aGUgcmlnaHQgc2lkZS4KLTxicj4KLVRvIGFjaGlldmUgdGhpcywgd2UgY3JlYXRlIGEgbmV3IElEIE1hcHBpbmcgU2NoZW1lLiBXZSBjYW4gZG8gdGhpcyBieSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgYnV0dG9uIG9uIHRvb2xiYXIuCi08YnI+PGJyPgotPGltZyBzcmM9IklETWFwX05ld0lETWFwU2NoZW1lLmdpZiIgYWx0PSJDcmVhdGluZyBhIG5ldyBJRCBNYXBwaW5nIFNjaGVtZSI+Ci08YnI+PGJyPgotQXNzdW1lIHdlIGNhbGwgdGhlIElEIE1hcHBpbmcgU2NoZW1lIDxlbT5NeVBsdWdpbjwvZW0+LiBXZSBub3cgc2VsZWN0IHRoZSBJRCBNYXBwaW5nIFNjaGVtZSBNeVBsdWdpbiBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCBpbiB0aGUgVG9vbGJhcgotPGJyPjxicj4KLTxpbWcgc3JjPSJJRE1hcF9TZWxlY3RNeVBsdWdpbi5naWYiIGFsdD0iU2VsZWN0IE15UGx1Z2luIElEIE1hcCBTY2hlbWUiPgotPGJyPjxicj4KLWFuZCBhZGQgdG8gaXQgdGhlIGZvbGxvd2luZyBNYXBwaW5nOgotPGJyPjxicj4KLTx0YWJsZT4KLTx0cj4KLTx0ZD4KLTxpbWcgc3JjPSJJRE1hcF9OZXdNYXBwaW5nX1ByZWZlcmVuY2VQYWdlLmdpZiIgYWx0PSJDcmVhdGluZyBhIG5ldyBtYXBwaW5nIGZyb20gdGhlIHByZWZlcmVuY2UgcGFnZSI+Ci08L3RkPgotPHRkPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Ci08L3RkPgotPHRkPgotPGltZyBzcmM9IklETWFwX05ld01hcHBpbmdfQ29udGV4dE1lbnUuZ2lmIiBhbHQ9IkNyZWF0aW5nIGEgbmV3IG1hcHBpbmcgdXNpbmcgdGhlIGNvbnRleHQgbWVudSI+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08YnI+Ci1UaGlzIGNhbiBiZSBkb25lIGZyb20gdGhlIHByZWZlcmVuY2UgcGFnZSAobGVmdCkgb3IgZnJvbSB0aGUgY29udGV4dCBtZW51IGluIHRoZSBzdHJ1Y3R1cmUgdmlldyAocmlnaHQpLgotPGJyPgotVGhlIGRpZmZlcmVuY2UgdHJlZSBub3cgYmVjb21lczoKLTxicj4KLShUbyByZWZyZXNoIHRoZSBzdHJ1Y3R1cmUgdmlldywgY2xpY2sgb24gdGhlIDxpbWcgc3JjPSJzbWFydG1vZGVfY28uZ2lmIiBhbHQ9IkJ1dHRvbiBmb3IgdXBkYXRpbmcgdmlldyI+IGJ1dHRvbiBvZiB0aGUgZHJvcC1kb3duIGxpc3QgaW4gdGhlIHRvb2xiYXIuKQotPGJyPjxicj4KLTxpbWcgc3JjPSJJRE1hcF9NeVBsdWdpbi5naWYiIGFsdD0iRGlmZmVyZW5jZSBUcmVlIHVzaW5nIE15UGx1Z2luIElEIE1hcHBpbmcgU2NoZW1lIj4KLTxicj48YnI+Ci1UaGlzIGlzIHRoZSBjb21wYXJlIHJlc3VsdCB0aGF0IHdlIHdhbnRlZCBhbmQgdGhhdCB3ZSBhY2hpZXZlZCBieSBjcmVhdGVkIGFuIElEIE1hcHBpbmcgU2NoZW1lLgotPGJyPgotPGJyPgotVGhlIFhNTCBDb21wYXJlIFBsdWdpbiBhbHJlYWR5IGNvbWVzIHdpdGggYSBJRCBNYXBwaW5nIFNjaGVtZSBmb3IgUGx1Z2luIGZpbGVzLCB3aGljaCBjYW4gYmUgY3VzdG9taXplZCBmb3IgcGFydGljdWxhciBQbHVnaW4gZmlsZXMuCi08YnI+PGJyPgotPGI+V2FybmluZzo8L2I+Ci08YnI+Ci1JZiBhbiBJRCBNYXBwaW5nIGlzIGNyZWF0ZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgaWQgaXMgdW5pcXVlLCBpLmUuIHRoZXJlIGFyZSBubyB0d28gWE1MIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgcGF0aCB0aGF0IGhhdmUgdGhlIHNhbWUgaWQuCi1TaG91bGQgdGhpcyBub3QgYmUgdGhlIGNhc2UsIHRoZSBJRCBNYXBwaW5nIFNjaGVtZSBtYXkgbm90IGRlbGl2ZXIgYSBzZW5zaWJsZSBkaWZmZXJlbmNlIHRyZWUuCi08YnI+Ci1XaGVuIGFuIGlkIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UsIG9uZSBzaG91bGQgcmVseSBvbiB0aGUgZ2VuZXJhbCBhbGdvcml0aG0uCi08YnI+Ci08YnI+Ci1BbHNvLCB3aGVuIGFuIElEIE1hcHBpbmcgU2NoZW1lIGlzIHVzZWQgYW5kIHRoZXJlIGFyZSBlbGVtZW50cyB3aXRoIG5vIGlkIG1hcHBpbmcgc3BlY2lmaWVkLCB0aGUgPGVtPlVub3JkZXJlZDwvZW0+IGNvbXBhcmUgbWV0aG9kIHdpbGwgYmUgdXNlZCwgaS5lLiBlbGVtZW50cyBhcmUgbWF0Y2hlZCBieSB0aGVpciBzaW1pbGFyaXR5IGFuZCBub3QgYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBkb2N1bWVudC4KLVRvIHNwZWNpZnkgdGhhdCB0aGUgY2hpbGRyZW4gb2YgYW4gZWxlbWVudCBzaG91bGQgYmUgY29tcGFyZWQgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZS4gU2VlIHRoZSBuZXh0IHNlY3Rpb24gb24gT3JkZXJlZCBlbnRyaWVzLgotCi08aDI+QWRkaW5nIE9yZGVyZWQgZW50cmllczwvaDI+Ci1PcmRlcmVkIGVudHJpZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHRoZSBkaXJlY3QgY2hpbGRyZW4gKGV4Y2x1ZGluZyBhdHRyaWJ1dGVzKSBvZiBhbiB4bWwgZWxlbWVudCAtIGlkZW50aWZpZWQgYnkgaXRzIHBhdGggLSBzaG91bGQgYmUgY29tcGFyZWQgaW4gb3JkZXJlZCB3YXkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB1bm9yZGVyZWQgbWV0aG9kLgotPGJyPiBBcyBhbiBleGFtcGxlIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgQU5UIGZpbGUgaW4gdHdvIHNsaWdodGx5IGRpZmZlcmVudCB2ZXJzaW9uczoKLTx0YWJsZT4KLTx0cj4KLTx0ZD4KLTx0dD4KLTxwPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cD4mbHQ7cHJvamVjdCBuYW1lPSJvcmcuanVuaXQud2l6YXJkcyIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+Ci08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbHQ7dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iYnVpbGQiPgotPGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O21rZGlyIGRpcj0iJHtkZXN0ZGlyfSIgLz4KLTxicj4KLTxiPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2RlbGV0ZSBkaXI9IiR7ZGVzdH0iIC8+Ci08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bWtkaXIgZGlyPSIke2Rlc3R9IiAvPgotPGJyPgotPC9iPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2phcgotPGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7amFyZmlsZT0iJHtkZXN0fS9KVW5pdFdpemFyZC5qYXIiCi08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtiYXNlZGlyPSJiaW4iCi08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsvPgotPGJyPiZsdDsvcHJvamVjdD4KLTwvdHQ+Ci08L3RkPgotPHRkPgotJm5ic3A7Jm5ic3A7Ci08L3RkPgotPHRkPgotPHR0PgotPHA+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwPiZsdDtwcm9qZWN0IG5hbWU9Im9yZy5qdW5pdC53aXphcmRzIiBkZWZhdWx0PSJleHBvcnQiIGJhc2VkaXI9Ii4uIj4KLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZsdDt0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJidWlsZCI+Ci08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bWtkaXIgZGlyPSIke2Rlc3RkaXJ9Ii8+Ci08YnI+Ci08Yj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtta2RpciBkaXI9IiR7ZGVzdH0iLz4KLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtkZWxldGUgZGlyPSIke2Rlc3R9Ii8+Ci08YnI+Ci08L2I+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7amFyCi08YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtqYXJmaWxlPSIke2Rlc3R9L0pVbml0V2l6YXJkLmphciIKLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2Jhc2VkaXI9ImJpbiIKLTxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOy8+Ci08YnI+Ci08Yj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtjb3B5IGZpbGU9InBsdWdpbi54bWwiIHRvZGlyPSIke2Rlc3R9Ii8+Ci08L2I+Ci08YnI+Jmx0Oy9wcm9qZWN0PgotPC90dD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxicj4KLVRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gZG9jdW1lbnRzIGFyZSBzaG93biBpbiBib2xkLiBUd28gZWxlbWVudHMgaGF2ZSBiZWVuIHN3YXBwZWQgKDx0dD4mbHQ7bWtkaXIgZGlyPSIke2Rlc3R9Ii8+PC90dD4gYW5kIDx0dD4mbHQ7ZGVsZXRlIGRpcj0iJHtkZXN0fSIvPjwvdHQ+KSBhbmQgYSBuZXcgZWxlbWVudCAoPHR0PiZsdDtjb3B5IC4uLi8+PC90dD4pIGhhcyBiZWVuIGFwcGVuZGVkIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4KLTxicj4KLVBlcmZvcm1pbmcgYW4gdW5vcmRlcmVkIGNvbXBhcmUgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyB0cmVlIG9mIGRpZmZlcmVuY2VzOgotPGJyPgotPGJyPgotPGltZyBzcmM9Ik9yZGVyZWRfVW5vcmRlcmVkU2NoZW1lLmdpZiIgYWx0PSJEaWZmZXJlbmNlIFRyZWUgdXNpbmcgVW5vcmRlcmVkIE1hdGNoaW5nIj4KLTxicj4KLTxicj4KLVRoZSBmYWN0IHRoYXQgdHdvIGVsZW1lbnRzIGhhdmUgYmVlbiBzd2FwcGVkIGlzIG5vdCBzaG93biBzaW5jZSB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaXMgaWdub3JlZC4KLTxicj4KLUhvd2V2ZXIsIGZyb20gYW4gQU5UIHBvaW50IG9mIHZpZXcsIHRoZSB0d28gZG9jdW1lbnRzIGNhdXNlIHZlcnkgZGlmZmVyZW50IGJlaGF2aW91ciwgYmVjYXVzZSB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluc2lkZSBhIDx0dD50YXJnZXQ8L3R0PiBpcyBpbXBvcnRhbnQuCi1XZSB0aGVyZWZvcmUgd2FudCB0byBjcmVhdGUgYW4gPGk+b3JkZXJlZCBlbnRyeTwvaT4gZm9yIHRhcmdldCB0byBpbnN0cnVjdCB0aGUgY29tcGFyZSBlbmdpbmUgdG8gY29tcGFyZSB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRhcmdldCBpbiBvcmRlcmVkIGZhc2hpb24uCi08YnI+Ci1XZSBkbyBzbyBieSBmaXJzdCBjcmVhdGluZyBhIG5ldyBJRCBNYXBwaW5nIFNjaGVtZS4gVGhpcyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgYnV0dG9uIGluIHRoZSB0b29sYmFyLgotPGJyPjxicj4KLTxpbWcgc3JjPSJPcmRlcmVkX05ld0lETWFwU2NoZW1lLmdpZiIgYWx0PSJDcmVhdGluZyBhIG5ldyBJRCBNYXBwaW5nIFNjaGVtZSI+Ci08YnI+PGJyPgotQXNzdW1lIHdlIGNhbGwgdGhlIElEIE1hcHBpbmcgU2NoZW1lIDxlbT5NeUFOVDwvZW0+LgotPGJyPldlIG5vdyBzZWxlY3QgdGhlIElEIE1hcHBpbmcgU2NoZW1lIE15QU5UIGZyb20gdGhlIGRyb3AtZG93biBsaXN0IGluIHRoZSBUb29sYmFyIGFuZCBhZGQgdG8gaXQgdGhlIGZvbGxvd2luZyBPcmRlcmVkIEVudHJ5OgotPGJyPjxicj4KLTx0YWJsZT4KLTx0cj4KLTx0ZD4KLTxpbWcgc3JjPSJPcmRlcmVkX05ld09yZGVyZWRFbnRyeV9QcmVmZXJlbmNlUGFnZS5naWYiIGFsdD0iQ3JlYXRpbmcgYSBuZXcgb3JkZXJlcmVkIGVudHJ5IGZyb20gdGhlIHByZWZlcmVuY2UgcGFnZSI+Ci08L3RkPgotPHRkPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Ci08L3RkPgotPHRkPgotPGltZyBzcmM9Ik9yZGVyZWRfTmV3T3JkZXJlZEVudHJ5X0NvbnRleHRNZW51LmdpZiIgYWx0PSJDcmVhdGluZyBhIG5ldyBvcmRlcmVkIGVudHJ5IHVzaW5nIHRoZSBjb250ZXh0IG1lbnUiPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGJyPgotVGhpcyBjYW4gYmUgZG9uZSBmcm9tIHRoZSBwcmVmZXJlbmNlIHBhZ2UgKGxlZnQpIG9yIGZyb20gdGhlIGNvbnRleHQgbWVudSBpbiB0aGUgc3RydWN0dXJlIHZpZXcgKHJpZ2h0KS4KLTxicj4KLVRoZSBkaWZmZXJlbmNlIHRyZWUgbm93IGJlY29tZXM6Ci08YnI+Ci0oVG8gcmVmcmVzaCB0aGUgc3RydWN0dXJlIHZpZXcsIGNsaWNrIG9uIHRoZSA8aW1nIHNyYz0ic21hcnRtb2RlX2NvLmdpZiIgYWx0PSJCdXR0b24gZm9yIHVwZGF0aW5nIHZpZXciPiBidXR0b24gb2YgdGhlIGRyb3AtZG93biBsaXN0IGluIHRoZSB0b29sYmFyLikKLTxicj48YnI+Ci08aW1nIHNyYz0iT3JkZXJlZF9NeUFOVC5naWYiIGFsdD0iRGlmZmVyZW5jZSBUcmVlIHVzaW5nIE15QU5UIElEIE1hcHBpbmcgU2NoZW1lIj4KLTxicj48YnI+Ci1UaGlzIGlzIHRoZSBjb21wYXJlIHJlc3VsdCB0aGF0IHdlIHdhbnRlZCBhbmQgdGhhdCB3ZSBhY2hpZXZlZCBieSBjcmVhdGluZyBhbiBPcmRlcmVkIEVudHJ5LgotPGJyPgotPGJyPgotQWRkaXRpb25hbGx5LCBJZCBNYXBwaW5ncyAoc2VlIDxhIGhyZWY9IiNpZF9tYXBwaW5nIj5wcmV2aW91cyBzZWN0aW9uPC9hPikgY2FuIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgb3JkZXJlZCBjaGlsZHJlbi4gRXNwZWNpYWxseSB3aGVuIHRoZXJlIGFyZSBtYW55IGNoYW5nZXMsIHRoaXMgd2lsbCBpbXByb3ZlIGNvbXBhcmUgcmVzdWx0cy4KLTxicj4KLTxicj4KLVRoZSBYTUwgQ29tcGFyZSBQbHVnaW4gYWxyZWFkeSBjb21lcyB3aXRoIGEgSUQgTWFwcGluZyBTY2hlbWUgZm9yIEFOVCBmaWxlcywgd2hpY2ggY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIHBhcnRpY3VsYXIgQU5UIGZpbGVzLgotPGJyPjxicj4KLQotPHA+PGEgaHJlZj0iaGdsZWdhbC5odG0iPjxpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIiBCT1JERVI9MCBoZWlnaHQ9MTQgd2lkdGg9MzI0PjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC91aV94bWxjb21wYXJlX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9kb2MtaHRtbC91aV94bWxjb21wYXJlX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWUxYWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvZG9jLWh0bWwvdWlfeG1sY29tcGFyZV9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5YTUwgQ29tcGFyZSBQbHVnaW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4MDAwODAiPgotCi08Y2VudGVyPjxoMT5FY2xpcHNlIFBsYXRmb3JtIFhNTCBDb21wYXJlPC9oMT48L2NlbnRlcj4KLVRoZSBYTUwgQ29tcGFyZSBwbHVnaW4gYWxsb3dzIHlvdSB0byBwZXJmb3JtIGEgc3RydWN0dXJhbCBjb21wYXJlIG9mIHR3byBYTUwgZG9jdW1lbnRzLiBJdCByZXR1cm5zCi1hIGRpZmZlcmVuY2UgdHJlZSB3aGljaCBpbmRpY2F0ZXMgd2hpY2ggWE1MIGVsZW1lbnRzIGhhdmUgYmVlbiBhZGRlZCBvciByZW1vdmVkIGFuZCAtIGZvciBtb2RpZmllZCBYTUwgZWxlbWVudHMgLQotd2hhdCBkaWZmZXJlbmNlcyB0aGVyZSBhcmUgd2l0aCByZXNwZWN0IHRvIGF0dHJpYnV0ZXMgb3IgYm9keSB0ZXh0LgotPGgyPkluc3RhbGxpbmcgdGhlIHBsdWdpbjwvaDI+Ci08dWw+Ci08bGk+Q29weSB0aGUgZm9sZGVyIDx0dD5vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDwvdHQ+IHRvIHRoZSA8dHQ+cGx1Z2luczwvdHQ+IHN1YmZvbGRlciBvZiBFY2xpcHNlLgotPC91bD4KLTxoMj5Vc2luZyB0aGUgcGx1Z2luPC9oMj4KLVRoZSBwbHVnaW4gaXMgYXV0b21hdGljYWxseSB1c2VkIHdoZW4gY29tcGFyaW5nIGZpbGVzIHdpdGggdGhlIGV4dGVuc2lvbiAueG1sLgotPGJyPgotQnkgZGVmYXVsdCwgdGhlIFhNTCBjb21wYXJlIHVzZXMgdGhlIDxlbT5Vbm9yZGVyZWQ8L2VtPiBjb21wYXJlIG1ldGhvZCwgd2hpY2ggaWdub3JlcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIFhNTCBlbGVtZW50cyBhcHBlYXIgaW4gdGhlIGRvY3VtZW50IGFuZCBtYXRjaGVzIHRoZW0gc28gdGhhdCBlbGVtZW50cyB3aGljaCBhcmUgbW9zdCBzaW1pbGFyIGFyZSBtYXRjaGVkLgotVGhlcmUgaXMgYWxzbyBhbiA8ZW0+T3JkZXJlZDwvZW0+IGNvbXBhcmUgbWV0aG9kLCB3aGljaCBzaW1wbHkgY29tcGFyZXMgdGhlIFhNTCBlbGVtZW50cyBleGFjdGx5IGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgZG9jdW1lbnQuIEluIG1vc3QgY2FzZXMsIHRoaXMgY29tcGFyZSBtZXRob2Qgd2lsbCBub3QgYmUgb2YgbXVjaCB1c2UuCi08YnI+Ci1UaGUgY29tcGFyZSBtZXRob2QgY2FuIGJlIGNoYW5nZWQgZnJvbSBhIGRyb3AtZG93biBsaXN0IGluIHRoZSB0b29sYmFyIG9mIHRoZSBzdHJ1Y3R1cmUgdmlldy4KLTxicj4KLTxicj4KLVdoZW4gYW4gWE1MIGRvY3VtZW50Ci1jb250YWlucyBlbGVtZW50cyB0aGF0IGNhbiB1bmlxdWVseSBiZSBpZGVudGlmaWVkIGJ5IGFuIGF0dHJpYnV0ZSBvciB0aGUgdGV4dCBvZiBhIGNoaWxkIGVsZW1lbnQsCi1pdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFuIElEIE1hcHBpbmcgU2NoZW1lIGJlIGNyZWF0ZWQgZm9yIHRoaXMgdHlwZSBvZiBYTUwgZG9jdW1lbnQuCi08YnI+Ci08YnI+Ci1TZWUgPGEgaHJlZj0idHV0b3JpYWxfYW5kX2V4YW1wbGVzLmh0bWwiPlR1dG9yaWFsIGFuZCBFeGFtcGxlczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIHBsdWdpbi4KLTxicj4KLTxoMz5JRCBNYXBwaW5nIFNjaGVtZXM8L2gzPgotQW4gSUQgTWFwcGluZyBTY2hlbWUgc3BlY2lmaWVzIGZvciBYTUwgZWxlbWVudHMgYW4gYXR0cmlidXRlIG9yIHRoZSB0ZXh0IG9mIGEgY2hpbGQgZWxlbWVudCB0aGF0Ci11bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgZWxlbWVudC4gVGhpcyBhc3N1cmVzIHRoYXQgLSBpbiB0aGUgY29tcGFyZSBwcm9jZXNzIC0gdGhlIHJpZ2h0IGVsZW1lbnRzIHdpbGwgYmUgCi1tYXRjaGVkIGFuZCB0aGVyZWZvcmUgY29tcGFyZWQgd2l0aCBlYWNoIG90aGVyLiBJZiBmb3IgYW4gWE1MIGVsZW1lbnQgbm8gSUQgTWFwcGluZyBpcyBzcGVjaWZpZWQsIGEgZ2VuZXJhbCBtYXRjaGluZyBhbGdvcml0aG0KLWlzIGJlIHVzZWQuIEhvd2V2ZXIsIHRoaXMgZ2VuZXJhbCBtYXRjaGluZyBhbGdvcml0aG0gZG9lcyBub3QgYWx3YXlzIHJldHVybiB0aGUgZGVzaXJlZCByZXN1bHQuCi1UaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIGdlbmVyYWwgbWF0Y2hpbmcgYWxnb3JpdGhtIGxvb2tzIGZvciBhIG1hdGNoaW5nIG9mIHRoZSBub2RlcyBvZiB0aGUgdHdvIHBhcnNlZCB0cmVlcwotdG8gY29tcGFyZSB0aGF0IG1pbmltaXplcyB0aGUgZGlmZmVyZW5jZXMuIFRoZSBlZmZlY3QgaXMgdGhhdCBvZnRlbiB0d28gWE1MIGVsZW1lbnRzIGFyZSBtYXRjaGVkIHdpdGggYXJlCi1zdHJ1Y3R1cmFsbHkgc2ltaWxhciBidXQgcmVwcmVzZW50IHR3byBjb21wbGV0ZWx5IGRpZmZlcmVudCBlbnRpdGllcyBvZiBpbmZvcm1hdGlvbi4KLTxicj4KLTxoMz5PcmRlcmVkIGVudHJpZXM8L2gzPgotV2hlbiB1c2luZyB0aGUgZGVmYXVsdCBVbm9yZGVyZWQgY29tcGFyZSAod2l0aCBvciB3aXRob3V0IGlkIG1hcHBpbmdzKSBpdCBpcyBzb21ldGltZXMgZGVzaXJlZCB0byBzcGVjaWZ5IHRoYXQgdGhlIGNoaWxkcmVuIG9mIGNlcnRhaW4gZWxlbWVudHMgYmUgY29tcGFyZWQgaW4gb3JkZXJlZCBmYXNoaW9uIGludGVhZCBvZiB0aGUgdXN1YWwgdW5vcmRlcmVkIG1ldGhvZC4KLUZvciBleGFtcGxlLCB3aGVuIGNvbXBhcmluZyBBTlQgZmlsZXMgdGhlIG9yZGVyIG9mIGFwcGVhcmFuY2Ugb2YgdGhlIGNoaWxkcmVuIG9mIDx0dD50YXJnZXQ8L3R0PiBlbGVtZW50cyBpcyBpbXBvcnRhbnQuCi08YnI+SW4gc3VjaCBjYXNlcyBvbmUgY2FuIGNyZWF0ZSBhbiA8aT5PcmRlcmVkIGVudHJ5PC9pPi4gQW4gT3JkZXJlZCBlbnRyeSBzcGVjaWZpZXMgdGhhdCB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIGFuIHhtbCBlbGVtZW50LCBpZGVudGlmaWVkIGJ5IGl0cyBwYXRoLCB3aWxsIGJlIGNvbXBhcmVkIGluIG9yZGVyZWQgZmFzaGlvbiAoYXR0cmlidXRlcyBob3dldmVyIGFyZSBzdGlsbCBjb21wYXJlZCBpbiB1bm9yZGVyZWQgd2F5KS4KLVRoZSBjaGlsZHJlbiBvZiB0aGVzZSBjaGlsZHJlbiB3aWxsIGNvbnRpbnVlIHRvIGJlIGNvbXBhcmVkIGluIHVub3JkZXJlZCB3YXksIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLgotPGgzPkRlZmluaW5nIElEIE1hcHBpbmcgU2NoZW1lcyBhbmQgT3JkZXJlZCBlbnRyaWVzPC9oMz4KLUlEIE1hcHBpbmcgU2NoZW1lcyBjYW4gYmUgY3JlYXRlZCBpbiB0aHJlZSBkaWZmZXJlbnQgd2F5czoKLTxvbD4KLTxsaT5CeSBleHRlbmRpbmcgdGhlIGV4dGVuc2lvbiBwb2ludCA8YSBocmVmPSJpZE1hcHBpbmcuaHRtbCI+PGVtPmlkTWFwcGluZzwvZW0+PC9hPjwvbGk+Ci08bGk+VXNpbmcgdGhlIDxhIGhyZWY9IlByZWZlcmVuY2VQYWdlLmdpZiI+WE1MIENvbXBhcmUgUHJlZmVyZW5jZSBwYWdlPC9hPi48L2xpPgotPGxpPlVzaW5nIHRoZSA8YSBocmVmPSJDcmVhdGVOZXdJRE1hcEJ1dHRvbi5naWYiPkNyZWF0ZSBuZXcgSWQgTWFwIFNjaGVtZSBidXR0b248L2E+IGluIHRoZSB0b29sYmFyIGFuZCB0aGUgPGEgaHJlZj0iSURNYXBDb250ZXh0TWVudS5naWYiPmNvbnRleHQgbWVudTwvYT4KLTwvb2w+Ci1NZXRob2QgMSBjcmVhdGVzIGEgc28tY2FsbGVkIDxlbT5pbnRlcm5hbDwvZW0+IG1hcHBpbmcgc2NoZW1lLiBBbiBpbnRlcm5hbCBJRCBNYXBwaW5nIFNjaGVtZQotY2Fubm90IGJlIGVkaXRlZCBhdCBydW50aW1lLiBIb3dldmVyLCB1c2luZyB0aGUgPGEgaHJlZj0iRWRpdENvcHkuZ2lmIj48ZW0+RWRpdCBDb3B5PC9lbT48L2E+IGJ1dHRvbiBpbiB0aGUgUHJlZmVyZW5jZSBQYWdlLCBhbiBlZGl0YWJsZSBjb3B5IG9mIHRoZQotaW50ZXJuYWwgSUQgTWFwcGluZyBTY2hlbWUgY2FuIGJlIGNyZWF0ZWQuCi08YnI+Ci1NZXRob2RzIDIgYW5kIDMgY3JlYXRlIHNvLWNhbGxlZCA8ZW0+dXNlcjwvZW0+IG1hcHBpbmcgc2NoZW1lcy4gVGhlc2UgYXJlIGNyZWF0ZWQgYnkgdGhlIHVzZXIgYXQgcnVudGltZSBhbmQKLWNhbiBiZSBtb2RpZmllZCBhbnl0aW1lIGluIHRoZSBQcmVmZXJlbmNlIFBhZ2UuCi08cD5JbnRlcm5hbCBhbmQgdXNlciBtYXBwaW5nIHNjaGVtZXMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgZXh0ZW5zaW9uLiBBcyBhIHJlc3VsdCwgd2hlbiBjb21wYXJpbmcgdHdvIFhNTCBmaWxlcyB3aXRoIHRoaXMgZmlsZSBleHRlbnNpb24sIHRoZSBwYXJ0aWN1bGFyIElEIE1hcHBpbmcgc2NoZW1lIHdpdGggdGhpcyBleHRlbnNpb24KLWlzIGF1dG9tYXRpY2FsbHkgdXNlZC4KLTxicj4KLTxicj4KLVdoZW4gY3JlYXRpbmcgb3IgZWRpdGluZyB0aGUgSUQgbWFwcGluZyBmb3IgYSBwYXJ0aWN1bGFyIFhNTCBlbGVtZW50LCBmb3VyIGl0ZW1zIG11c3QgYmUgc3BlY2lmaWVkIChzZWUgPGEgaHJlZj0iSURNYXBfTmV3TWFwcGluZ19QcmVmZXJlbmNlUGFnZS5naWYiPmV4YW1wbGU8L2E+KToKLTxvbD4KLTxsaT5UaGUgZWxlbWVudCBuYW1lLjwvbGk+Ci08bGk+VGhlIGVsZW1lbnQgcGF0aC4gVGhpcyBpcyB0aGUgcGF0aCBvZiB0aGUgZWxlbWVudCBmcm9tIHRoZSByb290IG9mIHRoZSBYTUwgZG9jdW1lbnQgdG8gdGhlIGVsZW1lbnQncyBwYXJlbnQuPC9saT4KLTxsaT5UaGUgbmFtZSBvZiB0aGUgaWQgd2hpY2ggd2lsbCBpZGVudGlmeSB0aGUgZWxlbWVudDwvbGk+Ci08bGk+V2hldGhlciB0aGUgaWQgbmFtZSBpbiBwb2ludCAzIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudCBvciB0aGUgbmFtZSBvZiBvbmUgb2YgaXRzIGNoaWxkcmVuIChpbiB3aGljaCBjYXNlIHRoZSB0ZXh0IG9mIHRoaXMgY2hpbGQgZWxlbWVudAotd2lsbCBiZSB1c2VkIGFzIGlkKS48L2xpPgotPC9vbD4KLTxicj4KLTxociBXSURUSD0iMTAwJSI+Ci08aDE+Ci1FeHRlbnNpb24gUG9pbnRzPC9oMT4KLU9ubHkgb25lIGV4dGVuc2lvbiBwb2ludCBpcyBhdmFpbGFibGUgaW4gdGhlIFhNTCBDb21wYXJlIHBsdWdpbi4gSXQgaXMgdXNlZCB0byBjcmVhdGUKLWludGVybmFsIElEIE1hcHBpbmcgU2NoZW1lczoKLTx1bD4KLTxsaT4KLTxhIGhyZWY9ImlkTWFwcGluZy5odG1sIj5vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5pZE1hcHBpbmc8L2E+PC9saT4KLTwvdWw+Ci0KLTxwPjxhIGhyZWY9ImhnbGVnYWwuaHRtIj48aW1nIFNSQz0ibmdpYm1jcHkuZ2lmIiBBTFQ9IkNvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDAzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIgQk9SREVSPTAgaGVpZ2h0PTE0IHdpZHRoPTMyND48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvaWNvbnMvZnVsbC9vYmoxNi9hZGRpZG1hcC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9pY29ucy9mdWxsL29iajE2L2FkZGlkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkYWQ4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9pY29ucy9mdWxsL29iajE2L2FkZGlkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiN2I0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfb2JqLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29yZGVyZWRfb2JqLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vcmRlcmVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YWRmN2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29yZGVyZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvc21hcnRtb2RlX2NvLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvc21hcnRtb2RlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyZGRkYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9pY29ucy9mdWxsL29iajE2L3NtYXJ0bW9kZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9pY29ucy9mdWxsL29iajE2L3RleHRfb2JqLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvdGV4dF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJiNGI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL2ljb25zL2Z1bGwvb2JqMTYvdGV4dF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczZjUxZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUmVzb3VyY2Ugc3RyaW5ncyBmb3IgWE1MIENvbXBhcmUgRXhhbXBsZXMgcGx1Z2luLnhtbCBmaWxlCi0jCi1wbHVnaW5OYW1lPSBYTUwgQ29tcGFyZSBTdXBwb3J0Ci1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lUHJlZmVyZW5jZVBhZ2U9IFhNTCBDb21wYXJlCi1pZE1hcHBpbmc9IElEIE1hcHBpbmcKLQotYW50TWFwPUFOVAotZWNsaXBzZVBsdWdpbk1hcD1FY2xpcHNlIFBsdWdpbgotY2xhc3NwYXRoTWFwPUVjbGlwc2UgQ2xhc3NQYXRoCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1ZmFiNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5YTUxQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InhtbGNvbXBhcmVleGFtcGxlcy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICAKLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaWRNYXBwaW5nIiBuYW1lPSIlaWRNYXBwaW5nIiBzY2hlbWE9InNjaGVtYS9pZE1hcHBpbmcuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwuaWRNYXBwaW5nIj4KLSAgICAgIDxpZG1hcAotICAgICAgICAgICAgbmFtZT0iJWFudE1hcCIKLSAgICAgICAgICAgIGlkPSJhbnRNYXAiPgotICAgICAgICAgPG1hcHBpbmcKLSAgICAgICAgICAgICAgIHNpZ25hdHVyZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgIGlkPSJuYW1lIj4KLSAgICAgICAgIDwvbWFwcGluZz4KLSAgICAgICAgIDxtYXBwaW5nCi0gICAgICAgICAgICAgICBzaWduYXR1cmU9InByb2plY3QmZ3Q7dGFyZ2V0IgotICAgICAgICAgICAgICAgaWQ9Im5hbWUiPgotICAgICAgICAgPC9tYXBwaW5nPgotICAgICAgICAgPG9yZGVyZWQKLSAgICAgICAgICAgICAgIHNpZ25hdHVyZT0icHJvamVjdCZndDt0YXJnZXQiPgotICAgICAgICAgPC9vcmRlcmVkPgotICAgICAgPC9pZG1hcD4KLSAgICAgIDxpZG1hcAotICAgICAgICAgICAgbmFtZT0iJWVjbGlwc2VQbHVnaW5NYXAiCi0gICAgICAgICAgICBpZD0iZWNsaXBzZVBsdWdpbk1hcCI+Ci0gICAgICAgICA8bWFwcGluZwotICAgICAgICAgICAgICAgc2lnbmF0dXJlPSJwbHVnaW4iCi0gICAgICAgICAgICAgICBpZD0iaWQiPgotICAgICAgICAgPC9tYXBwaW5nPgotICAgICAgICAgPG1hcHBpbmcKLSAgICAgICAgICAgICAgIHNpZ25hdHVyZT0icGx1Z2luJmd0O3JlcXVpcmVzJmd0O2ltcG9ydCIKLSAgICAgICAgICAgICAgIGlkPSJwbHVnaW4iPgotICAgICAgICAgPC9tYXBwaW5nPgotICAgICAgICAgPG1hcHBpbmcKLSAgICAgICAgICAgICAgIHNpZ25hdHVyZT0icGx1Z2luJmd0O3J1bnRpbWUmZ3Q7bGlicmFyeSIKLSAgICAgICAgICAgICAgIGlkPSJuYW1lIj4KLSAgICAgICAgIDwvbWFwcGluZz4KLSAgICAgICAgIDxtYXBwaW5nCi0gICAgICAgICAgICAgICBzaWduYXR1cmU9InBsdWdpbiZndDtydW50aW1lJmd0O2xpYnJhcnkmZ3Q7ZXhwb3J0IgotICAgICAgICAgICAgICAgaWQ9Im5hbWUiPgotICAgICAgICAgPC9tYXBwaW5nPgotICAgICAgICAgPG1hcHBpbmcKLSAgICAgICAgICAgICAgIHNpZ25hdHVyZT0icGx1Z2luJmd0O2V4dGVuc2lvbi1wb2ludCIKLSAgICAgICAgICAgICAgIGlkPSJpZCI+Ci0gICAgICAgICA8L21hcHBpbmc+Ci0gICAgICAgICA8bWFwcGluZwotICAgICAgICAgICAgICAgc2lnbmF0dXJlPSJwbHVnaW4mZ3Q7ZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgaWQ9InBvaW50Ij4KLSAgICAgICAgIDwvbWFwcGluZz4KLSAgICAgIDwvaWRtYXA+Ci0gICAgICA8aWRtYXAKLSAgICAgICAgICAgIG5hbWU9IiVjbGFzc3BhdGhNYXAiCi0gICAgICAgICAgICBleHRlbnNpb249IkNMQVNTUEFUSCIKLSAgICAgICAgICAgIGlkPSJjbGFzc3BhdGhNYXAiPgotICAgICAgICAgPG1hcHBpbmcKLSAgICAgICAgICAgICAgIHNpZ25hdHVyZT0iY2xhc3NwYXRoJmd0O2NsYXNzcGF0aGVudHJ5IgotICAgICAgICAgICAgICAgaWQ9InBhdGgiPgotICAgICAgICAgPC9tYXBwaW5nPgotICAgICAgPC9pZG1hcD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVNZXJnZVZpZXdlcnMiPgotICAgICAgPHZpZXdlcgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ieG1sLGNsYXNzcGF0aCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5YTUxTdHJ1Y3R1cmVWaWV3ZXJDcmVhdG9yIj4KLSAgICAgIDwvdmlld2VyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVwbHVnaW5OYW1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLldvcmtiZW5jaCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5YTUxDb21wYXJlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwuWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NjaGVtYS9pZE1hcHBpbmcuZXhzZCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NjaGVtYS9pZE1hcHBpbmcuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiOTRhZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zY2hlbWEvaWRNYXBwaW5nLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sIiBpZD0iaWRNYXBwaW5nIiBuYW1lPSJYTUwgSWQgTWFwcGluZyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdG8gZGVmaW5lIGludGVybmFsIFhNTCBJRCBNYXBwaW5nIHNjaGVtZXMgdXNpbmcgdGhlICZsdDtpJmd0O21hcHBpbmcmbHQ7L2kmZ3Q7IGVsZW1lbnQuCi1UaGVzZSBzY2hlbWVzIGNhbiB0aGVuIGJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGFuIFhNTCBjb21wYXJlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IFhNTCBlbGVtZW50cyBieSB0aGUKLXZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvciB0aGUgdGV4dCBpbiBhIGNoaWxkIGVsZW1lbnQuCi1BZGRpdGlvbmFsbHksICZsdDtpJmd0O29yZGVyZWQmbHQ7L2kmZ3Q7IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQKLXNob3VsZCBiZSBjb21wYXJlZCBpbiBhbiBvcmRlcmVkIGZhc2hpb24gaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB1bm9yZGVyZWQgd2F5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpZE1hcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpZE1hcCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcHBpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3JkZXJlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgSUQgTWFwcGluZyBzY2hlbWUuIFNob3VsZCBiZSB1bmlxdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgSUQgTWFwcGluZyBTY2hlbWUuCi1XaGVuIGNvbXBhcmluZyBmaWxlcyB3aXRoIHRoaXMgZXh0ZW5zaW9uLCB0aGUgY3VycmVudCBJRCBNYXBwaW5nCi1TY2hlbWUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVzZWQuIAotSWYgYW4gZXh0ZW5zaW9uIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBhbHNvIGJlIGFkZGVkCi1pbiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIHRoZSBYTUwgQ29tcGFyZSBQbHVnaW4uIEZvciBleGFtcGxlLCBpZiB3ZQotY3JlYXRlIGFuIElEIE1hcHBpbmcgU2NoZW1lIHdpdGggZXh0ZW5zaW9uIGNkLCB0aGUgcGx1Z2luLnhtbCBvZiB0aGUKLVhNTCBDb21wYXJlIFBsdWdpbiBpcyB1cGRhdGVkIGFzIGZvbGxvd3MgKHVwZGF0ZSBzaG93biBpbiBib2xkKTogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIAotysrKysrKcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVNZXJnZVZpZXdlcnMmcXVvdDsmZ3Q7IAotICZsdDtzdHJ1Y3R1cmVNZXJnZVZpZXdlciAKLcrKysrKysrKymV4dGVuc2lvbnM9JnF1b3Q7eG1sLGNsYXNzcGF0aCxjZCZxdW90OwotysrKysrKysrKY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS54bWwuWE1MU3RydWN0dXJlVmlld2VyQ3JlYXRvciZxdW90OwotIC8mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1XYXJuaW5nOiBJZiBhbiBleHRlbnNpb24gaXMgYXNzb2NpYXRlZCBtb3JlIHRoYW4gb25jZSwgb25seSB0aGUgZmlyc3QKLWFzc29jaWF0aW9uIHdpbGwgYmUgY29uc2lkZXJlZC4gQWxzbywgaW50ZXJuYWwgSUQgTWFwcGluZyBzY2hlbWVzIGhhdmUKLXByaW9yaXR5IG92ZXIgdXNlciBJRCBNYXBwaW5nIHNjaGVtZXMgd2hlbiBkdXBsaWNhdGUgZXh0ZW5zaW9ucyBhcmUgZGVmaW5lZC4gCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVdhcm5pbmc6IFdoZW4gYW4gaW50ZXJuYWwgSUQgTWFwcGluZyBzY2hlbWUgd2l0aCBleHRlbnNpb24gYXNzb2NpYXRpb24gaXMKLXJlbW92ZWQgKGZyb20gYSBwbHVnaW4ueG1sICksIHRoZSBYTUwgQ29tcGFyZSBwbHVnaW4gaGFzIHRvIGJlIHJlbG9hZGVkCi10byBkaXNhc3NvY2lhdGUgaXRzZWxmIGZyb20gdGhlIGV4dGVuc2lvbi4gSWYgbm90LCBvbiB0aGUgZmlyc3QgY29tcGFyZQotb2YgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbiwgdGhlIFhNTCBDb21wYXJlIHBsdWdpbiB3aWxsIGJlIHVzZWQgd2l0aAotdGhlIGRlZmF1bHQgVW5vcmRlcmVkIGFsZ29yaXRobS4gKEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgdGhlIGV4dGVuc2lvbgotd2lsbCBoYXZlIGJlZW4gZGlzYXNzb2NpYXRlZCBmcm9tIHRoZSBYTUwgUGx1Z2luLCBhcyB0aGUgcGx1Z2luIGhhcyBiZWVuIGxvYWRlZC4pCi0mbHQ7L3AmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcHBpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaWduYXR1cmUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIFhNTCBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCAoc2VlIGV4YW1wbGVzIGJlbG93KS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgYXR0cmlidXRlIHRoYXQgaWRlbnRpZmllcyB0aGlzIGVsZW1lbnQgb3IgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGVsZW1lbnQgd2hvc2UgdGV4dCBpZGVudGlmaWVzIHRoaXMgZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZC1zb3VyY2UiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgaWYgaWQgaXMgdGhlIG5hbWUgb2YgYSBjaGlsZCBlbGVtZW50LCB0aGVuIHRoaXMgYXR0cmlidXRlIG11c3QgaGF2ZSB0aGUgdmFsdWUgYm9keS4KLUlmIGlkLXNvdXJjZSBpcyBsZWZ0IG91dCwgaXQgaXMgYXNzdW1lZCB0aGF0IGlkIGlzIGFuIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib3JkZXJlZCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNpZ25hdHVyZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgWE1MIHBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgZWxlbWVudCB3aG9zZSBkaXJlY3QgY2hpbGRyZW4gd2lsbCBiZQotY29tcGFyZWQgaW4gb3JkZXJlZCBmYXNoaW9uIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgdW5vcmRlcmVkIHdheS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIElEIE1hcHBpbmdzIFNjaGVtZSBmb3IgQU5UIGZpbGVzLiAKLSZsdDtpJmd0O3Byb2plY3QmbHQ7L2kmZ3Q7IGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkIGJ5IGFuICZsdDtpJmd0O2F0dHJpYnV0ZSBuYW1lJmx0Oy9pJmd0Oy4gJmx0O2kmZ3Q7dGFyZ2V0Jmx0Oy9pJmd0OyBlbGVtZW50cyAod2hpY2ggYXJlIGNoaWxkcmVuIG9mICZsdDtpJmd0O3Byb2plY3QmbHQ7L2kmZ3Q7KSBhcmUgYWxzbyBpZGVudGlmaWVkIGJ5IGFuIGF0dHJpYnV0ZSAmbHQ7aSZndDtuYW1lJmx0Oy9pJmd0Oy4gQWxzbywgdGhlIGNoaWxkcmVuIG9mICZsdDtpJmd0O3RhcmdldCZsdDsvaSZndDsgd2lsbCBiZSBjb21wYXJlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIGRvY3VtZW50LgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludCA9ICZxdW90O29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLmlkTWFwcGluZyZxdW90OyZndDsgCi0gJmx0O2lkbWFwIG5hbWU9JnF1b3Q7QU5UJnF1b3Q7Jmd0OwotICAmbHQ7bWFwcGluZyBzaWduYXR1cmU9JnF1b3Q7cHJvamVjdCZxdW90OyBpZD0mcXVvdDtuYW1lJnF1b3Q7LyZndDsKLSAgJmx0O21hcHBpbmcgc2lnbmF0dXJlPSZxdW90O3Byb2plY3QmZ3Q7dGFyZ2V0JnF1b3Q7IGlkPSZxdW90O25hbWUmcXVvdDsvJmd0OwotICAmbHQ7b3JkZXJlZCBzaWduYXR1cmU9JnF1b3Q7cHJvamVjdCZndDt0YXJnZXQmcXVvdDsvJmd0OwotICZsdDtpZG1hcCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgY2FzZSB3aGVyZSB0aGUgdGV4dCBvZiBhIGNoaWxkIGVsZW1lbnQgaXMgdXNlZCBhcyB0aGUgaWQ6Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50ID0gJnF1b3Q7b3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwuaWRNYXBwaW5nJnF1b3Q7Jmd0OyAKLSAmbHQ7aWRtYXAgbmFtZT0mcXVvdDtCb29rIENhdGFsb2cmcXVvdDsgZXh0ZW5zaW9uPSZxdW90O2Jvb2smcXVvdDsmZ3Q7Ci0gICZsdDttYXBwaW5nIHNpZ25hdHVyZT0mcXVvdDtjYXRhbG9nJmd0O2Jvb2smcXVvdDsgaWQ9JnF1b3Q7aXNibiZxdW90OyBpZC1zb3VyY2U9JnF1b3Q7Ym9keSZxdW90Oy8mZ3Q7Ci0gJmx0O2lkbWFwJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgWE1MIENvbXBhcmUgcGx1Z2luIGRlZmluZXMgYW4gSUQgTWFwcGluZyBzY2hlbWUgZm9yIEVjbGlwc2UgJmx0O3NhbXAmZ3Q7cGx1Z2luLnhtbCZsdDsvc2FtcCZndDsgZmlsZXMsIG9uZSBmb3IgJmx0O3NhbXAmZ3Q7LmNsYXNzcGF0aCZsdDsvc2FtcCZndDsgZmlsZXMgYW5kIG9uZSBmb3IgQW50IGZpbGVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0Fic3RyYWN0TWF0Y2hpbmcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9BYnN0cmFjdE1hdGNoaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjI2NGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0Fic3RyYWN0TWF0Y2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuSVJhbmdlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIuUmFuZ2VEaWZmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUucmFuZ2VkaWZmZXJlbmNlci5SYW5nZURpZmZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWF0Y2hpbmcgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9fRU5UUlkgPSAtMTsvL3ZhbHVlIHdpdGggd2hpY2ggZkRUIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05fRUxFTUVOVD0gWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQ7Ci0JaW50W11bXSBmRFQ7Ly9EaXN0YW5jZSBUYWJsZTsgMXN0IGluZGV4IGZyb20gZk5MZWZ0LCAybmQgaW5kZXggZnJvbSBmTlJpZ2h0Ci0JQXJyYXlMaXN0W11bXSBmRFRfTWF0Y2hpbmdzOy8vTWF0aGluZyBlbnRyaWVzIG9mIGNoaWxkcmVuIGZvciBhIG1hdGNoLiAxc3QgaW5kZXggZnJvbSBmTkxlZnQsIDJuZCBpbmRleCBmcm9tIGZOUmlnaHQKLQlWZWN0b3IgZk5MZWZ0OwotCVZlY3RvciBmTlJpZ2h0OwotCVZlY3RvciBmTWF0Y2hlczsKLQkKLQkvKiBtZXRob2RzIHVzZWQgZm9yIG1hdGNoICovCi0KLQkvKiBmaW5kcyBhbGwgdGhlIGxlYXZlcyBvZiBhIHRyZWUgYW5kIHB1dHMgdGhlbSBpbiBhIHZlY3RvciAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRMZWF2ZXMoWE1MTm9kZSByb290LCBBcnJheUxpc3QgbGVhdmVzKSB7Ci0JCWlmIChpc0xlYWYocm9vdCkpIHsKLQkJCWxlYXZlcy5hZGQocm9vdCk7CQkJCi0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlmaW5kTGVhdmVzKChYTUxOb2RlKSBjaGlsZHJlbltpXSwgbGVhdmVzKTsKLQkJfQotCX0KLQotCS8qIHRydWUgaWYgeCBpcyBhIGxlYWYgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xlYWYoWE1MTm9kZSB4KSB7Ci0JCWlmICh4ID09IG51bGwpIHJldHVybiB0cnVlOwotCQlyZXR1cm4geC5nZXRDaGlsZHJlbigpID09IG51bGwgfHwgeC5nZXRDaGlsZHJlbigpLmxlbmd0aCA8PSAwOwotCX0KLQotCS8qIE51bWJlcnMgYWxsIG5vZGVzIG9mIHRyZWUuIFRoZSBudW1iZXIgb2YgeCBpcyBpdHMgaW5kZXggaW4gdGhlIHZlY3RvciBudW1iZXJpbmcgKi8KLQlwcm90ZWN0ZWQgdm9pZCBudW1iZXJOb2RlcyhYTUxOb2RlIHJvb3QsIFZlY3RvciBudW1iZXJpbmcpIHsKLQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJbnVtYmVyaW5nLmFkZChyb290KTsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJCW51bWJlck5vZGVzKChYTUxOb2RlKSBjaGlsZHJlbltpXSwgbnVtYmVyaW5nKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiBjb3VudHMgIyBvZiBub2RlcyBpbiB0cmVlIGluY2x1ZGluZyByb290ICovCi0JcHJvdGVjdGVkIGludCBjb3VudE5vZGVzKFhNTE5vZGUgcm9vdCkgewotCQlpZiAocm9vdCA9PSBudWxsKSByZXR1cm4gMDsKLQkJaW50IGNvdW50ID0gMTsKLQkJaWYgKGlzTGVhZihyb290KSkgcmV0dXJuIGNvdW50OwotCQlPYmplY3RbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJY291bnQrPWNvdW50Tm9kZXMoKFhNTE5vZGUpIGNoaWxkcmVuW2ldKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qIHJldHVybnMgaW5kZXggb2Ygbm9kZSB4IGluIGZOTGVmdCAqLwotCXByb3RlY3RlZCBpbnQgaW5kZXhPZkxOIChYTUxOb2RlIHgpIHsKLQkJaW50IGk9IDA7Ci0JCXdoaWxlICgoaTxmTkxlZnQuc2l6ZSgpKSAmJiAoZk5MZWZ0LmVsZW1lbnRBdChpKSAhPSB4KSkKLQkJCWkrKzsKLQkJcmV0dXJuIGk7Ci0JfQotCQotCS8qIHJldHVybnMgaW5kZXggb2Ygbm9kZSB5IGluIGZOUmlnaHQgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2ZSTiAoWE1MTm9kZSB5KSB7Ci0JCWludCBqPSAwOwotCQl3aGlsZSAoKGo8Zk5SaWdodC5zaXplKCkpICYmIChmTlJpZ2h0LmVsZW1lbnRBdChqKSAhPSB5KSkKLQkJCWorKzsKLQkJcmV0dXJuIGo7Ci0JfQotCi0vKiBmb3IgdGVzdGluZyAqLwotIAlwdWJsaWMgVmVjdG9yIGdldE1hdGNoZXMoKSB7Ci0gIAkJcmV0dXJuIGZNYXRjaGVzOwotICAgCX0KLQotCXByb3RlY3RlZCBjbGFzcyBYTUxDb21wYXJhdG9yIGltcGxlbWVudHMgSVJhbmdlQ29tcGFyYXRvciB7Ci0JCi0JCXByaXZhdGUgT2JqZWN0W10gZlhNTF9lbGVtZW50czsKLQkKLQkJcHVibGljIFhNTENvbXBhcmF0b3IoT2JqZWN0W10geG1sX2VsZW1lbnRzKSB7Ci0JCQlmWE1MX2VsZW1lbnRzPSB4bWxfZWxlbWVudHM7Ci0JCX0KLQkKLQkJLyoKLQkJICogQHNlZSBJUmFuZ2VDb21wYXJhdG9yI2dldFJhbmdlQ291bnQoKQotCQkgKi8KLQkJcHVibGljIGludCBnZXRSYW5nZUNvdW50KCkgewotCQkJcmV0dXJuIGZYTUxfZWxlbWVudHMubGVuZ3RoOwotCQl9Ci0JCi0JCS8qCi0JCSAqIEBzZWUgSVJhbmdlQ29tcGFyYXRvciNyYW5nZXNFcXVhbChpbnQsIElSYW5nZUNvbXBhcmF0b3IsIGludCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJhbmdlc0VxdWFsKAotCQkJaW50IHRoaXNJbmRleCwKLQkJCUlSYW5nZUNvbXBhcmF0b3Igb3RoZXJfaXJjLAotCQkJaW50IG90aGVySW5kZXgpIHsKLQkJCQotCQkJaWYgKG90aGVyX2lyYyBpbnN0YW5jZW9mIFhNTENvbXBhcmF0b3IpIHsKLQkJCQlYTUxDb21wYXJhdG9yIG90aGVyPSAoWE1MQ29tcGFyYXRvcikgb3RoZXJfaXJjOwotCQkJCS8vcmV0dXJuICgoWE1MTm9kZSlmWE1MX2VsZW1lbnRzW3RoaXNJbmRleF0pLnN1YnRyZWVFcXVhbHMob3RoZXIuZ2V0WE1MX2VsZW1lbnRzKClbb3RoZXJJbmRleF0pOwotCQkJCQotCQkJCS8vb3JkZXJlZCBjb21wYXJlIG9mIHN1YnRyZWVzCi0JCQkJLy9ib29sZWFuIHJlc3VsdD0gKChYTUxOb2RlKWZYTUxfZWxlbWVudHNbdGhpc0luZGV4XSkuc3VidHJlZUVxdWFscyhvdGhlci5nZXRYTUxfZWxlbWVudHMoKVtvdGhlckluZGV4XSk7Ci0JCQkJCi0JCQkJLy90YWtpbmcgaWRzIGludG8gYWNjb3VudAotCQkJCWJvb2xlYW4gc2FtZUlkPSBmYWxzZTsKLQkJCQlYTUxOb2RlIHRoaXNOb2RlPSAoWE1MTm9kZSlmWE1MX2VsZW1lbnRzW3RoaXNJbmRleF07Ci0JCQkJWE1MTm9kZSBvdGhlck5vZGU9IChYTUxOb2RlKW90aGVyLmdldFhNTF9lbGVtZW50cygpW290aGVySW5kZXhdOyAKLQkJCQlpZiAoIHRoaXNOb2RlLnVzZXNJRE1BUCgpICYmIG90aGVyTm9kZS51c2VzSURNQVAoKSApIHsKLQkJCQkJaWYgKCBvdGhlck5vZGUuZ2V0T3JpZ0lkKCkuZXF1YWxzKHRoaXNOb2RlLmdldE9yaWdJZCgpKSApIHsKLQkJCQkJCXNhbWVJZD0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL3Vub3JkZXJlZCBjb21wYXJlIG9mIHN1YnRyZWVzCi0JCQkJaW50IGRpc3RhbmNlPSBkaXN0KChYTUxOb2RlKW90aGVyLmdldFhNTF9lbGVtZW50cygpW290aGVySW5kZXhdICwgKFhNTE5vZGUpZlhNTF9lbGVtZW50c1t0aGlzSW5kZXhdKTsKLQkJCQlyZXR1cm4gc2FtZUlkIHx8IGRpc3RhbmNlID09IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJLyoKLQkJICogQHNlZSBJUmFuZ2VDb21wYXJhdG9yI3NraXBSYW5nZUNvbXBhcmlzb24oaW50LCBpbnQsIElSYW5nZUNvbXBhcmF0b3IpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBza2lwUmFuZ2VDb21wYXJpc29uKAotCQkJaW50IGxlbmd0aCwKLQkJCWludCBtYXhMZW5ndGgsCi0JCQlJUmFuZ2VDb21wYXJhdG9yIG90aGVyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcHVibGljIE9iamVjdFtdIGdldFhNTF9lbGVtZW50cygpIHsKLQkJCXJldHVybiBmWE1MX2VsZW1lbnRzOwotCQl9Ci0JCi0JfQotCi0JLyogcmVwcmVzZW50cyBhIG1hdGNoaW5nIGJldHdlZW4gYSBub2RlIGluIHRoZSBMZWZ0IHRyZWUgYW5kIGEgbm9kZSBpbiB0aGUgUmlnaHQgdHJlZSAqLwotCWNsYXNzIE1hdGNoIHsKLQkJcHVibGljIFhNTE5vZGUgZng7Ci0JCXB1YmxpYyBYTUxOb2RlIGZ5OwotCQkKLQkJTWF0Y2goWE1MTm9kZSB4LCBYTUxOb2RlIHkpIHsKLQkJCWZ4ID0geDsKLQkJCWZ5ID0geTsJCi0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWF0Y2gpIHsKLQkJCQlNYXRjaCBtID0gKE1hdGNoKSBvYmo7Ci0JCQkJaWYgKG0gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZ4ID09IG0uZnggJiYgZnkgPT0gbS5meTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGhhbmRsZVJhbmdlRGlmZmVyZW5jZXIoT2JqZWN0W10geGNfZWxlbWVudHMsIE9iamVjdFtdIHljX2VsZW1lbnRzLCBBcnJheUxpc3QgRFRNYXRjaGluZywgaW50IGRpc3RhbmNlKSB7Ci0JCVJhbmdlRGlmZmVyZW5jZVtdIGRpZmZlcmVuY2VzPSBSYW5nZURpZmZlcmVuY2VyLmZpbmREaWZmZXJlbmNlcyhuZXcgWE1MQ29tcGFyYXRvcih4Y19lbGVtZW50cyksIG5ldyBYTUxDb21wYXJhdG9yKHljX2VsZW1lbnRzKSk7Ci0JCQotCQlpbnQgY3VyX3Bvc19sZWZ0PSAwOwotCQlpbnQgY3VyX3Bvc19yaWdodD0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpZmZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlSYW5nZURpZmZlcmVuY2UgcmQ9IGRpZmZlcmVuY2VzW2ldOwotCQkJaW50IGVxdWFsX2xlbmd0aD0gcmQubGVmdFN0YXJ0KCk7Ci0JCQkvL2hhbmRsZSBlbGVtZW50cyBiZWZvcmUgY3VycmVudCByYW5nZSB3aGljaCBhcmUgdW5jaGFuZ2VkCi0JCQl3aGlsZSAoY3VyX3Bvc19sZWZ0IDwgZXF1YWxfbGVuZ3RoKSB7Ci0JCQkJLy9hc3N1bWluZyBYTUxDb21wYXJhdG9yIGhhcyBhbHJlYWR5IGZpbGxlZCBmRFQgYW5kIGZEVF9NYXRjaGluZ3MgZm9yIHN1YnRyZWVzCi0JCQkJLy9yb290ZWQgYXQgeGNfZWxlbWVudHNbY3VyX3Bvc19sZWZ0XSBhbmQgeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0KLS8vCQkJCWlmICggZkRUW2luZGV4T2ZMTiggKFhNTE5vZGUpeGNfZWxlbWVudHNbY3VyX3Bvc19sZWZ0XSldW2luZGV4T2ZSTiggKFhNTE5vZGUpeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0pXSAhPSAwKQotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGlzdGFuY2Ugbm90IDAiKTsKLS8vCQkJCWRpc3RhbmNlICs9IGZEVFtpbmRleE9mTE4oIChYTUxOb2RlKXhjX2VsZW1lbnRzW2N1cl9wb3NfbGVmdF0pXVtpbmRleE9mUk4oIChYTUxOb2RlKXljX2VsZW1lbnRzW2N1cl9wb3NfcmlnaHRdKV07Ci0JCQkJLy9EVE1hdGNoaW5nLmFkZEFsbChmRFRfTWF0Y2hpbmdzW2luZGV4X2xlZnRdW2luZGV4X3JpZ2h0XSk7Ci0JCQkJRFRNYXRjaGluZy5hZGQobmV3IE1hdGNoKCAoWE1MTm9kZSl4Y19lbGVtZW50c1tjdXJfcG9zX2xlZnRdLCAoWE1MTm9kZSl5Y19lbGVtZW50c1tjdXJfcG9zX3JpZ2h0XSkpOwotCQkJCWN1cl9wb3NfbGVmdCsrOwotCQkJCWN1cl9wb3NfcmlnaHQrKzsKLQkJCX0KLQkJCS8vbm93IGhhbmRsZSBSYW5nZURpZmZlcmVuY2UgcmRbaV0KLQkJCWludCBzbWFsbGVyX2xlbmd0aCwgZ3JlYXRlcl9sZW5ndGg7Ci0JCQlib29sZWFuIGxlZnRHcmVhdGVyPSByZC5sZWZ0TGVuZ3RoKCkgPiByZC5yaWdodExlbmd0aCgpOwotCQkJaWYgKGxlZnRHcmVhdGVyKSB7Ci0JCQkJc21hbGxlcl9sZW5ndGg9IHJkLnJpZ2h0TGVuZ3RoKCk7Ci0JCQkJZ3JlYXRlcl9sZW5ndGg9IHJkLmxlZnRMZW5ndGgoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc21hbGxlcl9sZW5ndGg9IHJkLmxlZnRMZW5ndGgoKTsKLQkJCQlncmVhdGVyX2xlbmd0aD0gcmQucmlnaHRMZW5ndGgoKTsKLQkJCX0KLQkJCQotCQkJLy9oYW5kbGUgZWxlbWVudHMgZWxlbWVudHMgaW4gcmFuZ2UKLQkJCWZvciAoaW50IGo9MDsgaiA8IHNtYWxsZXJfbGVuZ3RoOyBqKyspIHsKLQkJCQlkaXN0YW5jZSArPSBkaXN0KChYTUxOb2RlKSB4Y19lbGVtZW50c1tjdXJfcG9zX2xlZnRdLCAoWE1MTm9kZSkgeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0pOwotCQkJCURUTWF0Y2hpbmcuYWRkKG5ldyBNYXRjaCggKFhNTE5vZGUpeGNfZWxlbWVudHNbY3VyX3Bvc19sZWZ0XSwgKFhNTE5vZGUpeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0pKTsKLQkJCQljdXJfcG9zX2xlZnQrKzsKLQkJCQljdXJfcG9zX3JpZ2h0Kys7Ci0JCQl9Ci0JCQkvL2ludCBjdXJfcG9zX2dyZWF0ZXI9IChsZWZ0R3JlYXRlcik/Y3VyX3Bvc19sZWZ0OmN1cl9wb3NfcmlnaHQ7Ci0JCQlpZiAobGVmdEdyZWF0ZXIpIHsKLQkJCQlmb3IgKGludCBqPXNtYWxsZXJfbGVuZ3RoOyBqIDwgZ3JlYXRlcl9sZW5ndGg7IGorKykgewotCQkJCQlkaXN0YW5jZSArPSBjb3VudE5vZGVzKChYTUxOb2RlKSB4Y19lbGVtZW50c1tjdXJfcG9zX2xlZnRdKTsKLQkJCQkJRFRNYXRjaGluZy5hZGQobmV3IE1hdGNoKCAoWE1MTm9kZSl4Y19lbGVtZW50c1tjdXJfcG9zX2xlZnRdLCBudWxsKSk7Ci0JCQkJCWN1cl9wb3NfbGVmdCsrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaj1zbWFsbGVyX2xlbmd0aDsgaiA8IGdyZWF0ZXJfbGVuZ3RoOyBqKyspIHsKLQkJCQkJZGlzdGFuY2UgKz0gY291bnROb2RlcygoWE1MTm9kZSkgeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0pOwotCQkJCURUTWF0Y2hpbmcuYWRkKG5ldyBNYXRjaCggbnVsbCwgKFhNTE5vZGUpeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0pKTsKLQkJCQkJY3VyX3Bvc19yaWdodCsrOwotCQkJCX0KLQkJCX0KLS8vCQkJZm9yIChpbnQgaj1zbWFsbGVyX2xlbmd0aDsgaiA8IGdyZWF0ZXJfbGVuZ3RoOyBqKyspIHsKLS8vCQkJCWRpc3RhbmNlICs9IGNvdW50Tm9kZXMoKFhNTE5vZGUpIHhjX2VsZW1lbnRzW2N1cl9wb3NfZ3JlYXRlcl0pOwotLy8JCQkJY3VyX3Bvc19ncmVhdGVyKys7Ci0vLwkJCX0KLS8vCQkJaWYgKGxlZnRHcmVhdGVyKQotLy8JCQkJY3VyX3Bvc19sZWZ0PSBjdXJfcG9zX2dyZWF0ZXI7Ci0vLwkJCWVsc2UKLS8vCQkJCWN1cl9wb3NfcmlnaHQ9IGN1cl9wb3NfZ3JlYXRlcjsKLQkJfQotCQkKLQkJZm9yIChpbnQgaT0gY3VyX3Bvc19sZWZ0OyBpIDwgeGNfZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vZGlzdGFuY2UgKz0gZkRUW2luZGV4T2ZMTiggKFhNTE5vZGUpeGNfZWxlbWVudHNbY3VyX3Bvc19sZWZ0XSldW2luZGV4T2ZSTiggKFhNTE5vZGUpeWNfZWxlbWVudHNbY3VyX3Bvc19yaWdodF0pXTsKLQkJCS8vRFRNYXRjaGluZy5hZGRBbGwoZkRUX01hdGNoaW5nc1tpbmRleF9sZWZ0XVtpbmRleF9yaWdodF0pOwotCQkJRFRNYXRjaGluZy5hZGQobmV3IE1hdGNoKCAoWE1MTm9kZSl4Y19lbGVtZW50c1tjdXJfcG9zX2xlZnRdLCAoWE1MTm9kZSl5Y19lbGVtZW50c1tjdXJfcG9zX3JpZ2h0XSkpOwotCQkJY3VyX3Bvc19sZWZ0Kys7Ci0JCQljdXJfcG9zX3JpZ2h0Kys7Ci0JCX0KLQkJCi0JCXJldHVybiBkaXN0YW5jZTsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXRjaChYTUxOb2RlIExlZnRUcmVlLCBYTUxOb2RlIFJpZ2h0VHJlZSwgYm9vbGVhbiByaWdodFRyZWVJc0FuY2VzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBpbnQgZGlzdChYTUxOb2RlIHgsIFhNTE5vZGUgeSkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZGlzdCggIit4LmdldFNpZ25hdHVyZSgpKyIgLCAiK3kuZ2V0U2lnbmF0dXJlKCkrIikiKTsKLQkJaW50IHJldD0gTk9fRU5UUlk7Ci0KLQkJaW50IGluZGV4X3g9IGluZGV4T2ZMTih4KTsKLQkJaW50IGluZGV4X3k9IGluZGV4T2ZSTih5KTsKLQkJaWYgKGZEVFtpbmRleF94XVtpbmRleF95XSAhPSBOT19FTlRSWSkgcmV0dXJuIGZEVFtpbmRleF94XVtpbmRleF95XTsKLQkJCi0JCWlmIChpc0xlYWYoeCkgJiYgaXNMZWFmKHkpKSB7Ci0JCQlpZiAoeC5nZXRYTUxUeXBlKCkgPT0gWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0VMRU1FTlQpIHsKLQkJCQlpZiAoIHguZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKHkuZ2V0U2lnbmF0dXJlKCkpICkgewotCQkJCQlyZXQ9IDA7Ci0JCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXQ9IDI7Ci0JCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0gZWxzZSBpZiAoeC5nZXRYTUxUeXBlKCkgPT0gWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0FUVFJJQlVURSB8fCB4LmdldFhNTFR5cGUoKSA9PSBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfVEVYVCkgewotCQkJCWlmICggeC5nZXRTaWduYXR1cmUoKS5lcXVhbHMoeS5nZXRTaWduYXR1cmUoKSkgKSB7Ci0JCQkJCWlmICh4LmdldFZhbHVlKCkuZXF1YWxzKHkuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJCXJldD0gMDsKLQkJCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldD0gMTsKLQkJCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldD0gMjsKLQkJCQkJZkRUW2luZGV4X3hdW2luZGV4X3ldID0gcmV0OwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9IGVsc2Ugey8veCBvciB5IGFyZSBub3QgbGVhdmVzCi0JCQlpZiAoICF4LmdldFNpZ25hdHVyZSgpLmVxdWFscyh5LmdldFNpZ25hdHVyZSgpKSApIHsKLQkJCQlyZXQ9IGNvdW50Tm9kZXMoeCkgKyBjb3VudE5vZGVzKHkpOwotCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJLy94LmdldFNpZ25hdHVyZSgpLmVxdWFscyh5LmdldFNpZ25hdHVyZSgpKQotCQkJaWYgKGlzTGVhZih4KSkgewotCQkJCXJldD0gY291bnROb2Rlcyh5KS0xOwotCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJaWYgKGlzTGVhZih5KSkgewotCQkJCXJldD0gY291bnROb2Rlcyh4KS0xOwotCQkJCWZEVFtpbmRleF94XVtpbmRleF95XSA9IHJldDsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJLy9ib3RoIHggYW5kIHkgaGF2ZSBjaGlsZHJlbgotCQkJcmV0dXJuIGhhbmRsZVhhbmRZbm90TGVhdmVzKHgseSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JYWJzdHJhY3QgaW50IGhhbmRsZVhhbmRZbm90TGVhdmVzKFhNTE5vZGUgeCwgWE1MTm9kZSB5KTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9BdHRyaWJ1dGVzSW1wbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0F0dHJpYnV0ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YzgzYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0F0dHJpYnV0ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBBbiBBdHRyaWJ1dGVzIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIHBlcmZvcm0gbW9yZSBvcGVyYXRpb25zCi0gKiB0aGFuIHRoZSBhdHRyaWJ1dGUgbGlzdCBoZWxwZXIgc3VwcGxpZWQgd2l0aCB0aGUgc3RhbmRhcmQgU0FYMgotICogZGlzdHJpYnV0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlc0ltcGwgaW1wbGVtZW50cyBBdHRyaWJ1dGVzIHsKLQotCS8qKiBIZWFkIG5vZGUuICovCi0JcHJpdmF0ZSBMaXN0Tm9kZSBmSGVhZDsKLQotCS8qKiBUYWlsIG5vZGUuICovCi0JcHJpdmF0ZSBMaXN0Tm9kZSBmVGFpbDsKLQotCS8qKiBMZW5ndGguICovCi0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQotCi0JLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLiAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoU3RyaW5nIHJhdykgewotCQlMaXN0Tm9kZSBwbGFjZT0gZkhlYWQ7Ci0JCWludCBpbmRleD0gMDsKLQkJd2hpbGUgKHBsYWNlICE9IG51bGwpIHsKLQkJCWlmIChwbGFjZS5yYXcuZXF1YWxzKHJhdykpIHsKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQl9Ci0JCQlpbmRleCsrOwotCQkJcGxhY2U9IHBsYWNlLm5leHQ7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLiAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsKSB7Ci0JCUxpc3ROb2RlIHBsYWNlPSBmSGVhZDsKLQkJaW50IGluZGV4PSAwOwotCQl3aGlsZSAocGxhY2UgIT0gbnVsbCkgewotCQkJaWYgKHBsYWNlLnVyaS5lcXVhbHModXJpKSAmJiBwbGFjZS5sb2NhbC5lcXVhbHMobG9jYWwpKSB7Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkJfQotCQkJaW5kZXgrKzsKLQkJCXBsYWNlPSBwbGFjZS5uZXh0OwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgVVJJIGJ5IGluZGV4LiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKGludCBpbmRleCkgewotCi0JCUxpc3ROb2RlIG5vZGU9IGdldExpc3ROb2RlQXQoaW5kZXgpOwotCQlyZXR1cm4gbm9kZSAhPSBudWxsID8gbm9kZS51cmkgOiBudWxsOwotCX0KLQotCS8qIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBsb2NhbCBuYW1lIGJ5IGluZGV4LiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKGludCBpbmRleCkgewotCi0JCUxpc3ROb2RlIG5vZGU9IGdldExpc3ROb2RlQXQoaW5kZXgpOwotCQlyZXR1cm4gbm9kZSAhPSBudWxsID8gbm9kZS5sb2NhbCA6IG51bGw7Ci0JfQotCi0JLyogUmV0dXJucyB0aGUgYXR0cmlidXRlIHJhdyBuYW1lIGJ5IGluZGV4LiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoaW50IGluZGV4KSB7Ci0KLQkJTGlzdE5vZGUgbm9kZT0gZ2V0TGlzdE5vZGVBdChpbmRleCk7Ci0JCXJldHVybiBub2RlICE9IG51bGwgPyBub2RlLnJhdyA6IG51bGw7Ci0KLQl9Ci0KLQkvKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdHlwZSBieSBpbmRleC4gKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoaW50IGluZGV4KSB7Ci0KLQkJTGlzdE5vZGUgbm9kZT0gZ2V0TGlzdE5vZGVBdChpbmRleCk7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSA/IG5vZGUudHlwZSA6IG51bGw7Ci0JfQotCi0JLyogUmV0dXJucyB0aGUgYXR0cmlidXRlIHR5cGUgYnkgdXJpIGFuZCBsb2NhbC4gKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsKSB7Ci0KLQkJTGlzdE5vZGUgbm9kZT0gZ2V0TGlzdE5vZGUodXJpLCBsb2NhbCk7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSA/IG5vZGUudHlwZSA6IG51bGw7Ci0KLQl9Ci0KLQkvKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdHlwZSBieSByYXcgbmFtZS4gKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoU3RyaW5nIHJhdykgewotCi0JCUxpc3ROb2RlIG5vZGU9IGdldExpc3ROb2RlKHJhdyk7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSA/IG5vZGUudHlwZSA6IG51bGw7Ci0JfQotCi0JLyogUmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIGJ5IGluZGV4LiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KSB7Ci0KLQkJTGlzdE5vZGUgbm9kZT0gZ2V0TGlzdE5vZGVBdChpbmRleCk7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSA/IG5vZGUudmFsdWUgOiBudWxsOwotCX0KLQotCS8qIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBieSB1cmkgYW5kIGxvY2FsLiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsKSB7Ci0KLQkJTGlzdE5vZGUgbm9kZT0gZ2V0TGlzdE5vZGUodXJpLCBsb2NhbCk7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSA/IG5vZGUudmFsdWUgOiBudWxsOwotCX0KLQotCS8qIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBieSByYXcgbmFtZS4gKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyByYXcpIHsKLQotCQlMaXN0Tm9kZSBub2RlPSBnZXRMaXN0Tm9kZShyYXcpOwotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCkgPyBub2RlLnZhbHVlIDogbnVsbDsKLQl9Ci0KLQkvKiBBZGRzIGFuIGF0dHJpYnV0ZS4gKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIHJhdywgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgewotCQlhZGRBdHRyaWJ1dGUobnVsbCwgbnVsbCwgcmF3LCB0eXBlLCB2YWx1ZSk7Ci0JfQotCi0JLyogQWRkcyBhbiBhdHRyaWJ1dGUuICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotCQlTdHJpbmcgdXJpLAotCQlTdHJpbmcgbG9jYWwsCi0JCVN0cmluZyByYXcsCi0JCVN0cmluZyB0eXBlLAotCQlTdHJpbmcgdmFsdWUpIHsKLQotCQlMaXN0Tm9kZSBub2RlPSBuZXcgTGlzdE5vZGUodXJpLCBsb2NhbCwgcmF3LCB0eXBlLCB2YWx1ZSk7Ci0JCWlmIChmTGVuZ3RoID09IDApIHsKLQkJCWZIZWFkPSBub2RlOwotCQl9IGVsc2UgewotCQkJZlRhaWwubmV4dD0gbm9kZTsKLQkJfQotCQlmVGFpbD0gbm9kZTsKLQkJZkxlbmd0aCsrOwotCX0KLQotCS8qIEluc2VydHMgYW4gYXR0cmlidXRlLiAqLwotCXB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZUF0KAotCQlpbnQgaW5kZXgsCi0JCVN0cmluZyByYXcsCi0JCVN0cmluZyB0eXBlLAotCQlTdHJpbmcgdmFsdWUpIHsKLQkJaW5zZXJ0QXR0cmlidXRlQXQoaW5kZXgsIG51bGwsIG51bGwsIHJhdywgdHlwZSwgdmFsdWUpOwotCX0KLQotCS8qIEluc2VydHMgYW4gYXR0cmlidXRlLiAqLwotCXB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZUF0KAotCQlpbnQgaW5kZXgsCi0JCVN0cmluZyB1cmksCi0JCVN0cmluZyBsb2NhbCwKLQkJU3RyaW5nIHJhdywKLQkJU3RyaW5nIHR5cGUsCi0JCVN0cmluZyB2YWx1ZSkgewotCi0JCS8vIGlmIGxpc3QgaXMgZW1wdHksIGFkZCBhdHRyaWJ1dGUKLQkJaWYgKGZMZW5ndGggPT0gMCB8fCBpbmRleCA+PSBmTGVuZ3RoKSB7Ci0JCQlhZGRBdHRyaWJ1dGUodXJpLCBsb2NhbCwgcmF3LCB0eXBlLCB2YWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpbnNlcnQgYXQgYmVnaW5uaW5nIG9mIGxpc3QKLQkJTGlzdE5vZGUgbm9kZT0gbmV3IExpc3ROb2RlKHVyaSwgbG9jYWwsIHJhdywgdHlwZSwgdmFsdWUpOwotCQlpZiAoaW5kZXggPCAxKSB7Ci0JCQlub2RlLm5leHQ9IGZIZWFkOwotCQkJZkhlYWQ9IG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0Tm9kZSBwcmV2PSBnZXRMaXN0Tm9kZUF0KGluZGV4IC0gMSk7Ci0JCQlub2RlLm5leHQ9IHByZXYubmV4dDsKLQkJCXByZXYubmV4dD0gbm9kZTsKLQkJfQotCQlmTGVuZ3RoKys7Ci0JfQotCi0JLyogUmVtb3ZlcyBhbiBhdHRyaWJ1dGUuICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlQXQoaW50IGluZGV4KSB7Ci0KLQkJaWYgKGZMZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZkhlYWQ9IGZIZWFkLm5leHQ7Ci0JCQlpZiAoZkhlYWQgPT0gbnVsbCkgewotCQkJCWZUYWlsPSBudWxsOwotCQkJfQotCQkJZkxlbmd0aC0tOwotCQl9IGVsc2UgewotCQkJTGlzdE5vZGUgcHJldj0gZ2V0TGlzdE5vZGVBdChpbmRleCAtIDEpOwotCQkJTGlzdE5vZGUgbm9kZT0gZ2V0TGlzdE5vZGVBdChpbmRleCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJcHJldi5uZXh0PSBub2RlLm5leHQ7Ci0JCQkJaWYgKG5vZGUgPT0gZlRhaWwpIHsKLQkJCQkJZlRhaWw9IHByZXY7Ci0JCQkJfQotCQkJCWZMZW5ndGgtLTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyByYXcpIHsKLQkJcmVtb3ZlQXR0cmlidXRlQXQoZ2V0SW5kZXgocmF3KSk7Ci0JfQotCi0JLyogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4gKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsKSB7Ci0JCXJlbW92ZUF0dHJpYnV0ZUF0KGdldEluZGV4KHVyaSwgbG9jYWwpKTsKLQl9Ci0KLQkvKiBSZXR1cm5zIHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguICovCi0JcHJpdmF0ZSBMaXN0Tm9kZSBnZXRMaXN0Tm9kZUF0KGludCBpKSB7Ci0KLQkJZm9yIChMaXN0Tm9kZSBwbGFjZT0gZkhlYWQ7IHBsYWNlICE9IG51bGw7IHBsYWNlPSBwbGFjZS5uZXh0KSB7Ci0JCQlpZiAoLS1pID09IC0xKSB7Ci0JCQkJcmV0dXJuIHBsYWNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIFJldHVybnMgdGhlIGZpcnN0IG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHVyaSBhbmQgbG9jYWwuICovCi0JcHVibGljIExpc3ROb2RlIGdldExpc3ROb2RlKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbCkgewotCi0JCWlmICh1cmkgIT0gbnVsbCAmJiBsb2NhbCAhPSBudWxsKSB7Ci0JCQlMaXN0Tm9kZSBwbGFjZT0gZkhlYWQ7Ci0JCQl3aGlsZSAocGxhY2UgIT0gbnVsbCkgewotCQkJCWlmIChwbGFjZS51cmkgIT0gbnVsbAotCQkJCQkmJiBwbGFjZS5sb2NhbCAhPSBudWxsCi0JCQkJCSYmIHBsYWNlLnVyaS5lcXVhbHModXJpKQotCQkJCQkmJiBwbGFjZS5sb2NhbC5lcXVhbHMobG9jYWwpKSB7Ci0JCQkJCXJldHVybiBwbGFjZTsKLQkJCQl9Ci0JCQkJcGxhY2U9IHBsYWNlLm5leHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogUmV0dXJucyB0aGUgZmlyc3Qgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgcmF3IG5hbWUuICovCi0JcHJpdmF0ZSBMaXN0Tm9kZSBnZXRMaXN0Tm9kZShTdHJpbmcgcmF3KSB7Ci0KLQkJaWYgKHJhdyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3ROb2RlIHBsYWNlPSBmSGVhZDsgcGxhY2UgIT0gbnVsbDsgcGxhY2U9IHBsYWNlLm5leHQpIHsKLQkJCQlpZiAocGxhY2UucmF3ICE9IG51bGwgJiYgcGxhY2UucmF3LmVxdWFscyhyYXcpKSB7Ci0JCQkJCXJldHVybiBwbGFjZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LiAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlzdHIuYXBwZW5kKCdbJyk7Ci0JCXN0ci5hcHBlbmQoImxlbj0iKTsgLy8kTk9OLU5MUy0xJAotCQlzdHIuYXBwZW5kKGZMZW5ndGgpOwotCQlzdHIuYXBwZW5kKCIsIHsiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKExpc3ROb2RlIHBsYWNlPSBmSGVhZDsgcGxhY2UgIT0gbnVsbDsgcGxhY2U9IHBsYWNlLm5leHQpIHsKLQkJCXN0ci5hcHBlbmQocGxhY2UudG9TdHJpbmcoKSk7Ci0JCQlpZiAocGxhY2UubmV4dCAhPSBudWxsKSB7Ci0JCQkJc3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN0ci5hcHBlbmQoIn1dIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBBbiBhdHRyaWJ1dGUgbm9kZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTGlzdE5vZGUgewotCi0JCS8qKiBBdHRyaWJ1dGUgdXJpLiAqLwotCQlwdWJsaWMgU3RyaW5nIHVyaTsKLQotCQkvKiogQXR0cmlidXRlIGxvY2FsLiAqLwotCQlwdWJsaWMgU3RyaW5nIGxvY2FsOwotCi0JCS8qKiBBdHRyaWJ1dGUgcmF3LiAqLwotCQlwdWJsaWMgU3RyaW5nIHJhdzsKLQotCQkvKiogQXR0cmlidXRlIHR5cGUuICovCi0JCXB1YmxpYyBTdHJpbmcgdHlwZTsKLQotCQkvKiogQXR0cmlidXRlIHZhbHVlLiAqLwotCQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCi0JCS8qKiBOZXh0IG5vZGUuICovCi0JCXB1YmxpYyBMaXN0Tm9kZSBuZXh0OwotCi0JCS8qIENvbnN0cnVjdHMgYSBsaXN0IG5vZGUuICovCi0JCXB1YmxpYyBMaXN0Tm9kZSgKLQkJCVN0cmluZyB1cmkwLAotCQkJU3RyaW5nIGxvY2FsMCwKLQkJCVN0cmluZyByYXcwLAotCQkJU3RyaW5nIHR5cGUwLAotCQkJU3RyaW5nIHZhbHVlMCkgewotCi0JCQl0aGlzLnVyaT0gdXJpMDsKLQkJCXRoaXMubG9jYWw9IGxvY2FsMDsKLQkJCXRoaXMucmF3PSByYXcwOwotCQkJdGhpcy50eXBlPSB0eXBlMDsKLQkJCXRoaXMudmFsdWU9IHZhbHVlMDsKLQotCQl9Ci0KLQkJLyogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gcmF3ICE9IG51bGwgPyByYXcgOiBsb2NhbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9DaG9vc2VNYXRjaGVyRHJvcERvd25BY3Rpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9DaG9vc2VNYXRjaGVyRHJvcERvd25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1Y2UyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvQ2hvb3NlTWF0Y2hlckRyb3BEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotCi0KLS8qKgotICogRHJvcCBkb3duIG1lbnUgdG8gc2VsZWN0IGEgcGFydGljdWxhciBpZCBtYXBwaW5nIHNjaGVtZQotICovCi1jbGFzcyBDaG9vc2VNYXRjaGVyRHJvcERvd25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJTWVudUNyZWF0b3IgewotCi0JcHJpdmF0ZSBYTUxTdHJ1Y3R1cmVWaWV3ZXIgZlZpZXdlcjsKLQotCXB1YmxpYyBDaG9vc2VNYXRjaGVyRHJvcERvd25BY3Rpb24oWE1MU3RydWN0dXJlVmlld2VyIHZpZXdlcikgewotCQlmVmlld2VyID0gdmlld2VyOwotCQlzZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkNob29zZU1hdGNoZXJEcm9wRG93bkFjdGlvbi50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigib2JqMTYvc21hcnRtb2RlX2NvLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUb29sVGlwVGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJDaG9vc2VNYXRjaGVyRHJvcERvd25BY3Rpb24udG9vbHRpcCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRNZW51Q3JlYXRvcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0JCVhNTFBsdWdpbiBwbHVnaW49IFhNTFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCU1lbnUgbWVudT0gbmV3IE1lbnUocGFyZW50KTsKLQkJYWRkQWN0aW9uVG9NZW51KG1lbnUsIG5ldyBTZWxlY3RNYXRjaGVyQWN0aW9uKFhNTFN0cnVjdHVyZUNyZWF0b3IuVVNFX1VOT1JERVJFRCwgZlZpZXdlcikpOwotCQlhZGRBY3Rpb25Ub01lbnUobWVudSwgbmV3IFNlbGVjdE1hdGNoZXJBY3Rpb24oWE1MU3RydWN0dXJlQ3JlYXRvci5VU0VfT1JERVJFRCwgZlZpZXdlcikpOwotCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCUhhc2hNYXAgSWRNYXBzID0gcGx1Z2luLmdldElkTWFwcygpOwotCQlIYXNoTWFwIElkTWFwc0ludGVybmFsID0gcGx1Z2luLmdldElkTWFwc0ludGVybmFsKCk7Ci0KLQkJU2V0IGtleVNldElkTWFwcyA9IElkTWFwcy5rZXlTZXQoKTsKLQkJU2V0IGtleVNldElkTWFwc0ludGVybmFsID0gSWRNYXBzSW50ZXJuYWwua2V5U2V0KCk7Ci0JCUFycmF5TGlzdCBpbnRlcm5hbElkTWFwc0FMPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcl9pbnRlcm5hbCA9IGtleVNldElkTWFwc0ludGVybmFsLml0ZXJhdG9yKCk7IGl0ZXJfaW50ZXJuYWwuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBpZG1hcF9uYW1lID0gKFN0cmluZylpdGVyX2ludGVybmFsLm5leHQoKTsKLQkJCWludGVybmFsSWRNYXBzQUwuYWRkKGlkbWFwX25hbWUpOwotCQl9Ci0JCU9iamVjdFtdIGludGVybmFsSWRNYXBzQT0gaW50ZXJuYWxJZE1hcHNBTC50b0FycmF5KCk7Ci0JCUFycmF5cy5zb3J0KGludGVybmFsSWRNYXBzQSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBpbnRlcm5hbElkTWFwc0EubGVuZ3RoOyBpKyspIHsKLQkJCWFkZEFjdGlvblRvTWVudShtZW51LCBuZXcgU2VsZWN0TWF0Y2hlckFjdGlvbigoU3RyaW5nKWludGVybmFsSWRNYXBzQVtpXSwgZlZpZXdlcikpOwotCQl9Ci0JCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQotCQlBcnJheUxpc3QgdXNlcklkTWFwc0FMPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcl9pZG1hcHMgPSBrZXlTZXRJZE1hcHMuaXRlcmF0b3IoKTsgaXRlcl9pZG1hcHMuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBpZG1hcF9uYW1lID0gKFN0cmluZylpdGVyX2lkbWFwcy5uZXh0KCk7Ci0JCQl1c2VySWRNYXBzQUwuYWRkKGlkbWFwX25hbWUpOwotCQl9Ci0JCQotCQlIYXNoTWFwIE9yZGVyZWRFbGVtZW50cz0gcGx1Z2luLmdldE9yZGVyZWRFbGVtZW50cygpOwotCQlTZXQga2V5U2V0T3JkZXJlZD0gT3JkZXJlZEVsZW1lbnRzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJfb3JkZXJlZEVsZW1lbnRzPSBrZXlTZXRPcmRlcmVkLml0ZXJhdG9yKCk7IGl0ZXJfb3JkZXJlZEVsZW1lbnRzLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBpZG1hcF9uYW1lPSAoU3RyaW5nKSBpdGVyX29yZGVyZWRFbGVtZW50cy5uZXh0KCk7Ci0JCQlpZiAoIWtleVNldElkTWFwcy5jb250YWlucyhpZG1hcF9uYW1lKSkgewotCQkJCXVzZXJJZE1hcHNBTC5hZGQoaWRtYXBfbmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlPYmplY3RbXSB1c2VySWRNYXBzQT0gdXNlcklkTWFwc0FMLnRvQXJyYXkoKTsKLQkJQXJyYXlzLnNvcnQodXNlcklkTWFwc0EpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgdXNlcklkTWFwc0EubGVuZ3RoOyBpKyspIHsKLQkJCWFkZEFjdGlvblRvTWVudShtZW51LCBuZXcgU2VsZWN0TWF0Y2hlckFjdGlvbigoU3RyaW5nKXVzZXJJZE1hcHNBW2ldLCBmVmlld2VyKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBtZW51OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGlvblRvTWVudShNZW51IHBhcmVudCwgQWN0aW9uIGFjdGlvbikgewotCQlBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW09IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JCWl0ZW0uZmlsbChwYXJlbnQsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZWaWV3ZXIuY29udGVudENoYW5nZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvQ3JlYXRlTmV3SWRNYXBBY3Rpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9DcmVhdGVOZXdJZE1hcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFkMzAyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9DcmVhdGVOZXdJZE1hcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci0KLS8qKgotICogQnV0dG9uIHRvIGNyZWF0ZSBhIG5ldyBpZCBtYXBwaW5nIHNjaGVtZQotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTmV3SWRNYXBBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoTWFwIGZJZE1hcHM7Ly8gSGFzaE1hcCAoIGlkbmFtZSAtPiBIYXNoTWFwIChzaWduYXR1cmUgLT4gaWQpICkKLQlwcml2YXRlIEhhc2hNYXAgZklkTWFwc0ludGVybmFsOwotCXByaXZhdGUgSGFzaE1hcCBmSWRFeHRlbnNpb25Ub05hbWU7Ci0JCi0JcHVibGljIENyZWF0ZU5ld0lkTWFwQWN0aW9uKFhNTFN0cnVjdHVyZVZpZXdlciB2aWV3ZXIpIHsJCQotCQlzZXRJbWFnZURlc2NyaXB0b3IoWE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoIm9iajE2L2FkZGlkbWFwLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUb29sVGlwVGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxTdHJ1Y3R1cmVWaWV3ZXIubmV3dGFzayIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVhNTFBsdWdpbiBwbHVnaW49IFhNTFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWZJZE1hcHNJbnRlcm5hbD0gcGx1Z2luLmdldElkTWFwc0ludGVybmFsKCk7Ly9mSWRNYXBzSW50ZXJuYWwgaXMgb25seSByZWFkLCBub3QgbW9kaWZpZWQKLQkJCi0JCWZJZE1hcHMgPSBuZXcgSGFzaE1hcCgpOwotCQlIYXNoTWFwIFBsdWdpbklkTWFwcyA9IHBsdWdpbi5nZXRJZE1hcHMoKTsKLQkJU2V0IGtleVNldCA9IFBsdWdpbklkTWFwcy5rZXlTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0ga2V5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWZJZE1hcHMucHV0KGtleSwgKChIYXNoTWFwKVBsdWdpbklkTWFwcy5nZXQoa2V5KSkuY2xvbmUoKSk7Ci0JCX0KLQkJCi0JCWZJZEV4dGVuc2lvblRvTmFtZT0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBQbHVnaW5JZEV4dGVuc2lvblRvTmFtZT0gcGx1Z2luLmdldElkRXh0ZW5zaW9uVG9OYW1lKCk7Ci0JCWtleVNldD0gUGx1Z2luSWRFeHRlbnNpb25Ub05hbWUua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0ga2V5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBrZXk9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJZklkRXh0ZW5zaW9uVG9OYW1lLnB1dChrZXksIFBsdWdpbklkRXh0ZW5zaW9uVG9OYW1lLmdldChrZXkpKTsKLQkJfQotCQkKLQkJSWRNYXAgaWRtYXAgPSBuZXcgSWRNYXAoZmFsc2UpOwotCQlYTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cgZGlhbG9nPSBuZXcgWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nKFhNTFBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLGlkbWFwLGZJZE1hcHMsZklkTWFwc0ludGVybmFsLGZJZEV4dGVuc2lvblRvTmFtZSxmYWxzZSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJaWYgKCFmSWRNYXBzLmNvbnRhaW5zS2V5KGlkbWFwLmdldE5hbWUoKSkpIHsKLQkJCQlmSWRNYXBzLnB1dChpZG1hcC5nZXROYW1lKCksbmV3IEhhc2hNYXAoKSk7Ci0JCQkJaWYgKCFpZG1hcC5nZXRFeHRlbnNpb24oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWZJZEV4dGVuc2lvblRvTmFtZS5wdXQoaWRtYXAuZ2V0RXh0ZW5zaW9uKCksaWRtYXAuZ2V0TmFtZSgpKTsKLQkJCQlYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldElkTWFwcyhmSWRNYXBzLGZJZEV4dGVuc2lvblRvTmFtZSxudWxsLGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9JZE1hcC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0lkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTk3OWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0lkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKiogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIGlkIG1hcHBpbmcgc2NoZW1lIGluIHRoZSBYTUwgQ29tcGFyZSBwcmVmZXJlbmNlIHBhZ2UKLSAqLwotcHVibGljIGNsYXNzIElkTWFwIHsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBmSW50ZXJuYWw7Ci0JcHJpdmF0ZSBWZWN0b3IgZk1hcHBpbmdzOwotCXByaXZhdGUgU3RyaW5nIGZFeHRlbnNpb247Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZk9yZGVyZWQ7Ly9jb250YWlucyBNYXBwaW5nIGVsZW1lbnRzIGZvciBsaXN0IG9mIG9yZGVyZWQgZW50cmllcyAodGhlIGNoaWxkcmVuIG9mIHRoZXNlIGVsZW1lbnRzIHdpbGwgYmUgY29tcGFyZWQgaW4gb3JkZXJlZCBmYXNoaW9uKQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJZE1hcCB3aGljaCByZXByZXNlbnRzIGFuIElkIE1hcHBpbmcgU2NoZW1lCi0JICogQHBhcmFtIGludGVybmFsIHRydWUgaWYgdGhlIElkTWFwIGlzIGludGVybmFsCi0JICovCi0JcHVibGljIElkTWFwKGJvb2xlYW4gaW50ZXJuYWwpIHsKLQkJdGhpcygiIiwgaW50ZXJuYWwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJZE1hcCB3aGljaCByZXByZXNlbnRzIGFuIElkIE1hcHBpbmcgU2NoZW1lCi0JICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1hcHBpbmcsIGFzIGluIGZJZE1hcHMvZklkTWFwc0ludGVybmFsIEhhc2hNYXBzIGFuZCBmT3JkZXJlZEVsZW1lbnRzL2ZPcmRlcmVkRWxlbWVudHNJbnRlcm5hbCBIYXNoTWFwcwotCSAqIEBwYXJhbSBpbnRlcm5hbCB0cnVlIGlmIHRoZSBJZE1hcCBpcyBpbnRlcm5hbAotCSAqLwotCXB1YmxpYyBJZE1hcChTdHJpbmcgbmFtZSwgYm9vbGVhbiBpbnRlcm5hbCkgewotCQl0aGlzKG5hbWUsIGludGVybmFsLCBuZXcgVmVjdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSWRNYXAgd2hpY2ggcmVwcmVzZW50cyBhbiBJZCBNYXBwaW5nIFNjaGVtZQotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtYXBwaW5nLCBhcyBpbiBmSWRNYXBzL2ZJZE1hcHNJbnRlcm5hbCBIYXNoTWFwcyBhbmQgZk9yZGVyZWRFbGVtZW50cy9mT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWwgSGFzaE1hcHMKLQkgKiBAcGFyYW0gaW50ZXJuYWwgdHJ1ZSBpZiB0aGUgSWRNYXAgaXMgaW50ZXJuYWwKLQkgKiBAcGFyYW0gbWFwcGluZ3MgVmVjdG9yIG9mIE1hcHBpbmcgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBpZCBtYXBwaW5ncyBvZiB0aGlzIGlkIG1hcHBpbmcgc2NoZW1lCi0JICovCi0JcHVibGljIElkTWFwKFN0cmluZyBuYW1lLCBib29sZWFuIGludGVybmFsLCBWZWN0b3IgbWFwcGluZ3MpIHsKLQkJdGhpcyhuYW1lLCBpbnRlcm5hbCwgbWFwcGluZ3MsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSWRNYXAgd2hpY2ggcmVwcmVzZW50cyBhbiBJZCBNYXBwaW5nIFNjaGVtZS4KLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbWFwcGluZywgYXMgaW4gZklkTWFwcy9mSWRNYXBzSW50ZXJuYWwgSGFzaE1hcHMgYW5kIGZPcmRlcmVkRWxlbWVudHMvZk9yZGVyZWRFbGVtZW50c0ludGVybmFsIEhhc2hNYXBzLgotCSAqIEBwYXJhbSBpbnRlcm5hbCB0cnVlIGlmIHRoZSBJZE1hcCBpcyBpbnRlcm5hbC4KLQkgKiBAcGFyYW0gbWFwcGluZ3MgVmVjdG9yIG9mIE1hcHBpbmcgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBpZCBtYXBwaW5ncyBvZiB0aGlzIGlkIG1hcHBpbmcgc2NoZW1lLgotCSAqIEBwYXJhbSBleHRlbnNpb24gT3B0aW9uYWwgZXh0ZW5zaW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkIG1hcHBpbmcgc2NoZW1lLgotCSAqLwotCXB1YmxpYyBJZE1hcChTdHJpbmcgbmFtZSwgYm9vbGVhbiBpbnRlcm5hbCwgVmVjdG9yIG1hcHBpbmdzLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCXRoaXMobmFtZSwgaW50ZXJuYWwsIG1hcHBpbmdzLCBleHRlbnNpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSWRNYXAgd2hpY2ggcmVwcmVzZW50cyBhbiBJZCBNYXBwaW5nIFNjaGVtZS4KLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbWFwcGluZywgYXMgaW4gZklkTWFwcy9mSWRNYXBzSW50ZXJuYWwgSGFzaE1hcHMgYW5kIGZPcmRlcmVkRWxlbWVudHMvZk9yZGVyZWRFbGVtZW50c0ludGVybmFsIEhhc2hNYXBzLgotCSAqIEBwYXJhbSBpbnRlcm5hbCB0cnVlIGlmIHRoZSBJZE1hcCBpcyBpbnRlcm5hbC4KLQkgKiBAcGFyYW0gbWFwcGluZ3MgVmVjdG9yIG9mIE1hcHBpbmcgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBpZCBtYXBwaW5ncyBvZiB0aGlzIGlkIG1hcHBpbmcgc2NoZW1lLgotCSAqIEBwYXJhbSBleHRlbnNpb24gT3B0aW9uYWwgZXh0ZW5zaW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkIG1hcHBpbmcgc2NoZW1lLgotCSAqIEBwYXJhbSBvcmRlcmVkIE9wdGlvbmFsIEFycmF5TGlzdCBvZiBNYXBwaW5nIGVsZW1lbnRzIHJlcHJlc2VudGluZyBvcmRlcmVkIGVudHJpZXMuCi0JICovCi0JcHVibGljIElkTWFwKFN0cmluZyBuYW1lLCBib29sZWFuIGludGVybmFsLCBWZWN0b3IgbWFwcGluZ3MsIFN0cmluZyBleHRlbnNpb24sIEFycmF5TGlzdCBvcmRlcmVkKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQkJZkludGVybmFsID0gaW50ZXJuYWw7Ci0JCWZNYXBwaW5ncyA9IG1hcHBpbmdzOwotCQlmRXh0ZW5zaW9uPSBleHRlbnNpb24udG9Mb3dlckNhc2UoKTsKLQkJZk9yZGVyZWQ9IG9yZGVyZWQ7Ci0JfQotCQotCS8qCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBJZE1hcCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJSWRNYXAgaWRtYXA9IChJZE1hcCkgb2JqZWN0OwotCi0JCWlmIChpZG1hcCA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7CQkKLQotCQlyZXR1cm4KLQkJCWlkbWFwLmdldE5hbWUoKS5lcXVhbHMoZk5hbWUpICYmCi0JCQlpZG1hcC5nZXRNYXBwaW5ncygpLmVxdWFscyhmTWFwcGluZ3MpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZk5hbWUuaGFzaENvZGUoKSBeIGZNYXBwaW5ncy5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwaW5ncyhWZWN0b3IgbWFwcGluZ3MpIHsKLQkJZk1hcHBpbmdzID0gbWFwcGluZ3M7Ci0JfQotCQotCXB1YmxpYyBWZWN0b3IgZ2V0TWFwcGluZ3MoKSB7Ci0JCXJldHVybiBmTWFwcGluZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWwoYm9vbGVhbiBib29sKSB7Ci0JCWZJbnRlcm5hbCA9IGJvb2w7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBmSW50ZXJuYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWZFeHRlbnNpb249IGV4dGVuc2lvbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBmRXh0ZW5zaW9uOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmVkKEFycmF5TGlzdCBvcmRlcmVkKSB7Ci0JCWZPcmRlcmVkPSBvcmRlcmVkOwotCX0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldE9yZGVyZWQoKSB7Ci0JCXJldHVybiBmT3JkZXJlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9NYXBwaW5nLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZkZDExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHBhcnRpY3VsYXIgaWQgbWFwcGluZyBvciBvcmRlcmVkIGVudHJ5IGluIHRoZSBYTUwgQ29tcGFyZSBwcmVmZXJlbmNlIHBhZ2UKLSAqLwotcHVibGljIGNsYXNzIE1hcHBpbmcgewotCi0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNpZ25hdHVyZTsKLQlwcml2YXRlIFN0cmluZyBmSWRBdHRyaWJ1dGU7Ci0KLQlwdWJsaWMgTWFwcGluZygpIHsKLQkJdGhpcygiIiwgIiIsICIiKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgTWFwcGluZyhTdHJpbmcgZWxlbWVudCwgU3RyaW5nIHNpZ25hdHVyZSkgewotCQl0aGlzKGVsZW1lbnQsIHNpZ25hdHVyZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE1hcHBpbmcoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBzaWduYXR1cmUsIFN0cmluZyBpZGF0dHJpYnV0ZSkgewotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZTaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0JCWZJZEF0dHJpYnV0ZSA9IGlkYXR0cmlidXRlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTWFwcGluZykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJTWFwcGluZyBtYXBwaW5nPSAoTWFwcGluZykgb2JqZWN0OwotCi0JCWlmIChtYXBwaW5nID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsJCQotCi0JCXJldHVybgotCQkJbWFwcGluZy5mRWxlbWVudC5lcXVhbHMoZkVsZW1lbnQpICYmCi0JCQltYXBwaW5nLmZTaWduYXR1cmUuZXF1YWxzKGZTaWduYXR1cmUpICYmCi0JCQltYXBwaW5nLmZJZEF0dHJpYnV0ZS5lcXVhbHMoZklkQXR0cmlidXRlKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50Lmhhc2hDb2RlKCkgXiBmU2lnbmF0dXJlLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZWxlbWVudCkgewotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGZFbGVtZW50OwotCX0JCi0KLQlwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgewotCQlmU2lnbmF0dXJlID0gc2lnbmF0dXJlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIGZTaWduYXR1cmU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBpZGF0dHJpYnV0ZSkgewotCQlmSWRBdHRyaWJ1dGUgPSBpZGF0dHJpYnV0ZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRJZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGZJZEF0dHJpYnV0ZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBnZXRLZXkoZlNpZ25hdHVyZSwgZkVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRLZXkoU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJaWYgKHNpZ25hdHVyZSA9PSAiIikgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBlbGVtZW50ICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUjsKLQkJcmV0dXJuIFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBzaWduYXR1cmUgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgZWxlbWVudCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL09yZGVyZWRNYXRjaGluZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL09yZGVyZWRNYXRjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdkMDk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9PcmRlcmVkTWF0Y2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGNsYXNzIE9yZGVyZWRNYXRjaGluZyBleHRlbmRzIEFic3RyYWN0TWF0Y2hpbmcgewotCi0JcHVibGljIE9yZGVyZWRNYXRjaGluZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IG9yZGVyZWRNYXRoKFhNTE5vZGUgeCwgWE1MTm9kZSB5KSB7Ci0JCS8vYXNzdW1lcyB4IGFuZCB5IGhhdmUgY2hpbGRyZW4KLQkJT2JqZWN0W10geGM9IHguZ2V0Q2hpbGRyZW4oKTsKLQkJT2JqZWN0W10geWM9IHkuZ2V0Q2hpbGRyZW4oKTsKLQotCQlBcnJheUxpc3QgeGNfZWxlbWVudHNBTD0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgeGNfYXR0cnNBTD0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCB5Y19lbGVtZW50c0FMPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCB5Y19hdHRyc0FMPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy9maW5kIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIGFuZCBwdXQgdGhlbSBpbiB4Y19lbGVtZW50c0FMIGFuZCB4Y19hdHRyc0FMLCByZXNwZWN0aXZlbHkKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHhjLmxlbmd0aDsgaSsrKSB7Ci0JCQlYTUxOb2RlIHhfaT0gKFhNTE5vZGUpIHhjW2ldOwotCQkJaWYgKHhfaS5nZXRYTUxUeXBlKCkuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5UKSkgewotCQkJCXhjX2VsZW1lbnRzQUwuYWRkKHhfaSk7Ci0JCQl9IGVsc2UgaWYgKAotCQkJCXhfaS5nZXRYTUxUeXBlKCkuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9BVFRSSUJVVEUpKSB7Ci0JCQkJeGNfYXR0cnNBTC5hZGQoeF9pKTsKLQkJCX0KLQkJfQotCi0JCS8vZG8gdGhlIHNhbWUgZm9yIHljCQkJCQotCQlmb3IgKGludCBpPSAwOyBpIDwgeWMubGVuZ3RoOyBpKyspIHsKLQkJCVhNTE5vZGUgeV9pPSAoWE1MTm9kZSkgeWNbaV07Ci0JCQlpZiAoeV9pLmdldFhNTFR5cGUoKS5lcXVhbHMoWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0VMRU1FTlQpKSB7Ci0JCQkJeWNfZWxlbWVudHNBTC5hZGQoeV9pKTsKLQkJCX0gZWxzZSBpZiAoCi0JCQkJeV9pLmdldFhNTFR5cGUoKS5lcXVhbHMoWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0FUVFJJQlVURSkpIHsKLQkJCQl5Y19hdHRyc0FMLmFkZCh5X2kpOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0W10geGNfZWxlbWVudHM9IHhjX2VsZW1lbnRzQUwudG9BcnJheSgpOwotCQlPYmplY3RbXSB5Y19lbGVtZW50cz0geWNfZWxlbWVudHNBTC50b0FycmF5KCk7Ci0KLQkJQXJyYXlMaXN0IERUTWF0Y2hpbmc9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTWF0Y2hpbmcgdG8gYmUgYWRkZWQgdG8gRW50cnkgaW4gZkRUX01hdGNoaW5ncwotCQlpbnQgZGlzdGFuY2U9IDA7IC8vZGlzdGFuY2UgdG8gYmUgYWRkZWQgdG8gZW50cnkgaW4gZkRUCi0KLQkJLy8gcGVyZm9ybSB1bm9yZGVyZWQgbWF0Y2hpbmcgb24gYXR0cmlidXRlcwotCQkvLyB0aGlzIHVwZGF0ZXMgZkRUIGFuZCBmRFRfTWF0Y2hpbmdzCi0JCWlmICh4Y19hdHRyc0FMLnNpemUoKSA+IDAgfHwgeWNfYXR0cnNBTC5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoeGNfYXR0cnNBTC5zaXplKCkgPT0gMCkKLQkJCQlkaXN0YW5jZSArPSB5Y19hdHRyc0FMLnNpemUoKTsKLQkJCWVsc2UgaWYgKHljX2F0dHJzQUwuc2l6ZSgpID09IDApCi0JCQkJZGlzdGFuY2UgKz0geGNfYXR0cnNBTC5zaXplKCk7Ci0JCQllbHNlIHsKLQkJCQkvL3Vub3JkZXJlZE1hdGNoKHgsIHksIHhjX2F0dHJzLCB5Y19hdHRycyk7Ci0JCQkJLy8JCQkJZGlzdGFuY2UgKz0gZkRUW2luZGV4T2ZMTih4KV1baW5kZXhPZlJOKHkpXTsKLQkJCQkvLwkJCQlEVE1hdGNoaW5nPSBmRFRfTWF0Y2hpbmdzW2luZGV4T2ZMTih4KV1baW5kZXhPZlJOKHkpXTsKLQkJCQlkaXN0YW5jZT0gaGFuZGxlQXR0cmlidXRlcyh4Y19hdHRyc0FMLCB5Y19hdHRyc0FMLCBEVE1hdGNoaW5nKTsKLQkJCX0KLQkJfQotCi0JCS8vcGVyZm9ybSBvcmRlcmVkIG1hdGNoaW5nIG9uIGVsZW1lbnQgY2hpbGRyZW4sIGkuZS4gbnVtYmVyIHRoZW0gaW4gb3JkZXIgb2YgYXBwZWFyYW5jZQotCi0JCS8qIHN0YXJ0IG5ldyAqLwotCQlkaXN0YW5jZT0KLQkJCWhhbmRsZVJhbmdlRGlmZmVyZW5jZXIoCi0JCQkJeGNfZWxlbWVudHMsCi0JCQkJeWNfZWxlbWVudHMsCi0JCQkJRFRNYXRjaGluZywKLQkJCQlkaXN0YW5jZSk7Ci0JCS8qIGVuZCBuZXcgKi8KLQotCQkvKiBzdGFydDogTmFpdmUgb3JkZXJlZCBjb21wYXJlIC8qCi0JCS8vCQkJaW50IG1pbmxlbmd0aD0gKHhjX2VsZW1lbnRzLmxlbmd0aCA+IHljX2VsZW1lbnRzLmxlbmd0aCk/eWNfZWxlbWVudHMubGVuZ3RoOnhjX2VsZW1lbnRzLmxlbmd0aDsKLQkJLy8JCQlmb3IgKGludCBpPSAwOyBpIDwgbWlubGVuZ3RoOyBpKyspIHsKLQkJLy8JCQkJZGlzdGFuY2UgKz0gZGlzdCgoWE1MTm9kZSkgeGNfZWxlbWVudHNbaV0sIChYTUxOb2RlKSB5Y19lbGVtZW50c1tpXSk7Ci0JCS8vCQkJCURUTWF0Y2hpbmcuYWRkKG5ldyBNYXRjaCggKFhNTE5vZGUpeGNfZWxlbWVudHNbaV0sIChYTUxOb2RlKXljX2VsZW1lbnRzW2ldKSk7Ci0JCS8vCQkJfQotCQkvLwkJCWlmICh4Y19lbGVtZW50cy5sZW5ndGggPiB5Y19lbGVtZW50cy5sZW5ndGgpIHsKLQkJLy8JCQkJZm9yIChpbnQgaT0gbWlubGVuZ3RoOyBpIDwgeGNfZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJLy8JCQkJCWRpc3RhbmNlICs9IGNvdW50Tm9kZXMoKFhNTE5vZGUpIHhjX2VsZW1lbnRzW2ldKTsKLQkJLy8JCQkJfQotCQkvLwkJCX0gZWxzZSBpZiAoeGNfZWxlbWVudHMubGVuZ3RoIDwgeWNfZWxlbWVudHMubGVuZ3RoKSB7Ci0JCS8vCQkJCWZvciAoaW50IGk9IG1pbmxlbmd0aDsgaSA8IHljX2VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vCQkJCQlkaXN0YW5jZSArPSBjb3VudE5vZGVzKChYTUxOb2RlKSB5Y19lbGVtZW50c1tpXSk7Ci0JCS8vCQkJCX0KLQkJLy8JCQl9Ci0JCS8qIGVuZDogTmFpdmUgb3JkZXJlZCBjb21wYXJlICovCi0KLQkJZkRUW2luZGV4T2ZMTih4KV1baW5kZXhPZlJOKHkpXT0gZGlzdGFuY2U7Ci0JCWZEVF9NYXRjaGluZ3NbaW5kZXhPZkxOKHgpXVtpbmRleE9mUk4oeSldPSBEVE1hdGNoaW5nOwotCQlyZXR1cm4gZGlzdGFuY2U7Ci0KLQl9Ci0KLQkvKiBtYXRjaGVzIHR3byB0cmVlcyBhY2NvcmRpbmcgdG8gcGFwZXIgIlgtRGlmZiIsIHAuIDE2ICovCi0JcHVibGljIHZvaWQgbWF0Y2goCi0JCVhNTE5vZGUgTGVmdFRyZWUsCi0JCVhNTE5vZGUgUmlnaHRUcmVlLAotCQlib29sZWFuIHJpZ2h0VHJlZUlzQW5jZXN0b3IsCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotCQlmTkxlZnQ9IG5ldyBWZWN0b3IoKTsKLQkJLy9udW1iZXJpbmcgTGVmdFRyZWU6IE1hcHBpbmcgbm9kZXMgaW4gTGVmdFRyZWUgdG8gbnVtYmVycyB0byBiZSB1c2VkIGFzIGFycmF5IGluZGV4ZXMKLQkJZk5SaWdodD0gbmV3IFZlY3RvcigpOwotCQkvL251bWJlcmluZyBSaWdodFRyZWU6IE1hcHBpbmcgbm9kZXMgaW4gUmlnaHRUcmVlIHRvIG51bWJlcnMgdG8gYmUgdXNlZCBhcyBhcnJheSBpbmRleGVzCi0JCW51bWJlck5vZGVzKExlZnRUcmVlLCBmTkxlZnQpOwotCQludW1iZXJOb2RlcyhSaWdodFRyZWUsIGZOUmlnaHQpOwotCQlmRFQ9IG5ldyBpbnRbZk5MZWZ0LnNpemUoKV1bZk5SaWdodC5zaXplKCldOwotCQlmRFRfTWF0Y2hpbmdzPSBuZXcgQXJyYXlMaXN0W2ZOTGVmdC5zaXplKCldW2ZOUmlnaHQuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZEVC5sZW5ndGg7IGkrKykgewotCQkJZkRUW2ldPSBuZXcgaW50W2ZOUmlnaHQuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGo9IDA7IGogPCBmRFRbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQlmRFRbaV1bal09IE5PX0VOVFJZOwotCQkJfQotCQl9Ci0KLQkJZGlzdChMZWZ0VHJlZSwgUmlnaHRUcmVlKTsKLQkJLy8JCS8qIG1hcmsgbWF0Y2hpbmdzIG9uIExlZnRUcmVlIGFuZCBSaWdodFRyZWUgKi8KLQkJZk1hdGNoZXM9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKCFMZWZ0VHJlZS5nZXRTaWduYXR1cmUoKS5lcXVhbHMoUmlnaHRUcmVlLmdldFNpZ25hdHVyZSgpKSkgewotCQkJLy9tYXRjaGluZyBpcyBlbXB0eQkKLQkJfSBlbHNlIHsKLQkJCWZNYXRjaGVzLmFkZChuZXcgTWF0Y2goTGVmdFRyZWUsIFJpZ2h0VHJlZSkpOwotCQkJZm9yIChpbnQgaV9NPSAwOyBpX00gPCBmTWF0Y2hlcy5zaXplKCk7IGlfTSsrKSB7Ci0JCQkJTWF0Y2ggbT0gKE1hdGNoKSBmTWF0Y2hlcy5lbGVtZW50QXQoaV9NKTsKLQkJCQlpZiAoIWlzTGVhZihtLmZ4KSAmJiAhaXNMZWFmKG0uZnkpKSB7Ci0JCQkJCS8vCQkJCQlpZiAoZkRUX01hdGNoaW5nc1sgaW5kZXhPZkxOKG0uZngpIF1bIGluZGV4T2ZSTihtLmZ5KSBdID09IG51bGwpCi0JCQkJCS8vCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogSUQgbm90IHVuaXF1ZSBmb3IgIiArIG0uZnguZ2V0SWQoKSk7Ci0JCQkJCS8vCQkJCQllbHNlCi0JCQkJCS8vCQkJCQkJZk1hdGNoZXMuYWRkQWxsKGZEVF9NYXRjaGluZ3NbIGluZGV4T2ZMTihtLmZ4KSBdWyBpbmRleE9mUk4obS5meSkgXSk7Ci0JCQkJCWlmIChmRFRfTWF0Y2hpbmdzW2luZGV4T2ZMTihtLmZ4KV1baW5kZXhPZlJOKG0uZnkpXQotCQkJCQkJIT0gbnVsbCkKLQkJCQkJCWZNYXRjaGVzLmFkZEFsbCgKLQkJCQkJCQlmRFRfTWF0Y2hpbmdzW2luZGV4T2ZMTihtLmZ4KV1baW5kZXhPZlJOKG0uZnkpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vZW5kIG9mIFN0ZXAyCi0JCS8qIFJlbnVtYmVyIElkIG9mIE5vZGVzIHRvIGZvbGxvdyBNYXRjaGVzLiBPciBmb3IgYW5jZXN0b3IsIGNvcHkgb3ZlciBJZCB0byBhbmNlc3RvciAqLwotCQlpZiAocmlnaHRUcmVlSXNBbmNlc3RvcikgewotCQkJZm9yIChMaXN0SXRlcmF0b3IgaXRfTT0gZk1hdGNoZXMubGlzdEl0ZXJhdG9yKCk7IGl0X00uaGFzTmV4dCgpOykgewotCQkJCU1hdGNoIG09IChNYXRjaCkgaXRfTS5uZXh0KCk7Ci0JCQkJaWYgKG0uZnggIT0gbnVsbCAmJiBtLmZ5ICE9IG51bGwpCi0JCQkJCW0uZnkuc2V0SWQobS5meC5nZXRJZCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBuZXdJZD0gMDsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yIGl0X009IGZNYXRjaGVzLmxpc3RJdGVyYXRvcigpOwotCQkJCWl0X00uaGFzTmV4dCgpOwotCQkJCW5ld0lkKyspIHsKLQkJCQlNYXRjaCBtPSAoTWF0Y2gpIGl0X00ubmV4dCgpOwotCQkJCWlmIChtLmZ4ICE9IG51bGwpCi0JCQkJCW0uZnguc2V0SWQoSW50ZWdlci50b1N0cmluZyhuZXdJZCkpOwotCQkJCWlmIChtLmZ5ICE9IG51bGwpCi0JCQkJCW0uZnkuc2V0SWQoSW50ZWdlci50b1N0cmluZyhuZXdJZCkpOwotCQkJCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWF0Y2hpbmc6ICIrICgobS5meCAhPSBudWxsKT9tLmZ4LmdldE9yaWdJZCgpOiJudWxsIikrIiAtPiAiKygobS5meCAhPSBudWxsKT9tLmZ4LmdldElkKCk6Im51bGwiKSsiICwgIisoKG0uZnkgIT0gbnVsbCk/bS5meS5nZXRPcmlnSWQoKToibnVsbCIpKyIgLT4gIisoKG0uZnkgIT0gbnVsbCk/bS5meS5nZXRJZCgpOiJudWxsIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCX0KLQkJLy9pZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhbmRsZUF0dHJpYnV0ZXMoCi0JCUFycmF5TGlzdCB4Y19hdHRycywKLQkJQXJyYXlMaXN0IHljX2F0dHJzLAotCQlBcnJheUxpc3QgRFRNYXRjaGluZykgewotCQlpbnQgZGlzdGFuY2U9IDA7Ci0JCXhfZm9yIDogZm9yICgKLQkJCUl0ZXJhdG9yIGl0ZXJfeGM9IHhjX2F0dHJzLml0ZXJhdG9yKCk7IGl0ZXJfeGMuaGFzTmV4dCgpOykgewotCQkJWE1MTm9kZSB4X2F0dHI9IChYTUxOb2RlKSBpdGVyX3hjLm5leHQoKTsKLQkJCVN0cmluZyB4X2F0dHJfbmFtZT0geF9hdHRyLmdldE5hbWUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcl95Yz0geWNfYXR0cnMuaXRlcmF0b3IoKTsgaXRlcl95Yy5oYXNOZXh0KCk7KSB7Ci0JCQkJWE1MTm9kZSB5X2F0dHI9IChYTUxOb2RlKSBpdGVyX3ljLm5leHQoKTsKLQkJCQlpZiAoeV9hdHRyLmdldE5hbWUoKS5lcXVhbHMoeF9hdHRyX25hbWUpKSB7Ci0JCQkJCWlmICgheV9hdHRyLmdldFZhbHVlKCkuZXF1YWxzKHhfYXR0ci5nZXRWYWx1ZSgpKSkKLQkJCQkJCWRpc3RhbmNlICs9IDE7Ci0JCQkJCURUTWF0Y2hpbmcuYWRkKG5ldyBNYXRjaCh4X2F0dHIsIHlfYXR0cikpOwotCQkJCQl5Y19hdHRycy5yZW1vdmUoeV9hdHRyKTsKLQkJCQkJY29udGludWUgeF9mb3I7Ci0JCQkJfQotCQkJfQotCQkJRFRNYXRjaGluZy5hZGQobmV3IE1hdGNoKHhfYXR0ciwgbnVsbCkpOwotCQkJZGlzdGFuY2UgKz0gMTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlcl95Yz0geWNfYXR0cnMuaXRlcmF0b3IoKTsgaXRlcl95Yy5oYXNOZXh0KCk7KSB7Ci0JCQlEVE1hdGNoaW5nLmFkZChuZXcgTWF0Y2gobnVsbCwgKFhNTE5vZGUpIGl0ZXJfeWMubmV4dCgpKSk7Ci0JCQlkaXN0YW5jZSArPSAxOwotCQl9Ci0KLQkJcmV0dXJuIGRpc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgaGFuZGxlWGFuZFlub3RMZWF2ZXMoWE1MTm9kZSB4LCBYTUxOb2RlIHkpIHsKLQkJLyogaGFuZGxlIGVudHJpZXMgYXMgb3JkZXJlZCovCi0JCXJldHVybiBvcmRlcmVkTWF0aCh4LCB5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvU1dUVXRpbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1YjUzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYXJldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2ltcGxpZnkgYWNjZXNzIHRvIHNvbWUgU1dUIHJlc291cmNlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQkKLQkvKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5PSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGRpc3BsYXk7CQkKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldC4gSWYgdGhlIHdpZGdldCBkb2Vzbid0IHJlcHJlc2VudAotCSAqIGEgU1dUIG9iamVjdCB0aGF0IG1hbmFnZSBhIHNoZWxsLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkKLQkJCXJldHVybiAoKENvbnRyb2wpd2lkZ2V0KS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ2FyZXQpCi0JCQlyZXR1cm4gKChDYXJldCl3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBEcmFnU291cmNlKQotCQkJcmV0dXJuICgoRHJhZ1NvdXJjZSl3aWRnZXQpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJvcFRhcmdldCkKLQkJCXJldHVybiAoKERyb3BUYXJnZXQpd2lkZ2V0KS5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIE1lbnUpCi0JCQlyZXR1cm4gKChNZW51KXdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFNjcm9sbEJhcikKLQkJCXJldHVybiAoKFNjcm9sbEJhcil3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7CQkJCi0JCXJldHVybiBudWxsOwkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGdldFZlcnRpY2FsRGlhbG9nVW5pdFNpemUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjPSBuZXcgR0MoY29udHJvbCk7Ci0JCXRyeSB7Ci0JCQlpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJCXJldHVybiBoZWlnaHQgKiAwLjEyNTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBkb3VibGUgZ2V0SG9yaXpvbnRhbERpYWxvZ1VuaXRTaXplKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYz0gbmV3IEdDKGNvbnRyb2wpOwotCQl0cnkgewotCQkJaW50IGF2ZXJhZ2VXaWR0aD0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQlyZXR1cm4gYXZlcmFnZVdpZHRoICogMC4yNTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0JCi0JCi0JLyoKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhjaGFycyAqIDgsIGNvbnRyb2wpOwotCX0KLQotCS8qCi0JICogQHNlZSBEaWFsb2dQYWdlI2NvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50IGRsdXMsIENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gKGludClNYXRoLnJvdW5kKGRsdXMgKiBnZXRIb3Jpem9udGFsRGlhbG9nVW5pdFNpemUoY29udHJvbCkpOwotCX0KLQotCS8qCi0JICogQHNlZSBEaWFsb2dQYWdlI2NvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhpbnQgZGx1cywgQ29udHJvbCBjb250cm9sKSB7Ci0JCXJldHVybiAoaW50KU1hdGgucm91bmQoZGx1cyAqIGdldFZlcnRpY2FsRGlhbG9nVW5pdFNpemUoY29udHJvbCkpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGNoYXJzICogNCwgY29udHJvbCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaW50IHdpZHRoSGludD0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgsIGJ1dHRvbik7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhIGhlaWdodCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwkJCi0vLwlwdWJsaWMgc3RhdGljIGludCBnZXRCdXR0b25IZWlndGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLS8vCQlyZXR1cm4gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX0hFSUdIVCwgYnV0dG9uKTsKLS8vCX0JCQotCi0JLyoKLQkgKiBTZXRzIHdpZHRoIGFuZCBoZWlnaHQgaGludCBmb3IgdGhlIGJ1dHRvbiBjb250cm9sLgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGlzIGEgTk9QIGlmIHRoZSBidXR0b24ncyBsYXlvdXQgZGF0YSBpcyBub3QKLQkgKiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5HcmlkRGF0YTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtCXRoZSBidXR0b24gZm9yIHdoaWNoIHRvIHNldCB0aGUgZGltZW5zaW9uIGhpbnQKLQkgKi8JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCdXR0b25EaW1lbnNpb25IaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChidXR0b24pOwotCQlPYmplY3QgZ2Q9IGJ1dHRvbi5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChnZCBpbnN0YW5jZW9mIEdyaWREYXRhKSB7Ci0JCQkvLygoR3JpZERhdGEpZ2QpLmhlaWdodEhpbnQ9IGdldEJ1dHRvbkhlaWd0aEhpbnQoYnV0dG9uKTsKLQkJCSgoR3JpZERhdGEpZ2QpLndpZHRoSGludD0gZ2V0QnV0dG9uV2lkdGhIaW50KGJ1dHRvbik7CQkgCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvU2VsZWN0TWF0Y2hlckFjdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1NlbGVjdE1hdGNoZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYjU2Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvU2VsZWN0TWF0Y2hlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotY2xhc3MgU2VsZWN0TWF0Y2hlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIFhNTFN0cnVjdHVyZVZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjOwotCi0JcHVibGljIFNlbGVjdE1hdGNoZXJBY3Rpb24oU3RyaW5nIGRlc2MsIFhNTFN0cnVjdHVyZVZpZXdlciB2aWV3ZXIpIHsKLQkJZlZpZXdlcj0gdmlld2VyOwotCQlmRGVzYz0gZGVzYzsKLQkJc2V0VGV4dChmRGVzYyk7Ci0JCXNldFRvb2xUaXBUZXh0KGZEZXNjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCSgoWE1MU3RydWN0dXJlQ3JlYXRvcikgZlZpZXdlci5nZXRTdHJ1Y3R1cmVDcmVhdG9yKCkpLnNldElkTWFwKGZEZXNjKTsKLQkJZlZpZXdlci5jb250ZW50Q2hhbmdlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxDaGlsZHJlbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENoaWxkcmVuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MmI0MjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENoaWxkcmVuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0vKiogWE1MTm9kZSB0aGF0IGhhcyBjaGlsZHJlbiBlbGVtZW50cyAqLwotcHVibGljIGNsYXNzIFhNTENoaWxkcmVuIGV4dGVuZHMgWE1MTm9kZSB7Ci0JCi0JcHVibGljIGludCBjaGlsZHJlbjsJLy8gY291bnRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4KLQlwdWJsaWMgSGFzaE1hcCBjaGlsZEVsZW1lbnRzOwkvLyBtYXBzIHRoZSBuYW1lIG9mIFhNTCBjaGlsZCBlbGVtZW50cyB0byB0aGVpciAjIG9mIG9jY3VyZW5jZQotCQotCXB1YmxpYyBYTUxDaGlsZHJlbihTdHJpbmcgWE1MVHlwZSwgU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBzaWduYXR1cmUsIElEb2N1bWVudCBkb2MsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihYTUxUeXBlLCBpZCwgdmFsdWUsIHNpZ25hdHVyZSwgZG9jLCBzdGFydCwgbGVuZ3RoKTsKLQkJY2hpbGRyZW49IDA7Ci0JCWNoaWxkRWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTVlMDE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aS5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwudWkuU3RhdHVzSW5mbzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYWRkIG9yIGVkaXQgYW4gSUQgTWFwcGluZyBTY2hlbWUKLSAqLwotcHVibGljIGNsYXNzIFhNTENvbXBhcmVBZGRJZE1hcERpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZyB7Ci0JCi0JcHJpdmF0ZSBJZE1hcCBmSWRNYXA7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZJZE1hcHM7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZJZE1hcHNJbnRlcm5hbDsKLQlwcml2YXRlIEhhc2hNYXAgZklkRXh0ZW5zaW9uVG9OYW1lOwotCXByaXZhdGUgYm9vbGVhbiBmRWRpdDsKLQkKLQlwcml2YXRlIFRleHQgZklkTWFwVGV4dDsKLQlwcml2YXRlIFRleHQgZklkTWFwRXh0VGV4dDsKLQotCXB1YmxpYyBYTUxDb21wYXJlQWRkSWRNYXBEaWFsb2coU2hlbGwgcGFyZW50LCBJZE1hcCBpZG1hcCwgSGFzaE1hcCBpZG1hcHMsIEhhc2hNYXAgaWRtYXBzSW50ZXJuYWwsIEhhc2hNYXAgaWRleHRlbnNpb250b25hbWUsIGJvb2xlYW4gZWRpdCkgewotCQlzdXBlcihwYXJlbnQpOwotCQotCQlmRWRpdD0gZWRpdDsKLQkJaWYgKGZFZGl0KQotCQkJc2V0VGl0bGUoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nLmVkaXRUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRUaXRsZShYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cubmV3VGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmSWRNYXA9IGlkbWFwOwotCQlmSWRNYXBzPSBpZG1hcHM7Ci0JCWZJZE1hcHNJbnRlcm5hbD0gaWRtYXBzSW50ZXJuYWw7Ci0JCWZJZEV4dGVuc2lvblRvTmFtZT0gaWRleHRlbnNpb250b25hbWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IAotCSAqIG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwkJCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShhbmNlc3Rvcik7Ci0JCQotCQlDb21wb3NpdGUgaW5uZXI9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJaW5uZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWlubmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChpbm5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlmSWRNYXBUZXh0PSBuZXcgVGV4dChpbm5lciwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMzApOwotCQlmSWRNYXBUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZJZE1hcFRleHQuc2V0VGV4dChmSWRNYXAuZ2V0TmFtZSgpKTsKLQkJZklkTWFwVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJCWRvVmFsaWRhdGlvbigpOwotCQkJfQotCQl9KTsKLQkKLQkJbGFiZWw9IG5ldyBMYWJlbChpbm5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5leHRsYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlmSWRNYXBFeHRUZXh0PSBuZXcgVGV4dChpbm5lciwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMzApOwotCQlmSWRNYXBFeHRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZJZE1hcEV4dFRleHQuc2V0VGV4dChmSWRNYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQlmSWRNYXBFeHRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0JCQkJZG9WYWxpZGF0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCQotCQlmSWRNYXBUZXh0LnNldEZvY3VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdXNlciBpbnB1dAotCSAqLwkJCi0JcHJpdmF0ZSB2b2lkIGRvVmFsaWRhdGlvbigpIHsKLQkJU3RhdHVzSW5mbyBzdGF0dXM9IG5ldyBTdGF0dXNJbmZvKCk7Ci0JCVN0cmluZyBuZXdUZXh0PSBmSWRNYXBUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5ld1RleHQubGVuZ3RoKCkgPT0gMCkKLQkJCXN0YXR1cy5zZXRFcnJvcihYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cuZXJyb3Iubm9uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKFhNTENvbXBhcmVQcmVmZXJlbmNlUGFnZS5jb250YWluc0ludmFsaWRDaGFyYWN0ZXJzKG5ld1RleHQpKQotCQkJc3RhdHVzLnNldEVycm9yKFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5lcnJvci5pbnZhbGlkbmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmICggKCFmRWRpdCAmJiAoZklkTWFwcy5jb250YWluc0tleShuZXdUZXh0KSB8fCBmSWRNYXBzSW50ZXJuYWwuY29udGFpbnNLZXkobmV3VGV4dCkpICkKLQkJCQkJfHwgKGZFZGl0ICYmICFuZXdUZXh0LmVxdWFscyhmSWRNYXAuZ2V0TmFtZSgpKSAmJiAoZklkTWFwcy5jb250YWluc0tleShuZXdUZXh0KSB8fCBmSWRNYXBzSW50ZXJuYWwuY29udGFpbnNLZXkobmV3VGV4dCkpICkKLQkJCQkgKQotCQkJc3RhdHVzLnNldEVycm9yKFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5lcnJvci5pZG1hcEV4aXN0cyIpKTsgLy8kTk9OLU5MUy0xJAotCQluZXdUZXh0PSBmSWRNYXBFeHRUZXh0LmdldFRleHQoKS50b0xvd2VyQ2FzZSgpOwotCQlpZiAobmV3VGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChuZXdUZXh0LmluZGV4T2YoIi4iKSA+IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJc3RhdHVzLnNldEVycm9yKFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5lcnJvci5leHRmdWxsc3RvcCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoZklkRXh0ZW5zaW9uVG9OYW1lLmNvbnRhaW5zS2V5KG5ld1RleHQpICYmICFmSWRFeHRlbnNpb25Ub05hbWUuZ2V0KG5ld1RleHQpLmVxdWFscyhmSWRNYXAuZ2V0TmFtZSgpKSkKLQkJCQlzdGF0dXMuc2V0RXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSB7MX0iLG5ldyBTdHJpbmdbXSB7WE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nLmVycm9yLmV4dEV4aXN0cyIpLChTdHJpbmcpZklkRXh0ZW5zaW9uVG9OYW1lLmdldChuZXdUZXh0KX0pKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9rIGJ1dHRvbiBvZiB0aGlzIGRpYWxvZyBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwkKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWZJZE1hcC5zZXROYW1lKGZJZE1hcFRleHQuZ2V0VGV4dCgpKTsKLQkJZklkTWFwLnNldEV4dGVuc2lvbihmSWRNYXBFeHRUZXh0LmdldFRleHQoKS50b0xvd2VyQ2FzZSgpKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVFZGl0Q29weUlkTWFwRGlhbG9nLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZUVkaXRDb3B5SWRNYXBEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0YTU1Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZUVkaXRDb3B5SWRNYXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aS5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwudWkuU3RhdHVzSW5mbzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGVkaXRhYmxlIElEIE1hcHBpbmcgU2NoZW1lIGZyb20gYW4gaW50ZXJuYWwgSUQgTWFwcHBpbmcgU2NoZW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZyB7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGZJZE1hcHM7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZJZE1hcHNJbnRlcm5hbDsKLQkKLQlwcml2YXRlIFRleHQgZklkTWFwVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmUmVzdWx0OwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGVkaXQgY29weSBtYXBwaW5nIGRpYWxvZy4KLQkgKi8JCi0JcHVibGljIFhNTENvbXBhcmVFZGl0Q29weUlkTWFwRGlhbG9nKFNoZWxsIHBhcmVudCwgSWRNYXAgaWRtYXAsIEhhc2hNYXAgaWRtYXBzLCBIYXNoTWFwIGlkbWFwc0ludGVybmFsKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCi0JCXNldFRpdGxlKFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0Q29weUlkTWFwRGlhbG9nLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZklkTWFwcz0gaWRtYXBzOwotCQlmSWRNYXBzSW50ZXJuYWw9IGlkbWFwc0ludGVybmFsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGZSZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IAotCSAqIG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwkJCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShhbmNlc3Rvcik7Ci0JCQotCQlMYWJlbCBjb21tZW50PSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbW1lbnQuc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy5jb21tZW50IikpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGE9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29tbWVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQ29tcG9zaXRlIGlubmVyPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWlubmVyLnNldExheW91dChsYXlvdXQpOwotCQlpbm5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwoaW5uZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlmSWRNYXBUZXh0PSBuZXcgVGV4dChpbm5lciwgU1dULkJPUkRFUik7Ci0JCWZJZE1hcFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZJZE1hcFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJCQlkb1ZhbGlkYXRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZklkTWFwVGV4dC5zZXRGb2N1cygpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdXNlciBpbnB1dAotCSAqLwkJCi0JcHJpdmF0ZSB2b2lkIGRvVmFsaWRhdGlvbigpIHsKLQkJU3RhdHVzSW5mbyBzdGF0dXM9IG5ldyBTdGF0dXNJbmZvKCk7Ci0JCVN0cmluZyBuZXdUZXh0PSBmSWRNYXBUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5ld1RleHQubGVuZ3RoKCkgPT0gMCkKLQkJCXN0YXR1cy5zZXRFcnJvcihYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy5lcnJvci5ub25hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlLmNvbnRhaW5zSW52YWxpZENoYXJhY3RlcnMobmV3VGV4dCkpCi0JCQlzdGF0dXMuc2V0RXJyb3IoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRDb3B5SWRNYXBEaWFsb2cuZXJyb3IuaW52YWxpZG5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoZklkTWFwcy5jb250YWluc0tleShuZXdUZXh0KSB8fCBmSWRNYXBzSW50ZXJuYWwuY29udGFpbnNLZXkobmV3VGV4dCkpCi0JCQlzdGF0dXMuc2V0RXJyb3IoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRDb3B5SWRNYXBEaWFsb2cuZXJyb3IubmFtZUV4aXN0cyIpKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgb2sgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCQkKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWZSZXN1bHQ9IGZJZE1hcFRleHQuZ2V0VGV4dCgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZGY5ZTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLnVpLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aS5TdGF0dXNJbmZvOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhZGQgb3IgZWRpdCBhIHBhcnRpY3VsYXIgSUQgTWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nIHsKLQkKLQlwcml2YXRlIE1hcHBpbmcgZk1hcHBpbmc7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZJZG1hcEhNOwotCXByaXZhdGUgYm9vbGVhbiBmRWRpdDsKLQkKLQlwcml2YXRlIFRleHQgZkVsZW1lbnRUZXh0OwotCXByaXZhdGUgVGV4dCBmU2lnbmF0dXJlVGV4dDsKLQlwcml2YXRlIFRleHQgZklkQXR0cmlidXRlVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGZJZFR5cGVBdHRyaWJ1dGVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZklkVHlwZUNoaWxkQm9keUJ1dHRvbjsKLQkKLQkvKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZWRpdCBtYXBwaW5nIGRpYWxvZy4KLQkgKi8JCQotCXB1YmxpYyBYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2coU2hlbGwgcGFyZW50LCBNYXBwaW5nIG1hcHBpbmcsIEhhc2hNYXAgaWRtYXBITSwgYm9vbGVhbiBlZGl0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCi0JCWludCBzaGVsbFN0eWxlPSBnZXRTaGVsbFN0eWxlKCk7Ci0JCXNldFNoZWxsU3R5bGUoc2hlbGxTdHlsZSB8IFNXVC5NQVggfCBTV1QuUkVTSVpFKTsKLQotCQotCQlmRWRpdD0gZWRpdDsKLQkJaWYgKGZFZGl0KQotCQkJc2V0VGl0bGUoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmVkaXRUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRUaXRsZShYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cubmV3VGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmTWFwcGluZz0gbWFwcGluZzsKLQkJZklkbWFwSE09IGlkbWFwSE07Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IAotCSAqIG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGFuY2VzdG9yKTsKLQkJCi0JCUNvbXBvc2l0ZSBpbm5lcj0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAyOwotCQlpbm5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQkvL0VsZW1lbnQKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChpbm5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWZFbGVtZW50VGV4dD0gbmV3IFRleHQoaW5uZXIsIFNXVC5CT1JERVIpOwotCQlmRWxlbWVudFRleHQuc2V0VGV4dChmTWFwcGluZy5nZXRFbGVtZW50KCkpOwotCQlmRWxlbWVudFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZFbGVtZW50VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJCWRvVmFsaWRhdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQkvL1NpZ25hdHVyZQotCQlsYWJlbD0gbmV3IExhYmVsKGlubmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLnNpZ25hdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlmU2lnbmF0dXJlVGV4dD0gbmV3IFRleHQoaW5uZXIsIFNXVC5CT1JERVIpOwotCQlmU2lnbmF0dXJlVGV4dC5zZXRUZXh0KGZNYXBwaW5nLmdldFNpZ25hdHVyZSgpKTsKLQkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50PSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlmU2lnbmF0dXJlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmU2lnbmF0dXJlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJCWRvVmFsaWRhdGlvbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vSWQgQXR0cmlidXRlCi0JCWxhYmVsPSBuZXcgTGFiZWwoaW5uZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuaWRhdHRyaWJ1dGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJZklkQXR0cmlidXRlVGV4dD0gbmV3IFRleHQoaW5uZXIsIFNXVC5CT1JERVIpOwotCi0JCWZJZEF0dHJpYnV0ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZJZEF0dHJpYnV0ZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJCQlkb1ZhbGlkYXRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy9JZCBTb3VyY2UKLQkJY3JlYXRlSWRTb3VyY2VHcm91cChpbm5lcik7Ci0KLQkJZkVsZW1lbnRUZXh0LnNldEZvY3VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdXNlciBpbnB1dAotCSAqLwkKLQlwcml2YXRlIHZvaWQgZG9WYWxpZGF0aW9uKCkgewotCQlTdGF0dXNJbmZvIHN0YXR1cz0gbmV3IFN0YXR1c0luZm8oKTsKLQkJU3RyaW5nIHRleHQ9IGZFbGVtZW50VGV4dC5nZXRUZXh0KCk7Ci0JCVN0cmluZyBtYXBwaW5nS2V5PSBNYXBwaW5nLmdldEtleShmU2lnbmF0dXJlVGV4dC5nZXRUZXh0KCksIHRleHQpOwotCQlTdHJpbmcgZXJyb3Jtc2c9ICIiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gaXNFcnJvcj0gZmFsc2U7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCWVycm9ybXNnPSBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuZXJyb3Iubm9uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlzRXJyb3I9IHRydWU7Ci0JCX0gZWxzZSBpZiAoWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlLmNvbnRhaW5zSW52YWxpZENoYXJhY3RlcnModGV4dCkpIHsKLQkJCWlmIChlcnJvcm1zZyA9PSAiIikgZXJyb3Jtc2c9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5pbnZhbGlkbmFtZSIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCWlzRXJyb3I9IHRydWU7Ci0JCX0gZWxzZSBpZiAoIWZFZGl0ICYmIGZJZG1hcEhNICE9IG51bGwgJiYgZklkbWFwSE0uY29udGFpbnNLZXkobWFwcGluZ0tleSkpIHsKLQkJCWlmIChlcnJvcm1zZyA9PSAiIikgZXJyb3Jtc2c9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5tYXBwaW5nRXhpc3RzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJaXNFcnJvcj0gdHJ1ZTsKLQkJfQotCQl0ZXh0PSBmU2lnbmF0dXJlVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChYTUxDb21wYXJlUHJlZmVyZW5jZVBhZ2UuY29udGFpbnNJbnZhbGlkQ2hhcmFjdGVycyh0ZXh0KSkgewotCQkJaWYgKGVycm9ybXNnID09ICIiKSBlcnJvcm1zZz0gWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmVycm9yLmludmFsaWRzaWduYXR1cmUiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlpc0Vycm9yPSB0cnVlOwotCQl9Ci0JCXRleHQ9IGZJZEF0dHJpYnV0ZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJaXNFcnJvcj0gdHJ1ZTsKLQkJZWxzZSBpZiAoWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlLmNvbnRhaW5zSW52YWxpZENoYXJhY3RlcnModGV4dCkpIHsKLQkJCWlmIChlcnJvcm1zZyA9PSAiIikgZXJyb3Jtc2c9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5pbnZhbGlkaWRhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlpc0Vycm9yPSB0cnVlOwotCQl9Ci0JCWlmIChpc0Vycm9yKSBzdGF0dXMuc2V0RXJyb3IoZXJyb3Jtc2cpOwotCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgb2sgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJZk1hcHBpbmcuc2V0RWxlbWVudChmRWxlbWVudFRleHQuZ2V0VGV4dCgpKTsKLQkJZk1hcHBpbmcuc2V0U2lnbmF0dXJlKGZTaWduYXR1cmVUZXh0LmdldFRleHQoKSk7Ci0JCVN0cmluZyBpZHRleHQ9IGZJZEF0dHJpYnV0ZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAoZklkVHlwZUNoaWxkQm9keUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJaWR0ZXh0PSBuZXcgQ2hhcmFjdGVyKFhNTFN0cnVjdHVyZUNyZWF0b3IuSURfVFlQRV9CT0RZKSArIGlkdGV4dDsKLQkJfQotCQlmTWFwcGluZy5zZXRJZEF0dHJpYnV0ZShpZHRleHQpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkU291cmNlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCB0aXRsZUxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRpdGxlTGFiZWwuc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuaWR0eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCXRpdGxlTGFiZWwuc2V0VG9vbFRpcFRleHQoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmlkdHlwZS50b29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGU9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCi0JCS8vYXR0cmlidXRlIGJ1dHRvbgotCQlmSWRUeXBlQXR0cmlidXRlQnV0dG9uPSBjcmVhdGVSYWRpb0J1dHRvbihidXR0b25Db21wb3NpdGUsIFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLmlkdHlwZS5hdHRyaWJ1dGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZklkVHlwZUF0dHJpYnV0ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuaWR0eXBlLmF0dHJpYnV0ZS50b29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JCi0JCS8vY2hpbGQgYm9keSBidXR0b24KLQkJZklkVHlwZUNoaWxkQm9keUJ1dHRvbj0gY3JlYXRlUmFkaW9CdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5pZHR5cGUuY2hpbGRfYm9keSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmSWRUeXBlQ2hpbGRCb2R5QnV0dG9uLnNldFRvb2xUaXBUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5pZHR5cGUuY2hpbGRib2R5LnRvb2x0aXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJU3RyaW5nIGlkdGV4dD0gZk1hcHBpbmcuZ2V0SWRBdHRyaWJ1dGUoKTsKLQkJaWYgKGZFZGl0ICYmIGlkdGV4dC5jaGFyQXQoMCkgPT0gWE1MU3RydWN0dXJlQ3JlYXRvci5JRF9UWVBFX0JPRFkpIHsKLQkJCWlkdGV4dD0gaWR0ZXh0LnN1YnN0cmluZygxLGlkdGV4dC5sZW5ndGgoKSk7Ci0JCQlmSWRUeXBlQ2hpbGRCb2R5QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfSBlbHNlCi0JCQlmSWRUeXBlQXR0cmlidXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZklkQXR0cmlidXRlVGV4dC5zZXRUZXh0KGlkdGV4dCk7Ci0JCi0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b249IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzdmYTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVFZGl0T3JkZXJlZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aS5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwudWkuU3RhdHVzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhZGQgb3IgZWRpdCBhIHBhcnRpY3VsYXIgSUQgTWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nIHsKLQkKLQlwcml2YXRlIE1hcHBpbmcgZk1hcHBpbmc7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZklkbWFwQUw7Ci0JcHJpdmF0ZSBib29sZWFuIGZFZGl0OwotCQotCXByaXZhdGUgVGV4dCBmRWxlbWVudFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IGZTaWduYXR1cmVUZXh0OwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGVkaXQgbWFwcGluZyBkaWFsb2cuCi0JICovCQkKLQlwdWJsaWMgWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nKFNoZWxsIHBhcmVudCwgTWFwcGluZyBtYXBwaW5nLCBBcnJheUxpc3QgaWRtYXBBTCwgYm9vbGVhbiBlZGl0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCi0JCWludCBzaGVsbFN0eWxlPSBnZXRTaGVsbFN0eWxlKCk7Ci0JCXNldFNoZWxsU3R5bGUoc2hlbGxTdHlsZSB8IFNXVC5NQVggfCBTV1QuUkVTSVpFKTsKLQotCQotCQlmRWRpdD0gZWRpdDsKLQkJaWYgKGZFZGl0KQotCQkJc2V0VGl0bGUoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nLmVkaXRUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRUaXRsZShYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE9yZGVyZWREaWFsb2cubmV3VGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmTWFwcGluZz0gbWFwcGluZzsKLQkJZklkbWFwQUw9IGlkbWFwQUw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IAotCSAqIG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGFuY2VzdG9yIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGFuY2VzdG9yKTsKLQkJCi0JCUNvbXBvc2l0ZSBpbm5lcj0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAyOwotCQlpbm5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQkvL0VsZW1lbnQKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChpbm5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWZFbGVtZW50VGV4dD0gbmV3IFRleHQoaW5uZXIsIFNXVC5CT1JERVIpOwotCQlmRWxlbWVudFRleHQuc2V0VGV4dChmTWFwcGluZy5nZXRFbGVtZW50KCkpOwotCQlmRWxlbWVudFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZFbGVtZW50VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJCWRvVmFsaWRhdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQkvL1NpZ25hdHVyZQotCQlsYWJlbD0gbmV3IExhYmVsKGlubmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLnNpZ25hdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlmU2lnbmF0dXJlVGV4dD0gbmV3IFRleHQoaW5uZXIsIFNXVC5CT1JERVIpOwotCQlmU2lnbmF0dXJlVGV4dC5zZXRUZXh0KGZNYXBwaW5nLmdldFNpZ25hdHVyZSgpKTsKLQkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50PSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlmU2lnbmF0dXJlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmU2lnbmF0dXJlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJCWRvVmFsaWRhdGlvbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZFbGVtZW50VGV4dC5zZXRGb2N1cygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHVzZXIgaW5wdXQKLQkgKi8JCi0JcHJpdmF0ZSB2b2lkIGRvVmFsaWRhdGlvbigpIHsKLQkJU3RhdHVzSW5mbyBzdGF0dXM9IG5ldyBTdGF0dXNJbmZvKCk7Ci0JCVN0cmluZyB0ZXh0PSBmRWxlbWVudFRleHQuZ2V0VGV4dCgpOwotCQlTdHJpbmcgbWFwcGluZ0tleT0gTWFwcGluZy5nZXRLZXkoZlNpZ25hdHVyZVRleHQuZ2V0VGV4dCgpLCB0ZXh0KTsKLQkJU3RyaW5nIGVycm9ybXNnPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGlzRXJyb3I9IGZhbHNlOwotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllcnJvcm1zZz0gWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmVycm9yLm5vbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpc0Vycm9yPSB0cnVlOwotCQl9IGVsc2UgaWYgKFhNTENvbXBhcmVQcmVmZXJlbmNlUGFnZS5jb250YWluc0ludmFsaWRDaGFyYWN0ZXJzKHRleHQpKSB7Ci0JCQlpZiAoZXJyb3Jtc2cgPT0gIiIpIGVycm9ybXNnPSBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuZXJyb3IuaW52YWxpZG5hbWUiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlpc0Vycm9yPSB0cnVlOwotCQl9IGVsc2UgaWYgKCFmRWRpdCAmJiBmSWRtYXBBTC5jb250YWlucyhtYXBwaW5nS2V5KSkgewotCQkJaWYgKGVycm9ybXNnID09ICIiKSBlcnJvcm1zZz0gWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nLmVycm9yLm9yZGVyZWRFeGlzdHMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpc0Vycm9yPSB0cnVlOwotCQl9Ci0JCXRleHQ9IGZTaWduYXR1cmVUZXh0LmdldFRleHQoKTsKLQkJaWYgKFhNTENvbXBhcmVQcmVmZXJlbmNlUGFnZS5jb250YWluc0ludmFsaWRDaGFyYWN0ZXJzKHRleHQpKSB7Ci0JCQlpZiAoZXJyb3Jtc2cgPT0gIiIpIGVycm9ybXNnPSBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuZXJyb3IuaW52YWxpZHNpZ25hdHVyZSIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCWlzRXJyb3I9IHRydWU7Ci0JCX0KLQkJaWYgKGlzRXJyb3IpIHN0YXR1cy5zZXRFcnJvcihlcnJvcm1zZyk7Ci0JCXVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBvayBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8JCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlmTWFwcGluZy5zZXRFbGVtZW50KGZFbGVtZW50VGV4dC5nZXRUZXh0KCkpOwotCQlmTWFwcGluZy5zZXRTaWduYXR1cmUoZlNpZ25hdHVyZVRleHQuZ2V0VGV4dCgpKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVNZXNzYWdlcy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTENvbXBhcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTM2NTM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxDb21wYXJlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcGFyZU1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLnhtbGNvbXBhcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEU9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIFhNTENvbXBhcmVNZXNzYWdlcygpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxDb21wYXJlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxDb21wYXJlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2NmZhZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLQotLyoqCi0gKiBUaGUgWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlIGlzIHRoZSBwYWdlIHVzZWQgdG8gc2V0IElEIE1hcHBpbmdzIGZvciBYTUwgQ29tcGFyZQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIExpc3RlbmVyIHsKLQotCXByaXZhdGUgVGFibGUgZklkTWFwc1RhYmxlOwotCXByaXZhdGUgQnV0dG9uIGZBZGRJZE1hcEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmUmVuYW1lSWRNYXBCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZlJlbW92ZUlkTWFwQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGZFZGl0SWRNYXBCdXR0b247Ci0KLQlwcml2YXRlIFRhYmxlIGZNYXBwaW5nc1RhYmxlOwotCXByaXZhdGUgQnV0dG9uIGZOZXdNYXBwaW5nc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmRWRpdE1hcHBpbmdzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGZSZW1vdmVNYXBwaW5nc0J1dHRvbjsKLQotCXByaXZhdGUgVGFibGUgZk9yZGVyZWRUYWJsZTsKLQlwcml2YXRlIEJ1dHRvbiBmTmV3T3JkZXJlZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmRWRpdE9yZGVyZWRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZlJlbW92ZU9yZGVyZWRCdXR0b247Ci0KLQlwcml2YXRlIEhhc2hNYXAgZklkTWFwc0ludGVybmFsOwotCXByaXZhdGUgSGFzaE1hcCBmSWRNYXBzOy8vIEhhc2hNYXAgKCBpZG5hbWUgLT4gSGFzaE1hcCAoc2lnbmF0dXJlIC0+IGlkKSApCi0JcHJpdmF0ZSBIYXNoTWFwIGZJZEV4dGVuc2lvblRvTmFtZTsKLQkKLQkvL2ZPcmRlcmVkRWxlbWVudHMgY29udGFpbnMgc2lnbmF0dXJlIG9mIHhtbCBlbGVtZW50IHdob3NlIGNoaWxkcmVuIG11c3QgYmUgY29tcGFyZWQgaW4gb3JkZXJlZCBmYXNoaW9uCi0JcHJpdmF0ZSBIYXNoTWFwIGZPcmRlcmVkRWxlbWVudHM7Ly8gSGFzaE1hcCAoIGlkbmFtZSAtPiBBcnJheUxpc3QgKHNpZ25hdHVyZSkgKQotCXByaXZhdGUgSGFzaE1hcCBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWw7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjaGFyW10gaW52YWxpZENoYXJhY3RlcnM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJR05fU0VQQVJBVE9SID0gWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEVFlQRV9BVFRSSUJVVEU9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLmlkdHlwZS5hdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEVFlQRV9DSElMREJPRFk9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLmlkdHlwZS5jaGlsZF9ib2R5Iik7IC8vJE5PTi1OTFMtMSQKLQotCQotCXN0YXRpYyB7Ci0JCWludmFsaWRDaGFyYWN0ZXJzID0gbmV3IGNoYXJbXSB7WE1MUGx1Z2luLklETUFQX1NFUEFSQVRPUixYTUxQbHVnaW4uSURNQVBfRklFTERTX1NFUEFSQVRPUixYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fRU5DTE9TSU5HfTsKLQl9Ci0KLQkKLQlwdWJsaWMgWE1MQ29tcGFyZVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQkKLQkJZklkTWFwcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVhNTFBsdWdpbiBwbHVnaW49IFhNTFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCUhhc2hNYXAgUGx1Z2luSWRNYXBzID0gcGx1Z2luLmdldElkTWFwcygpOwotCQlTZXQga2V5U2V0ID0gUGx1Z2luSWRNYXBzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJZklkTWFwcy5wdXQoa2V5LCAoKEhhc2hNYXApUGx1Z2luSWRNYXBzLmdldChrZXkpKS5jbG9uZSgpICk7Ci0JCX0KLQkJZklkTWFwc0ludGVybmFsID0gcGx1Z2luLmdldElkTWFwc0ludGVybmFsKCk7Ci0JCQotCQlmSWRFeHRlbnNpb25Ub05hbWU9IG5ldyBIYXNoTWFwKCk7Ci0JCUhhc2hNYXAgUGx1Z2luSWRFeHRlbnNpb25Ub05hbWU9IHBsdWdpbi5nZXRJZEV4dGVuc2lvblRvTmFtZSgpOwotCQlrZXlTZXQ9IFBsdWdpbklkRXh0ZW5zaW9uVG9OYW1lLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGtleVNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcga2V5PSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWZJZEV4dGVuc2lvblRvTmFtZS5wdXQoa2V5LCBQbHVnaW5JZEV4dGVuc2lvblRvTmFtZS5nZXQoa2V5KSk7Ci0JCX0KLQkJCi0JCWZPcmRlcmVkRWxlbWVudHM9IG5ldyBIYXNoTWFwKCk7Ci0JCUhhc2hNYXAgUGx1Z2luT3JkZXJlZEVsZW1lbnRzPSBwbHVnaW4uZ2V0T3JkZXJlZEVsZW1lbnRzKCk7Ci0JCWtleVNldD0gUGx1Z2luT3JkZXJlZEVsZW1lbnRzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGtleVNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXk9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJZk9yZGVyZWRFbGVtZW50cy5wdXQoa2V5LCAoKEFycmF5TGlzdClQbHVnaW5PcmRlcmVkRWxlbWVudHMuZ2V0KGtleSkpLmNsb25lKCkpOwotCQl9Ci0JCQotCQlmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWw9IHBsdWdpbi5nZXRPcmRlcmVkRWxlbWVudHNJbnRlcm5hbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50PSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7CQkJCQotCQkKLQkJLy9sYXlvdXQgdGhlIHRvcCB0YWJsZSAmIGl0cyBidXR0b25zCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFRhYmxlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZklkTWFwc1RhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlmSWRNYXBzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gZklkTWFwc1RhYmxlLmdldEl0ZW1IZWlnaHQoKSo0OwotCQlmSWRNYXBzVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZklkTWFwc1RhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJU3RyaW5nIGNvbHVtbjJUZXh0PSBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS50b3BUYWJsZUNvbHVtbjIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29sdW1uM1RleHQ9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFRhYmxlQ29sdW1uMyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbHVtbkxheW91dERhdGEgY29sdW1uTGF5b3V0c1tdPSB7Ci0JCQluZXcgQ29sdW1uV2VpZ2h0RGF0YSgxKSwKLQkJCW5ldyBDb2x1bW5QaXhlbERhdGEoY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGNvbHVtbjJUZXh0Lmxlbmd0aCgpKzIpLCB0cnVlKSwKLQkJCW5ldyBDb2x1bW5QaXhlbERhdGEoY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGNvbHVtbjNUZXh0Lmxlbmd0aCgpKzUpLCB0cnVlKX07Ci0JCVRhYmxlTGF5b3V0IHRhYmxlbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWZJZE1hcHNUYWJsZS5zZXRMYXlvdXQodGFibGVsYXlvdXQpOwotCQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKQotCQkJdGFibGVsYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5MYXlvdXRzW2ldKTsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZJZE1hcHNUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS50b3BUYWJsZUNvbHVtbjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZJZE1hcHNUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChjb2x1bW4yVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZJZE1hcHNUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChjb2x1bW4zVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZpbGxJZE1hcHNUYWJsZSgpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25zPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlidXR0b25zLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZBZGRJZE1hcEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlmQWRkSWRNYXBCdXR0b24uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS50b3BBZGQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZkFkZElkTWFwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFkZElkTWFwKGZBZGRJZE1hcEJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJLy9kYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fSEVJR0hUKTsKLQkJaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIGZBZGRJZE1hcEJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCQlmQWRkSWRNYXBCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZlJlbmFtZUlkTWFwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWZSZW5hbWVJZE1hcEJ1dHRvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFJlbmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmUmVuYW1lSWRNYXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVuYW1lSWRNYXAoZlJlbmFtZUlkTWFwQnV0dG9uLmdldFNoZWxsKCkpOwotCQkJfQotCQl9KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkvL2RhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9IRUlHSFQpOwotCQl3aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCBmQWRkSWRNYXBCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQkJZlJlbmFtZUlkTWFwQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZlJlbW92ZUlkTWFwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWZSZW1vdmVJZE1hcEJ1dHRvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFJlbW92ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmUmVtb3ZlSWRNYXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVJZE1hcChmUmVtb3ZlSWRNYXBCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCS8vZGF0YS5oZWlnaHRIaW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX0hFSUdIVCk7Ci0JCQl3aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCBmUmVtb3ZlSWRNYXBCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQkJZlJlbW92ZUlkTWFwQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlU3BhY2VyKGJ1dHRvbnMpOwotCi0JCWZFZGl0SWRNYXBCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJZkVkaXRJZE1hcEJ1dHRvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcEVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZkVkaXRJZE1hcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllZGl0SWRNYXAoZkVkaXRJZE1hcEJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJLy9kYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fSEVJR0hUKTsKLQkJd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgZkVkaXRJZE1hcEJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCQlmRWRpdElkTWFwQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCS8vU3BhY2VyCi0JCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vbGF5b3V0IHRoZSBtaWRkbGUgdGFibGUgJiBpdHMgYnV0dG9ucwotCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVUYWJsZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZk1hcHBpbmdzVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWZNYXBwaW5nc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGZNYXBwaW5nc1RhYmxlLmdldEl0ZW1IZWlnaHQoKSo0OwotCQlkYXRhLndpZHRoSGludD0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDcwKTsKLQkJZk1hcHBpbmdzVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbHVtbjNUZXh0PSBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVUYWJsZUNvbHVtbjMiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29sdW1uNFRleHQ9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLm1pZGRsZVRhYmxlQ29sdW1uNCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbkxheW91dHM9IG5ldyBDb2x1bW5MYXlvdXREYXRhW10gewotCQkJbmV3IENvbHVtbldlaWdodERhdGEoMTApLAotCQkJbmV3IENvbHVtbldlaWdodERhdGEoMTgpLAotCQkJbmV3IENvbHVtblBpeGVsRGF0YShjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoY29sdW1uM1RleHQubGVuZ3RoKCkrMSksIHRydWUpLAotCQkJbmV3IENvbHVtblBpeGVsRGF0YShjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoY29sdW1uNFRleHQubGVuZ3RoKCkrMyksIHRydWUpfTsKLQkJdGFibGVsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJZk1hcHBpbmdzVGFibGUuc2V0TGF5b3V0KHRhYmxlbGF5b3V0KTsKLQkJZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykKLQkJCXRhYmxlbGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uTGF5b3V0c1tpXSk7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmTWFwcGluZ3NUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVUYWJsZUNvbHVtbjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZNYXBwaW5nc1RhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLm1pZGRsZVRhYmxlQ29sdW1uMiIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZk1hcHBpbmdzVGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoY29sdW1uM1RleHQpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmTWFwcGluZ3NUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChjb2x1bW40VGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJYnV0dG9ucz0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlmTmV3TWFwcGluZ3NCdXR0b249IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlmTmV3TWFwcGluZ3NCdXR0b24uc2V0TGF5b3V0RGF0YShnZXRCdXR0b25HcmlkRGF0YShmTmV3TWFwcGluZ3NCdXR0b24pKTsKLQkJZk5ld01hcHBpbmdzQnV0dG9uLnNldFRleHQoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZVByZWZlcmVuY2UubWlkZGxlTmV3IikpOyAvLyROT04tTkxTLTEkCi0JCWZOZXdNYXBwaW5nc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRNYXBwaW5nKGZBZGRJZE1hcEJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZkVkaXRNYXBwaW5nc0J1dHRvbj0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWZFZGl0TWFwcGluZ3NCdXR0b24uc2V0TGF5b3V0RGF0YShnZXRCdXR0b25HcmlkRGF0YShmRWRpdE1hcHBpbmdzQnV0dG9uKSk7Ci0JCWZFZGl0TWFwcGluZ3NCdXR0b24uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVFZGl0IikpOyAvLyROT04tTkxTLTEkCi0JCWZFZGl0TWFwcGluZ3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWRpdE1hcHBpbmcoZkVkaXRNYXBwaW5nc0J1dHRvbi5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlJlbW92ZU1hcHBpbmdzQnV0dG9uPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJZlJlbW92ZU1hcHBpbmdzQnV0dG9uLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoZlJlbW92ZU1hcHBpbmdzQnV0dG9uKSk7Ci0JCWZSZW1vdmVNYXBwaW5nc0J1dHRvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLm1pZGRsZVJlbW92ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmUmVtb3ZlTWFwcGluZ3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlTWFwcGluZyhmUmVtb3ZlTWFwcGluZ3NCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZVNwYWNlcihidXR0b25zKTsKLQotCQkvL2xheW91dCB0aGUgYm90dG9uIHRhYmxlICYgaXRzIGJ1dHRvbnMKLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZVByZWZlcmVuY2UuYm90dG9tVGFibGVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZPcmRlcmVkVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWZPcmRlcmVkVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gZk9yZGVyZWRUYWJsZS5nZXRJdGVtSGVpZ2h0KCkqMjsKLQkJZGF0YS53aWR0aEhpbnQ9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg3MCk7Ci0JCWZPcmRlcmVkVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbHVtbkxheW91dHM9IG5ldyBDb2x1bW5MYXlvdXREYXRhW10gewotCQkJbmV3IENvbHVtbldlaWdodERhdGEoMSksCi0JCQluZXcgQ29sdW1uV2VpZ2h0RGF0YSgxKX07Ci0JCXRhYmxlbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWZPcmRlcmVkVGFibGUuc2V0TGF5b3V0KHRhYmxlbGF5b3V0KTsKLQkJZm9yIChpbnQgaT0wOyBpPDI7IGkrKykKLQkJCXRhYmxlbGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uTGF5b3V0c1tpXSk7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmT3JkZXJlZFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLmJvdHRvbVRhYmxlQ29sdW1uMSIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZk9yZGVyZWRUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5ib3R0b21UYWJsZUNvbHVtbjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJYnV0dG9ucz0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlmTmV3T3JkZXJlZEJ1dHRvbj0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWZOZXdPcmRlcmVkQnV0dG9uLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoZk5ld09yZGVyZWRCdXR0b24pKTsKLQkJZk5ld09yZGVyZWRCdXR0b24uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS5ib3R0b21OZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5ld09yZGVyZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkT3JkZXJlZChmTmV3T3JkZXJlZEJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZkVkaXRPcmRlcmVkQnV0dG9uPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJZkVkaXRPcmRlcmVkQnV0dG9uLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoZkVkaXRPcmRlcmVkQnV0dG9uKSk7Ci0JCWZFZGl0T3JkZXJlZEJ1dHRvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTENvbXBhcmVQcmVmZXJlbmNlLmJvdHRvbUVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZkVkaXRPcmRlcmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVkaXRPcmRlcmVkKGZFZGl0T3JkZXJlZEJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlJlbW92ZU9yZGVyZWRCdXR0b249IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlmUmVtb3ZlT3JkZXJlZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdldEJ1dHRvbkdyaWREYXRhKGZSZW1vdmVPcmRlcmVkQnV0dG9uKSk7Ci0JCWZSZW1vdmVPcmRlcmVkQnV0dG9uLnNldFRleHQoWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZVByZWZlcmVuY2UuYm90dG9tUmVtb3ZlIikpOyAvLyROT04tTkxTLTEkCi0JCWZSZW1vdmVPcmRlcmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZU9yZGVyZWQoZlJlbW92ZU9yZGVyZWRCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZVNwYWNlcihidXR0b25zKTsKLQotCi0KLQkJZklkTWFwc1RhYmxlLnNldFNlbGVjdGlvbigwKTsKLQkJZklkTWFwc1RhYmxlLnNldEZvY3VzKCk7Ci0JCXNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIHNwYWNlcj0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWRhdGEuaGVpZ2h0SGludD0gNDsJCQotCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2V0QnV0dG9uR3JpZERhdGEoQnV0dG9uIGJ1dHRvbikgewotCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQ9IFNXVFV0aWwuZ2V0QnV0dG9uV2lkdGhIaW50KGJ1dHRvbik7Ci0JCS8vZGF0YS5oZWlnaHRIaW50PSBTV1RVdGlsLmdldEJ1dHRvbkhlaWd0aEhpbnQoYnV0dG9uKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJZE1hcChTaGVsbCBzaGVsbCkgewotCQlJZE1hcCBpZG1hcCA9IG5ldyBJZE1hcChmYWxzZSk7Ci0JCVhNTENvbXBhcmVBZGRJZE1hcERpYWxvZyBkaWFsb2c9IG5ldyBYTUxDb21wYXJlQWRkSWRNYXBEaWFsb2coc2hlbGwsaWRtYXAsZklkTWFwcyxmSWRNYXBzSW50ZXJuYWwsZklkRXh0ZW5zaW9uVG9OYW1lLGZhbHNlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlpZiAoIWZJZE1hcHMuY29udGFpbnNLZXkoaWRtYXAuZ2V0TmFtZSgpKSkgewotCQkJCWZJZE1hcHMucHV0KGlkbWFwLmdldE5hbWUoKSxuZXcgSGFzaE1hcCgpKTsKLQkJCQlpZiAoIWlkbWFwLmdldEV4dGVuc2lvbigpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZklkRXh0ZW5zaW9uVG9OYW1lLnB1dChpZG1hcC5nZXRFeHRlbnNpb24oKSxpZG1hcC5nZXROYW1lKCkpOwotCQkJCW5ld0lkTWFwc1RhYmxlSXRlbShpZG1hcCx0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW5hbWVJZE1hcChTaGVsbCBzaGVsbCkgewotCQlUYWJsZUl0ZW1bXSBpdGVtc0lkTWFwcyA9IGZJZE1hcHNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW1zSWRNYXBzLmxlbmd0aCA+IDApIHsKLQkJCUlkTWFwIGlkbWFwID0gKElkTWFwKSBpdGVtc0lkTWFwc1swXS5nZXREYXRhKCk7Ci0JCQlTdHJpbmcgb2xkX25hbWUgPSBpZG1hcC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgb2xkX2V4dGVuc2lvbj0gaWRtYXAuZ2V0RXh0ZW5zaW9uKCk7Ci0JCQlIYXNoTWFwIGlkbWFwSFMgPSAoSGFzaE1hcCkgZklkTWFwcy5nZXQob2xkX25hbWUpOwotCQkJWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nIGRpYWxvZz0gbmV3IFhNTENvbXBhcmVBZGRJZE1hcERpYWxvZyhzaGVsbCxpZG1hcCxmSWRNYXBzLGZJZE1hcHNJbnRlcm5hbCxmSWRFeHRlbnNpb25Ub05hbWUsdHJ1ZSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlmSWRNYXBzLnJlbW92ZShvbGRfbmFtZSk7Ci0JCQkJZklkRXh0ZW5zaW9uVG9OYW1lLnJlbW92ZShvbGRfZXh0ZW5zaW9uKTsKLQkJCQlmSWRNYXBzLnB1dChpZG1hcC5nZXROYW1lKCksaWRtYXBIUyk7Ci0JCQkJaWYgKCFpZG1hcC5nZXRFeHRlbnNpb24oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWZJZEV4dGVuc2lvblRvTmFtZS5wdXQoaWRtYXAuZ2V0RXh0ZW5zaW9uKCksaWRtYXAuZ2V0TmFtZSgpKTsKLQkJCQlmSWRNYXBzVGFibGUucmVtb3ZlKGZJZE1hcHNUYWJsZS5pbmRleE9mKGl0ZW1zSWRNYXBzWzBdKSk7Ci0JCQkJbmV3SWRNYXBzVGFibGVJdGVtKGlkbWFwLHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUlkTWFwKFNoZWxsIHNoZWxsKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zSWRNYXAgPSBmSWRNYXBzVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtc0lkTWFwLmxlbmd0aCA+IDApIHsKLS8vCQkJZklkTWFwcy5yZW1vdmUoaXRlbXNJZE1hcFswXS5nZXRUZXh0KCkpOwotCQkJU3RyaW5nIElkTWFwTmFtZT0gKChJZE1hcClpdGVtc0lkTWFwWzBdLmdldERhdGEoKSkuZ2V0TmFtZSgpOwotCQkJZklkTWFwcy5yZW1vdmUoIElkTWFwTmFtZSApOwotCQkJZk9yZGVyZWRFbGVtZW50cy5yZW1vdmUoIElkTWFwTmFtZSApOwotCQkJLy9BbGwgdGhlIGNvcnJlc3BvbmRpbmcgSUQgTWFwcGluZ3MgbXVzdCBiZSByZW1vdmVkIGFzIHdlbGwKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zTWFwcGluZ3MgPSBmTWFwcGluZ3NUYWJsZS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zTWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc01hcHBpbmdzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vQWxsIHRoZSBjb3JyZXNwb25kaW5nIE9yZGVyZWQgZW50cmllcyBtdXN0IGJlIHJlbW92ZWQgYXMgd2VsbAotCQkJVGFibGVJdGVtW10gaXRlbXNPcmRlcmVkPSBmT3JkZXJlZFRhYmxlLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgaXRlbXNPcmRlcmVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNPcmRlcmVkW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vUmVtb3ZlIGV4dGVuc2lvbgotCQkJaWYgKCFpdGVtc0lkTWFwWzBdLmdldFRleHQoMikuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZklkRXh0ZW5zaW9uVG9OYW1lLnJlbW92ZShpdGVtc0lkTWFwWzBdLmdldFRleHQoMikpOwotCQkJfQotCQkJaXRlbXNJZE1hcFswXS5kaXNwb3NlKCk7ICAvL1RhYmxlIGlzIHNpbmdsZSBzZWxlY3Rpb24KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdElkTWFwKFNoZWxsIHNoZWxsKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gZklkTWFwc1RhYmxlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJSWRNYXAgaWRtYXAgPSAoSWRNYXApIGl0ZW1zWzBdLmdldERhdGEoKTsKLQkJCVhNTENvbXBhcmVFZGl0Q29weUlkTWFwRGlhbG9nIGRpYWxvZz0gbmV3IFhNTENvbXBhcmVFZGl0Q29weUlkTWFwRGlhbG9nKHNoZWxsLGlkbWFwLGZJZE1hcHMsZklkTWFwc0ludGVybmFsKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCVN0cmluZyBuZXdfaWRtYXBOYW1lID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJCWlmICghZklkTWFwcy5jb250YWluc0tleShuZXdfaWRtYXBOYW1lKSkgewotCQkJCQkvL2NvcHkgb3ZlciBpZCBtYXBwaW5ncwotCQkJCQlWZWN0b3IgbmV3TWFwcGluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCUlkTWFwIG5ld0lkTWFwID0gbmV3IElkTWFwKG5ld19pZG1hcE5hbWUsIGZhbHNlLCBuZXdNYXBwaW5ncyk7Ci0JCQkJCUhhc2hNYXAgbmV3SWRtYXBITSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZJZE1hcHMucHV0KG5ld0lkTWFwLmdldE5hbWUoKSxuZXdJZG1hcEhNKTsKLQkJCQkJVmVjdG9yIE1hcHBpbmdzID0gaWRtYXAuZ2V0TWFwcGluZ3MoKTsKLQkJCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbj0gTWFwcGluZ3MuZWxlbWVudHMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCQkJTWFwcGluZyBtYXBwaW5nID0gKE1hcHBpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQkJCQlNYXBwaW5nIG5ld01hcHBpbmcgPSBuZXcgTWFwcGluZyhtYXBwaW5nLmdldEVsZW1lbnQoKSwgbWFwcGluZy5nZXRTaWduYXR1cmUoKSwgbWFwcGluZy5nZXRJZEF0dHJpYnV0ZSgpKTsKLQkJCQkJCW5ld01hcHBpbmdzLmFkZChuZXdNYXBwaW5nKTsKLQkJCQkJCW5ld0lkbWFwSE0ucHV0KG5ld01hcHBpbmcuZ2V0S2V5KCksIG5ld01hcHBpbmcuZ2V0SWRBdHRyaWJ1dGUoKSk7Ci0JCQkJCX0KLQkJCQkJLy9jb3B5IG92ZXIgb3JkZXJlZCBlbnRyaWVzCi0JCQkJCUFycmF5TGlzdCBvcmRlcmVkQUw9IGlkbWFwLmdldE9yZGVyZWQoKTsKLQkJCQkJaWYgKG9yZGVyZWRBTCAhPSBudWxsICYmIG9yZGVyZWRBTC5zaXplKCkgPiAwKSB7Ci0JCQkJCQlBcnJheUxpc3QgbmV3T3JkZXJlZEFMPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQluZXdJZE1hcC5zZXRPcmRlcmVkKG5ld09yZGVyZWRBTCk7Ci0JCQkJCQlBcnJheUxpc3QgaWRtYXBPcmRlcmVkPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmT3JkZXJlZEVsZW1lbnRzLnB1dChuZXdJZE1hcC5nZXROYW1lKCksaWRtYXBPcmRlcmVkKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcj0gb3JkZXJlZEFMLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU1hcHBpbmcgb3JkZXJlZD0gKE1hcHBpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCU1hcHBpbmcgbmV3T3JkZXJlZD0gbmV3IE1hcHBpbmcob3JkZXJlZC5nZXRFbGVtZW50KCksIG9yZGVyZWQuZ2V0U2lnbmF0dXJlKCkpOwotCQkJCQkJCW5ld09yZGVyZWRBTC5hZGQobmV3T3JkZXJlZCk7Ci0JCQkJCQkJaWRtYXBPcmRlcmVkLmFkZChuZXdPcmRlcmVkLmdldEtleSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJbmV3SWRNYXBzVGFibGVJdGVtKG5ld0lkTWFwLHRydWUpOwotCQkJCQlzZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU2hlbGwgc2hlbGwpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBmSWRNYXBzVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtcy5sZW5ndGggPiAwKSB7Ci0JCQlJZE1hcCBpZG1hcCA9IChJZE1hcCkgaXRlbXNbMF0uZ2V0RGF0YSgpOwotCQkJTWFwcGluZyBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTsKLQkJCUhhc2hNYXAgaWRtYXBITSA9IChIYXNoTWFwKSBmSWRNYXBzLmdldChpZG1hcC5nZXROYW1lKCkpOwotCQkJWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nIGRpYWxvZz0gbmV3IFhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZyhzaGVsbCxtYXBwaW5nLGlkbWFwSE0sZmFsc2UpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGlkbWFwSE1LZXkgPSBtYXBwaW5nLmdldEtleSgpOwotCQkJCWlmIChpZG1hcEhNID09IG51bGwpCi0JCQkJCWlkbWFwSE09IG5ldyBIYXNoTWFwKCk7Ci0JCQkJaWYgKCFpZG1hcEhNLmNvbnRhaW5zS2V5KGlkbWFwSE1LZXkpKSB7Ci0JCQkJCWlkbWFwSE0ucHV0KGlkbWFwSE1LZXksIG1hcHBpbmcuZ2V0SWRBdHRyaWJ1dGUoKSk7Ci0JCQkJCW5ld01hcHBpbmdzVGFibGVJdGVtKG1hcHBpbmcsIHRydWUpOwotCQkJCQlWZWN0b3IgbWFwcGluZ3MgPSBpZG1hcC5nZXRNYXBwaW5ncygpOwotCQkJCQltYXBwaW5ncy5hZGQobWFwcGluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRNYXBwaW5nKFNoZWxsIHNoZWxsKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zSWRNYXBzID0gZklkTWFwc1RhYmxlLmdldFNlbGVjdGlvbigpOwkJCi0JCVRhYmxlSXRlbVtdIGl0ZW1zTWFwcGluZ3MgPSBmTWFwcGluZ3NUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW1zTWFwcGluZ3MubGVuZ3RoID4gMCkgewotCQkJSWRNYXAgaWRtYXAgPSAoSWRNYXApIGl0ZW1zSWRNYXBzWzBdLmdldERhdGEoKTsKLQkJCUhhc2hNYXAgaWRtYXBITSA9IChIYXNoTWFwKSBmSWRNYXBzLmdldChpZG1hcC5nZXROYW1lKCkpOwotCQkJTWFwcGluZyBtYXBwaW5nID0gKE1hcHBpbmcpaXRlbXNNYXBwaW5nc1swXS5nZXREYXRhKCk7Ci0JCQlTdHJpbmcgaWRtYXBITUtleSA9IG1hcHBpbmcuZ2V0S2V5KCk7Ci0JCQlpZG1hcEhNLnJlbW92ZShpZG1hcEhNS2V5KTsKLQkJCVhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZyBkaWFsb2c9IG5ldyBYTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2coc2hlbGwsbWFwcGluZyxudWxsLHRydWUpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJaWRtYXBITUtleSA9IG1hcHBpbmcuZ2V0S2V5KCk7Ci0JCQkJaWRtYXBITS5wdXQoaWRtYXBITUtleSwgbWFwcGluZy5nZXRJZEF0dHJpYnV0ZSgpKTsKLQkJCQlmTWFwcGluZ3NUYWJsZS5yZW1vdmUoZk1hcHBpbmdzVGFibGUuaW5kZXhPZihpdGVtc01hcHBpbmdzWzBdKSk7Ci0JCQkJbmV3TWFwcGluZ3NUYWJsZUl0ZW0obWFwcGluZywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFwcGluZyhTaGVsbCBzaGVsbCkgewotCQlUYWJsZUl0ZW1bXSBpdGVtc0lkTWFwcyA9IGZJZE1hcHNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJVGFibGVJdGVtW10gaXRlbXNNYXBwaW5ncyA9IGZNYXBwaW5nc1RhYmxlLmdldFNlbGVjdGlvbigpOwotCQkKLQkJaWYgKGl0ZW1zTWFwcGluZ3MubGVuZ3RoID4gMCAmJiBpdGVtc0lkTWFwcy5sZW5ndGggPiAwKSB7Ci0JCQlNYXBwaW5nIG1hcHBpbmcgPSAoTWFwcGluZylpdGVtc01hcHBpbmdzWzBdLmdldERhdGEoKTsKLQkJCUlkTWFwIGlkbWFwID0gKElkTWFwKSBpdGVtc0lkTWFwc1swXS5nZXREYXRhKCk7Ci0JCQlIYXNoTWFwIGlkbWFwSFMgPSAoSGFzaE1hcCkgZklkTWFwcy5nZXQoIGlkbWFwLmdldE5hbWUoKSApOwotCQkJaWRtYXBIUy5yZW1vdmUobWFwcGluZy5nZXRLZXkoKSk7Ci0JCQlWZWN0b3IgbWFwcGluZ3M9IGlkbWFwLmdldE1hcHBpbmdzKCk7Ci0JCQltYXBwaW5ncy5yZW1vdmUobWFwcGluZyk7Ci0JCQlpdGVtc01hcHBpbmdzWzBdLmRpc3Bvc2UoKTsgIC8vVGFibGUgaXMgc2luZ2xlIHNlbGVjdGlvbgotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE9yZGVyZWQoU2hlbGwgc2hlbGwpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBmSWRNYXBzVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtcy5sZW5ndGggPiAwKSB7Ci0vLwkJCVNldCBvcmRlcmVkU2V0PSBmT3JkZXJlZEVsZW1lbnRzLmtleVNldCgpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IG9yZGVyZWRTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotLy8JCQkJU3RyaW5nIElkTWFwTmFtZT0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0vLwkJCQlBcnJheUxpc3Qgb3JkZXJlZD0gKEFycmF5TGlzdCkgZk9yZGVyZWRFbGVtZW50cy5nZXQoSWRNYXBOYW1lKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlcjI9IG9yZGVyZWQuaXRlcmF0b3IoKTsgaXRlcjIuaGFzTmV4dCgpOyApIHsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSWRNYXBOYW1lICsgIjogIiArIGl0ZXIyLm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJfQotCQkJSWRNYXAgaWRtYXAgPSAoSWRNYXApIGl0ZW1zWzBdLmdldERhdGEoKTsKLQkJCU1hcHBpbmcgbWFwcGluZyA9IG5ldyBNYXBwaW5nKCk7Ci0JCQlBcnJheUxpc3QgaWRtYXBBTD0gKEFycmF5TGlzdCkgZk9yZGVyZWRFbGVtZW50cy5nZXQoaWRtYXAuZ2V0TmFtZSgpKTsKLQkJCWlmIChpZG1hcEFMID09IG51bGwpCi0JCQkJaWRtYXBBTD0gbmV3IEFycmF5TGlzdCgpOwotCQkJWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nIGRpYWxvZz0gbmV3IFhNTENvbXBhcmVFZGl0T3JkZXJlZERpYWxvZyhzaGVsbCxtYXBwaW5nLGlkbWFwQUwsZmFsc2UpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGlkbWFwQUxLZXkgPSBtYXBwaW5nLmdldEtleSgpOwotCQkJCWlmICghaWRtYXBBTC5jb250YWlucyhpZG1hcEFMS2V5KSkgewotCQkJCQlpZG1hcEFMLmFkZChpZG1hcEFMS2V5KTsKLQkJCQkJbmV3T3JkZXJlZFRhYmxlSXRlbShtYXBwaW5nLCB0cnVlKTsKLQkJCQkJQXJyYXlMaXN0IG9yZGVyZWQ9IGlkbWFwLmdldE9yZGVyZWQoKTsKLQkJCQkJaWYgKG9yZGVyZWQgPT0gbnVsbCkgewotCQkJCQkJb3JkZXJlZD0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJb3JkZXJlZC5hZGQobWFwcGluZyk7Ci0JCQkJCQlpZG1hcC5zZXRPcmRlcmVkKG9yZGVyZWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3JkZXJlZC5hZGQobWFwcGluZyk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFmT3JkZXJlZEVsZW1lbnRzLmNvbnRhaW5zS2V5KGlkbWFwLmdldE5hbWUoKSkpCi0JCQkJCQlmT3JkZXJlZEVsZW1lbnRzLnB1dChpZG1hcC5nZXROYW1lKCksIGlkbWFwQUwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdE9yZGVyZWQoU2hlbGwgc2hlbGwpIHsKLQkJVGFibGVJdGVtW10gaXRlbXNJZE1hcHMgPSBmSWRNYXBzVGFibGUuZ2V0U2VsZWN0aW9uKCk7CQkKLQkJVGFibGVJdGVtW10gaXRlbXNPcmRlcmVkID0gZk9yZGVyZWRUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW1zT3JkZXJlZC5sZW5ndGggPiAwKSB7Ci0JCQlJZE1hcCBpZG1hcCA9IChJZE1hcCkgaXRlbXNJZE1hcHNbMF0uZ2V0RGF0YSgpOwotCQkJQXJyYXlMaXN0IGlkbWFwQUwgPSAoQXJyYXlMaXN0KSBmT3JkZXJlZEVsZW1lbnRzLmdldChpZG1hcC5nZXROYW1lKCkpOwotCQkJTWFwcGluZyBtYXBwaW5nID0gKE1hcHBpbmcpaXRlbXNPcmRlcmVkWzBdLmdldERhdGEoKTsKLQkJCVN0cmluZyBpZG1hcEFMS2V5ID0gbWFwcGluZy5nZXRLZXkoKTsKLQkJCWlkbWFwQUwucmVtb3ZlKGlkbWFwQUxLZXkpOwotCQkJWE1MQ29tcGFyZUVkaXRPcmRlcmVkRGlhbG9nIGRpYWxvZz0gbmV3IFhNTENvbXBhcmVFZGl0T3JkZXJlZERpYWxvZyhzaGVsbCxtYXBwaW5nLG51bGwsdHJ1ZSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlpZG1hcEFMS2V5ID0gbWFwcGluZy5nZXRLZXkoKTsKLQkJCQlpZG1hcEFMLmFkZChpZG1hcEFMS2V5KTsKLQkJCQlmT3JkZXJlZFRhYmxlLnJlbW92ZShmT3JkZXJlZFRhYmxlLmluZGV4T2YoaXRlbXNPcmRlcmVkWzBdKSk7Ci0JCQkJbmV3T3JkZXJlZFRhYmxlSXRlbShtYXBwaW5nLCB0cnVlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU9yZGVyZWQoU2hlbGwgc2hlbGwpIHsKLQkJVGFibGVJdGVtW10gaXRlbXNJZE1hcHMgPSBmSWRNYXBzVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zT3JkZXJlZCA9IGZPcmRlcmVkVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtc09yZGVyZWQubGVuZ3RoID4gMCAmJiBpdGVtc0lkTWFwcy5sZW5ndGggPiAwKSB7Ci0JCQlNYXBwaW5nIG1hcHBpbmcgPSAoTWFwcGluZylpdGVtc09yZGVyZWRbMF0uZ2V0RGF0YSgpOwotCQkJSWRNYXAgaWRtYXAgPSAoSWRNYXApIGl0ZW1zSWRNYXBzWzBdLmdldERhdGEoKTsKLQkJCUFycmF5TGlzdCBpZG1hcEFMID0gKEFycmF5TGlzdCkgZk9yZGVyZWRFbGVtZW50cy5nZXQoIGlkbWFwLmdldE5hbWUoKSApOwotCQkJaWRtYXBBTC5yZW1vdmUobWFwcGluZy5nZXRLZXkoKSk7Ci0JCQlpZiAoaWRtYXBBTC5zaXplKCkgPD0gMCkKLQkJCQlmT3JkZXJlZEVsZW1lbnRzLnJlbW92ZShpZG1hcC5nZXROYW1lKCkpOwotCQkJQXJyYXlMaXN0IG9yZGVyZWQ9IGlkbWFwLmdldE9yZGVyZWQoKTsKLQkJCW9yZGVyZWQucmVtb3ZlKG1hcHBpbmcpOwotCQkJaWYgKG9yZGVyZWQuc2l6ZSgpIDw9IDApCi0JCQkJaWRtYXAuc2V0T3JkZXJlZChudWxsKTsKLQkJCWl0ZW1zT3JkZXJlZFswXS5kaXNwb3NlKCk7ICAvL1RhYmxlIGlzIHNpbmdsZSBzZWxlY3Rpb24KLQkJfQkJCi0JfQotCi0JcHJvdGVjdGVkIFRhYmxlSXRlbSBuZXdJZE1hcHNUYWJsZUl0ZW0oSWRNYXAgaWRtYXAsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJLy9maW5kIGluZGV4IHdoZXJlIHRvIGluc2VydCB0YWJsZSBlbnRyeQotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZJZE1hcHNUYWJsZS5nZXRJdGVtcygpOwotCQlpbnQgaT0gMDsKLQkJd2hpbGUgKGk8aXRlbXMubGVuZ3RoICYmIGlkbWFwLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKGl0ZW1zW2ldLmdldFRleHQoMCkpID4gMCkKLQkJCWkrKzsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGZJZE1hcHNUYWJsZSwgU1dULk5VTEwsIGkpOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10ge2lkbWFwLmdldE5hbWUoKSwgKGlkbWFwLmlzSW50ZXJuYWwoKSk/WE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MQ29tcGFyZVByZWZlcmVuY2UudG9wVGFibGVDb2x1bW4yaW50ZXJuYWwiKTpYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxDb21wYXJlUHJlZmVyZW5jZS50b3BUYWJsZUNvbHVtbjJ1c2VyIiksaWRtYXAuZ2V0RXh0ZW5zaW9uKCl9OyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJaXRlbS5zZXRUZXh0KHZhbHVlcyk7Ci0JCWl0ZW0uc2V0RGF0YShpZG1hcCk7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJZklkTWFwc1RhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCWZJZE1hcHNUYWJsZS5zZXRGb2N1cygpOwotCQkJc2VsZWN0aW9uQ2hhbmdlZCgpOwotCQl9Ci0JCXJldHVybiBpdGVtOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGVJdGVtIG5ld01hcHBpbmdzVGFibGVJdGVtKE1hcHBpbmcgbWFwcGluZywgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZNYXBwaW5nc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCWludCBpPSAwOwotCQl3aGlsZSAoaTxpdGVtcy5sZW5ndGggJiYgbWFwcGluZy5nZXRFbGVtZW50KCkuY29tcGFyZVRvSWdub3JlQ2FzZShpdGVtc1tpXS5nZXRUZXh0KDApKSA+IDApCi0JCQlpKys7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShmTWFwcGluZ3NUYWJsZSwgU1dULk5VTEwsIGkpOwotCQlTdHJpbmcgaWR0ZXh0ID0gbWFwcGluZy5nZXRJZEF0dHJpYnV0ZSgpOwotCQlTdHJpbmcgaWR0eXBlOwotCQlpZiAoaWR0ZXh0LmNoYXJBdCgwKT09WE1MU3RydWN0dXJlQ3JlYXRvci5JRF9UWVBFX0JPRFkpIHsKLQkJCWlkdGV4dCA9IGlkdGV4dC5zdWJzdHJpbmcoMSxpZHRleHQubGVuZ3RoKCkpOwotCQkJaWR0eXBlID0gSURUWVBFX0NISUxEQk9EWTsKLQkJfSBlbHNlCi0JCQlpZHR5cGUgPSBJRFRZUEVfQVRUUklCVVRFOwotCQkKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHttYXBwaW5nLmdldEVsZW1lbnQoKSwgbWFwcGluZy5nZXRTaWduYXR1cmUoKSwgaWR0ZXh0LCBpZHR5cGV9OwotCQlpdGVtLnNldFRleHQodmFsdWVzKTsKLQkJaXRlbS5zZXREYXRhKG1hcHBpbmcpOwotCQlpZiAoc2VsZWN0ZWQpCi0JCQlmTWFwcGluZ3NUYWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0JCi0JCXJldHVybiBpdGVtOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZUl0ZW0gbmV3T3JkZXJlZFRhYmxlSXRlbShNYXBwaW5nIG1hcHBpbmcsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBmT3JkZXJlZFRhYmxlLmdldEl0ZW1zKCk7Ci0JCWludCBpPSAwOwotCQl3aGlsZSAoaTxpdGVtcy5sZW5ndGggJiYgbWFwcGluZy5nZXRFbGVtZW50KCkuY29tcGFyZVRvSWdub3JlQ2FzZShpdGVtc1tpXS5nZXRUZXh0KDApKSA+IDApCi0JCQlpKys7Ci0KLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGZPcmRlcmVkVGFibGUsIFNXVC5OVUxMLCBpKTsKLQkJCi0JCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXRFbGVtZW50KCksIG1hcHBpbmcuZ2V0U2lnbmF0dXJlKCl9OwotCQlpdGVtLnNldFRleHQodmFsdWVzKTsKLQkJaXRlbS5zZXREYXRhKG1hcHBpbmcpOwotCQlpZiAoc2VsZWN0ZWQpCi0JCQlmT3JkZXJlZFRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbElkTWFwc1RhYmxlKCkgewotCQkvL2ZpbGwgdXNlciBpZG1hcHMgZnJvbSBwbHVnaW4ueG1sCi0JCWZpbGxJZE1hcHModHJ1ZSk7Ci0JCQotCQkvL2ZpbGwgdXNlciBpZG1hcHMgZnJvbSBQcmVmZXJlbmNlIFN0b3JlCi0JCWZpbGxJZE1hcHMoZmFsc2UpOwotCQkJCQotCQkvL2FkZCB1c2VyIGlkbWFwcyB0aGF0IGhhdmUgb3JkZXJlZCBlbnRyaWVzIGJ1dCBubyBpZCBtYXBwaW5ncwotCQkvL3RoZXkgZG8gbm90IGFwcGVhciBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSB3aXRoIG5hbWUgSURNQVBfUFJFRkVSRU5DRV9OQU1FCi0JCVNldCBPcmRlcmVkS2V5cz0gZk9yZGVyZWRFbGVtZW50cy5rZXlTZXQoKTsKLQkJU2V0IElkTWFwS2V5cz0gZklkTWFwcy5rZXlTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyX29yZGVyZWRFbGVtZW50cz0gT3JkZXJlZEtleXMuaXRlcmF0b3IoKTsgaXRlcl9vcmRlcmVkRWxlbWVudHMuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIElkTWFwTmFtZT0gKFN0cmluZykgaXRlcl9vcmRlcmVkRWxlbWVudHMubmV4dCgpOwotCQkJaWYgKCFJZE1hcEtleXMuY29udGFpbnMoSWRNYXBOYW1lKSkgewotCQkJCUlkTWFwIGlkbWFwPSBuZXcgSWRNYXAoSWRNYXBOYW1lLCBmYWxzZSk7Ci0JCQkJQXJyYXlMaXN0IGlkbWFwT3JkZXJlZD0gKEFycmF5TGlzdCkgZk9yZGVyZWRFbGVtZW50cy5nZXQoSWRNYXBOYW1lKTsKLQkJCQlzZXRPcmRlcmVkKGlkbWFwLCBpZG1hcE9yZGVyZWQpOwotCQkJCW5ld0lkTWFwc1RhYmxlSXRlbShpZG1hcCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxJZE1hcHMoYm9vbGVhbiBpbnRlcm5hbCkgewotCQlIYXNoTWFwIElkTWFwcz0gKGludGVybmFsKT9mSWRNYXBzSW50ZXJuYWw6ZklkTWFwczsKLQkJSGFzaE1hcCBPcmRlcmVkRWxlbWVudHM9IChpbnRlcm5hbCk/Zk9yZGVyZWRFbGVtZW50c0ludGVybmFsOmZPcmRlcmVkRWxlbWVudHM7Ci0JCVNldCBJZE1hcEtleXMgPSBJZE1hcHMua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcl9pbnRlcm5hbCA9IElkTWFwS2V5cy5pdGVyYXRvcigpOyBpdGVyX2ludGVybmFsLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgSWRNYXBOYW1lID0gKFN0cmluZykgaXRlcl9pbnRlcm5hbC5uZXh0KCk7Ci0JCQlWZWN0b3IgTWFwcGluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0JCQlJZE1hcCBpZG1hcCA9IG5ldyBJZE1hcChJZE1hcE5hbWUsIGludGVybmFsLCBNYXBwaW5ncyk7Ci0JCQkvL2NyZWF0ZSBtYXBwaW5ncyBvZiBpbnRlcm5hbCBpZG1hcHMKLQkJCUhhc2hNYXAgaWRtYXBITSA9IChIYXNoTWFwKSBJZE1hcHMuZ2V0KElkTWFwTmFtZSk7Ci0JCQlTZXQgaWRtYXBLZXlzID0gaWRtYXBITS5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcl9pZG1hcCA9IGlkbWFwS2V5cy5pdGVyYXRvcigpOyBpdGVyX2lkbWFwLmhhc05leHQoKTsgKSB7Ci0JCQkJTWFwcGluZyBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gKFN0cmluZykgaXRlcl9pZG1hcC5uZXh0KCk7Ci0JCQkJaW50IGVuZF9vZl9zaWduYXR1cmUgPSBzaWduYXR1cmUubGFzdEluZGV4T2YoU0lHTl9TRVBBUkFUT1Isc2lnbmF0dXJlLmxlbmd0aCgpLTIpOwotCQkJCWlmIChlbmRfb2Zfc2lnbmF0dXJlIDwgWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lELmxlbmd0aCgpICsgMSkKLQkJCQkJbWFwcGluZy5zZXRTaWduYXR1cmUoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQltYXBwaW5nLnNldFNpZ25hdHVyZShzaWduYXR1cmUuc3Vic3RyaW5nKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRC5sZW5ndGgoKSArIDEsZW5kX29mX3NpZ25hdHVyZSkpOwotCQkJCW1hcHBpbmcuc2V0RWxlbWVudChzaWduYXR1cmUuc3Vic3RyaW5nKGVuZF9vZl9zaWduYXR1cmUrMSxzaWduYXR1cmUubGVuZ3RoKCktMSkpOwotCQkJCW1hcHBpbmcuc2V0SWRBdHRyaWJ1dGUoKFN0cmluZylpZG1hcEhNLmdldChzaWduYXR1cmUpKTsKLQkJCQlNYXBwaW5ncy5hZGQobWFwcGluZyk7Ci0JCQl9Ci0JCQkvL2NyZWF0ZSBvcmRlcmVkIG1hcHBpbmdzCi0JCQlBcnJheUxpc3QgaWRtYXBPcmRlcmVkPSAoQXJyYXlMaXN0KSBPcmRlcmVkRWxlbWVudHMuZ2V0KElkTWFwTmFtZSk7Ci0JCQlpZiAoaWRtYXBPcmRlcmVkICE9IG51bGwpIHsKLQkJCQlzZXRPcmRlcmVkKGlkbWFwLCBpZG1hcE9yZGVyZWQpOwotCQkJfQotCQkJLy9zZXQgZXh0ZW5zaW9uCi0JCQlpZiAoZklkRXh0ZW5zaW9uVG9OYW1lLmNvbnRhaW5zVmFsdWUoSWRNYXBOYW1lKSkgewotCQkJCVNldCBrZXlTZXQ9IGZJZEV4dGVuc2lvblRvTmFtZS5rZXlTZXQoKTsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uPSBuZXcgU3RyaW5nKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyPSBrZXlTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCQlleHRlbnNpb249IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCWlmICggKChTdHJpbmcpZklkRXh0ZW5zaW9uVG9OYW1lLmdldChleHRlbnNpb24pKS5lcXVhbHMoSWRNYXBOYW1lKSApCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWRtYXAuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCQluZXdJZE1hcHNUYWJsZUl0ZW0oaWRtYXAsIGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRPcmRlcmVkKElkTWFwIGlkbWFwLCBBcnJheUxpc3QgaWRtYXBPcmRlcmVkKSB7Ci0JCUFycmF5TGlzdCBPcmRlcmVkPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcl9vcmRlcmVkPSBpZG1hcE9yZGVyZWQuaXRlcmF0b3IoKTsgaXRlcl9vcmRlcmVkLmhhc05leHQoKTspIHsKLQkJCU1hcHBpbmcgbWFwcGluZz0gbmV3IE1hcHBpbmcoKTsKLQkJCVN0cmluZyBzaWduYXR1cmU9IChTdHJpbmcpIGl0ZXJfb3JkZXJlZC5uZXh0KCk7Ci0JCQlpbnQgZW5kX29mX3NpZ25hdHVyZSA9IHNpZ25hdHVyZS5sYXN0SW5kZXhPZihTSUdOX1NFUEFSQVRPUixzaWduYXR1cmUubGVuZ3RoKCktMik7Ci0JCQlpZiAoZW5kX29mX3NpZ25hdHVyZSA8IFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRC5sZW5ndGgoKSArIDEpCi0JCQkJbWFwcGluZy5zZXRTaWduYXR1cmUoIiIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJbWFwcGluZy5zZXRTaWduYXR1cmUoc2lnbmF0dXJlLnN1YnN0cmluZyhYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQubGVuZ3RoKCkgKyAxLGVuZF9vZl9zaWduYXR1cmUpKTsKLQkJCW1hcHBpbmcuc2V0RWxlbWVudChzaWduYXR1cmUuc3Vic3RyaW5nKGVuZF9vZl9zaWduYXR1cmUrMSxzaWduYXR1cmUubGVuZ3RoKCktMSkpOwotCQkJT3JkZXJlZC5hZGQobWFwcGluZyk7Ci0JCX0JCQkJCi0JCWlkbWFwLnNldE9yZGVyZWQoT3JkZXJlZCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMKLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlYTUxQbHVnaW4gcGx1Z2luPSBYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlpZiAoIXBsdWdpbi5nZXRJZE1hcHMoKS5lcXVhbHMoZklkTWFwcykKLQkJCXx8ICFwbHVnaW4uZ2V0SWRFeHRlbnNpb25Ub05hbWUoKS5lcXVhbHMoZklkRXh0ZW5zaW9uVG9OYW1lKQotCQkJfHwgIXBsdWdpbi5nZXRPcmRlcmVkRWxlbWVudHMoKS5lcXVhbHMoZk9yZGVyZWRFbGVtZW50cykgKQotCQkJcGx1Z2luLnNldElkTWFwcyhmSWRNYXBzLGZJZEV4dGVuc2lvblRvTmFtZSxmT3JkZXJlZEVsZW1lbnRzLHRydWUpOwotCQkJLy9YTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldElkTWFwcyhmSWRNYXBzLGZJZEV4dGVuc2lvblRvTmFtZSxudWxsKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJZklkTWFwcyA9IChIYXNoTWFwKSBYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkTWFwcygpLmNsb25lKCk7Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gZklkTWFwc1RhYmxlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJLy9SZWZyZXNoIE1hcHBpbmdzIFRhYmxlCi0JCQlmTWFwcGluZ3NUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCVZlY3RvciBNYXBwaW5ncyA9ICgoSWRNYXApaXRlbXNbMF0uZ2V0RGF0YSgpKS5nZXRNYXBwaW5ncygpOwotCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IE1hcHBpbmdzLmVsZW1lbnRzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQluZXdNYXBwaW5nc1RhYmxlSXRlbSgoTWFwcGluZyllbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBmYWxzZSk7Ci0JCQl9Ci0JCQkvL1JlZnJlc2ggT3JkZXJlZCBUYWJsZQotCQkJZk9yZGVyZWRUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCUFycmF5TGlzdCBPcmRlcmVkPSAoKElkTWFwKWl0ZW1zWzBdLmdldERhdGEoKSkuZ2V0T3JkZXJlZCgpOwotCQkJaWYgKE9yZGVyZWQgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcl9vcmRlcmVkPSBPcmRlcmVkLml0ZXJhdG9yKCk7IGl0ZXJfb3JkZXJlZC5oYXNOZXh0KCk7KSB7Ci0JCQkJCW5ld09yZGVyZWRUYWJsZUl0ZW0oKE1hcHBpbmcpaXRlcl9vcmRlcmVkLm5leHQoKSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl1cGRhdGVFbmFibGVkU3RhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0ZSAoZW5hYmxlZCwgbm90IGVuYWJsZWQpIG9mIHRoZSBidXR0b25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZSgpIHsKLQkJVGFibGVJdGVtW10gaXRlbXNJZE1hcHMgPSBmSWRNYXBzVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtc0lkTWFwcy5sZW5ndGggPiAwKSB7Ci0JCQlJZE1hcCBpZG1hcCA9IChJZE1hcCkgaXRlbXNJZE1hcHNbMF0uZ2V0RGF0YSgpOwotCQkJaWYgKGlkbWFwLmlzSW50ZXJuYWwoKSkgewotCQkJCWZSZW5hbWVJZE1hcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmUmVtb3ZlSWRNYXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZkVkaXRJZE1hcEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQotCQkJCWZOZXdNYXBwaW5nc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmRWRpdE1hcHBpbmdzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWZSZW1vdmVNYXBwaW5nc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkKLQkJCQlmTmV3T3JkZXJlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmRWRpdE9yZGVyZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZlJlbW92ZU9yZGVyZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCWZSZW5hbWVJZE1hcEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZSZW1vdmVJZE1hcEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZFZGl0SWRNYXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCi0JCQkJZk5ld01hcHBpbmdzQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZkVkaXRNYXBwaW5nc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZSZW1vdmVNYXBwaW5nc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQotCQkJCWZOZXdPcmRlcmVkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZkVkaXRPcmRlcmVkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZlJlbW92ZU9yZGVyZWRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0ludmFsaWRDaGFyYWN0ZXJzKFN0cmluZyB0ZXh0KSB7Ci0JCWZvciAoaW50IGk9MDsgaTxpbnZhbGlkQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRleHQuaW5kZXhPZihpbnZhbGlkQ2hhcmFjdGVyc1tpXSkgPiAtMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTE5vZGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NTk4ODMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5Eb2N1bWVudFJhbmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogT2JqZWN0cyB0aGF0IG1ha2UgdXAgdGhlIHBhcnNlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxOb2RlIGV4dGVuZHMgRG9jdW1lbnRSYW5nZU5vZGUgaW1wbGVtZW50cyBJVHlwZWRFbGVtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmU2lnbmF0dXJlOwotCXByaXZhdGUgU3RyaW5nIGZPcmlnSWQ7Ci0JcHJpdmF0ZSBYTUxOb2RlIHBhcmVudDsKLQlwcml2YXRlIFN0cmluZyBmWE1MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVzZXNJRE1BUDsKLQlwcml2YXRlIGJvb2xlYW4gZk9yZGVyZWRDaGlsZDsKLQotCXB1YmxpYyBpbnQgYm9kaWVzOyAvLyBjb3VudHMgdGhlIG51bWJlciBvZiBib2RpZXMKLQotCXB1YmxpYyBYTUxOb2RlKFN0cmluZyBYTUxUeXBlLCBTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHNpZ25hdHVyZSwgSURvY3VtZW50IGRvYywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKDAsIGlkLCBkb2MsIHN0YXJ0LCBsZW5ndGgpOwotCQlmWE1MVHlwZT0gWE1MVHlwZTsKLQkJZlZhbHVlPSB2YWx1ZTsKLQkJZlNpZ25hdHVyZT0gc2lnbmF0dXJlOwotCQlmT3JpZ0lkPSBpZDsKLQkJaWYgKFhNTFN0cnVjdHVyZUNyZWF0b3IuREVCVUdfTU9ERSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlZCBYTUxOb2RlIHdpdGggWE1MVHlwZTogIiArIFhNTFR5cGUgKyAiLCBpZDogIiArIGlkICsgIiwgdmFsdWU6ICIgKyB2YWx1ZSArICIsIHNpZ25hdHVyZTogIiArIGZTaWduYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCi0JCWJvZGllcz0gMDsKLQkJZlVzZXNJRE1BUD0gZmFsc2U7Ci0JCWZPcmRlcmVkQ2hpbGQ9IGZhbHNlOwotCX0KLQotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZT0gdmFsdWU7Ci0JfQotCi0JU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHlwZWRFbGVtZW50I2dldE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChmTmFtZSAhPSBudWxsKQotCQkJcmV0dXJuIGZOYW1lOwotCQlyZXR1cm4gdGhpcy5nZXRJZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWU9IG5hbWU7Ci0JfQotCi0JLyoKLQkgKiBFdmVyeSB4bWwgbm9kZSBpcyBvZiB0eXBlICJ0eHQiIHNvIHRoYXQgdGhlIGJ1aWx0aW4gVGV4dE1lcmdlVmlld2VyIGlzIHVzZWQgYXV0b21hdGljYWxseS4KLQkgKiBAc2VlIElUeXBlZEVsZW1lbnQjZ2V0VHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICJ0eHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNPcmRlcmVkQ2hpbGQoYm9vbGVhbiBpc09yZGVyZWRDaGlsZCkgewotCQlmT3JkZXJlZENoaWxkPSBpc09yZGVyZWRDaGlsZDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElUeXBlZEVsZW1lbnQjZ2V0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChmT3JkZXJlZENoaWxkKQotCQkJcmV0dXJuIENvbXBhcmVVSS5nZXRJbWFnZShYTUxQbHVnaW4uSU1BR0VfVFlQRV9QUkVGSVggKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfRUxFTUVOVCArIFhNTFBsdWdpbi5JTUFHRV9UWVBFX09SREVSRURfU1VGRklYKTsKLQkJcmV0dXJuIENvbXBhcmVVSS5nZXRJbWFnZShYTUxQbHVnaW4uSU1BR0VfVFlQRV9QUkVGSVggKyBnZXRYTUxUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChYTUxOb2RlIHBhcmVudDApIHsKLQkJdGhpcy5wYXJlbnQ9IHBhcmVudDA7Ci0JfQotCi0JcHVibGljIFhNTE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JU3RyaW5nIGdldFhNTFR5cGUoKSB7Ci0JCXJldHVybiBmWE1MVHlwZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlyZXR1cm4gZlNpZ25hdHVyZTsKLQl9Ci0KLQl2b2lkIHNldE9yaWdJZChTdHJpbmcgaWQpIHsKLQkJZk9yaWdJZD0gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPcmlnSWQoKSB7Ci0JCXJldHVybiBmT3JpZ0lkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXNJRE1BUChib29sZWFuIGIpIHsKLQkJZlVzZXNJRE1BUD0gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzSURNQVAoKSB7Ci0JCXJldHVybiBmVXNlc0lETUFQOwotCX0KLQotCS8vZm9yIHRlc3RzCi0JcHVibGljIGJvb2xlYW4gdGVzdEVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0JCQlYTUxOb2RlIG49IChYTUxOb2RlKSBvYmo7Ci0JCQlyZXR1cm4gZlZhbHVlLmVxdWFscyhuLmdldFZhbHVlKCkpCi0JCQkJJiYgZlNpZ25hdHVyZS5lcXVhbHMobi5nZXRTaWduYXR1cmUoKSkKLQkJCQkmJiBmWE1MVHlwZS5lcXVhbHMobi5nZXRYTUxUeXBlKCkpCi0JCQkJJiYgZlVzZXNJRE1BUCA9PSBuLnVzZXNJRE1BUCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhpcyBub2RlIGlzIGVxdWFscyB0byB0aGUgc3VidHJlZSByb290ZWQgYXQgPGNvZGU+b2JqPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1YnRyZWVFcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIXRlc3RFcXVhbHMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLQkJCVhNTE5vZGUgbj0gKFhNTE5vZGUpIG9iajsKLQkJCWlmIChnZXRYTUxUeXBlKCkuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9BVFRSSUJVVEUpCi0JCQkJJiYgbi5nZXRYTUxUeXBlKCkuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9BVFRSSUJVVEUpKQotCQkJCXJldHVybiB0cnVlOwotCQkJT2JqZWN0W10gY2hpbGRyZW49IGdldENoaWxkcmVuKCk7Ci0JCQlPYmplY3RbXSBuX2NoaWxkcmVuPSBuLmdldENoaWxkcmVuKCk7Ci0JCQkvL2lmIGJvdGggbm9kZXMgaGF2ZSBubyBjaGlsZHJlbiwgcmV0dXJuIHRydWU7Ci0JCQlpZiAoKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoIDw9IDApCi0JCQkJJiYgKG5fY2hpbGRyZW4gPT0gbnVsbCB8fCBuX2NoaWxkcmVuLmxlbmd0aCA8PSAwKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vbm93IGF0IGxlYXN0IG9uZSBvZiB0aGUgdHdvIG5vZGVzIGhhcyBjaGlsZHJlbjsKLQkJCS8qIHNvIGlmIG9uZSBvZiB0aGUgdHdvIG5vZGVzIGhhcyBubyBjaGlsZHJlbiwgb3IgdGhleSBkb24ndCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjaGlsZHJlbiwKLQkJCSAqIHJldHVybiBmYWxzZTsKLQkJCSAqLwotCQkJaWYgKChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA8PSAwKQotCQkJCXx8IChuX2NoaWxkcmVuID09IG51bGwgfHwgbl9jaGlsZHJlbi5sZW5ndGggPD0gMCkKLQkJCQl8fCAoY2hpbGRyZW4ubGVuZ3RoICE9IG5fY2hpbGRyZW4ubGVuZ3RoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvL25vdyBib3RoIGhhdmUgY2hpbGRyZW4gYW5kIHRoZSBzYW1lIG51bWJlciBvZiBjaGlsZHJlbgotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLyogaWYgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IGNoaWxkcmVuW2ldIGlzIG5vdCBlcXVhbCB0byB0aGUgc3VidHJlZSByb290ZWQgYXQgbl9jaGlsZHJlbltpXSwKLQkJCQkgKiByZXR1cm4gZmFsc2UKLQkJCQkgKi8KLQkJCQlpZiAoISgoWE1MTm9kZSkgY2hpbGRyZW5baV0pLnN1YnRyZWVFcXVhbHMobl9jaGlsZHJlbltpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjRhNDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgcGx1Zy1pbiBydW50aW1lIGNsYXNzIGZvciB0aGUgCi0gKiA8Y29kZT4ib3JnLmVjbGlwc2UuY29tcGFyZS54bWwiPC9jb2RlPiBwbHVnLWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEPSAib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQUElOR19FWFRFTlNJT05fUE9JTlQ9ICJpZE1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRUxFTUVOVF9OQU1FPSAibWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURNQVBfTkFNRV9BVFRSSUJVVEU9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTkFNRV9BVFRSSUJVVEU9ICJleHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfU0lHTkFUVVJFX0FUVFJJQlVURT0gInNpZ25hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19JRF9BVFRSSUJVVEU9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19JRF9TT1VSQ0U9ICJpZC1zb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSURfU09VUkNFX0JPRFk9ICJib2R5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUkVEX0VMRU1FTlRfTkFNRT0gIm9yZGVyZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSRURfU0lHTkFUVVJFX0FUVFJJQlVURT0gInNpZ25hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSRUZJWCA9ICJYTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfVFlQRV9QUkVGSVggPSAieG1sXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9UWVBFX09SREVSRURfU1VGRklYID0gIl9vcmRlcmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElETUFQX1BSRUZFUkVOQ0VfTkFNRSA9ICJpZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRE1BUF9QUkVGSVggPSAiaWRtYXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIElETUFQX1NFUEFSQVRPUiA9ICcqJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSURNQVBfRklFTERTX1NFUEFSQVRPUiA9ICchJzsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUkVEX1BSRUZFUkVOQ0VfTkFNRSA9ICJvcmRlcmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUkRFUkVEX0ZJRUxEU19TRVBBUkFUT1IgPSBJRE1BUF9GSUVMRFNfU0VQQVJBVE9SOwotCQotCXByaXZhdGUgc3RhdGljIFhNTFBsdWdpbiBmZ1hNTFBsdWdpbjsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZTdG9yZTsKLQkKLQlwcml2YXRlIEhhc2hNYXAgZklkTWFwc0ludGVybmFsOwotCXByaXZhdGUgSGFzaE1hcCBmSWRNYXBzOwotCXByaXZhdGUgSGFzaE1hcCBmSWRFeHRlbnNpb25Ub05hbWU7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZPcmRlcmVkRWxlbWVudHNJbnRlcm5hbDsKLQlwcml2YXRlIEhhc2hNYXAgZk9yZGVyZWRFbGVtZW50czsKLQkKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmVmlld2Vycz0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5YTUxQbHVnaW48L2NvZGU+IG9iamVjdCBhbmQgcmVnaXN0ZXJzIGFsbAotCSAqIHN0cnVjdHVyZSBjcmVhdG9ycywgY29udGVudCBtZXJnZSB2aWV3ZXJzLCBhbmQgc3RydWN0dXJlIG1lcmdlIHZpZXdlcnMKLQkgKiBjb250cmlidXRlZCB0byB0aGlzIHBsdWctaW4ncyBleHRlbnNpb24gcG9pbnRzLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBpbnN0YW5jZXMgb2YgcGx1Zy1pbiBydW50aW1lIGNsYXNzZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCAKLQkgKiBieSB0aGUgcGxhdGZvcm0gaW4gdGhlIGNvdXJzZSBvZiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICovCi0JcHVibGljIFhNTFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShmZ1hNTFBsdWdpbiA9PSBudWxsKTsKLQkJZmdYTUxQbHVnaW49IHRoaXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJQ29tcGFyZVVJLnJlbW92ZUFsbFN0cnVjdHVyZVZpZXdlckFsaWFzZXMoREVGQVVMVF9QUkVGSVgpOwotCQlpbml0UHJlZlN0b3JlKCk7Ci0JCUNvbXBhcmVVSS5yZWdpc3RlckltYWdlRGVzY3JpcHRvcihJTUFHRV9UWVBFX1BSRUZJWCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5ULCBnZXRJbWFnZURlc2NyaXB0b3IoIm9iajE2L2VsZW1lbnRfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJlVUkucmVnaXN0ZXJJbWFnZURlc2NyaXB0b3IoSU1BR0VfVFlQRV9QUkVGSVggKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfQVRUUklCVVRFLCBnZXRJbWFnZURlc2NyaXB0b3IoIm9iajE2L2F0dHJpYnV0ZV9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBhcmVVSS5yZWdpc3RlckltYWdlRGVzY3JpcHRvcihJTUFHRV9UWVBFX1BSRUZJWCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9URVhULCBnZXRJbWFnZURlc2NyaXB0b3IoIm9iajE2L3RleHRfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJlVUkucmVnaXN0ZXJJbWFnZURlc2NyaXB0b3IoSU1BR0VfVFlQRV9QUkVGSVggKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfRUxFTUVOVCArIElNQUdFX1RZUEVfT1JERVJFRF9TVUZGSVgsIGdldEltYWdlRGVzY3JpcHRvcigib2JqMTYvZWxlbWVudF9vcmRlcmVkX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJFeHRlbnNpb25zKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCQotCQkvL1VSTCBpbnN0YWxsVVJMPSBnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotCQkKLQkJVVJMIGluc3RhbGxVUkw9IGZnWE1MUGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluc3RhbGxVUkwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsPSBuZXcgVVJMKGluc3RhbGxVUkwsICJpY29ucy9mdWxsLyIgKyByZWxhdGl2ZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWctaW4gcnVudGltZSBjbGFzcy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIFhNTFBsdWdpbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBmZ1hNTFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgUHJlZmVyZW5jZSBTdG9yZSBhc3NvY2lhdGVkIHdpdGggWE1MUGx1Z2luIGFuZCBpbml0aWFsaXplcyBJRCBNYXBwaW5ncy4KLQkgKi8JCi0JcHVibGljIHZvaWQgaW5pdFByZWZTdG9yZSgpIHsKLQkJZklkTWFwcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZJZEV4dGVuc2lvblRvTmFtZT0gbmV3IEhhc2hNYXAoKTsKLQkJZlByZWZTdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgSWRNYXBQcmVmVmFsdWUgPSBmUHJlZlN0b3JlLmdldFN0cmluZyhJRE1BUF9QUkVGRVJFTkNFX05BTUUpOwotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgZW5kID0gSWRNYXBQcmVmVmFsdWUuaW5kZXhPZihJRE1BUF9TRVBBUkFUT1IpOwotCQl3aGlsZSAoZW5kID49IDApIHsKLQkJCVN0cmluZyBDdXJyZW50SWRNYXAgPSBJZE1hcFByZWZWYWx1ZS5zdWJzdHJpbmcoc3RhcnQsZW5kKTsKLQkJCWludCBlbmRfb2ZfSWRNYXBOYW1lID0gQ3VycmVudElkTWFwLmluZGV4T2YoSURNQVBfRklFTERTX1NFUEFSQVRPUik7Ci0JCQlTdHJpbmcgSWRNYXBOYW1lID0gQ3VycmVudElkTWFwLnN1YnN0cmluZygwLGVuZF9vZl9JZE1hcE5hbWUpOwotCQkJaW50IGVuZF9vZl9zaWduYXR1cmUgPSBDdXJyZW50SWRNYXAuaW5kZXhPZihJRE1BUF9GSUVMRFNfU0VQQVJBVE9SLGVuZF9vZl9JZE1hcE5hbWUrMSk7Ci0JCQlTdHJpbmcgSWRNYXBTaWduYXR1cmUgPSBDdXJyZW50SWRNYXAuc3Vic3RyaW5nKGVuZF9vZl9JZE1hcE5hbWUrMSxlbmRfb2Zfc2lnbmF0dXJlKTsKLQkJCWludCBlbmRfb2ZfYXR0cmlidXRlPSBDdXJyZW50SWRNYXAuaW5kZXhPZihJRE1BUF9GSUVMRFNfU0VQQVJBVE9SLGVuZF9vZl9zaWduYXR1cmUrMSk7Ci0JCQlTdHJpbmcgSWRNYXBBdHRyaWJ1dGU7Ci0JCQlpZiAoZW5kX29mX2F0dHJpYnV0ZSA8IDApIHsvL2ZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCQkJSWRNYXBBdHRyaWJ1dGUgPSBDdXJyZW50SWRNYXAuc3Vic3RyaW5nKGVuZF9vZl9zaWduYXR1cmUrMSxDdXJyZW50SWRNYXAubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsvL25vcm1hbCBjYXNlCi0JCQkJSWRNYXBBdHRyaWJ1dGUgPSBDdXJyZW50SWRNYXAuc3Vic3RyaW5nKGVuZF9vZl9zaWduYXR1cmUrMSxlbmRfb2ZfYXR0cmlidXRlKTsKLQkJCQlTdHJpbmcgSWRNYXBFeHRlbnNpb249IEN1cnJlbnRJZE1hcC5zdWJzdHJpbmcoZW5kX29mX2F0dHJpYnV0ZSsxLEN1cnJlbnRJZE1hcC5sZW5ndGgoKSk7Ci0JCQkJLy9pZiBleHRlbnNpb24gYWxyZWFkeSBhc3NvY2lhdGVkLCBkbyBub3QgYXNzb2NpYXRlIHdpdGggdGhpcyBpZG1hcAotCQkJCWlmICghSWRNYXBFeHRlbnNpb24uZXF1YWxzKCIiKSAmJiAhZklkRXh0ZW5zaW9uVG9OYW1lLmNvbnRhaW5zS2V5KElkTWFwRXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWZJZEV4dGVuc2lvblRvTmFtZS5wdXQoSWRNYXBFeHRlbnNpb24sSWRNYXBOYW1lKTsKLQkJCQkJQ29tcGFyZVVJLmFkZFN0cnVjdHVyZVZpZXdlckFsaWFzKERFRkFVTFRfUFJFRklYLCBJZE1hcEV4dGVuc2lvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZklkTWFwcy5jb250YWluc0tleShJZE1hcE5hbWUpKSB7Ci0JCQkJSGFzaE1hcCBNYXBwaW5ncyA9IChIYXNoTWFwKSBmSWRNYXBzLmdldChJZE1hcE5hbWUpOwotCQkJCU1hcHBpbmdzLnB1dChJZE1hcFNpZ25hdHVyZSxJZE1hcEF0dHJpYnV0ZSk7Ci0JCQl9IGVsc2UgewotCQkJCUhhc2hNYXAgTWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQkJCU1hcHBpbmdzLnB1dChJZE1hcFNpZ25hdHVyZSxJZE1hcEF0dHJpYnV0ZSk7Ci0JCQkJZklkTWFwcy5wdXQoSWRNYXBOYW1lLE1hcHBpbmdzKTsKLQkJCX0KLQkJCXN0YXJ0ID0gZW5kKzE7Ci0JCQllbmQgPSBJZE1hcFByZWZWYWx1ZS5pbmRleE9mKElETUFQX1NFUEFSQVRPUixlbmQrMSk7Ci0JCX0KLQkJCi0JCWZPcmRlcmVkRWxlbWVudHM9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBPcmRlcmVkUHJlZlZhbHVlPSBmUHJlZlN0b3JlLmdldFN0cmluZyhPUkRFUkVEX1BSRUZFUkVOQ0VfTkFNRSk7Ci0JCVN0cmluZ1Rva2VuaXplciBvcmRlcmVkVG9rZW5zPSBuZXcgU3RyaW5nVG9rZW5pemVyKE9yZGVyZWRQcmVmVmFsdWUsIChuZXcgQ2hhcmFjdGVyKE9SREVSRURfRklFTERTX1NFUEFSQVRPUikpLnRvU3RyaW5nKCkpOwotCQl3aGlsZSAob3JkZXJlZFRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBJZE1hcE5hbWU9IG9yZGVyZWRUb2tlbnMubmV4dFRva2VuKCk7Ci0JCQlTdHJpbmcgc2lnbmF0dXJlPSBvcmRlcmVkVG9rZW5zLm5leHRUb2tlbigpOwotCQkJaWYgKGZPcmRlcmVkRWxlbWVudHMuY29udGFpbnNLZXkoSWRNYXBOYW1lKSkgewotCQkJCUFycmF5TGlzdCBpZG1hcEFMPSAoQXJyYXlMaXN0KSBmT3JkZXJlZEVsZW1lbnRzLmdldChJZE1hcE5hbWUpOwotCQkJCWlkbWFwQUwuYWRkKHNpZ25hdHVyZSk7Ci0JCQl9IGVsc2UgewotCQkJCUFycmF5TGlzdCBpZG1hcEFMPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWRtYXBBTC5hZGQoc2lnbmF0dXJlKTsKLQkJCQlmT3JkZXJlZEVsZW1lbnRzLnB1dChJZE1hcE5hbWUsIGlkbWFwQUwpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSB1c2VyIElkIE1hcHBpbmdzLCB0aGUgSWRFeHRlbnNpb25Ub05hbWUgbWFwcGluZ3MgYW5kIHJlZnJlc2hlcyB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiBAcGFyYW0gSWRNYXAgdGhlIG5ldyBJZCBNYXBwaW5ncwotCSAqIEBwYXJhbSBJZEV4dGVuc2lvblRvTmFtZSB0aGUgbmV3IElkRXh0ZW5zaW9uVG9OYW1lIG1hcHBpbmdzCi0JICogQHBhcmFtIHJlZnJlc2ggd2hldGhlciBhbGwgdGhlIG9wZW4gU3RydWN0dXJlVmlld2VycyBzaG91bGQgYmUgcmVmcmVzaGVkIHdpdGggdGhlIG5ldyBJZE1hcHBpbmcgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZE1hcHMoSGFzaE1hcCBJZE1hcCwgSGFzaE1hcCBJZEV4dGVuc2lvblRvTmFtZSwgSGFzaE1hcCBPcmRlcmVkRWxlbWVudHMsIGJvb2xlYW4gcmVmcmVzaCkgewotCQlmSWRNYXBzID0gSWRNYXA7Ci0JCWlmIChJZEV4dGVuc2lvblRvTmFtZSAhPSBudWxsICYmICFJZEV4dGVuc2lvblRvTmFtZS5lcXVhbHMoZklkRXh0ZW5zaW9uVG9OYW1lKSkgewotCQkJQ29tcGFyZVVJLnJlbW92ZUFsbFN0cnVjdHVyZVZpZXdlckFsaWFzZXMoREVGQVVMVF9QUkVGSVgpOwotCQkJZklkRXh0ZW5zaW9uVG9OYW1lPSBJZEV4dGVuc2lvblRvTmFtZTsKLQkJCVNldCBuZXdrZXlTZXQ9IGZJZEV4dGVuc2lvblRvTmFtZS5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcj0gbmV3a2V5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCUNvbXBhcmVVSS5hZGRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcyhERUZBVUxUX1BSRUZJWCwgZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdCdWZmZXIgSWRNYXBQcmVmVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVNldCBpZG1hcEtleXMgPSBmSWRNYXBzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJfaWRtYXAgPSBpZG1hcEtleXMuaXRlcmF0b3IoKTsgaXRlcl9pZG1hcC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIElkTWFwTmFtZSA9IChTdHJpbmcpIGl0ZXJfaWRtYXAubmV4dCgpOwotCQkJSGFzaE1hcCBpZG1hcEhNID0gKEhhc2hNYXApIGZJZE1hcHMuZ2V0KElkTWFwTmFtZSk7Ci0JCQlTZXQgbWFwcGluZ0tleXMgPSBpZG1hcEhNLmtleVNldCgpOwotCQkJU3RyaW5nIGV4dGVuc2lvbj0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmSWRFeHRlbnNpb25Ub05hbWUuY29udGFpbnNWYWx1ZShJZE1hcE5hbWUpKSB7Ci0JCQkJU2V0IGtleVNldD0gZklkRXh0ZW5zaW9uVG9OYW1lLmtleVNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcj0ga2V5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQkJZXh0ZW5zaW9uPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCQlpZiAoICgoU3RyaW5nKWZJZEV4dGVuc2lvblRvTmFtZS5nZXQoZXh0ZW5zaW9uKSkuZXF1YWxzKElkTWFwTmFtZSkgKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyX21hcHBpbmcgPSBtYXBwaW5nS2V5cy5pdGVyYXRvcigpOyBpdGVyX21hcHBpbmcuaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gKFN0cmluZykgaXRlcl9tYXBwaW5nLm5leHQoKTsKLQkJCQlJZE1hcFByZWZWYWx1ZS5hcHBlbmQoSWRNYXBOYW1lK0lETUFQX0ZJRUxEU19TRVBBUkFUT1Irc2lnbmF0dXJlK0lETUFQX0ZJRUxEU19TRVBBUkFUT1IraWRtYXBITS5nZXQoc2lnbmF0dXJlKStJRE1BUF9GSUVMRFNfU0VQQVJBVE9SK2V4dGVuc2lvbitJRE1BUF9TRVBBUkFUT1IpOwotCQkJfQotCQl9Ci0JCWZQcmVmU3RvcmUuc2V0VmFsdWUoSURNQVBfUFJFRkVSRU5DRV9OQU1FLElkTWFwUHJlZlZhbHVlLnRvU3RyaW5nKCkpOwotCQkvL2ZQcmVmU3RvcmUuc2V0VmFsdWUoSURNQVBfUFJFRkVSRU5DRV9OQU1FLCIiKTsKLQkJCi0JCS8vc3RvcmVzIE9yZGVyZWRFbGVtZW50cwotCQlpZiAoT3JkZXJlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZPcmRlcmVkRWxlbWVudHM9IE9yZGVyZWRFbGVtZW50czsKLQkJCVN0cmluZ0J1ZmZlciBPcmRlcmVkUHJlZlZhbHVlPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTZXQgb3JkZXJlZEtleXM9IGZPcmRlcmVkRWxlbWVudHMua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJfb3JkZXJlZD0gb3JkZXJlZEtleXMuaXRlcmF0b3IoKTsgaXRlcl9vcmRlcmVkLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgSWRNYXBOYW1lPSAoU3RyaW5nKSBpdGVyX29yZGVyZWQubmV4dCgpOwotCQkJCUFycmF5TGlzdCBpZG1hcEFMPSAoQXJyYXlMaXN0KSBmT3JkZXJlZEVsZW1lbnRzLmdldChJZE1hcE5hbWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcl9pZG1hcEFMPSBpZG1hcEFMLml0ZXJhdG9yKCk7IGl0ZXJfaWRtYXBBTC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBzaWduYXR1cmU9IChTdHJpbmcpIGl0ZXJfaWRtYXBBTC5uZXh0KCk7Ci0JCQkJCU9yZGVyZWRQcmVmVmFsdWUuYXBwZW5kKElkTWFwTmFtZStPUkRFUkVEX0ZJRUxEU19TRVBBUkFUT1Irc2lnbmF0dXJlK09SREVSRURfRklFTERTX1NFUEFSQVRPUik7Ci0JCQkJfQotCQkJfQotCQkJZlByZWZTdG9yZS5zZXRWYWx1ZShPUkRFUkVEX1BSRUZFUkVOQ0VfTkFNRSxPcmRlcmVkUHJlZlZhbHVlLnRvU3RyaW5nKCkpOwotCQkJLy9mUHJlZlN0b3JlLnNldFZhbHVlKE9SREVSRURfUFJFRkVSRU5DRV9OQU1FLCIiKTsKLQkJfQotCi0JCWlmIChyZWZyZXNoKSB7Ci0JCQlPYmplY3RbXSB2aWV3ZXJzID0gZlZpZXdlcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdlcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlYTUxTdHJ1Y3R1cmVWaWV3ZXIgdmlld2VyID0gKFhNTFN0cnVjdHVyZVZpZXdlcikgdmlld2Vyc1tpXTsKLQkJCQl2aWV3ZXIudXBkYXRlSWRNYXBzKCk7Ci0JCQkJdmlld2VyLmNvbnRlbnRDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0SWRNYXBzKCkgewotCQlyZXR1cm4gZklkTWFwczsKLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0SWRNYXBzSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBmSWRNYXBzSW50ZXJuYWw7Ci0JfQotCQotCXB1YmxpYyBIYXNoTWFwIGdldElkRXh0ZW5zaW9uVG9OYW1lKCkgewotCQlyZXR1cm4gZklkRXh0ZW5zaW9uVG9OYW1lOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldE9yZGVyZWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZPcmRlcmVkRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIEhhc2hNYXAgZ2V0T3JkZXJlZEVsZW1lbnRzSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWw7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFsbCBpbnRlcm5hbCBJZCBNYXBwaW5nIHNjaGVtZXMKLQkgKiB0aGF0IGFyZSBmb3VuZCBpbiBwbHVnaW4ueG1sIGZpbGVzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckV4dGVuc2lvbnMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeT0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCi0JCS8vIGNvbGxlY3QgYWxsIElkIE1hcHBpbmdzCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGlkbWFwcz0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFBMVUdJTl9JRCwgSURfTUFQUElOR19FWFRFTlNJT05fUE9JTlQpOwotCQlmSWRNYXBzSW50ZXJuYWwgPSBuZXcgSGFzaE1hcCgpOwotCQlmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWw9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGlfaWRtYXA9IDA7IGlfaWRtYXAgPCBpZG1hcHMubGVuZ3RoOyBpX2lkbWFwKyspIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBpZG1hcD0gaWRtYXBzW2lfaWRtYXBdOwotCQkJLy9oYW5kbGUgSURNQVBfTkFNRV9BVFRSSUJVVEUKLQkJCVN0cmluZyBpZG1hcF9uYW1lPSBpZG1hcC5nZXRBdHRyaWJ1dGUoSURNQVBfTkFNRV9BVFRSSUJVVEUpOwotCQkJLy9pZ25vcmVzIGlkbWFwIGlmIGl0cyBuYW1lIGVxdWFscyB0aGUgcmVzZXJ2ZWQgbmFtZSBmb3IgdW5vcmRlcmVkIG1hdGNoaW5nIG9yIHRoZSB0aGUgbmFtZSBmb3Igb3JkZXJlZCBtYXRjaGluZwotCQkJaWYgKCAhaWRtYXBfbmFtZS5lcXVhbHMoWE1MU3RydWN0dXJlQ3JlYXRvci5VU0VfVU5PUkRFUkVEKSAmJiAhaWRtYXBfbmFtZS5lcXVhbHMoWE1MU3RydWN0dXJlQ3JlYXRvci5VU0VfT1JERVJFRCkgKSB7Ci0JCQkJLy9oYW5kbGUgbWFwcGluZ3MKLQkJCQlIYXNoTWFwIGlkbWFwSE0gPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZJZE1hcHNJbnRlcm5hbC5wdXQoaWRtYXBfbmFtZSwgaWRtYXBITSk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbWFwcGluZ3MgPSBpZG1hcC5nZXRDaGlsZHJlbihNQVBQSU5HX0VMRU1FTlRfTkFNRSk7Ci0JCQkJZm9yIChpbnQgaV9tYXBwaW5nPSAwOyBpX21hcHBpbmcgPCBtYXBwaW5ncy5sZW5ndGg7IGlfbWFwcGluZysrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBtYXBwaW5nID0gbWFwcGluZ3NbaV9tYXBwaW5nXTsKLQkJCQkJLy9hZGQgU0lHTl9TRVBBUkFUT1IgYXQgdGhlIGVuZCBiZWNhdXNlIG5vdCBjb250YWluZWQgaW4gc2lnbmF0dXJlcyBvZiBwbHVnaW4ueG1sCi0JCQkJCS8vYWxzbyBhZGQgcHJlZml4IGF0IGJlZ2lubmluZwotCQkJCQlTdHJpbmcgc2lnbmF0dXJlPSBtYXBwaW5nLmdldEF0dHJpYnV0ZShNQVBQSU5HX1NJR05BVFVSRV9BVFRSSUJVVEUpOwotCQkJCQlTdHJpbmcgYXR0cmlidXRlPSBtYXBwaW5nLmdldEF0dHJpYnV0ZShNQVBQSU5HX0lEX0FUVFJJQlVURSk7Ci0JCQkJCVN0cmluZyBpZHNvdXJjZT0gbWFwcGluZy5nZXRBdHRyaWJ1dGUoTUFQUElOR19JRF9TT1VSQ0UpOwotCQkJCQlTdHJpbmcgYm9keWlkPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoc2lnbmF0dXJlICE9IG51bGwgJiYgIXNpZ25hdHVyZS5lcXVhbHMoIiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSYmIGF0dHJpYnV0ZSAhPSBudWxsICYmICFhdHRyaWJ1dGUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaWRzb3VyY2UgIT0gbnVsbCAmJiBpZHNvdXJjZS5lcXVhbHMoTUFQUElOR19JRF9TT1VSQ0VfQk9EWSkpCi0JCQkJCQkJYm9keWlkPSAobmV3IENoYXJhY3RlcihYTUxTdHJ1Y3R1cmVDcmVhdG9yLklEX1RZUEVfQk9EWSkpLnRvU3RyaW5nKCk7Ci0JCQkJCQlpZG1hcEhNLnB1dChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQJKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SCi0JCQkJCQkJCSsgc2lnbmF0dXJlCSsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiwgYm9keWlkICsgYXR0cmlidXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvL2hhbmRsZXMgb3JkZXJlZCBlbnRyaWVzCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gb3JkZXJlZEVudHJpZXM9IGlkbWFwLmdldENoaWxkcmVuKE9SREVSRURfRUxFTUVOVF9OQU1FKTsKLQkJCQlpZiAob3JkZXJlZEVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCQlBcnJheUxpc3Qgb3JkZXJlZEFMPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoaW50IGlfb3JkZXJlZD0gMDsgaV9vcmRlcmVkIDwgb3JkZXJlZEVudHJpZXMubGVuZ3RoOyBpX29yZGVyZWQrKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG9yZGVyZWQ9IG9yZGVyZWRFbnRyaWVzW2lfb3JkZXJlZF07Ci0JCQkJCQkvL2FkZCBTSUdOX1NFUEFSQVRPUiBhdCB0aGUgZW5kIGJlY2F1c2Ugbm90IGNvbnRhaW5lZCBpbiBzaWduYXR1cmVzIG9mIHBsdWdpbi54bWwKLQkJCQkJCS8vYWxzbyBhZGQgcHJlZml4IGF0IGJlZ2lubmluZwotCQkJCQkJU3RyaW5nIHNpZ25hdHVyZT0gb3JkZXJlZC5nZXRBdHRyaWJ1dGUoT1JERVJFRF9TSUdOQVRVUkVfQVRUUklCVVRFKTsKLQkJCQkJCWlmIChzaWduYXR1cmUgIT0gbnVsbCAmJiAhc2lnbmF0dXJlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlvcmRlcmVkQUwuYWRkKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBzaWduYXR1cmUgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SKTsKLQkJCQkJfQotCQkJCQlpZiAob3JkZXJlZEFMLnNpemUoKSA+IDApCi0JCQkJCQlmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWwucHV0KGlkbWFwX25hbWUsIG9yZGVyZWRBTCk7Ci0JCQkJfQotCQkJCS8vaGFuZGxlIEVYVEVOU0lPTl9OQU1FX0FUVFJJQlVURQotCQkJCVN0cmluZyBleHRfbmFtZT0gaWRtYXAuZ2V0QXR0cmlidXRlKEVYVEVOU0lPTl9OQU1FX0FUVFJJQlVURSk7Ci0JCQkJaWYgKGV4dF9uYW1lICE9IG51bGwgJiYgIWZJZEV4dGVuc2lvblRvTmFtZS5jb250YWluc0tleShleHRfbmFtZSkpIHsKLQkJCQkJZXh0X25hbWU9IGV4dF9uYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCWZJZEV4dGVuc2lvblRvTmFtZS5wdXQoZXh0X25hbWUsaWRtYXBfbmFtZSk7Ci0JCQkJCUNvbXBhcmVVSS5hZGRTdHJ1Y3R1cmVWaWV3ZXJBbGlhcyhERUZBVUxUX1BSRUZJWCwgZXh0X25hbWUpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdGVuZXJMaXN0IGdldFZpZXdlcnMoKSB7Ci0JCXJldHVybiBmVmlld2VyczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdz0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJldHVybiB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBmZ1hNTFBsdWdpbi5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQlmaW5hbCBXaW5kb3dSZWYgd2luZG93UmVmPSBuZXcgV2luZG93UmVmKCk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlzZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3cod2luZG93UmVmKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiB3aW5kb3dSZWYud2luZG93OwotCQl9Ci0JCXJldHVybiB3aW5kb3c7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2luZG93UmVmIHsKLQkJcHVibGljIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoV2luZG93KFdpbmRvd1JlZiB3aW5kb3dSZWYpIHsKLQkJd2luZG93UmVmLndpbmRvdz0gbnVsbDsKLQkJRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29udHJvbCBzaGVsbD0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQl3aGlsZSAoc2hlbGwgIT0gbnVsbCkgewotCQkJT2JqZWN0IGRhdGE9IHNoZWxsLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgSVdvcmtiZW5jaFdpbmRvdykgewotCQkJCXdpbmRvd1JlZi53aW5kb3c9IChJV29ya2JlbmNoV2luZG93KWRhdGE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2hlbGw9IHNoZWxsLmdldFBhcmVudCgpOwotCQl9Ci0JCVNoZWxsIHNoZWxsc1tdPSBkaXNwbGF5LmdldFNoZWxscygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgc2hlbGxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgZGF0YT0gc2hlbGxzW2ldLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgSVdvcmtiZW5jaFdpbmRvdykgewotCQkJCXdpbmRvd1JlZi53aW5kb3c9IChJV29ya2JlbmNoV2luZG93KWRhdGE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuRVJST1IsICJJbnRlcm5hbCBFcnJvciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTFN0cnVjdHVyZUNyZWF0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxTdHJ1Y3R1cmVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDQ2NTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTFN0cnVjdHVyZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTG9jYXRvckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSUVkaXRhYmxlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSURpZmZDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JU3RydWN0dXJlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLklTdHJ1Y3R1cmVDcmVhdG9yOwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGFuYWx5emVyIGJ1aWxkcyBhIHBhcnNlIHRyZWUgb2YgYW4gWE1MIGRvY3VtZW50IGZvdW5kIGluIGEKLSAqIDxjb2RlPklCeXRlQ29udGVudEFjY2Vzc29yPC9jb2RlPiBpbnB1dCBieSBjYWxsaW5nIGdldFN0cnVjdHVyZShPYmplY3QpCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVDcmVhdG9yIGltcGxlbWVudHMgSVN0cnVjdHVyZUNyZWF0b3IgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX01PREU9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRT0gWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MU3RydWN0dXJlQ3JlYXRvci5wbHVnaW5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9VTk9SREVSRUQ9IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTFN0cnVjdHVyZUNyZWF0b3IudW5vcmRlcmVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfT1JERVJFRD0gWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MU3RydWN0dXJlQ3JlYXRvci5vcmRlcmVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lETUFQPSBVU0VfT1JERVJFRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRUxFTUVOVD0gImVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURT0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIGZvciBzaWduYXR1cmVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9JRD0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNJR05fU0VQQVJBVE9SPSAnPic7Ly8nLicKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0lHTl9FTkNMT1NJTkc9ICckJzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOX0VMRU1FTlQ9IFNJR05fRU5DTE9TSU5HICsgVFlQRV9FTEVNRU5UICsgU0lHTl9FTkNMT1NJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTl9URVhUPSBTSUdOX0VOQ0xPU0lORyArIFRZUEVfVEVYVCArIFNJR05fRU5DTE9TSU5HOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05fQVRUUklCVVRFPSBTSUdOX0VOQ0xPU0lORyArIFRZUEVfQVRUUklCVVRFICsgU0lHTl9FTkNMT1NJTkc7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURNQVBfVU5PUkRFUkVEPSBYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxTdHJ1Y3R1cmVDcmVhdG9yLmlkbWFwX3Vub3JkZXJlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIElEX1NFUEFSQVRPUj0gJzwnOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJRF9UWVBFX0JPRFk9ICc8JzsKLQotICAgIHByaXZhdGUgWE1MTm9kZSBmY3VycmVudFBhcmVudDsKLSAgICBwcml2YXRlIFN0cmluZyBmc2lnbmF0dXJlOwotICAgIHByaXZhdGUgRG9jdW1lbnQgZmRvYzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlQm9kaWVzPSBmYWxzZTsKLSAgICBwcml2YXRlIEhhc2hNYXAgZklkTWFwc0ludGVybmFsOwotICAgIHByaXZhdGUgSGFzaE1hcCBmSWRNYXBzOwotICAgIHByaXZhdGUgSGFzaE1hcCBmSWRFeHRlbnNpb25Ub05hbWU7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIGZPcmRlcmVkRWxlbWVudHNJbnRlcm5hbDsKLSAgICBwcml2YXRlIEhhc2hNYXAgZk9yZGVyZWRFbGVtZW50czsKLSAgICBwcml2YXRlIEhhc2hNYXAgaWRNYXA7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZk9yZGVyZWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZklkTWFwVG9Vc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZVc2VJZE1hcDsKLSAgICBwcml2YXRlIFN0cmluZyBmRmlsZUV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZkZpcnN0Q2FsbD0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZlJlbW92ZVdoaXRlU3BhY2U7Ci0KLSAgICBwcm90ZWN0ZWQgY2xhc3MgWE1MSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotICAgICAgICBwcm90ZWN0ZWQgTG9jYXRvciBwcmV2bG9jYXRvcjsgLy9wcmV2aW91cyBsb2NhdG9yCi0gICAgICAgIHByb3RlY3RlZCBMb2NhdG9yIGxvY2F0b3I7IC8vY3VycmVudCBsb2NhdG9yCi0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcjApIHsKLSAgICAgICAgICAgIHRoaXMubG9jYXRvcj0gbG9jYXRvcjA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb2N1bWVudEhhbmRsZXIgbWV0aG9kcwotICAgICAgICAKLSAgICAgICAgLyogUHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0KLSAgICAgICAgICAgIC8vICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldDogIiArIHRhcmdldCk7Ci0gICAgICAgICAgICAvLyAgICAJU3lzdGVtLm91dC5wcmludGxuKCJkYXRhOiAiICsgZGF0YSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPD8iKTsKLSAgICAgICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHRhcmdldCk7Ci0gICAgICAgICAgICAvLyAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoZGF0YSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIj8+Iik7Ci0gICAgICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICAgICAgcHJldmxvY2F0b3I9IG5ldyBMb2NhdG9ySW1wbChsb2NhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBTdGFydCBkb2N1bWVudC4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHsKLSAgICAgICAgICAgIHByZXZsb2NhdG9yPSBuZXcgTG9jYXRvckltcGwobG9jYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTdGFydCBlbGVtZW50LiAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsLCBTdHJpbmcgcmF3LCBBdHRyaWJ1dGVzIGF0dHJzKSB7Ci0gICAgICAgICAgICBYTUxOb2RlIGN1cnJlbnRFbGVtZW50OwotCi0gICAgICAgICAgICAvKiBhZGQgcm9vdCBub2RlIGZvciB0aGlzIGVsZW1lbnQgKi8KLQotICAgICAgICAgICAgaWYgKFhNTFN0cnVjdHVyZUNyZWF0b3IuREVCVUdfTU9ERSkgewotICAgICAgICAgICAgICAgIGlmIChsb2NhdG9yICE9IG51bGwgJiYgcHJldmxvY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByZXZsb2NhdG9yOiBsaW5lICIgKyBwcmV2bG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiICBjb2x1bW4gIiArIHByZXZsb2NhdG9yLmdldENvbHVtbk51bWJlcigpICsgIiAgaWQgIiArIHByZXZsb2NhdG9yLmdldFB1YmxpY0lkKCkpOyAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxvY2F0b3I6IGxpbmUgIiArIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpICsgIiAgY29sdW1uICIgKyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpICsgIiAgaWQgIiArIGxvY2F0b3IuZ2V0UHVibGljSWQoKSk7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm9kZSB3aGVyZSBjaGlsZHJlbiBmaWVsZCBhY2Nlc3NlZDogIiArIGZjdXJyZW50UGFyZW50LmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgWE1MQ2hpbGRyZW4gY3VycmVudFBhcmVudD0gKFhNTENoaWxkcmVuKSBmY3VycmVudFBhcmVudDsKLSAgICAgICAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuKys7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRJZDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgSVJlZ2lvbiByPSBmZG9jLmdldExpbmVJbmZvcm1hdGlvbihwcmV2bG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgLSAxKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnRTaWc9IGZzaWduYXR1cmU7Ci0gICAgICAgICAgICAgICAgZnNpZ25hdHVyZT0gZnNpZ25hdHVyZSArIHJhdyArIFNJR05fU0VQQVJBVE9SOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzVXNlSWRNYXAoKSAmJiBpZE1hcC5jb250YWluc0tleShmc2lnbmF0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWU9IChTdHJpbmcpIGlkTWFwLmdldChmc2lnbmF0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkPSByYXcgKyBuZXcgQ2hhcmFjdGVyKElEX1NFUEFSQVRPUikgKyBhdHRycy5nZXRWYWx1ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lPSByYXcgKyAiIFsiICsgYXR0ck5hbWUgKyAiPSIgKyBhdHRycy5nZXRWYWx1ZShhdHRyTmFtZSkgKyAiXSI7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50UGFyZW50LmNoaWxkRWxlbWVudHMuY29udGFpbnNLZXkocmF3KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhcmVudC5jaGlsZEVsZW1lbnRzLnB1dChyYXcsIG5ldyBJbnRlZ2VyKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuY2hpbGRFbGVtZW50cy5wdXQocmF3LCBuZXcgSW50ZWdlcigoKEludGVnZXIpIGN1cnJlbnRQYXJlbnQuY2hpbGRFbGVtZW50cy5nZXQocmF3KSkuaW50VmFsdWUoKSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ9IHJhdyArIG5ldyBDaGFyYWN0ZXIoSURfU0VQQVJBVE9SKSArICJbIiArIGN1cnJlbnRQYXJlbnQuY2hpbGRFbGVtZW50cy5nZXQocmF3KSArICJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9IFt7MX1dIiwgbmV3IFN0cmluZ1tdIHsgcmF3LCBjdXJyZW50UGFyZW50LmNoaWxkRWxlbWVudHMuZ2V0KHJhdykudG9TdHJpbmcoKX0pOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0PSByLmdldE9mZnNldCgpICsgcHJldmxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkgLSAxOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0PSAwOwotICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50PSBuZXcgWE1MQ2hpbGRyZW4oVFlQRV9FTEVNRU5ULCBlbGVtZW50SWQsIGVsZW1lbnRJZCwgKGZzaWduYXR1cmUgKyBTSUdOX0VMRU1FTlQpLCBmZG9jLCBzdGFydCwgMCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuc2V0TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVXNlSWRNYXAoKSAmJiBpZE1hcC5jb250YWluc0tleShmc2lnbmF0dXJlKSkKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuc2V0VXNlc0lETUFQKHRydWUpOwotICAgICAgICAgICAgICAgIGlmIChmT3JkZXJlZCAhPSBudWxsICYmIGZPcmRlcmVkLmNvbnRhaW5zKHBhcmVudFNpZykpCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnNldElzT3JkZXJlZENoaWxkKHRydWUpOwotCi0gICAgICAgICAgICAgICAgZmN1cnJlbnRQYXJlbnQuYWRkQ2hpbGQoY3VycmVudEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnNldFBhcmVudChmY3VycmVudFBhcmVudCk7Ci0gICAgICAgICAgICAgICAgZmN1cnJlbnRQYXJlbnQ9IGN1cnJlbnRFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5BZGRlZCBFbGVtZW50ICIgKyByYXcgKyAiICB3aXRoIG9mZnNldCAiICsgci5nZXRPZmZzZXQoKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmN1cnJlbnRQYXJlbnQxOiAiICsgZmN1cnJlbnRQYXJlbnQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImF0dHJzICE9IG51bGwsIGZjdXJyZW50UGFyZW50IGlzICIgKyBmY3VycmVudFBhcmVudC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAvL2F0dHJzID0gc29ydEF0dHJpYnV0ZXMoYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuPSBhdHRycy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVsZW1lbnRfbGluZXNfbGVuZ3RoX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGludFtdIGVsZW1lbnRfbGluZXNfbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRfc3RyaW5nOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmN1cnJlbnRQYXJlbnQuZ2V0UGFyZW50KCkuZ2V0SWQoKS5lcXVhbHMoUk9PVF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbGluZXNfbGVuZ3RoX3NpemU9IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpIC0gcHJldmxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9saW5lc19sZW5ndGg9IG5ldyBpbnRbZWxlbWVudF9saW5lc19sZW5ndGhfc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fb2Zmc2V0PSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9zdHJpbmc9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpX2VsbD0gMDsgaV9lbGwgPCBlbGVtZW50X2xpbmVzX2xlbmd0aC5sZW5ndGg7IGlfZWxsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVnaW9uIGF0dHJfcj0gZmRvYy5nZXRMaW5lSW5mb3JtYXRpb24oaV9lbGwgKyBwcmV2bG9jYXRvci5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbGluZXNfbGVuZ3RoW2lfZWxsXT0gZmRvYy5nZXQoYXR0cl9yLmdldE9mZnNldCgpLCBhdHRyX3IuZ2V0TGVuZ3RoKCkpLmxlbmd0aCgpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3N0cmluZz0gZWxlbWVudF9zdHJpbmcgKyBmZG9jLmdldChhdHRyX3IuZ2V0T2Zmc2V0KCksIGF0dHJfci5nZXRMZW5ndGgoKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbGluZXNfbGVuZ3RoX3NpemU9IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpIC0gcHJldmxvY2F0b3IuZ2V0TGluZU51bWJlcigpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGVsZW1lbnRfbGluZXNfbGVuZ3RoX3NpemUgPCAxKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudF9saW5lc19sZW5ndGhfc2l6ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X2xpbmVzX2xlbmd0aD0gbmV3IGludFtlbGVtZW50X2xpbmVzX2xlbmd0aF9zaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZWdpb24gZmlyc3RfbGluZT0gZmRvYy5nZXRMaW5lSW5mb3JtYXRpb24ocHJldmxvY2F0b3IuZ2V0TGluZU51bWJlcigpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fb2Zmc2V0PSBwcmV2bG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RfbGluZV9yZWxldmFudF9vZmZzZXQ9IGZpcnN0X2xpbmUuZ2V0T2Zmc2V0KCkgKyBjb2x1bW5fb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X2xpbmVfcmVsZXZhbnRfbGVuZ3RoPSBmaXJzdF9saW5lLmdldExlbmd0aCgpIC0gY29sdW1uX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfc3RyaW5nPSBmZG9jLmdldChmaXJzdF9saW5lX3JlbGV2YW50X29mZnNldCwgZmlyc3RfbGluZV9yZWxldmFudF9sZW5ndGgpICsgIiAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X2xpbmVzX2xlbmd0aFswXT0gZWxlbWVudF9zdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpX2VsbD0gMTsgaV9lbGwgPCBlbGVtZW50X2xpbmVzX2xlbmd0aC5sZW5ndGg7IGlfZWxsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVnaW9uIGF0dHJfcj0gZmRvYy5nZXRMaW5lSW5mb3JtYXRpb24oaV9lbGwgKyBwcmV2bG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X2xpbmVzX2xlbmd0aFtpX2VsbF09IGZkb2MuZ2V0KGF0dHJfci5nZXRPZmZzZXQoKSwgYXR0cl9yLmdldExlbmd0aCgpKS5sZW5ndGgoKSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9zdHJpbmc9IGVsZW1lbnRfc3RyaW5nICsgZmRvYy5nZXQoYXR0cl9yLmdldE9mZnNldCgpLCBhdHRyX3IuZ2V0TGVuZ3RoKCkpICsgIiAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpX2F0dHI9IDA7IGlfYXR0ciA8IGxlbjsgaV9hdHRyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyX25hbWU9IGF0dHJzLmdldFFOYW1lKGlfYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cl92YWx1ZT0gYXR0cnMuZ2V0VmFsdWUoaV9hdHRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbmQgcmFuZ2Ugb2YgYXR0cmlidXRlIGluIGRvYzsgbWFudWFsbHkgcGFyc2VzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICogbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9xdW90ZXM9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY29uZF9xdW90ZXM9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkX2luZGV4PSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9xdW90ZXM9IGVsZW1lbnRfc3RyaW5nLmluZGV4T2YoIlwiIiwgc2Vjb25kX3F1b3RlcyArIDEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3F1b3Rlcz0gZWxlbWVudF9zdHJpbmcuaW5kZXhPZigiXCIiLCBmaXJzdF9xdW90ZXMgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0gZWxlbWVudF9zdHJpbmcuc3Vic3RyaW5nKGZpcnN0X3F1b3RlcyArIDEsIHNlY29uZF9xdW90ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZD0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoYXR0cl92YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRfaW5kZXg9IGVsZW1lbnRfc3RyaW5nLmxhc3RJbmRleE9mKGF0dHJfbmFtZSwgZmlyc3RfcXVvdGVzIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd3Jvbmc9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kX2VxdWFsPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaV9jaGFyPSBpZF9pbmRleCArIGF0dHJfbmFtZS5sZW5ndGgoKTsgaV9jaGFyIDwgZmlyc3RfcXVvdGVzICYmICF3cm9uZzsgaV9jaGFyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50X3N0cmluZy5jaGFyQXQoaV9jaGFyKSA9PSAnPScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZF9lcXVhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZXF1YWw9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZz0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGVsZW1lbnRfc3RyaW5nLmNoYXJBdChpX2NoYXIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZz0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdyb25nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQ9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy9pZF9pbmRleCBoYXMgb25lIGNoYXIgbWlzc2luZyBmb3IgZXZlcnkgbGluZSAodGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjcikKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX29mX2luZGV4PSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsaW5lX29mX2luZGV4PSAwOyBpZF9pbmRleCA+IGVsZW1lbnRfbGluZXNfbGVuZ3RoW2xpbmVfb2ZfaW5kZXhdIC0gMTsgbGluZV9vZl9pbmRleCsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkX2luZGV4LT0gKGVsZW1lbnRfbGluZXNfbGVuZ3RoW2xpbmVfb2ZfaW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lX29mX2luZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRfaW5kZXgrPSBjb2x1bW5fb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZjdXJyZW50UGFyZW50LmdldFBhcmVudCgpLmdldElkKCkuZXF1YWxzKFJPT1RfSUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfb2ZfaW5kZXgrPSBwcmV2bG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9vZl9pbmRleCs9IHByZXZsb2NhdG9yLmdldExpbmVOdW1iZXIoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2luZGV4IGF0IGxpbmUgbGluZV9vZl9pbmRleCwgbGluZSBvZmZzZXQgaWRfaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX29mX2VuZF9vZl92YWx1ZT0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRfb2ZfdmFsdWVfaW5kZXg9IHNlY29uZF9xdW90ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxpbmVfb2ZfZW5kX29mX3ZhbHVlPSAwOyBlbmRfb2ZfdmFsdWVfaW5kZXggPiBlbGVtZW50X2xpbmVzX2xlbmd0aFtsaW5lX29mX2VuZF9vZl92YWx1ZV0gLSAxOyBsaW5lX29mX2VuZF9vZl92YWx1ZSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl92YWx1ZV9pbmRleC09IChlbGVtZW50X2xpbmVzX2xlbmd0aFtsaW5lX29mX2VuZF9vZl92YWx1ZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVfb2ZfZW5kX29mX3ZhbHVlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX3ZhbHVlX2luZGV4Kz0gY29sdW1uX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmY3VycmVudFBhcmVudC5nZXRQYXJlbnQoKS5nZXRJZCgpLmVxdWFscyhST09UX0lEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX29mX2VuZF9vZl92YWx1ZSs9IHByZXZsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX29mX2VuZF9vZl92YWx1ZSs9IHByZXZsb2NhdG9yLmdldExpbmVOdW1iZXIoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2VuZCBvZiB2YWx1ZSBhdCBsaW5lIGxpbmVfb2ZfZW5kX29mX3ZhbHVlLCBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgZW5kX29mX3ZhbHVlX2luZGV4Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdHRyX3N0YXJ0X2RvY19vZmZzZXQ9IGZkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVfb2ZfaW5kZXgpLmdldE9mZnNldCgpICsgaWRfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2ludCBhdHRyX2xlbmd0aF9kb2Nfb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVfb2ZfdmFsdWUpLmdldE9mZnNldCgpK3ZhbHVlX2luZGV4K2F0dHJfdmFsdWUubGVuZ3RoKCkrMSsobGluZV9vZl9lbmRfb2ZfdmFsdWUtbGluZV9vZl9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYXR0cl9zdGFydF9kb2Nfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJfbGVuZ3RoX2RvY19vZmZzZXQ9IGZkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVfb2ZfZW5kX29mX3ZhbHVlKS5nZXRPZmZzZXQoKSArIGVuZF9vZl92YWx1ZV9pbmRleCArIDEgLSBhdHRyX3N0YXJ0X2RvY19vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudD0gbmV3IFhNTE5vZGUoVFlQRV9BVFRSSUJVVEUsIGF0dHJfbmFtZSwgYXR0cl92YWx1ZSwgKGZzaWduYXR1cmUgKyBhdHRyX25hbWUgKyBTSUdOX1NFUEFSQVRPUiArIFNJR05fQVRUUklCVVRFKSwgZmRvYywgYXR0cl9zdGFydF9kb2Nfb2Zmc2V0LCBhdHRyX2xlbmd0aF9kb2Nfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnNldE5hbWUoYXR0cl9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZjdXJyZW50UGFyZW50LmFkZENoaWxkKGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnNldFBhcmVudChmY3VycmVudFBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgYXR0cmlidXRlICIgKyBjdXJyZW50RWxlbWVudC5nZXRJZCgpICsgIiB3aXRoIHZhbHVlID4iICsgY3VycmVudEVsZW1lbnQuZ2V0VmFsdWUoKSArICI8IiArICIgdG8gZWxlbWVudCAiICsgZmN1cnJlbnRQYXJlbnQuZ2V0SWQoKSArICIgd2hpY2ggaGFzIHBhcmVudCAiICsgZmN1cnJlbnRQYXJlbnQuZ2V0UGFyZW50KCkuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJhZExvY2F0aW9uRXhjZXB0aW9uIGluIHN0YXJ0RWxlbWVudCguLi4pICIgKyBleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudD0gbmV3IFhNTENoaWxkcmVuKFRZUEVfRUxFTUVOVCwgcmF3ICsgIl8oIiArICgoWE1MQ2hpbGRyZW4pIGZjdXJyZW50UGFyZW50KS5jaGlsZHJlbiArICIpIiwgcmF3ICsgIl8oIiArICgoWE1MQ2hpbGRyZW4pIGZjdXJyZW50UGFyZW50KS5jaGlsZHJlbiArICIpIiwgKGZzaWduYXR1cmUgKyBTSUdOX0VMRU1FTlQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFhNTFN0cnVjdHVyZUNyZWF0b3IuREVCVUdfTU9ERSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF0IHRoZSBlbmQgb2Ygc3RhcnRFbGVtZW50KC4uLiksIGZjdXJyZW50UGFyZW50IGlzICIgKyBmY3VycmVudFBhcmVudC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJldmxvY2F0b3I9IG5ldyBMb2NhdG9ySW1wbChsb2NhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoYXJhY3RlcnMuICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgICAgIGlmICghaWdub3JlQm9kaWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8JCQlTdHJpbmcgY2hhcnMgPSAobmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCkpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhcnM9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhcmFjdGVyczogPiIgKyBjaGFycyArICI8Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQm9keSBMb2NhdGlvbjogbGluZSAiICsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiICBjb2x1bW4gIiArIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIC8vaWYgdGV4dCBjb250YWlucyBvbmx5IHdoaXRlIHNwYWNlLCBpdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgaWYgKCF0cmltV2hpdGVTcGFjZShjaGFycykuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBib2R5Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZWdpb24gcj0gZmRvYy5nZXRMaW5lSW5mb3JtYXRpb24obG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9jYXRpb24gcmV0dXJucyB0aGUgRU5EIG9mIHRoZSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAvL29mZnNldCBvZiBCRUdJTk5JTkcgb2YgY2hhcmFjdGVyczoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQ9IHIuZ2V0T2Zmc2V0KCkgKyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpIC0gMSAtIGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZjdXJyZW50UGFyZW50LmJvZGllcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJvZHlfdmFsdWU9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZSZW1vdmVXaGl0ZVNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keV92YWx1ZT0gcmVtb3ZlV2hpdGVTcGFjZShib2R5X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTE5vZGUgYm9keW5vZGU9IG5ldyBYTUxOb2RlKFRZUEVfVEVYVCwgImJvZHlfKCIgKyBmY3VycmVudFBhcmVudC5ib2RpZXMgKyAiKSIsIGJvZHlfdmFsdWUsIChmc2lnbmF0dXJlICsgU0lHTl9URVhUKSwgZmRvYywgb2Zmc2V0LCBsZW5ndGgpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlub2RlLnNldE5hbWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSAoezF9KSIsIG5ldyBTdHJpbmdbXSB7IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTFN0cnVjdHVyZUNyZWF0b3IuYm9keSIpLCBJbnRlZ2VyLnRvU3RyaW5nKGZjdXJyZW50UGFyZW50LmJvZGllcyl9KSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgZmN1cnJlbnRQYXJlbnQuYWRkQ2hpbGQoYm9keW5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9keW5vZGUuc2V0UGFyZW50KGZjdXJyZW50UGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGVkIGJvZHkgIiArIGZjdXJyZW50UGFyZW50LmJvZGllcyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBvZmZzZXQgIiArIG9mZnNldCArICIgYW5kIGxlbmd0aCAiICsgbGVuZ3RoIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggcGFyZW50ICIgKyBib2R5bm9kZS5nZXRQYXJlbnQoKS5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgLy9ib2RpZXMgYXMgaWQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcHNpZz0gZmN1cnJlbnRQYXJlbnQuZ2V0UGFyZW50KCkuZ2V0U2lnbmF0dXJlKCk7IC8vc2lnbmF0dXJlIG9mIHBhcmVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3BzaWc9IHBvcHNpZy5zdWJzdHJpbmcoMCwgcG9wc2lnLmxhc3RJbmRleE9mKFNJR05fRUxFTUVOVCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVXNlSWRNYXAoKSAmJiBmY3VycmVudFBhcmVudC5ib2RpZXMgPT0gMSAmJiBpZE1hcC5jb250YWluc0tleShwb3BzaWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBpZD0gZmN1cnJlbnRQYXJlbnQuZ2V0SWQoKTsvL2lkIG9mIHBhcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwZWxlbWVudG5hbWU9IHBpZC5zdWJzdHJpbmcoMCwgcGlkLmluZGV4T2YoIjwiKSk7IC8vbmFtZSBvZiBwYXJlbnQgZWxlbWVudCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBpZE1hcC5nZXQocG9wc2lnKSkuZXF1YWxzKElEX1RZUEVfQk9EWSArIHBlbGVtZW50bmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MTm9kZSBwb3A9IGZjdXJyZW50UGFyZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9waWQ9IHBvcC5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9wZWxlbWVudG5hbWU9IHBvcGlkLnN1YnN0cmluZygwLCBwb3BpZC5pbmRleE9mKCI8IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcC5zZXRJZChwb3BlbGVtZW50bmFtZSArICI8IiArIGJvZHlfdmFsdWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcC5zZXRPcmlnSWQocG9wZWxlbWVudG5hbWUgKyAiPCIgKyBib2R5X3ZhbHVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Auc2V0TmFtZShNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9IFt7MX09ezJ9XSIsIG5ldyBTdHJpbmdbXSB7IHBvcGVsZW1lbnRuYW1lLCBwZWxlbWVudG5hbWUsIGJvZHlfdmFsdWV9KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wLnNldFVzZXNJRE1BUCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmFkTG9jYXRpb25FeGNlcHRpb24gaW4gY2hhcmFjdGVycyguLi4pICIgKyBleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZjdXJyZW50UGFyZW50LmFkZENoaWxkKG5ldyBYTUxOb2RlKFRZUEVfVEVYVCwgImJvZHlfKCIgKyBmY3VycmVudFBhcmVudC5ib2RpZXMgKyAiKSIsIG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpLCAoZnNpZ25hdHVyZSArIFNJR05fVEVYVCksIGZkb2MsIDAsIDApKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2bG9jYXRvcj0gbmV3IExvY2F0b3JJbXBsKGxvY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWdub3JhYmxlIHdoaXRlc3BhY2UuICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLy8vIGNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAgICAgLy8vLyBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcHJldmxvY2F0b3I9IG5ldyBMb2NhdG9ySW1wbChsb2NhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEVuZCBlbGVtZW50LiAqLwotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbCwgU3RyaW5nIHJhdykgewotICAgICAgICAgICAgaWYgKFhNTFN0cnVjdHVyZUNyZWF0b3IuREVCVUdfTU9ERSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuRXhpdGluZyBlbGVtZW50ICIgKyBmY3VycmVudFBhcmVudC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicHJldmxvY2F0b3I6IGxpbmUgIiArIHByZXZsb2NhdG9yLmdldExpbmVOdW1iZXIoKSArICIgIGNvbHVtbiAiICsgcHJldmxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiICBpZCAiICsgcHJldmxvY2F0b3IuZ2V0UHVibGljSWQoKSk7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYXRvcjogbGluZSAiICsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiICBjb2x1bW4gIiArIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiICBpZCAiICsgbG9jYXRvci5nZXRQdWJsaWNJZCgpKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgaWYgKGZjdXJyZW50UGFyZW50LmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUmVnaW9uIHIyPSBmZG9jLmdldExpbmVJbmZvcm1hdGlvbihsb2NhdG9yLmdldExpbmVOdW1iZXIoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbiBwb3M9IGZjdXJyZW50UGFyZW50LmdldFJhbmdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGVsZW1fbGVuZ3RoPSByMi5nZXRPZmZzZXQoKSArIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkgLSAxIC0gcG9zLmdldE9mZnNldCgpOy8vbGVuZ3RoIG9mIGVsZW1lbnQgZnJvbQotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB0YWcgdG8gZW5kIHRhZwotICAgICAgICAgICAgICAgICAgICBmY3VycmVudFBhcmVudC5zZXRMZW5ndGgoZWxlbV9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwb3MuZ2V0T2Zmc2V0OiAiICsgcG9zLmdldE9mZnNldCgpICsgIiAgZWxlbV9sZW5ndGg6ICIgKyBlbGVtX2xlbmd0aCk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmZG9jLmdldChwb3MuZ2V0T2Zmc2V0KCkrZWxlbV9sZW5ndGgtNSw0KTogPiIgKyBmZG9jLmdldChwb3MuZ2V0T2Zmc2V0KCkgKyBlbGVtX2xlbmd0aCAtIDUsIDQpICsgIjwiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgKGZkb2MuZ2V0KHBvcy5nZXRPZmZzZXQoKStlbGVtX2xlbmd0aC0yLDEpICE9ICI+IikKLSAgICAgICAgICAgICAgICAgICAgLy8gZWxlbV9sZW5ndGgtPTE7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmY3VycmVudFBhcmVudC5zZXRWYWx1ZShmZG9jLmdldChwb3MuZ2V0T2Zmc2V0KCksIGVsZW1fbGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjdXJyZW50UGFyZW50LnNldFZhbHVlKGZkb2MuZ2V0KHBvcy5nZXRPZmZzZXQoKSwgZWxlbV9sZW5ndGggLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmFkTG9jYXRpb25FeGNlcHRpb24gaW4gZW5kRWxlbWVudCguLi4pIHdoaWxlIGF0dGVtcHRpbmcgZmN1cnJlbnRQYXJlbnQuc2V0VmFsdWUoLi4uKTogIiArIGV4KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dGVtcHQgdG8gY29ycmVjdCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBmYWlsZWQ6ICIgKyBleDIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbHVlIG9mICIgKyBmY3VycmVudFBhcmVudC5nZXRJZCgpICsgIiAgaXMgPiIgKyBmY3VycmVudFBhcmVudC5nZXRWYWx1ZSgpICsgIjwiKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgICAgICAvL2dvaW5nIGZyb20gZW5kaW5nIGVsZW1lbnQgdG8gcGFyZW50IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgZmN1cnJlbnRQYXJlbnQ9IGZjdXJyZW50UGFyZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmY3VycmVudFBhcmVudCA9IGZjdXJyZW50UGFyZW50LmdldFBhcmVudCgpOyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFhNTFN0cnVjdHVyZUNyZWF0b3IuREVCVUdfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCYWRMb2NhdGlvbkV4Y2VwdGlvbiBpbiBlbmRFbGVtZW50KC4uLik6ICIgKyBleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmN1cnJlbnRQYXJlbnQuZ2V0SWQoKTogIiArIGZjdXJyZW50UGFyZW50LmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IENhbm5vdCByZWFjaCBQYXJlbnQgb2YgUGFyZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmY3VycmVudFBhcmVudCBpcyBub3cgIiArIGZjdXJyZW50UGFyZW50LmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIHByZXZsb2NhdG9yPSBuZXcgTG9jYXRvckltcGwobG9jYXRvcik7Ci0gICAgICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2lnbmF0dXJlIGJlZm9yZSBjdXR0aW5nOiAiICsgZnNpZ25hdHVyZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGludCBzc2k9IGZzaWduYXR1cmUubGFzdEluZGV4T2YoU0lHTl9TRVBBUkFUT1IpOy8vZnNpZ25hdHVyZQotICAgICAgICAgICAgLy8gc2VwYXJhdG9yIGluZGV4Ci0gICAgICAgICAgICBzc2k9IGZzaWduYXR1cmUubGFzdEluZGV4T2YoU0lHTl9TRVBBUkFUT1IsIHNzaSAtIDEpOy8vc2Vjb25kLWxhc3QKLSAgICAgICAgICAgIC8vICIuIiwgZS5nLiBpbgotICAgICAgICAgICAgLy8gcm9vdC5hLmIuIHRvCi0gICAgICAgICAgICAvLyBvYnRhaW4KLSAgICAgICAgICAgIC8vIHJvb3QuYS4KLSAgICAgICAgICAgIGZzaWduYXR1cmU9IGZzaWduYXR1cmUuc3Vic3RyaW5nKDAsIHNzaSArIDEpOwotICAgICAgICAgICAgaWYgKFhNTFN0cnVjdHVyZUNyZWF0b3IuREVCVUdfTU9ERSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNpZ25hdHVyZSBhZnRlciBjdXR0aW5nOiAiICsgZnNpZ25hdHVyZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEVycm9ySGFuZGxlciBtZXRob2RzCi0gICAgICAgIC8vCi0KLSAgICAgICAgLyogV2FybmluZy4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbV2FybmluZ10gIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEVycm9yLiAqLwotICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbRXJyb3JdICIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uU3RyaW5nKGV4KSArICI6ICIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGYXRhbCBlcnJvci4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltGYXRhbCBFcnJvcl0gIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGV4KTsKLSAgICAgICAgICAgIC8vdGhyb3cgZXg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBsb2NhdGlvbi4gKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzdHI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkPSBleC5nZXRTeXN0ZW1JZCgpOwotICAgICAgICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXg9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZD0gc3lzdGVtSWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZChzeXN0ZW1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKGV4LmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKGV4LmdldENvbHVtbk51bWJlcigpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MU3RydWN0dXJlQ3JlYXRvcigpIHsKLSAgICAgICAgLy9zZXQgZGVmYXVsdCBpZG1hcAotICAgICAgICBmSWRNYXBUb1VzZT0gREVGQVVMVF9JRE1BUDsKLSAgICAgICAgZlVzZUlkTWFwPSBmYWxzZTsKLSAgICAgICAgWE1MUGx1Z2luIHBsdWdpbj0gWE1MUGx1Z2luLmdldERlZmF1bHQoKTsKLSAgICAgICAgLy9pZiBzdGF0ZW1lbnQgcmVxdWlyZWQgZm9yIHRlc3RzCi0gICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgZklkTWFwcz0gcGx1Z2luLmdldElkTWFwcygpOwotICAgICAgICAgICAgZklkTWFwc0ludGVybmFsPSBwbHVnaW4uZ2V0SWRNYXBzSW50ZXJuYWwoKTsKLSAgICAgICAgICAgIGZJZEV4dGVuc2lvblRvTmFtZT0gcGx1Z2luLmdldElkRXh0ZW5zaW9uVG9OYW1lKCk7Ci0gICAgICAgICAgICBmT3JkZXJlZEVsZW1lbnRzPSBwbHVnaW4uZ2V0T3JkZXJlZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWw9IHBsdWdpbi5nZXRPcmRlcmVkRWxlbWVudHNJbnRlcm5hbCgpOwotICAgICAgICB9Ci0gICAgICAgIGZSZW1vdmVXaGl0ZVNwYWNlPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgdGl0bGUgd2lsbCBiZSBzaG93biBpbiB0aGUgdGl0bGUgYmFyIG9mIHRoZSBzdHJ1Y3R1cmUgY29tcGFyZSBwYW5lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfTkFNRTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldCBGaWxlIGV4dGVuc2lvbiBvZiB0aGUgcGFyc2VkIGZpbGUuIFRoaXMgZXh0ZW5zaW9uIHdpbGwgYmUgdXNlZCB0byBjaG9vc2UgYW4gSWQgTWFwIHNjaGVtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlRXh0ZW5zaW9uKFN0cmluZyBleHQpIHsKLSAgICAgICAgZkZpbGVFeHQ9IGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBJZCBNYXBwaW5ncyBmb3IgdGhlIElkIE1hcHBpbmcgU2NoZW1lIGFuZCB0aGUgT3JkZXJlZCBFbGVtZW50cwotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBnZXRTdHJ1Y3R1cmUoT2JqZWN0KSBpcyBjYWxsZWQgb24gdGhlIHR3by90aHJlZSBpbnB1dHMgb2YgdGhlIGNvbXBhcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0SWRNYXBzKCkgewotICAgICAgICBpZiAoZkZpcnN0Q2FsbCAmJiBmRmlsZUV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmRmlyc3RDYWxsPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlRXh0TG93ZXI9IGZGaWxlRXh0LnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAoZklkRXh0ZW5zaW9uVG9OYW1lLmNvbnRhaW5zS2V5KGZpbGVFeHRMb3dlcikpCi0gICAgICAgICAgICAgICAgc2V0SWRNYXAoKFN0cmluZykgZklkRXh0ZW5zaW9uVG9OYW1lLmdldChmaWxlRXh0TG93ZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFVzZUlkTWFwKCk7Ci0gICAgICAgIGZPcmRlcmVkPSBudWxsOwotICAgICAgICBpZiAoIWlzVXNlSWRNYXAoKSkKLSAgICAgICAgICAgIGlkTWFwPSBudWxsOwotICAgICAgICBlbHNlIGlmIChmSWRNYXBzLmNvbnRhaW5zS2V5KGZJZE1hcFRvVXNlKSkgewotICAgICAgICAgICAgaWRNYXA9IChIYXNoTWFwKSBmSWRNYXBzLmdldChmSWRNYXBUb1VzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZklkTWFwc0ludGVybmFsLmNvbnRhaW5zS2V5KGZJZE1hcFRvVXNlKSkgewotICAgICAgICAgICAgaWRNYXA9IChIYXNoTWFwKSBmSWRNYXBzSW50ZXJuYWwuZ2V0KGZJZE1hcFRvVXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmT3JkZXJlZEVsZW1lbnRzICE9IG51bGwpCi0gICAgICAgICAgICBmT3JkZXJlZD0gKEFycmF5TGlzdCkgZk9yZGVyZWRFbGVtZW50cy5nZXQoZklkTWFwVG9Vc2UpOwotICAgICAgICBpZiAoZk9yZGVyZWQgPT0gbnVsbCAmJiBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWwgIT0gbnVsbCkKLSAgICAgICAgICAgIGZPcmRlcmVkPSAoQXJyYXlMaXN0KSBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWwuZ2V0KGZJZE1hcFRvVXNlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIFhNTCBwYXJzZSB0cmVlIG9mIHRoZSBpbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0cnVjdHVyZUNvbXBhcmF0b3IgZ2V0U3RydWN0dXJlKE9iamVjdCBpbnB1dCkgewotICAgICAgICBpZiAoWE1MU3RydWN0dXJlQ3JlYXRvci5ERUJVR19NT0RFKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBwYXJzZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBJU3RyZWFtQ29udGVudEFjY2Vzc29yKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIElTdHJlYW1Db250ZW50QWNjZXNzb3Igc2NhPSAoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcikgaW5wdXQ7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIElucHV0IHBhcnNlZCB3aXRoIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc2NhLmdldENvbnRlbnRzKSk7CQotCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudHM9IHJlYWRTdHJpbmcoc2NhKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRlbnRzPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZmRvYz0gbmV3IERvY3VtZW50KGNvbnRlbnRzKTsKLQotICAgICAgICAgICAgZnNpZ25hdHVyZT0gUk9PVF9JRCArIFNJR05fU0VQQVJBVE9SOwotICAgICAgICAgICAgWE1MQ2hpbGRyZW4gcm9vdD0gbmV3IFhNTENoaWxkcmVuKFRZUEVfRUxFTUVOVCwgUk9PVF9JRCwgIiIsIChmc2lnbmF0dXJlICsgU0lHTl9FTEVNRU5UKSwgZmRvYywgMCwgZmRvYy5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGZjdXJyZW50UGFyZW50PSByb290OwotCi0gICAgICAgICAgICBYTUxIYW5kbGVyIGhhbmRsZXI9IG5ldyBYTUxIYW5kbGVyKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAJLyogb3JpZ2luYWwgeGVyY2VzIGNvZGUKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIAlTQVhQYXJzZXIgcGFyc2VyID0gKFNBWFBhcnNlcilDbGFzcy5mb3JOYW1lKHBhcnNlck5hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAJKi8KLSAgICAgICAgICAgICAgICAvLwkJCQlYTUxSZWFkZXIgcGFyc2VyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIocGFyc2VyTmFtZSk7Ci0gICAgICAgICAgICAgICAgLy8JCQkJCi0gICAgICAgICAgICAgICAgLy8JICAgICAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIHNldFZhbGlkYXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgLy8gICAgCSAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHNldE5hbWVTcGFjZXMgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC8vICAgIAkgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgLy8gICAgCSAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWV4dGVybmFsLWR0ZCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC8vICAgICAgICAJICAgIHBhcnNlci5zZXRGZWF0dXJlKCAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiwgc2V0U2NoZW1hU3VwcG9ydCApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgLy8JICAgICAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEtZnVsbC1jaGVja2luZyIsIHNldFNjaGVtYUZ1bGxTdXBwb3J0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC8vCSAgICAgICAgICAgCSovCi0gICAgICAgICAgICAgICAgLy8JICAgICAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIC8vCSAgICAgICAgICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgLy8JICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8JICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShzY2EuZ2V0Q29udGVudHMoKSkpOwotCi0gICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5PSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihjb250ZW50cykpLCBoYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChYTUxTdHJ1Y3R1cmVDcmVhdG9yLkRFQlVHX01PREUpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5kIG9mIHBhcnNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBYTUxQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihYTUxQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwiRXJyb3IgaW4gWE1MIHBhcnNlciIsIkFuIGVycm9yIG9jY3VyZWQgaW4gdGhlIFhNTCBwYXJzZXIuXG5ObyBzdHJ1Y3R1cmVkIGNvbXBhcmUgY2FuIGJlIHNob3duIik7Ci0gICAgICAgICAgICAgICAgWE1MUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb290OwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBYTUxQbHVnaW4ubG9nKGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5TYXZlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZXdyaXRlVHJlZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJld3JpdGVUcmVlKERpZmZlcmVuY2VyIGRpZmZlcmVuY2VyLCBJRGlmZkNvbnRhaW5lciByb290KSB7Ci0gICAgCQkvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShJU3RydWN0dXJlQ29tcGFyYXRvciBzdHJ1Y3R1cmUsIE9iamVjdCBpbnB1dCkgewotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50ICYmIHN0cnVjdHVyZSBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLSAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudD0gKChYTUxOb2RlKSBzdHJ1Y3R1cmUpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBJRWRpdGFibGVDb250ZW50IGJjYT0gKElFZGl0YWJsZUNvbnRlbnQpIGlucHV0OwotCQkJU3RyaW5nIGNvbnRlbnRzPSBkb2N1bWVudC5nZXQoKTsKLQkJCVN0cmluZyBlbmNvZGluZz0gbnVsbDsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZW5jb2Rpbmc9ICgoSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IpaW5wdXQpLmdldENoYXJzZXQoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJCWlmIChlbmNvZGluZyA9PSBudWxsKQotCQkJCWVuY29kaW5nPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJICAgIGJjYS5zZXRDb250ZW50KGNvbnRlbnRzLmdldEJ5dGVzKGVuY29kaW5nKSk7Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCSAgICBiY2Euc2V0Q29udGVudChjb250ZW50cy5nZXRCeXRlcygpKTsJCi0JCQl9Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKE9iamVjdCBub2RlLCBib29sZWFuIGlnbm9yZVdoaXRlc3BhY2UpIHsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcz0gKChYTUxOb2RlKSBub2RlKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGlnbm9yZVdoaXRlc3BhY2UpCi0gICAgICAgICAgICAgICAgcz0gcy50cmltKCk7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0cnVjdHVyZUNvbXBhcmF0b3IgbG9jYXRlKE9iamVjdCBwYXRoLCBPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcmVhZFN0cmluZyhJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzPSBzYS5nZXRDb250ZW50cygpOwotICAgICAgICBTdHJpbmcgZW5jb2Rpbmc9IG51bGw7Ci0gICAgICAgIGlmIChzYSBpbnN0YW5jZW9mIElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKQotICAgICAgICAgICAgZW5jb2Rpbmc9ICgoSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IpIHNhKS5nZXRDaGFyc2V0KCk7Ci0gICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgZW5jb2Rpbmc9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoaXMsIGVuY29kaW5nKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgbnVsbCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFN0cmluZyhJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcj0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGNoYXJbXSBwYXJ0PSBuZXcgY2hhclsyMDQ4XTsKLSAgICAgICAgICAgIGludCByZWFkPSAwOwotICAgICAgICAgICAgcmVhZGVyPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBlbmNvZGluZykpOwotCi0gICAgICAgICAgICB3aGlsZSAoKHJlYWQ9IHJlYWRlci5yZWFkKHBhcnQpKSAhPSAtMSkKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHBhcnQsIDAsIHJlYWQpOwotCi0gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIE5lZWRXb3JrCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzIHNvcnRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cnMpIHsKLQotICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLSAgICAgICAgaW50IGxlbj0gKGF0dHJzICE9IG51bGwpID8gYXR0cnMuZ2V0TGVuZ3RoKCkgOiAwOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lPSBhdHRycy5nZXRRTmFtZShpKTsKLSAgICAgICAgICAgIGludCBjb3VudD0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBqPSAwOwotICAgICAgICAgICAgd2hpbGUgKGogPCBjb3VudCkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLmNvbXBhcmVUbyhhdHRyaWJ1dGVzLmdldFFOYW1lKGopKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuaW5zZXJ0QXR0cmlidXRlQXQoaiwgbmFtZSwgYXR0cnMuZ2V0VHlwZShpKSwgYXR0cnMuZ2V0VmFsdWUoaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZE1hcChTdHJpbmcgaWRtYXBfbmFtZSkgewotICAgICAgICBmSWRNYXBUb1VzZT0gaWRtYXBfbmFtZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIElkTWFwIFNjaGVtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzZXQgaWRzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRNYXAoKSB7Ci0gICAgICAgIHJldHVybiBmSWRNYXBUb1VzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VJZE1hcCgpIHsKLSAgICAgICAgaWYgKGZJZE1hcHMgIT0gbnVsbCAmJiBmSWRNYXBzSW50ZXJuYWwgIT0gbnVsbCkKLSAgICAgICAgICAgIGZVc2VJZE1hcD0gZklkTWFwcy5jb250YWluc0tleShmSWRNYXBUb1VzZSkgfHwgZklkTWFwc0ludGVybmFsLmNvbnRhaW5zS2V5KGZJZE1hcFRvVXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZUlkTWFwKCkgewotICAgICAgICByZXR1cm4gZlVzZUlkTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUlkTWFwcygpIHsKLSAgICAgICAgZklkTWFwcz0gWE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZE1hcHMoKTsKLSAgICAgICAgZk9yZGVyZWRFbGVtZW50cz0gWE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRPcmRlcmVkRWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlU3BhY2UoY2hhciBjKSB7Ci0gICAgICAgIHJldHVybiBjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICcgJzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2UoU3RyaW5nIHN0cikgewotICAgICAgICBzdHI9IHRyaW1XaGl0ZVNwYWNlKHN0cik7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXRTdHI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IHN0YXJ0PSAwLCBlbmQ9IDA7Ci0gICAgICAgIG91dGVyX3doaWxlOiB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgd2hpbGUgKGVuZCA8IHN0ci5sZW5ndGgoKSAmJiAhaXNXaGl0ZVNwYWNlKHN0ci5jaGFyQXQoZW5kKSkpIHsKLSAgICAgICAgICAgICAgICBlbmQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdHIubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXJfd2hpbGU7Ci0gICAgICAgICAgICBpZiAoc3RhcnQgIT0gMCkKLSAgICAgICAgICAgICAgICByZXRTdHIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICByZXRTdHIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwotICAgICAgICAgICAgZW5kKys7Ci0gICAgICAgICAgICB3aGlsZSAoZW5kIDwgc3RyLmxlbmd0aCgpICYmIGlzV2hpdGVTcGFjZShzdHIuY2hhckF0KGVuZCkpKSB7Ci0gICAgICAgICAgICAgICAgZW5kKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydD0gZW5kOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXRTdHIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRyaW1XaGl0ZVNwYWNlKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaW50IHN0YXJ0PSAwLCBlbmQ9IHN0ci5sZW5ndGgoKSAtIDE7Ci0gICAgICAgIHdoaWxlIChzdGFydCA8IHN0ci5sZW5ndGgoKSAmJiBpc1doaXRlU3BhY2Uoc3RyLmNoYXJBdChzdGFydCkpKSB7Ci0gICAgICAgICAgICBzdGFydCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGFydCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2hpbGUgKGVuZCA+PSAwICYmIGlzV2hpdGVTcGFjZShzdHIuY2hhckF0KGVuZCkpKSB7Ci0gICAgICAgICAgICBlbmQtLTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kICsgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlV2hpdGVTcGFjZShib29sZWFuIHJlbW92ZVdoaXRlU3BhY2UpIHsKLSAgICAgICAgZlJlbW92ZVdoaXRlU3BhY2U9IHJlbW92ZVdoaXRlU3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVtb3ZlV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZSZW1vdmVXaGl0ZVNwYWNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxTdHJ1Y3R1cmVWaWV3ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxTdHJ1Y3R1cmVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhOGNiYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvWE1MU3RydWN0dXJlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuRGlmZk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5JQ29tcGFyZUlucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSVN0cnVjdHVyZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5TdHJ1Y3R1cmVEaWZmVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEFuIFhNTCBkaWZmIHRyZWUgdmlld2VyIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIDxjb2RlPklTdHJ1Y3R1cmVDcmVhdG9yPC9jb2RlPgotICogdG8gcmV0cmlldmUgYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGZyb20gdGhlIGlucHV0IG9iamVjdCAoYW4gPGNvZGU+SUNvbXBhcmVJbnB1dDwvY29kZT4pCi0gKiBhbmQgcGVyZm9ybSBhIHR3by13YXkgb3IgdGhyZWUtd2F5IGNvbXBhcmUgb24gaXQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZQotICogdGhpcyBwYWNrYWdlLgotICogPC9wPgotICoKLSAqIEBzZWUgSUNvbXBhcmVJbnB1dAotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlVmlld2VyIGV4dGVuZHMgU3RydWN0dXJlRGlmZlZpZXdlciB7Ci0KLQlwcml2YXRlIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lIGZQYXJlbnQ7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZklkTWFwc0ludGVybmFsOwotCXByaXZhdGUgSGFzaE1hcCBmSWRNYXBzOwotCXByaXZhdGUgSGFzaE1hcCBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZPcmRlcmVkRWxlbWVudHM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lHTl9TRVBBUkFUT1I9Ci0JCVhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1I7Ci0KLQljbGFzcyBYTUxTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JCUFycmF5TGlzdCBmT3JkZXJlZDsKLQkJYm9vbGVhbiBmQWx3YXlzT3JkZXJTb3J0OwotCi0JCXB1YmxpYyBYTUxTb3J0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJZkFsd2F5c09yZGVyU29ydD0gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRPcmRlcmVkKEFycmF5TGlzdCBvcmRlcmVkKSB7Ci0JCQlmT3JkZXJlZD0gb3JkZXJlZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFsd2F5c09yZGVyU29ydChib29sZWFuIGFsd2F5c09yZGVyU29ydCkgewotCQkJZkFsd2F5c09yZGVyU29ydD0gYWx3YXlzT3JkZXJTb3J0OwotCQl9Ci0KLQkJcHVibGljIGludCBjYXRlZ29yeShPYmplY3Qgbm9kZSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBEaWZmTm9kZSkgewotCQkJCU9iamVjdCBvPSAoKERpZmZOb2RlKSBub2RlKS5nZXRJZCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJCQlTdHJpbmcgeG1sVHlwZT0gKChYTUxOb2RlKSBvKS5nZXRYTUxUeXBlKCk7Ci0JCQkJCWlmICh4bWxUeXBlLmVxdWFscyhYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfQVRUUklCVVRFKSkKLQkJCQkJCXJldHVybiAxOwotCQkJCQlpZiAoeG1sVHlwZS5lcXVhbHMoWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0VMRU1FTlQpKQotCQkJCQkJcmV0dXJuIDI7Ci0JCQkJCWlmICh4bWxUeXBlLmVxdWFscyhYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfVEVYVCkpCi0JCQkJCQlyZXR1cm4gMjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJCWlmICgoZk9yZGVyZWQgIT0gbnVsbCB8fCBmQWx3YXlzT3JkZXJTb3J0KQotCQkJCSYmIGVsZW1lbnRzICE9IG51bGwKLQkJCQkmJiBlbGVtZW50cy5sZW5ndGggPiAwCi0JCQkJJiYgZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBEaWZmTm9kZSkgewotCQkJCU9iamVjdCBvPSAoKERpZmZOb2RlKSBlbGVtZW50c1swXSkuZ2V0SWQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLQkJCQkJWE1MTm9kZSBwYXJlbnQ9ICgoWE1MTm9kZSkgbykuZ2V0UGFyZW50KCk7Ci0JCQkJCVN0cmluZyBzaWc9IHBhcmVudC5nZXRTaWduYXR1cmUoKTsKLQkJCQkJaWYgKHNpZy5lbmRzV2l0aChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fRUxFTUVOVCkpIHsKLQkJCQkJCVN0cmluZyBuZXdTaWc9Ci0JCQkJCQkJc2lnLnN1YnN0cmluZygKLQkJCQkJCQkJMCwKLQkJCQkJCQkJc2lnLmxlbmd0aCgpCi0JCQkJCQkJCQktIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5ULmxlbmd0aCgpKTsKLQkJCQkJCWlmIChmQWx3YXlzT3JkZXJTb3J0IHx8IGZPcmRlcmVkLmNvbnRhaW5zKG5ld1NpZykpIHsKLQkJCQkJCQlmaW5hbCBBcnJheUxpc3Qgb3JpZ2luYWxUcmVlPQotCQkJCQkJCQluZXcgQXJyYXlMaXN0KAotCQkJCQkJCQkJQXJyYXlzLmFzTGlzdChwYXJlbnQuZ2V0Q2hpbGRyZW4oKSkpOwotCQkJCQkJCUFycmF5cy5zb3J0KGVsZW1lbnRzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCQkJCQkJcmV0dXJuIFhNTFNvcnRlci50aGlzLmNvbXBhcmUoCi0JCQkJCQkJCQkJKERpZmZOb2RlKSBhLAotCQkJCQkJCQkJCShEaWZmTm9kZSkgYiwKLQkJCQkJCQkJCQlvcmlnaW5hbFRyZWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuc29ydCh2aWV3ZXIsIGVsZW1lbnRzKTsKLQkJfQotCi0JCXByaXZhdGUgaW50IGNvbXBhcmUoRGlmZk5vZGUgYSwgRGlmZk5vZGUgYiwgQXJyYXlMaXN0IG9yaWdpbmFsVHJlZSkgewotCi0JCQlpbnQgaW5kZXhfYT0gb3JpZ2luYWxUcmVlLmluZGV4T2YoYS5nZXRJZCgpKTsKLQkJCWludCBpbmRleF9iPSBvcmlnaW5hbFRyZWUuaW5kZXhPZihiLmdldElkKCkpOwotCQkJaWYgKGluZGV4X2EgPCBpbmRleF9iKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB2aWV3ZXIgZm9yIHRoZSBnaXZlbiBTV1QgdHJlZSBjb250cm9sIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHBhcmFtIHRyZWUgdGhlIHRyZWUgY29udHJvbAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZpZXdlcgotCSAqLwotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVWaWV3ZXIoVHJlZSB0cmVlLCBDb21wYXJlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKHRyZWUsIGNvbmZpZ3VyYXRpb24pOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB2aWV3ZXIgdW5kZXIgdGhlIGdpdmVuIFNXVCBwYXJlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTV1QgY29udHJvbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZpZXdlcgotCSAqLwotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVWaWV3ZXIoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUNvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBjb25maWd1cmF0aW9uKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbXBhcmVWaWV3ZXJTd2l0Y2hpbmdQYW5lKSB7Ci0JCQlmUGFyZW50PSAoQ29tcGFyZVZpZXdlclN3aXRjaGluZ1BhbmUpIHBhcmVudDsKLQkJfQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXNldFN0cnVjdHVyZUNyZWF0b3IobmV3IFhNTFN0cnVjdHVyZUNyZWF0b3IoKSk7Ci0JCVhNTFBsdWdpbiBwbHVnaW49IFhNTFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJcGx1Z2luLmdldFZpZXdlcnMoKS5hZGQodGhpcyk7Ci0KLQkJZklkTWFwcz0gcGx1Z2luLmdldElkTWFwcygpOwotCQlmSWRNYXBzSW50ZXJuYWw9IHBsdWdpbi5nZXRJZE1hcHNJbnRlcm5hbCgpOwotCQlmT3JkZXJlZEVsZW1lbnRzPSBwbHVnaW4uZ2V0T3JkZXJlZEVsZW1lbnRzKCk7Ci0JCWZPcmRlcmVkRWxlbWVudHNJbnRlcm5hbD0gcGx1Z2luLmdldE9yZGVyZWRFbGVtZW50c0ludGVybmFsKCk7Ci0KLQkJWE1MU29ydGVyIHNvcnRlcj0gbmV3IFhNTFNvcnRlcigpOwotCQlzZXRTb3J0ZXIoc29ydGVyKTsKLQotCX0KLQotCXByb3RlY3RlZCBYTUxTdHJ1Y3R1cmVDcmVhdG9yIGdldFhNTFN0cnVjdHVyZUNyZWF0b3IoKSB7Ci0JCXJldHVybiAoWE1MU3RydWN0dXJlQ3JlYXRvcikgZ2V0U3RydWN0dXJlQ3JlYXRvcigpOwotCX0KLQotCS8qIChub24gSmF2YWRvYykKLQkgKiBPdmVycmlkZGVuIHRvIHVucmVnaXN0ZXIgYWxsIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKERpc3Bvc2VFdmVudCBldmVudCkgewotCi0JCVhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Vmlld2VycygpLnJlbW92ZSh0aGlzKTsKLQotCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQl9Ci0KLQkvKgotCSAqIFJlY3JlYXRlcyB0aGUgY29tcGFyYWJsZSBzdHJ1Y3R1cmVzIGZvciB0aGUgaW5wdXQgc2lkZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcGFyZUlucHV0Q2hhbmdlZChJQ29tcGFyZUlucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlJVHlwZWRFbGVtZW50IHQ9IGlucHV0LmdldExlZnQoKTsKLQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbj0gdC5nZXRUeXBlKCk7Ci0JCQkJZ2V0WE1MU3RydWN0dXJlQ3JlYXRvcigpLnNldEZpbGVFeHRlbnNpb24oZmlsZUV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuaW5pdElkTWFwcygpOwotCQlzdXBlci5jb21wYXJlSW5wdXRDaGFuZ2VkKGlucHV0KTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBmUGFyZW50LmdldFRpdGxlQXJndW1lbnQoKSA9PSBudWxsKQotCQkJYXBwZW5kVG9UaXRsZShnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuZ2V0SWRNYXAoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+ZGlmZjwvY29kZT4gd2hlbmV2ZXIgdGhlIGJ5dGUgY29udGVudHMgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsKLQkJZklkTWFwcz0gWE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZE1hcHMoKTsKLQkJZk9yZGVyZWRFbGVtZW50cz0gWE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRPcmRlcmVkRWxlbWVudHMoKTsKLQkJZ2V0WE1MU3RydWN0dXJlQ3JlYXRvcigpLnVwZGF0ZUlkTWFwcygpOwotCQlpZiAoaXNJZE1hcFJlbW92ZWQoKSkgewotCQkJZ2V0WE1MU3RydWN0dXJlQ3JlYXRvcigpLnNldElkTWFwKAotCQkJCVhNTFN0cnVjdHVyZUNyZWF0b3IuREVGQVVMVF9JRE1BUCk7Ci0JCX0KLQotCQlnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuaW5pdElkTWFwcygpOwotCi0JCWNvbnRlbnRDaGFuZ2VkKG51bGwpOwotCi0JCWlmIChmUGFyZW50LmdldFRpdGxlQXJndW1lbnQoKSA9PSBudWxsKQotCQkJYXBwZW5kVG9UaXRsZShnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuZ2V0SWRNYXAoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldE1hdGNoaW5nUnVubmFibGUoCi0JCWZpbmFsIFhNTE5vZGUgbGVmdCwKLQkJZmluYWwgWE1MTm9kZSByaWdodCwKLQkJZmluYWwgWE1MTm9kZSBhbmNlc3RvcikgewotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzCi0JCQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uLAotCQkJCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQltb25pdG9yPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCX0KLQkJCQlpbnQgdG90YWxXb3JrOwotCQkJCWlmIChhbmNlc3RvciAhPSBudWxsKQotCQkJCQl0b3RhbFdvcms9IDE7Ci0JCQkJZWxzZQotCQkJCQl0b3RhbFdvcms9IDM7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soWE1MQ29tcGFyZU1lc3NhZ2VzLmdldFN0cmluZygiWE1MU3RydWN0dXJlVmlld2VyLm1hdGNoaW5nLmJlZ2luVGFzayIpLCB0b3RhbFdvcmspOyAvLyROT04tTkxTLTEkCi0JCQkJQXJyYXlMaXN0IG9yZGVyZWQ9IG51bGw7Ci0JCQkJaWYgKCFnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkKLQkJCQkJLmdldElkTWFwKCkKLQkJCQkJLmVxdWFscyhYTUxTdHJ1Y3R1cmVDcmVhdG9yLlVTRV9VTk9SREVSRUQpCi0JCQkJCSYmICFnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuZ2V0SWRNYXAoKS5lcXVhbHMoCi0JCQkJCQlYTUxTdHJ1Y3R1cmVDcmVhdG9yLlVTRV9PUkRFUkVEKSkgewotCQkJCQlvcmRlcmVkPQotCQkJCQkJKEFycmF5TGlzdCkgZk9yZGVyZWRFbGVtZW50cy5nZXQoCi0JCQkJCQkJZ2V0WE1MU3RydWN0dXJlQ3JlYXRvcigpLmdldElkTWFwKCkpOwotCQkJCQlpZiAob3JkZXJlZCA9PSBudWxsKQotCQkJCQkJb3JkZXJlZD0KLQkJCQkJCQkoQXJyYXlMaXN0KSBmT3JkZXJlZEVsZW1lbnRzSW50ZXJuYWwuZ2V0KAotCQkJCQkJCQlnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuZ2V0SWRNYXAoKSk7Ci0JCQkJfQotCQkJCWlmIChnZXRTb3J0ZXIoKSBpbnN0YW5jZW9mIFhNTFNvcnRlcikKLQkJCQkJICgoWE1MU29ydGVyKSBnZXRTb3J0ZXIoKSkuc2V0T3JkZXJlZChvcmRlcmVkKTsKLQkJCQlBYnN0cmFjdE1hdGNoaW5nIG09IG51bGw7Ci0JCQkJaWYgKGdldFhNTFN0cnVjdHVyZUNyZWF0b3IoKQotCQkJCQkuZ2V0SWRNYXAoKQotCQkJCQkuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVVNFX09SREVSRUQpKSB7Ci0JCQkJCW09IG5ldyBPcmRlcmVkTWF0Y2hpbmcoKTsKLQkJCQkJaWYgKGdldFNvcnRlcigpIGluc3RhbmNlb2YgWE1MU29ydGVyKQotCQkJCQkJICgoWE1MU29ydGVyKSBnZXRTb3J0ZXIoKSkuc2V0QWx3YXlzT3JkZXJTb3J0KHRydWUpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCQltLm1hdGNoKGxlZnQsIHJpZ2h0LCBmYWxzZSwgbW9uaXRvcik7Ci0JCQkJCQlpZiAoYW5jZXN0b3IgIT0gbnVsbCkgewotCQkJCQkJCW0ubWF0Y2goCi0JCQkJCQkJCWxlZnQsCi0JCQkJCQkJCWFuY2VzdG9yLAotCQkJCQkJCQl0cnVlLAotCQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJCQltLm1hdGNoKAotCQkJCQkJCQlyaWdodCwKLQkJCQkJCQkJYW5jZXN0b3IsCi0JCQkJCQkJCXRydWUsCi0JCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQkJfQotCQkJCQkJLy8JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW4gcnVuIik7Ci0JCQkJCQkvLwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVEaWZmSG9vaygKLQkJSVN0cnVjdHVyZUNvbXBhcmF0b3IgYW5jZXN0b3IsCi0JCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIGxlZnQsCi0JCUlTdHJ1Y3R1cmVDb21wYXJhdG9yIHJpZ2h0KSB7Ci0JCS8vCQlpZiAoIXhzYy5nZXRJZE1hcCgpLmVxdWFscyhYTUxTdHJ1Y3R1cmVDcmVhdG9yLlVTRV9PUkRFUkVEKSkgewotCQkvL1RpbWVvdXRDb250ZXh0LnJ1bih0cnVlLCBUSU1FT1VULCBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgcnVubmFibGUpOwotCQlpZiAobGVmdCAhPSBudWxsICYmIHJpZ2h0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgdHJ1ZSwKLQkJCQkvL1RpbWVvdXRDb250ZXh0LnJ1bih0cnVlLCA1MDAsIFhNTFBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQlnZXRNYXRjaGluZ1J1bm5hYmxlKAotCQkJCQkJKFhNTE5vZGUpIGxlZnQsCi0JCQkJCQkoWE1MTm9kZSkgcmlnaHQsCi0JCQkJCQkoWE1MTm9kZSkgYW5jZXN0b3IpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJWE1MUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlbiB0byBjcmVhdGUgYnV0dG9ucyBpbiB0aGUgdmlld2VyJ3MgcGFuZSBjb250cm9sIGJhci4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSB0b29sQmFyTWFuYWdlciB0aGUgdG9vbGJhciBtYW5hZ2VyIGZvciB3aGljaCB0byBhZGQgdGhlIGJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sSXRlbXMoVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY3JlYXRlVG9vbEl0ZW1zKHRvb2xCYXJNYW5hZ2VyKTsKLQkJdG9vbEJhck1hbmFnZXIuYXBwZW5kVG9Hcm91cCgibW9kZXMiLCBuZXcgQ2hvb3NlTWF0Y2hlckRyb3BEb3duQWN0aW9uKHRoaXMpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sQmFyTWFuYWdlci5hcHBlbmRUb0dyb3VwKCJtb2RlcyIsIG5ldyBDcmVhdGVOZXdJZE1hcEFjdGlvbih0aGlzKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZW4gdG8gY3JlYXRlIGEgY29udGV4dCBtZW51LgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIG1hbmFnZXIgdGhlIG1lbnUgbWFuYWdlciBmb3Igd2hpY2ggdG8gYWRkIG1lbnUgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQlJU2VsZWN0aW9uIHM9IGdldFNlbGVjdGlvbigpOwotCQlpZiAocyBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCSYmICgoU3RydWN0dXJlZFNlbGVjdGlvbikgcykuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBEaWZmTm9kZQotCQkJJiYgKChEaWZmTm9kZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzKS5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0SWQoKQotCQkJCWluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJRGlmZk5vZGUgZGlmZm5vZGU9Ci0JCQkJKERpZmZOb2RlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHMpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJU3RyaW5nIGRpZmZub2RlSWRTaWc9ICgoWE1MTm9kZSkgZGlmZm5vZGUuZ2V0SWQoKSkuZ2V0U2lnbmF0dXJlKCk7Ci0JCQlmSWRNYXBzPSBYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkTWFwcygpOwotCQkJU3RyaW5nIGlkbWFwX25hbWU9IGdldFhNTFN0cnVjdHVyZUNyZWF0b3IoKS5nZXRJZE1hcCgpOwotCQkJaWYgKGRpZmZub2RlSWRTaWcuZW5kc1dpdGgoWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0FUVFJJQlVURSkgfHwgKGRpZmZub2RlSWRTaWcuZW5kc1dpdGgoWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1RFWFQpICYmICgoWE1MTm9kZSkgZGlmZm5vZGUuZ2V0SWQoKSkuZ2V0T3JpZ0lkKCkuZW5kc1dpdGgoIigxKSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJQWN0aW9uIGFjdGlvbj0gbmV3IFNldEFzSWRBY3Rpb24oZGlmZm5vZGUpOwotCQkJCWlmICghZklkTWFwcy5jb250YWluc0tleShpZG1hcF9uYW1lKSkgewotCQkJCQlhY3Rpb24uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxTdHJ1Y3R1cmVWaWV3ZXIuYWN0aW9uLm5vdFVzZXJJZE1hcCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSGFzaE1hcCBpZG1hcEhNPSAoSGFzaE1hcCkgZklkTWFwcy5nZXQoaWRtYXBfbmFtZSk7Ci0JCQkJCVhNTE5vZGUgaWROb2RlPSAoWE1MTm9kZSkgZGlmZm5vZGUuZ2V0SWQoKTsKLQkJCQkJU3RyaW5nIHNpZ25hdHVyZT0gaWROb2RlLmdldFNpZ25hdHVyZSgpOwotCQkJCQlTdHJpbmcgaWRuYW1lPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaWROb2RlCi0JCQkJCQkuZ2V0U2lnbmF0dXJlKCkKLQkJCQkJCS5lbmRzV2l0aChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fQVRUUklCVVRFKSkgewotCQkJCQkJc2lnbmF0dXJlPQotCQkJCQkJCXNpZ25hdHVyZS5zdWJzdHJpbmcoCi0JCQkJCQkJCTAsCi0JCQkJCQkJCXNpZ25hdHVyZS5pbmRleE9mKAotCQkJCQkJCQkJWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0FUVFJJQlVURSkpOwotCQkJCQkJaW50IGVuZF9vZl9zaWduYXR1cmU9Ci0JCQkJCQkJc2lnbmF0dXJlLmxhc3RJbmRleE9mKAotCQkJCQkJCQlTSUdOX1NFUEFSQVRPUiwKLQkJCQkJCQkJc2lnbmF0dXJlLmxlbmd0aCgpIC0gMik7Ci0JCQkJCQlpZG5hbWU9Ci0JCQkJCQkJc2lnbmF0dXJlLnN1YnN0cmluZygKLQkJCQkJCQkJZW5kX29mX3NpZ25hdHVyZSArIDEsCi0JCQkJCQkJCXNpZ25hdHVyZS5sZW5ndGgoKSAtIDEpOwotCQkJCQkJc2lnbmF0dXJlPSBzaWduYXR1cmUuc3Vic3RyaW5nKDAsIGVuZF9vZl9zaWduYXR1cmUgKyAxKTsKLQkJCQkJfSBlbHNlIGlmICgKLQkJCQkJCWlkTm9kZS5nZXRTaWduYXR1cmUoKS5lbmRzV2l0aCgKLQkJCQkJCQlYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fVEVYVCkpIHsKLQkJCQkJCVhNTE5vZGUgdGV4dE5vZGU9IChYTUxOb2RlKSBkaWZmbm9kZS5nZXRJZCgpOwotCQkJCQkJWE1MTm9kZSBpZGVsZW09IHRleHROb2RlLmdldFBhcmVudCgpOwotCQkJCQkJWE1MTm9kZSBlbGVtPSBpZGVsZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQlzaWduYXR1cmU9Ci0JCQkJCQkJZWxlbS5nZXRTaWduYXR1cmUoKS5zdWJzdHJpbmcoCi0JCQkJCQkJCTAsCi0JCQkJCQkJCWVsZW0uZ2V0U2lnbmF0dXJlKCkuaW5kZXhPZigKLQkJCQkJCQkJCVhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5UKSk7Ci0JCQkJCQlpZG5hbWU9IGlkZWxlbS5nZXRPcmlnSWQoKTsKLQkJCQkJCWlkbmFtZT0KLQkJCQkJCQlpZG5hbWUuc3Vic3RyaW5nKAotCQkJCQkJCQkwLAotCQkJCQkJCQlpZG5hbWUuaW5kZXhPZigKLQkJCQkJCQkJCVhNTFN0cnVjdHVyZUNyZWF0b3IuSURfU0VQQVJBVE9SKSk7Ci0JCQkJCQlpZG5hbWU9Ci0JCQkJCQkJbmV3IENoYXJhY3RlcihYTUxTdHJ1Y3R1cmVDcmVhdG9yLklEX1RZUEVfQk9EWSkKLQkJCQkJCQkJKyBpZG5hbWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGlkbWFwSE0uY29udGFpbnNLZXkoc2lnbmF0dXJlKSkgewotCQkJCQkJaWYgKGlkbWFwSE0uZ2V0KHNpZ25hdHVyZSkuZXF1YWxzKGlkbmFtZSkpIHsKLQkJCQkJCQlhY3Rpb24uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxTdHJ1Y3R1cmVWaWV3ZXIuYWN0aW9uLnNldElkLnRleHQxIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgb2xkSWQ9IChTdHJpbmcpIGlkbWFwSE0uZ2V0KHNpZ25hdHVyZSk7Ci0JCQkJCQkJaWYgKG9sZElkCi0JCQkJCQkJCS5zdGFydHNXaXRoKAotCQkJCQkJCQkJKG5ldyBDaGFyYWN0ZXIoWE1MU3RydWN0dXJlQ3JlYXRvcgotCQkJCQkJCQkJCS5JRF9UWVBFX0JPRFkpKQotCQkJCQkJCQkJCS50b1N0cmluZygpKSkKLQkJCQkJCQkJb2xkSWQ9IG9sZElkLnN1YnN0cmluZygxKTsKLQkJCQkJCQlhY3Rpb24uc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9IHsxfSIsIG5ldyBTdHJpbmdbXSB7IFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0SWQudGV4dDIiKSwgb2xkSWQgfSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFjdGlvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0SWQudGV4dDMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JCQl9IGVsc2UgaWYgKAotCQkJCWRpZmZub2RlSWRTaWcuZW5kc1dpdGgoWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQpKSB7Ci0JCQkJU2V0T3JkZXJlZEFjdGlvbiBhY3Rpb249IG5ldyBTZXRPcmRlcmVkQWN0aW9uKGlkbWFwX25hbWUpOwotCQkJCWlmICghZklkTWFwcy5jb250YWluc0tleShpZG1hcF9uYW1lKSkgewotCQkJCQlhY3Rpb24uc2V0VGV4dChYTUxDb21wYXJlTWVzc2FnZXMuZ2V0U3RyaW5nKCJYTUxTdHJ1Y3R1cmVWaWV3ZXIuYWN0aW9uLm5vdFVzZXJJZE1hcCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXJyYXlMaXN0IGlkbWFwT3JkZXJlZD0KLQkJCQkJCShBcnJheUxpc3QpIGZPcmRlcmVkRWxlbWVudHMuZ2V0KGlkbWFwX25hbWUpOwotCQkJCQlYTUxOb2RlIGlkTm9kZT0gKFhNTE5vZGUpIGRpZmZub2RlLmdldElkKCk7Ci0JCQkJCVN0cmluZyBzaWduYXR1cmU9IGlkTm9kZS5nZXRTaWduYXR1cmUoKTsKLQkJCQkJLy8JCQkJCVN0cmluZyBpZG5hbWU9ICIiOwotCQkJCQlzaWduYXR1cmU9Ci0JCQkJCQlzaWduYXR1cmUuc3Vic3RyaW5nKAotCQkJCQkJCTAsCi0JCQkJCQkJc2lnbmF0dXJlLmluZGV4T2YoCi0JCQkJCQkJCVhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5UKSk7Ci0JCQkJCWlmIChpZG1hcE9yZGVyZWQgIT0gbnVsbAotCQkJCQkJJiYgaWRtYXBPcmRlcmVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKLQkJCQkJCWFjdGlvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0T3JkZXJlZC5leGlzdHMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFjdGlvbi5zZXRUZXh0KFhNTENvbXBhcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0T3JkZXJlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYWN0aW9uLnNldFNpZ25hdHVyZShzaWduYXR1cmUpOwotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG9UaXRsZShTdHJpbmcgaWRtYXBfbmFtZSkgewotCQlpZiAoZlBhcmVudCAhPSBudWxsKSB7Ci0JCQlnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuc2V0SWRNYXAoaWRtYXBfbmFtZSk7Ci0JCQlmUGFyZW50LnNldFRpdGxlQXJndW1lbnQoaWRtYXBfbmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBJZCBNYXAgc2NoZW1lIGhhcyBiZWVuIHJlbW92ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSWRNYXBSZW1vdmVkKCkgewotCQlYTUxTdHJ1Y3R1cmVDcmVhdG9yIHhzYz0gZ2V0WE1MU3RydWN0dXJlQ3JlYXRvcigpOwotCQlTdHJpbmcgSWRNYXBOYW1lPSB4c2MuZ2V0SWRNYXAoKTsKLQkJcmV0dXJuICFJZE1hcE5hbWUuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVVNFX1VOT1JERVJFRCkKLQkJCSYmICFJZE1hcE5hbWUuZXF1YWxzKFhNTFN0cnVjdHVyZUNyZWF0b3IuVVNFX09SREVSRUQpCi0JCQkmJiAhZklkTWFwcy5jb250YWluc0tleShJZE1hcE5hbWUpCi0JCQkmJiAhZklkTWFwc0ludGVybmFsLmNvbnRhaW5zS2V5KElkTWFwTmFtZSkKLQkJCSYmICFmT3JkZXJlZEVsZW1lbnRzLmNvbnRhaW5zS2V5KElkTWFwTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFNldEFzSWRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JCURpZmZOb2RlIGZEaWZmTm9kZTsKLQotCQlwdWJsaWMgU2V0QXNJZEFjdGlvbihEaWZmTm9kZSBkaWZmbm9kZSkgewotCQkJZkRpZmZOb2RlPSBkaWZmbm9kZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVhNTFN0cnVjdHVyZUNyZWF0b3Igc2M9IGdldFhNTFN0cnVjdHVyZUNyZWF0b3IoKTsKLQkJCS8vCQkJRGlmZk5vZGUgZGlmZm5vZGUgPSAoRGlmZk5vZGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJU3RyaW5nIGlkbWFwX25hbWU9IHNjLmdldElkTWFwKCk7Ci0JCQlpZiAoZklkTWFwcy5jb250YWluc0tleShpZG1hcF9uYW1lKSkgewotCQkJCUhhc2hNYXAgaWRtYXBITT0gKEhhc2hNYXApIGZJZE1hcHMuZ2V0KGlkbWFwX25hbWUpOwotCQkJCWlmICgoKFhNTE5vZGUpIGZEaWZmTm9kZS5nZXRJZCgpKQotCQkJCQkuZ2V0U2lnbmF0dXJlKCkKLQkJCQkJLmVuZHNXaXRoKFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9BVFRSSUJVVEUpKSB7Ci0JCQkJCVhNTE5vZGUgYXR0ck5vZGU9IChYTUxOb2RlKSBmRGlmZk5vZGUuZ2V0SWQoKTsKLQkJCQkJU3RyaW5nIHNpZ25hdHVyZT0gYXR0ck5vZGUuZ2V0U2lnbmF0dXJlKCk7Ci0JCQkJCXNpZ25hdHVyZT0KLQkJCQkJCXNpZ25hdHVyZS5zdWJzdHJpbmcoCi0JCQkJCQkJMCwKLQkJCQkJCQlzaWduYXR1cmUuaW5kZXhPZigKLQkJCQkJCQkJWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0FUVFJJQlVURSkpOwotCQkJCQlpbnQgZW5kX29mX3NpZ25hdHVyZT0KLQkJCQkJCXNpZ25hdHVyZS5sYXN0SW5kZXhPZigKLQkJCQkJCQlTSUdOX1NFUEFSQVRPUiwKLQkJCQkJCQlzaWduYXR1cmUubGVuZ3RoKCkgLSAyKTsKLQkJCQkJU3RyaW5nIGlkYXR0cj0KLQkJCQkJCXNpZ25hdHVyZS5zdWJzdHJpbmcoCi0JCQkJCQkJZW5kX29mX3NpZ25hdHVyZSArIDEsCi0JCQkJCQkJc2lnbmF0dXJlLmxlbmd0aCgpIC0gMSk7Ci0JCQkJCXNpZ25hdHVyZT0gc2lnbmF0dXJlLnN1YnN0cmluZygwLCBlbmRfb2Zfc2lnbmF0dXJlICsgMSk7Ci0JCQkJCWlkbWFwSE0ucHV0KHNpZ25hdHVyZSwgaWRhdHRyKTsKLQkJCQkJWE1MUGx1Z2luLmdldERlZmF1bHQoKS5zZXRJZE1hcHMoCi0JCQkJCQlmSWRNYXBzLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQlmYWxzZSk7Ci0JCQkJCS8vY29udGVudENoYW5nZWQoKTsKLQkJCQl9IGVsc2UgaWYgKAotCQkJCQkoKFhNTE5vZGUpIGZEaWZmTm9kZS5nZXRJZCgpKS5nZXRTaWduYXR1cmUoKS5lbmRzV2l0aCgKLQkJCQkJCVhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9URVhUKSkgewotCQkJCQlYTUxOb2RlIHRleHROb2RlPSAoWE1MTm9kZSkgZkRpZmZOb2RlLmdldElkKCk7Ci0JCQkJCVhNTE5vZGUgaWRlbGVtPSB0ZXh0Tm9kZS5nZXRQYXJlbnQoKTsKLQkJCQkJWE1MTm9kZSBlbGVtPSBpZGVsZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCVN0cmluZyBzaWduYXR1cmU9Ci0JCQkJCQllbGVtLmdldFNpZ25hdHVyZSgpLnN1YnN0cmluZygKLQkJCQkJCQkwLAotCQkJCQkJCWVsZW0uZ2V0U2lnbmF0dXJlKCkuaW5kZXhPZigKLQkJCQkJCQkJWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQpKTsKLQkJCQkJU3RyaW5nIGlkbmFtZT0gaWRlbGVtLmdldE9yaWdJZCgpOwotCQkJCQlpZG5hbWU9Ci0JCQkJCQlpZG5hbWUuc3Vic3RyaW5nKAotCQkJCQkJCTAsCi0JCQkJCQkJaWRuYW1lLmluZGV4T2YoWE1MU3RydWN0dXJlQ3JlYXRvci5JRF9TRVBBUkFUT1IpKTsKLQkJCQkJaWRuYW1lPQotCQkJCQkJbmV3IENoYXJhY3RlcihYTUxTdHJ1Y3R1cmVDcmVhdG9yLklEX1RZUEVfQk9EWSkKLQkJCQkJCQkrIGlkbmFtZTsKLQkJCQkJaWRtYXBITS5wdXQoc2lnbmF0dXJlLCBpZG5hbWUpOwotCQkJCQlYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldElkTWFwcygKLQkJCQkJCWZJZE1hcHMsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCWZhbHNlKTsKLQkJCQkJLy9jb250ZW50Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBTZXRPcmRlcmVkQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCQlTdHJpbmcgZklkTWFwTmFtZTsKLQkJU3RyaW5nIGZTaWduYXR1cmU7Ci0KLQkJcHVibGljIFNldE9yZGVyZWRBY3Rpb24oU3RyaW5nIGlkbWFwX25hbWUpIHsKLQkJCWZJZE1hcE5hbWU9IGlkbWFwX25hbWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvL1N0cmluZyBpZG1hcF9uYW1lPSBnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuZ2V0SWRNYXAoKTsKLQkJCWlmIChmU2lnbmF0dXJlICE9IG51bGwpIHsKLQkJCQlBcnJheUxpc3QgaWRtYXBPcmRlcmVkPQotCQkJCQkoQXJyYXlMaXN0KSBmT3JkZXJlZEVsZW1lbnRzLmdldChmSWRNYXBOYW1lKTsKLQkJCQlpZiAoaWRtYXBPcmRlcmVkID09IG51bGwpIHsKLQkJCQkJaWRtYXBPcmRlcmVkPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZPcmRlcmVkRWxlbWVudHMucHV0KGZJZE1hcE5hbWUsIGlkbWFwT3JkZXJlZCk7Ci0JCQkJfQotCQkJCWlkbWFwT3JkZXJlZC5hZGQoZlNpZ25hdHVyZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgewotCQkJZlNpZ25hdHVyZT0gc2lnbmF0dXJlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRNYXBzKCkgewotCQlnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkudXBkYXRlSWRNYXBzKCk7Ci0JfQotCi0JLyoKLQkgKiBUcmFja3MgcHJvcGVydHkgY2hhbmdlcyBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QuCi0JICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gdHJhY2sgdGhlaXIgb3duIHByb3BlcnR5IGNoYW5nZXMuCi0JICogSW4gdGhpcyBjYXNlIHRoZXkgbXVzdCBjYWxsIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGtleT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJaWYgKGtleS5lcXVhbHMoQ29tcGFyZUNvbmZpZ3VyYXRpb24uSUdOT1JFX1dISVRFU1BBQ0UpKSB7Ci0JCQlnZXRYTUxTdHJ1Y3R1cmVDcmVhdG9yKCkuc2V0UmVtb3ZlV2hpdGVTcGFjZSgKLQkJCQkhZ2V0WE1MU3RydWN0dXJlQ3JlYXRvcigpLmdldFJlbW92ZVdoaXRlU3BhY2UoKSk7Ci0JCQljb250ZW50Q2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTFN0cnVjdHVyZVZpZXdlckNyZWF0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9YTUxTdHJ1Y3R1cmVWaWV3ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTk0YTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1hNTFN0cnVjdHVyZVZpZXdlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBvYmplY3QgZm9yIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+LgotICogVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvbmx5IG9iamVjdHMgd2l0aCBhIGRlZmF1bHQKLSAqIGNvbnN0cnVjdG9yIGNhbiBiZSBjcmVhdGVkIHZpYSBhbiBleHRlbnNpb24gcG9pbnQKLSAqICh0aGlzIHByZWNsdWRlcyBWaWV3ZXJzKS4KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZVZpZXdlckNyZWF0b3IgaW1wbGVtZW50cyBJVmlld2VyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBtcCkgewotCQlyZXR1cm4gbmV3IFhNTFN0cnVjdHVyZVZpZXdlcihwYXJlbnQsIG1wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvdWkvTWVzc2FnZUxpbmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC91aS9NZXNzYWdlTGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2M5MjdiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC91aS9NZXNzYWdlTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgbWVzc2FnZSBsaW5lLiBJdCBkaXN0aW5ndWlzaHMgYmV0d2VlbiAibm9ybWFsIiBtZXNzYWdlcyBhbmQgZXJyb3JzLiAKLSAqIFNldHRpbmcgYW4gZXJyb3IgbWVzc2FnZSBoaWRlcyBhIGN1cnJlbnRseSBkaXNwbGF5ZWQgbWVzc2FnZSB1bnRpbCAKLSAqIDxjb2RlPmNsZWFyRXJyb3JNZXNzYWdlPC9jb2RlPiBpcyBjYWxsZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTGluZSBleHRlbmRzIENMYWJlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJHQiBSRUQ9IG5ldyBSR0IoMjAwLCAwLCAwKTsKLQlwcml2YXRlIHN0YXRpYyBSR0IgZmdEZWZhdWx0RXJyb3JSR0I9IFJFRDsKLQotCXByaXZhdGUgU3RyaW5nIGZNZXNzYWdlVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmRXJyb3JUZXh0OwotCi0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdENvbG9yOwotCXByaXZhdGUgUkdCIGZFcnJvclJHQjsKLQlwcml2YXRlIENvbG9yIGZFcnJvckNvbG9yOwotCi0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgbGluZSBhcyBhIGNoaWxkIG9mIHRoZSBnaXZlbiBwYXJlbnQuCi0JICogRXJyb3IgbWVzc2FnZSB3aWxsIGJlIHNob3duIGluIDxjb2RlPlJFRDwvY29kZT4uCi0JICovCi0JcHVibGljIE1lc3NhZ2VMaW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5MRUZUKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBsaW5lIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudCBhbmQgd2l0aCB0aGUgZ2l2ZW4gU1dUIHN0eWxlYml0cy4KLQkgKiBFcnJvciBtZXNzYWdlIHdpbGwgYmUgc2hvd24gaW4gIDxjb2RlPlJFRDwvY29kZT4uCi0JICovCi0JcHVibGljIE1lc3NhZ2VMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJZkRlZmF1bHRDb2xvcj0gZ2V0Rm9yZWdyb3VuZCgpOwotCQlmRXJyb3JSR0I9IGZnRGVmYXVsdEVycm9yUkdCOwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIGxpbmUgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IGFuZCB3aXRoIHRoZSBnaXZlbiBTV1Qgc3R5bGViaXRzLgotCSAqIEVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBzaG93biB3aXRoIGluIHRoZSBnaXZlbiByZ2IgY29sb3IuCi0JICovCi0JcHVibGljIE1lc3NhZ2VMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgUkdCIGVycm9yUkdCKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlmRGVmYXVsdENvbG9yPSBnZXRGb3JlZ3JvdW5kKCk7Ci0JCWZFcnJvclJHQj0gZXJyb3JSR0I7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGVycm9yIG1lc3NhZ2UgYW5kIHJlZGlzcGxheWVzCi0JICogdGhlIG1lc3NhZ2Ugd2hpY2ggd2FzIGFjdGl2ZSBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2Ugd2FzIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTWVzc2FnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgZXJyb3IgdGV4dC4KLQkgKiBAcmV0dXJuIFRoZSBlcnJvciBtZXNzYWdlLiBJZiBubyBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvclRleHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIG1lc3NhZ2UuCi0JICogQHJldHVybiBUaGUgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBkaXNwbGF5ZWQgPGNvZGU+bnVsbDxjb2RlPiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZVRleHQ7Ci0JfQotCi0JLyoKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGVycm9yIGNvbG9yIHVzZWQgYnkgYWxsIG1lc3NhZ2UgbGluZXMuCi0JICogTm90ZTogYSBjYWxsIHRvIHRoaXMgbWV0aG9kIG9ubHkgYWZmZWN0cyBuZXdseSBjcmVhdGVkIE1lc3NhZ2VMaW5lcyBub3QgZXhpc3Rpbmcgb25lcy4gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRFcnJvckNvbG9yKFJHQiBjb2xvcikgewotCQlmZ0RlZmF1bHRFcnJvclJHQj0gY29sb3I7Ci0JfQotCi0JLyoKLQkgKiBEaXNwbGF5IHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLiBBIGN1cnJlbnRseSBkaXNwbGF5ZWQgbWVzc2FnZQotCSAqIGlzIHNhdmVkIGFuZCB3aWxsIGJlIHJlZGlzcGxheWVkIHdoZW4gdGhlIGVycm9yIG1lc3NhZ2UgaXMgY2xlYXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZkVycm9yVGV4dD0gbWVzc2FnZTsKLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlzZXRNZXNzYWdlKGZNZXNzYWdlVGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZkVycm9yQ29sb3IgPT0gbnVsbCkgewotCQkJCWZFcnJvckNvbG9yPSBuZXcgQ29sb3IoZ2V0RGlzcGxheSgpLCBmRXJyb3JSR0IpOwotCQkJCWFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCQkJZkVycm9yQ29sb3IuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlzZXRGb3JlZ3JvdW5kKGZFcnJvckNvbG9yKTsKLQkJCXNldFRleHQobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgbWVzc2FnZSB0ZXh0LiBJZiB0aGUgbWVzc2FnZSBsaW5lIGN1cnJlbnRseSBkaXNwbGF5cyBhbiBlcnJvciwKLQkgKiB0aGUgbWVzc2FnZSBpcyBzdG9yZWQgYW5kIHdpbGwgYmUgc2hvd24gYWZ0ZXIgYSBjYWxsIHRvIGNsZWFyRXJyb3JNZXNzYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlmTWVzc2FnZVRleHQ9IG1lc3NhZ2U7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZkVycm9yVGV4dCA9PSBudWxsKSB7Ci0JCQlzZXRGb3JlZ3JvdW5kKGZEZWZhdWx0Q29sb3IpOwotCQkJc2V0VGV4dChtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3VpL1N0YXR1c0RpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3VpL1N0YXR1c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU5Njk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC91aS9TdGF0dXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkaWFsb2dzIHdpdGggYSBzdGF0dXMgYmFyIGFuZCBvay9jYW5jZWwgYnV0dG9ucy4KLSAqIFRoZSBzdGF0dXMgbWVzc2FnZSBtdXN0IGJlIHBhc3NlZCBvdmVyIGFzIFN0YXR1c0luZm8gb2JqZWN0IGFuZCBjYW4gYmUKLSAqIGFuIGVycm9yLCB3YXJuaW5nIG9yIG9rLiBUaGUgT0sgYnV0dG9uIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgZGVwZW5kaW5nCi0gKiBvbiB0aGUgc3RhdHVzLgotICovIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZk9rQnV0dG9uOwotCXByaXZhdGUgTWVzc2FnZUxpbmUgZlN0YXR1c0xpbmU7Ci0JcHJpdmF0ZSBJU3RhdHVzIGZMYXN0U3RhdHVzOwotCXByaXZhdGUgU3RyaW5nIGZUaXRsZTsKLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQkKLQkvKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuZSBvZiBhIHN0YXR1cyBkaWFsb2cuCi0JICovCi0JcHVibGljIFN0YXR1c0RpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JLyoKLQkgKiBTcGVjaWZpZXMgd2hldGhlciBzdGF0dXMgbGluZSBhcHBlYXJzIHRvIHRoZSBsZWZ0IG9mIHRoZSBidXR0b25zIChkZWZhdWx0KQotCSAqIG9yIGFib3ZlIHRoZW0uCi0JICoKLQkgKiBAcGFyYW0gYWJvdmVCdXR0b25zIGlmIDxjb2RlPnRydWU8L2NvZGU+IHN0YXR1cyBsaW5lIGlzIHBsYWNlZCBhYm92ZSBidXR0b25zOyBpZgotCSAqIAk8Y29kZT5mYWxzZTwvY29kZT4gdG8gdGhlIHJpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZUFib3ZlQnV0dG9ucyhib29sZWFuIGFib3ZlQnV0dG9ucykgewotCQkvLyBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JfQkKLQkKLQkvKgotCSAqIFVwZGF0ZSB0aGUgZGlhbG9nJ3Mgc3RhdHVzIGxpbmUgdG8gcmVmbGVjdCB0aGUgZ2l2ZW4gc3RhdHVzLgotCSAqIEl0IGlzIHNhdmUgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIGRpYWxvZyBoYXMgYmVlbiBvcGVuZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWZMYXN0U3RhdHVzPSBzdGF0dXM7Ci0JCWlmIChmU3RhdHVzTGluZSAhPSBudWxsICYmICFmU3RhdHVzTGluZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXVwZGF0ZUJ1dHRvbnNFbmFibGVTdGF0ZShzdGF0dXMpOwotCQkJU3RhdHVzVXRpbC5hcHBseVRvU3RhdHVzTGluZShmU3RhdHVzTGluZSwgc3RhdHVzKTsJCi0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBmTGFzdFN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIG9rIGJ1dHRvbiB0byByZWZsZWN0IHRoZSBnaXZlbiBzdGF0dXMuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdXBkYXRlIGFkZGl0aW9uYWwgYnV0dG9ucy4KLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uc0VuYWJsZVN0YXRlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChmT2tCdXR0b24gIT0gbnVsbCAmJiAhZk9rQnV0dG9uLmlzRGlzcG9zZWQoKSkKLQkJCWZPa0J1dHRvbi5zZXRFbmFibGVkKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSk7Ci0JfQotCQotCS8qIAotCSAqIEBzZWUgV2luZG93I2NyZWF0ZShTaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCWlmIChmVGl0bGUgIT0gbnVsbCkKLQkJCXNoZWxsLnNldFRleHQoZlRpdGxlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2luZG93I2NyZWF0ZSgpCi0JICovCQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCWlmIChmTGFzdFN0YXR1cyAhPSBudWxsKSB7Ci0JCQkvLyBwb2xpY3k6IGRpYWxvZ3MgYXJlIG5vdCBhbGxvd2VkIHRvIGNvbWUgdXAgd2l0aCBhbiBlcnJvciBtZXNzYWdlCi0JCQlpZiAoZkxhc3RTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJCVN0YXR1c0luZm8gc3RhdHVzPSBuZXcgU3RhdHVzSW5mbygpOwotCQkJCXN0YXR1cy5zZXRFcnJvcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmTGFzdFN0YXR1cz0gc3RhdHVzOwotCQkJfQotCQkJdXBkYXRlU3RhdHVzKGZMYXN0U3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZPa0J1dHRvbj0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUpCi0JICovCQkJCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlmU3RhdHVzTGluZT0gbmV3IE1lc3NhZ2VMaW5lKGNvbXBvc2l0ZSk7Ci0JCWZTdGF0dXNMaW5lLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCWZTdGF0dXNMaW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmU3RhdHVzTGluZS5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSBmb3IgdGhpcyBkaWFsb2cuCi0JICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJZlRpdGxlPSB0aXRsZSAhPSBudWxsID8gdGl0bGUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTaGVsbCBzaGVsbD0gZ2V0U2hlbGwoKTsKLQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJc2hlbGwuc2V0VGV4dChmVGl0bGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIGZvciB0aGlzIGRpYWxvZy4KLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWZJbWFnZT0gaW1hZ2U7Ci0JCVNoZWxsIHNoZWxsPSBnZXRTaGVsbCgpOwotCQlpZiAoKHNoZWxsICE9IG51bGwpICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlzaGVsbC5zZXRJbWFnZShmSW1hZ2UpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvdWkvU3RhdHVzSW5mby5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3VpL1N0YXR1c0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzMTM3NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy94bWwvdWkvU3RhdHVzSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQSBzZXR0YWJsZSBJU3RhdHVzLiAKLSAqIENhbiBiZSBhbiBlcnJvciwgd2FybmluZywgaW5mbyBvciBvay4gRm9yIGVycm9yLCBpbmZvIGFuZCB3YXJuaW5nIHN0YXRlcywKLSAqIGEgbWVzc2FnZSBkZXNjcmliZXMgdGhlIHByb2JsZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNJbmZvIGltcGxlbWVudHMgSVN0YXR1cyB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlN0YXR1c01lc3NhZ2U7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdGF0dXMgc2V0IHRvIE9LIChubyBtZXNzYWdlKQotCSAqLwotCXB1YmxpYyBTdGF0dXNJbmZvKCkgewotCQl0aGlzKE9LLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RhdHVzIC4KLQkgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHN0YXR1cyBzZXZlcml0eTogRVJST1IsIFdBUk5JTkcsIElORk8gYW5kIE9LLgotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIG9mIHRoZSBzdGF0dXMuIEFwcGxpZXMgb25seSBmb3IgRVJST1IsCi0JICogV0FSTklORyBhbmQgSU5GTy4KLQkgKi8JCi0JcHVibGljIFN0YXR1c0luZm8oaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlmU3RhdHVzTWVzc2FnZT0gbWVzc2FnZTsKLQkJZlNldmVyaXR5PSBzZXZlcml0eTsKLQl9CQkKLQkKLQkvKgotCSAqICBSZXR1cm5zIGlmIHRoZSBzdGF0dXMnIHNldmVyaXR5IGlzIE9LLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT0soKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5PSzsKLQl9Ci0KLQkvKgotCSAqICBSZXR1cm5zIGlmIHRoZSBzdGF0dXMnIHNldmVyaXR5IGlzIFdBUk5JTkcuCi0JICovCQotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkc7Ci0JfQotCi0JLyoKLQkgKiAgUmV0dXJucyBpZiB0aGUgc3RhdHVzJyBzZXZlcml0eSBpcyBJTkZPLgotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBpc0luZm8oKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5JTkZPOwotCX0JCi0KLQkvKgotCSAqICBSZXR1cm5zIGlmIHRoZSBzdGF0dXMnIHNldmVyaXR5IGlzIEVSUk9SLgotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuRVJST1I7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJU3RhdHVzI2dldE1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmU3RhdHVzTWVzc2FnZTsKLQl9Ci0JCi0JLyoKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gRVJST1IuCi0JICogQHBhcmFtIFRoZSBlcnJvciBtZXNzYWdlIChjYW4gYmUgZW1wdHksIGJ1dCBub3QgbnVsbCkKLQkgKi8JCi0JcHVibGljIHZvaWQgc2V0RXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVycm9yTWVzc2FnZSk7Ci0JCWZTdGF0dXNNZXNzYWdlPSBlcnJvck1lc3NhZ2U7Ci0JCWZTZXZlcml0eT0gSVN0YXR1cy5FUlJPUjsKLQl9Ci0KLQkvKgotCSAqIFNldHMgdGhlIHN0YXR1cyB0byBXQVJOSU5HLgotCSAqIEBwYXJhbSBUaGUgd2FybmluZyBtZXNzYWdlIChjYW4gYmUgZW1wdHksIGJ1dCBub3QgbnVsbCkKLQkgKi8JCQotCXB1YmxpYyB2b2lkIHNldFdhcm5pbmcoU3RyaW5nIHdhcm5pbmdNZXNzYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwod2FybmluZ01lc3NhZ2UpOwotCQlmU3RhdHVzTWVzc2FnZT0gd2FybmluZ01lc3NhZ2U7Ci0JCWZTZXZlcml0eT0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotCS8qCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIElORk8uCi0JICogQHBhcmFtIFRoZSBpbmZvIG1lc3NhZ2UgKGNhbiBiZSBlbXB0eSwgYnV0IG5vdCBudWxsKQotCSAqLwkJCi0JcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgaW5mb01lc3NhZ2UpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbmZvTWVzc2FnZSk7Ci0JCWZTdGF0dXNNZXNzYWdlPSBpbmZvTWVzc2FnZTsKLQkJZlNldmVyaXR5PSBJU3RhdHVzLklORk87Ci0JfQkKLQotCS8qCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIE9LLgotCSAqLwkJCi0JcHVibGljIHZvaWQgc2V0T0soKSB7Ci0JCWZTdGF0dXNNZXNzYWdlPSBudWxsOwotCQlmU2V2ZXJpdHk9IElTdGF0dXMuT0s7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJU3RhdHVzI21hdGNoZXMoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoaW50IHNldmVyaXR5TWFzaykgewotCQlyZXR1cm4gKGZTZXZlcml0eSAmIHNldmVyaXR5TWFzaykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogQHNlZSBJU3RhdHVzI2lzTXVsdGlTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRTZXZlcml0eSgpCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIGZTZXZlcml0eTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRQbHVnaW4oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gIlhNTFBsdWdJbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlIElTdGF0dXMjZ2V0RXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbHdheXMgdGhlIGVycm9yIHNldmVyaXR5LgotCSAqIEBzZWUgSVN0YXR1cyNnZXRDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvZGUoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSBJU3RhdHVzI2dldENoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IElTdGF0dXNbMF07Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3VpL1N0YXR1c1V0aWwuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC91aS9TdGF0dXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzk1NWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3VpL1N0YXR1c1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyB0byB3b3JrIHdpdGggSVN0YXR1cy4KLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c1V0aWwgewotCi0JLyoKLQkgKiBDb21wYXJlcyB0d28gaW5zdGFuY2VzIG9mIDxjb2RlPklTdGF0dXM8L2NvZGU+LiBUaGUgbW9yZSBzZXZlcmUgaXMgcmV0dXJuZWQ6Ci0JICogQW4gZXJyb3IgaXMgbW9yZSBzZXZlcmUgdGhhbiBhIHdhcm5pbmcsIGFuZCBhIHdhcm5pbmcgaXMgbW9yZSBzZXZlcmUKLQkgKiB0aGFuIG9rLiBJZiB0aGUgdHdvIHN0YXRpIGhhdmUgdGhlIHNhbWUgc2V2ZXJpdHksIHRoZSBzZWNvbmQgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGdldE1vcmVTZXZlcmUoSVN0YXR1cyBzMSwgSVN0YXR1cyBzMikgewotCQlpZiAoczEuZ2V0U2V2ZXJpdHkoKSA+IHMyLmdldFNldmVyaXR5KCkpCi0JCQlyZXR1cm4gczE7Ci0JCXJldHVybiBzMjsKLQl9Ci0KLQkvKgotCSAqIEZpbmRzIHRoZSBtb3N0IHNldmVyZSBzdGF0dXMgZnJvbSBhIGFycmF5IG9mIHN0YXRpLgotCSAqIEFuIGVycm9yIGlzIG1vcmUgc2V2ZXJlIHRoYW4gYSB3YXJuaW5nLCBhbmQgYSB3YXJuaW5nIGlzIG1vcmUgc2V2ZXJlCi0JICogdGhhbiBvay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgZ2V0TW9zdFNldmVyZShJU3RhdHVzW10gc3RhdHVzKSB7Ci0JCUlTdGF0dXMgbWF4PSBudWxsOwotCQlmb3IgKGludCBpPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU3RhdHVzIGN1cnI9IHN0YXR1c1tpXTsKLQkJCWlmIChjdXJyLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCQlyZXR1cm4gY3VycjsKLQkJCX0KLQkJCWlmIChtYXggPT0gbnVsbCB8fCBjdXJyLmdldFNldmVyaXR5KCkgPiBtYXguZ2V0U2V2ZXJpdHkoKSkgewotCQkJCW1heD0gY3VycjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgZXJyb3ItbWVzc2FnZSAvIHdhcm5pbmctbWVzc2FnZSBmb3IgYSBzdGF0dXMuIAotCSAqIEByZXR1cm4gQXJyYXkgb2Ygc2l6ZSAyLiBJbmRleCAwIGlzIHRoZSBlcnJvciBtZXNzYWdlIG9yIDxudWxsPgotCSAqIGlmIG5vdCBhbiBlcnJvci4gSW5kZXggMSB0aGUgd2FybmluZyBtZXNzYWdlIG9yIDxudWxsPiBpZiBub3QgYSB3YXJuaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldEVycm9yTWVzc2FnZXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1lc3NhZ2U9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCWlmIChzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSAmJiAhIiIuZXF1YWxzKG1lc3NhZ2UpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyBtZXNzYWdlLCBudWxsIH07Ci0JCX0gZWxzZSBpZiAoc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5JTkZPKSkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IG51bGwsIG1lc3NhZ2UgfTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyBudWxsLCBudWxsIH07Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBBcHBsaWVzIHRoZSBzdGF0dXMgdG8gdGhlIHN0YXR1cyBsaW5lIG9mIGEgZGlhbG9nIHBhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKERpYWxvZ1BhZ2UgcGFnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nW10gbWVzc2FnZXM9IGdldEVycm9yTWVzc2FnZXMoc3RhdHVzKTsKLQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZXNbMF0pOwotCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZXNbMV0pOwotCX0KLQkKLQkvKgotCSAqIEFwcGxpZXMgdGhlIHN0YXR1cyB0byBhIG1lc3NhZ2UgbGluZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVRvU3RhdHVzTGluZShNZXNzYWdlTGluZSBtZXNzYWdlTGluZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nW10gbWVzc2FnZXM9IGdldEVycm9yTWVzc2FnZXMoc3RhdHVzKTsKLQkJbWVzc2FnZUxpbmUuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2VzWzBdKTsKLQkJbWVzc2FnZUxpbmUuc2V0TWVzc2FnZShtZXNzYWdlc1sxXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3htbGNvbXBhcmUucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC94bWxjb21wYXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTg1MTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL3htbGNvbXBhcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgU3RydWN0dXJlIENyZWF0b3IKLSMKLVhNTFN0cnVjdHVyZUNyZWF0b3IucGx1Z2lubmFtZT0gWE1MIENvbXBhcmUKLVhNTFN0cnVjdHVyZUNyZWF0b3IudW5vcmRlcmVkPSBVbm9yZGVyZWQKLVhNTFN0cnVjdHVyZUNyZWF0b3Iub3JkZXJlZD0gT3JkZXJlZAotWE1MU3RydWN0dXJlQ3JlYXRvci5pZG1hcF91bm9yZGVyZWQ9IFVub3JkZXJlZAotWE1MU3RydWN0dXJlQ3JlYXRvci5pZF9tYXBfc2NoZW1lPSBJZCBNYXAgU2NoZW1lOgotWE1MU3RydWN0dXJlQ3JlYXRvci5ib2R5PSBib2R5Ci0KLQotIwotIyBJZCBTY2hlbWUgRHJvcCBEb3duIE1lbnUKLSMKLUNob29zZU1hdGNoZXJEcm9wRG93bkFjdGlvbi50ZXh0PSBDb21wYXJlIE1vZGUKLUNob29zZU1hdGNoZXJEcm9wRG93bkFjdGlvbi50b29sdGlwPSBDb21wYXJlIE1vZGUKLQotIwotIyBQcmVmZXJlbmNlIFBhZ2UKLSMKLVhNTENvbXBhcmVQcmVmZXJlbmNlLmlkdHlwZS5hdHRyaWJ1dGU9IGF0dHJpYnV0ZQotWE1MQ29tcGFyZVByZWZlcmVuY2UuaWR0eXBlLmNoaWxkX2JvZHk9IGNoaWxkIHRleHQKLVhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFRhYmxlTGFiZWw9IElkIE1hcHBpbmcgc2NoZW1lczoKLVhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFRhYmxlQ29sdW1uMT0gTmFtZQotWE1MQ29tcGFyZVByZWZlcmVuY2UudG9wVGFibGVDb2x1bW4yPSBJbnRlcm5hbC9Vc2VyCi1YTUxDb21wYXJlUHJlZmVyZW5jZS50b3BUYWJsZUNvbHVtbjJpbnRlcm5hbD0gSW50ZXJuYWwKLVhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFRhYmxlQ29sdW1uMnVzZXI9IFVzZXIKLVhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFRhYmxlQ29sdW1uMz0gRXh0ZW5zaW9uCi1YTUxDb21wYXJlUHJlZmVyZW5jZS50b3BBZGQ9ICZBZGQuLi4KLVhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFJlbmFtZT0gJkVkaXQuLi4KLVhNTENvbXBhcmVQcmVmZXJlbmNlLnRvcFJlbW92ZT0gJlJlbW92ZQotWE1MQ29tcGFyZVByZWZlcmVuY2UudG9wRWRpdD0gRWRpdCAmQ29weS4uLgotWE1MQ29tcGFyZVByZWZlcmVuY2UubWlkZGxlVGFibGVDb2x1bW4xPSBFbGVtZW50Ci1YTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVUYWJsZUNvbHVtbjI9IFBhdGgKLVhNTENvbXBhcmVQcmVmZXJlbmNlLm1pZGRsZVRhYmxlQ29sdW1uMz0gSWQgQXR0cmlidXRlCi1YTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVUYWJsZUNvbHVtbjQ9IElkIFNvdXJjZQotWE1MQ29tcGFyZVByZWZlcmVuY2UubWlkZGxlTmV3PSAmTmV3Li4uCi1YTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVFZGl0PSBFJmRpdC4uLgotWE1MQ29tcGFyZVByZWZlcmVuY2UubWlkZGxlUmVtb3ZlPSBSZSZtb3ZlCi1YTUxDb21wYXJlUHJlZmVyZW5jZS5taWRkbGVUYWJsZUxhYmVsPUVsZW1lbnQgbWFwcGluZ3Mgb2Ygc2VsZWN0ZWQgSWQgTWFwcGluZyBTY2hlbWU6Ci1YTUxDb21wYXJlUHJlZmVyZW5jZS5ib3R0b21UYWJsZUxhYmVsPUVsZW1lbnRzIHdob3NlIGNoaWxkcmVuIGFyZSBjb21wYXJlZCBpbiBvcmRlcmVkIGZhc2hpb246Ci1YTUxDb21wYXJlUHJlZmVyZW5jZS5ib3R0b21UYWJsZUNvbHVtbjE9RWxlbWVudAotWE1MQ29tcGFyZVByZWZlcmVuY2UuYm90dG9tVGFibGVDb2x1bW4yPVBhdGgKLVhNTENvbXBhcmVQcmVmZXJlbmNlLmJvdHRvbU5ldz1OZSZ3Li4uCi1YTUxDb21wYXJlUHJlZmVyZW5jZS5ib3R0b21FZGl0PUVkaSZ0Li4uCi1YTUxDb21wYXJlUHJlZmVyZW5jZS5ib3R0b21SZW1vdmU9UmVtbyZ2ZQotCi0jCi0jIERpYWxvZ3MKLSMKLVhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5lZGl0VGl0bGU9IEVkaXQgSWQgTWFwcGluZyBTY2hlbWUKLVhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5uZXdUaXRsZT0gTmV3IElkIE1hcHBpbmcgU2NoZW1lCi1YTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cubGFiZWw9IElEIE1hcCBOYW1lOgotWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nLmV4dGxhYmVsPSBFeHRlbnNpb24gKG9wdGlvbmFsKQotWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nLmVycm9yLm5vbmFtZT0gRW50ZXIgSWQgTWFwIE5hbWUuCi1YTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cuZXJyb3IuaW52YWxpZG5hbWU9IEludmFsaWQgSWQgTWFwIE5hbWUuCi1YTUxDb21wYXJlQWRkSWRNYXBEaWFsb2cuZXJyb3IuaWRtYXBFeGlzdHM9IElkIE1hcCBhbHJlYWR5IGV4aXN0cy4KLVhNTENvbXBhcmVBZGRJZE1hcERpYWxvZy5lcnJvci5leHRmdWxsc3RvcD0gRXh0ZW5zaW9uIGNhbm5vdCBjb250YWluICcuJwotWE1MQ29tcGFyZUFkZElkTWFwRGlhbG9nLmVycm9yLmV4dEV4aXN0cz0gRXh0ZW5zaW9uIGFscmVhZHkgc2V0IGZvcgotCi1YTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy50aXRsZT0gQ3JlYXRlIEVkaXRhYmxlIENvcHkgb2YgSW50ZXJuYWwgU2NoZW1lCi1YTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy5jb21tZW50PSBZb3UgY2Fubm9uIGVkaXQgYW4gaW50ZXJuYWwgSWQgTWFwIFNjaGVtZS5cblRoZXJlZm9yZSwgYSB1c2VyIGNvcHkgb2YgdGhlIElkIE1hcCBTY2hlbWUgd2lsbCBjcmVhdGVkIGZvciBlZGl0aW5nLlxuVGhlIGV4dGVuc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVybmFsIElkIE1hcCBTY2hlbWUgd2lsbCBub3QgYmUgdHJhbnNmZXJyZWQuXG5cblBsZWFzZSBFbnRlciBhIG5ldyBuYW1lIGZvciB0aGUgSWQgTWFwIFNjaGVtZSBjb3B5LgotWE1MQ29tcGFyZUVkaXRDb3B5SWRNYXBEaWFsb2cubGFiZWw9IElEIE1hcCBOYW1lIG9mIENvcHk6Ci1YTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy5lcnJvci5ub25hbWU9IEVudGVyIElkIE1hcCBOYW1lLgotWE1MQ29tcGFyZUVkaXRDb3B5SWRNYXBEaWFsb2cuZXJyb3IuaW52YWxpZG5hbWU9IEludmFsaWQgSWQgTWFwIE5hbWUuCi1YTUxDb21wYXJlRWRpdENvcHlJZE1hcERpYWxvZy5lcnJvci5uYW1lRXhpc3RzPSBJZCBNYXAgTmFtZSBhbHJlYWR5IGV4aXN0cy4KLQotWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmVkaXRUaXRsZT0gRWRpdCBNYXBwaW5nCi1YTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cubmV3VGl0bGU9IE5ldyBNYXBwaW5nCi1YTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuZWxlbWVudD0gRWxlbWVudAotWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLnNpZ25hdHVyZT0gUGF0aAotWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmlkYXR0cmlidXRlPSBJRAotWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmlkdHlwZT0gSUQgU291cmNlCi1YTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuaWR0eXBlLnRvb2x0aXA9IFNlbGVjdCB3aGV0aGVyIHRoZSBJRCBpcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQgb3IgdGhlIHRleHQgb2YgYSBjaGlsZAotWE1MQ29tcGFyZUVkaXRNYXBwaW5nRGlhbG9nLmlkdHlwZS5hdHRyaWJ1dGUudG9vbHRpcD0gSUQgaXMgYW4gYXR0cmlidXRlIG9mIHRoZSBlbGVtZW50Ci1YTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuaWR0eXBlLmNoaWxkYm9keS50b29sdGlwPSBJRCBpcyB0aGUgdGV4dCBvZiBhIGNoaWxkIGVsZW1lbnQKLVhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5ub25hbWU9IEVudGVyIEVsZW1lbnQgTmFtZS4KLVhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5pbnZhbGlkbmFtZT0gSW52YWxpZCBFbGVtZW50IE5hbWUuCi1YTUxDb21wYXJlRWRpdE1hcHBpbmdEaWFsb2cuZXJyb3IubWFwcGluZ0V4aXN0cz0gTWFwcGluZyBhbHJlYWR5IGV4aXN0cy4KLVhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5pbnZhbGlkc2lnbmF0dXJlPSBJbnZhbGlkIFNpZ25hdHVyZS4KLVhNTENvbXBhcmVFZGl0TWFwcGluZ0RpYWxvZy5lcnJvci5pbnZhbGlkaWRhdHRyaWJ1dGU9IEludmFsaWQgSUQgQXR0cmlidXRlLgotCi1YTUxDb21wYXJlRWRpdE9yZGVyZWREaWFsb2cubmV3VGl0bGU9TmV3IE9yZGVyZWQKLVhNTENvbXBhcmVFZGl0T3JkZXJlZERpYWxvZy5lZGl0VGl0bGU9RWRpdCBPcmRlcmVkCi1YTUxDb21wYXJlRWRpdE9yZGVyZWREaWFsb2cuZXJyb3Iub3JkZXJlZEV4aXN0cz1PcmRlcmVkIGVudHJ5IGFscmVhZHkgZXhpc3RzCi0KLSMKLSMgWE1MU3RydWN0dXJlVmlld2VyCi0jCi1YTUxTdHJ1Y3R1cmVWaWV3ZXIubmV3dGFzaz0gQ3JlYXRlIG5ldyBJZCBNYXAgU2NoZW1lCi1YTUxTdHJ1Y3R1cmVWaWV3ZXIuYWN0aW9uLm5vdFVzZXJJZE1hcD0gUGxlYXNlIHNlbGVjdCBhIFVzZXIgSWQgTWFwcGluZyBTY2hlbWUKLVhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0SWQudGV4dDE9IEFscmVhZHkgc2V0IGFzIElkCi1YTUxTdHJ1Y3R1cmVWaWV3ZXIuYWN0aW9uLnNldElkLnRleHQyPSBSZXBsYWNlIGV4aXN0aW5nIElkCi1YTUxTdHJ1Y3R1cmVWaWV3ZXIuYWN0aW9uLnNldElkLnRleHQzPSBTZXQgYXMgSWQKLVhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0T3JkZXJlZC5leGlzdHM9IE9yZGVyZWQgZW50cnkgZXhpc3RzIGFscmVhZHkKLVhNTFN0cnVjdHVyZVZpZXdlci5hY3Rpb24uc2V0T3JkZXJlZD1TZXQgY2hpbGRyZW4gYXMgb3JkZXJlZAotWE1MU3RydWN0dXJlVmlld2VyLm1hdGNoaW5nLmJlZ2luVGFzaz1SdW5uaW5nIE1hdGNoaW5nIGFsZ29yaXRobS4uLgotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC90ZXN0cy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9BbGxYTUxDb21wYXJlVGVzdHMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3Rlc3RzL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0FsbFhNTENvbXBhcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk3ZTlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3Rlc3RzL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL0FsbFhNTENvbXBhcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGVzdFN1aXRlIHRoYXQgcnVucyBhbGwgdGhlIFhNTCBDb21wYXJlIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsWE1MQ29tcGFyZVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSAoICkgewotCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBUZXN0U3VpdGUoIkFsbCBYTUwgQ29tcGFyZSBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCXN1aXRlLmFkZFRlc3QoVGVzdFhNTFN0cnVjdHVyZUNyZWF0b3Iuc3VpdGUoKSk7Ci0JICAgIHJldHVybiBzdWl0ZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3Rlc3RzL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1Rlc3RYTUxTdHJ1Y3R1cmVDcmVhdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC90ZXN0cy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3htbC9UZXN0WE1MU3RydWN0dXJlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY1ZjdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sL3Rlc3RzL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMveG1sL1Rlc3RYTUxTdHJ1Y3R1cmVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5YTUxDaGlsZHJlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLlhNTFN0cnVjdHVyZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0WE1MU3RydWN0dXJlQ3JlYXRvciBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlEb2N1bWVudCBmZG9jOwotCVhNTFN0cnVjdHVyZUNyZWF0b3IgZnNjOwotCQotCXB1YmxpYyBjbGFzcyBUZXN0U3RyZWFtIGltcGxlbWVudHMgSUVuY29kZWRTdHJlYW1Db250ZW50QWNjZXNzb3IgewotCQlTdHJpbmcgZlN0cmluZzsKLQkJCi0JCXB1YmxpYyBUZXN0U3RyZWFtKFN0cmluZyBzdHJpbmcpIHsKLQkJCWZTdHJpbmc9IHN0cmluZzsKLQkJfQotCQkKLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZTdHJpbmcuZ2V0Qnl0ZXMoIlVURi0xNiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJCXJldHVybiAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXN0WE1MU3RydWN0dXJlQ3JlYXRvcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0WE1MU3RydWN0dXJlQ3JlYXRvci5uYW1lKCk9PSIgKyBnZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWZkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJZnNjID0gbmV3IFhNTFN0cnVjdHVyZUNyZWF0b3IoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9yZW1vdmUgc2V0LXVwCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFhNTFN0cnVjdHVyZUNyZWF0b3IuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwKCkgewotCQlUZXN0U3RyZWFtIHM9IG5ldyBUZXN0U3RyZWFtKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG48YSBhdHRyMT1cIiZsdDtiJmd0OyZsdDsvYiZndDtcIlxuYXR0cjI9XCJoZVxuIGxsXG4gbzJcIiBhdHRyMz1cImhlbGxvM1wiXG5hdHRyND1cImhlbGxvNFwiPjxiIGF0dHI9XG5cImJhdHRyXCIgYXR0cjI9XCJiYXR0cjJcIj5cbjxjLz5cbjwvYj5cbjxiMi8+XG48L2E+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQlYTUxDaGlsZHJlbiBUcmVlPSAoWE1MQ2hpbGRyZW4pIGZzYy5nZXRTdHJ1Y3R1cmUocyk7Ci0KLQkJWE1MQ2hpbGRyZW4gRXhwZWN0ZWRUcmVlID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5ULFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCwgIiIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fRUxFTUVOVCksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkCi0JCS8vY3JlYXRlIEV4cGVjdGVkIFRyZWUKLQkJWE1MQ2hpbGRyZW4gcGFyZW50ID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5ULCJhPFsxXSIsIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz5cbjxhIGF0dHIxPVwiJmx0O2ImZ3Q7Jmx0Oy9iJmd0O1wiXG5hdHRyMj1cImhlXG4gbGxcbiBvMlwiIGF0dHIzPVwiaGVsbG8zXCJcbmF0dHI0PVwiaGVsbG80XCI+PGIgYXR0cj1cblwiYmF0dHJcIiBhdHRyMj1cImJhdHRyMlwiPlxuPGMvPlxuPC9iPlxuPGIyLz5cbjwvYT5cbiIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcGFyZW50LnNldE5hbWUoImEgWzFdIik7IC8vJE5PTi1OTFMtMSQKLQkJRXhwZWN0ZWRUcmVlLmFkZENoaWxkKHBhcmVudCk7Ci0JCXBhcmVudC5zZXRQYXJlbnQoRXhwZWN0ZWRUcmVlKTsKLQkJWE1MQ2hpbGRyZW4gY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfQVRUUklCVVRFLCJhdHRyMSIsIjxiPjwvYj4iLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImF0dHIxIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fQVRUUklCVVRFKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY3VycmVudC5zZXROYW1lKCJhdHRyMSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfQVRUUklCVVRFLCJhdHRyMiIsImhlICBsbCAgbzIiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImF0dHIyIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fQVRUUklCVVRFKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY3VycmVudC5zZXROYW1lKCJhdHRyMiIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfQVRUUklCVVRFLCJhdHRyMyIsImhlbGxvMyIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyJhIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYXR0cjMiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9BVFRSSUJVVEUpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljdXJyZW50LnNldE5hbWUoImF0dHIzIik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyZW50LmFkZENoaWxkKGN1cnJlbnQpOwotCQljdXJyZW50LnNldFBhcmVudChwYXJlbnQpOwotCQljdXJyZW50ID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9BVFRSSUJVVEUsImF0dHI0IiwiaGVsbG80IiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhdHRyNCIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0FUVFJJQlVURSksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWN1cnJlbnQuc2V0TmFtZSgiYXR0cjQiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0VMRU1FTlQsImI8WzFdIiwiPGIgYXR0cj1cblwiYmF0dHJcIiBhdHRyMj1cImJhdHRyMlwiPlxuPGMvPlxuPC9iPlxuIiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArImIiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5UKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY3VycmVudC5zZXROYW1lKCJiIFsxXSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJcGFyZW50ID0gY3VycmVudDsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfQVRUUklCVVRFLCJhdHRyIiwiYmF0dHIiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImIiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhdHRyIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fQVRUUklCVVRFKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQljdXJyZW50LnNldE5hbWUoImF0dHIiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0FUVFJJQlVURSwiYXR0cjIiLCJiYXR0cjIiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImIiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhdHRyMiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0FUVFJJQlVURSksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJY3VycmVudC5zZXROYW1lKCJhdHRyMiIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfRUxFTUVOVCwiYzxbMV0iLCI8Yy8+IiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImMiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5UKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQljdXJyZW50LnNldE5hbWUoImMgWzFdIik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyZW50LmFkZENoaWxkKGN1cnJlbnQpOwotCQljdXJyZW50LnNldFBhcmVudChwYXJlbnQpOwotCQlwYXJlbnQgPSAoWE1MQ2hpbGRyZW4pIHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfRUxFTUVOVCwiYjI8WzFdIiwiPGIyLz4iLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYjIiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5UKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY3VycmVudC5zZXROYW1lKCJiMiBbMV0iKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCQotCQljaGVja1RyZWVzKFRyZWUsRXhwZWN0ZWRUcmVlKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotCQlUZXN0U3RyZWFtIHM9IG5ldyBUZXN0U3RyZWFtKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG48YT5ib2R5X2FfMVxuICA8Yj5ib2R5X2JfMVxuICAgIDxjPmJvZHlfY18xXG4gICAgICA8ZDI+Ym9keV9kMlxuICAgICAgPC9kMj5cbmJvZHlfY18yXG4gICAgPC9jPlxuYm9keV9iXzJcbiAgPC9iPlxuYm9keV9hXzJcbiAgPGIyPlxuICA8L2IyPlxuYm9keV9hXzNcbjwvYT4iKTsgLy8kTk9OLU5MUy0xJAotCQlYTUxDaGlsZHJlbiBUcmVlPSAoWE1MQ2hpbGRyZW4pIGZzYy5nZXRTdHJ1Y3R1cmUocyk7Ci0KLQkJWE1MQ2hpbGRyZW4gRXhwZWN0ZWRUcmVlID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5ULFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCwgIiIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fRUxFTUVOVCksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkCi0JCS8vY3JlYXRlIEV4cGVjdGVkIFRyZWUKLQkJWE1MQ2hpbGRyZW4gcGFyZW50ID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5ULCJhPFsxXSIsIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz5cbjxhPmJvZHlfYV8xXG4gIDxiPmJvZHlfYl8xXG4gICAgPGM+Ym9keV9jXzFcbiAgICAgIDxkMj5ib2R5X2QyXG4gICAgICA8L2QyPlxuYm9keV9jXzJcbiAgICA8L2M+XG5ib2R5X2JfMlxuICA8L2I+XG5ib2R5X2FfMlxuICA8YjI+XG4gIDwvYjI+XG5ib2R5X2FfM1xuPC9hPiIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcGFyZW50LnNldE5hbWUoImEgWzFdIik7IC8vJE5PTi1OTFMtMSQKLQkJRXhwZWN0ZWRUcmVlLmFkZENoaWxkKHBhcmVudCk7Ci0JCXBhcmVudC5zZXRQYXJlbnQoRXhwZWN0ZWRUcmVlKTsKLQkJWE1MQ2hpbGRyZW4gY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfVEVYVCwiYm9keV8oMSkiLCJib2R5X2FfMVxuICAiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1RFWFQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJY3VycmVudC5zZXROYW1lKCJib2R5ICgxKSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfRUxFTUVOVCwiYjxbMV0iLCI8Yj5ib2R5X2JfMVxuICAgIDxjPmJvZHlfY18xXG4gICAgICA8ZDI+Ym9keV9kMlxuICAgICAgPC9kMj5cbmJvZHlfY18yXG4gICAgPC9jPlxuYm9keV9iXzJcbiAgPC9iPlxuIiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJiIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fRUxFTUVOVCksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWN1cnJlbnQuc2V0TmFtZSgiYiBbMV0iKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCXBhcmVudCA9IGN1cnJlbnQ7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX1RFWFQsImJvZHlfKDEpIiwiYm9keV9iXzFcbiAgICAiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImIiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9URVhUKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY3VycmVudC5zZXROYW1lKCJib2R5ICgxKSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfRUxFTUVOVCwiYzxbMV0iLCI8Yz5ib2R5X2NfMVxuICAgICAgPGQyPmJvZHlfZDJcbiAgICAgIDwvZDI+XG5ib2R5X2NfMlxuICAgIDwvYz5cbiIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyJhIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImMiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9FTEVNRU5UKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQljdXJyZW50LnNldE5hbWUoImMgWzFdIik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyZW50LmFkZENoaWxkKGN1cnJlbnQpOwotCQljdXJyZW50LnNldFBhcmVudChwYXJlbnQpOwotCQlwYXJlbnQgPSBjdXJyZW50OwotCQljdXJyZW50ID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9URVhULCJib2R5XygxKSIsImJvZHlfY18xXG4gICAgICAiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJiIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYyIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1RFWFQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCWN1cnJlbnQuc2V0TmFtZSgiYm9keSAoMSkiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX0VMRU1FTlQsImQyPFsxXSIsIjxkMj5ib2R5X2QyXG4gICAgICA8L2QyPlxuIiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImMiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJkMiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJY3VycmVudC5zZXROYW1lKCJkMiBbMV0iKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCXBhcmVudCA9IGN1cnJlbnQ7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX1RFWFQsImJvZHlfKDEpIiwiYm9keV9kMlxuICAgICAgIiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImMiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJkMiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1RFWFQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJY3VycmVudC5zZXROYW1lKCJib2R5ICgxKSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJcGFyZW50ID0gKFhNTENoaWxkcmVuKSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX1RFWFQsImJvZHlfKDIpIiwiXG5ib2R5X2NfMlxuICAgICIsKFhNTFN0cnVjdHVyZUNyZWF0b3IuUk9PVF9JRCArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyAiYSIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImIiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJjIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fVEVYVCksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJY3VycmVudC5zZXROYW1lKCJib2R5ICgyKSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJcGFyZW50ID0gKFhNTENoaWxkcmVuKSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCWN1cnJlbnQgPSBuZXcgWE1MQ2hpbGRyZW4oWE1MU3RydWN0dXJlQ3JlYXRvci5UWVBFX1RFWFQsImJvZHlfKDIpIiwiXG5ib2R5X2JfMlxuICAiLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJiIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fVEVYVCksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWN1cnJlbnQuc2V0TmFtZSgiYm9keSAoMikiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCXBhcmVudCA9IChYTUxDaGlsZHJlbikgcGFyZW50LmdldFBhcmVudCgpOwotCQljdXJyZW50ID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9URVhULCJib2R5XygyKSIsIlxuYm9keV9hXzJcbiAgIiwoWE1MU3RydWN0dXJlQ3JlYXRvci5ST09UX0lEICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJhIiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9TRVBBUkFUT1IgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fVEVYVCksIGZkb2MsIDAsIDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQljdXJyZW50LnNldE5hbWUoImJvZHkgKDIpIik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyZW50LmFkZENoaWxkKGN1cnJlbnQpOwotCQljdXJyZW50LnNldFBhcmVudChwYXJlbnQpOwotCQljdXJyZW50ID0gbmV3IFhNTENoaWxkcmVuKFhNTFN0cnVjdHVyZUNyZWF0b3IuVFlQRV9FTEVNRU5ULCJiMjxbMV0iLCI8YjI+XG4gIDwvYjI+XG4iLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArICJiMiIgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX0VMRU1FTlQpLCBmZG9jLCAwLCAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljdXJyZW50LnNldE5hbWUoImIyIFsxXSIpOyAvLyROT04tTkxTLTEkCi0JCXBhcmVudC5hZGRDaGlsZChjdXJyZW50KTsKLQkJY3VycmVudC5zZXRQYXJlbnQocGFyZW50KTsKLQkJY3VycmVudCA9IG5ldyBYTUxDaGlsZHJlbihYTUxTdHJ1Y3R1cmVDcmVhdG9yLlRZUEVfVEVYVCwiYm9keV8oMykiLCJcbmJvZHlfYV8zXG4iLChYTUxTdHJ1Y3R1cmVDcmVhdG9yLlJPT1RfSUQgKyBYTUxTdHJ1Y3R1cmVDcmVhdG9yLlNJR05fU0VQQVJBVE9SICsgImEiICsgWE1MU3RydWN0dXJlQ3JlYXRvci5TSUdOX1NFUEFSQVRPUiArIFhNTFN0cnVjdHVyZUNyZWF0b3IuU0lHTl9URVhUKSwgZmRvYywgMCwgMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWN1cnJlbnQuc2V0TmFtZSgiYm9keSAoMikiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQuYWRkQ2hpbGQoY3VycmVudCk7Ci0JCWN1cnJlbnQuc2V0UGFyZW50KHBhcmVudCk7Ci0KLQkJY2hlY2tUcmVlcyhUcmVlLEV4cGVjdGVkVHJlZSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1RyZWVzKFhNTE5vZGUgbGVmdCwgWE1MTm9kZSByaWdodCkgewotCQlpZiAobGVmdCAhPSBudWxsICYmIHJpZ2h0ICE9IG51bGwpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGxlZnQuZ2V0TmFtZSgpICsgIiwgIiArIHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiPiIgKyBsZWZ0LmdldFZhbHVlKCkgKyAiPFxuPiIgKyByaWdodC5nZXRWYWx1ZSgpICsgIjwiKTsKLQkJCWFzc2VydFRydWUobGVmdC50ZXN0RXF1YWxzKHJpZ2h0KSk7Ci0JCQlPYmplY3RbXSBsZWZ0Q2hpbGRyZW4gPSBsZWZ0LmdldENoaWxkcmVuKCk7Ci0JCQlPYmplY3RbXSByaWdodENoaWxkcmVuID0gcmlnaHQuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChsZWZ0Q2hpbGRyZW4gIT0gbnVsbCAmJiByaWdodENoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlpZiAobGVmdENoaWxkcmVuLmxlbmd0aCA9PSByaWdodENoaWxkcmVuLmxlbmd0aCkgewotCQkJCQlmb3IgKGludCBpPTA7IGk8bGVmdENoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCQkJY2hlY2tUcmVlcygoWE1MTm9kZSkgbGVmdENoaWxkcmVuW2ldLCAoWE1MTm9kZSkgcmlnaHRDaGlsZHJlbltpXSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKCAoKGxlZnQgPT0gbnVsbCkgJiYgKHJpZ2h0ICE9IG51bGwpKSB8fCAoKGxlZnQgIT0gbnVsbCkgJiYgKHJpZ2h0ID09IG51bGwpKSApIHsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2ZmN2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29tcGFyZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZmFjZS50ZXh0PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwYTQ0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSNUdWUgTm92IDMwIDE1OjQ2OjM4IENFVCAyMDA0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1NmU2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuY29tcGFyZWV4YW1wbGVzLmphciA9IHNyYy8KLQotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLQkJCQlhYm91dC5odG1sLFwKLQkJCQlwbHVnaW4ucHJvcGVydGllcyxcCi0JCQkJcGx1Z2luLnhtbCxcCi0JCQkJY29tcGFyZWV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL2RvYy1odG1sL2hnbGVnYWwuaHRtIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9kb2MtaHRtbC9oZ2xlZ2FsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NzFiNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL2RvYy1odG1sL2hnbGVnYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPExJTksgUkVMPSJzdHlsZXNoZWV0IiBIUkVGPSIuLi8uLi8uLi9ib29rLmNzcyIgQ0hBUlNFVD0iSVNPLTg4NTktMSIgVFlQRT0idGV4dC9jc3MiPgotICA8dGl0bGU+TGVnYWwgTm90aWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgzPgotPGEgTkFNRT0iTm90aWNlcyI+PC9hPk5vdGljZXM8L2gzPgotKGMpIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvZG9jLWh0bWwvbmdpYm1jcHkuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9kb2MtaHRtbC9uZ2libWNweS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODZlNDMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9kb2MtaHRtbC9uZ2libWNweS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL2RvYy1odG1sL3VpX3N0cnVjdHVyZWNyZWF0b3JfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvZG9jLWh0bWwvdWlfc3RydWN0dXJlY3JlYXRvcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU5NmI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvZG9jLWh0bWwvdWlfc3RydWN0dXJlY3JlYXRvcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TdHJ1Y3R1cmFsIENvbXBhcmUgZm9yIEtleS9WYWx1ZSBQYWlyczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPkNvbXBhcmUgRXhhbXBsZSAtIFN0cnVjdHVyYWwgQ29tcGFyZSBmb3IgS2V5L1ZhbHVlIFBhaXJzPC9oMj4KLQotPGgzPkludHJvZHVjdGlvbjwvaDM+Ci0KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHN1cHBvcnQgc3RydWN0dXJhbCBjb21wYXJlIGZvcgotZmlsZXMgY29uc2lzdGluZyBvZiBrZXkvdmFsdWUgcGFpcnMuIEl0IHNob3dzIGhvdyB0byBpbXBsZW1lbnQgYW5kIHJlZ2lzdGVyIGEKLWN1c3RvbSBzdHJ1Y3R1cmUgY3JlYXRvciB0aGF0IHBhcnNlcyBrZXkvdmFsdWUgcGFpcnMgaW50byBhIHRyZWUgc3RydWN0dXJlCi10aGF0IGlzIHVzZWQgYXMgdGhlIGlucHV0IHRvIHRoZSBzdHJ1Y3R1cmFsIGNvbXBhcmUgZnJhbWV3b3JrIHByb3ZpZGVkIGJ5IHRoZQotQ29tcGFyZSBwbHVnaW4uIEluIGFkZGl0aW9uLCBpdCByZWdpc3RlcnMgYSBzdGFuZGFyZCB0ZXh0IHZpZXdlciBmb3IgdGhlIGluZGl2aWR1YWwKLWtleS92YWx1ZSBwYWlycy4KLQotPHA+Ci0KLVRoaXMgZXhhbXBsZSBpcyBvbmx5IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLiBTdHJ1Y3R1cmFsIGNvbXBhcmUgc3VwcG9ydAotZm9yIEphdmEgcHJvcGVydHkgZmlsZXMgKGFub3RoZXIga2V5L3ZhbHVlIGZvcm1hdCkgaXMgcHJvdmlkZWQgYnkgdGhlIEVjbGlwc2UgSmF2YSBUb29saW5nLiAKLQotPGgzPiBSdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPG9sPgotCTxsaT5DcmVhdGUgYSBwcm9qZWN0IChub3QgbmVjZXNzYXJpbHkgYSBKYXZhIHByb2plY3QpPC9saT4KLQkKLQk8bGk+Q3JlYXRlIGEga2V5L3ZhbHVlIHBhaXIgZmlsZSBmMS5rdjwvbGk+Ci0JCi0JPGxpPk9wZW4gPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlByZWZlcmVuY2VzPC9zdHJvbmc+ICZndDsgPHN0cm9uZz5Xb3JrYmVuY2g8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPkZpbGUgQXNzb2NpYXRpb248L3N0cm9uZz4KLQlhbmQgYXNzb2NpYXRlIHRoZSBkZWZhdWx0IHRleHQgZWRpdG9yIHdpdGggdGhlIGZpbGUgZXh0ZW5zaW9uICJrdiI8L2xpPgotCQotCTxsaT5PcGVuIGYxLmt2IHdpdGggdGhlIGVkaXRvciBhbmQgZW50ZXIgdGhpcyBjb250ZW50cwotCTxwcmU+Ci1sYXN0bmFtZT1Eb2UKLWZpcnN0bmFtZT1Kb2huCi1jaXR5PUNoaWNhZ28KLXN0YXRlPUlMCi08L3ByZT48L2xpPgotCQotCTxsaT5NYWtlIGEgY29weSBvZiB0aGlzIGZpbGUgYW5kIHJlbmFtZSBpdCBmMi5rdjwvbGk+Ci0JCi0JPGxpPk9wZW4gZjIua3YgYW5kIGNoYW5nZSB0aGUgZmlyc3RuYW1lICJKb2huIiB0byAiTWFyeSI8L2xpPgotCi0JPGxpPkFkZCBhbm90aGVyIGtleS92YWx1ZSBwYWlyICJjb3VudHJ5PVVTIiB0byBmMi5rdjwvbGk+Ci0JCi0JPGxpPlNlbGVjdCBib3RoIGZpbGVzIGYxLmt2IGFuZCBmMi5rdjwvbGk+Ci0JCi0JPGxpPkZyb20gdGhlIGNvbnRleHQgbWVudSBzZWxlY3QgPHN0cm9uZz5Db21wYXJlIFdpdGg8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPkVhY2ggT3RoZXI8L3N0cm9uZz48L2xpPgotCQotCTxsaT5BIG5ldyBjb21wYXJlIGVkaXRvciBvcGVucyB0aGF0IHNob3dzIHRoZSBzdHJ1Y3R1cmFsIGRpZmZlcmVuY2VzIG9mIGJvdGggZmlsZXMgaW4gaXRzCi0JdG9wIHBhbmUuIFNlbGVjdGluZyBvbmUgb2YgdGhlIHByb3BlcnRpZXMgImZpcnN0bmFtZSIgb3IgImNvdW50cnkiIGZlZWRzIHRoZSB0ZXh0IG9mIHRoZQotCWNvcnJlc3BvbmRpbmcga2V5L3ZhbHVlIHBhaXIgaW50byB0aGUgc3RhbmRhcmQgdGV4dCBjb21wYXJlIHZpZXdlciBpbiB0aGUgYm90dG9tIHBhbmUuCi0JPC9saT4KLQkKLTwvb2w+Ci0KLTxoMz5Db2RlIG9yZ2FuaXphdGlvbiBvZiB0aGUgZXhhbXBsZTwvaDM+Ci1UaGUgZXhhbXBsZSBjb2RlIGlzIG9yZ2FuaXplZCBpbiBhIHNpbmdsZSBwYWNrYWdlIDx0dD5vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnN0cnVjdHVyZWNyZWF0b3I8L3R0PjoKLQotPHVsPgotCTxsaT48dHQ+S2V5VmFsdWVQYWlyU3RydWN0dXJlQ3JlYXRvcjwvdHQ+PGJyPgotCWlzIHRoZSBzdHJ1Y3R1cmUgY3JlYXRvciB0aGF0IHBhcnNlcyB0aGUgY29udGVudHMgb2YgYSBzdHJlYW0gaW50byBhIHRyZWUgb2YKLQk8dHQ+SVN0cnVjdHVyZUNvbXBhcmF0b3I8L3R0PnMuCi0JPC9saT4KLQkKLQk8bGk+PHR0PlRleHRNZXJnZVZpZXdlckNyZWF0b3I8L3R0Pjxicj4KLQlpcyBhIGZhY3RvcnkgZm9yIFRleHRNZXJnZVZpZXdlcnMuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSB0eXBlICJrdnR4dCIgd2hpY2ggaXMgdGhlCi0JdHlwZSBvZiBhbiBpbmRpdmlkdWFsIGtleS92YWx1ZSBwYWlyLgotCTwvbGk+Ci0JCi0JPGxpPjx0dD5VdGlsPC90dD48YnI+Ci0JcHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBOTFMgc3VwcG9ydCBhbmQgZm9yIHJlYWRpbmcgYW4gSW5wdXRTdHJlYW0gYXMgYSBTdHJpbmcuCi0JPC9saT4KLQkKLTwvdWw+Ci0KLTxwPiZuYnNwOzwvcD4KLQotPHA+PGEgaHJlZj0iaGdsZWdhbC5odG0iPjxpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIiBCT1JERVI9MCBoZWlnaHQ9MTQgd2lkdGg9MzI0PjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkMzEyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBSZXNvdXJjZSBzdHJpbmdzIGZvciBDb21wYXJlIEV4YW1wbGVzIHBsdWdpbi54bWwgZmlsZQotIwotcGx1Z2luTmFtZT0gQ29tcGFyZSBFeGFtcGxlCi1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjA5NTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iY29tcGFyZWV4YW1wbGVzLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIAotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb21wYXJlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIj4KLSAgICAgIDx2aWV3ZXIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imt2dHh0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMuc3RydWN0dXJlY3JlYXRvci5UZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yIj4KLSAgICAgIDwvdmlld2VyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZUNyZWF0b3JzIj4KLSAgICAgIDxzdHJ1Y3R1cmVDcmVhdG9yCi0gICAgICAgICAgICBleHRlbnNpb25zPSJrdiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnN0cnVjdHVyZWNyZWF0b3IuS2V5VmFsdWVQYWlyU3RydWN0dXJlQ3JlYXRvciI+Ci0gICAgICA8L3N0cnVjdHVyZUNyZWF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3N0cnVjdHVyZWNyZWF0b3IvQ29tcGFyZUV4YW1wbGVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy9zdHJ1Y3R1cmVjcmVhdG9yL0NvbXBhcmVFeGFtcGxlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2ODJjYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3N0cnVjdHVyZWNyZWF0b3IvQ29tcGFyZUV4YW1wbGVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBSZXNvdXJjZSBzdHJpbmdzCi0jCi1LZXlWYWx1ZVBhaXJTdHJ1Y3R1cmVDcmVhdG9yLnRpdGxlPSBLZXkvVmFsdWUgUGFpciBDb21wYXJlCi1LZXlWYWx1ZVBhaXJTdHJ1Y3R1cmVDcmVhdG9yLkNvcmVFeGNlcHRpb24ubWVzc2FnZT0gQ29yZUV4Y2VwdGlvbiAKLUtleVZhbHVlUGFpclN0cnVjdHVyZUNyZWF0b3IuQmFkTG9jYXRpb25FeGNlcHRpb24ubWVzc2FnZT0gQmFkTG9jYXRpb25FeGNlcHRpb24KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMvc3RydWN0dXJlY3JlYXRvci9LZXlWYWx1ZVBhaXJTdHJ1Y3R1cmVDcmVhdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3N0cnVjdHVyZWNyZWF0b3IvS2V5VmFsdWVQYWlyU3RydWN0dXJlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRiMWM3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMvc3RydWN0dXJlY3JlYXRvci9LZXlWYWx1ZVBhaXJTdHJ1Y3R1cmVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMuc3RydWN0dXJlY3JlYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLio7Ci0KLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBjcmVhdG9yIHBhcnNlcyBpbnB1dCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycwotICogYW5kIHJldHVybnMgdGhlIHBhaXJzIGFzIGEgdHJlZSBvZiA8Y29kZT5JU3RydWN0dXJlQ29tcGFyYXRvcjwvY29kZT5zLgotICogRWFjaCBrZXkvdmFsdWUgcGFpciBtdXN0IGJlIG9uIGEgc2VwYXJhdGUgbGluZSBhbmQga2V5cyBhcmUgc2VwYXJhdGVkCi0gKiBmcm9tIHZhbHVlcyBieSBhICc9Jy4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxwcmU+Ci0gKiAgICBmb289YmFyCi0gKiAgICBuYW1lPWpvZQotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBLZXlWYWx1ZVBhaXJTdHJ1Y3R1cmVDcmVhdG9yIGltcGxlbWVudHMgSVN0cnVjdHVyZUNyZWF0b3IgewotCQotCXN0YXRpYyBjbGFzcyBLZXlWYWx1ZU5vZGUgZXh0ZW5kcyBEb2N1bWVudFJhbmdlTm9kZSBpbXBsZW1lbnRzIElUeXBlZEVsZW1lbnQgewotCQkKLQkJU3RyaW5nIGZWYWx1ZTsKLQkJCi0JCXB1YmxpYyBLZXlWYWx1ZU5vZGUoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUsIElEb2N1bWVudCBkb2MsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJc3VwZXIoMCwgaWQsIGRvYywgc3RhcnQsIGxlbmd0aCk7Ci0JCQlmVmFsdWU9IHZhbHVlOwotCQl9Ci0JCQotCQlTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gZlZhbHVlOwotCQl9Ci0JCQkJCi0JCS8qCi0JCSAqIEBzZWUgSVR5cGVkRWxlbWVudCNnZXROYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRJZCgpOwotCQl9Ci0KLQkJLyoKLQkJICogRXZlcnkga2V5L3ZhbHVlIHBhaXIgaXMgb2YgdHlwZSAia3Z0eHQiLiBXZSByZWdpc3RlciBhIFRleHRNZXJnZVZpZXdlciBmb3IgaXQuIAotCQkgKiBAc2VlIElUeXBlZEVsZW1lbnQjZ2V0VHlwZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuICJrdnR4dCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBJVHlwZWRFbGVtZW50I2dldEltYWdlCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQlyZXR1cm4gQ29tcGFyZVVJLmdldEltYWdlKGdldFR5cGUoKSk7Ci0JCX0KLQl9Ci0JCQotCQkKLQlwdWJsaWMgS2V5VmFsdWVQYWlyU3RydWN0dXJlQ3JlYXRvcigpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQkvKgotCSAqIFRoaXMgdGl0bGUgd2lsbCBiZSBzaG93biBpbiB0aGUgdGl0bGUgYmFyIG9mIHRoZSBzdHJ1Y3R1cmUgY29tcGFyZSBwYW5lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIFV0aWwuZ2V0U3RyaW5nKCJLZXlWYWx1ZVBhaXJTdHJ1Y3R1cmVDcmVhdG9yLnRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgYSBub2RlLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlQ29tcGFyYXRvciBnZXRTdHJ1Y3R1cmUoT2JqZWN0IGlucHV0KSB7Ci0JCQotCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElTdHJlYW1Db250ZW50QWNjZXNzb3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJU3RyZWFtQ29udGVudEFjY2Vzc29yIHNjYT0gKElTdHJlYW1Db250ZW50QWNjZXNzb3IpIGlucHV0OwotCQl0cnkgewotCQkJU3RyaW5nIGNvbnRlbnRzPSBVdGlsLnJlYWRTdHJpbmcoc2NhKTsKLQkJCWlmIChjb250ZW50cyA9PSBudWxsKQotCQkJCWNvbnRlbnRzPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJRG9jdW1lbnQgZG9jPSBuZXcgRG9jdW1lbnQoY29udGVudHMpOwotCQkJCQkJCQotCQkJS2V5VmFsdWVOb2RlIHJvb3Q9IG5ldyBLZXlWYWx1ZU5vZGUoInJvb3QiLCAiIiwgZG9jLCAwLCBkb2MuZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCQlmb3IgKGludCBpPSAwOyBpIDwgZG9jLmdldE51bWJlck9mTGluZXMoKTsgaSsrKSB7Ci0JCQkJCi0JCQkJSVJlZ2lvbiByPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCVN0cmluZyBzPSBkb2MuZ2V0KHIuZ2V0T2Zmc2V0KCksIHIuZ2V0TGVuZ3RoKCkpOwotCQkJCWludCBzdGFydD0gci5nZXRPZmZzZXQoKTsKLQkJCQkJCi0JCQkJU3RyaW5nIGtleT0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdmFsdWU9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHBvcz0gcy5pbmRleE9mKCc9Jyk7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCWtleT0gcy5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCQkJdmFsdWU9IHMuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlrZXk9IHM7Ci0JCQkJfQotCQkJCWlmIChrZXkubGVuZ3RoKCkgPiAwKQotCQkJCQlyb290LmFkZENoaWxkKG5ldyBLZXlWYWx1ZU5vZGUoa2V5LCB2YWx1ZSwgZG9jLCBzdGFydCwgcy5sZW5ndGgoKSkpOwotCQkJfQotCQkJcmV0dXJuIHJvb3Q7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBVdGlsLmdldFN0cmluZygiS2V5VmFsdWVQYWlyU3RydWN0dXJlQ3JlYXRvci5Db3JlRXhjZXB0aW9uLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29tcGFyZVVJLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvbXBhcmVVSS5QTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIGV4KSk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlTdHJpbmcgbWVzc2FnZT0gVXRpbC5nZXRTdHJpbmcoIktleVZhbHVlUGFpclN0cnVjdHVyZUNyZWF0b3IuQmFkTG9jYXRpb25FeGNlcHRpb24ubWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlDb21wYXJlVUkuZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29tcGFyZVVJLlBMVUdJTl9JRCwgMCwgbWVzc2FnZSwgZXgpKTsKLQkJfQotCQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShJU3RydWN0dXJlQ29tcGFyYXRvciBzdHJ1Y3R1cmUsIE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRWRpdGFibGVDb250ZW50ICYmIHN0cnVjdHVyZSBpbnN0YW5jZW9mIEtleVZhbHVlTm9kZSkgewotCQkJSURvY3VtZW50IGRvYz0gKChLZXlWYWx1ZU5vZGUpc3RydWN0dXJlKS5nZXREb2N1bWVudCgpOwotCQkJSUVkaXRhYmxlQ29udGVudCBiY2E9IChJRWRpdGFibGVDb250ZW50KSBpbnB1dDsKLQkJCVN0cmluZyBjPSBkb2MuZ2V0KCk7Ci0JCQliY2Euc2V0Q29udGVudChjLmdldEJ5dGVzKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoT2JqZWN0IG5vZGUsIGJvb2xlYW4gaWdub3JlV2hpdGVzcGFjZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEtleVZhbHVlTm9kZSkgewotCQkJU3RyaW5nIHM9ICgoS2V5VmFsdWVOb2RlKW5vZGUpLmdldFZhbHVlKCk7Ci0JCQlpZiAoaWdub3JlV2hpdGVzcGFjZSkKLQkJCQlzPSBzLnRyaW0oKTsKLQkJCXJldHVybiBzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVN0cnVjdHVyZUNvbXBhcmF0b3IgbG9jYXRlKE9iamVjdCBwYXRoLCBPYmplY3Qgc291cmNlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMvc3RydWN0dXJlY3JlYXRvci9UZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3N0cnVjdHVyZWNyZWF0b3IvVGV4dE1lcmdlVmlld2VyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIxNzMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvZXhhbXBsZXMvc3RydWN0dXJlY3JlYXRvci9UZXh0TWVyZ2VWaWV3ZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy5zdHJ1Y3R1cmVjcmVhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50bWVyZ2V2aWV3ZXIuVGV4dE1lcmdlVmlld2VyOwotCi0vKioKLSAqIEEgZmFjdG9yeSBvYmplY3QgZm9yIHRoZSA8Y29kZT5UZXh0TWVyZ2VWaWV3ZXI8L2NvZGU+LgotICogVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvbmx5IG9iamVjdHMgd2l0aCBhIGRlZmF1bHQKLSAqIGNvbnN0cnVjdG9yIGNhbiBiZSBjcmVhdGVkIHZpYSBhbiBleHRlbnNpb24gcG9pbnQKLSAqICh0aGlzIHByZWNsdWRlcyBWaWV3ZXJzKS4KLSAqLwotcHVibGljIGNsYXNzIFRleHRNZXJnZVZpZXdlckNyZWF0b3IgaW1wbGVtZW50cyBJVmlld2VyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21wYXJlQ29uZmlndXJhdGlvbiBtcCkgewotCQlyZXR1cm4gbmV3IFRleHRNZXJnZVZpZXdlcihwYXJlbnQsIG1wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3N0cnVjdHVyZWNyZWF0b3IvVXRpbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS9leGFtcGxlcy9zdHJ1Y3R1cmVjcmVhdG9yL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4ODRkYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL2V4YW1wbGVzL3N0cnVjdHVyZWNyZWF0b3IvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMuc3RydWN0dXJlY3JlYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuSVN0cmVhbUNvbnRlbnRBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFPSAib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy5zdHJ1Y3R1cmVjcmVhdG9yLkNvbXBhcmVFeGFtcGxlTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7CS8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZWFkcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBpbnRvIGEgc3RyaW5nLgotCSAqIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGlucHV0IHN0cmVhbSB1c2VzIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgZW5jb2RpbmcKLQkgKiAoPGNvZGU+UmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk8L2NvZGU+KS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRTdHJpbmcoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBlbmNvZGluZykgewotCQlpZiAoaXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXI9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQljaGFyW10gcGFydD0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgcmVhZD0gMDsKLQkJCXJlYWRlcj0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpKTsKLQotCQkJd2hpbGUgKChyZWFkPSByZWFkZXIucmVhZChwYXJ0KSkgIT0gLTEpCi0JCQkJYnVmZmVyLmFwcGVuZChwYXJ0LCAwLCByZWFkKTsKLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBzaWxlbnRseSBpZ25vcmVkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkvLyB3ZSBkb24ndCBsb2cgSU9FeGNlcHRpb24gd2hlbiBjbG9zaW5nIGEgZmlsZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIHJlYWRTdHJpbmcoSVN0cmVhbUNvbnRlbnRBY2Nlc3NvciBzYSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpcz0gc2EuZ2V0Q29udGVudHMoKTsKLQkJU3RyaW5nIGVuY29kaW5nPSBudWxsOwotCQlpZiAoc2EgaW5zdGFuY2VvZiBJRW5jb2RlZFN0cmVhbUNvbnRlbnRBY2Nlc3NvcikKLQkJCWVuY29kaW5nPSAoKElFbmNvZGVkU3RyZWFtQ29udGVudEFjY2Vzc29yKXNhKS5nZXRDaGFyc2V0KCk7Ci0JCWlmIChlbmNvZGluZyA9PSBudWxsKQotCQkJZW5jb2Rpbmc9IFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQlyZXR1cm4gcmVhZFN0cmluZyhpcywgZW5jb2RpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzMDJkMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb21wYXJlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0Lmp1bml0PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZmFjZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmp1bml0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzAwYTE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI1R1ZSBOb3YgMzAgMTU6NTA6MDcgQ0VUIDIwMDQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4YTg0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXM9IHBsdWdpbi54bWwsXAotCQkJIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCi1zb3VyY2UuY29tcGFyZXRlc3RzLmphcj0gc3JjLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Mzk3NTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUmVzb3VyY2Ugc3RyaW5ncyBmb3IgQ29tcGFyZSBUZXN0cyBwbHVnaW4ueG1sIGZpbGUKLSMKLXBsdWdpbk5hbWU9IENvbXBhcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0ZGNlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzLkNvbXBhcmVUZXN0UGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJjb21wYXJldGVzdHMuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29tcGFyZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmU3Y2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLS8qKgotICogVGVzdCBzb21lIG5vbi1VSSBhcmVhcyBvZiB0aGUgY29tcGFyZSBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCS8vJEpVbml0LUJFR0lOJAotCQkvL3N1aXRlLmFkZFRlc3RTdWl0ZShVSVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyZWFtTWVyZ2VyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb2NMaW5lQ29tcGFyYXRvclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyVGVzdC5jbGFzcyk7Ci0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvdGVzdHMvQ29tcGFyZVRlc3RQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvdGVzdHMvQ29tcGFyZVRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NGQ4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL0NvbXBhcmVUZXN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Zy1pbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXJlVGVzdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyZVRlc3RQbHVnaW4gZmdQbHVnaW47Ci0JCi0JcHVibGljIENvbXBhcmVUZXN0UGx1Z2luKCkgewotCQlmZ1BsdWdpbj0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmVUZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBmZ1BsdWdpbjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL0RvY0xpbmVDb21wYXJhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS90ZXN0cy9Eb2NMaW5lQ29tcGFyYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NjAzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL0RvY0xpbmVDb21wYXJhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwuRG9jTGluZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5yYW5nZWRpZmZlcmVuY2VyLklSYW5nZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY0xpbmVDb21wYXJhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRG9jTGluZUNvbXBhcmF0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGVtcHR5Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VzRXF1YWwoKSB7Ci0JCUlEb2N1bWVudCBkb2MxPSBuZXcgRG9jdW1lbnQoKTsKLQkJZG9jMS5zZXQoImlmIChzLnN0cmlwKSkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSURvY3VtZW50IGRvYzI9IG5ldyBEb2N1bWVudCgpOwotCQlkb2MyLnNldCgiaWYgKHMuc3RyaXApIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlSYW5nZUNvbXBhcmF0b3IgY29tcDE9IG5ldyBEb2NMaW5lQ29tcGFyYXRvcihkb2MxLCBudWxsLCB0cnVlKTsKLQkJSVJhbmdlQ29tcGFyYXRvciBjb21wMj0gbmV3IERvY0xpbmVDb21wYXJhdG9yKGRvYzIsIG51bGwsIHRydWUpOwotCi0JCUFzc2VydC5hc3NlcnRGYWxzZShjb21wMS5yYW5nZXNFcXVhbCgwLCBjb21wMiwgMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlQXRFbmQoKSB7Ci0JCUlEb2N1bWVudCBkb2MxPSBuZXcgRG9jdW1lbnQoKTsKLQkJZG9jMS5zZXQoImlmIChzLnN0cmlwKSkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSURvY3VtZW50IGRvYzI9IG5ldyBEb2N1bWVudCgpOwotCQlkb2MyLnNldCgiaWYgKHMuc3RyaXApKSAgICIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUmFuZ2VDb21wYXJhdG9yIGNvbXAxPSBuZXcgRG9jTGluZUNvbXBhcmF0b3IoZG9jMSwgbnVsbCwgdHJ1ZSk7Ci0JCUlSYW5nZUNvbXBhcmF0b3IgY29tcDI9IG5ldyBEb2NMaW5lQ29tcGFyYXRvcihkb2MyLCBudWxsLCB0cnVlKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjb21wMS5yYW5nZXNFcXVhbCgwLCBjb21wMiwgMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLQkJSURvY3VtZW50IGRvYzE9IG5ldyBEb2N1bWVudCgpOwotCQlkb2MxLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlEb2N1bWVudCBkb2MyPSBuZXcgRG9jdW1lbnQoKTsKLQkJZG9jMi5zZXQoIiAgICAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVJhbmdlQ29tcGFyYXRvciBjb21wMT0gbmV3IERvY0xpbmVDb21wYXJhdG9yKGRvYzEsIG51bGwsIHRydWUpOwotCQlJUmFuZ2VDb21wYXJhdG9yIGNvbXAyPSBuZXcgRG9jTGluZUNvbXBhcmF0b3IoZG9jMiwgbnVsbCwgdHJ1ZSk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoY29tcDEucmFuZ2VzRXF1YWwoMCwgY29tcDIsIDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL0ZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvdGVzdHMvRmlsdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU4ZWZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvdGVzdHMvRmlsdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLmludGVybmFsLkNvbXBhcmVGaWx0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCUNvbXBhcmVGaWx0ZXIgZkZpbHRlcjsKLQkKLQlwdWJsaWMgRmlsdGVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJGaWxlKCkgewotCQlDb21wYXJlRmlsdGVyIGY9IG5ldyBDb21wYXJlRmlsdGVyKCk7Ci0JCWYuc2V0RmlsdGVycygiKi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJmaWxlIGZvby5jbGFzcyBzaG91bGQgYmUgZmlsdGVyZWQiLCBmLmZpbHRlcigiZm9vLmNsYXNzIiwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoImZpbGUgZm9vLmphdmEgc2hvdWxkbid0IGJlIGZpbHRlcmVkIiwgZi5maWx0ZXIoImZvby5qYXZhIiwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyRG90RmlsZSgpIHsKLQkJQ29tcGFyZUZpbHRlciBmPSBuZXcgQ29tcGFyZUZpbHRlcigpOwotCQlmLnNldEZpbHRlcnMoIi5jdnNpZ25vcmUiKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiZmlsZSAuY3ZzaWdub3JlIHNob3VsZCBiZSBmaWx0ZXJlZCIsIGYuZmlsdGVyKCIuY3ZzaWdub3JlIiwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoImZpbGUgZm9vLmN2c2lnbm9yZSBzaG91bGRuJ3QgYmUgZmlsdGVyZWQiLCBmLmZpbHRlcigiZm9vLmN2c2lnbm9yZSIsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlckZvbGRlcigpIHsKLQkJQ29tcGFyZUZpbHRlciBmPSBuZXcgQ29tcGFyZUZpbHRlcigpOwotCQlmLnNldEZpbHRlcnMoImJpbi8iKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiZm9sZGVyIGJpbiBzaG91bGQgYmUgZmlsdGVyZWQiLCBmLmZpbHRlcigiYmluIiwgdHJ1ZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUFzc2VydC5hc3NlcnRGYWxzZSgiZmlsZSBiaW4gc2hvdWxkbid0IGJlIGZpbHRlcmVkIiwgZi5maWx0ZXIoImJpbiIsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpRmlsdGVyKCkgewotCQlDb21wYXJlRmlsdGVyIGY9IG5ldyBDb21wYXJlRmlsdGVyKCk7Ci0JCWYuc2V0RmlsdGVycygiKi5jbGFzcywgLmN2c2lnbm9yZSwgYmluLyIpOyAvLyROT04tTkxTLTEkCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJmaWxlIGZvby5jbGFzcyBzaG91bGQgYmUgZmlsdGVyZWQiLCBmLmZpbHRlcigiZm9vLmNsYXNzIiwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoImZpbGUgZm9vLmphdmEgc2hvdWxkbid0IGJlIGZpbHRlcmVkIiwgZi5maWx0ZXIoImZvby5qYXZhIiwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiZmlsZSAuY3ZzaWdub3JlIHNob3VsZCBiZSBmaWx0ZXJlZCIsIGYuZmlsdGVyKCIuY3ZzaWdub3JlIiwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoImZpbGUgZm9vLmN2c2lnbm9yZSBzaG91bGRuJ3QgYmUgZmlsdGVyZWQiLCBmLmZpbHRlcigiZm9vLmN2c2lnbm9yZSIsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQXNzZXJ0LmFzc2VydFRydWUoImZvbGRlciBiaW4gc2hvdWxkIGJlIGZpbHRlcmVkIiwgZi5maWx0ZXIoImJpbiIsIHRydWUsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoImZpbGUgYmluIHNob3VsZG4ndCBiZSBmaWx0ZXJlZCIsIGYuZmlsdGVyKCJiaW4iLCBmYWxzZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJpZnkoKSB7Ci0JCS8vQXNzZXJ0LmFzc2VydE51bGwoImZpbHRlcnMgZG9uJ3QgdmVyaWZ5IiwgRmlsdGVyLnZhbGlkYXRlUmVzb3VyY2VGaWx0ZXJzKCIqLmNsYXNzLCAuY3ZzaWdub3JlLCBiaW4vIikpOwotCQkvL0Fzc2VydC5hc3NlcnROb3ROdWxsKCJmaWx0ZXJzIHNob3VsZG4ndCB2ZXJpZnkiLCBGaWx0ZXIudmFsaWRhdGVSZXNvdXJjZUZpbHRlcnMoImJpbi8vIikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2NvbXBhcmUvdGVzdHMvU3RyZWFtTWVyZ2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS90ZXN0cy9TdHJlYW1NZXJnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTNkNDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS90ZXN0cy9TdHJlYW1NZXJnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JU3RyZWFtTWVyZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuaW50ZXJuYWwubWVyZ2UuVGV4dFN0cmVhbU1lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgU3RyZWFtTWVyZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIFN0cmluZyBlbmNvZGluZz0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIFN0cmVhbU1lcmdlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgdGVzdEluY29taW5nQWRkaXRpb24oKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JICAgIAotICAgICAgICBTdHJpbmcgYT0gImFiY1xuZGVmXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0PSAiYWJjXG5kZWZcbnh5eiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG89ICJhYmNcbmRlZlxuMTIzXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0PSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RhdHVzIHN0YXR1cz0gbWVyZ2Uob3V0cHV0LCBhLCB0LCBvKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5PSyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMuZ2V0Q29kZSgpLCBJU3RhdHVzLk9LKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dC50b1N0cmluZygpLCAiYWJjXG5kZWZcbjEyM1xueHl6XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5jb21pbmdEZWxldGlvbigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkgICAgCi0gICAgICAgIFN0cmluZyBhPSAiYWJjXG5kZWZcbnh5eiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHQ9ICJhYmNcbmRlZlxueHl6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgbz0gImFiY1xueHl6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dD0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAKLSAgICAgICAgSVN0YXR1cyBzdGF0dXM9IG1lcmdlKG91dHB1dCwgYSwgdCwgbyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuT0spOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLmdldENvZGUoKSwgSVN0YXR1cy5PSyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvdXRwdXQudG9TdHJpbmcoKSwgImFiY1xueHl6XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5jb21pbmdSZXBsYWNlbWVudCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkgICAgCi0gICAgICAgIFN0cmluZyBhPSAiYWJjXG5kZWZcbnh5eiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHQ9ICJhYmNcbmRlZlxueHl6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgbz0gImFiY1xuMTIzXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0PSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RhdHVzIHN0YXR1cz0gbWVyZ2Uob3V0cHV0LCBhLCB0LCBvKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5PSyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMuZ2V0Q29kZSgpLCBJU3RhdHVzLk9LKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dC50b1N0cmluZygpLCAiYWJjXG4xMjNcbnh5elxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vbkNvbmZsaWN0aW5nTWVyZ2UoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JICAgIAotICAgICAgICBTdHJpbmcgYT0gImFiY1xuZGVmXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0PSAiYWJjXG5kZWZcbnh5elxuZm9vIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgbz0gImFiY1xuMTIzXG40NTZcbnh5eiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgCi0gICAgICAgIElTdGF0dXMgc3RhdHVzPSBtZXJnZShvdXRwdXQsIGEsIHQsIG8pOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBJU3RhdHVzLk9LKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRDb2RlKCksIElTdGF0dXMuT0spOwotICAgICAgICBhc3NlcnRFcXVhbHMob3V0cHV0LnRvU3RyaW5nKCksICJhYmNcbjEyM1xuNDU2XG54eXpcbmZvb1xuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmZsaWN0aW5nUmVwbGFjZW1lbnQoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JICAgIAotICAgICAgICBTdHJpbmcgYT0gImFiY1xuZGVmXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0PSAiYWJjXG5mb29cbnh5eiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG89ICJhYmNcbmJhclxueHl6IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgCi0gICAgICAgIElTdGF0dXMgc3RhdHVzPSBtZXJnZShvdXRwdXQsIGEsIHQsIG8pOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5FUlJPUik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMuZ2V0Q29kZSgpLCBJU3RyZWFtTWVyZ2VyLkNPTkZMSUNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmZsaWN0aW5nQWRkaXRpb24oKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JICAgIAotICAgICAgICBTdHJpbmcgYT0gImFiY1xuZGVmXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0PSAiYWJjXG5kZWZcbjEyM1xueHl6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgbz0gImFiY1xuZGVmXG4xMjNcbnh5eiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0PSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RhdHVzIHN0YXR1cz0gbWVyZ2Uob3V0cHV0LCBhLCB0LCBvKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuT0spOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLmdldENvZGUoKSwgSVN0YXR1cy5PSyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvdXRwdXQudG9TdHJpbmcoKSwgImFiY1xuZGVmXG4xMjNcbnh5elxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmZsaWN0aW5nRGVsZXRpb24oKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JICAgIAotICAgICAgICBTdHJpbmcgYT0gImFiY1xuZGVmXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0PSAiYWJjXG54eXoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBvPSAiYWJjXG54eXoiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dD0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAKLSAgICAgICAgSVN0YXR1cyBzdGF0dXM9IG1lcmdlKG91dHB1dCwgYSwgdCwgbyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBJU3RhdHVzLk9LKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRDb2RlKCksIElTdGF0dXMuT0spOwotICAgICAgICBhc3NlcnRFcXVhbHMob3V0cHV0LnRvU3RyaW5nKCksICJhYmNcbnh5elxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIG1lcmdlKFN0cmluZ0J1ZmZlciBvdXRwdXQsIFN0cmluZyBhLCBTdHJpbmcgbSwgU3RyaW5nIHkpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gYW5jZXN0b3I9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhLmdldEJ5dGVzKGVuY29kaW5nKSk7Ci0gICAgICAgIElucHV0U3RyZWFtIHRhcmdldD0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG0uZ2V0Qnl0ZXMoZW5jb2RpbmcpKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gb3RoZXI9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh5LmdldEJ5dGVzKGVuY29kaW5nKSk7Ci0gICAgICAgIAotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3M9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBJU3RyZWFtTWVyZ2VyIG1lcmdlcj0gbmV3IFRleHRTdHJlYW1NZXJnZXIoKTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXM9IG1lcmdlci5tZXJnZShvcywgZW5jb2RpbmcsIGFuY2VzdG9yLCBlbmNvZGluZywgdGFyZ2V0LCBlbmNvZGluZywgb3RoZXIsIGVuY29kaW5nLCAoSVByb2dyZXNzTW9uaXRvciludWxsKTsKLQotICAgICAgICBvdXRwdXQuYXBwZW5kKG5ldyBTdHJpbmcob3MudG9CeXRlQXJyYXkoKSwgZW5jb2RpbmcpKTsKLSAKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL1VJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvY29tcGFyZS90ZXN0cy9VSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZGJkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9jb21wYXJlL3Rlc3RzL1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBVSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVUlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFVJKCkgewotCQkvLyBpbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyODgxYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5jb21wYXJlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29tcGFyZS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbXBhcmUtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2NvbXBhcmVfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Y29tcGFyZS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7Y29tcGFyZS1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvbXBhcmUudGVzdHMuQWxsVGVzdHMiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGVzLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSI+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzYjMzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29tcGFyZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZmFjZS50ZXh0PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50ZWFtLmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50ZWFtLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuZWRpdG9yczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuaWRlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS52aWV3czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL2J1aWxkLXRlc3RzLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9idWlsZC10ZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMTZiMTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL2J1aWxkLXRlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0iQnVpbGQgVGVhbSBTbmlmZiIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaW5pdCI+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InJvb3QiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZW1wIiB2YWx1ZT0iJHtyb290fS9fX3RlbXAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbnMiIHZhbHVlPSIke3RlbXB9L2VjbGlwc2UvcGx1Z2lucyIvPgotCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0KLSAgICA8ZGVsZXRlIGRpcj0iJHt0ZW1wfSIvPgotICAgIDxta2RpciBkaXI9IiR7cGx1Z2luc30iLz4KLQotICAgIDxhbnRjYWxsIHRhcmdldD0iYnVpbGRQbHVnaW4iPgotICAgICAgPHBhcmFtIG5hbWU9InBsdWdpbk5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MiIC8+Ci0gICAgICA8cGFyYW0gbmFtZT0iamFyTmFtZSIgdmFsdWU9InRlc3RoYXJuZXNzLmphciIgLz4KLSAgICA8L2FudGNhbGw+Ci0gICAgCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJidWlsZFBsdWdpbiI+Ci0gICAgICA8cGFyYW0gbmFtZT0icGx1Z2luTmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZSIgLz4KLSAgICAgIDxwYXJhbSBuYW1lPSJqYXJOYW1lIiB2YWx1ZT0idGVhbXRlc3RzLmphciIgLz4KLSAgICA8L2FudGNhbGw+Ci0KLSAgICA8emlwIHppcGZpbGU9IiR7YmFzZWRpcn0vdGVhbVNuaWZmJHtEU1RBTVB9LnppcCIKLSAgICAgICBiYXNlZGlyPSIke3RlbXB9IgotICAgIC8+Ci0KLSAgICA8ZGVsZXRlIGRpcj0iJHt0ZW1wfSIvPgotICAgIDxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iYnVpbGRQbHVnaW4iPgotICAgIDxjb3B5IHRvZGlyPSIke3BsdWdpbnN9LyR7cGx1Z2luTmFtZX0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3Jvb3R9LyR7cGx1Z2luTmFtZX0iLz4KLSAgICA8L2NvcHk+Ci0gICAgPGphciBqYXJmaWxlPSIke3BsdWdpbnN9LyR7cGx1Z2luTmFtZX0vJHtqYXJOYW1lfSIKLSAgICAgICAgIGJhc2VkaXI9IiR7cGx1Z2luc30vJHtwbHVnaW5OYW1lfS9iaW4iCi0gICAgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtwbHVnaW5zfS8ke3BsdWdpbk5hbWV9L2JpbiIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmJlMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnRlYW10ZXN0cy5qYXI9c3JjLwotYmluLmluY2x1ZGVzPWFib3V0Lmh0bWwscGx1Z2luLnhtbCwqLmphcix0ZXN0LnhtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlMWY1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZSIKLSAgIG5hbWU9IkVjbGlwc2UgVGVhbSBDb3JlIFRlc3RzIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIGNsYXNzPSIiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InRlYW10ZXN0cy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ib290Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVhbS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvbXBhcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUudGVzdHMucmVzb3VyY2VzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MudGVzdHMiPgotICAgICAgPHRlc3QKLSAgICAgICAgICAgIGlkPSJ0ZWFtLmFsbCI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLlJlcG9zaXRvcnlQcm92aWRlclRlc3RzIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC90ZXN0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLnRlc3RzIj4KLSAgICAgIDx0ZXN0Ci0gICAgICAgICAgICBpZD0idGFyZ2V0LmFsbCI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLlRhcmdldFByb3ZpZGVyVGVzdHMiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3Rlc3Q+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MudGVzdHMiPgotICAgICAgPHRlc3QKLSAgICAgICAgICAgIGlkPSJ0ZWFtLmZ0cCI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5mdHAuQ2xpZW50VGVzdCI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdGVzdD4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSAqKioqKioqKioqKioqKiogUmVwb3NpdG9yeSBQcm92aWRlcnMgKioqKioqKioqKioqKioqKiAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUucmVwb3NpdG9yeSI+Ci0gICAgICA8cmVwb3NpdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS5SZXBvc2l0b3J5UHJvdmlkZXJCaWMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLmJpYy1wcm92aWRlciI+Ci0gICAgICA8L3JlcG9zaXRvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUucmVwb3NpdG9yeSI+Ci0gICAgICA8cmVwb3NpdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS5SZXBvc2l0b3J5UHJvdmlkZXJOYWlzaCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUubmFpc2gtcHJvdmlkZXIiPgotICAgICAgPC9yZXBvc2l0b3J5PgotICAgPC9leHRlbnNpb24+Ci08IS0tICoqKioqKioqKioqKioqKiBCYWQgcHJvdmlkZXIgdGhhdCBpcyBub3QgcmVnaXN0ZXJlZCAqKioqKioqKioqKioqKioqIAotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUucmVwb3NpdG9yeSI+Ci0gICAgICA8cmVwb3NpdG9yeQotICAgICAgCQlpZD0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLm90aGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS5SZXBvc2l0b3J5UHJvdmlkZXJPdGhlclNwb3J0Ij4KLSAgICAgIDwvcmVwb3NpdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUucmVwb3NpdG9yeSI+Ci0gICAgICA8cmVwb3NpdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS5SZXBvc2l0b3J5UHJvdmlkZXJXaXRoTGlua2luZyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUubGlua2luZyI+Ci0gICAgICA8L3JlcG9zaXRvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IlRlYW0gVGVzdCBWaWV3cyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJDb250ZW50IFByb3ZpZGVyIFRlc3QgVmlldyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS52aWV3cy5Db250ZW50UHJvdmlkZXJUZXN0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnZpZXdzLkNvbnRlbnRQcm92aWRlclRlc3RWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9BbGxUZWFtVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL0FsbFRlYW1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJjMzI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL0FsbFRlYW1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5yZXNvdXJjZXMuUmVzb3VyY2VUZXN0OwotCi1wdWJsaWMgY2xhc3MgQWxsVGVhbVRlc3RzIGV4dGVuZHMgUmVzb3VyY2VUZXN0IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDVlNDbGllbnRUZXN0LgotCSAqLwotCXB1YmxpYyBBbGxUZWFtVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENWU0NsaWVudFRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQWxsVGVhbVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KFJlcG9zaXRvcnlQcm92aWRlclRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFN0cmVhbVRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9SZXBvc2l0b3J5UHJvdmlkZXJCaWMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlckJpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhlZjZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlckJpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZWFtLklNb3ZlRGVsZXRlSG9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuUmVwb3NpdG9yeVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVByb3ZpZGVyQmljIGV4dGVuZHMgUmVwb3NpdG9yeVByb3ZpZGVyIHsKLQkKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBOQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLmJpYy1wcm92aWRlciI7Ci0JCi0JcHJpdmF0ZSBJTW92ZURlbGV0ZUhvb2sgbWRoOwotCXByaXZhdGUgSUZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IgbXY7Ci0JCi0JLyoKLQkgKiBAc2VlIFJlcG9zaXRvcnlQcm92aWRlciNjb25maWd1cmVQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogQHNlZSBSZXBvc2l0b3J5UHJvdmlkZXIjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBOQVRVUkVfSUQ7Ci0JfQotCS8qCi0JICogQHNlZSBJUHJvamVjdE5hdHVyZSNkZWNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCQotCS8qCi0JICogQHNlZSBSZXBvc2l0b3J5UHJvdmlkZXIjZ2V0RmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yIGdldEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBtdjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVwb3NpdG9yeVByb3ZpZGVyI2dldE1vdmVEZWxldGVIb29rKCkKLQkgKi8KLQlwdWJsaWMgSU1vdmVEZWxldGVIb29rIGdldE1vdmVEZWxldGVIb29rKCkgewotCQlyZXR1cm4gbWRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25WYWxpZGF0b3IoSUZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IgbXYpIHsKLQkJdGhpcy5tdiA9IG12OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNb3ZlRGVsZXRlSG9vayhJTW92ZURlbGV0ZUhvb2sgbWRoKSB7Ci0JCXRoaXMubWRoID0gbWRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlck5haXNoLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9SZXBvc2l0b3J5UHJvdmlkZXJOYWlzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzVjOWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlck5haXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRlYW0uSU1vdmVEZWxldGVIb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5SZXBvc2l0b3J5UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UHJvdmlkZXJOYWlzaCBleHRlbmRzIFJlcG9zaXRvcnlQcm92aWRlciB7Ci0JCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgTkFUVVJFX0lEID0gIm9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS5uYWlzaC1wcm92aWRlciI7Ci0JcHJpdmF0ZSBJTW92ZURlbGV0ZUhvb2sgbWRoOwotCXByaXZhdGUgSUZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IgbXY7Ci0JLyoKLQkgKiBAc2VlIFJlcG9zaXRvcnlQcm92aWRlciNjb25maWd1cmVQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogQHNlZSBSZXBvc2l0b3J5UHJvdmlkZXIjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBOQVRVUkVfSUQ7Ci0JfQotCS8qCi0JICogQHNlZSBJUHJvamVjdE5hdHVyZSNkZWNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblZhbGlkYXRvcihJRmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvciBtdikgewotCQl0aGlzLm12ID0gbXY7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vdmVEZWxldGVIb29rKElNb3ZlRGVsZXRlSG9vayBtZGgpIHsKLQkJdGhpcy5tZGggPSBtZGg7Ci0JfQotCS8qCi0JICogQHNlZSBSZXBvc2l0b3J5UHJvdmlkZXIjZ2V0RmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yIGdldEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBtdjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVwb3NpdG9yeVByb3ZpZGVyI2dldE1vdmVEZWxldGVIb29rKCkKLQkgKi8KLQlwdWJsaWMgSU1vdmVEZWxldGVIb29rIGdldE1vdmVEZWxldGVIb29rKCkgewotCQlyZXR1cm4gbWRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlck90aGVyU3BvcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlck90aGVyU3BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4MmMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9SZXBvc2l0b3J5UHJvdmlkZXJPdGhlclNwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5SZXBvc2l0b3J5UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UHJvdmlkZXJPdGhlclNwb3J0IGV4dGVuZHMgUmVwb3NpdG9yeVByb3ZpZGVyIHsKLQkKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBOQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLm90aGVyIjsKLQotCS8qCi0JICogQHNlZSBSZXBvc2l0b3J5UHJvdmlkZXIjY29uZmlndXJlUHJvamVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVwb3NpdG9yeVByb3ZpZGVyI2dldElEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gTkFUVVJFX0lEOwotCX0KLQkvKgotCSAqIEBzZWUgSVByb2plY3ROYXR1cmUjZGVjb25maWd1cmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlclRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9SZXBvc2l0b3J5UHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODU4NjBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGVhbS5JTW92ZURlbGV0ZUhvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGVhbS5JUmVzb3VyY2VUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5SZXBvc2l0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UHJvdmlkZXJUZXN0cyBleHRlbmRzIFRlYW1UZXN0IHsKLQlwdWJsaWMgUmVwb3NpdG9yeVByb3ZpZGVyVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBSZXBvc2l0b3J5UHJvdmlkZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFJlcG9zaXRvcnlQcm92aWRlclRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIG5ldyBUZXN0U2V0dXAoc3VpdGUpOwotCQkvL3JldHVybiBuZXcgdGVzdFNldHVwKG5ldyBSZXBvc2l0b3J5UHJvdmlkZXJUZXN0cygidGVzdCIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyc1JlZ2lzdGVyZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVGVhbUV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVwb1Byb3ZpZGVySWRzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KFJlcG9zaXRvcnlQcm92aWRlci5nZXRBbGxQcm92aWRlclR5cGVJZHMoKSkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVwb1Byb3ZpZGVySWRzLmNvbnRhaW5zKFJlcG9zaXRvcnlQcm92aWRlckJpYy5OQVRVUkVfSUQpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlcG9Qcm92aWRlcklkcy5jb250YWlucyhSZXBvc2l0b3J5UHJvdmlkZXJOYWlzaC5OQVRVUkVfSUQpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXBvUHJvdmlkZXJJZHMuY29udGFpbnMoUmVwb3NpdG9yeVByb3ZpZGVyT3RoZXJTcG9ydC5OQVRVUkVfSUQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFByb3ZpZGVyR2VuZXJpYygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBUZWFtRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0R2V0UHJvdmlkZXJHZW5lcmljMSIpOwotCQlJUHJvamVjdCBwcm9qZWN0MiA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0R2V0UHJvdmlkZXJHZW5lcmljMiIpOwotCQkKLQkJLy8gdGVzdCB0aGF0IGFkZGluZyBhIG5vbiByZWdpc3RlcmVkIHByb3ZpZGVyIGRvZXNuJ3Qgd29yawotCQlib29sZWFuIGdvb2QgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVJlcG9zaXRvcnlQcm92aWRlci5tYXAocHJvamVjdCwgUmVwb3NpdG9yeVByb3ZpZGVyT3RoZXJTcG9ydC5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChUZWFtRXhjZXB0aW9uIGUpIHsKLQkJCWdvb2QgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZ29vZCk7Ci0JCQotCQkvLyBhZGRpbmcgYSB2YWxpZCB0ZWFtIHByb3ZpZGVyIHNob3VsZCBiZSBmaW5lCi0JCVJlcG9zaXRvcnlQcm92aWRlci5tYXAocHJvamVjdCwgUmVwb3NpdG9yeVByb3ZpZGVyTmFpc2guTkFUVVJFX0lEKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyLm1hcChwcm9qZWN0MiwgUmVwb3NpdG9yeVByb3ZpZGVyTmFpc2guTkFUVVJFX0lEKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyIHByb3ZpZGVyMSA9IFJlcG9zaXRvcnlQcm92aWRlci5nZXRQcm92aWRlcihwcm9qZWN0KTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyIHByb3ZpZGVyMiA9IFJlcG9zaXRvcnlQcm92aWRlci5nZXRQcm92aWRlcihwcm9qZWN0Mik7Ci0JCWFzc2VydFRydWUocHJvdmlkZXIxICE9IG51bGwgJiYgcHJvdmlkZXIxLmdldElEKCkuZXF1YWxzKFJlcG9zaXRvcnlQcm92aWRlck5haXNoLk5BVFVSRV9JRCkpOwotCQlhc3NlcnRUcnVlKHByb3ZpZGVyMiAhPSBudWxsICYmIHByb3ZpZGVyMi5nZXRJRCgpLmVxdWFscyhSZXBvc2l0b3J5UHJvdmlkZXJOYWlzaC5OQVRVUkVfSUQpKTsKLQkJYXNzZXJ0VHJ1ZShwcm92aWRlcjEuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSAmJiBwcm92aWRlcjIuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0MikpOwotCQkKLQkJLy8gcmVtYXBwaW5nIGEgcHJvdmlkZXIgaXMgYWxsb3dlZAotCQlSZXBvc2l0b3J5UHJvdmlkZXIubWFwKHByb2plY3QsIFJlcG9zaXRvcnlQcm92aWRlckJpYy5OQVRVUkVfSUQpOwkKLQkJcHJvdmlkZXIxID0gUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKHByb2plY3QpOwotCQlhc3NlcnRUcnVlKHByb3ZpZGVyMSAhPSBudWxsICYmIHByb3ZpZGVyMS5nZXRJRCgpLmVxdWFscyhSZXBvc2l0b3J5UHJvdmlkZXJCaWMuTkFUVVJFX0lEKSk7Ci0JCQkJCi0JCS8vIGNsb3NlZCBvciBub24tZXhpc3RhbnQgcHJvamVjdHMgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHByb3ZpZGVyCi0JCUlQcm9qZWN0IGNsb3NlZFByb2plY3QgPSBnZXRVbmlxdWVUZXN0UHJvamVjdCgidGVzdEdldFByb3ZpZGVyR2VuZXJpY0Nsb3NlZCIpOwotCQlJUHJvamVjdCBub25FeGlzdGFudFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIm5vbkV4aXN0YW50Iik7Ci0JCWNsb3NlZFByb2plY3QuY2xvc2UobnVsbCk7Ci0JCWFzc2VydFRydWUoUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKGNsb3NlZFByb2plY3QpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKFJlcG9zaXRvcnlQcm92aWRlci5nZXRQcm92aWRlcihub25FeGlzdGFudFByb2plY3QpID09IG51bGwpOwotCQkKLQkJLy8gcmVtb3ZpbmcgdGhlIG5hdHVyZSByZW1vdmVzIHRoZSBwcm92aWRlciBhc3NvY2lhdGlvbgotCQlSZXBvc2l0b3J5UHJvdmlkZXIudW5tYXAocHJvamVjdCk7Ci0JCVJlcG9zaXRvcnlQcm92aWRlci51bm1hcChwcm9qZWN0Mik7Ci0JCWFzc2VydFRydWUoUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKHByb2plY3QpPT1udWxsKTsKLQkJYXNzZXJ0VHJ1ZShSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocHJvamVjdDIpPT1udWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFByb3ZpZGVyQnlJZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBUZWFtRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdDEgPSBnZXRVbmlxdWVUZXN0UHJvamVjdCgidGVzdEdldFByb3ZpZGVyQnlJZF8xIik7Ci0JCUlQcm9qZWN0IHByb2plY3QyID0gZ2V0VW5pcXVlVGVzdFByb2plY3QoInRlc3RHZXRQcm92aWRlckJ5SWRfMiIpOwotCQkKLQkJLy8gYWRkaW5nIGEgdmFsaWQgdGVhbSBwcm92aWRlciBzaG91bGQgYmUgZmluZQotCQlSZXBvc2l0b3J5UHJvdmlkZXIubWFwKHByb2plY3QxLCBSZXBvc2l0b3J5UHJvdmlkZXJCaWMuTkFUVVJFX0lEKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyLm1hcChwcm9qZWN0MiwgUmVwb3NpdG9yeVByb3ZpZGVyTmFpc2guTkFUVVJFX0lEKTsKLQkJYXNzZXJ0VHJ1ZShSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocHJvamVjdDEsIFJlcG9zaXRvcnlQcm92aWRlckJpYy5OQVRVUkVfSUQpIT1udWxsKTsKLQkJYXNzZXJ0VHJ1ZShSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocHJvamVjdDIsIFJlcG9zaXRvcnlQcm92aWRlck5haXNoLk5BVFVSRV9JRCkhPW51bGwpOwotCQkKLQkJLy8gY2xvc2VkIG9yIG5vbi1leGlzdGFudCBwcm9qZWN0cyBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvdmlkZXIKLQkJSVByb2plY3QgY2xvc2VkUHJvamVjdCA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0R2V0UHJvdmlkZXJHZW5lcmljQ2xvc2VkIik7Ci0JCUlQcm9qZWN0IG5vbkV4aXN0YW50UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgibm9uRXhpc3RhbnQiKTsKLQkJY2xvc2VkUHJvamVjdC5jbG9zZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIoY2xvc2VkUHJvamVjdCwgImlkIikgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKG5vbkV4aXN0YW50UHJvamVjdCwgImlkIikgPT0gbnVsbCk7Ci0JCQotCQkvLyByZW1vdmluZyB0aGUgbmF0dXJlIHJlbW92ZXMgdGhlIHByb3ZpZGVyIGFzc29jaWF0aW9uCi0JCVJlcG9zaXRvcnlQcm92aWRlci51bm1hcChwcm9qZWN0MSk7Ci0JCVJlcG9zaXRvcnlQcm92aWRlci51bm1hcChwcm9qZWN0Mik7Ci0JCWFzc2VydFRydWUoUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKHByb2plY3QxLCBSZXBvc2l0b3J5UHJvdmlkZXJCaWMuTkFUVVJFX0lEKT09bnVsbCk7Ci0JCWFzc2VydFRydWUoUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKHByb2plY3QyLCBSZXBvc2l0b3J5UHJvdmlkZXJOYWlzaC5OQVRVUkVfSUQpPT1udWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVGVhbUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRVbmlxdWVUZXN0UHJvamVjdCgidGVzdEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IiKTsKLQkJCi0JCS8vIGFkZGluZyBhIHZhbGlkIHRlYW0gcHJvdmlkZXIgc2hvdWxkIGJlIGZpbmUKLQkJUmVwb3NpdG9yeVByb3ZpZGVyLm1hcChwcm9qZWN0LCBSZXBvc2l0b3J5UHJvdmlkZXJCaWMuTkFUVVJFX0lEKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyQmljIGJpY1Byb3ZpZGVyID0gKFJlcG9zaXRvcnlQcm92aWRlckJpYylSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocHJvamVjdCwgUmVwb3NpdG9yeVByb3ZpZGVyQmljLk5BVFVSRV9JRCk7Ci0JCWFzc2VydFRydWUoYmljUHJvdmlkZXIhPW51bGwpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHZhbGlkYXRvciBnZXRzIGNhbGxlZCBieSB0ZWFtIGNvcmUgZGlzcGF0Y2hpbmcKLQkJZmluYWwgYm9vbGVhbltdIGNhbGxlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJYmljUHJvdmlkZXIuc2V0TW9kaWZpY2F0aW9uVmFsaWRhdG9yKG5ldyBJRmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvcigpIHsKLQkJCS8vIGNhbid0IHRlc3QgdmFsaWRhdGUgZWRpdCBoZXJlIGJlY2F1c2UgaXQgaXMgb25seSBjYWxsZWQgZnJvbSBlZGl0b3JzCi0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGVbXSBmaWxlcywgT2JqZWN0IGNvbnRleHQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU2F2ZShJRmlsZSBmaWxlKSB7Ci0JCQkJY2FsbGVkWzBdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZ2V0VGVhbVRlc3RTdGF0dXMoSVN0YXR1cy5PSyk7Ci0JCQl9Ci0JCX0pOwotCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCJ0ZXN0LnR4dCIpOwotCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInRlc3QiLmdldEJ5dGVzKCkpLCB0cnVlLCBudWxsKTsKLQkJZmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInRlc3QyIi5nZXRCeXRlcygpKSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQlhc3NlcnRUcnVlKGNhbGxlZFswXSA9PSB0cnVlKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB2YWxpZGF0b3IgY2FuIHZldG8gYSBzZXRDb250ZW50cwotCQljYWxsZWRbMF0gPSBmYWxzZTsKLQkJYmljUHJvdmlkZXIuc2V0TW9kaWZpY2F0aW9uVmFsaWRhdG9yKG5ldyBJRmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvcigpIHsKLQkJCS8vIGNhbid0IHRlc3QgdmFsaWRhdGUgZWRpdCBoZXJlIGJlY2F1c2UgaXQgaXMgb25seSBjYWxsZWQgZnJvbSBlZGl0b3JzCi0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGVbXSBmaWxlcywgT2JqZWN0IGNvbnRleHQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU2F2ZShJRmlsZSBmaWxlKSB7Ci0JCQkJY2FsbGVkWzBdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZ2V0VGVhbVRlc3RTdGF0dXMoSVN0YXR1cy5FUlJPUik7Ci0JCQl9Ci0JCX0pOwotCQl0cnkgewotCQkJZmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInRlc3QzIi5nZXRCeXRlcygpKSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJZmFpbCgidmFsaWRhdGUgaG9vayBzaG91bGQgdmV0byB0aGlzIHNldENvbnRlbnRzIik7Ci0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKGNhbGxlZFswXSA9PSB0cnVlKTsKLQkJfQotCQkKLQkJLy8gdGVzdCB0aGF0IGRlZmF1bHQgdmFsaWRhdG9yIGFsbG93cyB0aGUgbW9kaWZpY2F0aW9uCi0JCWJpY1Byb3ZpZGVyLnNldE1vZGlmaWNhdGlvblZhbGlkYXRvcihudWxsKTsKLQkJZmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInRlc3Q0Ii5nZXRCeXRlcygpKSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVEZWxldGVIb29rKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFRlYW1FeGNlcHRpb24gewotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VW5pcXVlVGVzdFByb2plY3QoInRlc3RNb3ZlRGVsZXRlSG9vayIpOwotCQkKLQkJLy8gYWRkaW5nIGEgdmFsaWQgdGVhbSBwcm92aWRlciBzaG91bGQgYmUgZmluZQotCQlSZXBvc2l0b3J5UHJvdmlkZXIubWFwKHByb2plY3QsIFJlcG9zaXRvcnlQcm92aWRlckJpYy5OQVRVUkVfSUQpOwotCQlSZXBvc2l0b3J5UHJvdmlkZXJCaWMgYmljUHJvdmlkZXIgPSAoUmVwb3NpdG9yeVByb3ZpZGVyQmljKVJlcG9zaXRvcnlQcm92aWRlci5nZXRQcm92aWRlcihwcm9qZWN0LCBSZXBvc2l0b3J5UHJvdmlkZXJCaWMuTkFUVVJFX0lEKTsKLQkJYXNzZXJ0VHJ1ZShiaWNQcm92aWRlciE9bnVsbCk7Ci0JCQotCQkvLyBvbmx5IHRlc3RpbmcgdGhhdCBkaXNwYXRjaGluZyB3b3JrcywgcmVzb3VyY2VzIHBsdWdpbiBpcyB0ZXN0aW5nIHRoZSByZXN0IG9mIHRoZSBBUEkKLQkJZmluYWwgYm9vbGVhbltdIGNhbGxlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9OwotCQlJTW92ZURlbGV0ZUhvb2sgaG9vayA9IG5ldyBJTW92ZURlbGV0ZUhvb2soKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBkZWxldGVGaWxlKElSZXNvdXJjZVRyZWUgdHJlZSwJSUZpbGUgZmlsZSwJaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQljYWxsZWRbMF0gPSB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZvbGRlcihJUmVzb3VyY2VUcmVlIHRyZWUsIElGb2xkZXIgZm9sZGVyLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWNhbGxlZFsxXSA9IHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChJUmVzb3VyY2VUcmVlIHRyZWUsIElQcm9qZWN0IHByb2plY3QsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJY2FsbGVkWzJdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlRmlsZShJUmVzb3VyY2VUcmVlIHRyZWUsIElGaWxlIHNvdXJjZSwgSUZpbGUgZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJY2FsbGVkWzNdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlRm9sZGVyKElSZXNvdXJjZVRyZWUgdHJlZSwJSUZvbGRlciBzb3VyY2UsCUlGb2xkZXIgZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJY2FsbGVkWzRdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlUHJvamVjdChJUmVzb3VyY2VUcmVlIHRyZWUsIElQcm9qZWN0IHNvdXJjZSwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQljYWxsZWRbNV0gPSB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJYmljUHJvdmlkZXIuc2V0TW92ZURlbGV0ZUhvb2soaG9vayk7Ci0JCQotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBidWlsZFJlc291cmNlcyhwcm9qZWN0LCBuZXcgU3RyaW5nW10geyJkZWxldGVGaWxlLnR4dCIsICJtb3ZlRmlsZS50eHQiLCAiZGVsZXRlZEZvbGRlci8iLCAibW92ZUZvbGRlci8ifSk7Ci0JCWVuc3VyZUV4aXN0c0luV29ya3NwYWNlKHJlc291cmNlcywgdHJ1ZSk7Ci0JCXJlc291cmNlc1swXS5kZWxldGUoZmFsc2UsIG51bGwpOwotCQlyZXNvdXJjZXNbMV0ubW92ZShyZXNvdXJjZXNbMV0uZ2V0RnVsbFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKCJtb3ZlZEZpbGVfTkVXIiksIGZhbHNlLCBudWxsKTsKLQkJcmVzb3VyY2VzWzJdLmRlbGV0ZShmYWxzZSwgbnVsbCk7Ci0JCXJlc291cmNlc1szXS5tb3ZlKHJlc291cmNlc1szXS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoIm1vdmVkRm9sZGVyIiksIGZhbHNlLCBudWxsKTsKLQkJLy8gbW92aW5nIHVzaW5nIHRoZSBkZXNjcmlwdGlvbiBhbGxvd3MgdGhlIG1vdmVkIHByb2plY3QgdG8gaGF2ZSBuYXR1cmVzIGlkcyBvciBvcmlnaW5hdGlvbgotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0TmFtZSgibW92ZWRQcm9qZWN0Iik7Ci0JCXByb2plY3QubW92ZShkZXNjLCBmYWxzZSwgbnVsbCk7Ci0JCUlQcm9qZWN0IG5ld1Byb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIm1vdmVkUHJvamVjdCIpOwotCQliaWNQcm92aWRlciA9IChSZXBvc2l0b3J5UHJvdmlkZXJCaWMpUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKG5ld1Byb2plY3QpOwotCQliaWNQcm92aWRlci5zZXRNb3ZlRGVsZXRlSG9vayhob29rKTsKLQkJbmV3UHJvamVjdC5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKGNhbGxlZFtpXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVEZWxldGVIb29rQmV0d2VlblByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFRlYW1FeGNlcHRpb24gewotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0QSA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0TW92ZURlbGV0ZUhvb2tCZXR3ZWVuUHJvamVjdHNfQSIpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0QiA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0TW92ZURlbGV0ZUhvb2tCZXR3ZWVuUHJvamVjdHNfQiIpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0QyA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0TW92ZURlbGV0ZUhvb2tCZXR3ZWVuUHJvamVjdHNfQyIpOwotCQkKLQkJLy8gYWRkaW5nIGEgdmFsaWQgdGVhbSBwcm92aWRlciBzaG91bGQgYmUgZmluZQotCQlSZXBvc2l0b3J5UHJvdmlkZXIubWFwKHByb2plY3RBLCBSZXBvc2l0b3J5UHJvdmlkZXJCaWMuTkFUVVJFX0lEKTsKLQkJZmluYWwgUmVwb3NpdG9yeVByb3ZpZGVyQmljIGJpY1Byb3ZpZGVyID0gKFJlcG9zaXRvcnlQcm92aWRlckJpYylSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocHJvamVjdEEsIFJlcG9zaXRvcnlQcm92aWRlckJpYy5OQVRVUkVfSUQpOwotCQlSZXBvc2l0b3J5UHJvdmlkZXIubWFwKHByb2plY3RCLCBSZXBvc2l0b3J5UHJvdmlkZXJOYWlzaC5OQVRVUkVfSUQpOwotCQlmaW5hbCBSZXBvc2l0b3J5UHJvdmlkZXJOYWlzaCBuYWlzaFByb3ZpZGVyID0gKFJlcG9zaXRvcnlQcm92aWRlck5haXNoKVJlcG9zaXRvcnlQcm92aWRlci5nZXRQcm92aWRlcihwcm9qZWN0QiwgUmVwb3NpdG9yeVByb3ZpZGVyTmFpc2guTkFUVVJFX0lEKTsKLQkJYXNzZXJ0VHJ1ZShiaWNQcm92aWRlciE9bnVsbCAmJiBuYWlzaFByb3ZpZGVyIT1udWxsKTsKLQkJCi0JCS8vIG9ubHkgdGVzdGluZyB0aGF0IGRpc3BhdGNoaW5nIHdvcmtzLCByZXNvdXJjZXMgcGx1Z2luIGlzIHRlc3RpbmcgdGhlIHJlc3Qgb2YgdGhlIEFQSQotCQlmaW5hbCBib29sZWFuW10gY2FsbGVkUHJvamVjdEEgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQliaWNQcm92aWRlci5zZXRNb3ZlRGVsZXRlSG9vayhuZXcgSU1vdmVEZWxldGVIb29rKCkgewotCQkJcHVibGljIGJvb2xlYW4gZGVsZXRlRmlsZShJUmVzb3VyY2VUcmVlIHRyZWUsCUlGaWxlIGZpbGUsCWludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyKElSZXNvdXJjZVRyZWUgdHJlZSwgSUZvbGRlciBmb2xkZXIsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChJUmVzb3VyY2VUcmVlIHRyZWUsIElQcm9qZWN0IHByb2plY3QsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIG1vdmVGaWxlKElSZXNvdXJjZVRyZWUgdHJlZSwgSUZpbGUgc291cmNlLCBJRmlsZSBkZXN0aW5hdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlhc3NlcnRUcnVlKGJpY1Byb3ZpZGVyLmdldFByb2plY3QoKS5lcXVhbHMoc291cmNlLmdldFByb2plY3QoKSkpOwotCQkJCWNhbGxlZFByb2plY3RBWzBdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlRm9sZGVyKElSZXNvdXJjZVRyZWUgdHJlZSwJSUZvbGRlciBzb3VyY2UsCUlGb2xkZXIgZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShiaWNQcm92aWRlci5nZXRQcm9qZWN0KCkuZXF1YWxzKHNvdXJjZS5nZXRQcm9qZWN0KCkpKTsKLQkJCQljYWxsZWRQcm9qZWN0QVsxXSA9IHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gbW92ZVByb2plY3QoSVJlc291cmNlVHJlZSB0cmVlLCBJUHJvamVjdCBzb3VyY2UsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9KTsKLQkJCi0JCWZpbmFsIGJvb2xlYW5bXSBjYWxsZWRQcm9qZWN0QiA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCW5haXNoUHJvdmlkZXIuc2V0TW92ZURlbGV0ZUhvb2sobmV3IElNb3ZlRGVsZXRlSG9vaygpIHsKLQkJCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZpbGUoSVJlc291cmNlVHJlZSB0cmVlLAlJRmlsZSBmaWxlLAlpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZvbGRlcihJUmVzb3VyY2VUcmVlIHRyZWUsIElGb2xkZXIgZm9sZGVyLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGRlbGV0ZVByb2plY3QoSVJlc291cmNlVHJlZSB0cmVlLCBJUHJvamVjdCBwcm9qZWN0LCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlRmlsZShJUmVzb3VyY2VUcmVlIHRyZWUsIElGaWxlIHNvdXJjZSwgSUZpbGUgZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShiaWNQcm92aWRlci5nZXRQcm9qZWN0KCkuZXF1YWxzKGRlc3RpbmF0aW9uLmdldFByb2plY3QoKSkpOwotCQkJCWNhbGxlZFByb2plY3RCWzBdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlRm9sZGVyKElSZXNvdXJjZVRyZWUgdHJlZSwgSUZvbGRlciBzb3VyY2UsCUlGb2xkZXIgZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShiaWNQcm92aWRlci5nZXRQcm9qZWN0KCkuZXF1YWxzKGRlc3RpbmF0aW9uLmdldFByb2plY3QoKSkpOwotCQkJCWNhbGxlZFByb2plY3RCWzFdID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBtb3ZlUHJvamVjdChJUmVzb3VyY2VUcmVlIHRyZWUsIElQcm9qZWN0IHNvdXJjZSwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gdGVzdCB0aGF0IG1vdmluZyBmaWxlcy9mb2xkZXJzIGJldHdlZW4gdHdvIHByb2plY3RzIHdpdGggcHJvdmlkZXJzIGNhbGxzIHRoZSBkZXN0aW5hdGlvbgotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBidWlsZFJlc291cmNlcyhwcm9qZWN0QSwgbmV3IFN0cmluZ1tdIHsibW92ZUZpbGUudHh0IiwgIm1vdmVGb2xkZXIvIn0pOwotCQllbnN1cmVFeGlzdHNJbldvcmtzcGFjZShyZXNvdXJjZXMsIHRydWUpOwotCQlyZXNvdXJjZXNbMF0ubW92ZShwcm9qZWN0Qi5nZXRGdWxsUGF0aCgpLmFwcGVuZCgibW92ZUZpbGVfbmV3LnR4dCIpLCBmYWxzZSwgbnVsbCk7Ci0JCXJlc291cmNlc1sxXS5tb3ZlKHByb2plY3RCLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCJtb3ZlZEZvbGRlciIpLCBmYWxzZSwgbnVsbCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGVkUHJvamVjdEEubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydFRydWUoY2FsbGVkUHJvamVjdEFbaV0gICYmIGNhbGxlZFByb2plY3RCW2ldPT1mYWxzZSk7Ci0JCX0KLQkJCi0JCS8vIHRlc3QgdGhhdCBtb3ZpbmcgZmlsZXMvZm9sZGVycyBmcm9tIGEgcHJvamVjdCB3aXRoIGEgcHJvdmlkZXIgdG8gYSBwcm9qZWN0IHdpdGhvdXQgYSBwcm92aWRlciBjYWxscyB0aGUKLQkJLy8gaG9va3MgZm9yIHRoZSBzb3VyY2UKLQkJY2FsbGVkUHJvamVjdEFbMF0gPSBmYWxzZTsgY2FsbGVkUHJvamVjdEFbMV0gPSBmYWxzZTsKLQkJY2FsbGVkUHJvamVjdEJbMF0gPSBmYWxzZTsgY2FsbGVkUHJvamVjdEJbMV0gPSBmYWxzZTsKLQkJcmVzb3VyY2VzID0gYnVpbGRSZXNvdXJjZXMocHJvamVjdEEsIG5ldyBTdHJpbmdbXSB7ImFub3RoZXJNb3ZlZEZpbGVkLnR4dCIsICJhbm90aGVyTW92ZWRGb2xkZXIvIn0pOwotCQllbnN1cmVFeGlzdHNJbldvcmtzcGFjZShyZXNvdXJjZXMsIHRydWUpOwotCQlyZXNvdXJjZXNbMF0ubW92ZShwcm9qZWN0Qy5nZXRGdWxsUGF0aCgpLmFwcGVuZCgibW92ZUZpbGVPdGhlcl9uZXcudHh0IiksIGZhbHNlLCBudWxsKTsKLQkJcmVzb3VyY2VzWzFdLm1vdmUocHJvamVjdEMuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoIm1vdmVkRm9sZGVyT3RoZXIiKSwgZmFsc2UsIG51bGwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhbGxlZFByb2plY3RBLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKGNhbGxlZFByb2plY3RBW2ldICYmIGNhbGxlZFByb2plY3RCW2ldPT1mYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcFN1Y2Nlc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVGVhbUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRVbmlxdWVUZXN0UHJvamVjdCgidGVzdExpbmtTdWNjZXNzIik7Ci0JCWJ1aWxkUmVzb3VyY2VzKHByb2plY3QsIG5ldyBTdHJpbmdbXSB7ICJjaGFuZ2VkLnR4dCIsICJkZWxldGVkLnR4dCIsICJmb2xkZXIxLyIsICJmb2xkZXIxL2EudHh0IiB9LCB0cnVlKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigibGluayIpOwotCQlmb2xkZXIuY3JlYXRlTGluayhnZXRSYW5kb21Mb2NhdGlvbigpLCBJUmVzb3VyY2UuQUxMT1dfTUlTU0lOR19MT0NBTCwgbnVsbCk7Ci0JCVJlcG9zaXRvcnlQcm92aWRlcldpdGhMaW5raW5nLnNldENhbkhhbmRsZUxpbmtpbmcodHJ1ZSk7Ci0JCVJlcG9zaXRvcnlQcm92aWRlci5tYXAocHJvamVjdCwgUmVwb3NpdG9yeVByb3ZpZGVyV2l0aExpbmtpbmcuVFlQRV9JRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rU3VjY2VzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBUZWFtRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0TGlua1N1Y2Nlc3MiKTsKLQkJYnVpbGRSZXNvdXJjZXMocHJvamVjdCwgbmV3IFN0cmluZ1tdIHsgImNoYW5nZWQudHh0IiwgImRlbGV0ZWQudHh0IiwgImZvbGRlcjEvIiwgImZvbGRlcjEvYS50eHQiIH0sIHRydWUpOwotCQlSZXBvc2l0b3J5UHJvdmlkZXJXaXRoTGlua2luZy5zZXRDYW5IYW5kbGVMaW5raW5nKHRydWUpOwotCQlSZXBvc2l0b3J5UHJvdmlkZXIubWFwKHByb2plY3QsIFJlcG9zaXRvcnlQcm92aWRlcldpdGhMaW5raW5nLlRZUEVfSUQpOwotCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCJsaW5rIik7Ci0JCWZvbGRlci5jcmVhdGVMaW5rKGdldFJhbmRvbUxvY2F0aW9uKCksIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwRmFpbHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBUZWFtRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0TGlua1N1Y2Nlc3MiKTsKLQkJYnVpbGRSZXNvdXJjZXMocHJvamVjdCwgbmV3IFN0cmluZ1tdIHsgImNoYW5nZWQudHh0IiwgImRlbGV0ZWQudHh0IiwgImZvbGRlcjEvIiwgImZvbGRlcjEvYS50eHQiIH0sIHRydWUpOwotCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCJsaW5rIik7Ci0JCWZvbGRlci5jcmVhdGVMaW5rKGdldFJhbmRvbUxvY2F0aW9uKCksIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBudWxsKTsKLQkJdHJ5IHsKLQkJCVJlcG9zaXRvcnlQcm92aWRlcldpdGhMaW5raW5nLnNldENhbkhhbmRsZUxpbmtpbmcoZmFsc2UpOwotCQkJUmVwb3NpdG9yeVByb3ZpZGVyLm1hcChwcm9qZWN0LCBSZXBvc2l0b3J5UHJvdmlkZXJXaXRoTGlua2luZy5UWVBFX0lEKTsKLQkJfSBjYXRjaCAoVGVhbUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gSVJlc291cmNlU3RhdHVzLkxJTktJTkdfTk9UX0FMTE9XRUQpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkxpbmsgc2hvdWxkIGJlIGRpc2FsbG93ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlua0ZhaWx1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVGVhbUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRVbmlxdWVUZXN0UHJvamVjdCgidGVzdExpbmtTdWNjZXNzIik7Ci0JCWJ1aWxkUmVzb3VyY2VzKHByb2plY3QsIG5ldyBTdHJpbmdbXSB7ICJjaGFuZ2VkLnR4dCIsICJkZWxldGVkLnR4dCIsICJmb2xkZXIxLyIsICJmb2xkZXIxL2EudHh0IiB9LCB0cnVlKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyV2l0aExpbmtpbmcuc2V0Q2FuSGFuZGxlTGlua2luZyhmYWxzZSk7Ci0JCVJlcG9zaXRvcnlQcm92aWRlci5tYXAocHJvamVjdCwgUmVwb3NpdG9yeVByb3ZpZGVyV2l0aExpbmtpbmcuVFlQRV9JRCk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoImxpbmsiKTsKLQkJdHJ5IHsKLQkJCWZvbGRlci5jcmVhdGVMaW5rKGdldFJhbmRvbUxvY2F0aW9uKCksIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gSVJlc291cmNlU3RhdHVzLkxJTktJTkdfTk9UX0FMTE9XRUQpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkxpbmsgc2hvdWxkIGJlIGRpc2FsbG93ZWQiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzU2hhcmVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFRlYW1FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0MSA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KCJ0ZXN0R2V0UHJvdmlkZXJCeUlkXzEiKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyLm1hcChwcm9qZWN0MSwgUmVwb3NpdG9yeVByb3ZpZGVyQmljLk5BVFVSRV9JRCk7Ci0JCWFzc2VydFRydWUoUmVwb3NpdG9yeVByb3ZpZGVyLmlzU2hhcmVkKHByb2plY3QxKSk7Ci0JCXByb2plY3QxLmNsb3NlKG51bGwpOwotCQlhc3NlcnRUcnVlKCFSZXBvc2l0b3J5UHJvdmlkZXIuaXNTaGFyZWQocHJvamVjdDEpKTsKLQkJcHJvamVjdDEub3BlbihudWxsKTsKLQkJYXNzZXJ0VHJ1ZShSZXBvc2l0b3J5UHJvdmlkZXIuaXNTaGFyZWQocHJvamVjdDEpKTsKLQkJUmVwb3NpdG9yeVByb3ZpZGVyLnVubWFwKHByb2plY3QxKTsKLQkJYXNzZXJ0VHJ1ZSghUmVwb3NpdG9yeVByb3ZpZGVyLmlzU2hhcmVkKHByb2plY3QxKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvUmVwb3NpdG9yeVByb3ZpZGVyVHlwZUJpYy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvUmVwb3NpdG9yeVByb3ZpZGVyVHlwZUJpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjljMGZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlclR5cGVCaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5Qcm9qZWN0U2V0Q2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuUmVwb3NpdG9yeVByb3ZpZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuVGVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlQcm92aWRlclR5cGVCaWMgZXh0ZW5kcyBSZXBvc2l0b3J5UHJvdmlkZXJUeXBlIHsKLQlGaWxlIGNyZWF0ZWRGaWxlOwotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlJlcG9zaXRvcnlQcm92aWRlclR5cGUjZ2V0UHJvamVjdFNldENhcGFiaWxpdHkoKQotCSAqLwotCXB1YmxpYyBQcm9qZWN0U2V0Q2FwYWJpbGl0eSBnZXRQcm9qZWN0U2V0Q2FwYWJpbGl0eSgpIHsKLQkJcmV0dXJuIG5ldyBQcm9qZWN0U2V0Q2FwYWJpbGl0eSgpIHsKLQkJCXB1YmxpYyBJUHJvamVjdFtdIGFkZFRvV29ya3NwYWNlKAotCQkJCVN0cmluZ1tdIHJlZmVyZW5jZVN0cmluZ3MsCi0JCQkJU3RyaW5nIGZpbGVuYW1lLAotCQkJCUlQYXRoIHJvb3QsCi0JCQkJT2JqZWN0IGNvbnRleHQsCi0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBUZWFtRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJvamVjdFNldENyZWF0ZWQoCi0JCQkJRmlsZSBmaWxlLAotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkKLQkJCQljcmVhdGVkRmlsZSA9IGZpbGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0Q3JlYXRlZEZpbGUoKSB7Ci0JCXJldHVybiBjcmVhdGVkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjcmVhdGVkRmlsZS4KLQkgKiBAcGFyYW0gY3JlYXRlZEZpbGUgVGhlIGNyZWF0ZWRGaWxlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0ZWRGaWxlKEZpbGUgY3JlYXRlZEZpbGUpIHsKLQkJdGhpcy5jcmVhdGVkRmlsZSA9IGNyZWF0ZWRGaWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvUmVwb3NpdG9yeVByb3ZpZGVyV2l0aExpbmtpbmcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1JlcG9zaXRvcnlQcm92aWRlcldpdGhMaW5raW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDdhNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvUmVwb3NpdG9yeVByb3ZpZGVyV2l0aExpbmtpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlJlcG9zaXRvcnlQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gdGV4dCByZXNvdXJjZSBsaW5raW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UHJvdmlkZXJXaXRoTGlua2luZyBleHRlbmRzIFJlcG9zaXRvcnlQcm92aWRlciB7Ci0JCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUubGlua2luZyI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5IYW5kbGVMaW5raW5nID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuUmVwb3NpdG9yeVByb3ZpZGVyI2NvbmZpZ3VyZVByb2plY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlJlcG9zaXRvcnlQcm92aWRlciNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIFRZUEVfSUQ7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjZGVjb25maWd1cmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhbkhhbmRsZUxpbmtpbmcuCi0JICogQHBhcmFtIGNhbkhhbmRsZUxpbmtpbmcgVGhlIGNhbkhhbmRsZUxpbmtpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENhbkhhbmRsZUxpbmtpbmcoYm9vbGVhbiBjYW5IYW5kbGVMaW5raW5nKSB7Ci0JCVJlcG9zaXRvcnlQcm92aWRlcldpdGhMaW5raW5nLmNhbkhhbmRsZUxpbmtpbmcgPSBjYW5IYW5kbGVMaW5raW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlJlcG9zaXRvcnlQcm92aWRlciNjYW5IYW5kbGVMaW5rZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUxpbmtlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIGNhbkhhbmRsZUxpbmtpbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9TdHJlYW1UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvU3RyZWFtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMThhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvY29yZS9TdHJlYW1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY29yZS5zdHJlYW1zLkNSTEZ0b0xGSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jb3JlLnN0cmVhbXMuTEZ0b0NSTEZJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFN0cmVhbVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9TRVEgPSBuZXcgYnl0ZVtdIHsgfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTEZfU0VRID0gbmV3IGJ5dGVbXSB7ICdcbicgfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ1JMRl9TRVEgPSBuZXcgYnl0ZVtdIHsgJ1xyJywgJ1xuJyB9OwotCi0JcHVibGljIFN0cmVhbVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RyZWFtVGVzdHMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDUkxGdG9MRklucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGVzdENSTEZ0b0xGVHJhbnNsYXRpb24oIiIsICIiKTsKLQkJdGVzdENSTEZ0b0xGVHJhbnNsYXRpb24oImEiLCAiYSIpOwotCQl0ZXN0Q1JMRnRvTEZUcmFuc2xhdGlvbigiYWJjIiwgImFiYyIpOwotCQl0ZXN0Q1JMRnRvTEZUcmFuc2xhdGlvbigiXG4iLCAiXG4iKTsKLQkJdGVzdENSTEZ0b0xGVHJhbnNsYXRpb24oIlxyIiwgIlxyIik7Ci0JCXRlc3RDUkxGdG9MRlRyYW5zbGF0aW9uKCJcclxuIiwgIlxuIik7Ci0JCXRlc3RDUkxGdG9MRlRyYW5zbGF0aW9uKCJ4XHJcclxuXHJ4IiwgInhcclxuXHJ4Iik7Ci0JCXRlc3RDUkxGdG9MRlRyYW5zbGF0aW9uKCJUaGUgXHJcbiBxdWljayBicm93biBcbiBmb3ggXHJcblxuXHJcclxuIGp1bXBlZCBcblxuIG92ZXIgXHJcbiB0aGUgXG4gbGF6eSBkb2cuXHJcbiIsCi0JCQkiVGhlIFxuIHF1aWNrIGJyb3duIFxuIGZveCBcblxuXHJcbiBqdW1wZWQgXG5cbiBvdmVyIFxuIHRoZSBcbiBsYXp5IGRvZy5cbiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0Q1JMRnRvTEZUcmFuc2xhdGlvbihTdHJpbmcgcHJlLCBTdHJpbmcgcG9zdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHByZS5nZXRCeXRlcygpKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQ1JMRnRvTEZJbnB1dFN0cmVhbShiaW4pOwotCQlJbnB1dFN0cmVhbSBpbkV4cGVjdGVkID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvc3QuZ2V0Qnl0ZXMoKSk7Ci0JCWFzc2VydFN0cmVhbUVxdWFscyhpbkV4cGVjdGVkLCBpbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExGdG9DUkxGSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0ZXN0TEZ0b0NSTEZUcmFuc2xhdGlvbigiIiwgIiIpOwotCQl0ZXN0TEZ0b0NSTEZUcmFuc2xhdGlvbigiYSIsICJhIik7Ci0JCXRlc3RMRnRvQ1JMRlRyYW5zbGF0aW9uKCJhYmMiLCAiYWJjIik7Ci0JCXRlc3RMRnRvQ1JMRlRyYW5zbGF0aW9uKCJcbiIsICJcclxuIik7Ci0JCXRlc3RMRnRvQ1JMRlRyYW5zbGF0aW9uKCJcciIsICJcciIpOwotCQl0ZXN0TEZ0b0NSTEZUcmFuc2xhdGlvbigiXHJcbiIsICJcclxyXG4iKTsKLQkJdGVzdExGdG9DUkxGVHJhbnNsYXRpb24oInhcclxyXG5ccngiLCAieFxyXHJcclxuXHJ4Iik7Ci0JCXRlc3RMRnRvQ1JMRlRyYW5zbGF0aW9uKCJUaGUgXHJcbiBxdWljayBicm93biBcbiBmb3ggXHJcblxuXHJcclxuIGp1bXBlZCBcblxuIG92ZXIgXHJcbiB0aGUgXG4gbGF6eSBkb2cuXHJcbiIsCi0JCQkiVGhlIFxyXHJcbiBxdWljayBicm93biBcclxuIGZveCBcclxyXG5cclxuXHJcclxyXG4ganVtcGVkIFxyXG5cclxuIG92ZXIgXHJcclxuIHRoZSBcclxuIGxhenkgZG9nLlxyXHJcbiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGVzdExGdG9DUkxGVHJhbnNsYXRpb24oU3RyaW5nIHByZSwgU3RyaW5nIHBvc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwcmUuZ2V0Qnl0ZXMoKSk7Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IExGdG9DUkxGSW5wdXRTdHJlYW0oYmluKTsKLQkJSW5wdXRTdHJlYW0gaW5FeHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb3N0LmdldEJ5dGVzKCkpOwotCQlhc3NlcnRTdHJlYW1FcXVhbHMoaW5FeHBlY3RlZCwgaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NlcnRTdHJlYW1FcXVhbHMoSW5wdXRTdHJlYW0gaW4xLCBJbnB1dFN0cmVhbSBpbjIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJaW50IGJ5dGUxID0gaW4xLnJlYWQoKTsKLQkJCQlpbnQgYnl0ZTIgPSBpbjIucmVhZCgpOwotCQkJCWFzc2VydEVxdWFscygiU3RyZWFtcyBub3QgZXF1YWwiLCBieXRlMSwgYnl0ZTIpOwotCQkJCWlmIChieXRlMSA9PSAtMSkgYnJlYWs7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpbjEuY2xvc2UoKTsKLQkJCWluMi5jbG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvVGVhbVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy9jb3JlL1RlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjFiOTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL2NvcmUvVGVhbVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMucmVzb3VyY2VzLlJlc291cmNlVGVzdDsKLQotcHVibGljIGNsYXNzIFRlYW1UZXN0IGV4dGVuZHMgUmVzb3VyY2VUZXN0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIElQcm9ncmVzc01vbml0b3IgREVGQVVMVF9NT05JVE9SID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQcm9ncmVzc01vbml0b3IgREVGQVVMVF9QUk9HUkVTU19NT05JVE9SID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZShDbGFzcyBjKSB7Ci0JCVN0cmluZyB0ZXN0TmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS50ZWFtLnRlc3ROYW1lIik7Ci0JCWlmICh0ZXN0TmFtZSA9PSBudWxsKSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKGMpOwotCQkJcmV0dXJuIHN1aXRlOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFRlc3QpYy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge3Rlc3ROYW1lfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCS8vIEFib3ZlIHdpbGwgdGhyb3cgc28gYmVsb3cgaXMgbmV2ZXIgYWN0dWFsbHkgcmVhY2hlZAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFRlYW1UZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgVGVhbVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldE5hbWVkVGVzdFByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgdGFyZ2V0ID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCWlmICghdGFyZ2V0LmV4aXN0cygpKSB7Ci0JCQl0YXJnZXQuY3JlYXRlKG51bGwpOwotCQkJdGFyZ2V0Lm9wZW4obnVsbCk7Ci0JCX0KLQkJYXNzZXJ0RXhpc3RzSW5GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRVbmlxdWVUZXN0UHJvamVjdChTdHJpbmcgcHJlZml4KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG1hbmFnZSBhbmQgc2hhcmUgd2l0aCB0aGUgZGVmYXVsdCBzdHJlYW0gY3JlYXRlIGJ5IHRoaXMgY2xhc3MKLQkJcmV0dXJuIGdldE5hbWVkVGVzdFByb2plY3QocHJlZml4ICsgIi0iICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBnZXRUZWFtVGVzdFN0YXR1cyhpbnQgc2V2ZXJpdHkpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksICJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUiLCAwLCAidGVhbSBzdGF0dXMiLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpbGVzeXN0ZW0gJ3Jlc291cmNlcycgd2l0aCB0aGUgZ2l2ZW4gbmFtZXMgYW5kIGZpbGxzIHRoZW0gd2l0aCByYW5kb20gdGV4dC4KLQkgKiBAcGFyYW0gY29udGFpbmVyIEFuIG9iamVjdCB0aGF0IGNhbiBob2xkIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlcy4KLQkgKiBAcGFyYW0gaGllcmFyY2h5IEEgbGlzdCBvZiBmaWxlcyAmIGZvbGRlciBuYW1lcyB0byB1c2UgYXMgcmVzb3VyY2VzCi0JICogQHBhcmFtIGluY2x1ZGVDb250YWluZXIgQSBmbGFnIHRoYXQgY29udHJvbHMgd2hldGhlciB0aGUgY29udGFpbmVyIGlzIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KLQkgKiBAcmV0dXJuIElSZXNvdXJjZVtdIEFuIGFycmF5IG9mIHJlc291cmNlcyBmaWxsZWQgd2l0aCB2YXJpYWJsZSBhbW91bnRzIG9mIHJhbmRvbSB0ZXh0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGJ1aWxkUmVzb3VyY2VzKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmdbXSBoaWVyYXJjaHksIGJvb2xlYW4gaW5jbHVkZUNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoaGllcmFyY2h5Lmxlbmd0aCArIDEpOwotCQlpZiAoaW5jbHVkZUNvbnRhaW5lcikKLQkJCXJlc291cmNlcy5hZGQoY29udGFpbmVyKTsKLQkJcmVzb3VyY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGJ1aWxkUmVzb3VyY2VzKGNvbnRhaW5lciwgaGllcmFyY2h5KSkpOwotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSAoSVJlc291cmNlW10pIHJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV0pOwotCQllbnN1cmVFeGlzdHNJbldvcmtzcGFjZShyZXN1bHQsIHRydWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlc3VsdFtpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIC8vIDM3ODYgYnl0ZXMgaXMgdGhlIGF2ZXJhZ2Ugc2l6ZSBvZiBFY2xpcHNlIEphdmEgZmlsZXMhCi0JCQkJICgoSUZpbGUpIHJlc3VsdFtpXSkuc2V0Q29udGVudHMoZ2V0UmFuZG9tQ29udGVudHMoMTAwKSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBJUmVzb3VyY2VbXSBidWlsZEVtcHR5UmVzb3VyY2VzKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmdbXSBoaWVyYXJjaHksIGJvb2xlYW4gaW5jbHVkZUNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoaGllcmFyY2h5Lmxlbmd0aCArIDEpOwotCQlyZXNvdXJjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYnVpbGRSZXNvdXJjZXMoY29udGFpbmVyLCBoaWVyYXJjaHkpKSk7Ci0JCWlmIChpbmNsdWRlQ29udGFpbmVyKQotCQkJcmVzb3VyY2VzLmFkZChjb250YWluZXIpOwotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSAoSVJlc291cmNlW10pIHJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV0pOwotCQllbnN1cmVFeGlzdHNJbldvcmtzcGFjZShyZXN1bHQsIHRydWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIElucHV0U3RyZWFtIGZpbGxlZCB3aXRoIHJhbmRvbSB0ZXh0IGluIGV4Y2VzcyBvZiBhIHNwZWNpZmllZCBtaW5pbXVtLgotCSAqIEBwYXJhbSBzaXplQXRMZWFzdCAJVGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJzIHRvIGZpbGwgdGhlIGlucHV0IHN0cmVhbSB3aXRoLgotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0gVGhlIGlucHV0IHN0cmVhbSBjb250YWluaW5nIHJhbmRvbSB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmFuZG9tQ29udGVudHMoaW50IHNpemVBdExlYXN0KSB7Ci0JCVN0cmluZ0J1ZmZlciByYW5kb21TdHVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoc2l6ZUF0TGVhc3QgKyAxMDApOwotCQl3aGlsZSAocmFuZG9tU3R1ZmYubGVuZ3RoKCkgPCBzaXplQXRMZWFzdCkgewotCQkJcmFuZG9tU3R1ZmYuYXBwZW5kKGdldFJhbmRvbVNuaXBwZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYW5kb21TdHVmZi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotCX0KLQkvKioKLQkgKiBQcm9kdWNlcyBhIHJhbmRvbSBjaHVuayBvZiB0ZXh0IGZyb20gYSBmaW5pdGUgY29sbGVjdGlvbiBvZiBwcmUtd3JpdHRlbiBwaHJhc2VzLgotCSAqIEByZXR1cm4gU3RyaW5nIFNvbWUgcmFuZG9tIHdvcmRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJhbmRvbVNuaXBwZXQoKSB7Ci0JCXN3aXRjaCAoKGludCkgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTApKSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiAiZXN0ZSBlJyBvIG1ldSBjb250ZXVkbyAocG9ydHVndWVzZSkiOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gIkRhbm4gYnJhdWNoZW4gd2lyIGFiZXIgYXVjaCBlaW5lbiBkZXV0c2NoZW4gU2F0eiEiOwotCQkJY2FzZSAyIDoKLQkJCQlyZXR1cm4gIkknbGwgYmUgYmFjayI7Ci0JCQljYXNlIDMgOgotCQkJCXJldHVybiAiZG9uJ3Qgd29ycnksIGJlIGhhcHB5IjsKLQkJCWNhc2UgNCA6Ci0JCQkJcmV0dXJuICJ0aGVyZSBpcyBubyBpbWFnaW5hdGlvbiBmb3IgbW9yZSBzZW50ZW5jZXMiOwotCQkJY2FzZSA1IDoKLQkJCQlyZXR1cm4gImN1c3RvbWl6ZSB5b3VycyI7Ci0JCQljYXNlIDYgOgotCQkJCXJldHVybiAiZm9vIjsKLQkJCWNhc2UgNyA6Ci0JCQkJcmV0dXJuICJiYXIiOwotCQkJY2FzZSA4IDoKLQkJCQlyZXR1cm4gImZvb2JhciI7Ci0JCQljYXNlIDkgOgotCQkJCXJldHVybiAiY2FzZSA5IjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAidGhlc2UgYXJlIG15IGNvbnRlbnRzIjsKLQkJfQotCX0KLQotCQotCXB1YmxpYyB2b2lkIHNsZWVwKGludCBtcykgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKG1zKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJUZXN0aW5nIHdhcyBydWRlbHkgaW50ZXJydXB0ZWQuIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRUZXh0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHRleHQsIGJvb2xlYW4gcHJlcGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJaWYgKHByZXBlbmQpIHsKLQkJCQlib3Mud3JpdGUodGV4dC5nZXRCeXRlcygpKTsKLQkJCX0KLQkJCWludCBpOwotCQkJd2hpbGUgKChpID0gaW4ucmVhZCgpKSAhPSAtMSkgewotCQkJCWJvcy53cml0ZShpKTsKLQkJCX0KLQkJCWlmICghcHJlcGVuZCkgewotCQkJCWJvcy53cml0ZSh0ZXh0LmdldEJ5dGVzKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJfQotCQlmaWxlLnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSksIGZhbHNlLCBmYWxzZSwgREVGQVVMVF9NT05JVE9SKTsKLQl9Ci0JLyoKLQkgKiBHZXQgdGhlIHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlIG5hbWVzCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nW10gaGllcmFyY2h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbaGllcmFyY2h5Lmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDtpPHJlc291cmNlcy5sZW5ndGg7aSsrKSB7Ci0JCQlyZXNvdXJjZXNbaV0gPSBjb250YWluZXIuZmluZE1lbWJlcihoaWVyYXJjaHlbaV0pOwotCQkJaWYgKHJlc291cmNlc1tpXSA9PSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VzW2ldID0gYnVpbGRSZXNvdXJjZXMoY29udGFpbmVyLCBuZXcgU3RyaW5nW10ge2hpZXJhcmNoeVtpXX0pWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCS8vIEFzc2VydCB0aGF0IHRoZSB0d28gY29udGFpbmVycyBoYXZlIGVxdWFsIGNvbnRlbnRzCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXF1YWxzKElDb250YWluZXIgY29udGFpbmVyMSwgSUNvbnRhaW5lciBjb250YWluZXIyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhjb250YWluZXIxLmdldE5hbWUoKSwgY29udGFpbmVyMi5nZXROYW1lKCkpOwotCQlMaXN0IG1lbWJlcnMxID0gbmV3IEFycmF5TGlzdCgpOwotCQltZW1iZXJzMS5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb250YWluZXIxLm1lbWJlcnMoKSkpOwotCQkKLQkJTGlzdCBtZW1iZXJzMiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbWVtYmVyczIuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29udGFpbmVyMi5tZW1iZXJzKCkpKTsKLQkJCi0JCWFzc2VydFRydWUobWVtYmVyczEuc2l6ZSgpID09IG1lbWJlcnMyLnNpemUoKSk7Ci0JCWZvciAoaW50IGk9MDtpPG1lbWJlcnMxLnNpemUoKTtpKyspIHsKLQkJCUlSZXNvdXJjZSBtZW1iZXIxID0gKElSZXNvdXJjZSltZW1iZXJzMS5nZXQoaSk7Ci0JCQlJUmVzb3VyY2UgbWVtYmVyMiA9IGNvbnRhaW5lcjIuZmluZE1lbWJlcihtZW1iZXIxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnROb3ROdWxsKG1lbWJlcjIpOwotCQkJYXNzZXJ0RXF1YWxzKG1lbWJlcjEsIG1lbWJlcjIpOwotCQl9Ci0JfQotCQotCS8vIEFzc2VydCB0aGF0IHRoZSB0d28gZmlsZXMgaGF2ZSBlcXVhbCBjb250ZW50cwotCXByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhJRmlsZSBmaWxlMSwgSUZpbGUgZmlsZTIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUxLmdldE5hbWUoKSwgZmlsZTIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb21wYXJlQ29udGVudChmaWxlMS5nZXRDb250ZW50cygpLCBmaWxlMi5nZXRDb250ZW50cygpKSk7Ci0JfQotCQotCS8vIEFzc2VydCB0aGF0IHRoZSB0d28gcHJvamVjdHMgaGF2ZSBlcXVhbCBjb250ZW50cyBpZ25vcmVpbmcgdGhlIHByb2plY3QgbmFtZQotCS8vIGFuZCB0aGUgLnZjbV9tZXRhIGZpbGUKLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoSVByb2plY3QgY29udGFpbmVyMSwgSVByb2plY3QgY29udGFpbmVyMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IG1lbWJlcnMxID0gbmV3IEFycmF5TGlzdCgpOwotCQltZW1iZXJzMS5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb250YWluZXIxLm1lbWJlcnMoKSkpOwotCQltZW1iZXJzMS5yZW1vdmUoY29udGFpbmVyMS5maW5kTWVtYmVyKCIucHJvamVjdCIpKTsKLQkJCi0JCUxpc3QgbWVtYmVyczIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW1lbWJlcnMyLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbnRhaW5lcjIubWVtYmVycygpKSk7Ci0JCW1lbWJlcnMyLnJlbW92ZShjb250YWluZXIyLmZpbmRNZW1iZXIoIi5wcm9qZWN0IikpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiTnVtYmVyIG9mIGNoaWxkcmVuIGRpZmZlcnMgZm9yICIgKyBjb250YWluZXIxLmdldEZ1bGxQYXRoKCksIG1lbWJlcnMxLnNpemUoKSA9PSBtZW1iZXJzMi5zaXplKCkpOwotCQlmb3IgKGludCBpPTA7aTxtZW1iZXJzMS5zaXplKCk7aSsrKSB7Ci0JCQlJUmVzb3VyY2UgbWVtYmVyMSA9IChJUmVzb3VyY2UpbWVtYmVyczEuZ2V0KGkpOwotCQkJSVJlc291cmNlIG1lbWJlcjIgPSBjb250YWluZXIyLmZpbmRNZW1iZXIobWVtYmVyMS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0Tm90TnVsbChtZW1iZXIyKTsKLQkJCWFzc2VydEVxdWFscyhtZW1iZXIxLCBtZW1iZXIyKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoSVJlc291cmNlIHJlc291cmNlMSwgSVJlc291cmNlIHJlc291cmNlMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMocmVzb3VyY2UxLmdldFR5cGUoKSwgcmVzb3VyY2UyLmdldFR5cGUoKSk7Ci0JCWlmIChyZXNvdXJjZTEuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJYXNzZXJ0RXF1YWxzKChJRmlsZSlyZXNvdXJjZTEsIChJRmlsZSlyZXNvdXJjZTIpOwotCQllbHNlIAotCQkJYXNzZXJ0RXF1YWxzKChJQ29udGFpbmVyKXJlc291cmNlMSwgKElDb250YWluZXIpcmVzb3VyY2UyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvc3luY2hyb25pemUvQWxsVGVhbVN5bmNocm9uaXplVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9BbGxUZWFtU3luY2hyb25pemVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODJjYjMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9BbGxUZWFtU3luY2hyb25pemVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnN5bmNocm9uaXplOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMucmVzb3VyY2VzLlJlc291cmNlVGVzdDsKLQotcHVibGljIGNsYXNzIEFsbFRlYW1TeW5jaHJvbml6ZVRlc3RzIGV4dGVuZHMgUmVzb3VyY2VUZXN0IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDVlNDbGllbnRUZXN0LgotCSAqLwotCXB1YmxpYyBBbGxUZWFtU3luY2hyb25pemVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1ZTQ2xpZW50VGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBbGxUZWFtU3luY2hyb25pemVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChUZXN0RGlmZk5vZGVQcmVzZW50YXRpb25Nb2RlbC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChTeW5jSW5mb1NldENvbnRlbnRQcm92aWRlclRlc3Quc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9TeW5jSW5mb1NldENvbnRlbnRQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9TeW5jSW5mb1NldENvbnRlbnRQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NTk2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvc3luY2hyb25pemUvU3luY0luZm9TZXRDb250ZW50UHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnN5bmNocm9uaXplOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5zeW5jaHJvbml6ZS5TeW5jSW5mb1RyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC51aS5zeW5jaHJvbml6ZS5TeW5jaHJvbml6ZU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBTeW5jSW5mb1NldCBjb250ZW50IHByb3ZpZGVycy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNJbmZvU2V0Q29udGVudFByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3REaWZmTm9kZVByZXNlbnRhdGlvbk1vZGVsIHsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1ZTUHJvdmlkZXJUZXN0Ci0JICovCi0JcHVibGljIFN5bmNJbmZvU2V0Q29udGVudFByb3ZpZGVyVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1ZTUHJvdmlkZXJUZXN0Ci0JICovCi0JcHVibGljIFN5bmNJbmZvU2V0Q29udGVudFByb3ZpZGVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZShTeW5jSW5mb1NldENvbnRlbnRQcm92aWRlclRlc3QuY2xhc3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnN5bmNocm9uaXplLlRlc3REaWZmTm9kZVByZXNlbnRhdGlvbk1vZGVsI2dldERpZmZOb2RlQ29udHJvbGxlcigpCi0JICovCi0JcHJvdGVjdGVkIFN5bmNocm9uaXplTW9kZWxQcm92aWRlciBnZXREaWZmTm9kZUNvbnRyb2xsZXIoU3luY0luZm9UcmVlIHNldCkgewotCQkvL3JldHVybiBuZXcgQ29tcHJlc3NlZEZvbGRlcnNNb2RlbFByb3ZpZGVyKHNldCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NlcnRGb2xkZXJQcmVzZW50KElGb2xkZXIgZm9sZGVyLCBMaXN0IHJlc291cmNlcykgewotCQkvLyBGaXJzdCwgaWYgdGhlIGZvbGRlciBpcyBvdXQtb2Ytc3luYywgaXQgc2hvdWxkIGJlIHZpc2libGUKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuZXF1YWxzKGZvbGRlcikpIHsKLQkJCQkvLyBUaGUgZm9sZGVyIHNob3VsZCBiZSBwcmVzZW50LgotCQkJCS8vIFJlbW92ZSBpdCBzaW5jZSBpdCBoYXMgYmVlbiB2ZXJpZmllZAotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIElmIHRoZSBmb2xkZXIgY29udGFpbnMgYSBmaWxlIGluIHRoZSBsaXN0LCBpdCBpcyBhbHNvIE9LCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5nZXRQYXJlbnQoKS5lcXVhbHMoZm9sZGVyKSkgewotCQkJCS8vIFRoZSBjb21wcmVzc2VkIGZvbGRlciBpcyB2YWxpZCBzaW5jZSBpdCBjb250YWlucyBhbiBvdXQtb2Ytc3luYyBmaWxlCi0JCQkJLy8gSG93ZXZlciwgdGhlIHJlc291cmNlIGlzIGxlZnQgc2luY2UgaXQgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIChvbmx5IGl0J3MgcGFyZW50KQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmYWlsKCJGb2xkZXIgIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIiBzaG91bGQgbm90IGJlIHZpc2libGUgYnV0IGlzLiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NlcnRGaWxlUHJlc2VudChJUmVzb3VyY2UgaXRlbVJlc291cmNlLCBMaXN0IHJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZS5lcXVhbHMoaXRlbVJlc291cmNlKSkgewotCQkJCS8vIFRoZSByZXNvdXJjZSBoYXMgYmVlbiB2ZXJpZmllZCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWZhaWwoIlJlc291cmNlICIgKyBpdGVtUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICIgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIGJ1dCBpcy4iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0UHJvamVjdFByZXNlbnQoSVByb2plY3QgcHJvamVjdCwgTGlzdCByZXNvdXJjZXMpIHsKLS8vCQlGaXJzdCwgaWYgdGhlIHByb2plY3QgaXMgb3V0LW9mLXN5bmMsIGl0IHNob3VsZCBiZSB2aXNpYmxlCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlc291cmNlLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCS8vIFRoZSBmb2xkZXIgc2hvdWxkIGJlIHByZXNlbnQuCi0JCQkJLy8gUmVtb3ZlIGl0IHNpbmNlIGl0IGhhcyBiZWVuIHZlcmlmaWVkCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmYWlsKCJQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIGJ1dCBpcy4iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvc3luY2hyb25pemUvVGVzdERpZmZOb2RlUHJlc2VudGF0aW9uTW9kZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9UZXN0RGlmZk5vZGVQcmVzZW50YXRpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTIwYWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9UZXN0RGlmZk5vZGVQcmVzZW50YXRpb25Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS5zeW5jaHJvbml6ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLnN5bmNocm9uaXplLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC51aS5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLnVpLnN5bmNocm9uaXplLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlLlRlYW1UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0udGVzdHMudWkudmlld3MuQ29udGVudFByb3ZpZGVyVGVzdFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS52aWV3cy5UZXN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLnVpLlRlYW1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5JU3luY2hyb25pemVQYXJ0aWNpcGFudDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdERpZmZOb2RlUHJlc2VudGF0aW9uTW9kZWwgZXh0ZW5kcyBUZWFtVGVzdCB7Ci0JCi0JcHJpdmF0ZSBDb250ZW50UHJvdmlkZXJUZXN0VmlldyB2aWV3OwotCXByaXZhdGUgU3luY0luZm9UcmVlIHNldDsKLQlwcml2YXRlIFRyZWVWaWV3ZXJBZHZpc29yIGNvbmZpZ3VyYXRpb247Ci0JCi0JcHVibGljIFRlc3REaWZmTm9kZVByZXNlbnRhdGlvbk1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXN0RGlmZk5vZGVQcmVzZW50YXRpb25Nb2RlbChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZShUZXN0RGlmZk5vZGVQcmVzZW50YXRpb25Nb2RlbC5jbGFzcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJVGVzdFBhcnRpY2lwYW50IHAgPSAoVGVzdFBhcnRpY2lwYW50KWdldFBhcnRpY2lwYW50KFRlc3RQYXJ0aWNpcGFudC5JRCk7Ci0JCXAucmVzZXQoKTsKLQkJdGhpcy5zZXQgPSBwLmdldFN5bmNJbmZvU2V0KCk7Ci0JCXZpZXcgPSBDb250ZW50UHJvdmlkZXJUZXN0Vmlldy5maW5kVmlld0luQWN0aXZlUGFnZShudWxsKTsKLQkJY29uZmlndXJhdGlvbi5pbml0aWFsaXplVmlld2VyKHZpZXcuZ2V0Vmlld2VyKCkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTeW5jaHJvbml6ZVBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KFN0cmluZyBpZCkgdGhyb3dzIFRlYW1FeGNlcHRpb24gewotCQlJU3luY2hyb25pemVQYXJ0aWNpcGFudFJlZmVyZW5jZSByZWZlcmVuY2UgPSBUZWFtVUkuZ2V0U3luY2hyb25pemVNYW5hZ2VyKCkuZ2V0KGlkLCBudWxsKTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlLmdldFBhcnRpY2lwYW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXQgPSBudWxsOwotCQljb25maWd1cmF0aW9uLmRpc3Bvc2UoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN5bmNocm9uaXplTW9kZWxQcm92aWRlciBnZXREaWZmTm9kZUNvbnRyb2xsZXIoU3luY0luZm9UcmVlIHNldCkgewotCQkvL3JldHVybiBuZXcgSGllcmFyY2hpY2FsTW9kZWxQcm92aWRlcihzZXQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZXMsIGltcG9ydHMKLQkgKiBpdCB0byBDVlMgYW5kIGNoZWNrcyBpdCBvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSByZXNvdXJjZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFVuaXF1ZVRlc3RQcm9qZWN0KHByZWZpeCk7Ci0JCWJ1aWxkUmVzb3VyY2VzKHByb2plY3QsIHJlc291cmNlcywgdHJ1ZSk7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKgotCSAqIENyZWF0ZSBhIHRlc3QgcHJvamVjdCB1c2luZyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdCBjYXNlIGFzIHRoZSBwcm9qZWN0IG5hbWUgcHJlZml4Ci0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nW10gcmVzb3VyY2VzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVQcm9qZWN0KGdldE5hbWUoKSwgcmVzb3VyY2VzKTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBhZGp1c3RTZXQoU3luY0luZm9TZXQgc2V0LCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSByZXNvdXJjZVN0cmluZ3MsIGludFtdIHN5bmNLaW5kKSB0aHJvd3MgVGVhbUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGJ1aWxkUmVzb3VyY2VzKHByb2plY3QsIHJlc291cmNlU3RyaW5ncyk7Ci0JCXRyeSB7Ci0JCQlzZXQuYmVnaW5JbnB1dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJaW50IGtpbmQgPSBzeW5jS2luZFtpXTsKLQkJCQlpZiAoa2luZCA9PSBTeW5jSW5mby5JTl9TWU5DKSB7Ci0JCQkJCXNldC5yZW1vdmUocmVzb3VyY2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5bmNJbmZvIG5ld0luZm8gPSBuZXcgVGVzdFN5bmNJbmZvKHJlc291cmNlLCBraW5kKTsKLQkJCQkJc2V0LmFkZChuZXdJbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXQuZW5kSW5wdXQobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhhdCB0aGUgcmVzb3VyY2UKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJvcGVyVmlzaWJsZUl0ZW1zKCkgewotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBzZXQuZ2V0UmVzb3VyY2VzKCk7Ci0JCUxpc3QgcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJcmVzb3VyY2VMaXN0LmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJVGVzdFRyZWVWaWV3ZXIgdmlld2VyID0gdmlldy5nZXRWaWV3ZXIoKTsKLQkJSXRlbVtdIGl0ZW1zID0gdmlld2VyLmdldFJvb3RJdGVtcygpOwotCQlpZiAocmVzb3VyY2VzLmxlbmd0aCA9PSAgMCkgewotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgYXJlIGl0ZW1zIHZpc2libGUgd2hlbiB0aGVyZSBzaG91bGQgbm90IGJlLiIsIGl0ZW1zLmxlbmd0aCA9PSAwKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUZXN0IHRoYXQgYWxsIGl0ZW1zIGluIHRoZSB0cmVlIGFyZSBleHBlY3RlZAotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWFzc2VydFRoYXRBbGxPdXRPZlN5bmNSZXNvdXJjZXNBcmVTaG93bihpdGVtLCByZXNvdXJjZUxpc3QpOwotCQl9Ci0JCS8vIFRlc3QgdGhhdCBhbGwgZXhwZWN0ZWQgcmVzb3VyY2VzIGFuZCB0aGVpciBwYXJlbnRzIGFyZSBwcmVzZW50Ci0JCWFzc2VydFRydWUoIlRoZSB0cmVlIGRpZCBub3QgY29udGFpbiBhbGwgZXhwZWN0ZWQgcmVzb3VyY2VzOiAiICsgcmVzb3VyY2VMaXN0LnRvU3RyaW5nKCksIHJlc291cmNlTGlzdC5pc0VtcHR5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBUcmF2ZXJzZSBldmVyeSBlbGVtZW50IHNob3duIGluIHRoZSB2aWV3IGFuZCBlbnN1cmUgdGhhdCBldmVyeSBvdXQtb2Ytc3luYyAKLQkgKiByZXNvdXJjZSBpbiB0aGUgc2V0IGlzIGF0IGxlYXN0IHNob3duLiBUaGlzIGRvZXNuJ3QgdGVzdCB0aGUgYWN0dWFsIGxvZ2ljYWwKLQkgKiBvcmdhbml6YXRpb24sIGJ1dCBkb2VzIGVuc3VyZSB0aGF0IGFsbCBvdXQtb2Ytc3luYyByZXNvdXJjZXMgYXJlIHNob3duIG9ubHkKLQkgKiBvbmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc2VydFRoYXRBbGxPdXRPZlN5bmNSZXNvdXJjZXNBcmVTaG93bihJdGVtIGl0ZW0sIExpc3Qgb3V0T2ZTeW5jUmVzb3VyY2VzKSB7Ci0JCU9iamVjdCBub2RlID0gaXRlbS5nZXREYXRhKCk7Ci0JCVN5bmNJbmZvIGluZm8gPSAoU3luY0luZm8pVXRpbHMuZ2V0QWRhcHRlcihub2RlLCBTeW5jSW5mby5jbGFzcyk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHRyZWUgY29udGFpbmVkIGFuIG91dC1vZi1zeW5jIHJlc291cmNlIHRoYXQgd2Fzbid0IGluIHRoZSBzZXQiLCBvdXRPZlN5bmNSZXNvdXJjZXMucmVtb3ZlKGluZm8uZ2V0TG9jYWwoKSkpOwotCQl9Ci0JCUl0ZW1bXSBjaGlsZHJlbiA9IHZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q2hpbGRyZW4oaXRlbSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUl0ZW0gY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWFzc2VydFRoYXRBbGxPdXRPZlN5bmNSZXNvdXJjZXNBcmVTaG93bihjaGlsZCwgb3V0T2ZTeW5jUmVzb3VyY2VzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChuZXcgU3RyaW5nW117ImZpbGUudHh0IiwgImZvbGRlcjEvZmlsZTIudHh0IiwgImZvbGRlcjEvZm9sZGVyMi9maWxlMy50eHQifSk7Ci0JCWFkanVzdFNldChzZXQsIHByb2plY3QsIAotCQkJCW5ldyBTdHJpbmdbXXsiZmlsZS50eHQifSwgCi0JCQkJbmV3IGludFtde1N5bmNJbmZvLk9VVEdPSU5HIHwgU3luY0luZm8uQ0hBTkdFfSk7Ci0JCWFzc2VydFByb3BlclZpc2libGVJdGVtcygpOwotCQlhZGp1c3RTZXQoc2V0LCBwcm9qZWN0LCAKLQkJCQluZXcgU3RyaW5nW117ImZvbGRlcjEvZmlsZTIudHh0IiwgImZvbGRlcjEvZm9sZGVyMi9maWxlMy50eHQifSwgCi0JCQkJbmV3IGludFtde1N5bmNJbmZvLk9VVEdPSU5HIHwgU3luY0luZm8uQ0hBTkdFLCBTeW5jSW5mby5PVVRHT0lORyB8IFN5bmNJbmZvLkNIQU5HRX0pOwotCQlhc3NlcnRQcm9wZXJWaXNpYmxlSXRlbXMoKTsKLQkJYWRqdXN0U2V0KHNldCwgcHJvamVjdCwgCi0JCQkJbmV3IFN0cmluZ1tdeyJmb2xkZXIxL2ZpbGUyLnR4dCJ9LCAKLQkJCQluZXcgaW50W117U3luY0luZm8uSU5fU1lOQyx9KTsKLQkJYXNzZXJ0UHJvcGVyVmlzaWJsZUl0ZW1zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudFJlbW92YWxXaXRoQ2hpbGRSZW1haW5pbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcm9qZWN0KG5ldyBTdHJpbmdbXXsiZmlsZS50eHQiLCAiZm9sZGVyMS9maWxlMi50eHQiLCAiZm9sZGVyMS9mb2xkZXIyL2ZpbGUzLnR4dCJ9KTsKLQkJYWRqdXN0U2V0KHNldCwgcHJvamVjdCwgCi0JCQkJbmV3IFN0cmluZ1tdeyJmb2xkZXIxL2ZvbGRlcjIvIiwgImZvbGRlcjEvZm9sZGVyMi9maWxlMy50eHQifSwgCi0JCQkJbmV3IGludFtde1N5bmNJbmZvLkNPTkZMSUNUSU5HIHwgU3luY0luZm8uQ0hBTkdFLCBTeW5jSW5mby5DT05GTElDVElORyB8IFN5bmNJbmZvLkNIQU5HRX0pOwotCQlhc3NlcnRQcm9wZXJWaXNpYmxlSXRlbXMoKTsKLQkJCi0JCWFkanVzdFNldChzZXQsIHByb2plY3QsIAotCQkJCW5ldyBTdHJpbmdbXXsiZm9sZGVyMS9mb2xkZXIyLyIsICJmb2xkZXIxL2ZvbGRlcjIvZmlsZTMudHh0In0sIAotCQkJCW5ldyBpbnRbXXtTeW5jSW5mby5JTl9TWU5DLCBTeW5jSW5mby5PVVRHT0lORyB8IFN5bmNJbmZvLkNIQU5HRX0pOwotCQlhc3NlcnRQcm9wZXJWaXNpYmxlSXRlbXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5Rm9sZGVyQ2hhbmdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChuZXcgU3RyaW5nW117ImZpbGUudHh0IiwgImZvbGRlcjEvZmlsZTIudHh0IiwgImZvbGRlcjEvZm9sZGVyMi9maWxlMy50eHQiLCAiZm9sZGVyMy8ifSk7Ci0JCWFkanVzdFNldChzZXQsIHByb2plY3QsIAotCQkJCW5ldyBTdHJpbmdbXXsiZm9sZGVyMS9mb2xkZXIyLyIsICJmb2xkZXIxL2ZvbGRlcjIvZmlsZTMudHh0In0sIAotCQkJCW5ldyBpbnRbXXtTeW5jSW5mby5DT05GTElDVElORyB8IFN5bmNJbmZvLkNIQU5HRSwgU3luY0luZm8uQ09ORkxJQ1RJTkcgfCBTeW5jSW5mby5DSEFOR0V9KTsKLQkJYXNzZXJ0UHJvcGVyVmlzaWJsZUl0ZW1zKCk7Ci0JCQotCQlhZGp1c3RTZXQoc2V0LCBwcm9qZWN0LCAKLQkJCQluZXcgU3RyaW5nW117ImZvbGRlcjEvZm9sZGVyMi8iLCAiZm9sZGVyMS9mb2xkZXIyL2ZpbGUzLnR4dCJ9LCAKLQkJCQluZXcgaW50W117U3luY0luZm8uSU5fU1lOQywgU3luY0luZm8uT1VUR09JTkcgfCBTeW5jSW5mby5DSEFOR0V9KTsKLQkJYXNzZXJ0UHJvcGVyVmlzaWJsZUl0ZW1zKCk7Ci0JCQotCQlhZGp1c3RTZXQoc2V0LCBwcm9qZWN0LCAKLQkJCQluZXcgU3RyaW5nW117ImZvbGRlcjEvZm9sZGVyMi9maWxlMy50eHQifSwgCi0JCQkJbmV3IGludFtde1N5bmNJbmZvLklOX1NZTkN9KTsKLQkJYXNzZXJ0UHJvcGVyVmlzaWJsZUl0ZW1zKCk7Ci0JCQotCQlhZGp1c3RTZXQoc2V0LCBwcm9qZWN0LCAKLQkJCQluZXcgU3RyaW5nW117ImZvbGRlcjMvIn0sIAotCQkJCW5ldyBpbnRbXXtTeW5jSW5mby5JTkNPTUlORyB8IFN5bmNJbmZvLkFERElUSU9OfSk7Ci0JCWFzc2VydFByb3BlclZpc2libGVJdGVtcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9UZXN0UGFnZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3N5bmNocm9uaXplL1Rlc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOWRiN2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3N5bmNocm9uaXplL1Rlc3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnN5bmNocm9uaXplOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLnVpLnN5bmNocm9uaXplLlN0cnVjdHVyZWRWaWV3ZXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuc3luY2hyb25pemUuVHJlZVZpZXdlckFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZTsKLQotLyoqCi0gKiBQYWdlIGZvciB0ZXN0aW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgaW1wbGVtZW50cyBJU3luY2hyb25pemVQYWdlIHsKLQkKLQlwcml2YXRlIElTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCXByaXZhdGUgVmlld2VyIGNoYW5nZXNWaWV3ZXI7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyQWR2aXNvciB2aWV3ZXJBZHZpc29yOwotCi0JcHVibGljIFRlc3RQYWdlKElTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQkJY29uZmlndXJhdGlvbi5zZXRQYWdlKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOyAKLQkJLy9zYy5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGg9IGZhbHNlOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIGNoYW5nZXMgc2VjdGlvbiB3aGljaCwgaW4gdHVybiwgY3JlYXRlcyB0aGUgY2hhbmdlcyB2aWV3ZXIgYW5kIGl0cyBjb25maWd1cmF0aW9uCi0JCXRoaXMuY2hhbmdlc1ZpZXdlciA9IGNyZWF0ZUNoYW5nZXNWaWV3ZXIoY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFZpZXdlciBjcmVhdGVDaGFuZ2VzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld2VyQWR2aXNvciA9IG5ldyBUcmVlVmlld2VyQWR2aXNvcihwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOwotCQlyZXR1cm4gdmlld2VyQWR2aXNvci5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cnVjdHVyZWRWaWV3ZXJBZHZpc29yIGdldFZpZXdlckFkdmlzb3IoKSB7Ci0JCXJldHVybiB2aWV3ZXJBZHZpc29yOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI2dldENvbnRyb2woKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2Ujc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljaGFuZ2VzVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhZ2VTaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVN5bmNocm9uaXplUGFnZVNpdGUgc2l0ZSkgewotCQkvLyBOb29wCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2Ujc2V0QWN0aW9uQmFycyhvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJLy8gRGVsZWdhdGUgbWVudSBjcmVhdGlvbiB0byB0aGUgYWR2aXNvcgotCQl2aWV3ZXJBZHZpc29yLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhZ2UjZ2V0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIGNoYW5nZXNWaWV3ZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5JU3luY2hyb25pemVQYWdlI2Fib3V0VG9DaGFuZ2VQcm9wZXJ0eShvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFib3V0VG9DaGFuZ2VQcm9wZXJ0eShJU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcga2V5LCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJLy8gQWxsb3cgYWxsIGNoYW5nZXMKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3N5bmNocm9uaXplL1Rlc3RQYXJ0aWNpcGFudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3N5bmNocm9uaXplL1Rlc3RQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgxOWI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9UZXN0UGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS5zeW5jaHJvbml6ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5zeW5jaHJvbml6ZS5TeW5jSW5mb1RyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5BYnN0cmFjdFN5bmNocm9uaXplUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5JU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlQm9va1ZpZXdQYWdlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFBhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RTeW5jaHJvbml6ZVBhcnRpY2lwYW50IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnRlc3QtcGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTeW5jSW5mb1RyZWUgc2V0ID0gbmV3IFN5bmNJbmZvVHJlZSgpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0udWkuc3luY2hyb25pemUuQWJzdHJhY3RTeW5jaHJvbml6ZVBhcnRpY2lwYW50I2luaXRpYWxpemVDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnRlYW0udWkuc3luY2hyb25pemUuSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbmZpZ3VyYXRpb24oSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQljb25maWd1cmF0aW9uLnNldFByb3BlcnR5KElTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uLlBfU1lOQ19JTkZPX1NFVCwgc2V0KTsKLQkJY29uZmlndXJhdGlvbi5zZXRNb2RlKElTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uLkJPVEhfTU9ERSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0udWkuc3luY2hyb25pemUuSVN5bmNocm9uaXplUGFydGljaXBhbnQjY3JlYXRlUGFnZShvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBJUGFnZUJvb2tWaWV3UGFnZSBjcmVhdGVQYWdlKElTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBUZXN0UGFnZShjb25maWd1cmF0aW9uKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5JU3luY2hyb25pemVQYXJ0aWNpcGFudCNjcmVhdGVTeW5jaHJvbml6ZVdpemFyZCgpCi0JICovCi0JcHVibGljIElXaXphcmQgY3JlYXRlU3luY2hyb25pemVXaXphcmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhcnRpY2lwYW50I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIE5vb3AKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhcnRpY2lwYW50I3J1bihvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXNldC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3luY0luZm9UcmVlIGdldFN5bmNJbmZvU2V0KCkgewotCQlyZXR1cm4gc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9UZXN0U3luY0luZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdGVhbS90ZXN0cy91aS9zeW5jaHJvbml6ZS9UZXN0U3luY0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyYTI5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvc3luY2hyb25pemUvVGVzdFN5bmNJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnRlYW0udGVzdHMudWkuc3luY2hyb25pemU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLnN5bmNocm9uaXplLlN5bmNJbmZvOwotCi1wdWJsaWMgY2xhc3MgVGVzdFN5bmNJbmZvIGV4dGVuZHMgU3luY0luZm8gewotCi0JcHJpdmF0ZSBpbnQga2luZDsKLQkKLQlwdWJsaWMgVGVzdFN5bmNJbmZvKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQpIHRocm93cyBUZWFtRXhjZXB0aW9uIHsKLQkJc3VwZXIocmVzb3VyY2UsIG51bGwsIG51bGwsIG51bGwpOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuc3Vic2NyaWJlcnMuU3luY0luZm8jY2FsY3VsYXRlS2luZCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBjYWxjdWxhdGVLaW5kKCkgdGhyb3dzIFRlYW1FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5raW5kOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuc3Vic2NyaWJlcnMuU3luY0luZm8jZ2V0S2luZCgpCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvc3luY2hyb25pemUvVGVzdFRyZWVWaWV3ZXJBZHZpc29yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvc3luY2hyb25pemUvVGVzdFRyZWVWaWV3ZXJBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlM2EyY2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3N5bmNocm9uaXplL1Rlc3RUcmVlVmlld2VyQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLnVpLnN5bmNocm9uaXplOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5zeW5jaHJvbml6ZS5TeW5jSW5mb1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuc3luY2hyb25pemUuU3luY0luZm9UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuc3luY2hyb25pemUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLklTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdFRyZWVWaWV3ZXJBZHZpc29yIGV4dGVuZHMgVHJlZVZpZXdlckFkdmlzb3IgewotCi0JcHVibGljIFRlc3RUcmVlVmlld2VyQWR2aXNvcihDb21wb3NpdGUgcGFyZW50LCBJU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgY29uZmlndXJhdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0udWkuc3luY2hyb25pemUuVHJlZVZpZXdlckFkdmlzb3IjY3JlYXRlTW9kZWxNYW5hZ2VyKG9yZy5lY2xpcHNlLnRlYW0udWkuc3luY2hyb25pemUuSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIFN5bmNocm9uaXplTW9kZWxNYW5hZ2VyIGNyZWF0ZU1vZGVsTWFuYWdlcihJU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCVN5bmNocm9uaXplTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSAgbmV3IFN5bmNocm9uaXplTW9kZWxNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pIHsKLQkJCXByb3RlY3RlZCBJU3luY2hyb25pemVNb2RlbFByb3ZpZGVyIGNyZWF0ZU1vZGVsUHJvdmlkZXIoU3RyaW5nIGlkKSB7Ci0JCQkJcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxNb2RlbFByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKSwgZ2V0U3luY0luZm9TZXQoKSk7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgSVN5bmNocm9uaXplTW9kZWxQcm92aWRlckRlc2NyaXB0b3JbXSBnZXRTdXBwb3J0ZWRNb2RlbFByb3ZpZGVycygpIHsKLQkJCQlyZXR1cm4gbmV3IElTeW5jaHJvbml6ZU1vZGVsUHJvdmlkZXJEZXNjcmlwdG9yW10gewotCQkJCQkJbmV3IEhpZXJhcmNoaWNhbE1vZGVsUHJvdmlkZXIuSGllcmFyY2hpY2FsTW9kZWxQcm92aWRlckRlc2NyaXB0b3IoKX07Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgU3luY0luZm9TZXQgZ2V0U3luY0luZm9TZXQoKSB7Ci0JCQkJcmV0dXJuIChTeW5jSW5mb1RyZWUpZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KElTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uLlBfU1lOQ19JTkZPX1NFVCk7Ci0JCQl9Ci0JCX07Ci0JCW1hbmFnZXIuc2V0Vmlld2VyQWR2aXNvcih0aGlzKTsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3ZpZXdzL0NvbnRlbnRQcm92aWRlclRlc3RWaWV3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvdmlld3MvQ29udGVudFByb3ZpZGVyVGVzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0Mjk0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvdmlld3MvQ29udGVudFByb3ZpZGVyVGVzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuVGVhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotcHVibGljIGNsYXNzIENvbnRlbnRQcm92aWRlclRlc3RWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSAib3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS52aWV3cy5Db250ZW50UHJvdmlkZXJUZXN0VmlldyI7Ci0JCi0JcHJpdmF0ZSBUZXN0VHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQcm92aWRlclRlc3RWaWV3IGZpbmRWaWV3SW5BY3RpdmVQYWdlKElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UpIHsKLQkJdHJ5IHsKLQkJCWlmIChhY3RpdmVQYWdlID09IG51bGwpIHsKLQkJCQlhY3RpdmVQYWdlID0gVGVhbVVJUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUlWaWV3UGFydCBwYXJ0ID0gYWN0aXZlUGFnZS5maW5kVmlldyhWSUVXX0lEKTsKLQkJCWlmIChwYXJ0ID09IG51bGwpCi0JCQkJcGFydCA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0JCQlyZXR1cm4gKENvbnRlbnRQcm92aWRlclRlc3RWaWV3KXBhcnQ7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29udGVudFByb3ZpZGVyVGVzdFZpZXcoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl2aWV3ZXIgPSBuZXcgVGVzdFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCQotCXB1YmxpYyBUZXN0VHJlZVZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS90ZWFtL3Rlc3RzL3VpL3ZpZXdzL1Rlc3RUcmVlVmlld2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvdmlld3MvVGVzdFRyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiMjE1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3RlYW0vdGVzdHMvdWkvdmlld3MvVGVzdFRyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVhbS50ZXN0cy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuRGlmZk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCi0JcHVibGljIFRlc3RUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCXB1YmxpYyBUZXN0VHJlZVZpZXdlcihUcmVlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JfQotCQotCXB1YmxpYyBJdGVtW10gZ2V0Um9vdEl0ZW1zKCkgewotCQlleHBhbmRBbGwoKTsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGdldENvbnRyb2woKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyI2dldENoaWxkcmVuKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCkKLQkgKi8KLQlwdWJsaWMgSXRlbVtdIGdldENoaWxkcmVuKFdpZGdldCBvKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzSXRlbUZvcihEaWZmTm9kZSBub2RlKSB7Ci0JCXJldHVybiBmaW5kSXRlbShub2RlKSAhPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1NzVmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iVGVhbSBBdXRvbWF0ZWQgVGVzdHMiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlIiB2YWx1ZT0ib3JnLmVjbGlwc2UudGVhbS50ZXN0cy5jb3JlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZWFtLWhvbWUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke29yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZX0iLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ibG9jYXRpb24iIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vdGVhbV90ZXN0X3dvcmtzcGFjZSIvPgotICAgIDxkZWxldGUgZGlyPSIke2xvY2F0aW9ufSIgcXVpZXQ9InRydWUiLz4KLQotICAgIDwhLS0gU2Vzc2lvbiBUZXN0ICoqIFRlYW0gQ29yZSAqKiAtLT4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7bG9jYXRpb259Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUuQWxsVGVhbVRlc3RzIi8+Ci0gICAgPC9hbnQ+Ci0gICAgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgdGhlIHRlc3RzIC0tPgotICA8IS0tIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCAtLT4KLSAgPCEtLSB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmNvcmUueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZXMuIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIj4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4K