ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMDk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXJhcCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSmF2YVNFLTEuNyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlYWM3YQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8ucHJvamVjdApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuZHMuY29yZS5idWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyMmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCkBAIC0wLDAgKzEsMiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitsaW5lLnNlcGFyYXRvcj1cbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkYmRkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNDE4IEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5pbmhlcml0TnVsbEFubm90YXRpb25zPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm1pc3NpbmdOb25OdWxsQnlEZWZhdWx0QW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubm9ubnVsbD1vcmcuZWNsaXBzZS5qZHQuYW5ub3RhdGlvbi5Ob25OdWxsCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm5vbm51bGxieWRlZmF1bHQ9b3JnLmVjbGlwc2UuamR0LmFubm90YXRpb24uTm9uTnVsbEJ5RGVmYXVsdAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5udWxsYWJsZT1vcmcuZWNsaXBzZS5qZHQuYW5ub3RhdGlvbi5OdWxsYWJsZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5udWxsYW5hbHlzaXM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5tZXRob2RQYXJhbWV0ZXJzPWRvIG5vdCBnZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmV4cGxpY2l0bHlDbG9zZWRBdXRvQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJvdGVjdGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVmYXVsdENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0VudW1DYXNlRGVzcGl0ZURlZmF1bHQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25udWxsUGFyYW1ldGVyQW5ub3RhdGlvbkRyb3BwZWQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsQW5ub3RhdGlvbkluZmVyZW5jZUNvbmZsaWN0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFNwZWNWaW9sYXRpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFVuY2hlY2tlZENvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxseVVuY2xvc2VkQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzT3B0aW9uYWxFcnJvcnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRhY3RpY051bGxBbmFseXNpc0ZvckZpZWxkcz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2xvc2VkQ2xvc2VhYmxlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRFeGNlcHRpb25QYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZE9iamVjdEFsbG9jYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRUeXBlUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5PTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2xhbWJkYV9ib2R5PWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2ZjRjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDEyNCBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cF9wcm9maWxlPW9yZy5lY2xpcHNlLmpkdC51aS5kZWZhdWx0LmVjbGlwc2VfY2xlYW5fdXBfcHJvZmlsZQorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKK2Zvcm1hdHRlcl9wcm9maWxlPW9yZy5lY2xpcHNlLmpkdC51aS5kZWZhdWx0LmVjbGlwc2VfcHJvZmlsZQorZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKK29yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCitvcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKK29yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTk5CitvcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQorb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIHRoZSAke2JhcmVfZmllbGRfbmFtZX1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gdGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXRcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ii8+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJkZWxlZ2F0ZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGRlbGVnYXRlIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZGVsZWdhdGVjb21tZW50IiBuYW1lXD0iZGVsZWdhdGVjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqICR7c2VlX3RvX3RhcmdldH1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CitzcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK3NwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9dHJ1ZQorc3BfY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitzcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitzcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz10cnVlCitzcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorc3BfY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitzcF9jbGVhbnVwLnVzZV9sYW1iZGE9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2YTc5NgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCkBAIC0wLDAgKzEsMzUgQEAKK2NvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQorY29tcGlsZXJzLmYudW5yZXNvbHZlZC1wbHVnaW5zPTEKK2NvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQorY29tcGlsZXJzLnAuYnVpbGQ9MQorY29tcGlsZXJzLnAuYnVpbGQuYmluLmluY2x1ZGVzPTEKK2NvbXBpbGVycy5wLmJ1aWxkLmVuY29kaW5ncz0yCitjb21waWxlcnMucC5idWlsZC5qYXZhLmNvbXBpbGVyPTIKK2NvbXBpbGVycy5wLmJ1aWxkLmphdmEuY29tcGxpYW5jZT0xCitjb21waWxlcnMucC5idWlsZC5taXNzaW5nLm91dHB1dD0xCitjb21waWxlcnMucC5idWlsZC5vdXRwdXQubGlicmFyeT0xCitjb21waWxlcnMucC5idWlsZC5zb3VyY2UubGlicmFyeT0xCitjb21waWxlcnMucC5idWlsZC5zcmMuaW5jbHVkZXM9MQorY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0wCitjb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xCitjb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCitjb21waWxlcnMucC5pbnRlcm5hbD0xCitjb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1leHBvcnQtcGFja2FnZT0yCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24taW1wb3J0LXBhY2thZ2U9MgorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLXJlcXVpcmUtYnVuZGxlPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCitjb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQorY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCitjb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCitjb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCitjb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MQorY29tcGlsZXJzLnMuY3JlYXRlLWRvY3M9ZmFsc2UKK2NvbXBpbGVycy5zLmRvYy1mb2xkZXI9ZG9jCitjb21waWxlcnMucy5vcGVuLXRhZ3M9MQorY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMTA2NgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDMwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHM7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVZlcnNpb246IDAuMTEuMC5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuaW50ZXJuYWwuQWN0aXZhdG9yCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNworQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0ltcG9ydC1QYWNrYWdlOiBqYXZheC5hbm5vdGF0aW9uO3ZlcnNpb249IjEuMC4wIiwKKyBqYXZheC5pbmplY3Q7dmVyc2lvbj0iMS4wLjAiLAorIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMsCisgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24sCisgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucywKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLAorIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjUuMCIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzOworICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncywKKyAgIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaCwKKyAgIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LAorICAgb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAorICAgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dCwKKyAgIG9yZy5lY2xpcHNlLmU0LnVpLnByb2dyZXNzLAorICAgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy50ZXN0cyIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncyxvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IlszLjYuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGk7YnVuZGxlLXZlcnNpb249IjAuOS4wIgorUmVxdWlyZS1DYXBhYmlsaXR5OiBvcmcuZWNsaXBzZS5yYXAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9NRVRBLUlORi9wMi5pbmYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvTUVUQS1JTkYvcDIuaW5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTFhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvTUVUQS1JTkYvcDIuaW5mCkBAIC0wLDAgKzEsMTMgQEAKKyMgRW5zdXJlIHRoYXQgbW9kaWZpZWQgUkFQIGU0IHBsYXRmb3JtIGJ1bmRsZXMgYXJlIG9ubHkgaW5zdGFsbGVkIGluIFJBUCBlbnZpcm9ubWVudAorIyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMTc3CisjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTA5MjIKKworIyBNYWtlIHN1cmUgdGhhdCBhIFJBUCBSV1QgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCityZXF1aXJlcy4wLm5hbWVzcGFjZSA9IG9yZy5lY2xpcHNlLnJhcAorcmVxdWlyZXMuMC5uYW1lID0gb3JnLmVjbGlwc2UucmFwLnJ3dAorCisjIERvIG5vdCBhbGxvdyB0byBpbnN0YWxsIHRoaXMgSVUgaW4gY2FzZSB0aGUgU1dUIGJ1bmRsZSBpcyBhdmFpbGFibGUKK3JlcXVpcmVzLjEubmFtZXNwYWNlID0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdQorcmVxdWlyZXMuMS5uYW1lID0gb3JnLmVjbGlwc2Uuc3d0CityZXF1aXJlcy4xLm1pbiA9IDAKK3JlcXVpcmVzLjEubWF4ID0gMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL09TR0ktSU5GL2NvbW1hbmRzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9PU0dJLUlORi9jb21tYW5kcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1MDUzOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9PU0dJLUlORi9jb21tYW5kcy54bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIG5hbWU9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLmludGVybmFsLkNvbW1hbmRTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbiIvPgorICAgPHNlcnZpY2U+CisgICAgICA8cHJvdmlkZSBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUNvbnRleHRGdW5jdGlvbiIvPgorICAgPC9zZXJ2aWNlPgorICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UuY29udGV4dC5rZXkiIHR5cGU9IlN0cmluZyIgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRUNvbW1hbmRTZXJ2aWNlIi8+Cis8L3Njcjpjb21wb25lbnQ+CisgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9PU0dJLUlORi9oYW5kbGVycy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvT1NHSS1JTkYvaGFuZGxlcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTg5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvT1NHSS1JTkYvaGFuZGxlcnMueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmhhbmRsZXJzIj4KKyAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5IYW5kbGVyU2VydmljZUNyZWF0aW9uRnVuY3Rpb24iLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb24iLz4KKyAgIDwvc2VydmljZT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLmNvbnRleHQua2V5IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkVIYW5kbGVyU2VydmljZSIvPgorPC9zY3I6Y29tcG9uZW50PgorICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+Tm92ZW1iZXIgMjAsIDIwMDg8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OWUwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIE9TR0ktSU5GLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgICBzcmMtcmFwLworc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAoranJlLmNvbXBpbGF0aW9uLnByb2ZpbGUgPSBKYXZhU0UtMS43CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvZm9yY2VRdWFsaWZpZXJVcGRhdGUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYxMDMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dApAQCAtMCwwICsxLDIgQEAKKyMgVG8gZm9yY2UgYSB2ZXJzaW9uIHF1YWxpZmllciB1cGRhdGUgYWRkIHRoZSBidWcgaGVyZQorQnVnIDQwMzM1MiAtIFVwZGF0ZSBhbGwgcGFyZW50IHZlcnNpb25zIHRvIG1hdGNoIG91ciBidWlsZCBzdHJlYW0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWNlMTRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbHVnaW5OYW1lID0gRWNsaXBzZSBlNCBjb3JlIGNvbW1hbmRzCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3BvbS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGJhOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3BvbS54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kczwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MC4xMS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5yYXAuZTQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC1yZWxlbmc8L2FydGlmYWN0SWQ+CisgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9yZWxlbmcvcmVsZW5nLXRhcmdldC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPCEtLSB0byBlbnN1cmUgdGhhdCB0aGUgZmVhdHVyZSBsb29rdXAgb2YgdGhlIHVpIHRlc3Qgd29ya3MgLS0+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+LjwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnR5Y2hvPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD50eWNoby1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL0NvbW1hbmRTZXJ2aWNlQWRkb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvQ29tbWFuZFNlcnZpY2VBZGRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDk3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL0NvbW1hbmRTZXJ2aWNlQWRkb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEBnbWFpbC5jb20+IC0gQnVnIDQzMTE4MAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5Db21tYW5kU2VydmljZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5IYW5kbGVyU2VydmljZUNyZWF0aW9uRnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5IYW5kbGVyU2VydmljZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5IYW5kbGVyU2VydmljZUltcGwuRXhlY3V0aW9uQ29udGV4dHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKiBQcm92aWRlIHRoZSBjb21tYW5kIGFuZCBoYW5kbGVyIHNlcnZpY2UgYXMgYW4gYWRkLW9uLiBNdXN0IGJlIGluc3RhbnRpYXRlZCBhZ2FpbnN0IHRoZQorICogYXBwbGljYXRpb24gbGV2ZWwgY29udGV4dC4KKyAqCisgKiBAbm9pbnN0YW50aWF0ZQorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZFNlcnZpY2VBZGRvbiB7CisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCUBJbmplY3QKKwlwdWJsaWMgQ29tbWFuZFNlcnZpY2VBZGRvbihJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCX0KKworCUBQb3N0Q29uc3RydWN0CisJdm9pZCBpbml0KElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCS8vIGdsb2JhbCBjb21tYW5kIHNlcnZpY2UuIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSAuLi4gcGVyIGFwcGxpY2F0aW9uIDotKQorCQlDb21tYW5kTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXQoQ29tbWFuZE1hbmFnZXIuY2xhc3MpOworCQlpZiAobWFuYWdlciA9PSBudWxsKSB7CisJCQltYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKCk7CisJCQkvLyBzZXRDb21tYW5kRmlyZUV2ZW50cyhtYW5hZ2VyLCBmYWxzZSk7CisJCQljb250ZXh0LnNldChDb21tYW5kTWFuYWdlci5jbGFzcywgbWFuYWdlcik7CisJCX0KKworCQlDb21tYW5kU2VydmljZUltcGwgc2VydmljZSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5CisJCQkJLm1ha2UoQ29tbWFuZFNlcnZpY2VJbXBsLmNsYXNzLCBjb250ZXh0KTsKKwkJY29udGV4dC5zZXQoRUNvbW1hbmRTZXJ2aWNlLmNsYXNzLCBzZXJ2aWNlKTsKKworCQkvLyBoYW5kbGVyIHNlcnZpY2UKKwkJY29udGV4dC5zZXQoRUhhbmRsZXJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbmV3IEhhbmRsZXJTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbigpKTsKKwkJY29udGV4dC5zZXQoIl9oYW5kbGVyRXhlY3V0aW9uU3RhY2siLCBuZXcgTGlua2VkTGlzdDxFeGVjdXRpb25Db250ZXh0cz4oKSk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcHJvdmlkZSB0aGUgaW5pdGlhbCBhcHBsaWNhdGlvbiBjb250ZXh0LCBqdXN0IGluIGNhc2UuCisJCUhhbmRsZXJTZXJ2aWNlSW1wbC5wdXNoKGNvbnRleHQsIG51bGwpOworCX0KKworCUBQcmVEZXN0cm95CisJdm9pZCBjbGVhbnVwKCkgeworCQlIYW5kbGVyU2VydmljZUltcGwucG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtYW5hZ2VyCisJICogQHBhcmFtIGIKKwkgKi8KKwl2b2lkIHNldENvbW1hbmRGaXJlRXZlbnRzKENvbW1hbmRNYW5hZ2VyIG1hbmFnZXIsIGJvb2xlYW4gYikgeworCQl0cnkgeworCQkJRmllbGQgZiA9IENvbW1hbmRNYW5hZ2VyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoInNob3VsZENvbW1hbmRGaXJlRXZlbnRzIik7IC8vJE5PTi1OTFMtMSQKKwkJCWYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKwkJCWYuc2V0KG1hbmFnZXIsIEJvb2xlYW4udmFsdWVPZihiKSk7CisJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0NvbW1hbmRTZXJ2aWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9Db21tYW5kU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJlNzEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9Db21tYW5kU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkVDb21tYW5kU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZFNlcnZpY2VJbXBsIGltcGxlbWVudHMgRUNvbW1hbmRTZXJ2aWNlIHsKKworCXByaXZhdGUgQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7CisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCUBJbmplY3QKKwlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKENvbW1hbmRNYW5hZ2VyIG0sIElFY2xpcHNlQ29udGV4dCBjKSB7CisJCWNvbW1hbmRNYW5hZ2VyID0gbTsKKwkJY29udGV4dCA9IGM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFBhcmFtZXRlcml6ZWRDb21tYW5kIGNyZWF0ZUNvbW1hbmQoU3RyaW5nIGlkLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMpIHsKKwkJQ29tbWFuZCBjb21tYW5kID0gZ2V0Q29tbWFuZChpZCk7CisJCWlmIChjb21tYW5kID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBQYXJhbWV0ZXJpemVkQ29tbWFuZC5nZW5lcmF0ZUNvbW1hbmQoY29tbWFuZCwgcGFyYW1ldGVycyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhdGVnb3J5IGRlZmluZUNhdGVnb3J5KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlDYXRlZ29yeSBjYXQgPSBjb21tYW5kTWFuYWdlci5nZXRDYXRlZ29yeShpZCk7CisJCWlmICghY2F0LmlzRGVmaW5lZCgpKSB7CisJCQljYXQuZGVmaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gY2F0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGRlZmluZUNvbW1hbmQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBDYXRlZ29yeSBjYXRlZ29yeSwKKwkJCUlQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7CisJCUNvbW1hbmQgY21kID0gY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZChpZCk7CisJCWlmICghY21kLmlzRGVmaW5lZCgpKSB7CisJCQljbWQuZGVmaW5lKG5hbWUsIGRlc2NyaXB0aW9uLCBjYXRlZ29yeSwgcGFyYW1ldGVycyk7CisJCQljbWQuc2V0SGFuZGxlcihIYW5kbGVyU2VydmljZUltcGwuZ2V0SGFuZGxlcihpZCwgY29udGV4dCkpOworCQl9CisJCXJldHVybiBjbWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkKSB7CisJCXJldHVybiBjb21tYW5kTWFuYWdlci5nZXRDYXRlZ29yeShjYXRlZ29yeUlkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFN0cmluZyBjb21tYW5kSWQpIHsKKwkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyLmdldENvbW1hbmQoY29tbWFuZElkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0hhbmRsZXJTZXJ2aWNlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9IYW5kbGVyU2VydmljZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGExOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9IYW5kbGVyU2VydmljZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkhhbmRsZXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuTm90SGFuZGxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklFdmFsdWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuaW50ZXJuYWwuSGFuZGxlclNlcnZpY2VJbXBsLkV4ZWN1dGlvbkNvbnRleHRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5FY2xpcHNlQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5DYW5FeGVjdXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKKworLyoqCisgKiBQcm92aWRlIGFuIElIYW5kbGVyIHRvIGRlbGVnYXRlIGNhbGxzIHRvLgorICovCitwdWJsaWMgY2xhc3MgSGFuZGxlclNlcnZpY2VIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRURfVE9fRklORF9IQU5ETEVSX0RVUklOR19FWEVDVVRJT04gPSAiRmFpbGVkIHRvIGZpbmQgaGFuZGxlciBkdXJpbmcgZXhlY3V0aW9uIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX01JU1NJTkdfRVhFQ1VURV9BTk5PVEFUSU9OID0gIkhhbmRsZXIgaXMgbWlzc2luZyBARXhlY3V0ZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgbWlzc2luZ0V4ZWN1dGUgPSBuZXcgT2JqZWN0KCk7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1hbmRJZDsKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJcHVibGljIEhhbmRsZXJTZXJ2aWNlSGFuZGxlcihTdHJpbmcgY29tbWFuZElkLCBJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQl0aGlzLmNvbW1hbmRJZCA9IGNvbW1hbmRJZDsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCUV4ZWN1dGlvbkNvbnRleHRzIGNvbnRleHRzID0gSGFuZGxlclNlcnZpY2VJbXBsLnBlZWsoY29udGV4dCk7CisJCS8vIHNldEVuYWJsZWQoY29udGV4dHMpOworCQlJRWNsaXBzZUNvbnRleHQgZXhlY3V0aW9uQ29udGV4dCA9IGNvbnRleHRzICE9IG51bGwgPyBjb250ZXh0cy5jb250ZXh0IDogbnVsbDsgLy8gZ2V0RXhlY3V0aW9uQ29udGV4dChjb250ZXh0cyk7CisJCWlmIChleGVjdXRpb25Db250ZXh0ID09IG51bGwpIHsKKwkJCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKKwkJfQorCQlPYmplY3QgaGFuZGxlciA9IEhhbmRsZXJTZXJ2aWNlSW1wbC5sb29rVXBIYW5kbGVyKGV4ZWN1dGlvbkNvbnRleHQsIGNvbW1hbmRJZCk7CisJCWlmIChoYW5kbGVyID09IG51bGwpIHsKKwkJCXNldEJhc2VFbmFibGVkKGZhbHNlKTsKKwkJCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKKwkJfQorCQlJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IGNvbnRleHRzLnN0YXRpY0NvbnRleHQ7IC8vIGdldFN0YXRpY0NvbnRleHQoY29udGV4dHMpOworCQlCb29sZWFuIHJlc3VsdCA9IChCb29sZWFuKSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoaGFuZGxlciwgQ2FuRXhlY3V0ZS5jbGFzcywKKwkJCQlleGVjdXRpb25Db250ZXh0LCBzdGF0aWNDb250ZXh0LCBCb29sZWFuLlRSVUUpOworCQlzZXRCYXNlRW5hYmxlZChyZXN1bHQuYm9vbGVhblZhbHVlKCkpOworCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RW5hYmxlZChPYmplY3QgZXZhbHVhdGlvbkNvbnRleHQpIHsKKwkJYm9vbGVhbiBjcmVhdGVDb250ZXh0ID0gZmFsc2U7CisJCUlFY2xpcHNlQ29udGV4dCBleGVjdXRpb25Db250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dChldmFsdWF0aW9uQ29udGV4dCk7CisJCWlmIChleGVjdXRpb25Db250ZXh0ID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlPYmplY3QgaGFuZGxlciA9IEhhbmRsZXJTZXJ2aWNlSW1wbC5sb29rVXBIYW5kbGVyKGV4ZWN1dGlvbkNvbnRleHQsIGNvbW1hbmRJZCk7CisJCWlmIChoYW5kbGVyID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IGdldFN0YXRpY0NvbnRleHQoZXhlY3V0aW9uQ29udGV4dCk7CisJCWlmIChzdGF0aWNDb250ZXh0ID09IG51bGwpIHsKKwkJCXN0YXRpY0NvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkuY3JlYXRlKCk7CisJCQljcmVhdGVDb250ZXh0ID0gdHJ1ZTsKKwkJfQorCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoaGFuZGxlciwgU2V0RW5hYmxlZC5jbGFzcywgZXhlY3V0aW9uQ29udGV4dCwgc3RhdGljQ29udGV4dCwKKwkJCQlCb29sZWFuLlRSVUUpOworCQlpZiAoY3JlYXRlQ29udGV4dCkgeworCQkJc3RhdGljQ29udGV4dC5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBnZXRTdGF0aWNDb250ZXh0KElFY2xpcHNlQ29udGV4dCBleGVjdXRpb25Db250ZXh0KSB7CisJCWZpbmFsIEV4ZWN1dGlvbkNvbnRleHRzIHBhaXIgPSBIYW5kbGVyU2VydmljZUltcGwucGVlayhjb250ZXh0KTsKKwkJaWYgKHBhaXIgIT0gbnVsbCkgeworCQkJaWYgKHBhaXIuY29udGV4dCAhPSBleGVjdXRpb25Db250ZXh0KSB7CisJCQkJLy8gbG9nIHRoaXMKKwkJCX0KKwkJCXJldHVybiBwYWlyLnN0YXRpY0NvbnRleHQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIElFY2xpcHNlQ29udGV4dCBnZXRFeGVjdXRpb25Db250ZXh0KE9iamVjdCBldmFsT2JqKSB7CisJCS8vIGlmIChldmFsT2JqIGluc3RhbmNlb2YgRXhlY3V0aW9uQ29udGV4dHMpIHsKKwkJLy8gcmV0dXJuICgoRXhlY3V0aW9uQ29udGV4dHMpIGV2YWxPYmopLmNvbnRleHQ7CisJCS8vIH0KKwkJaWYgKGV2YWxPYmogaW5zdGFuY2VvZiBJRWNsaXBzZUNvbnRleHQpIHsKKwkJCXJldHVybiAoSUVjbGlwc2VDb250ZXh0KSBldmFsT2JqOworCQl9CisJCWlmIChldmFsT2JqIGluc3RhbmNlb2YgRXhwcmVzc2lvbkNvbnRleHQpIHsKKwkJCXJldHVybiAoKEV4cHJlc3Npb25Db250ZXh0KSBldmFsT2JqKS5lY2xpcHNlQ29udGV4dDsKKwkJfQorCQlpZiAoZXZhbE9iaiBpbnN0YW5jZW9mIElFdmFsdWF0aW9uQ29udGV4dCkgeworCQkJcmV0dXJuIGdldEV4ZWN1dGlvbkNvbnRleHQoKChJRXZhbHVhdGlvbkNvbnRleHQpIGV2YWxPYmopLmdldFBhcmVudCgpKTsKKwkJfQorCQlmaW5hbCBFeGVjdXRpb25Db250ZXh0cyBwYWlyID0gSGFuZGxlclNlcnZpY2VJbXBsLnBlZWsoY29udGV4dCk7CisJCWlmIChwYWlyICE9IG51bGwpIHsKKwkJCXJldHVybiBwYWlyLmNvbnRleHQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgeworCQlFeGVjdXRpb25Db250ZXh0cyBjb250ZXh0cyA9IEhhbmRsZXJTZXJ2aWNlSW1wbC5wZWVrKGNvbnRleHQpOworCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgeworCQkJT2JqZWN0IGhhbmRsZXIgPSBIYW5kbGVyU2VydmljZUltcGwubG9va1VwSGFuZGxlcihjb250ZXh0cy5jb250ZXh0LCBjb21tYW5kSWQpOworCQkJaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBJSGFuZGxlcikgeworCQkJCXJldHVybiAoKElIYW5kbGVyKSBoYW5kbGVyKS5pc0hhbmRsZWQoKTsKKwkJCX0KKwkJCXJldHVybiBoYW5kbGVyICE9IG51bGw7CisKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJSUVjbGlwc2VDb250ZXh0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KGV2ZW50LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKwkJaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihGQUlMRURfVE9fRklORF9IQU5ETEVSX0RVUklOR19FWEVDVVRJT04sCisJCQkJCW5ldyBOb3RIYW5kbGVkRXhjZXB0aW9uKEZBSUxFRF9UT19GSU5EX0hBTkRMRVJfRFVSSU5HX0VYRUNVVElPTikpOworCQl9CisKKwkJT2JqZWN0IGhhbmRsZXIgPSBIYW5kbGVyU2VydmljZUltcGwubG9va1VwSGFuZGxlcihleGVjdXRpb25Db250ZXh0LCBjb21tYW5kSWQpOworCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IGdldFN0YXRpY0NvbnRleHQoZXhlY3V0aW9uQ29udGV4dCk7CisJCUlFY2xpcHNlQ29udGV4dCBsb2NhbFN0YXRpY0NvbnRleHQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKHN0YXRpY0NvbnRleHQgPT0gbnVsbCkgeworCQkJCXN0YXRpY0NvbnRleHQgPSBsb2NhbFN0YXRpY0NvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkKKwkJCQkJCS5jcmVhdGUoSGFuZGxlclNlcnZpY2VJbXBsLlRNUF9TVEFUSUNfQ09OVEVYVCk7CisJCQkJc3RhdGljQ29udGV4dC5zZXQoSGFuZGxlclNlcnZpY2VJbXBsLlBBUk1fTUFQLCBldmVudC5nZXRQYXJhbWV0ZXJzKCkpOworCQkJfQorCQkJT2JqZWN0IHJlc3VsdCA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShoYW5kbGVyLCBFeGVjdXRlLmNsYXNzLCBleGVjdXRpb25Db250ZXh0LCBzdGF0aWNDb250ZXh0LAorCQkJCQltaXNzaW5nRXhlY3V0ZSk7CisJCQlpZiAocmVzdWx0ID09IG1pc3NpbmdFeGVjdXRlKSB7CisJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihIQU5ETEVSX01JU1NJTkdfRVhFQ1VURV9BTk5PVEFUSU9OLAorCQkJCQkJbmV3IE5vdEhhbmRsZWRFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAobG9jYWxTdGF0aWNDb250ZXh0ICE9IG51bGwpIHsKKwkJCQlsb2NhbFN0YXRpY0NvbnRleHQuZGlzcG9zZSgpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlyZUhhbmRsZXJDaGFuZ2VkKEhhbmRsZXJFdmVudCBoYW5kbGVyRXZlbnQpIHsKKwkJc3VwZXIuZmlyZUhhbmRsZXJDaGFuZ2VkKGhhbmRsZXJFdmVudCk7CisJfQorCisJcHVibGljIHZvaWQgb3ZlcnJpZGVFbmFibGVkKGJvb2xlYW4gYikgeworCQlzZXRCYXNlRW5hYmxlZChiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0hhbmRsZXJTZXJ2aWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9IYW5kbGVyU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDI4M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9IYW5kbGVyU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0UGFyYW1ldGVyVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Ob3RFbmFibGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuTm90SGFuZGxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRUhhbmRsZXJTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRXhwcmVzc2lvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5FY2xpcHNlQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEhhbmRsZXJTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEVIYW5kbGVyU2VydmljZSB7CisJLyoqCisJICogVGhlIHN0YXRpYyBjb250ZXh0IGtleSB1bmRlciB3aGljaCBhIGNvbW1hbmQgJ3RyaWdnZXInIGZyb20gbGVnYWN5IGNvZGUgaXMgc3RvcmVkIGR1cmluZworCSAqIGNhbGxzIHRvIHtAbGluayAjZXhlY3V0ZUhhbmRsZXIoUGFyYW1ldGVyaXplZENvbW1hbmQsIElFY2xpcHNlQ29udGV4dCl9CisJICoKKwkgKiBAc2VlIElFY2xpcHNlQ29udGV4dAorCSAqIEBzZWUgSGFuZGxlclNlcnZpY2VJbXBsI2V4ZWN1dGVIYW5kbGVyKFBhcmFtZXRlcml6ZWRDb21tYW5kLCBJRWNsaXBzZUNvbnRleHQpCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXVF9UUklHR0VSID0gIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50IjsgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QX1NUQVRJQ19DT05URVhUID0gInRtcC1zdGF0aWNDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhfSUQgPSAiaGFuZGxlcjo6IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUk1fTUFQID0gInBhcm1NYXA6OiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDQU5fRVhFQ1VURSA9ICJIYW5kbGVyU2VydmljZUltcGwuY2FuRXhlY3V0ZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT1RfSEFORExFRCA9ICJIYW5kbGVyU2VydmljZUltcGwubm90SGFuZGxlZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfQ09OVEVYVCA9ICJIYW5kbGVyU2VydmljZUltcGwuc3RhdGljQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIQU5ETEVSX0VYQ0VQVElPTiA9ICJIYW5kbGVyU2VydmljZUltcGwuZXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBDb250ZXh0RnVuY3Rpb24gaGFuZGxlckdlbmVyYXRvciA9IG51bGw7CisKKwlwcml2YXRlIHN0YXRpYyBMaW5rZWRMaXN0PEV4ZWN1dGlvbkNvbnRleHRzPiBERUZBVUxUX1NUQUNLTElTVCA9IG5ldyBMaW5rZWRMaXN0PEhhbmRsZXJTZXJ2aWNlSW1wbC5FeGVjdXRpb25Db250ZXh0cz4oKTsKKworCXB1YmxpYyBzdGF0aWMgSUhhbmRsZXIgZ2V0SGFuZGxlcihTdHJpbmcgY29tbWFuZElkLCBJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlpZiAoaGFuZGxlckdlbmVyYXRvciAhPSBudWxsKSB7CisJCQlyZXR1cm4gKElIYW5kbGVyKSBoYW5kbGVyR2VuZXJhdG9yLmNvbXB1dGUobnVsbCwgY29tbWFuZElkKTsKKwkJfQorCQlyZXR1cm4gbmV3IEhhbmRsZXJTZXJ2aWNlSGFuZGxlcihjb21tYW5kSWQsIGNvbnRleHQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXhlY3V0aW9uQ29udGV4dHMgeworCQlwdWJsaWMgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisJCXB1YmxpYyBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dDsKKworCQlwdWJsaWMgRXhlY3V0aW9uQ29udGV4dHMoSUVjbGlwc2VDb250ZXh0IGN0eCwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0N0eCkgeworCQkJY29udGV4dCA9IGN0eDsKKwkJCXN0YXRpY0NvbnRleHQgPSBzdGF0aWNDdHg7CisJCX0KKwl9CisKKwlzdGF0aWMgTGlua2VkTGlzdDxFeGVjdXRpb25Db250ZXh0cz4gZ2V0Q29udGV4dFN0YWNrKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCWlmIChjb250ZXh0ID09IG51bGwpIHsKKwkJCXJldHVybiBERUZBVUxUX1NUQUNLTElTVDsKKwkJfQorCQlPYmplY3QgaGFuZGxlckV4ZWN1dGlvblN0YWNrID0gY29udGV4dC5nZXQoIl9oYW5kbGVyRXhlY3V0aW9uU3RhY2siKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaGFuZGxlckV4ZWN1dGlvblN0YWNrID09IG51bGwpIHsKKwkJCXJldHVybiBERUZBVUxUX1NUQUNLTElTVDsKKwkJfQorCQlyZXR1cm4gKExpbmtlZExpc3Q8RXhlY3V0aW9uQ29udGV4dHM+KSBoYW5kbGVyRXhlY3V0aW9uU3RhY2s7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHB1c2goSUVjbGlwc2VDb250ZXh0IGN0eCwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0N0eCkgeworCQlnZXRDb250ZXh0U3RhY2soY3R4KS5hZGRGaXJzdChuZXcgRXhlY3V0aW9uQ29udGV4dHMoY3R4LCBzdGF0aWNDdHgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4ZWN1dGlvbkNvbnRleHRzIHBvcChJRWNsaXBzZUNvbnRleHQgY3R4KSB7CisJCXJldHVybiBnZXRDb250ZXh0U3RhY2soY3R4KS5wb2xsKCk7CisJfQorCisJc3RhdGljIEV4ZWN1dGlvbkNvbnRleHRzIHBlZWsoSUVjbGlwc2VDb250ZXh0IGN0eCkgeworCQlyZXR1cm4gZ2V0Q29udGV4dFN0YWNrKGN0eCkucGVlaygpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb250ZXh0CisJICogICAgICAgICAgICB0aGUgY29udGV4dCB0byBzdGFydCB0aGUgbG9va3VwIHByb2Nlc3MKKwkgKiBAcGFyYW0gY29tbWFuZElkCisJICogQHJldHVybiBhIGhhbmRsZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3QgbG9va1VwSGFuZGxlcihJRWNsaXBzZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGNvbW1hbmRJZCkgeworCQlyZXR1cm4gY29udGV4dC5nZXRBY3RpdmVMZWFmKCkuZ2V0KEhfSUQgKyBjb21tYW5kSWQpOworCX0KKworCS8qKgorCSAqIEZpbGwgaW4gYSB0ZW1wb3Jhcnkgc3RhdGljIGNvbnRleHQgZm9yIGV4ZWN1dGlvbi4KKwkgKgorCSAqIEBwYXJhbSBjb21tYW5kCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKwlwcml2YXRlIHZvaWQgYWRkUGFybXMoUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQpIHsKKwkJZmluYWwgTWFwIHBhcm1zID0gY29tbWFuZC5nZXRQYXJhbWV0ZXJNYXAoKTsKKwkJSXRlcmF0b3IgaSA9IHBhcm1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKwkJCVN0cmluZyBwYXJhbWV0ZXJJZCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworCQkJc3RhdGljQ29udGV4dC5zZXQoCisJCQkJCXBhcmFtZXRlcklkLAorCQkJCQljb252ZXJ0UGFyYW1ldGVyVmFsdWUoY29tbWFuZC5nZXRDb21tYW5kKCksIHBhcmFtZXRlcklkLAorCQkJCQkJCShTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpKTsKKwkJfQorCQlzdGF0aWNDb250ZXh0LnNldChQQVJNX01BUCwgcGFybXMpOworCQlzdGF0aWNDb250ZXh0LnNldChQYXJhbWV0ZXJpemVkQ29tbWFuZC5jbGFzcywgY29tbWFuZCk7CisJfQorCisJLyoqCisJICogQ29udmVydCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgYWNjb3JkaW5nIHRvIGl0J3MgdHlwZS4KKwkgKgorCSAqIEBwYXJhbSBjb21tYW5kCisJICogQHBhcmFtIHBhcmFtZXRlcklkCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybiBjb252ZXJ0ZWQgdmFsdWUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmNvbW1hbmRzLk1Db21tYW5kUGFyYW1ldGVyI2dldFR5cGVJZCgpCisJICovCisJcHJpdmF0ZSBPYmplY3QgY29udmVydFBhcmFtZXRlclZhbHVlKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHBhcmFtZXRlcklkLCBTdHJpbmcgdmFsdWUpIHsKKwkJdHJ5IHsKKwkJCVBhcmFtZXRlclR5cGUgcGFyYW1ldGVyVHlwZSA9IGNvbW1hbmQuZ2V0UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJJZCk7CisKKwkJCWlmIChwYXJhbWV0ZXJUeXBlICE9IG51bGwpIHsKKwkJCQlBYnN0cmFjdFBhcmFtZXRlclZhbHVlQ29udmVydGVyIHZhbHVlQ29udmVydGVyID0gcGFyYW1ldGVyVHlwZS5nZXRWYWx1ZUNvbnZlcnRlcigpOworCQkJCWlmICh2YWx1ZUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQkJCXJldHVybiB2YWx1ZUNvbnZlcnRlci5jb252ZXJ0VG9PYmplY3QodmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7CisJCX0gY2F0Y2ggKFBhcmFtZXRlclZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJTG9nZ2VyIGxvZ2dlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFjdGl2YXRlSGFuZGxlcihTdHJpbmcgY29tbWFuZElkLCBPYmplY3QgaGFuZGxlcikgeworCQlTdHJpbmcgaGFuZGxlcklkID0gSF9JRCArIGNvbW1hbmRJZDsKKwkJY29udGV4dC5zZXQoaGFuZGxlcklkLCBoYW5kbGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKFBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQpIHsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkuY3JlYXRlKFRNUF9TVEFUSUNfQ09OVEVYVCk7CisJCXRyeSB7CisJCQlyZXR1cm4gY2FuRXhlY3V0ZShjb21tYW5kLCBzdGF0aWNDb250ZXh0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCXN0YXRpY0NvbnRleHQuZGlzcG9zZSgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kLCBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCkgeworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgZXhlY3V0aW9uQ29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTsKKwkJYWRkUGFybXMoY29tbWFuZCwgc3RhdGljQ29udGV4dCk7CisJCS8vIGV4ZWN1dGlvbkNvbnRleHQuc2V0KFNUQVRJQ19DT05URVhULCBzdGF0aWNDb250ZXh0KTsKKwkJcHVzaChleGVjdXRpb25Db250ZXh0LCBzdGF0aWNDb250ZXh0KTsKKwkJdHJ5IHsKKwkJCUNvbW1hbmQgY21kID0gY29tbWFuZC5nZXRDb21tYW5kKCk7CisJCQljbWQuc2V0RW5hYmxlZChuZXcgRXhwcmVzc2lvbkNvbnRleHQocGVlayhleGVjdXRpb25Db250ZXh0KS5jb250ZXh0KSk7CisJCQlyZXR1cm4gY21kLmlzRW5hYmxlZCgpOworCQl9IGZpbmFsbHkgeworCQkJcG9wKGV4ZWN1dGlvbkNvbnRleHQpOworCQkJLy8gZXhlY3V0aW9uQ29udGV4dC5yZW1vdmUoU1RBVElDX0NPTlRFWFQpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVhY3RpdmF0ZUhhbmRsZXIoU3RyaW5nIGNvbW1hbmRJZCwgT2JqZWN0IGhhbmRsZXIpIHsKKwkJY29udGV4dC5yZW1vdmUoSF9JRCArIGNvbW1hbmRJZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBleGVjdXRlSGFuZGxlcihQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kKSB7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5LmNyZWF0ZShUTVBfU1RBVElDX0NPTlRFWFQpOworCQl0cnkgeworCQkJcmV0dXJuIGV4ZWN1dGVIYW5kbGVyKGNvbW1hbmQsIHN0YXRpY0NvbnRleHQpOworCQl9IGZpbmFsbHkgeworCQkJc3RhdGljQ29udGV4dC5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGVIYW5kbGVyKFBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQsIElFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0KSB7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBleGVjdXRpb25Db250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpOworCQlhZGRQYXJtcyhjb21tYW5kLCBzdGF0aWNDb250ZXh0KTsKKwkJLy8gZXhlY3V0aW9uQ29udGV4dC5zZXQoU1RBVElDX0NPTlRFWFQsIHN0YXRpY0NvbnRleHQpOworCQlwdXNoKGV4ZWN1dGlvbkNvbnRleHQsIHN0YXRpY0NvbnRleHQpOworCQl0cnkgeworCQkJLy8gQ29tbWFuZCBjbWQgPSBjb21tYW5kLmdldENvbW1hbmQoKTsKKwkJCXJldHVybiBjb21tYW5kLmV4ZWN1dGVXaXRoQ2hlY2tzKHN0YXRpY0NvbnRleHQuZ2V0KFNXVF9UUklHR0VSKSwgbmV3IEV4cHJlc3Npb25Db250ZXh0KAorCQkJCQlwZWVrKGV4ZWN1dGlvbkNvbnRleHQpLmNvbnRleHQpKTsKKwkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXRpY0NvbnRleHQuc2V0KEhBTkRMRVJfRVhDRVBUSU9OLCBlKTsKKwkJfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7CisJCQlzdGF0aWNDb250ZXh0LnNldChIQU5ETEVSX0VYQ0VQVElPTiwgZSk7CisJCX0gY2F0Y2ggKE5vdEVuYWJsZWRFeGNlcHRpb24gZSkgeworCQkJc3RhdGljQ29udGV4dC5zZXQoSEFORExFUl9FWENFUFRJT04sIGUpOworCQl9IGNhdGNoIChOb3RIYW5kbGVkRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXRpY0NvbnRleHQuc2V0KEhBTkRMRVJfRVhDRVBUSU9OLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXBvcChleGVjdXRpb25Db250ZXh0KTsKKwkJCS8vIGV4ZWN1dGlvbkNvbnRleHQucmVtb3ZlKFNUQVRJQ19DT05URVhUKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlASW5qZWN0CisJcHVibGljIHZvaWQgc2V0Q29udGV4dChJRWNsaXBzZUNvbnRleHQgYykgeworCQljb250ZXh0ID0gYzsKKwl9CisKKwlwdWJsaWMgSUVjbGlwc2VDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCXB1YmxpYyBJRWNsaXBzZUNvbnRleHQgZ2V0RXhlY3V0aW9uQ29udGV4dCgpIHsKKwkJcmV0dXJuIGNvbnRleHQuZ2V0QWN0aXZlTGVhZigpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9FQ29tbWFuZFNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9FQ29tbWFuZFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWE4MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL0VDb21tYW5kU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKKworLyoqCisgKiBAbm9pbXBsZW1lbnQKKyAqLworcHVibGljIGludGVyZmFjZSBFQ29tbWFuZFNlcnZpY2UgeworCXB1YmxpYyBQYXJhbWV0ZXJpemVkQ29tbWFuZCBjcmVhdGVDb21tYW5kKFN0cmluZyBpZCwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKTsKKworCS8qKgorCSAqIEBwYXJhbSBpZAorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHJldHVybgorCSAqIEBub3JlZmVyZW5jZQorCSAqLworCXB1YmxpYyBDYXRlZ29yeSBkZWZpbmVDYXRlZ29yeShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pOworCisJLyoqCisJICogQHBhcmFtIGlkCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gY2F0ZWdvcnkKKwkgKiBAcGFyYW0gcGFyYW1ldGVycworCSAqIEByZXR1cm4KKwkgKiBAbm9yZWZlcmVuY2UKKwkgKi8KKwlwdWJsaWMgQ29tbWFuZCBkZWZpbmVDb21tYW5kKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgQ2F0ZWdvcnkgY2F0ZWdvcnksCisJCQlJUGFyYW1ldGVyW10gcGFyYW1ldGVycyk7CisKKwlwdWJsaWMgQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQpOworCisJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChTdHJpbmcgY29tbWFuZElkKTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9FSGFuZGxlclNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9FSGFuZGxlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQzYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL0VIYW5kbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKiBAbm9pbXBsZW1lbnQKKyAqLworcHVibGljIGludGVyZmFjZSBFSGFuZGxlclNlcnZpY2UgeworCisJcHVibGljIHZvaWQgYWN0aXZhdGVIYW5kbGVyKFN0cmluZyBjb21tYW5kSWQsIE9iamVjdCBoYW5kbGVyKTsKKworCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGVIYW5kbGVyKFN0cmluZyBjb21tYW5kSWQsIE9iamVjdCBoYW5kbGVyKTsKKworCXB1YmxpYyBPYmplY3QgZXhlY3V0ZUhhbmRsZXIoUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCk7CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKFBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQpOworCisJLyoqCisJICogRXhlY3V0ZSBhIGhhbmRsZXIgZm9yIHRoZSBjb21tYW5kLgorCSAqCisJICogQHBhcmFtIGNvbW1hbmQKKwkgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIHN0YXRpY0NvbnRleHQKKwkgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBZb3UgbXVzdCBkaXNwb3NlIHlvdXIgY29udGV4dAorCSAqICAgICAgICAgICAgd2hlbiB5b3UgYXJlIGRvbmUuCisJICogQHJldHVybiB0aGUgY29tbWFuZCByZXR1cm4gdmFsdWUuCisJICovCisJcHVibGljIE9iamVjdCBleGVjdXRlSGFuZGxlcihQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kLCBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCk7CisKKwkvKioKKwkgKiBDaGVjayBpZiBhIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkLgorCSAqCisJICogQHBhcmFtIGNvbW1hbmQKKwkgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBzdGF0aWNDb250ZXh0CisJICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gWW91IG11c3QgZGlzcG9zZSB5b3VyIGNvbnRleHQKKwkgKiAgICAgICAgICAgIHdoZW4geW91IGFyZSBkb25lLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kLCBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvRXhwcmVzc2lvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9FeHByZXNzaW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZGMyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvRXhwcmVzc2lvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUV2YWx1YXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKiBAbm9yZWZlcmVuY2UKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEV4cHJlc3Npb25Db250ZXh0IGltcGxlbWVudHMgSUV2YWx1YXRpb25Db250ZXh0IHsKKwkvKioKKwkgKiBTZWUgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9VSV9TRUxFQ1RJT04gPSAib3JnLmVjbGlwc2UudWkuc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfQUNUSVZBVElPTiA9ICJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0LmFsbG93QWN0aXZhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBJRWNsaXBzZUNvbnRleHQgZWNsaXBzZUNvbnRleHQ7CisJcHVibGljIHN0YXRpYyBJQ29udGV4dEZ1bmN0aW9uIGRlZmF1bHRWYXJpYWJsZUNvbnZlcnRlciA9IG51bGw7CisKKwlwdWJsaWMgRXhwcmVzc2lvbkNvbnRleHQoSUVjbGlwc2VDb250ZXh0IGVjbGlwc2VDb250ZXh0KSB7CisJCXRoaXMuZWNsaXBzZUNvbnRleHQgPSBlY2xpcHNlQ29udGV4dDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUV2YWx1YXRpb25Db250ZXh0IGdldFBhcmVudCgpIHsKKwkJSUVjbGlwc2VDb250ZXh0IHBhcmVudCA9IGVjbGlwc2VDb250ZXh0LmdldFBhcmVudCgpOworCQlyZXR1cm4gcGFyZW50ID09IG51bGwgPyBudWxsIDogbmV3IEV4cHJlc3Npb25Db250ZXh0KHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElFdmFsdWF0aW9uQ29udGV4dCBnZXRSb290KCkgeworCQlJRWNsaXBzZUNvbnRleHQgY3VycmVudCA9IGVjbGlwc2VDb250ZXh0OworCQlJRWNsaXBzZUNvbnRleHQgcGFyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKTsKKwkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisJCQljdXJyZW50ID0gcGFyZW50OworCQkJcGFyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKTsKKwkJfQorCQlpZiAoY3VycmVudCA9PSBlY2xpcHNlQ29udGV4dCkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJcmV0dXJuIG5ldyBFeHByZXNzaW9uQ29udGV4dChjdXJyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd1BsdWdpbkFjdGl2YXRpb24oYm9vbGVhbiB2YWx1ZSkgeworCQllY2xpcHNlQ29udGV4dC5zZXQoQUxMT1dfQUNUSVZBVElPTiwgQm9vbGVhbi52YWx1ZU9mKHZhbHVlKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dQbHVnaW5BY3RpdmF0aW9uKCkgeworCQlPYmplY3Qgb2JqID0gZWNsaXBzZUNvbnRleHQuZ2V0KEFMTE9XX0FDVElWQVRJT04pOworCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQm9vbGVhbiA/ICgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhcmlhYmxlKCkgeworCQlmaW5hbCBPYmplY3Qgc2VsOworCQlpZiAoZGVmYXVsdFZhcmlhYmxlQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXNlbCA9IGRlZmF1bHRWYXJpYWJsZUNvbnZlcnRlci5jb21wdXRlKGVjbGlwc2VDb250ZXh0LCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCXNlbCA9IGVjbGlwc2VDb250ZXh0LmdldEFjdGl2ZShPUkdfRUNMSVBTRV9VSV9TRUxFQ1RJT04pOworCQl9CisJCXJldHVybiBzZWwgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBzZWw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkVmFyaWFibGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCQllY2xpcHNlQ29udGV4dC5zZXQobmFtZSwgdmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgcmVtb3ZlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKwkJT2JqZWN0IG9iaiA9IGVjbGlwc2VDb250ZXh0LmdldExvY2FsKG5hbWUpOworCQllY2xpcHNlQ29udGV4dC5yZW1vdmUobmFtZSk7CisJCXJldHVybiBvYmo7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRWYXJpYWJsZShTdHJpbmcgbmFtZSkgeworCQlpZiAoSUVjbGlwc2VDb250ZXh0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiBlY2xpcHNlQ29udGV4dDsKKwkJfQorCQlPYmplY3Qgb2JqID0gZWNsaXBzZUNvbnRleHQuZ2V0QWN0aXZlKG5hbWUpOworCQlyZXR1cm4gb2JqID09IG51bGwgPyBJRXZhbHVhdGlvbkNvbnRleHQuVU5ERUZJTkVEX1ZBUklBQkxFIDogb2JqOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgcmVzb2x2ZVZhcmlhYmxlKFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMWU0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvaW50ZXJuYWwvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKKworCS8vIFRoZSBwbHVnLWluIElECisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMiOyAvLyROT04tTkxTLTEkCisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9Db21tYW5kU2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9Db21tYW5kU2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODEzMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0NvbW1hbmRTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZFNlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uIGV4dGVuZHMgQ29udGV4dEZ1bmN0aW9uIHsKKwkvKioKKwkgKiBBIGNvbnRleHQga2V5ICh2YWx1ZSAicm9vdENvbnRleHQiKSB0aGF0IGlkZW50aWZpZXMgdGhlIHJvb3Qgb2YgdGhpcyBjb250ZXh0IGNoYWluLiBJdCBkb2VzCisJICogbm90IGhhdmUgdG8gYmUgdGhlIGdsb2JhbCByb290LCBidXQgc2lnbmlmaWVzIHRoZSB0b3Btb3N0IGNvbnRleHQgZm9yIHRoZSBwdXJwb3NlcyBvZgorCSAqIGZ1bmN0aW9uIG1hbmFnZW1lbnQgYW5kIGFjdGl2ZSBjb250ZXh0IGNoYWlucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0NPTlRFWFQgPSAicm9vdENvbnRleHQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIENvbW1hbmRNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOworCXByaXZhdGUgQ29tbWFuZFNlcnZpY2VJbXBsIHNlcnZpY2UgPSBudWxsOworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb21wdXRlKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgY29udGV4dEtleSkgeworCQlpZiAoc2VydmljZSA9PSBudWxsKSB7CisJCQlJRWNsaXBzZUNvbnRleHQgcm9vdCA9IGdldFJvb3RDb250ZXh0KGNvbnRleHQpOworCQkJbWFuYWdlciA9IG5ldyBDb21tYW5kTWFuYWdlcigpOworCQkJcm9vdC5zZXQoQ29tbWFuZE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCBtYW5hZ2VyKTsKKwkJCXNlcnZpY2UgPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKENvbW1hbmRTZXJ2aWNlSW1wbC5jbGFzcywgcm9vdCk7CisJCX0KKwkJcmV0dXJuIHNlcnZpY2U7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAcmV0dXJuIHRoZSB0b3Btb3N0ICJyb290IiBjb250ZXh0CisJICovCisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgZ2V0Um9vdENvbnRleHQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJSUVjbGlwc2VDb250ZXh0IGN1cnJlbnQgPSAoSUVjbGlwc2VDb250ZXh0KSBjb250ZXh0LmdldChST09UX0NPTlRFWFQpOworCQlpZiAoY3VycmVudCAhPSBudWxsKSB7CisJCQlyZXR1cm4gY3VycmVudDsKKwkJfQorCQljdXJyZW50ID0gY29udGV4dDsKKwkJSUVjbGlwc2VDb250ZXh0IHBhcmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworCQkJY3VycmVudCA9IHBhcmVudDsKKwkJCXBhcmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisJCX0KKwkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgeworCQkJY3VycmVudC5zZXQoUk9PVF9DT05URVhULCBjdXJyZW50KTsKKwkJfQorCQlyZXR1cm4gY3VycmVudDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9IYW5kbGVyU2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9IYW5kbGVyU2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjcxZjAwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL3NyYy9vcmcvZWNsaXBzZS9lNC9jb3JlL2NvbW1hbmRzL2ludGVybmFsL0hhbmRsZXJTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBIYW5kbGVyU2VydmljZUNyZWF0aW9uRnVuY3Rpb24gZXh0ZW5kcyBDb250ZXh0RnVuY3Rpb24geworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb21wdXRlKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgY29udGV4dEtleSkgeworCQlyZXR1cm4gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShIYW5kbGVyU2VydmljZUltcGwuY2xhc3MsIGNvbnRleHQpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9JQ29tbWFuZEhlbHBTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvaW50ZXJuYWwvSUNvbW1hbmRIZWxwU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTEzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvaW50ZXJuYWwvSUNvbW1hbmRIZWxwU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CisKKy8qKgorICogUHJvdmlkZXMgc2VydmljZXMgcmVsYXRlZCB0byB0aGUgY29tbWFuZCBjb250ZXh0IGhlbHAuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRIZWxwU2VydmljZSB7CisKKwkvKioKKwkgKiBDYWxjdWxhdGVzIHRoZSBhY3RpdmUgaGVscCBjb250ZXh0IGZvciB0aGUgY29tbWFuZCBhbmQgcmV0dXJucyB0aGUgSUQgb2YgdGhlIGhlbHAgY29udGV4dC4KKwkgKgorCSAqIEBwYXJhbSBjb21tYW5kSWQKKwkgKiAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgY29tbWFuZCBmb3Igd2hpY2ggdGhlIGhlbHAgY29udGV4dCBJRCBpcyBjYWxjdWxhdGVkCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiAgICAgICAgICAgIHRoZSBFY2xpcHNlIGNvbnRleHQgaW4gd2hpY2ggaGFuZGxlcnMgb2YgdGhlIGNvbW1hbmQgd2lsbCBiZSBzb3VnaHQKKwkgKiBAcmV0dXJuIHRoZSBJRCBvZiBoZWxwIGNvbnRleHQgd2hpY2ggaXMgYWN0aXZlIGZvciB0aGUgY29tbWFuZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SGVscENvbnRleHRJZChTdHJpbmcgY29tbWFuZElkLCBJRWNsaXBzZUNvbnRleHQgY29udGV4dCk7CisKKwkvKioKKwkgKiBBc3NpZ25zIHRoZSBoZWxwIGNvbnRleHQgSUQgdG8gdGhlIGNvbW1hbmQgaGFuZGxlci4KKwkgKgorCSAqIEBwYXJhbSBoYW5kbGVyCisJICogICAgICAgICAgICB0aGUgY29tbWFuZCBoYW5kbGVyIHRvIHdoaWNoIHRoZSBoZWxwIGNvbnRleHQgSUQgd2lsbCBiZSBhc3NpZ25lZAorCSAqIEBwYXJhbSBjb250ZXh0SWQKKwkgKiAgICAgICAgICAgIHRoZSBoZWxwIGNvbnRleHQgSUQgdG8gYXNzaWduCisJICovCisJcHVibGljIHZvaWQgc2V0SGVscENvbnRleHRJZChJSGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgY29udGV4dElkKTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy9zcmMvb3JnL2VjbGlwc2UvZTQvY29yZS9jb21tYW5kcy9pbnRlcm5hbC9TZXRFbmFibGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvaW50ZXJuYWwvU2V0RW5hYmxlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2U5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMvc3JjL29yZy9lY2xpcHNlL2U0L2NvcmUvY29tbWFuZHMvaW50ZXJuYWwvU2V0RW5hYmxlZC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVXNlIHRoaXMgYW5ub3RhdGlvbiB0byB0YWcgYSBtZXRob2QgdG8gY2FsbCB0aGUgaGFuZGxlciBzZXRFbmFibGVkIG1ldGhvZC4KKyAqIDxwPgorICogVGhpcyBhbm5vdGF0aW9uIG11c3Qgbm90IGJlIGFwcGxpZWQgdG8gbW9yZSB0aGFuIG9uZSBtZXRob2QgcGVyIGNsYXNzLiBJZgorICogc2V2ZXJhbCBjbGFzcyBtZXRob2RzIGFyZSB0YWdnZWQgd2l0aCB0aGlzIGFubm90YXRpb24sIG9ubHkgb25lIG9mIHRoZW0gd2lsbAorICogYmUgY2FsbGVkLgorICogPC9wPgorICoKKyAqIEBzaW5jZSAxLjMKKyAqIEBub3JlZmVyZW5jZQorICovCitARG9jdW1lbnRlZAorQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCB9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFNldEVuYWJsZWQgeworCS8vIGludGVudGlvbmFsbHkgbGVmdCBlbXB0eQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzA5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcmFwIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS43Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5M2I1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuZHMuY29yZS5idWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyZTFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCkBAIC0wLDAgKzEsMiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitsaW5lLnNlcGFyYXRvcj1cbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0NTdjMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNDE5IEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5pbmhlcml0TnVsbEFubm90YXRpb25zPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm1pc3NpbmdOb25OdWxsQnlEZWZhdWx0QW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubm9ubnVsbD1vcmcuZWNsaXBzZS5qZHQuYW5ub3RhdGlvbi5Ob25OdWxsCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm5vbm51bGxieWRlZmF1bHQ9b3JnLmVjbGlwc2UuamR0LmFubm90YXRpb24uTm9uTnVsbEJ5RGVmYXVsdAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5udWxsYWJsZT1vcmcuZWNsaXBzZS5qZHQuYW5ub3RhdGlvbi5OdWxsYWJsZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5udWxsYW5hbHlzaXM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5tZXRob2RQYXJhbWV0ZXJzPWRvIG5vdCBnZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmV4cGxpY2l0bHlDbG9zZWRBdXRvQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJvdGVjdGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVmYXVsdENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0VudW1DYXNlRGVzcGl0ZURlZmF1bHQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25udWxsUGFyYW1ldGVyQW5ub3RhdGlvbkRyb3BwZWQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsQW5ub3RhdGlvbkluZmVyZW5jZUNvbmZsaWN0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFNwZWNWaW9sYXRpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFVuY2hlY2tlZENvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxseVVuY2xvc2VkQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzT3B0aW9uYWxFcnJvcnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRhY3RpY051bGxBbmFseXNpc0ZvckZpZWxkcz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2xvc2VkQ2xvc2VhYmxlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRXhjZXB0aW9uUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRPYmplY3RBbGxvY2F0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkVHlwZVBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNworb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfbGluZV9jb21tZW50X3N0YXJ0aW5nX29uX2ZpcnN0X2NvbHVtbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fd3JhcHBlZF9saW5lcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIwNThjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSwxMjUgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cF9wcm9maWxlPW9yZy5lY2xpcHNlLmpkdC51aS5kZWZhdWx0LmVjbGlwc2VfY2xlYW5fdXBfcHJvZmlsZQorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKK2Zvcm1hdHRlcl9wcm9maWxlPW9yZy5lY2xpcHNlLmpkdC51aS5kZWZhdWx0LmVjbGlwc2VfcHJvZmlsZQorZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKK29yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCitvcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKK29yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTk5CitvcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQorb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIHRoZSAke2JhcmVfZmllbGRfbmFtZX1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gdGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXRcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ii8+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJkZWxlZ2F0ZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGRlbGVnYXRlIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZGVsZWdhdGVjb21tZW50IiBuYW1lXD0iZGVsZWdhdGVjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqICR7c2VlX3RvX3RhcmdldH1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CitzcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK3NwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9dHJ1ZQorc3BfY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitzcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitzcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz10cnVlCitzcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorc3BfY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitzcF9jbGVhbnVwLnVzZV9sYW1iZGE9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWVjOWMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLnByZWZzCkBAIC0wLDAgKzEsOTcgQEAKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRF9XSVRIT1VUX0RFRkFVTFRfVkFMVUU9RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9BUElfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9SRUVYUE9SVEVEX0FQSV9UWVBFPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1JFRVhQT1JURURfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFPUVycm9yCitBUElfVVNFX1NDQU5fRklFTERfU0VWRVJJVFk9RXJyb3IKK0FQSV9VU0VfU0NBTl9NRVRIT0RfU0VWRVJJVFk9RXJyb3IKK0FQSV9VU0VfU0NBTl9UWVBFX1NFVkVSSVRZPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfTUVUSE9EPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfUkVTVFJJQ1RJT05TPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9DT05TVFJVQ1RPUj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfU1VQRVJDTEFTUz1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX0NIQU5HRURfQ09OVFJBQ1RFRF9TVVBFUklOVEVSRkFDRVNfU0VUPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9FTlVNX0NPTlNUQU5UPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0FEREVEX1ZBTFVFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0ZJTkFMX1RPX05PTl9GSU5BTF9TVEFUSUNfQ09OU1RBTlQ9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX1NUQVRJQ19UT19TVEFUSUM9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQUxVRT1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9BUkdVTUVOVD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVkFMVUU9RXJyb3IKK0lMTEVHQUxfRVhURU5EPVdhcm5pbmcKK0lMTEVHQUxfSU1QTEVNRU5UPVdhcm5pbmcKK0lMTEVHQUxfSU5TVEFOVElBVEU9V2FybmluZworSUxMRUdBTF9PVkVSUklERT1XYXJuaW5nCitJTExFR0FMX1JFRkVSRU5DRT1XYXJuaW5nCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfU1VQRVJfSU5URVJGQUNFX1dJVEhfTUVUSE9EUz1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5WQUxJRF9KQVZBRE9DX1RBRz1XYXJuaW5nCitJTlZBTElEX1JFRkVSRU5DRV9JTl9TWVNURU1fTElCUkFSSUVTPUVycm9yCitMRUFLX0VYVEVORD1XYXJuaW5nCitMRUFLX0ZJRUxEX0RFQ0w9V2FybmluZworTEVBS19JTVBMRU1FTlQ9V2FybmluZworTEVBS19NRVRIT0RfUEFSQU09V2FybmluZworTEVBS19NRVRIT0RfUkVUVVJOX1RZUEU9V2FybmluZworTUVUSE9EX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fRklOQUxfVE9fRklOQUw9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fU1RBVElDX1RPX1NUQVRJQz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0FOTk9UQVRJT05fREVGQVVMVF9WQUxVRT1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitNSVNTSU5HX0VFX0RFU0NSSVBUSU9OUz1XYXJuaW5nCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQURERURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9BRERFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1VOVVNFRF9QUk9CTEVNX0ZJTFRFUlM9V2FybmluZworYXV0b21hdGljYWxseV9yZW1vdmVkX3VudXNlZF9wcm9ibGVtX2ZpbHRlcnM9ZmFsc2UKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uPUVycm9yCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uX2luY2x1ZGVfbWFqb3Jfd2l0aG91dF9icmVha2luZ19jaGFuZ2U9RGlzYWJsZWQKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb25faW5jbHVkZV9taW5vcl93aXRob3V0X2FwaV9jaGFuZ2U9RGlzYWJsZWQKK2ludmFsaWRfc2luY2VfdGFnX3ZlcnNpb249RXJyb3IKK21hbGZvcm1lZF9zaW5jZV90YWc9RXJyb3IKK21pc3Npbmdfc2luY2VfdGFnPUVycm9yCityZXBvcnRfYXBpX2JyZWFrYWdlX3doZW5fbWFqb3JfdmVyc2lvbl9pbmNyZW1lbnRlZD1EaXNhYmxlZAorcmVwb3J0X3Jlc29sdXRpb25fZXJyb3JzX2FwaV9jb21wb25lbnQ9V2FybmluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTUwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKQEAgLTAsMCArMSwzMiBAQAorY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCitjb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCitjb21waWxlcnMucC5idWlsZD0xCitjb21waWxlcnMucC5idWlsZC5iaW4uaW5jbHVkZXM9MQorY29tcGlsZXJzLnAuYnVpbGQuZW5jb2RpbmdzPTIKK2NvbXBpbGVycy5wLmJ1aWxkLmphdmEuY29tcGlsZXI9MgorY29tcGlsZXJzLnAuYnVpbGQuamF2YS5jb21wbGlhbmNlPTEKK2NvbXBpbGVycy5wLmJ1aWxkLm1pc3Npbmcub3V0cHV0PTEKK2NvbXBpbGVycy5wLmJ1aWxkLm91dHB1dC5saWJyYXJ5PTEKK2NvbXBpbGVycy5wLmJ1aWxkLnNvdXJjZS5saWJyYXJ5PTEKK2NvbXBpbGVycy5wLmJ1aWxkLnNyYy5pbmNsdWRlcz0xCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKK2NvbXBpbGVycy5wLmludGVybmFsPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTIKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0xCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tcmVxdWlyZS1idW5kbGU9MQorY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKK2NvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKK2NvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKK2NvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQorY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKK2NvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCitjb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYworY29tcGlsZXJzLnMub3Blbi10YWdzPTEKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDVmODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDMyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDAuMTEuMC5xdWFsaWZpZXIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNworQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0ltcG9ydC1QYWNrYWdlOiBqYXZheC5hbm5vdGF0aW9uO3ZlcnNpb249IjEuMC4wIiwKKyBqYXZheC5pbmplY3Q7dmVyc2lvbj0iMS4wLjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbCwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZywKKyBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncywKKyBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLAorIG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuZm9ybWF0dGluZywKKyBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLAorIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdywKKyBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS41LjAiCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cztidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGk7YnVuZGxlLXZlcnNpb249IjEuMS4wIiwKKyBvcmcuZWNsaXBzZS5yYXAucnd0CitSZXF1aXJlLUNhcGFiaWxpdHk6IG9yZy5lY2xpcHNlLnJhcAorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzOworICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gsCisgICBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dCwKKyAgIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QsCisgICBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giLAorIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaCxvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIsCisgb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mua2V5czt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvTUVUQS1JTkYvcDIuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9NRVRBLUlORi9wMi5pbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvTUVUQS1JTkYvcDIuaW5mCkBAIC0wLDAgKzEsMTMgQEAKKyMgRW5zdXJlIHRoYXQgbW9kaWZpZWQgUkFQIGU0IHBsYXRmb3JtIGJ1bmRsZXMgYXJlIG9ubHkgaW5zdGFsbGVkIGluIFJBUCBlbnZpcm9ubWVudAorIyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMTc3CisjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTA5MjIKKworIyBNYWtlIHN1cmUgdGhhdCBhIFJBUCBSV1QgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCityZXF1aXJlcy4wLm5hbWVzcGFjZSA9IG9yZy5lY2xpcHNlLnJhcAorcmVxdWlyZXMuMC5uYW1lID0gb3JnLmVjbGlwc2UucmFwLnJ3dAorCisjIERvIG5vdCBhbGxvdyB0byBpbnN0YWxsIHRoaXMgSVUgaW4gY2FzZSB0aGUgU1dUIGJ1bmRsZSBpcyBhdmFpbGFibGUKK3JlcXVpcmVzLjEubmFtZXNwYWNlID0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdQorcmVxdWlyZXMuMS5uYW1lID0gb3JnLmVjbGlwc2Uuc3d0CityZXF1aXJlcy4xLm1pbiA9IDAKK3JlcXVpcmVzLjEubWF4ID0gMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9PU0dJLUlORi9iaW5kaW5ncy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL09TR0ktSU5GL2JpbmRpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM3OTZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9PU0dJLUlORi9iaW5kaW5ncy54bWwKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIG5hbWU9Im9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzIj4KKyAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MuaW50ZXJuYWwuQmluZGluZ1NlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uIi8+CisgICA8c2VydmljZT4KKyAgICAgIDxwcm92aWRlIGludGVyZmFjZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JQ29udGV4dEZ1bmN0aW9uIi8+CisgICA8L3NlcnZpY2U+CisgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5jb250ZXh0LmtleSIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MuRUJpbmRpbmdTZXJ2aWNlIi8+Cis8L3Njcjpjb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPk5vdmVtYmVyIDIwLCAyMDA4PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDQzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBPU0dJLUlORi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbAorc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICAgc3JjLXJhcC8KK3NyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKK2pyZS5jb21waWxhdGlvbi5wcm9maWxlID0gSmF2YVNFLTEuNwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9mb3JjZVF1YWxpZmllclVwZGF0ZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYxMDMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9mb3JjZVF1YWxpZmllclVwZGF0ZS50eHQKQEAgLTAsMCArMSwyIEBACisjIFRvIGZvcmNlIGEgdmVyc2lvbiBxdWFsaWZpZXIgdXBkYXRlIGFkZCB0aGUgYnVnIGhlcmUKK0J1ZyA0MDMzNTIgLSBVcGRhdGUgYWxsIHBhcmVudCB2ZXJzaW9ucyB0byBtYXRjaCBvdXIgYnVpbGQgc3RyZWFtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmEyNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGx1Z2luTmFtZSA9IEVjbGlwc2UgQmluZGluZ3MgU3VwcG9ydAorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvcG9tLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JkYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9wb20ueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5yYXAuZTQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4wLjExLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5yYXAuZTQudGFyZ2V0LXJlbGVuZzwvYXJ0aWZhY3RJZD4KKyAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3JlbGVuZy9yZWxlbmctdGFyZ2V0L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8IS0tIHRvIGVuc3VyZSB0aGF0IHRoZSBmZWF0dXJlIGxvb2t1cCBvZiB0aGUgdWkgdGVzdCB3b3JrcyAtLT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi88L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudHljaG88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR5Y2hvLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9LZXlBc3Npc3REaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9LZXlBc3Npc3REaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI5NWFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0tleUFzc2lzdERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MuRUJpbmRpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmtleXMuS2V5QmluZGluZ0Rpc3BhdGNoZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CisKKy8qKgorICogPHA+CisgKiBBIGRpYWxvZyBkaXNwbGF5aW5nIGEgbGlzdCBvZiBrZXkgYmluZGluZ3MuIFRoZSBkaWFsb2cgd2lsbCBleGVjdXRlIGEgY29tbWFuZAorICogaWYgaXQgaXMgc2VsZWN0ZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBtZXRob2RzIG9uIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQtc2FmZSBhbmQgbXVzdCBiZSBydW4gZnJvbSB0aGUgVUkKKyAqIHRocmVhZC4KKyAqIDwvcD4KKyAqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlBc3Npc3REaWFsb2cgZXh0ZW5kcyBQb3B1cERpYWxvZyB7CisKKwkvKioKKwkgKgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLyoqCisJICogVGhlIGRhdGEga2V5IGZvciB0aGUgYmluZGluZyBzdG9yZWQgb24gYW4gU1dUIHdpZGdldC4gVGhlIGtleSBpcyBhCisJICogZnVsbHktcXVhbGlmaWVkIG5hbWUsIGJ1dCBpbiByZXZlcnNlIG9yZGVyLiBUaGlzIGlzIHNvIHRoYXQgdGhlIGVxdWFscworCSAqIG1ldGhvZCB3aWxsIGRldGVjdCBtaXNzZXMgZmFzdGVyLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0tFWSA9ICJCaW5kaW5nLmJpbmRpbmdzLmpmYWNlLmVjbGlwc2Uub3JnIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHZhbHVlIG9mIDxjb2RlPnByZXZpb3VzV2lkdGg8L2NvZGU+IHRvIHNldCBpZiB0aGVyZSBpcyBubyByZW1lbWJlcmVkCisJICogd2lkdGguCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX1JFTUVNQkVSRURfV0lEVEggPSAtMTsKKworCS8qKgorCSAqIFRoZSBvcmRlcmVkIGxpc3Qgb2YgY29tbWFuZCBpZGVudGlmaWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YWJsZS4KKwkgKi8KKwlwcml2YXRlIExpc3Q8QmluZGluZz4gYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7CisKKwkvKioKKwkgKiBUaGUgdGFibGUgY29udGFpbmluZyBvZiB0aGUgcG9zc2libGUgY29tcGxldGlvbnMuIFRoaXMgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB1bnRpbCB0aGUgZGlhbG9nIGlzIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBUYWJsZSBjb21wbGV0aW9uc1RhYmxlID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSB3aWR0aCBvZiB0aGUgc2hlbGwgd2hlbiBpdCB3YXMgcHJldmlvdXNseSBvcGVuLiBUaGlzIGlzIG9ubHkKKwkgKiByZW1lbWJlcmVkIHVudGlsIDxjb2RlPmNsZWFyUmVtZW1iZXJlZFN0YXRlKCk8L2NvZGU+IGlzIGNhbGxlZC4KKwkgKi8KKwlwcml2YXRlIGludCBwcmV2aW91c1dpZHRoID0gTk9fUkVNRU1CRVJFRF9XSURUSDsKKworCS8qKgorCSAqIFRoZSBrZXkgYmluZGluZyBsaXN0ZW5lciBmb3IgdGhlIGFzc29jaWF0ZWQgd29ya2JlbmNoLgorCSAqLworCXByaXZhdGUgS2V5QmluZGluZ0Rpc3BhdGNoZXIgd29ya2JlbmNoS2V5Ym9hcmQ7CisKKwkvKioKKwkgKiBBIHNvcnRlZCBtYXAgb2YgY29uZmxpY3RzIG9yIHBhcnRpYWwgbWF0Y2hlcyB0byBiZSB1c2VkIHdoZW4gdGhlIGRpYWxvZworCSAqIHBvcHMgdXAuCisJICoKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHJpdmF0ZSBDb2xsZWN0aW9uPEJpbmRpbmc+IG1hdGNoZXM7CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5LZXlBc3Npc3REaWFsb2c8L2NvZGU+LiBXaGVuIHRoZQorCSAqIGRpYWxvZyBpcyBmaXJzdCBjb25zdHJ1Y3RlZCwgaXQgY29udGFpbnMgbm8gd2lkZ2V0cy4gVGhlIGRpYWxvZyBpcyBmaXJzdAorCSAqIGNyZWF0ZWQgd2l0aCBubyBwYXJlbnQuIElmIGEgcGFyZW50IGlzIHJlcXVpcmVkLCBjYWxsCisJICogPGNvZGU+c2V0UGFyZW50U2hlbGwoKTwvY29kZT4uIEFsc28sIGJldHdlZW4gdXNlcywgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5CisJICogdG8gY2FsbCA8Y29kZT5zZXRQYXJlbnRTaGVsbCgpPC9jb2RlPiBhcyB3ZWxsLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoaXMgZGlhbG9nIGlzIGNyZWF0ZWQ7IG11c3Qgbm90IGJlCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYXNzb2NpYXRlZEtleWJvYXJkCisJICogICAgICAgICAgICBUaGUga2V5IGJpbmRpbmcgbGlzdGVuZXIgZm9yIHRoZSB3b3JrYmVuY2g7IG11c3Qgbm90IGJlCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgS2V5QXNzaXN0RGlhbG9nKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBLZXlCaW5kaW5nRGlzcGF0Y2hlciBhc3NvY2lhdGVkS2V5Ym9hcmQpIHsKKwkJc3VwZXIoKFNoZWxsKSBudWxsLCBQb3B1cERpYWxvZy5JTkZPUE9QVVBfU0hFTExTVFlMRSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCk7CisJCS8vIHN1cGVyKG51bGwsIFBvcHVwRGlhbG9nLklORk9QT1BVUF9TSEVMTFNUWUxFLCB0cnVlLCBmYWxzZSwgZmFsc2UsCisJCS8vIGZhbHNlLCBmYWxzZSwgRElBTE9HX1RJVExFLCBnZXRLZXlTZXF1ZW5jZVN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMud29ya2JlbmNoS2V5Ym9hcmQgPSBhc3NvY2lhdGVkS2V5Ym9hcmQ7CisJfQorCisJLyoqCisJICogQ2xlYXJzIG91dCB0aGUgcmVtZW1iZXJlZCBzdGF0ZSBvZiB0aGUga2V5IGFzc2lzdCBkaWFsb2cuIFRoaXMgaW5jbHVkZXMKKwkgKiBpdHMgd2lkdGgsIGFzIHdlbGwgYXMgdGhlIHNlbGVjdGVkIGJpbmRpbmcuCisJICovCisJcHVibGljIHZvaWQgY2xlYXJSZW1lbWJlcmVkU3RhdGUoKSB7CisJCXByZXZpb3VzV2lkdGggPSBOT19SRU1FTUJFUkVEX1dJRFRIOworCX0KKworCS8qKgorCSAqIENsb3NlcyB0aGlzIHNoZWxsLCBidXQgZmlyc3QgcmVtZW1iZXJzIHNvbWUgc3RhdGUgb2YgdGhlIGRpYWxvZy4gVGhpcyB3YXkKKwkgKiBpdCB3aWxsIGhhdmUgYSByZXNwb25zZSBpZiBhc2tlZCB0byBvcGVuIHRoZSBkaWFsb2cgYWdhaW4gb3IgaWYgYXNrZWQgdG8KKwkgKiBvcGVuIHRoZSBrZXlzIHByZWZlcmVuY2UgcGFnZS4gVGhpcyBkb2VzIG5vdCByZW1lbWJlciB0aGUgaW50ZXJuYWwgc3RhdGUuCisJICoKKwkgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHNoZWxsIHdhcyBhbHJlYWR5IGNsb3NlZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKKwkJcmV0dXJuIGNsb3NlKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhpcyBzaGVsbCwgYnV0IGZpcnN0IHJlbWVtYmVycyBzb21lIHN0YXRlIG9mIHRoZSBkaWFsb2cuIFRoaXMgd2F5CisJICogaXQgd2lsbCBoYXZlIGEgcmVzcG9uc2UgaWYgYXNrZWQgdG8gb3BlbiB0aGUgZGlhbG9nIGFnYWluIG9yIGlmIGFza2VkIHRvCisJICogb3BlbiB0aGUga2V5cyBwcmVmZXJlbmNlIHBhZ2UuCisJICoKKwkgKiBAcGFyYW0gcmVtZW1iZXJTdGF0ZQorCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgaW50ZXJuYWwgc3RhdGUgc2hvdWxkIGJlIHJlbWVtYmVyZWQuCisJICogQHJldHVybiBXaGV0aGVyIHRoZSBzaGVsbCB3YXMgYWxyZWFkeSBjbG9zZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gY2xvc2UoYm9vbGVhbiByZW1lbWJlclN0YXRlKSB7CisJCXJldHVybiBjbG9zZShyZW1lbWJlclN0YXRlLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhpcyBzaGVsbCwgYnV0IGZpcnN0IHJlbWVtYmVycyBzb21lIHN0YXRlIG9mIHRoZSBkaWFsb2cuIFRoaXMgd2F5CisJICogaXQgd2lsbCBoYXZlIGEgcmVzcG9uc2UgaWYgYXNrZWQgdG8gb3BlbiB0aGUgZGlhbG9nIGFnYWluIG9yIGlmIGFza2VkIHRvCisJICogb3BlbiB0aGUga2V5cyBwcmVmZXJlbmNlIHBhZ2UuCisJICoKKwkgKiBAcGFyYW0gcmVtZW1iZXJTdGF0ZQorCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgaW50ZXJuYWwgc3RhdGUgc2hvdWxkIGJlIHJlbWVtYmVyZWQuCisJICogQHBhcmFtIHJlc2V0U3RhdGUKKwkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIHN0YXRlIHNob3VsZCBiZSByZXNldC4KKwkgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHNoZWxsIHdhcyBhbHJlYWR5IGNsb3NlZC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2xvc2UoYm9vbGVhbiByZW1lbWJlclN0YXRlLCBib29sZWFuIHJlc2V0U3RhdGUpIHsKKwkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOworCQlpZiAocmVtZW1iZXJTdGF0ZSkgeworCisJCQkvLyBSZW1lbWJlciB0aGUgcHJldmlvdXMgd2lkdGguCisJCQlpbnQgd2lkdGhUb1JlbWVtYmVyOworCQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkpIHsKKwkJCQl3aWR0aFRvUmVtZW1iZXIgPSBnZXRTaGVsbCgpLmdldFNpemUoKS54OworCQkJfSBlbHNlIHsKKwkJCQl3aWR0aFRvUmVtZW1iZXIgPSBOT19SRU1FTUJFUkVEX1dJRFRIOworCQkJfQorCisJCQl0aGlzLnByZXZpb3VzV2lkdGggPSB3aWR0aFRvUmVtZW1iZXI7CisJCQljb21wbGV0aW9uc1RhYmxlID0gbnVsbDsKKwkJfQorCQltYXRjaGVzID0gbnVsbDsKKwkJYm9vbGVhbiBwb3B1cENsb3NlZCA9IHN1cGVyLmNsb3NlKCk7CisJCWlmIChyZXNldFN0YXRlKSB7CisJCQl3b3JrYmVuY2hLZXlib2FyZC5yZXNldFN0YXRlKCk7CisJCX0KKwkJcmV0dXJuIHBvcHVwQ2xvc2VkOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHBvc2l0aW9uIGZvciB0aGUgZGlhbG9nIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgd29ya2JlbmNoCisJICogd2luZG93LiBUaGUgZGlhbG9nIGlzIGZsdXNoIHdpdGggdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgdGhlIHdvcmtiZW5jaAorCSAqIHdpbmRvdy4gSG93ZXZlciwgdGhlIGRpYWxvZyB3aWxsIG5vdCBhcHBlYXIgb3V0c2lkZSBvZiB0aGUgZGlzcGxheSdzCisJICogY2xpZW50IGFyZWEuCisJICoKKwkgKiBAcGFyYW0gc2l6ZQorCSAqICAgICAgICAgICAgVGhlIGZpbmFsIHNpemUgb2YgdGhlIGRpYWxvZzsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUxvY2F0aW9uKFBvaW50IHNpemUpIHsKKwkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOworCisJCVNoZWxsIHdvcmtiZW5jaFdpbmRvd1NoZWxsID0gKFNoZWxsKSBzaGVsbC5nZXRQYXJlbnQoKTsKKwkJaW50IHhDb29yZDsKKwkJaW50IHlDb29yZDsKKwkJaWYgKHdvcmtiZW5jaFdpbmRvd1NoZWxsICE9IG51bGwpIHsKKwkJCS8qCisJCQkgKiBQb3NpdGlvbiB0aGUgc2hlbGwgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgdGhlIHdvcmtiZW5jaAorCQkJICogd2luZG93CisJCQkgKi8KKwkJCVJlY3RhbmdsZSB3b3JrYmVuY2hXaW5kb3dCb3VuZHMgPSB3b3JrYmVuY2hXaW5kb3dTaGVsbC5nZXRCb3VuZHMoKTsKKwkJCXhDb29yZCA9IHdvcmtiZW5jaFdpbmRvd0JvdW5kcy54ICsgd29ya2JlbmNoV2luZG93Qm91bmRzLndpZHRoIC0gc2l6ZS54IC0gMTA7CisJCQl5Q29vcmQgPSB3b3JrYmVuY2hXaW5kb3dCb3VuZHMueSArIHdvcmtiZW5jaFdpbmRvd0JvdW5kcy5oZWlnaHQgLSBzaXplLnkgLSAxMDsKKworCQl9IGVsc2UgeworCQkJeENvb3JkID0gMDsKKwkJCXlDb29yZCA9IDA7CisKKwkJfQorCQlSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSh4Q29vcmQsIHlDb29yZCwgc2l6ZS54LCBzaXplLnkpOworCQlzaGVsbC5zZXRCb3VuZHMoZ2V0Q29uc3RyYWluZWRTaGVsbEJvdW5kcyhib3VuZHMpKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBzaXplIGZvciB0aGUgZGlhbG9nIGJhc2VkIG9uIGl0cyBwcmV2aW91cyBzaXplLiBUaGUgd2lkdGggb2YgdGhlCisJICogZGlhbG9nIGlzIGl0cyBwcmV2aW91cyB3aWR0aCwgaWYgaXQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IGlzIHNpbXBseSB0aGUKKwkgKiBwYWNrZWQgd2lkdGggb2YgdGhlIGRpYWxvZy4gVGhlIG1heGltdW0gd2lkdGggaXMgNDAlIG9mIHRoZSB3b3JrYmVuY2gKKwkgKiB3aW5kb3cncyB3aWR0aC4gVGhlIGRpYWxvZydzIGhlaWdodCBpcyB0aGUgcGFja2VkIGhlaWdodCBvZiB0aGUgZGlhbG9nIHRvCisJICogYSBtYXhpbXVtIG9mIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgd29ya2JlbmNoIHdpbmRvdy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpemUgb2YgdGhlIGRpYWxvZworCSAqLworCXByaXZhdGUgUG9pbnQgY29uZmlndXJlU2l6ZSgpIHsKKwkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOworCisJCS8vIEdldCB0aGUgcGFja2VkIHNpemUgb2YgdGhlIHNoZWxsLgorCQlzaGVsbC5wYWNrKCk7CisJCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplKCk7CisKKwkJLy8gVXNlIHRoZSBwcmV2aW91cyB3aWR0aCBpZiBhcHByb3ByaWF0ZS4KKwkJaWYgKChwcmV2aW91c1dpZHRoICE9IE5PX1JFTUVNQkVSRURfV0lEVEgpICYmIChwcmV2aW91c1dpZHRoID4gc2l6ZS54KSkgeworCQkJc2l6ZS54ID0gcHJldmlvdXNXaWR0aDsKKwkJfQorCisJCS8vIEVuZm9yY2UgbWF4aW11bSBzaXppbmcuCisJCVNoZWxsIHdvcmtiZW5jaFdpbmRvd1NoZWxsID0gKFNoZWxsKSBzaGVsbC5nZXRQYXJlbnQoKTsKKwkJaWYgKHdvcmtiZW5jaFdpbmRvd1NoZWxsICE9IG51bGwpIHsKKwkJCVBvaW50IHdvcmtiZW5jaFdpbmRvd1NpemUgPSB3b3JrYmVuY2hXaW5kb3dTaGVsbC5nZXRTaXplKCk7CisJCQlpbnQgbWF4V2lkdGggPSB3b3JrYmVuY2hXaW5kb3dTaXplLnggKiAyIC8gNTsKKwkJCWludCBtYXhIZWlnaHQgPSB3b3JrYmVuY2hXaW5kb3dTaXplLnkgLyAyOworCQkJaWYgKHNpemUueCA+IG1heFdpZHRoKSB7CisJCQkJc2l6ZS54ID0gbWF4V2lkdGg7CisJCQl9CisJCQlpZiAoc2l6ZS55ID4gbWF4SGVpZ2h0KSB7CisJCQkJc2l6ZS55ID0gbWF4SGVpZ2h0OworCQkJfQorCQl9CisKKwkJLy8gU2V0IHRoZSBzaXplIGZvciB0aGUgc2hlbGwuCisJCXNoZWxsLnNldFNpemUoc2l6ZSk7CisJCXJldHVybiBzaXplOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGNvbnRlbnQgYXJlYSBmb3IgdGhlIGtleSBhc3Npc3RhbnQuIFRoaXMgY3JlYXRlcyBhIHRhYmxlIGFuZAorCSAqIHBsYWNlcyBpdCBpbnNpZGUgdGhlIGNvbXBvc2l0ZS4gVGhlIGNvbXBvc2l0ZSB3aWxsIGNvbnRhaW4gYSBsaXN0IG9mIGFsbAorCSAqIHRoZSBrZXkgYmluZGluZ3MuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYTsgbXVzdCBub3QgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIENyZWF0ZSBhIGNvbXBvc2l0ZSBmb3IgdGhlIGRpYWxvZyBhcmVhLgorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBjb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQljb21wb3NpdGVMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJY29tcG9zaXRlLnNldExheW91dChjb21wb3NpdGVMYXlvdXQpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCWNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOworCisJCS8vIExheW91dCB0aGUgcGFydGlhbCBtYXRjaGVzLgorCQlDb2xsZWN0aW9uPEJpbmRpbmc+IGJpbmRpbmdzOworCQkvLyBpZiB3ZSdyZSBnb2luZyB0byBkaXNwbGF5IGEgbGlzdCBvZiBjb25mbGljdHMgb3IgcGFydGlhbCBtYXRjaGVzLi4uCisJCWlmIChtYXRjaGVzICE9IG51bGwpIHsKKwkJCWJpbmRpbmdzID0gbWF0Y2hlczsKKwkJfQorCQkvLyBlbHNlIGp1c3QgZ3JhYiB0aGUgZW50aXJlIGxpc3Qgb2YgYWN0aXZlIGJpbmRpbmdzCisJCWVsc2UgeworCQkJYmluZGluZ3MgPSBnZXRBY3RpdmVCaW5kaW5ncygpOworCQl9CisKKwkJaWYgKGJpbmRpbmdzID09IG51bGwgfHwgYmluZGluZ3MuaXNFbXB0eSgpKSB7CisJCQljcmVhdGVFbXB0eURpYWxvZ0FyZWEoY29tcG9zaXRlKTsKKwkJfSBlbHNlIHsKKwkJCWNyZWF0ZVRhYmxlRGlhbG9nQXJlYShjb21wb3NpdGUsIGJpbmRpbmdzKTsKKwkJfQorCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gZW1wdHkgZGlhbG9nIGFyZWEgd2l0aCBhIHNpbXBsZSBtZXNzYWdlIHNheWluZyB0aGVyZSB3ZXJlIG5vCisJICogbWF0Y2hlcy4gVGhpcyBpcyB1c2VkIGlmIG5vIHBhcnRpYWwgbWF0Y2hlcyBjb3VsZCBiZSBmb3VuZC4gVGhpcyBzaG91bGQKKwkgKiBub3QgcmVhbGx5IGV2ZXIgaGFwcGVuLCBidXQgbWlnaHQgYmUgcG9zc2libGUgaWYgdGhlIGNvbW1hbmRzIGFyZQorCSAqIGNoYW5naW5nIHdoaWxlIHdhaXRpbmcgZm9yIHRoaXMgZGlhbG9nIHRvIG9wZW4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZSBmb3IgdGhlIGRpYWxvZyBhcmVhOyBtdXN0IG5vdCBiZQorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtcHR5RGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUxhYmVsIG5vTWF0Y2hlc0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOworCQlub01hdGNoZXNMYWJlbC5zZXRUZXh0KCJObyBtYXRjaGVzIik7IC8vJE5PTi1OTFMtMSQKKwkJbm9NYXRjaGVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCW5vTWF0Y2hlc0xhYmVsLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIGRpYWxvZyBhcmVhIHdpdGggYSB0YWJsZSBvZiB0aGUgcGFydGlhbCBtYXRjaGVzIGZvciB0aGUgY3VycmVudAorCSAqIGtleSBiaW5kaW5nIHN0YXRlLiBUaGUgdGFibGUgd2lsbCBiZSBlaXRoZXIgdGhlIG1pbmltdW0gd2lkdGgsIG9yCisJICogPGNvZGU+cHJldmlvdXNXaWR0aDwvY29kZT4gaWYgaXQgaXMgbm90IDxjb2RlPk5PX1JFTUVNQkVSRURfV0lEVEg8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUgZm9yIHRoZSBkaWFsb2cgYXJlYTsgbXVzdCBub3QgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwYXJ0aWFsTWF0Y2hlcworCSAqICAgICAgICAgICAgVGhlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBtYXAgb2YgcGFydGlhbCBtYXRjaGVzIGZvciB0aGUKKwkgKiAgICAgICAgICAgIGN1cnJlbnQgc3RhdGU7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LgorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCwgQ29sbGVjdGlvbjxCaW5kaW5nPiBwYXJ0aWFsTWF0Y2hlcykgeworCQkvLyBMYXlvdXQgdGhlIHRhYmxlLgorCQljb21wbGV0aW9uc1RhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlNJTkdMRSk7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWNvbXBsZXRpb25zVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJCWNvbXBsZXRpb25zVGFibGUuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKKwkJY29tcGxldGlvbnNUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY29sdW1ucyBhbmQgcm93cy4KKwkJYmluZGluZ3MuY2xlYXIoKTsKKwkJVGFibGVDb2x1bW4gY29sdW1uQ29tbWFuZE5hbWUgPSBuZXcgVGFibGVDb2x1bW4oY29tcGxldGlvbnNUYWJsZSwgU1dULkxFRlQsIDApOworCQlUYWJsZUNvbHVtbiBjb2x1bW5LZXlTZXF1ZW5jZSA9IG5ldyBUYWJsZUNvbHVtbihjb21wbGV0aW9uc1RhYmxlLCBTV1QuTEVGVCwgMSk7CisJCUl0ZXJhdG9yPEJpbmRpbmc+IGl0ZW1zSXRyID0gcGFydGlhbE1hdGNoZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZW1zSXRyLmhhc05leHQoKSkgeworCQkJQmluZGluZyBiaW5kaW5nID0gaXRlbXNJdHIubmV4dCgpOworCQkJU3RyaW5nIHNlcXVlbmNlID0gYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKS5mb3JtYXQoKTsKKwkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQgPSBiaW5kaW5nLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7CisJCQl0cnkgeworCQkJCVN0cmluZ1tdIHRleHQgPSB7IGNvbW1hbmQuZ2V0TmFtZSgpLCBzZXF1ZW5jZSB9OworCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb21wbGV0aW9uc1RhYmxlLCBTV1QuTlVMTCk7CisJCQkJaXRlbS5zZXRUZXh0KHRleHQpOworCQkJCWl0ZW0uc2V0RGF0YShCSU5ESU5HX0tFWSwgYmluZGluZyk7CisJCQkJYmluZGluZ3MuYWRkKGJpbmRpbmcpOworCQkJfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gTm90IG11Y2ggdG8gZG8sIGJ1dCB0aGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuLgorCQkJfQorCQl9CisKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworCQljb2x1bW5LZXlTZXF1ZW5jZS5wYWNrKCk7CisJCWlmIChwcmV2aW91c1dpZHRoICE9IE5PX1JFTUVNQkVSRURfV0lEVEgpIHsKKwkJCWNvbHVtbktleVNlcXVlbmNlLnNldFdpZHRoKHByZXZpb3VzV2lkdGgpOworCQl9CisJCWNvbHVtbkNvbW1hbmROYW1lLnBhY2soKTsKKwkJaWYgKGNvbXBsZXRpb25zVGFibGUuZ2V0SXRlbXMoKS5sZW5ndGggPiAwKSB7CisJCQljb21wbGV0aW9uc1RhYmxlLnNldFNlbGVjdGlvbigwKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHlvdSBkb3VibGUtY2xpY2sgb24gdGhlIHRhYmxlLCBpdCBzaG91bGQgZXhlY3V0ZSB0aGUgc2VsZWN0ZWQKKwkJICogY29tbWFuZC4KKwkJICovCisJCWNvbXBsZXRpb25zVGFibGUuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlleGVjdXRlS2V5QmluZGluZyhldmVudCk7CisJCQl9CisJCX0pOworCX0KKworCS8qKgorCSAqIEhhbmRsZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIGV2ZW50IG9uIHRoZSB0YWJsZSBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KKwkgKiBUaGlzIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQuCisJICovCisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGVLZXlCaW5kaW5nKEV2ZW50IHRyaWdnZXIpIHsKKwkJaW50IHNlbGVjdGlvbkluZGV4ID0gY29tcGxldGlvbnNUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkvLyBUcnkgdG8gZXhlY3V0ZSB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kLgorCQlpZiAoc2VsZWN0aW9uSW5kZXggPj0gMCkgeworCQkJY2xvc2UoKTsKKwkJCUJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzLmdldChzZWxlY3Rpb25JbmRleCk7CisJCQl0cnkgeworCQkJCS8vIHdvcmtiZW5jaEtleWJvYXJkLnVwZGF0ZVNoZWxsS2x1ZGdlKG51bGwpOworCQkJCXdvcmtiZW5jaEtleWJvYXJkLmV4ZWN1dGVDb21tYW5kKGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSwgdHJpZ2dlcik7CisJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBXb3JrYmVuY2hQbHVnaW4ubG9nKGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKS50b1N0cmluZygpLAorCQkJCS8vIGUpOworCQkJCS8vIFRPRE8gd2UgcHJvYmFibHkgbmVlZCB0byBsb2cgc29tZXRoaW5nIGhlcmUuCisJCQkJU3lzdGVtLmVyci5wcmludGxuKGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKS50b1N0cmluZygpICsgIiA6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEFjdGl2ZUJpbmRpbmdzKCkgeworCisJCUVCaW5kaW5nU2VydmljZSBiaW5kaW5nU2VydmljZSA9IGNvbnRleHQuZ2V0QWN0aXZlTGVhZigpLmdldChFQmluZGluZ1NlcnZpY2UuY2xhc3MpOworCisJCUl0ZXJhdG9yPEJpbmRpbmc+IGl0ZXIsIG1hdGNoZXNJdGVyOworCQlCaW5kaW5nIGJpbmRpbmcsIGJpbmRpbmdUb0FkZDsKKwkJQ29sbGVjdGlvbjxCaW5kaW5nPiBtYXRjaGVzRm9yQ29tbWFuZDsKKwkJQ29sbGVjdGlvbjxCaW5kaW5nPiBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEFjdGl2ZUJpbmRpbmdzKCk7CisJCUNvbGxlY3Rpb248QmluZGluZz4gY29uZmxpY3RCaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEFsbENvbmZsaWN0cygpOworCQlDb2xsZWN0aW9uPEJpbmRpbmc+IHNvcnRlZE1hdGNoZXMgPSBuZXcgVHJlZVNldDxCaW5kaW5nPihuZXcgQ29tcGFyYXRvcjxCaW5kaW5nPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGludCBjb21wYXJlKEJpbmRpbmcgYmluZGluZzEsIEJpbmRpbmcgYmluZGluZzIpIHsKKwkJCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjbWRBID0gYmluZGluZzEuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKTsKKwkJCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjbWRCID0gYmluZGluZzIuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKTsKKwkJCQlpbnQgcmVzdWx0ID0gMDsKKwkJCQl0cnkgeworCQkJCQlyZXN1bHQgPSBjbWRBLmdldE5hbWUoKS5jb21wYXJlVG8oY21kQi5nZXROYW1lKCkpOworCQkJCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgeworCQkJCQkvLyB3aGFhYT8KKwkJCQl9CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfSk7CisKKwkJLy8gaWYgdGhlIGFjdGl2ZSBzY2hlbWUgaXMgbm90IHRoZSBkZWZhdWx0IHNjaGVtZSB0aGVuIHdlIHNob3VsZCBjbGVhbgorCQkvLyB1cCB0aGUgYWN0aXZlCisJCS8vIGJpbmRpbmdzIGxpc3QuLi4gaWYgd2UgZmluZCBtdWx0aXBsZSBiaW5kaW5ncyBmb3IgdGhlIHNhbWUgY29tbWFuZAorCQkvLyBhbmQgdGhleSBhcmUgZm9yCisJCS8vIGRpZmZlcmVudCBzY2hlbWVzLCB0aGVuIHdlIG5lZWQgdG8gaGFuZGxlIHdoaWNoIG9uZSBzaG91bGQgYmUKKwkJLy8gZGlzcGxheWVkIGluIHRoZSBkaWFsb2cKKwkJaWYgKGFjdGl2ZUJpbmRpbmdzICE9IG51bGwpIHsKKwkJCWl0ZXIgPSBhY3RpdmVCaW5kaW5ncy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJYmluZGluZyA9IGl0ZXIubmV4dCgpOworCQkJCW1hdGNoZXNGb3JDb21tYW5kID0gYmluZGluZ1NlcnZpY2UuZ2V0QmluZGluZ3NGb3IoYmluZGluZy5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpKTsKKwkJCQkvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG1hdGNoLCB0aGVuIGxvb2sgZm9yIGEgYmluZGluZyB0aGF0CisJCQkJLy8gZG9lcyBub3QgYmVsb25nIHRvCisJCQkJLy8gdGhlIGRlZmF1bHQgc2NoZW1lLiBJZiB0aGV5IGFsbCBiZWxvbmcgdG8gdGhlIGRlZmF1bHQgc2NoZW1lCisJCQkJLy8gb3IgdGhleSBhbGwgZG8gTk9UCisJCQkJLy8gYmVsb25nIHRvIHRoZSBkZWZhdWx0IHNjaGVtZSwgdGhlbiBhcmJpdHJhcmlseSBjaG9vc2Ugb25lCisJCQkJaWYgKG1hdGNoZXNGb3JDb21tYW5kICE9IG51bGwgJiYgbWF0Y2hlc0ZvckNvbW1hbmQuc2l6ZSgpID4gMSkgeworCQkJCQliaW5kaW5nVG9BZGQgPSBudWxsOworCisJCQkJCW1hdGNoZXNJdGVyID0gbWF0Y2hlc0ZvckNvbW1hbmQuaXRlcmF0b3IoKTsKKwkJCQkJd2hpbGUgKG1hdGNoZXNJdGVyLmhhc05leHQoKSkgeworCQkJCQkJYmluZGluZ1RvQWRkID0gbWF0Y2hlc0l0ZXIubmV4dCgpOworCQkJCQkJaWYgKCFiaW5kaW5nVG9BZGQuZ2V0U2NoZW1lSWQoKS5lcXVhbHMoRUJpbmRpbmdTZXJ2aWNlLkRFRkFVTFRfU0NIRU1FX0lEKSkgeworCQkJCQkJCXNvcnRlZE1hdGNoZXMuYWRkKGJpbmRpbmdUb0FkZCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gaWYgdGhleSdyZSBhbGwgdGhlIHNhbWUsIGFyYml0cmFyaWx5IGNob29zZSBvbmUKKwkJCQkJaWYgKGJpbmRpbmdUb0FkZCAhPSBudWxsKSB7CisJCQkJCQlzb3J0ZWRNYXRjaGVzLmFkZChiaW5kaW5nVG9BZGQpOworCQkJCQl9CisJCQkJfQorCQkJCS8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIG1hdGNoLCB0aGVuIGp1c3QgYWRkIGl0CisJCQkJZWxzZSBpZiAobWF0Y2hlc0ZvckNvbW1hbmQgIT0gbnVsbCAmJiBtYXRjaGVzRm9yQ29tbWFuZC5zaXplKCkgPT0gMSkgeworCQkJCQlzb3J0ZWRNYXRjaGVzLmFkZEFsbChtYXRjaGVzRm9yQ29tbWFuZCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChjb25mbGljdEJpbmRpbmdzICE9IG51bGwpIHsKKwkJCWl0ZXIgPSBjb25mbGljdEJpbmRpbmdzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQliaW5kaW5nID0gaXRlci5uZXh0KCk7CisJCQkJc29ydGVkTWF0Y2hlcy5hZGQoYmluZGluZyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNvcnRlZE1hdGNoZXM7CisJfQorCisJLyoqCisJICogT3BlbnMgdGhpcyBkaWFsb2cuIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUKKwkgKiBkaWFsb2cuIFRoaXMgb25seSBvcGVucyB0aGUgZGlhbG9nIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgc3RhdGU7IGlmCisJICogdGhlcmUgaXMgcmVtZW1iZXJlZCBzdGF0ZSwgdGhlbiBpdCB0cmllcyB0byBvcGVuIHRoZSBwcmVmZXJlbmNlIHBhZ2UKKwkgKiBpbnN0ZWFkLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuIGNvZGUgZnJvbSB0aGlzIGRpYWxvZy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IG9wZW4oKSB7CisJCS8vIElmIHRoZSBkaWFsb2cgaXMgYWxyZWFkeSBvcGVuLCBkaXNwb3NlIHRoZSBzaGVsbCBhbmQgcmVjcmVhdGUgaXQuCisJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKKwkJaWYgKHNoZWxsICE9IG51bGwpIHsKKwkJCWNsb3NlKGZhbHNlLCBmYWxzZSk7CisJCQlyZXR1cm4gV2luZG93Lk9LOworCQl9CisJCWNyZWF0ZSgpOworCQkvLyBCdWcgNDEyMDAxLiBTdG9wIFNoZWxsQWN0aXZhdGlvbkxpc3RlbmVyIGZyb20gY3JlYXRpbmcgYSBjb250ZXh0IGZvcgorCQkvLyB0aGlzLgorCQlnZXRTaGVsbCgpLnNldERhdGEoIm9yZy5lY2xpcHNlLmU0LnVpLmlnbm9yZURpYWxvZyIsIEJvb2xlYW4uVFJVRSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDb25maWd1cmUgdGhlIHNpemUgYW5kIGxvY2F0aW9uLgorCQlQb2ludCBzaXplID0gY29uZmlndXJlU2l6ZSgpOworCQljb25maWd1cmVMb2NhdGlvbihzaXplKTsKKworCQkvLyBDYWxsIHRoZSBzdXBlciBtZXRob2QuCisJCXJldHVybiBzdXBlci5vcGVuKCk7CisJfQorCisJLyoqCisJICogT3BlbnMgdGhpcyBkaWFsb2cgd2l0aCB0aGUgbGlzdCBvZiBiaW5kaW5ncyBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGZyb20uCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm4gY29kZSBmcm9tIHRoaXMgZGlhbG9nLgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgaW50IG9wZW4oQ29sbGVjdGlvbjxCaW5kaW5nPiBiaW5kaW5ncykgeworCQltYXRjaGVzID0gbmV3IFRyZWVTZXQ8QmluZGluZz4obmV3IENvbXBhcmF0b3I8QmluZGluZz4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShCaW5kaW5nIGEsIEJpbmRpbmcgYikgeworCQkJCUJpbmRpbmcgYmluZGluZ0EgPSBhOworCQkJCUJpbmRpbmcgYmluZGluZ0IgPSBiOworCQkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmRBID0gYmluZGluZ0EuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKTsKKwkJCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kQiA9IGJpbmRpbmdCLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIGNvbW1hbmRBLmdldE5hbWUoKS5jb21wYXJlVG8oY29tbWFuZEIuZ2V0TmFtZSgpKTsKKwkJCQl9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJbWF0Y2hlcy5hZGRBbGwoYmluZGluZ3MpOworCisJCS8vIElmIHRoZSBkaWFsb2cgaXMgYWxyZWFkeSBvcGVuLCBkaXNwb3NlIHRoZSBzaGVsbCBhbmQgcmVjcmVhdGUgaXQuCisJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKKwkJaWYgKHNoZWxsICE9IG51bGwpIHsKKwkJCWNsb3NlKGZhbHNlLCBmYWxzZSk7CisJCQlyZXR1cm4gV2luZG93Lk9LOworCQl9CisJCWNyZWF0ZSgpOworCQkvLyBCdWcgMzY5ODYwLiBTdG9wIFNoZWxsQWN0aXZhdGlvbkxpc3RlbmVyIGZyb20gY3JlYXRpbmcgYSBjb250ZXh0IGZvcgorCQkvLyB0aGlzLgorCQlnZXRTaGVsbCgpLnNldERhdGEoIm9yZy5lY2xpcHNlLmU0LnVpLmlnbm9yZURpYWxvZyIsIEJvb2xlYW4uVFJVRSk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gQ29uZmlndXJlIHRoZSBzaXplIGFuZCBsb2NhdGlvbi4KKwkJUG9pbnQgc2l6ZSA9IGNvbmZpZ3VyZVNpemUoKTsKKwkJY29uZmlndXJlTG9jYXRpb24oc2l6ZSk7CisKKwkJLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kLgorCQlyZXR1cm4gc3VwZXIub3BlbigpOworCX0KKworCS8qKgorCSAqIEV4cG9zaW5nIHRoaXMgd2l0aGluIHRoZSBrZXlzIHBhY2thZ2UuCisJICoKKwkgKiBAcGFyYW0gbmV3UGFyZW50U2hlbGwKKwkgKiAgICAgICAgICAgIFRoZSBuZXcgcGFyZW50IHNoZWxsOyB0aGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqICAgICAgICAgICAgdGhlcmUgaXMgdG8gYmUgbm8gcGFyZW50LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFBhcmVudFNoZWxsKFNoZWxsIG5ld1BhcmVudFNoZWxsKSB7CisJCXN1cGVyLnNldFBhcmVudFNoZWxsKG5ld1BhcmVudFNoZWxsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYmluZGluZyBmcm9tIHRoZSB0YWJsZSBpZiB0aGUgdGFibGUgaXMgbm90CisJICogZGlzcG9zZWQKKwkgKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBiaW5kaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJvdGVjdGVkIEJpbmRpbmcgZ2V0U2VsZWN0ZWRCaW5kaW5nKCkgeworCQlpZiAoKGNvbXBsZXRpb25zVGFibGUgIT0gbnVsbCkgJiYgKCFjb21wbGV0aW9uc1RhYmxlLmlzRGlzcG9zZWQoKSkpIHsKKwkJCWludCBzZWxlY3RlZEluZGV4ID0gY29tcGxldGlvbnNUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkJaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKKwkJCQlUYWJsZUl0ZW0gc2VsZWN0ZWRJdGVtID0gY29tcGxldGlvbnNUYWJsZS5nZXRJdGVtKHNlbGVjdGVkSW5kZXgpOworCQkJCXJldHVybiAoQmluZGluZykgc2VsZWN0ZWRJdGVtLmdldERhdGEoQklORElOR19LRVkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3Mva2V5cy9LZXlCaW5kaW5nRGlzcGF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2tleXMvS2V5QmluZGluZ0Rpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWFhMzgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2tleXMvS2V5QmluZGluZ0Rpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDYxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5rZXlzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FSGFuZGxlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5IYW5kbGVyU2VydmljZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5FY2xpcHNlQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MuRUJpbmRpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsLktleUFzc2lzdERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlNXVEtleVN1cHBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworLy9UT0RPIFJBUCB1bnN1cHBvcnRlZCBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKKy8qKgorICogPHA+CisgKiBDb250cm9scyB0aGUga2V5Ym9hcmQgaW5wdXQgaW50byB0aGUgd29ya2JlbmNoIGtleSBiaW5kaW5nIGFyY2hpdGVjdHVyZS4gVGhpcyBhbGxvd3Mga2V5IGV2ZW50cworICogdG8gYmUgcHJvZ3JhbW1hdGljYWxseSBwdXNoZWQgaW50byB0aGUga2V5IGJpbmRpbmcgYXJjaGl0ZWN0dXJlIC0tIHBvdGVudGlhbGx5IHRyaWdnZXJpbmcgdGhlCisgKiBleGVjdXRpb24gb2YgY29tbWFuZHMuIEl0IGlzIHVzZWQgYnkgdGhlIDxjb2RlPmU0IFdvcmtiZW5jaDwvY29kZT4gdG8gbGlzdGVuIGZvciBldmVudHMgb24gdGhlCisgKiA8Y29kZT5EaXNwbGF5PC9jb2RlPi4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIEtleUJpbmRpbmdEaXNwYXRjaGVyIHsKKworCXByaXZhdGUgS2V5QXNzaXN0RGlhbG9nIGtleUFzc2lzdERpYWxvZyA9IG51bGw7CisKKwkvKioKKwkgKiBBIGRpc3BsYXkgZmlsdGVyIGZvciBoYW5kbGluZyBrZXkgYmluZGluZ3MuIFRoaXMgZmlsdGVyIGNhbiBlaXRoZXIgYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gSWYKKwkgKiBkaXNhYmxlZCwgdGhlIGZpbHRlciBkb2VzIG5vdCBwcm9jZXNzIGluY29taW5nIGV2ZW50cy4gVGhlIGZpbHRlciBzdGFydHMgZW5hYmxlZC4KKwkgKiAKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIGZpbmFsIGNsYXNzIEtleURvd25GaWx0ZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7CisKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCS8qKgorCQkgKiBXaGV0aGVyIHRoZSBmaWx0ZXIgaXMgZW5hYmxlZC4KKwkJICovCisJCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisKKwkJLyoqCisJCSAqIEhhbmRsZXMgYW4gaW5jb21pbmcgdHJhdmVyc2Ugb3Iga2V5IGRvd24gZXZlbnQuCisJCSAqIAorCQkgKiBAcGFyYW0gZXZlbnQKKwkJICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gcHJvY2VzczsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGZpbmFsIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgRXZlbnQgZXZlbnQpIHsKKwkJCWlmICghZW5hYmxlZCkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJZmlsdGVyS2V5U2VxdWVuY2VCaW5kaW5ncyhldmVudCk7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB3aGV0aGVyIHRoZSBrZXkgYmluZGluZyBmaWx0ZXIgaXMgZW5hYmxlZC4KKwkJICogCisJCSAqIEByZXR1cm4gV2hldGhlciB0aGUga2V5IGZpbHRlciBpcyBlbmFibGVkLgorCQkgKi8KKwkJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJcmV0dXJuIGVuYWJsZWQ7CisJCX0KKworCQkvKioKKwkJICogU2V0cyB3aGV0aGVyIHRoaXMgZmlsdGVyIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgKiAKKwkJICogQHBhcmFtIGVuYWJsZWQKKwkJICogICAgICAgICAgICBXaGV0aGVyIGtleSBiaW5kaW5nIGZpbHRlciBzaG91bGQgYmUgZW5hYmxlZC4KKwkJICovCisJCXB1YmxpYyBmaW5hbCB2b2lkIHNldEVuYWJsZWQoZmluYWwgYm9vbGVhbiBlbmFibGVkKSB7CisJCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworCQl9CisJfQorCisJLyoqIFRoZSBjb2xsZWN0aW9uIG9mIGtleXMgdGhhdCBhcmUgdG8gYmUgcHJvY2Vzc2VkIG91dC1vZi1vcmRlci4gKi8KKwlzdGF0aWMgS2V5U2VxdWVuY2Ugb3V0T2ZPcmRlcktleXM7CisKKwlzdGF0aWMgeworCisJCXRyeSB7CisJCQlvdXRPZk9yZGVyS2V5cyA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKCJFU0MgREVMIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJb3V0T2ZPcmRlcktleXMgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZSgpOworCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IHBhcnNlIG91dC1vZi1vcmRlciBrZXlzIGRlZmluaXRpb246ICdFU0MgREVMJy4gIENvbnRpbnVpbmcgd2l0aCBubyBvdXQtb2Ytb3JkZXIga2V5cy4iOyAvLyROT04tTkxTLTEkCisJCQkvLyBUT0RPIHdlIG5lZWQgdG8gZG8gc29tZSBsb2dnaW5nIGhlcmUKKwkJfQorCX0KKworCS8qKgorCSAqIEdlbmVyYXRlcyBhbnkga2V5IHN0cm9rZXMgdGhhdCBhcmUgbmVhciBtYXRjaGVzIHRvIHRoZSBnaXZlbiBldmVudC4gVGhlIGZpcnN0IHN1Y2gga2V5IHN0cm9rZQorCSAqIGlzIGFsd2F5cyB0aGUgZXhhY3RseSBtYXRjaGluZyBrZXkgc3Ryb2tlLgorCSAqIAorCSAqIEBwYXJhbSBldmVudAorCSAqICAgICAgICAgICAgVGhlIGV2ZW50IGZyb20gd2hpY2ggdGhlIGtleSBzdHJva2VzIHNob3VsZCBiZSBnZW5lcmF0ZWQ7IG11c3Qgbm90IGJlCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIFRoZSBzZXQgb2YgbmVhcmx5IG1hdGNoaW5nIGtleSBzdHJva2VzLiBJdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IG1heSBiZQorCSAqICAgICAgICAgZW1wdHkuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PEtleVN0cm9rZT4gZ2VuZXJhdGVQb3NzaWJsZUtleVN0cm9rZXMoRXZlbnQgZXZlbnQpIHsKKwkJZmluYWwgTGlzdDxLZXlTdHJva2U+IGtleVN0cm9rZXMgPSBuZXcgQXJyYXlMaXN0PEtleVN0cm9rZT4oMyk7CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBub3QgYSBrZXlib2FyZCBldmVudCwgdGhlbiB0aGVyZSBhcmUgbm8ga2V5IHN0cm9rZXMuIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBhcmUKKwkJICogbGlzdGVuaW5nIHRvIGZvY3VzIHRyYXZlcnNhbCBldmVudHMuCisJCSAqLworCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSAwKSAmJiAoZXZlbnQua2V5Q29kZSA9PSAwKSAmJiAoZXZlbnQuY2hhcmFjdGVyID09IDApKSB7CisJCQlyZXR1cm4ga2V5U3Ryb2tlczsKKwkJfQorCisJCS8vIEFkZCBlYWNoIHVuaXF1ZSBrZXkgc3Ryb2tlIHRvIHRoZSBsaXN0IGZvciBjb25zaWRlcmF0aW9uLgorCQlmaW5hbCBpbnQgZmlyc3RBY2NlbGVyYXRvciA9IFNXVEtleVN1cHBvcnQuY29udmVydEV2ZW50VG9Vbm1vZGlmaWVkQWNjZWxlcmF0b3IoZXZlbnQpOworCQlrZXlTdHJva2VzLmFkZChTV1RLZXlTdXBwb3J0LmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKGZpcnN0QWNjZWxlcmF0b3IpKTsKKworCQkvLyBXZSBzaG91bGRuJ3QgYWxsb3cgZGVsZXRlIHRvIHVuZGVyZ28gc2hpZnQgcmVzb2x1dGlvbi4KKwkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMKSB7CisJCQlyZXR1cm4ga2V5U3Ryb2tlczsKKwkJfQorCisJCWZpbmFsIGludCBzZWNvbmRBY2NlbGVyYXRvciA9IFNXVEtleVN1cHBvcnQKKwkJCQkuY29udmVydEV2ZW50VG9VbnNoaWZ0ZWRNb2RpZmllZEFjY2VsZXJhdG9yKGV2ZW50KTsKKwkJaWYgKHNlY29uZEFjY2VsZXJhdG9yICE9IGZpcnN0QWNjZWxlcmF0b3IpIHsKKwkJCWtleVN0cm9rZXMuYWRkKFNXVEtleVN1cHBvcnQuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2Uoc2Vjb25kQWNjZWxlcmF0b3IpKTsKKwkJfQorCisJCWZpbmFsIGludCB0aGlyZEFjY2VsZXJhdG9yID0gU1dUS2V5U3VwcG9ydC5jb252ZXJ0RXZlbnRUb01vZGlmaWVkQWNjZWxlcmF0b3IoZXZlbnQpOworCQlpZiAoKHRoaXJkQWNjZWxlcmF0b3IgIT0gc2Vjb25kQWNjZWxlcmF0b3IpICYmICh0aGlyZEFjY2VsZXJhdG9yICE9IGZpcnN0QWNjZWxlcmF0b3IpKSB7CisJCQlrZXlTdHJva2VzLmFkZChTV1RLZXlTdXBwb3J0LmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKHRoaXJkQWNjZWxlcmF0b3IpKTsKKwkJfQorCisJCXJldHVybiBrZXlTdHJva2VzOworCX0KKworCS8qKgorCSAqIDxwPgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gZXZlbnQgcmVwcmVzZW50cyBhIGtleSBwcmVzcyB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGFzIGFuCisJICogb3V0LW9mLW9yZGVyIGV2ZW50LiBBbiBvdXQtb2Ytb3JkZXIga2V5IHByZXNzIGlzIG9uZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgZm9jdXMgY29udHJvbAorCSAqIGZpcnN0LiBPbmx5IGlmIHRoZSBmb2N1cyBjb250cm9sIGZhaWxzIHRvIHJlc3BvbmQgd2lsbCB0aGUgcmVndWxhciBrZXkgYmluZGluZ3MgZ2V0IGFwcGxpZWQuCisJICogPC9wPgorCSAqIDxwPgorCSAqIENhcmUgbXVzdCBiZSB0YWtlbiBpbiBjaG9vc2luZyB3aGljaCBrZXlzIGFyZSBjaG9zZW4gYXMgb3V0LW9mLW9yZGVyIGtleXMuIFRoaXMgbWV0aG9kIGhhcworCSAqIG9ubHkgYmVlbiBkZXNpZ25lZCBhbmQgdGVzdCB0byB3b3JrIHdpdGggdGhlIHVubW9kaWZpZWQgIkVzY2FwZSIga2V5IHN0cm9rZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGtleVN0cm9rZXMKKwkgKiAgICAgICAgICAgIFRoZSBrZXkgc3Ryb2tlIGluIHdoaWNoIHRvIGxvb2sgZm9yIG91dC1vZi1vcmRlciBrZXlzOyBtdXN0IG5vdCBiZQorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUga2V5IGlzIGFuIG91dC1vZi1vcmRlciBrZXk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc091dE9mT3JkZXJLZXkoTGlzdDxLZXlTdHJva2U+IGtleVN0cm9rZXMpIHsKKwkJLy8gQ29tcGFyZSB0byBzZWUgaWYgb25lIG9mIHRoZSBwb3NzaWJsZSBrZXkgc3Ryb2tlcyBpcyBvdXQgb2Ygb3JkZXIuCisJCWZpbmFsIEtleVN0cm9rZVtdIG91dE9mT3JkZXJLZXlTdHJva2VzID0gb3V0T2ZPcmRlcktleXMuZ2V0S2V5U3Ryb2tlcygpOworCQlmaW5hbCBpbnQgb3V0T2ZPcmRlcktleVN0cm9rZXNMZW5ndGggPSBvdXRPZk9yZGVyS2V5U3Ryb2tlcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb3V0T2ZPcmRlcktleVN0cm9rZXNMZW5ndGg7IGkrKykgeworCQkJaWYgKGtleVN0cm9rZXMuY29udGFpbnMob3V0T2ZPcmRlcktleVN0cm9rZXNbaV0pKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGFmdGVyIHByZXNzaW5nIGEga2V5IGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBrZXkgYXNzaXN0CisJICogZGlhbG9nLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxBWSA9IDEwMDA7CisKKwlwcml2YXRlIEVCaW5kaW5nU2VydmljZSBiaW5kaW5nU2VydmljZTsKKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisKKwlwcml2YXRlIEVIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmljZTsKKworCS8qKgorCSAqIFRoZSBsaXN0ZW5lciB0aGF0IHJ1bnMga2V5IGV2ZW50cyBwYXN0IHRoZSBnbG9iYWwga2V5IGJpbmRpbmdzLgorCSAqLworCXByaXZhdGUgZmluYWwgS2V5RG93bkZpbHRlciBrZXlEb3duRmlsdGVyID0gbmV3IEtleURvd25GaWx0ZXIoKTsKKworCS8qKgorCSAqIFRoZSBzaW5nbGUgb3V0LW9mLW9yZGVyIGxpc3RlbmVyIHVzZWQgYnkgdGhlIHdvcmtiZW5jaC4gVGhpcyBsaXN0ZW5lciBpcyBhdHRhY2hlZCB0byBvbmUKKwkgKiB3aWRnZXQgYXQgYSB0aW1lLCBhbmQgaXMgdXNlZCB0byBjYXRjaCBrZXkgZG93biBldmVudHMgYWZ0ZXIgYWxsIHByb2Nlc3NpbmcgaXMgZG9uZS4gVGhpcworCSAqIHRlY2huaXF1ZSBpcyB1c2VkIHNvIHRoYXQgc29tZSBrZXlzIHdpbGwgaGF2ZSB0aGVpciBuYXRpdmUgYmVoYXZpb3VyIGhhcHBlbiBmaXJzdC4KKwkgKiAKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHJpdmF0ZSBmaW5hbCBPdXRPZk9yZGVyTGlzdGVuZXIgb3V0T2ZPcmRlckxpc3RlbmVyID0gbmV3IE91dE9mT3JkZXJMaXN0ZW5lcih0aGlzKTsKKworCS8vIFRPRE8gUkFQIHVuc3VwcG9ydGVkCisJLy8gLyoqCisJLy8gKiBUaGUgc2luZ2xlIG91dC1vZi1vcmRlciB2ZXJpZnkgbGlzdGVuZXIgdXNlZCBieSB0aGUgd29ya2JlbmNoLiBUaGlzIGxpc3RlbmVyIGlzIGF0dGFjaGVkIHRvCisJLy8gKiBvbmU8L2NvZGU+IFN0eWxlZFRleHQ8L2NvZGU+IGF0IGEgdGltZSwgYW5kIGlzIHVzZWQgdG8gY2F0Y2ggdmVyaWZ5IGV2ZW50cyBhZnRlciBhbGwKKwkvLyAqIHByb2Nlc3NpbmcgaXMgZG9uZS4gVGhpcyB0ZWNobmlxdWUgaXMgdXNlZCBzbyB0aGF0IHNvbWUga2V5cyB3aWxsIGhhdmUgdGhlaXIgbmF0aXZlCisJLy8gYmVoYXZpb3VyCisJLy8gKiBoYXBwZW4gZmlyc3QuCisJLy8gKgorCS8vICogQHNpbmNlIDMuMQorCS8vICovCisJLy8gcHJpdmF0ZSBmaW5hbCBPdXRPZk9yZGVyVmVyaWZ5TGlzdGVuZXIgb3V0T2ZPcmRlclZlcmlmeUxpc3RlbmVyID0gbmV3CisJLy8gT3V0T2ZPcmRlclZlcmlmeUxpc3RlbmVyKAorCS8vIG91dE9mT3JkZXJMaXN0ZW5lcik7CisKKwkvKioKKwkgKiBUaGUgbW9kZSBpcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5IGJpbmRpbmcgYXJjaGl0ZWN0dXJlLiBJbiB0aGUgY2FzZSBvZiBtdWx0aS1zdHJva2UKKwkgKiBrZXkgYmluZGluZ3MsIHRoaXMgY2FuIGJlIGEgcGFydGlhbGx5IGNvbXBsZXRlIGtleSBiaW5kaW5nLgorCSAqLworCXByaXZhdGUgS2V5U2VxdWVuY2Ugc3RhdGUgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZSgpOworCisJcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIExvZ2dlciBsb2dnZXI7CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZCBieSBsb29raW5nIHVwIHRoZSBjdXJyZW50IGhhbmRsZXIgZnJvbSB0aGUKKwkgKiBjb21tYW5kIG1hbmFnZXIuIElmIHRoZXJlIGlzIGEgaGFuZGxlciBhbmQgaXQgaXMgZW5hYmxlZCwgdGhlbiBpdCB0cmllcyB0aGUgYWN0dWFsIGV4ZWN1dGlvbi4KKwkgKiBFeGVjdXRpb24gZmFpbHVyZXMgYXJlIGxvZ2dlZC4gV2hlbiB0aGlzIG1ldGhvZCBjb21wbGV0ZXMsIHRoZSBrZXkgYmluZGluZyBzdGF0ZSBpcyByZXNldC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyYW1ldGVyaXplZENvbW1hbmQKKwkgKiAgICAgICAgICAgIFRoZSBjb21tYW5kIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkOyBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSB0cmlnZ2VyCisJICogICAgICAgICAgICBUaGUgdHJpZ2dlcmluZyBldmVudDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgd2FzIGEgaGFuZGxlcjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgaGFuZGxlciBkb2VzIG5vdCBjb21wbGV0ZSBleGVjdXRpb24gZm9yIHNvbWUgcmVhc29uLiBJdCBpcyB1cCB0byB0aGUKKwkgKiAgICAgICAgICAgICBjYWxsZXIgb2YgdGhpcyBtZXRob2QgdG8gZGVjaWRlIHdoZXRoZXIgdG8gbG9nIHRoZSBtZXNzYWdlLCBkaXNwbGF5IGEgZGlhbG9nLCBvcgorCSAqICAgICAgICAgICAgIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBlbnRpcmVseS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBleGVjdXRlQ29tbWFuZChmaW5hbCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBwYXJhbWV0ZXJpemVkQ29tbWFuZCwKKwkJCWZpbmFsIEV2ZW50IHRyaWdnZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKKworCQkvLyBSZXNldCB0aGUga2V5IGJpbmRpbmcgc3RhdGUgKGNsb3NlIHdpbmRvdywgY2xlYXIgc3RhdHVzIGxpbmUsIGV0Yy4pCisJCXJlc2V0U3RhdGUoZmFsc2UpOworCisJCWZpbmFsIEVIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmljZSA9IGdldEhhbmRsZXJTZXJ2aWNlKCk7CisJCWZpbmFsIENvbW1hbmQgY29tbWFuZCA9IHBhcmFtZXRlcml6ZWRDb21tYW5kLmdldENvbW1hbmQoKTsKKworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IEVjbGlwc2VDb250ZXh0RmFjdG9yeS5jcmVhdGUoImtleXMtc3RhdGljQ29udGV4dCIpOyAvLyROT04tTkxTLTEkCisJCXN0YXRpY0NvbnRleHQuc2V0KEV2ZW50LmNsYXNzLCB0cmlnZ2VyKTsKKworCQlmaW5hbCBib29sZWFuIGNvbW1hbmREZWZpbmVkID0gY29tbWFuZC5pc0RlZmluZWQoKTsKKwkJLy8gYm9vbGVhbiBjb21tYW5kRW5hYmxlZDsKKwkJYm9vbGVhbiBjb21tYW5kSGFuZGxlZCA9IGZhbHNlOworCisJCXRyeSB7CisJCQkvLyBjb21tYW5kRW5hYmxlZCA9IGhhbmRsZXJTZXJ2aWNlLmNhbkV4ZWN1dGUocGFyYW1ldGVyaXplZENvbW1hbmQsIHN0YXRpY0NvbnRleHQpOworCQkJT2JqZWN0IG9iaiA9IEhhbmRsZXJTZXJ2aWNlSW1wbC5sb29rVXBIYW5kbGVyKGNvbnRleHQsIGNvbW1hbmQuZ2V0SWQoKSk7CisJCQlpZiAob2JqICE9IG51bGwpIHsKKwkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUhhbmRsZXIpIHsKKwkJCQkJY29tbWFuZEhhbmRsZWQgPSAoKElIYW5kbGVyKSBvYmopLmlzSGFuZGxlZCgpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbW1hbmRIYW5kbGVkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisKKwkJCWhhbmRsZXJTZXJ2aWNlLmV4ZWN1dGVIYW5kbGVyKHBhcmFtZXRlcml6ZWRDb21tYW5kLCBzdGF0aWNDb250ZXh0KTsKKwkJCWZpbmFsIE9iamVjdCBjb21tYW5kRXhjZXB0aW9uID0gc3RhdGljQ29udGV4dC5nZXQoSGFuZGxlclNlcnZpY2VJbXBsLkhBTkRMRVJfRVhDRVBUSU9OKTsKKwkJCWlmIChjb21tYW5kRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29tbWFuZEV4Y2VwdGlvbikgeworCQkJCWNvbW1hbmRIYW5kbGVkID0gZmFsc2U7CisJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGNvbW1hbmRFeGNlcHRpb24gaW5zdGFuY2VvZiBFeGVjdXRpb25FeGNlcHRpb24pIHsKKwkJCQkJbG9nZ2VyLmVycm9yKChUaHJvd2FibGUpIGNvbW1hbmRFeGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBOb3cgdGhhdCB0aGUgY29tbWFuZCBoYXMgZXhlY3V0ZWQgKGFuZCBoYWQgdGhlIG9wcG9ydHVuaXR5IHRvIHVzZSB0aGUgcmVtZW1iZXJlZAorCQkJICogc3RhdGUgb2YgdGhlIGRpYWxvZyksIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoYXQgaW5mb3JtYXRpb24uCisJCQkgKi8KKwkJCWlmIChrZXlBc3Npc3REaWFsb2cgIT0gbnVsbCkgeworCQkJCWtleUFzc2lzdERpYWxvZy5jbGVhclJlbWVtYmVyZWRTdGF0ZSgpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJc3RhdGljQ29udGV4dC5kaXNwb3NlKCk7CisJCX0KKwkJcmV0dXJuIChjb21tYW5kRGVmaW5lZCAmJiBjb21tYW5kSGFuZGxlZCk7CisJfQorCisJLyoqCisJICogPHA+CisJICogTGF1bmNoZXMgdGhlIGNvbW1hbmQgbWF0Y2hpbmcgYSB0aGUgdHlwZWQga2V5LiBUaGlzIGZpbHRlciBhbiBpbmNvbWluZworCSAqIDxjb2RlPlNXVC5LZXlEb3duPC9jb2RlPiBvciA8Y29kZT5TV1QuVHJhdmVyc2U8L2NvZGU+IGV2ZW50IGF0IHRoZSBsZXZlbCBvZiB0aGUgZGlzcGxheQorCSAqIChpLmUuLCBiZWZvcmUgaXQgcmVhY2hlcyB0aGUgd2lkZ2V0cykuIEl0IGRvZXMgbm90IGFsbG93IHByb2Nlc3NpbmcgaW4gYSBkaWFsb2cgb3IgaWYgdGhlIGtleQorCSAqIHN0cm9rZXMgZG9lcyBub3QgY29udGFpbiBhIG5hdHVyYWwga2V5LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBTb21lIGtleSBzdHJva2VzIChkZWZpbmVkIGFzIGEgcHJvcGVydHkpIGFyZSBkZWNsYXJlZCBhcyBvdXQtb2Ytb3JkZXIga2V5cy4gVGhpcyBtZWFucyB0aGF0CisJICogdGhleSBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSB3aWRnZXQgPGVtPmZpcnN0PC9lbT4uIE9ubHkgaWYgdGhlIG90aGVyIHdpZGdldCBsaXN0ZW5lcnMgZG8gbm8KKwkgKiB1c2VmdWwgd29yayBkb2VzIGl0IHRyeSB0byBwcm9jZXNzIGtleSBiaW5kaW5ncy4gRm9yIGV4YW1wbGUsICJFU0MiIGNhbiBjYW5jZWwgdGhlIGN1cnJlbnQKKwkgKiB3aWRnZXQgYWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUsIHdpdGhvdXQgdHJpZ2dlcmluZyBrZXkgYmluZGluZ3MuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBldmVudAorCSAqICAgICAgICAgICAgVGhlIGluY29taW5nIGV2ZW50OyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZmlsdGVyS2V5U2VxdWVuY2VCaW5kaW5ncyhFdmVudCBldmVudCkgeworCQkvKgorCQkgKiBPbmx5IHByb2Nlc3Mga2V5IHN0cm9rZXMgY29udGFpbmluZyBuYXR1cmFsIGtleXMgdG8gdHJpZ2dlciBrZXkgYmluZGluZ3MuCisJCSAqLworCQlpZiAoKGV2ZW50LmtleUNvZGUgJiBTV1QuTU9ESUZJRVJfTUFTSykgIT0gMCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gQWxsb3cgc3BlY2lhbCBrZXkgb3V0LW9mLW9yZGVyIHByb2Nlc3NpbmcuCisJCUxpc3Q8S2V5U3Ryb2tlPiBrZXlTdHJva2VzID0gZ2VuZXJhdGVQb3NzaWJsZUtleVN0cm9rZXMoZXZlbnQpOworCQlpZiAoaXNPdXRPZk9yZGVyS2V5KGtleVN0cm9rZXMpKSB7CisJCQlXaWRnZXQgd2lkZ2V0ID0gZXZlbnQud2lkZ2V0OworCQkJaWYgKChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCkKKwkJCQkJJiYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuTU9ESUZJRVJfTUFTSykgPT0gMCkKKwkJCQkJJiYgKCh3aWRnZXQgaW5zdGFuY2VvZiBUZXh0KSB8fCAod2lkZ2V0IGluc3RhbmNlb2YgQ29tYm8pCisJCQkJCQkJfHwgKHdpZGdldCBpbnN0YW5jZW9mIEJyb3dzZXIpIHx8ICh3aWRnZXQgaW5zdGFuY2VvZiBDQ29tYm8pKSkgeworCQkJCS8qCisJCQkJICogS0xVREdFLiBCdWcgNTQ2NTQuIFRoZSB0ZXh0IHdpZGdldCByZWxpZXMgb24gbm8gbGlzdGVuZXIgZG9pbmcgYW55IHdvcmsgYmVmb3JlCisJCQkJICogZGlzcGF0Y2hpbmcgdGhlIG5hdGl2ZSBkZWxldGUgZXZlbnQuIFRoaXMgZG9lcyBub3Qgd29yaywgYXMgd2UgYXJlIHJlc3RyaWN0ZWQgdG8KKwkJCQkgKiBsaXN0ZW5lcnMuIEhvd2V2ZXIsIGl0IGNhbiBiZSBzYWlkIHRoYXQgcHJlc3NpbmcgYSBkZWxldGUga2V5IGluIGEgdGV4dCB3aWRnZXQKKwkJCQkgKiB3aWxsIG5ldmVyIHVzZSBrZXkgYmluZGluZ3MuIFRoaXMgY2FuIGJlIHNob3duIGJlIGNvbnNpZGVyaW5nIGhvdyB0aGUgZXZlbnQKKwkJCQkgKiBkaXNwYXRjaGluZyBpcyBleHBlY3RlZCB0byB3b3JrIGluIGEgdGV4dCB3aWRnZXQuIFNvLCB3ZSBzaG91bGQgZG8gbm90aGluZyAuLi4KKwkJCQkgKiBldmVyLgorCQkJCSAqLworCQkJCXJldHVybjsKKwkJCQkvLyBUT0RPIFJBUCB1bnN1cHBvcnRlZAorCQkJCS8vIH0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgeworCQkJCS8vCisJCQkJLy8gaWYgKGV2ZW50LnR5cGUgPT0gU1dULktleURvd24pIHsKKwkJCQkvLyAvKgorCQkJCS8vICogS0xVREdFLiBTb21lIHBlb3BsZSB0cnkgdG8gZG8gdXNlZnVsIHdvcmsgaW4gdmVyaWZ5IGxpc3RlbmVycy4gVGhlIHdheSB2ZXJpZnkKKwkJCQkvLyAqIGxpc3RlbmVycyB3b3JrIGluIFNXVCwgd2UgbmVlZCB0byB2ZXJpZnkgdGhlIGtleSBhcyB3ZWxsOyBvdGhlcndpc2UsIHdlIGNhbid0CisJCQkJLy8gKiBkZXRlY3QgdGhhdCB1c2VmdWwgd29yayBoYXMgYmVlbiBkb25lLgorCQkJCS8vICovCisJCQkJLy8gaWYgKCFvdXRPZk9yZGVyVmVyaWZ5TGlzdGVuZXIuaXNBY3RpdmUoZXZlbnQudGltZSkpIHsKKwkJCQkvLyAoKFN0eWxlZFRleHQpIHdpZGdldCkuYWRkVmVyaWZ5S2V5TGlzdGVuZXIob3V0T2ZPcmRlclZlcmlmeUxpc3RlbmVyKTsKKwkJCQkvLyBvdXRPZk9yZGVyVmVyaWZ5TGlzdGVuZXIuc2V0QWN0aXZlKGV2ZW50LnRpbWUpOworCQkJCS8vIH0KKwkJCQkvLyB9CisJCQkJLy8KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFvdXRPZk9yZGVyTGlzdGVuZXIuaXNBY3RpdmUoZXZlbnQudGltZSkpIHsKKwkJCQkJd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBvdXRPZk9yZGVyTGlzdGVuZXIpOworCQkJCQlvdXRPZk9yZGVyTGlzdGVuZXIuc2V0QWN0aXZlKGV2ZW50LnRpbWUpOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIE90aGVyd2lzZSwgd2UgY291bnQgb24gYSBrZXkgZG93biBhcnJpdmluZyBldmVudHVhbGx5LiBFeHBlY3Rpbmcgb3V0IG9mIG9yZGVyCisJCQkgKiBoYW5kbGluZyBvbiBDdHJsK1RhYiwgZm9yIGV4YW1wbGUsIGlzIGEgYmFkIGlkZWEgKHN0aWNrIHRvIGtleXMgdGhhdCBhcmUgbm90IHdpbmRvdworCQkJICogdHJhdmVyc2FsIGtleXMpLgorCQkJICovCisKKwkJfSBlbHNlIHsKKwkJCXByb2Nlc3NLZXlFdmVudChrZXlTdHJva2VzLCBldmVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVCaW5kaW5nU2VydmljZSBnZXRCaW5kaW5nU2VydmljZSgpIHsKKwkJaWYgKGJpbmRpbmdTZXJ2aWNlID09IG51bGwpIHsKKwkJCWJpbmRpbmdTZXJ2aWNlID0gKEVCaW5kaW5nU2VydmljZSkgY29udGV4dC5nZXQoRUJpbmRpbmdTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIGJpbmRpbmdTZXJ2aWNlOworCX0KKworCXByaXZhdGUgRUhhbmRsZXJTZXJ2aWNlIGdldEhhbmRsZXJTZXJ2aWNlKCkgeworCQlpZiAoaGFuZGxlclNlcnZpY2UgPT0gbnVsbCkgeworCQkJaGFuZGxlclNlcnZpY2UgPSAoRUhhbmRsZXJTZXJ2aWNlKSBjb250ZXh0LmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gaGFuZGxlclNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7CisJCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIGZpbHRlciB0aGF0IHByb2Nlc3NlcyBrZXkgZG93biBhbmQgdHJhdmVyc2UgZXZlbnRzIG9uIHRoZSBkaXNwbGF5LgorCSAqIAorCSAqIEByZXR1cm4gVGhlIGdsb2JhbCBrZXkgZG93biBhbmQgdHJhdmVyc2UgZmlsdGVyOyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgS2V5RG93bkZpbHRlciBnZXRLZXlEb3duRmlsdGVyKCkgeworCQlyZXR1cm4ga2V5RG93bkZpbHRlcjsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGtleSBzZXF1ZW5jZSBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yIGFueSBjb21tYW5kLiBJZiB0aGVyZSBpcyBhIG1hdGNoLAorCSAqIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBpZGVudGlmaWVyIGlzIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBrZXlTZXF1ZW5jZQorCSAqICAgICAgICAgICAgVGhlIGtleSBzZXF1ZW5jZSB0byBjaGVjayBmb3IgYSBtYXRjaDsgbXVzdCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIFRoZSBwZXJmZWN0bHkgbWF0Y2hpbmcgY29tbWFuZDsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29tbWFuZCBtYXRjaGVzLgorCSAqLworCXByaXZhdGUgUGFyYW1ldGVyaXplZENvbW1hbmQgZ2V0UGVyZmVjdE1hdGNoKEtleVNlcXVlbmNlIGtleVNlcXVlbmNlKSB7CisJCUJpbmRpbmcgcGVyZmVjdE1hdGNoID0gZ2V0QmluZGluZ1NlcnZpY2UoKS5nZXRQZXJmZWN0TWF0Y2goa2V5U2VxdWVuY2UpOworCQlyZXR1cm4gcGVyZmVjdE1hdGNoID09IG51bGwgPyBudWxsIDogcGVyZmVjdE1hdGNoLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7CisJfQorCisJLyoqCisJICogQ2hhbmdlcyB0aGUga2V5IGJpbmRpbmcgc3RhdGUgdG8gdGhlIGdpdmVuIHZhbHVlLiBUaGlzIHNob3VsZCBiZSBhbiBpbmNyZW1lbnRhbCBjaGFuZ2UsIGJ1dAorCSAqIHRoZXJlIGFyZSBubyBjaGVja3MgdG8gZ3VhcmFudGVlIHRoaXMgaXMgc28uIEl0IGFsc28gc2V0cyB1cCBhIDxjb2RlPlNoZWxsPC9jb2RlPiB0byBiZQorCSAqIGRpc3BsYXllZCBhZnRlciBvbmUgc2Vjb25kIGhhcyBlbGFwc2VkLiBUaGlzIHNoZWxsIHdpbGwgc2hvdyB0aGUgdXNlciB0aGUgcG9zc2libGUKKwkgKiBjb21wbGV0aW9ucyBmb3Igd2hhdCB0aGV5IGhhdmUgdHlwZWQuCisJICogCisJICogQHBhcmFtIHNlcXVlbmNlCisJICogICAgICAgICAgICBUaGUgbmV3IGtleSBzZXF1ZW5jZSBmb3IgdGhlIHN0YXRlOyBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByaXZhdGUgdm9pZCBpbmNyZW1lbnRTdGF0ZShmaW5hbCBLZXlTZXF1ZW5jZSBzZXF1ZW5jZSkgeworCQlzdGF0ZSA9IHNlcXVlbmNlOworCQkvLyBSZWNvcmQgdGhlIHN0YXJ0aW5nIHRpbWUuCisJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlmaW5hbCBsb25nIG15U3RhcnRUaW1lID0gc3RhcnRUaW1lOworCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7CisJCWRpc3BsYXkudGltZXJFeGVjKERFTEFZLCBuZXcgUnVubmFibGUoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpID4gKG15U3RhcnRUaW1lIC0gREVMQVkpKQorCQkJCQkJJiYgKHN0YXJ0VGltZSA9PSBteVN0YXJ0VGltZSkpIHsKKwkJCQkJQ29sbGVjdGlvbjxCaW5kaW5nPiBwYXJ0aWFsTWF0Y2hlcyA9IGJpbmRpbmdTZXJ2aWNlLmdldFBhcnRpYWxNYXRjaGVzKHNlcXVlbmNlKTsKKwkJCQkJb3BlbktleUFzc2lzdFNoZWxsKHBhcnRpYWxNYXRjaGVzKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJfQorCisJLyoqCisJICogT3BlbnMgYSA8Y29kZT5LZXlBc3Npc3REaWFsb2c8L2NvZGU+IHRvIGFzc2lzdCB0aGUgdXNlciBpbiBjb21wbGV0aW5nIGEgbXVsdGktc3Ryb2tlIGtleQorCSAqIGJpbmRpbmcuIFRoaXMgbWV0aG9kIGxhemlseSBjcmVhdGVzIGEgPGNvZGU+a2V5QXNzaXN0RGlhbG9nPC9jb2RlPiBhbmQgc2hhcmVzIGl0IGJldHdlZW4KKwkgKiBleGVjdXRpb25zLgorCSAqLworCXByaXZhdGUgZmluYWwgdm9pZCBvcGVuS2V5QXNzaXN0U2hlbGwoZmluYWwgQ29sbGVjdGlvbjxCaW5kaW5nPiBiaW5kaW5ncykgeworCQlpZiAoa2V5QXNzaXN0RGlhbG9nID09IG51bGwpIHsKKwkJCWtleUFzc2lzdERpYWxvZyA9IG5ldyBLZXlBc3Npc3REaWFsb2coY29udGV4dCwgdGhpcyk7CisJCX0KKwkJaWYgKGtleUFzc2lzdERpYWxvZy5nZXRTaGVsbCgpID09IG51bGwpIHsKKwkJCWtleUFzc2lzdERpYWxvZy5zZXRQYXJlbnRTaGVsbChnZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSk7CisJCX0KKwkJa2V5QXNzaXN0RGlhbG9nLm9wZW4oYmluZGluZ3MpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGUga2V5IHNlcXVlbmNlIHBhcnRpYWxseSBtYXRjaGVzIG9uIG9mIHRoZSBhY3RpdmUga2V5IGJpbmRpbmdzLgorCSAqIAorCSAqIEBwYXJhbSBrZXlTZXF1ZW5jZQorCSAqICAgICAgICAgICAgVGhlIGtleSBzZXF1ZW5jZSB0byBjaGVjayBmb3IgYSBwYXJ0aWFsIG1hdGNoOyBtdXN0IG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYSBwYXJ0aWFsIG1hdGNoOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRpYWxNYXRjaChLZXlTZXF1ZW5jZSBrZXlTZXF1ZW5jZSkgeworCQlyZXR1cm4gZ2V0QmluZGluZ1NlcnZpY2UoKS5pc1BhcnRpYWxNYXRjaChrZXlTZXF1ZW5jZSk7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBrZXkgc2VxdWVuY2UgcGVyZmVjdGx5IG1hdGNoZXMgb24gb2YgdGhlIGFjdGl2ZSBrZXkgYmluZGluZ3MuCisJICogCisJICogQHBhcmFtIGtleVNlcXVlbmNlCisJICogICAgICAgICAgICBUaGUga2V5IHNlcXVlbmNlIHRvIGNoZWNrIGZvciBhIHBlcmZlY3QgbWF0Y2g7IG11c3QgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIHBlcmZlY3QgbWF0Y2g7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzUGVyZmVjdE1hdGNoKEtleVNlcXVlbmNlIGtleVNlcXVlbmNlKSB7CisJCXJldHVybiBnZXRCaW5kaW5nU2VydmljZSgpLmlzUGVyZmVjdE1hdGNoKGtleVNlcXVlbmNlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcG90ZW50aWFsS2V5U3Ryb2tlcworCSAqIEBwYXJhbSBldmVudAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcmVzcyhMaXN0PEtleVN0cm9rZT4gcG90ZW50aWFsS2V5U3Ryb2tlcywgRXZlbnQgZXZlbnQpIHsKKwkJS2V5U2VxdWVuY2UgZXJyb3JTZXF1ZW5jZSA9IG51bGw7CisJCUNvbGxlY3Rpb248QmluZGluZz4gZXJyb3JNYXRjaCA9IG51bGw7CisKKwkJS2V5U2VxdWVuY2Ugc2VxdWVuY2VCZWZvcmVLZXlTdHJva2UgPSBzdGF0ZTsKKwkJZm9yIChJdGVyYXRvcjxLZXlTdHJva2U+IGl0ZXJhdG9yID0gcG90ZW50aWFsS2V5U3Ryb2tlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlLZXlTZXF1ZW5jZSBzZXF1ZW5jZUFmdGVyS2V5U3Ryb2tlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoc2VxdWVuY2VCZWZvcmVLZXlTdHJva2UsCisJCQkJCWl0ZXJhdG9yLm5leHQoKSk7CisJCQlpZiAoaXNQYXJ0aWFsTWF0Y2goc2VxdWVuY2VBZnRlcktleVN0cm9rZSkpIHsKKwkJCQlpbmNyZW1lbnRTdGF0ZShzZXF1ZW5jZUFmdGVyS2V5U3Ryb2tlKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJfSBlbHNlIGlmIChpc1BlcmZlY3RNYXRjaChzZXF1ZW5jZUFmdGVyS2V5U3Ryb2tlKSkgeworCQkJCWZpbmFsIFBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCA9IGdldFBlcmZlY3RNYXRjaChzZXF1ZW5jZUFmdGVyS2V5U3Ryb2tlKTsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gZXhlY3V0ZUNvbW1hbmQoY21kLCBldmVudCkgfHwgIXNlcXVlbmNlQmVmb3JlS2V5U3Ryb2tlLmlzRW1wdHkoKTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDb21tYW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKChrZXlBc3Npc3REaWFsb2cgIT0gbnVsbCkKKwkJCQkJJiYgKGtleUFzc2lzdERpYWxvZy5nZXRTaGVsbCgpICE9IG51bGwpCisJCQkJCSYmICgoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikgfHwgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQKQorCQkJCQkJCXx8IChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19MRUZUKQorCQkJCQkJCXx8IChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19SSUdIVCkgfHwgKGV2ZW50LmtleUNvZGUgPT0gU1dULkNSKQorCQkJCQkJCXx8IChldmVudC5rZXlDb2RlID09IFNXVC5QQUdFX1VQKSB8fCAoZXZlbnQua2V5Q29kZSA9PSBTV1QuUEFHRV9ET1dOKSkpIHsKKwkJCQkvLyBXZSBkb24ndCB3YW50IHRvIHN3YWxsb3cga2V5Ym9hcmQgbmF2aWdhdGlvbiBrZXlzLgorCQkJCXJldHVybiBmYWxzZTsKKworCQkJfSBlbHNlIHsKKwkJCQlDb2xsZWN0aW9uPEJpbmRpbmc+IG1hdGNoZXMgPSBnZXRCaW5kaW5nU2VydmljZSgpLmdldENvbmZsaWN0c0ZvcigKKwkJCQkJCXNlcXVlbmNlQWZ0ZXJLZXlTdHJva2UpOworCQkJCWlmIChtYXRjaGVzICE9IG51bGwgJiYgIW1hdGNoZXMuaXNFbXB0eSgpKSB7CisJCQkJCWVycm9yU2VxdWVuY2UgPSBzZXF1ZW5jZUFmdGVyS2V5U3Ryb2tlOworCQkJCQllcnJvck1hdGNoID0gbWF0Y2hlczsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmVzZXRTdGF0ZSh0cnVlKTsKKwkJaWYgKHNlcXVlbmNlQmVmb3JlS2V5U3Ryb2tlLmlzRW1wdHkoKSAmJiBlcnJvclNlcXVlbmNlICE9IG51bGwpIHsKKwkJCW9wZW5LZXlBc3Npc3RTaGVsbChlcnJvck1hdGNoKTsKKwkJfQorCQlyZXR1cm4gIXNlcXVlbmNlQmVmb3JlS2V5U3Ryb2tlLmlzRW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiA8cD4KKwkgKiBBY3R1YWxseSBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUga2V5IGV2ZW50IGJ5IGludGVyYWN0aW5nIHdpdGggdGhlCisJICogPGNvZGU+SUNvbW1hbmRNYW5hZ2VyPC9jb2RlPi4gSWYgd29yayBpcyBjYXJyaWVkIG91dCwgdGhlbiB0aGUgZXZlbnQgaXMgc3RvcHBlZCBoZXJlIChpLmUuLAorCSAqIDxjb2RlPmV2ZW50LmRvaXQgPSBmYWxzZTwvY29kZT4pLiBJdCBkb2VzIG5vdCBkbyBhbnkgcHJvY2Vzc2luZyBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcga2V5CisJICogc3Ryb2tlcy4KKwkgKiA8L3A+CisJICogPHA+CisJICogSWYgdGhlIGFjdGl2ZSA8Y29kZT5TaGVsbDwvY29kZT4gaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvbmUgdG8gd2hpY2ggdGhlIHN0YXRlIGlzIGFzc29jaWF0ZWQsCisJICogdGhlbiBhIHJlc2V0IG9jY3Vycy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGtleVN0cm9rZXMKKwkgKiAgICAgICAgICAgIFRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIG1hdGNoaW5nIGtleSBzdHJva2VzOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBwcm9jZXNzOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwl2b2lkIHByb2Nlc3NLZXlFdmVudChMaXN0PEtleVN0cm9rZT4ga2V5U3Ryb2tlcywgRXZlbnQgZXZlbnQpIHsKKwkJLy8gRGlzcGF0Y2ggdGhlIGtleWJvYXJkIHNob3J0Y3V0LCBpZiBhbnkuCisJCWJvb2xlYW4gZWF0S2V5ID0gZmFsc2U7CisJCWlmICgha2V5U3Ryb2tlcy5pc0VtcHR5KCkpIHsKKwkJCWVhdEtleSA9IHByZXNzKGtleVN0cm9rZXMsIGV2ZW50KTsKKwkJfQorCisJCWlmIChlYXRLZXkpIHsKKwkJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCQkJY2FzZSBTV1QuS2V5RG93bjoKKwkJCQlldmVudC5kb2l0ID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFNXVC5UcmF2ZXJzZToKKwkJCQlldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKKwkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQl9CisJCQlldmVudC50eXBlID0gU1dULk5PTkU7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgeworCQlyZXNldFN0YXRlKHRydWUpOworCX0KKworCXByaXZhdGUgdm9pZCByZXNldFN0YXRlKGJvb2xlYW4gY2xlYXJSZW1lbWJlcmVkU3RhdGUpIHsKKwkJc3RhcnRUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisJCXN0YXRlID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2UoKTsKKwkJY2xvc2VNdWx0aUtleUFzc2lzdFNoZWxsKCk7CisJCWlmIChrZXlBc3Npc3REaWFsb2cgIT0gbnVsbCAmJiBjbGVhclJlbWVtYmVyZWRTdGF0ZSkgeworCQkJa2V5QXNzaXN0RGlhbG9nLmNsZWFyUmVtZW1iZXJlZFN0YXRlKCk7CisJCX0KKwl9CisKKwlmaW5hbCBwdWJsaWMgS2V5U2VxdWVuY2UgZ2V0QnVmZmVyKCkgeworCQlyZXR1cm4gc3RhdGU7CisJfQorCisJQEluamVjdAorCXB1YmxpYyB2b2lkIHNldENvbnRleHQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIG11bHRpLXN0cm9rZSBrZXkgYmluZGluZyBhc3Npc3RhbnQgc2hlbGwsIGlmIGl0IGV4aXN0cyBhbmQgaXNuJ3QgYWxyZWFkeSBkaXNwb3NlZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY2xvc2VNdWx0aUtleUFzc2lzdFNoZWxsKCkgeworCQlpZiAoa2V5QXNzaXN0RGlhbG9nICE9IG51bGwpIHsKKwkJCWZpbmFsIFNoZWxsIHNoZWxsID0ga2V5QXNzaXN0RGlhbG9nLmdldFNoZWxsKCk7CisJCQlpZiAoKHNoZWxsICE9IG51bGwpICYmICghc2hlbGwuaXNEaXNwb3NlZCgpKSAmJiAoc2hlbGwuaXNWaXNpYmxlKCkpKSB7CisJCQkJa2V5QXNzaXN0RGlhbG9nLmNsb3NlKHRydWUpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3Mva2V5cy9PdXRPZk9yZGVyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9rZXlzL091dE9mT3JkZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGY0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3Mva2V5cy9PdXRPZk9yZGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmtleXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKKy8qKgorICogQSBsaXN0ZW5lciB0aGF0IG1ha2VzIHN1cmUgdGhhdCBnbG9iYWwga2V5IGJpbmRpbmdzIGFyZSBwcm9jZXNzZWQgaWYgbm8gb3RoZXIgbGlzdGVuZXJzIGRvIGFueQorICogdXNlZnVsIHdvcmsuCisgKiAKKyAqIEBzaW5jZSAzLjAKKyAqLworZmluYWwgY2xhc3MgT3V0T2ZPcmRlckxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgeworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLyoqCisJICogVGhlIHRpbWUgYXQgd2hpY2ggdGhpcyBsaXN0ZW5lciB3YXMgbGFzdCByZWdpc3RlcmVkIHRvIGFuIGV2ZW50LiBUaGlzIGlzIHRoZQorCSAqIDxjb2RlPmV2ZW50LnRpbWU8L2NvZGU+IHZhbHVlLgorCSAqIAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwcml2YXRlIGludCBhY3RpdmUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBrZXlib2FyZCBpbnRlcmZhY2UgdG8gd2hpY2ggdGhlIGV2ZW50IHNob3VsZCBiZSBwYXNzZWQgaWYgaXQgaXMgbm90IGVhdGVuLgorCSAqLworCXByaXZhdGUgZmluYWwgS2V5QmluZGluZ0Rpc3BhdGNoZXIga2V5Ym9hcmQ7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPk91dE9mT3JkZXJMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUga2V5Ym9hcmQKKwkgKiBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIGFsbG93ZWQgdG8gcHJvY2VzcyB1bmVhdGVuIGV2ZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gd29ya2JlbmNoS2V5Ym9hcmQKKwkgKiAgICAgICAgICAgIFRoZSBrZXlib2FyZCBpbnRlcmZhY2UgZm9yIHRoZSB3b3JrYmVuY2ggY2FwYWJsZSBvZiBwcm9jZXNzaW5nIGtleSBiaW5kaW5nczsgbXVzdAorCSAqICAgICAgICAgICAgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBPdXRPZk9yZGVyTGlzdGVuZXIoS2V5QmluZGluZ0Rpc3BhdGNoZXIgd29ya2JlbmNoS2V5Ym9hcmQpIHsKKwkJa2V5Ym9hcmQgPSB3b3JrYmVuY2hLZXlib2FyZDsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHRoZSBrZXkgZG93biBldmVudCBvbiBhIHdpZGdldCBieSBwYXNzaW5nIHVuZWF0ZW4gZXZlbnRzIHRvIHRoZSBrZXkgYmluZGluZworCSAqIGFyY2hpdGVjdHVyZS4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IHNwZWNpYWwga2V5cyB0byByZWFjaCB0aGUgd2lkZ2V0IGZpcnN0IC0tIGJlZm9yZSBiZWluZworCSAqIHByb2Nlc3NlZCBieSB0aGUga2V5IGJpbmRpbmcgYXJjaGl0ZWN0dXJlLgorCSAqIAorCSAqIEBwYXJhbSBldmVudAorCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHByb2Nlc3M7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJLy8gQWx3YXlzIHJlbW92ZSBteXNlbGYgYXMgYSBsaXN0ZW5lci4KKwkJZmluYWwgV2lkZ2V0IHdpZGdldCA9IGV2ZW50LndpZGdldDsKKwkJaWYgKCh3aWRnZXQgIT0gbnVsbCkgJiYgKCF3aWRnZXQuaXNEaXNwb3NlZCgpKSkgeworCQkJd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKGV2ZW50LnR5cGUsIHRoaXMpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIGV2ZW50IGlzIHN0aWxsIHVwIGZvciBncmFicywgdGhlbiByZS1yb3V0ZSB0aHJvdWdoIHRoZSBnbG9iYWwga2V5IGZpbHRlci4KKwkJICovCisJCWlmIChldmVudC5kb2l0KSB7CisJCQlMaXN0PEtleVN0cm9rZT4ga2V5U3Ryb2tlcyA9IEtleUJpbmRpbmdEaXNwYXRjaGVyLmdlbmVyYXRlUG9zc2libGVLZXlTdHJva2VzKGV2ZW50KTsKKwkJCWtleWJvYXJkLnByb2Nlc3NLZXlFdmVudChrZXlTdHJva2VzLCBldmVudCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBsaXN0ZW5lciBoYXMgYmVlbiBob29rZWQgYnkgdGhpcyBldmVudCBhbHJlYWR5LgorCSAqIAorCSAqIEBwYXJhbSB0aW1lUmVnaXN0ZXJlZAorCSAqICAgICAgICAgICAgVGhlIDxjb2RlPmV2ZW50LnRpbWU8L2NvZGU+IGZvciB0aGUgY3VycmVudCBldmVudC4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCBmb3IgYSBkaWZmZXJlbnQgZXZlbnQ7CisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqIAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlmaW5hbCBib29sZWFuIGlzQWN0aXZlKGZpbmFsIGludCB0aW1lUmVnaXN0ZXJlZCkgeworCQlyZXR1cm4gKGFjdGl2ZSA9PSB0aW1lUmVnaXN0ZXJlZCk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZXZlbnQgdGltZSBhdCB3aGljaCB0aGlzIGxpc3RlbmVyIHdhcyBsYXN0IHJlZ2lzdGVyZWQgd2l0aCBhIHdpZGdldC4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZVJlZ2lzdGVyZWQKKwkgKiAgICAgICAgICAgIFRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgbGlzdGVuZXIgd2FzIGxhc3QgcmVnaXN0ZXJlZCB3aXRoIGEgd2lkZ2V0LgorCSAqIAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlmaW5hbCB2b2lkIHNldEFjdGl2ZShmaW5hbCBpbnQgdGltZVJlZ2lzdGVyZWQpIHsKKwkJYWN0aXZlID0gdGltZVJlZ2lzdGVyZWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2tleXMvT3V0T2ZPcmRlclZlcmlmeUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3Mva2V5cy9PdXRPZk9yZGVyVmVyaWZ5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdkMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2tleXMvT3V0T2ZPcmRlclZlcmlmeUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5rZXlzOworCisvL1RPRE8gUkFQIHVuc3VwcG9ydGVkIAorLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcjsKKworLyoqCisgKiBBIGxpc3RlbmVyIHRoYXQgbWFrZXMgc3VyZSB0aGF0IG91dC1vZi1vcmRlciBwcm9jZXNzaW5nIG9jY3VycyBpZiBubyBvdGhlciB2ZXJpZnkgbGlzdGVuZXJzIGRvCisgKiBhbnkgd29yay4KKyAqIAorICogQHNpbmNlIDMuMAorICovCisvLyBUT0RPIFJBUCB1bnN1cHBvcnRlZAorZmluYWwgY2xhc3MgT3V0T2ZPcmRlclZlcmlmeUxpc3RlbmVyIC8qIGltcGxlbWVudHMgVmVyaWZ5S2V5TGlzdGVuZXIgKi97CisJLy8KKwkvLyAvKioKKwkvLyAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgbGlzdGVuZXIgd2FzIGxhc3QgcmVnaXN0ZXJlZCB0byBhbiBldmVudC4gVGhpcyBpcyB0aGUKKwkvLyAqIDxjb2RlPmV2ZW50LnRpbWU8L2NvZGU+IHZhbHVlLgorCS8vICoKKwkvLyAqIEBzaW5jZSAzLjEKKwkvLyAqLworCS8vIHByaXZhdGUgaW50IGFjdGl2ZSA9IEludGVnZXIuTUlOX1ZBTFVFOworCS8vCisJLy8gLyoqCisJLy8gKiBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNoYWluZWQgaW4gaWYgdGhlIHZlcmlmeSBldmVudCBoYXMgbm90IGJlZW4gZWF0ZW4geWV0LgorCS8vICovCisJLy8gcHJpdmF0ZSBPdXRPZk9yZGVyTGlzdGVuZXIgY2hhaW5lZExpc3RlbmVyOworCS8vCisJLy8gLyoqCisJLy8gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPk91dE9mT3JkZXJWZXJpZnlMaXN0ZW5lcjwvY29kZT4gd2l0aCB0aGUgbGlzdGVuZXIgdGhhdAorCS8vICogd2lsbCBiZSBjaGFpbmVkIGluLgorCS8vICoKKwkvLyAqIEBwYXJhbSBvdXRPZk9yZGVyTGlzdGVuZXIKKwkvLyAqIFRoZSBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgd2lkZ2V0IGlmIHRoZSB2ZXJpZnkgZXZlbnQgaXMgbm90CisJLy8gKiBlYXRlbjsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJLy8gKi8KKwkvLyBPdXRPZk9yZGVyVmVyaWZ5TGlzdGVuZXIoT3V0T2ZPcmRlckxpc3RlbmVyIG91dE9mT3JkZXJMaXN0ZW5lcikgeworCS8vIGNoYWluZWRMaXN0ZW5lciA9IG91dE9mT3JkZXJMaXN0ZW5lcjsKKwkvLyB9CisJLy8KKwkvLyAvKioKKwkvLyAqIFJldHVybnMgd2hldGhlciB0aGlzIGxpc3RlbmVyIGhhcyBiZWVuIGhvb2tlZCBieSB0aGlzIGV2ZW50IGFscmVhZHkuCisJLy8gKgorCS8vICogQHBhcmFtIHRpbWVSZWdpc3RlcmVkCisJLy8gKiBUaGUgPGNvZGU+ZXZlbnQudGltZTwvY29kZT4gZm9yIHRoZSBjdXJyZW50IGV2ZW50LgorCS8vICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGEgZGlmZmVyZW50IGV2ZW50OworCS8vICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkvLyAqCisJLy8gKiBAc2luY2UgMy4xCisJLy8gKi8KKwkvLyBmaW5hbCBib29sZWFuIGlzQWN0aXZlKGZpbmFsIGludCB0aW1lUmVnaXN0ZXJlZCkgeworCS8vIHJldHVybiAoYWN0aXZlID09IHRpbWVSZWdpc3RlcmVkKTsKKwkvLyB9CisJLy8KKwkvLyAvKioKKwkvLyAqIFNldHMgdGhlIGV2ZW50IHRpbWUgYXQgd2hpY2ggdGhpcyBsaXN0ZW5lciB3YXMgbGFzdCByZWdpc3RlcmVkIHdpdGggYSB3aWRnZXQuCisJLy8gKgorCS8vICogQHBhcmFtIHRpbWVSZWdpc3RlcmVkCisJLy8gKiBUaGUgdGltZSBhdCB3aGljaCB0aGlzIGxpc3RlbmVyIHdhcyBsYXN0IHJlZ2lzdGVyZWQgd2l0aCBhIHdpZGdldC4KKwkvLyAqCisJLy8gKiBAc2luY2UgMy4xCisJLy8gKi8KKwkvLyBmaW5hbCB2b2lkIHNldEFjdGl2ZShmaW5hbCBpbnQgdGltZVJlZ2lzdGVyZWQpIHsKKwkvLyBhY3RpdmUgPSB0aW1lUmVnaXN0ZXJlZDsKKwkvLyB9CisJLy8KKwkvLyAvKioKKwkvLyAqIENoZWNrcyB3aGV0aGVyIGFueSBvdGhlciB2ZXJpZnkgbGlzdGVuZXJzIGhhdmUgdHJpZ2dlcmVkLiBJZiBub3QsIHRoZW4gaXQgc2V0cyB1cCB0aGUKKwkvLyAqIHRvcC1sZXZlbCBvdXQtb2Ytb3JkZXIgbGlzdGVuZXIuCisJLy8gKgorCS8vICogQHBhcmFtIGV2ZW50CisJLy8gKiBUaGUgdmVyaWZ5IGV2ZW50IGFmdGVyIGl0IGhhcyBiZWVuIHByb2Nlc3NlZCBieSBhbGwgb3RoZXIgdmVyaWZ5IGxpc3RlbmVyczsgbXVzdAorCS8vICogbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCS8vICovCisJLy8gcHVibGljIHZvaWQgdmVyaWZ5S2V5KFZlcmlmeUV2ZW50IGV2ZW50KSB7CisJLy8gLy8gQWx3YXlzIHJlbW92ZSB0aGUgbGlzdGVuZXIuCisJLy8gZmluYWwgV2lkZ2V0IHdpZGdldCA9IGV2ZW50LndpZGdldDsKKwkvLyBpZiAoKHdpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpICYmICghd2lkZ2V0LmlzRGlzcG9zZWQoKSkpIHsKKwkvLyAoKFN0eWxlZFRleHQpIHdpZGdldCkucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7CisJLy8gfQorCS8vCisJLy8gLyoKKwkvLyAqIElmIHRoZSBldmVudCBpcyBzdGlsbCB1cCBmb3IgZ3JhYnMsIHRoZW4gcmUtcm91dGUgdGhyb3VnaCB0aGUgZ2xvYmFsIGtleSBmaWx0ZXIuCisJLy8gKi8KKwkvLyBpZiAoZXZlbnQuZG9pdCkgeworCS8vIHdpZGdldC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgQ2FuY2VsT25Nb2RpZnlMaXN0ZW5lcihjaGFpbmVkTGlzdGVuZXIpKTsKKwkvLyB3aWRnZXQuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGNoYWluZWRMaXN0ZW5lcik7CisJLy8gfQorCS8vIH0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL0JpbmRpbmdTZXJ2aWNlQWRkb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL0JpbmRpbmdTZXJ2aWNlQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgyMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3MvQmluZGluZ1NlcnZpY2VBZGRvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3M7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsLkJpbmRpbmdTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5pbnRlcm5hbC5CaW5kaW5nVGFibGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsLkNvbnRleHRTZXQ7CisKKy8qKgorICogUHJvdmlkZSB0aGUgYmluZGluZyBhbmQgY29udGV4dCBpZCBzZXJ2aWNlcyBhcyBhbiBhZGQtb24uIE11c3QgYmUgaW5zdGFudGlhdGVkIGFnYWluc3QgdGhlCisgKiBhcHBsaWNhdGlvbiBsZXZlbCBjb250ZXh0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluZGluZ1NlcnZpY2VBZGRvbiB7CisJLyoqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIgPSBjb250ZXh0LmdldChDb250ZXh0TWFuYWdlci5jbGFzcyk7CisJCUNvbnRleHRTZXQuc2V0Q29tcGFyYXRvcihuZXcgQ29udGV4dFNldC5DQ29tcChjb250ZXh0TWFuYWdlcikpOworCisJCWNvbnRleHQuc2V0KEJpbmRpbmdUYWJsZU1hbmFnZXIuY2xhc3MsCisJCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShCaW5kaW5nVGFibGVNYW5hZ2VyLmNsYXNzLCBjb250ZXh0KSk7CisKKwkJY29udGV4dC5zZXQoRUJpbmRpbmdTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbmV3IEJpbmRpbmdTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbigpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9FQmluZGluZ1NlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL0VCaW5kaW5nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDA3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9FQmluZGluZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7CisKKy8qKgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVCaW5kaW5nU2VydmljZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfQ09OVEVYVF9JRCA9ICJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2ciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUVfSUQgPSAib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9UT19CSU5ESU5HX0tFWSA9ICJiaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9TQ0hFTUVfVEFHID0gImFjdGl2ZVNjaGVtZUlkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9JRF9BVFRSX1RBRyA9ICJzY2hlbWVJZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfQVRUUl9UQUcgPSAibG9jYWxlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0FUVFJfVEFHID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVRUUl9UQUcgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEX0JJTkRJTkdfVEFHID0gImRlbGV0ZWQiOyAvLyROT04tTkxTLTEkCisKKwlCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoVHJpZ2dlclNlcXVlbmNlIHNlcXVlbmNlLCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgY29udGV4dElkLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVzKTsKKworCXZvaWQgYWN0aXZhdGVCaW5kaW5nKEJpbmRpbmcgYmluZGluZyk7CisKKwl2b2lkIGRlYWN0aXZhdGVCaW5kaW5nKEJpbmRpbmcgYmluZGluZyk7CisKKwlUcmlnZ2VyU2VxdWVuY2UgY3JlYXRlU2VxdWVuY2UoU3RyaW5nIHNlcXVlbmNlKTsKKworCUNvbGxlY3Rpb248QmluZGluZz4gZ2V0Q29uZmxpY3RzRm9yKFRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSk7CisKKwlDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEFsbENvbmZsaWN0cygpOworCisJQmluZGluZyBnZXRQZXJmZWN0TWF0Y2goVHJpZ2dlclNlcXVlbmNlIHRyaWdnZXIpOworCisJYm9vbGVhbiBpc1BhcnRpYWxNYXRjaChUcmlnZ2VyU2VxdWVuY2Uga2V5U2VxdWVuY2UpOworCisJYm9vbGVhbiBpc1BlcmZlY3RNYXRjaChUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UpOworCisJVHJpZ2dlclNlcXVlbmNlIGdldEJlc3RTZXF1ZW5jZUZvcihQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kKTsKKworCUNvbGxlY3Rpb248VHJpZ2dlclNlcXVlbmNlPiBnZXRTZXF1ZW5jZXNGb3IoUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCk7CisKKwlDb2xsZWN0aW9uPEJpbmRpbmc+IGdldFBhcnRpYWxNYXRjaGVzKFRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSk7CisKKwlDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEFjdGl2ZUJpbmRpbmdzKCk7CisKKwlDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEJpbmRpbmdzRm9yKFBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCk7Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9CaW5kaW5nU2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0JpbmRpbmdTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTkyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9CaW5kaW5nU2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQmluZGluZ1NlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uIGV4dGVuZHMgQ29udGV4dEZ1bmN0aW9uIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29tcHV0ZShJRWNsaXBzZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGNvbnRleHRLZXkpIHsKKwkJcmV0dXJuIENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoQmluZGluZ1NlcnZpY2VJbXBsLmNsYXNzLCBjb250ZXh0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0JpbmRpbmdTZXJ2aWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3MvaW50ZXJuYWwvQmluZGluZ1NlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwZjdmNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0JpbmRpbmdTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLkVCaW5kaW5nU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5kaW5nU2VydmljZUltcGwgaW1wbGVtZW50cyBFQmluZGluZ1NlcnZpY2UgeworCisJZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJVkVfQ09OVEVYVFMgPSAiYWN0aXZlQ29udGV4dHMiOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIFN0cmluZyBVU0VSX1RZUEUgPSAidXNlciI7IC8vJE5PTi1OTFMtMSQKKworCUBJbmplY3QKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJQEluamVjdAorCXByaXZhdGUgQmluZGluZ1RhYmxlTWFuYWdlciBtYW5hZ2VyOworCisJQEluamVjdAorCXByaXZhdGUgQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXI7CisKKwlwcml2YXRlIENvbnRleHRTZXQgY29udGV4dFNldCA9IENvbnRleHRTZXQuRU1QVFk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQmluZGluZyBjcmVhdGVCaW5kaW5nKFRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSwgUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCwKKwkJCVN0cmluZyBjb250ZXh0SWQsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlcykgeworCisJCVN0cmluZyBzY2hlbWVJZCA9IERFRkFVTFRfU0NIRU1FX0lEOworCQlTdHJpbmcgbG9jYWxlID0gbnVsbDsKKwkJU3RyaW5nIHBsYXRmb3JtID0gbnVsbDsKKwkJaW50IGJpbmRpbmdUeXBlID0gQmluZGluZy5TWVNURU07CisKKwkJaWYgKHNlcXVlbmNlICE9IG51bGwgJiYgIXNlcXVlbmNlLmlzRW1wdHkoKSAmJiBjb250ZXh0SWQgIT0gbnVsbCkgeworCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJCVN0cmluZyB0bXAgPSBhdHRyaWJ1dGVzLmdldChTQ0hFTUVfSURfQVRUUl9UQUcpOworCQkJCWlmICh0bXAgIT0gbnVsbCAmJiB0bXAubGVuZ3RoKCkgPiAwKSB7CisJCQkJCXNjaGVtZUlkID0gdG1wOworCQkJCX0KKwkJCQlsb2NhbGUgPSBhdHRyaWJ1dGVzLmdldChMT0NBTEVfQVRUUl9UQUcpOworCQkJCXBsYXRmb3JtID0gYXR0cmlidXRlcy5nZXQoUExBVEZPUk1fQVRUUl9UQUcpOworCQkJCWlmIChVU0VSX1RZUEUuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0KFRZUEVfQVRUUl9UQUcpKSkgeworCQkJCQliaW5kaW5nVHlwZSA9IEJpbmRpbmcuVVNFUjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbmV3IEtleUJpbmRpbmcoKEtleVNlcXVlbmNlKSBzZXF1ZW5jZSwgY29tbWFuZCwgc2NoZW1lSWQsIGNvbnRleHRJZCwgbG9jYWxlLAorCQkJCQlwbGF0Zm9ybSwgbnVsbCwgYmluZGluZ1R5cGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFjdGl2YXRlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpIHsKKwkJU3RyaW5nIGNvbnRleHRJZCA9IGJpbmRpbmcuZ2V0Q29udGV4dElkKCk7CisJCUJpbmRpbmdUYWJsZSB0YWJsZSA9IG1hbmFnZXIuZ2V0VGFibGUoY29udGV4dElkKTsKKwkJaWYgKHRhYmxlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQl0YWJsZS5hZGRCaW5kaW5nKGJpbmRpbmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGVCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgeworCQlTdHJpbmcgY29udGV4dElkID0gYmluZGluZy5nZXRDb250ZXh0SWQoKTsKKwkJQmluZGluZ1RhYmxlIHRhYmxlID0gbWFuYWdlci5nZXRUYWJsZShjb250ZXh0SWQpOworCQlpZiAodGFibGUgPT0gbnVsbCkgeworCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIk5vIGJpbmRpbmcgdGFibGUgZm9yICIgKyBjb250ZXh0SWQpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwkJdGFibGUucmVtb3ZlQmluZGluZyhiaW5kaW5nKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVHJpZ2dlclNlcXVlbmNlIGNyZWF0ZVNlcXVlbmNlKFN0cmluZyBzZXF1ZW5jZSkgeworCQl0cnkgeworCQkJcmV0dXJuIEtleVNlcXVlbmNlLmdldEluc3RhbmNlKHNlcXVlbmNlKTsKKwkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJLy8gc2hvdWxkIHByb2JhYmx5IGxvZworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldENvbmZsaWN0c0ZvcihUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJcmV0dXJuIG1hbmFnZXIuZ2V0Q29uZmxpY3RzRm9yKGNvbnRleHRTZXQsIHNlcXVlbmNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRBbGxDb25mbGljdHMoKSB7CisJCXJldHVybiBtYW5hZ2VyLmdldEFsbENvbmZsaWN0cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCaW5kaW5nIGdldFBlcmZlY3RNYXRjaChUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlcikgeworCQlyZXR1cm4gbWFuYWdlci5nZXRQZXJmZWN0TWF0Y2goY29udGV4dFNldCwgdHJpZ2dlcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsTWF0Y2goVHJpZ2dlclNlcXVlbmNlIGtleVNlcXVlbmNlKSB7CisJCXJldHVybiBtYW5hZ2VyLmlzUGFydGlhbE1hdGNoKGNvbnRleHRTZXQsIGtleVNlcXVlbmNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVHJpZ2dlclNlcXVlbmNlIGdldEJlc3RTZXF1ZW5jZUZvcihQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kKSB7CisJCUJpbmRpbmcgYmluZGluZyA9IG1hbmFnZXIuZ2V0QmVzdFNlcXVlbmNlRm9yKGNvbnRleHRTZXQsIGNvbW1hbmQpOworCQlyZXR1cm4gYmluZGluZyA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248VHJpZ2dlclNlcXVlbmNlPiBnZXRTZXF1ZW5jZXNGb3IoUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCkgeworCQlDb2xsZWN0aW9uPEJpbmRpbmc+IGJpbmRpbmdzID0gbWFuYWdlci5nZXRTZXF1ZW5jZXNGb3IoY29udGV4dFNldCwgY29tbWFuZCk7CisJCUFycmF5TGlzdDxUcmlnZ2VyU2VxdWVuY2U+IHNlcXVlbmNlcyA9IG5ldyBBcnJheUxpc3Q8VHJpZ2dlclNlcXVlbmNlPihiaW5kaW5ncy5zaXplKCkpOworCQlmb3IgKEJpbmRpbmcgYmluZGluZyA6IGJpbmRpbmdzKSB7CisJCQlzZXF1ZW5jZXMuYWRkKGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkpOworCQl9CisJCXJldHVybiBzZXF1ZW5jZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248QmluZGluZz4gZ2V0QmluZGluZ3NGb3IoUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCkgeworCQlyZXR1cm4gbWFuYWdlci5nZXRCaW5kaW5nc0Zvcihjb250ZXh0U2V0LCBjb21tYW5kKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1BlcmZlY3RNYXRjaChUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJcmV0dXJuIGdldFBlcmZlY3RNYXRjaChzZXF1ZW5jZSkgIT0gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRQYXJ0aWFsTWF0Y2hlcyhUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJcmV0dXJuIG1hbmFnZXIuZ2V0UGFydGlhbE1hdGNoZXMoY29udGV4dFNldCwgc2VxdWVuY2UpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbnRleHQgZm9yIHRoaXMgc2VydmljZS4KKwkgKi8KKwlwdWJsaWMgSUVjbGlwc2VDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCUBJbmplY3QKKwlwdWJsaWMgdm9pZCBzZXRDb250ZXh0SWRzKEBOYW1lZChBQ1RJVkVfQ09OVEVYVFMpIEBPcHRpb25hbCBTZXQ8U3RyaW5nPiBzZXQpIHsKKwkJaWYgKHNldCA9PSBudWxsIHx8IHNldC5pc0VtcHR5KCkgfHwgY29udGV4dE1hbmFnZXIgPT0gbnVsbCkgeworCQkJY29udGV4dFNldCA9IENvbnRleHRTZXQuRU1QVFk7CisJCQlyZXR1cm47CisJCX0KKwkJQXJyYXlMaXN0PENvbnRleHQ+IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdDxDb250ZXh0PigpOworCQlmb3IgKFN0cmluZyBpZCA6IHNldCkgeworCQkJY29udGV4dHMuYWRkKGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoaWQpKTsKKwkJfQorCQljb250ZXh0U2V0ID0gbWFuYWdlci5jcmVhdGVDb250ZXh0U2V0KGNvbnRleHRzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRBY3RpdmVCaW5kaW5ncygpIHsKKwkJcmV0dXJuIG1hbmFnZXIuZ2V0QWN0aXZlQmluZGluZ3MoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0JpbmRpbmdUYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3MvaW50ZXJuYWwvQmluZGluZ1RhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyY2NhNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0JpbmRpbmdUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLklLZXlMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlMb29rdXBGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOworCisvKioKKyAqIG1hbmFnZSB0YWJsZXMgb2YgYmluZGluZ3MgdGhhdCBjYW4gYmUgdXNlZCB0byBsb29rIHVwIGNvbW1hbmRzIGZyb20ga2V5cy4KKyAqLworcHVibGljIGNsYXNzIEJpbmRpbmdUYWJsZSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVTY2hlbWVzKFN0cmluZ1tdIGFjdGl2ZVNjaGVtZUlkcywgZmluYWwgU3RyaW5nIHNjaGVtZUlkMSwKKwkJCWZpbmFsIFN0cmluZyBzY2hlbWVJZDIpIHsKKwkJaWYgKGFjdGl2ZVNjaGVtZUlkcyA9PSBudWxsIHx8IGFjdGl2ZVNjaGVtZUlkcy5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFzY2hlbWVJZDIuZXF1YWxzKHNjaGVtZUlkMSkpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aXZlU2NoZW1lSWRzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmluYWwgU3RyaW5nIHNjaGVtZVBvaW50ZXIgPSBhY3RpdmVTY2hlbWVJZHNbaV07CisJCQkJaWYgKHNjaGVtZUlkMi5lcXVhbHMoc2NoZW1lUG9pbnRlcikpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfSBlbHNlIGlmIChzY2hlbWVJZDEuZXF1YWxzKHNjaGVtZVBvaW50ZXIpKSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdGljIGNsYXNzIEJpbmRpbmdDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxCaW5kaW5nPiB7CisJCXByaXZhdGUgU3RyaW5nW10gYWN0aXZlU2NoZW1lSWRzOworCisJCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVNjaGVtZXMoU3RyaW5nW10gYWN0aXZlU2NoZW1lSWRzKSB7CisJCQl0aGlzLmFjdGl2ZVNjaGVtZUlkcyA9IGFjdGl2ZVNjaGVtZUlkczsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmdbXSBnZXRBY3RpdmVTY2hlbWVzKCkgeworCQkJcmV0dXJuIHRoaXMuYWN0aXZlU2NoZW1lSWRzOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgY29tcGFyZShCaW5kaW5nIG8xLCBCaW5kaW5nIG8yKSB7CisJCQlpbnQgcmMgPSBjb21wYXJlU2NoZW1lcyhhY3RpdmVTY2hlbWVJZHMsIG8xLmdldFNjaGVtZUlkKCksIG8yLmdldFNjaGVtZUlkKCkpOworCQkJaWYgKHJjICE9IDApIHsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDaGVjayB0byBzZWUgd2hpY2ggaGFzIHRoZSBsZWFzdCBudW1iZXIgb2YgdHJpZ2dlcnMgaW4gdGhlIHRyaWdnZXIgc2VxdWVuY2UuCisJCQkgKi8KKwkJCWZpbmFsIFRyaWdnZXJbXSBiZXN0VHJpZ2dlcnMgPSBvMS5nZXRUcmlnZ2VyU2VxdWVuY2UoKS5nZXRUcmlnZ2VycygpOworCQkJZmluYWwgVHJpZ2dlcltdIGN1cnJlbnRUcmlnZ2VycyA9IG8yLmdldFRyaWdnZXJTZXF1ZW5jZSgpLmdldFRyaWdnZXJzKCk7CisJCQlpbnQgY29tcGFyZVRvID0gYmVzdFRyaWdnZXJzLmxlbmd0aCAtIGN1cnJlbnRUcmlnZ2Vycy5sZW5ndGg7CisJCQlpZiAoY29tcGFyZVRvICE9IDApIHsKKwkJCQlyZXR1cm4gY29tcGFyZVRvOworCQkJfQorCisJCQkvKgorCQkJICogQ29tcGFyZSB0aGUgbnVtYmVyIG9mIGtleXMgcHJlc3NlZCBpbiBlYWNoIHRyaWdnZXIgc2VxdWVuY2UuIFNvbWUgdHlwZXMgb2Yga2V5cyBjb3VudAorCQkJICogbGVzcyB0aGFuIG90aGVycyAoaS5lLiwgc29tZSB0eXBlcyBvZiBtb2RpZmllcnMga2V5cyBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgY2hvc2VuKS4KKwkJCSAqLworCQkJY29tcGFyZVRvID0gY291bnRTdHJva2VzKGJlc3RUcmlnZ2VycykgLSBjb3VudFN0cm9rZXMoY3VycmVudFRyaWdnZXJzKTsKKwkJCWlmIChjb21wYXJlVG8gIT0gMCkgeworCQkJCXJldHVybiBjb21wYXJlVG87CisJCQl9CisKKwkJCS8vIElmIHRoaXMgaXMgc3RpbGwgYSB0aWUsIHRoZW4ganVzdCBjaG9zZSB0aGUgc2hvcnRlc3QgdGV4dC4KKwkJCXJldHVybiBvMS5nZXRUcmlnZ2VyU2VxdWVuY2UoKS5mb3JtYXQoKS5sZW5ndGgoKQorCQkJCQktIG8yLmdldFRyaWdnZXJTZXF1ZW5jZSgpLmZvcm1hdCgpLmxlbmd0aCgpOworCQl9CisKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgY291bnRTdHJva2VzKGZpbmFsIFRyaWdnZXJbXSB0cmlnZ2VycykgeworCQkJaW50IHN0cm9rZUNvdW50ID0gdHJpZ2dlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2Vycy5sZW5ndGg7IGkrKykgeworCQkJCWZpbmFsIFRyaWdnZXIgdHJpZ2dlciA9IHRyaWdnZXJzW2ldOworCQkJCWlmICh0cmlnZ2VyIGluc3RhbmNlb2YgS2V5U3Ryb2tlKSB7CisJCQkJCWZpbmFsIEtleVN0cm9rZSBrZXlTdHJva2UgPSAoS2V5U3Ryb2tlKSB0cmlnZ2VyOworCQkJCQlmaW5hbCBpbnQgbW9kaWZpZXJLZXlzID0ga2V5U3Ryb2tlLmdldE1vZGlmaWVyS2V5cygpOworCQkJCQlmaW5hbCBJS2V5TG9va3VwIGxvb2t1cCA9IEtleUxvb2t1cEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworCQkJCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRBbHQoKSkgIT0gMCkgeworCQkJCQkJc3Ryb2tlQ291bnQgKz0gODsKKwkJCQkJfQorCQkJCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRDdHJsKCkpICE9IDApIHsKKwkJCQkJCXN0cm9rZUNvdW50ICs9IDI7CisJCQkJCX0KKwkJCQkJaWYgKChtb2RpZmllcktleXMgJiBsb29rdXAuZ2V0U2hpZnQoKSkgIT0gMCkgeworCQkJCQkJc3Ryb2tlQ291bnQgKz0gNDsKKwkJCQkJfQorCQkJCQlpZiAoKG1vZGlmaWVyS2V5cyAmIGxvb2t1cC5nZXRDb21tYW5kKCkpICE9IDApIHsKKwkJCQkJCXN0cm9rZUNvdW50ICs9IDI7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzdHJva2VDb3VudCArPSA5OTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBzdHJva2VDb3VudDsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgQmluZGluZ0NvbXBhcmF0b3IgQkVTVF9TRVFVRU5DRSA9IG5ldyBCaW5kaW5nQ29tcGFyYXRvcigpOworCisJcHJpdmF0ZSBDb250ZXh0IHRhYmxlSWQ7CisJcHJpdmF0ZSBBcnJheUxpc3Q8QmluZGluZz4gYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7CisJcHJpdmF0ZSBNYXA8VHJpZ2dlclNlcXVlbmNlLCBCaW5kaW5nPiBiaW5kaW5nc0J5VHJpZ2dlciA9IG5ldyBIYXNoTWFwPFRyaWdnZXJTZXF1ZW5jZSwgQmluZGluZz4oKTsKKwlwcml2YXRlIE1hcDxQYXJhbWV0ZXJpemVkQ29tbWFuZCwgQXJyYXlMaXN0PEJpbmRpbmc+PiBiaW5kaW5nc0J5Q29tbWFuZCA9IG5ldyBIYXNoTWFwPFBhcmFtZXRlcml6ZWRDb21tYW5kLCBBcnJheUxpc3Q8QmluZGluZz4+KCk7CisJcHJpdmF0ZSBNYXA8VHJpZ2dlclNlcXVlbmNlLCBBcnJheUxpc3Q8QmluZGluZz4+IGJpbmRpbmdzQnlQcmVmaXggPSBuZXcgSGFzaE1hcDxUcmlnZ2VyU2VxdWVuY2UsIEFycmF5TGlzdDxCaW5kaW5nPj4oKTsKKwlwcml2YXRlIE1hcDxUcmlnZ2VyU2VxdWVuY2UsIEFycmF5TGlzdDxCaW5kaW5nPj4gY29uZmxpY3RzID0gbmV3IEhhc2hNYXA8VHJpZ2dlclNlcXVlbmNlLCBBcnJheUxpc3Q8QmluZGluZz4+KCk7CisJcHJpdmF0ZSBNYXA8VHJpZ2dlclNlcXVlbmNlLCBBcnJheUxpc3Q8QmluZGluZz4+IG9yZGVyZWRCaW5kaW5nc0J5VHJpZ2dlciA9IG5ldyBIYXNoTWFwPFRyaWdnZXJTZXF1ZW5jZSwgQXJyYXlMaXN0PEJpbmRpbmc+PigpOworCisJLyoqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgQmluZGluZ1RhYmxlKENvbnRleHQgY29udGV4dCkgeworCQl0YWJsZUlkID0gY29udGV4dDsKKwl9CisKKwlwdWJsaWMgQ29udGV4dCBnZXRUYWJsZUlkKCkgeworCQlyZXR1cm4gdGFibGVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gdGFibGVJZC5nZXRJZCgpOworCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldENvbmZsaWN0cygpIHsKKwkJQ29sbGVjdGlvbjxCaW5kaW5nPiBjb25mbGljdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nPigpOworCQlmb3IgKFRyaWdnZXJTZXF1ZW5jZSBrZXkgOiBjb25mbGljdHMua2V5U2V0KCkpIHsKKwkJCUFycmF5TGlzdDxCaW5kaW5nPiBjb25mbGljdHNGb3JUcmlnZ2VyID0gY29uZmxpY3RzLmdldChrZXkpOworCQkJaWYgKGNvbmZsaWN0c0ZvclRyaWdnZXIgIT0gbnVsbCkgeworCQkJCWNvbmZsaWN0c0xpc3QuYWRkQWxsKGNvbmZsaWN0c0ZvclRyaWdnZXIpOworCQkJfQorCQl9CisJCXJldHVybiBjb25mbGljdHNMaXN0OworCX0KKworCS8vIGNoZWNrcyBib3RoIHRoZSBhY3RpdmUgYmluZGluZ3MgYW5kIGNvbmZsaWN0cyBsaXN0CisJcHVibGljIENvbGxlY3Rpb248QmluZGluZz4gZ2V0Q29uZmxpY3RzRm9yKFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyU2VxdWVuY2UpIHsKKwkJcmV0dXJuIGNvbmZsaWN0cy5nZXQodHJpZ2dlclNlcXVlbmNlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgeworCQlpZiAoIWdldElkKCkuZXF1YWxzKGJpbmRpbmcuZ2V0Q29udGV4dElkKCkpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCaW5kaW5nIGNvbnRleHQgIiArIGJpbmRpbmcuZ2V0Q29udGV4dElkKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkrICIgZG9lcyBub3QgbWF0Y2ggIiArIGdldElkKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJQXJyYXlMaXN0PEJpbmRpbmc+IGJpbmRpbmdMaXN0ID0gb3JkZXJlZEJpbmRpbmdzQnlUcmlnZ2VyLmdldChiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKTsKKwkJQmluZGluZyBwb3NzaWJsZUNvbmZsaWN0ID0gYmluZGluZ3NCeVRyaWdnZXIuZ2V0KGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkpOworCQlpZiAoYmluZGluZ0xpc3QgPT0gbnVsbCB8fCBiaW5kaW5nTGlzdC5pc0VtcHR5KCkpIHsKKwkJCWlmIChwb3NzaWJsZUNvbmZsaWN0ICE9IG51bGwpIHsKKwkJCQlpZiAoYmluZGluZ0xpc3QgPT0gbnVsbCkgeworCQkJCQliaW5kaW5nTGlzdCA9IG5ldyBBcnJheUxpc3Q8QmluZGluZz4oKTsKKwkJCQkJb3JkZXJlZEJpbmRpbmdzQnlUcmlnZ2VyLnB1dChiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpLCBiaW5kaW5nTGlzdCk7CisJCQkJfQorCQkJCWJpbmRpbmdMaXN0LmFkZChiaW5kaW5nKTsKKwkJCQliaW5kaW5nTGlzdC5hZGQocG9zc2libGVDb25mbGljdCk7CisJCQkJQ29sbGVjdGlvbnMuc29ydChiaW5kaW5nTGlzdCwgQkVTVF9TRVFVRU5DRSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQliaW5kaW5nTGlzdC5hZGQoYmluZGluZyk7CisJCQlDb2xsZWN0aW9ucy5zb3J0KGJpbmRpbmdMaXN0LCBCRVNUX1NFUVVFTkNFKTsKKwkJfQorCisJCWlmIChwb3NzaWJsZUNvbmZsaWN0ICE9IG51bGwgJiYgYmluZGluZ0xpc3QgIT0gbnVsbCAmJiAhYmluZGluZ0xpc3QuaXNFbXB0eSgpCisJCQkJJiYgYmluZGluZ0xpc3QuZ2V0KDApICE9IHBvc3NpYmxlQ29uZmxpY3QpIHsKKwkJCXJlbW92ZUJpbmRpbmdTaW1wbGUocG9zc2libGVDb25mbGljdCk7CisJCQlwb3NzaWJsZUNvbmZsaWN0ID0gbnVsbDsKKwkJfQorCisJCWV2YWx1YXRlT3JkZXJlZEJpbmRpbmdzKGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCksIGJpbmRpbmcpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRCaW5kaW5nU2ltcGxlKEJpbmRpbmcgYmluZGluZykgeworCQliaW5kaW5ncy5hZGQoYmluZGluZyk7CisJCWJpbmRpbmdzQnlUcmlnZ2VyLnB1dChiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpLCBiaW5kaW5nKTsKKworCQlBcnJheUxpc3Q8QmluZGluZz4gc2VxdWVuY2VzID0gYmluZGluZ3NCeUNvbW1hbmQuZ2V0KGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSk7CisJCWlmIChzZXF1ZW5jZXMgPT0gbnVsbCkgeworCQkJc2VxdWVuY2VzID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nPigpOworCQkJYmluZGluZ3NCeUNvbW1hbmQucHV0KGJpbmRpbmcuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKSwgc2VxdWVuY2VzKTsKKwkJfQorCQlzZXF1ZW5jZXMuYWRkKGJpbmRpbmcpOworCQlDb2xsZWN0aW9ucy5zb3J0KHNlcXVlbmNlcywgQkVTVF9TRVFVRU5DRSk7CisKKwkJVHJpZ2dlclNlcXVlbmNlW10gcHJlZnMgPSBiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpLmdldFByZWZpeGVzKCk7CisJCWZvciAoaW50IGkgPSAxOyBpIDwgcHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCUFycmF5TGlzdDxCaW5kaW5nPiBiaW5kaW5ncyA9IGJpbmRpbmdzQnlQcmVmaXguZ2V0KHByZWZzW2ldKTsKKwkJCWlmIChiaW5kaW5ncyA9PSBudWxsKSB7CisJCQkJYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7CisJCQkJYmluZGluZ3NCeVByZWZpeC5wdXQocHJlZnNbaV0sIGJpbmRpbmdzKTsKKwkJCX0KKwkJCWJpbmRpbmdzLmFkZChiaW5kaW5nKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCByZW1vdmVCaW5kaW5nU2ltcGxlKEJpbmRpbmcgYmluZGluZykgeworCQliaW5kaW5ncy5yZW1vdmUoYmluZGluZyk7CisJCWJpbmRpbmdzQnlUcmlnZ2VyLnJlbW92ZShiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKTsKKwkJQXJyYXlMaXN0PEJpbmRpbmc+IHNlcXVlbmNlcyA9IGJpbmRpbmdzQnlDb21tYW5kLmdldChiaW5kaW5nLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCkpOworCisJCWlmIChzZXF1ZW5jZXMgIT0gbnVsbCkgeworCQkJc2VxdWVuY2VzLnJlbW92ZShiaW5kaW5nKTsKKwkJfQorCQlUcmlnZ2VyU2VxdWVuY2VbXSBwcmVmcyA9IGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkuZ2V0UHJlZml4ZXMoKTsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPCBwcmVmcy5sZW5ndGg7IGkrKykgeworCQkJQXJyYXlMaXN0PEJpbmRpbmc+IGJpbmRpbmdzID0gYmluZGluZ3NCeVByZWZpeC5nZXQocHJlZnNbaV0pOworCQkJaWYgKGJpbmRpbmdzICE9IG51bGwpIHsKKwkJCQliaW5kaW5ncy5yZW1vdmUoYmluZGluZyk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgeworCQlpZiAoIWdldElkKCkuZXF1YWxzKGJpbmRpbmcuZ2V0Q29udGV4dElkKCkpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCaW5kaW5nIGNvbnRleHQgIiArIGJpbmRpbmcuZ2V0Q29udGV4dElkKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkrICIgZG9lcyBub3QgbWF0Y2ggIiArIGdldElkKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJQXJyYXlMaXN0PEJpbmRpbmc+IGJpbmRpbmdMaXN0ID0gb3JkZXJlZEJpbmRpbmdzQnlUcmlnZ2VyLmdldChiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKTsKKwkJQmluZGluZyBwb3NzaWJsZUNvbmZsaWN0ID0gYmluZGluZ3NCeVRyaWdnZXIuZ2V0KGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkpOworCQlpZiAocG9zc2libGVDb25mbGljdCA9PSBiaW5kaW5nKSB7CisJCQlyZW1vdmVCaW5kaW5nU2ltcGxlKGJpbmRpbmcpOworCQkJaWYgKGJpbmRpbmdMaXN0ICE9IG51bGwpIHsKKwkJCQliaW5kaW5nTGlzdC5yZW1vdmUoYmluZGluZyk7CisJCQkJaWYgKGJpbmRpbmdMaXN0LmlzRW1wdHkoKSkgeworCQkJCQlvcmRlcmVkQmluZGluZ3NCeVRyaWdnZXIucmVtb3ZlKGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWV2YWx1YXRlT3JkZXJlZEJpbmRpbmdzKGJpbmRpbmcuZ2V0VHJpZ2dlclNlcXVlbmNlKCksIG51bGwpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChiaW5kaW5nTGlzdCAhPSBudWxsKSB7CisJCQliaW5kaW5nTGlzdC5yZW1vdmUoYmluZGluZyk7CisJCQlpZiAoYmluZGluZ0xpc3QuaXNFbXB0eSgpKSB7CisJCQkJb3JkZXJlZEJpbmRpbmdzQnlUcmlnZ2VyLnJlbW92ZShiaW5kaW5nLmdldFRyaWdnZXJTZXF1ZW5jZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJZXZhbHVhdGVPcmRlcmVkQmluZGluZ3MoYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKSwgbnVsbCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYmluZGluZworCSAqLworCXByaXZhdGUgdm9pZCBldmFsdWF0ZU9yZGVyZWRCaW5kaW5ncyhUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UsIEJpbmRpbmcgYmluZGluZykgeworCQlBcnJheUxpc3Q8QmluZGluZz4gYmluZGluZ0xpc3QgPSBvcmRlcmVkQmluZGluZ3NCeVRyaWdnZXIuZ2V0KHNlcXVlbmNlKTsKKworCQkvLyBjYWxjdWxhdGUgYmluZGluZyB0byBiZSB1c2VkIG9yIGFueSBjb25mbGljdHMKKwkJaWYgKGJpbmRpbmdMaXN0ICE9IG51bGwpIHsKKwkJCWlmIChiaW5kaW5nTGlzdC5pc0VtcHR5KCkpIHsKKwkJCQlvcmRlcmVkQmluZGluZ3NCeVRyaWdnZXIucmVtb3ZlKHNlcXVlbmNlKTsKKwkJCX0gZWxzZSBpZiAoYmluZGluZ0xpc3Quc2l6ZSgpID4gMSkgeworCQkJCUJpbmRpbmcgbXNiID0gYmluZGluZ0xpc3QuZ2V0KDApOworCQkJCUJpbmRpbmcgbHNiID0gYmluZGluZ0xpc3QuZ2V0KDEpOworCQkJCWludCByYyA9IGNvbXBhcmVTY2hlbWVzKEJFU1RfU0VRVUVOQ0UuZ2V0QWN0aXZlU2NoZW1lcygpLCBtc2IuZ2V0U2NoZW1lSWQoKSwKKwkJCQkJCWxzYi5nZXRTY2hlbWVJZCgpKTsKKwkJCQlpZiAocmMgPT0gMCkgeworCQkJCQlBcnJheUxpc3Q8QmluZGluZz4gY29uZmxpY3RMaXN0ID0gY29uZmxpY3RzLmdldChzZXF1ZW5jZSk7CisJCQkJCWlmIChjb25mbGljdExpc3QgPT0gbnVsbCkgeworCQkJCQkJY29uZmxpY3RMaXN0ID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nPigpOworCQkJCQkJY29uZmxpY3RzLnB1dChzZXF1ZW5jZSwgY29uZmxpY3RMaXN0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvbmZsaWN0TGlzdC5jbGVhcigpOworCQkJCQl9CisJCQkJCUl0ZXJhdG9yPEJpbmRpbmc+IGkgPSBiaW5kaW5nTGlzdC5pdGVyYXRvcigpOworCQkJCQlCaW5kaW5nIHByZXYgPSBpLm5leHQoKTsKKwkJCQkJY29uZmxpY3RMaXN0LmFkZChwcmV2KTsKKwkJCQkJd2hpbGUgKGkuaGFzTmV4dCgpICYmIHJjID09IDApIHsKKwkJCQkJCUJpbmRpbmcgbmV4dCA9IGkubmV4dCgpOworCQkJCQkJcmMgPSBjb21wYXJlU2NoZW1lcyhCRVNUX1NFUVVFTkNFLmdldEFjdGl2ZVNjaGVtZXMoKSwgcHJldi5nZXRTY2hlbWVJZCgpLAorCQkJCQkJCQluZXh0LmdldFNjaGVtZUlkKCkpOworCQkJCQkJaWYgKHJjID09IDApIHsKKwkJCQkJCQljb25mbGljdExpc3QuYWRkKG5leHQpOworCQkJCQkJfQorCQkJCQkJcHJldiA9IG5leHQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQljb25mbGljdHMucmVtb3ZlKHNlcXVlbmNlKTsKKwkJCQkJaWYgKGJpbmRpbmdzQnlUcmlnZ2VyLmdldChzZXF1ZW5jZSkgPT0gbnVsbCkgeworCQkJCQkJYWRkQmluZGluZ1NpbXBsZShtc2IpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoYmluZGluZ3NCeVRyaWdnZXIuZ2V0KHNlcXVlbmNlKSA9PSBudWxsKSB7CisJCQkJCWFkZEJpbmRpbmdTaW1wbGUoYmluZGluZ0xpc3QuZ2V0KDApKTsKKwkJCQl9CisJCQkJb3JkZXJlZEJpbmRpbmdzQnlUcmlnZ2VyLnJlbW92ZShzZXF1ZW5jZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQljb25mbGljdHMucmVtb3ZlKHNlcXVlbmNlKTsKKwkJCWlmIChiaW5kaW5nc0J5VHJpZ2dlci5nZXQoc2VxdWVuY2UpID09IG51bGwpIHsKKwkJCQlhZGRCaW5kaW5nU2ltcGxlKGJpbmRpbmcpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEJpbmRpbmcgZ2V0UGVyZmVjdE1hdGNoKFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyKSB7CisJCXJldHVybiBiaW5kaW5nc0J5VHJpZ2dlci5nZXQodHJpZ2dlcik7CisJfQorCisJcHVibGljIEJpbmRpbmcgZ2V0QmVzdFNlcXVlbmNlRm9yKFBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQpIHsKKwkJQXJyYXlMaXN0PEJpbmRpbmc+IHNlcXVlbmNlcyA9IGJpbmRpbmdzQnlDb21tYW5kLmdldChjb21tYW5kKTsKKwkJaWYgKHNlcXVlbmNlcyAhPSBudWxsICYmIHNlcXVlbmNlcy5zaXplKCkgPiAwKSB7CisJCQlyZXR1cm4gc2VxdWVuY2VzLmdldCgwKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRTZXF1ZW5jZXNGb3IoUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCkgeworCQlBcnJheUxpc3Q8QmluZGluZz4gdHJpZ2dlcnMgPSBiaW5kaW5nc0J5Q29tbWFuZC5nZXQoY29tbWFuZCk7CisJCXJldHVybiAoQ29sbGVjdGlvbjxCaW5kaW5nPikgKHRyaWdnZXJzID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogdHJpZ2dlcnMuY2xvbmUoKSk7CisJfQorCisJcHVibGljIENvbGxlY3Rpb248QmluZGluZz4gZ2V0UGFydGlhbE1hdGNoZXMoVHJpZ2dlclNlcXVlbmNlIHNlcXVlbmNlKSB7CisJCXJldHVybiBiaW5kaW5nc0J5UHJlZml4LmdldChzZXF1ZW5jZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsTWF0Y2goVHJpZ2dlclNlcXVlbmNlIHNlcSkgeworCQlyZXR1cm4gYmluZGluZ3NCeVByZWZpeC5nZXQoc2VxKSAhPSBudWxsOworCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEJpbmRpbmdzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihiaW5kaW5ncyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9CaW5kaW5nVGFibGVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9CaW5kaW5nVGFibGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiNWEyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL0JpbmRpbmdUYWJsZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKKworLyoqCisgKiBtYW5hZ2UgdGFibGVzIG9mIGJpbmRpbmdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9vayB1cCBjb21tYW5kcyBmcm9tIGtleXMuCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5kaW5nVGFibGVNYW5hZ2VyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19UQUJMRV9QUkVGSVggPSAiYmluZGluZ1RhYmxlOiI7IC8vJE5PTi1OTFMtMSQKKworCUBJbmplY3QKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBlY2xpcHNlQ29udGV4dDsKKworCXByaXZhdGUgQ29udGV4dFNldCBkZWZpbmVkVGFibGVzID0gQ29udGV4dFNldC5FTVBUWTsKKworCXByaXZhdGUgU3RyaW5nW10gYWN0aXZlU2NoZW1lSWRzOworCisJcHVibGljIHZvaWQgYWRkVGFibGUoQmluZGluZ1RhYmxlIHRhYmxlKSB7CisJCVN0cmluZyBjb250ZXh0SWQgPSBnZXRUYWJsZUlkKHRhYmxlLmdldElkKCkpOworCQlpZiAoZWNsaXBzZUNvbnRleHQuY29udGFpbnNLZXkoY29udGV4dElkKSkgeworCQkJcmV0dXJuOyAvLyBpdCdzIGFscmVhZHkgdGhlcmUKKwkJCS8vIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFscmVhZHkgY29udGFpbnMgdGFibGUgIiArCisJCQkvLyBjb250ZXh0SWQpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZWNsaXBzZUNvbnRleHQuc2V0KGNvbnRleHRJZCwgdGFibGUpOworCQlmaW5hbCBMaXN0PENvbnRleHQ+IGNvbnRleHRzID0gZGVmaW5lZFRhYmxlcy5nZXRDb250ZXh0cygpOworCQlpZiAoIWNvbnRleHRzLmNvbnRhaW5zKHRhYmxlLmdldFRhYmxlSWQoKSkpIHsKKwkJCS8vIHRoaXMgaXMgb25seSB2YWxpZCBiZWNhdXNlIEknbSB0aHJvd2luZyBhd2F5IHRoZSBvbGQKKwkJCS8vIGRlZmluZWRUYWJsZXMgY29udGV4dFNldAorCQkJY29udGV4dHMuYWRkKHRhYmxlLmdldFRhYmxlSWQoKSk7CisJCQlkZWZpbmVkVGFibGVzID0gY3JlYXRlQ29udGV4dFNldChjb250ZXh0cyk7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUYWJsZUlkKFN0cmluZyBpZCkgeworCQlyZXR1cm4gQklORElOR19UQUJMRV9QUkVGSVggKyBpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZShCaW5kaW5nVGFibGUgdGFibGUpIHsKKwkJU3RyaW5nIGNvbnRleHRJZCA9IGdldFRhYmxlSWQodGFibGUuZ2V0SWQoKSk7CisJCWlmICghZWNsaXBzZUNvbnRleHQuY29udGFpbnNLZXkoY29udGV4dElkKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRG9lcyBub3QgY29udGFpbnMgdGFibGUgIiArIGNvbnRleHRJZCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQllY2xpcHNlQ29udGV4dC5yZW1vdmUoY29udGV4dElkKTsKKwkJZmluYWwgTGlzdDxDb250ZXh0PiBjb250ZXh0cyA9IGRlZmluZWRUYWJsZXMuZ2V0Q29udGV4dHMoKTsKKwkJaWYgKGNvbnRleHRzLmNvbnRhaW5zKHRhYmxlLmdldFRhYmxlSWQoKSkpIHsKKwkJCS8vIHRoaXMgaXMgb25seSB2YWxpZCBiZWNhdXNlIEknbSB0aHJvd2luZyBhd2F5IHRoZSBvbGQKKwkJCS8vIGRlZmluZWRUYWJsZXMgY29udGV4dFNldAorCQkJY29udGV4dHMucmVtb3ZlKHRhYmxlLmdldFRhYmxlSWQoKSk7CisJCQlkZWZpbmVkVGFibGVzID0gY3JlYXRlQ29udGV4dFNldChjb250ZXh0cyk7CisJCX0KKwl9CisKKwlwdWJsaWMgQmluZGluZ1RhYmxlIGdldFRhYmxlKFN0cmluZyBpZCkgeworCQlyZXR1cm4gKEJpbmRpbmdUYWJsZSkgZWNsaXBzZUNvbnRleHQuZ2V0KGdldFRhYmxlSWQoaWQpKTsKKwl9CisKKwkvLyB3ZSdyZSBqdXN0IGdvaW5nIHRocm91Z2ggZWFjaCBiaW5kaW5nIHRhYmxlLCBhbmQgcmV0dXJuaW5nIGEKKwkvLyBmbGF0IGxpc3Qgb2YgYmluZGluZ3MgaGVyZQorCXB1YmxpYyBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEFjdGl2ZUJpbmRpbmdzKCkgeworCQlBcnJheUxpc3Q8QmluZGluZz4gYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7CisJCWZvciAoQ29udGV4dCBjdHggOiBkZWZpbmVkVGFibGVzLmdldENvbnRleHRzKCkpIHsKKwkJCUJpbmRpbmdUYWJsZSB0YWJsZSA9IGdldFRhYmxlKGN0eC5nZXRJZCgpKTsKKwkJCWlmICh0YWJsZSAhPSBudWxsKSB7CisJCQkJYmluZGluZ3MuYWRkQWxsKHRhYmxlLmdldEJpbmRpbmdzKCkpOworCQkJfQorCQl9CisJCXJldHVybiBiaW5kaW5nczsKKwl9CisKKwlwdWJsaWMgQ29udGV4dFNldCBjcmVhdGVDb250ZXh0U2V0KENvbGxlY3Rpb248Q29udGV4dD4gY29udGV4dHMpIHsKKwkJcmV0dXJuIG5ldyBDb250ZXh0U2V0KGNvbnRleHRzKTsKKwl9CisKKwlwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRDb25mbGljdHNGb3IoQ29udGV4dFNldCBjb250ZXh0U2V0LCBUcmlnZ2VyU2VxdWVuY2UgdHJpZ2dlclNlcXVlbmNlKSB7CisJCUNvbGxlY3Rpb248QmluZGluZz4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8QmluZGluZz4oKTsKKwkJZm9yIChDb250ZXh0IGN0eCA6IGNvbnRleHRTZXQuZ2V0Q29udGV4dHMoKSkgeworCQkJQmluZGluZ1RhYmxlIHRhYmxlID0gZ2V0VGFibGUoY3R4LmdldElkKCkpOworCQkJaWYgKHRhYmxlICE9IG51bGwpIHsKKwkJCQlmaW5hbCBDb2xsZWN0aW9uPEJpbmRpbmc+IG1hdGNoZXNGb3IgPSB0YWJsZS5nZXRDb25mbGljdHNGb3IodHJpZ2dlclNlcXVlbmNlKTsKKwkJCQlpZiAobWF0Y2hlc0ZvciAhPSBudWxsKSB7CisJCQkJCW1hdGNoZXMuYWRkQWxsKG1hdGNoZXNGb3IpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbWF0Y2hlcy5zaXplKCkgPT0gMCA/IG51bGwgOiBtYXRjaGVzOworCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEFsbENvbmZsaWN0cygpIHsKKwkJQ29sbGVjdGlvbjxCaW5kaW5nPiBjb25mbGljdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nPigpOworCQlmb3IgKENvbnRleHQgY3R4IDogZGVmaW5lZFRhYmxlcy5nZXRDb250ZXh0cygpKSB7CisJCQlCaW5kaW5nVGFibGUgdGFibGUgPSBnZXRUYWJsZShjdHguZ2V0SWQoKSk7CisJCQlpZiAodGFibGUgIT0gbnVsbCkgeworCQkJCUNvbGxlY3Rpb248QmluZGluZz4gY29uZmxpY3RzSW5UYWJsZSA9IHRhYmxlLmdldENvbmZsaWN0cygpOworCQkJCWlmIChjb25mbGljdHNJblRhYmxlICE9IG51bGwpIHsKKwkJCQkJY29uZmxpY3RzTGlzdC5hZGRBbGwoY29uZmxpY3RzSW5UYWJsZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBjb25mbGljdHNMaXN0OworCX0KKworCXB1YmxpYyBCaW5kaW5nIGdldFBlcmZlY3RNYXRjaChDb250ZXh0U2V0IGNvbnRleHRTZXQsIFRyaWdnZXJTZXF1ZW5jZSB0cmlnZ2VyU2VxdWVuY2UpIHsKKwkJQmluZGluZyByZXN1bHQgPSBudWxsOworCQlCaW5kaW5nIGN1cnJlbnRSZXN1bHQgPSBudWxsOworCQlMaXN0PENvbnRleHQ+IGNvbnRleHRzID0gY29udGV4dFNldC5nZXRDb250ZXh0cygpOworCQlMaXN0SXRlcmF0b3I8Q29udGV4dD4gaXQgPSBjb250ZXh0cy5saXN0SXRlcmF0b3IoY29udGV4dHMuc2l6ZSgpKTsKKwkJd2hpbGUgKGl0Lmhhc1ByZXZpb3VzKCkpIHsKKwkJCUNvbnRleHQgYyA9IGl0LnByZXZpb3VzKCk7CisJCQlCaW5kaW5nVGFibGUgdGFibGUgPSBnZXRUYWJsZShjLmdldElkKCkpOworCQkJaWYgKHRhYmxlICE9IG51bGwpIHsKKwkJCQljdXJyZW50UmVzdWx0ID0gdGFibGUuZ2V0UGVyZmVjdE1hdGNoKHRyaWdnZXJTZXF1ZW5jZSk7CisJCQl9CisJCQlpZiAoY3VycmVudFJlc3VsdCAhPSBudWxsKSB7CisJCQkJaWYgKGlzTW9zdEFjdGl2ZVNjaGVtZShjdXJyZW50UmVzdWx0KSkgeworCQkJCQlyZXR1cm4gY3VycmVudFJlc3VsdDsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJCXJlc3VsdCA9IGN1cnJlbnRSZXN1bHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IHJjID0gY29tcGFyZVNjaGVtZXMocmVzdWx0LmdldFNjaGVtZUlkKCksIGN1cnJlbnRSZXN1bHQuZ2V0U2NoZW1lSWQoKSk7CisJCQkJCWlmIChyYyA8IDApIHsKKwkJCQkJCXJlc3VsdCA9IGN1cnJlbnRSZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY3VycmVudFJlc3VsdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNNb3N0QWN0aXZlU2NoZW1lKEJpbmRpbmcgY3VycmVudFJlc3VsdCkgeworCQlpZiAoYWN0aXZlU2NoZW1lSWRzID09IG51bGwgfHwgYWN0aXZlU2NoZW1lSWRzLmxlbmd0aCA8IDIpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWZpbmFsIFN0cmluZyBtb3N0QWN0aXZlID0gYWN0aXZlU2NoZW1lSWRzWzBdOworCQlyZXR1cm4gbW9zdEFjdGl2ZSA9PSBudWxsID8gZmFsc2UgOiBtb3N0QWN0aXZlLmVxdWFscyhjdXJyZW50UmVzdWx0LmdldFNjaGVtZUlkKCkpOworCX0KKworCXB1YmxpYyBCaW5kaW5nIGdldEJlc3RTZXF1ZW5jZUZvcihDb250ZXh0U2V0IGNvbnRleHRTZXQsIFBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcmFtZXRlcml6ZWRDb21tYW5kKSB7CisJCUFycmF5TGlzdDxCaW5kaW5nPiBiaW5kaW5ncyA9IChBcnJheUxpc3Q8QmluZGluZz4pIGdldFNlcXVlbmNlc0Zvcihjb250ZXh0U2V0LCBwYXJhbWV0ZXJpemVkQ29tbWFuZCk7CisJCWlmIChiaW5kaW5ncy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGJpbmRpbmdzLmdldCgwKTsKKwl9CisKKwlwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRTZXF1ZW5jZXNGb3IoQ29udGV4dFNldCBjb250ZXh0U2V0LCBQYXJhbWV0ZXJpemVkQ29tbWFuZCBwYXJhbWV0ZXJpemVkQ29tbWFuZCkgeworCQlBcnJheUxpc3Q8QmluZGluZz4gYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7CisJCUxpc3Q8Q29udGV4dD4gY29udGV4dHMgPSBjb250ZXh0U2V0LmdldENvbnRleHRzKCk7CisJCUxpc3RJdGVyYXRvcjxDb250ZXh0PiBpdCA9IGNvbnRleHRzLmxpc3RJdGVyYXRvcihjb250ZXh0cy5zaXplKCkpOworCQl3aGlsZSAoaXQuaGFzUHJldmlvdXMoKSkgeworCQkJQ29udGV4dCBjID0gaXQucHJldmlvdXMoKTsKKwkJCUJpbmRpbmdUYWJsZSB0YWJsZSA9IGdldFRhYmxlKGMuZ2V0SWQoKSk7CisJCQlpZiAodGFibGUgIT0gbnVsbCkgeworCQkJCUNvbGxlY3Rpb248QmluZGluZz4gc2VxdWVuY2VzID0gdGFibGUuZ2V0U2VxdWVuY2VzRm9yKHBhcmFtZXRlcml6ZWRDb21tYW5kKTsKKwkJCQlpZiAoc2VxdWVuY2VzICE9IG51bGwpIHsKKwkJCQkJYmluZGluZ3MuYWRkQWxsKHNlcXVlbmNlcyk7CisJCQkJfQorCQkJfQorCQl9CisJCUNvbGxlY3Rpb25zLnNvcnQoYmluZGluZ3MsIEJpbmRpbmdUYWJsZS5CRVNUX1NFUVVFTkNFKTsKKwkJcmV0dXJuIGJpbmRpbmdzOworCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uPEJpbmRpbmc+IGdldEJpbmRpbmdzRm9yKENvbnRleHRTZXQgY29udGV4dFNldCwgUGFyYW1ldGVyaXplZENvbW1hbmQgY21kKSB7CisJCUNvbGxlY3Rpb248QmluZGluZz4gYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7CisJCWZvciAoQ29udGV4dCBjdHggOiBjb250ZXh0U2V0LmdldENvbnRleHRzKCkpIHsKKwkJCUJpbmRpbmdUYWJsZSB0YWJsZSA9IGdldFRhYmxlKGN0eC5nZXRJZCgpKTsKKwkJCWlmICh0YWJsZSAhPSBudWxsKSB7CisJCQkJQ29sbGVjdGlvbjxCaW5kaW5nPiBtYXRjaGVzID0gdGFibGUuZ2V0U2VxdWVuY2VzRm9yKGNtZCk7CisJCQkJaWYgKG1hdGNoZXMgIT0gbnVsbCkgeworCQkJCQliaW5kaW5ncy5hZGRBbGwobWF0Y2hlcyk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBiaW5kaW5nczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxNYXRjaChDb250ZXh0U2V0IGNvbnRleHRTZXQsIFRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSkgeworCQlMaXN0PENvbnRleHQ+IGNvbnRleHRzID0gY29udGV4dFNldC5nZXRDb250ZXh0cygpOworCQlMaXN0SXRlcmF0b3I8Q29udGV4dD4gaXQgPSBjb250ZXh0cy5saXN0SXRlcmF0b3IoY29udGV4dHMuc2l6ZSgpKTsKKwkJd2hpbGUgKGl0Lmhhc1ByZXZpb3VzKCkpIHsKKwkJCUNvbnRleHQgYyA9IGl0LnByZXZpb3VzKCk7CisJCQlCaW5kaW5nVGFibGUgdGFibGUgPSBnZXRUYWJsZShjLmdldElkKCkpOworCQkJaWYgKHRhYmxlICE9IG51bGwpIHsKKwkJCQlpZiAodGFibGUuaXNQYXJ0aWFsTWF0Y2goc2VxdWVuY2UpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIENvbGxlY3Rpb248QmluZGluZz4gZ2V0UGFydGlhbE1hdGNoZXMoQ29udGV4dFNldCBjb250ZXh0U2V0LCBUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJQXJyYXlMaXN0PEJpbmRpbmc+IGJpbmRpbmdzID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nPigpOworCQlMaXN0PENvbnRleHQ+IGNvbnRleHRzID0gY29udGV4dFNldC5nZXRDb250ZXh0cygpOworCQlMaXN0SXRlcmF0b3I8Q29udGV4dD4gaXQgPSBjb250ZXh0cy5saXN0SXRlcmF0b3IoY29udGV4dHMuc2l6ZSgpKTsKKwkJd2hpbGUgKGl0Lmhhc1ByZXZpb3VzKCkpIHsKKwkJCUNvbnRleHQgYyA9IGl0LnByZXZpb3VzKCk7CisJCQlCaW5kaW5nVGFibGUgdGFibGUgPSBnZXRUYWJsZShjLmdldElkKCkpOworCQkJaWYgKHRhYmxlICE9IG51bGwpIHsKKwkJCQlDb2xsZWN0aW9uPEJpbmRpbmc+IHBhcnRpYWxNYXRjaGVzID0gdGFibGUuZ2V0UGFydGlhbE1hdGNoZXMoc2VxdWVuY2UpOworCQkJCWlmIChwYXJ0aWFsTWF0Y2hlcyAhPSBudWxsKSB7CisJCQkJCWJpbmRpbmdzLmFkZEFsbChwYXJ0aWFsTWF0Y2hlcyk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBiaW5kaW5nczsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYWN0aXZlU2NoZW1lSWRzCisJICovCisJcHVibGljIHZvaWQgc2V0QWN0aXZlU2NoZW1lcyhTdHJpbmdbXSBhY3RpdmVTY2hlbWVJZHMpIHsKKwkJdGhpcy5hY3RpdmVTY2hlbWVJZHMgPSBhY3RpdmVTY2hlbWVJZHM7CisJCUJpbmRpbmdUYWJsZS5CRVNUX1NFUVVFTkNFLnNldEFjdGl2ZVNjaGVtZXMoYWN0aXZlU2NoZW1lSWRzKTsKKwl9CisKKwkvKgorCSAqIENvcGllZCBmcm9tCisJICogb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZ01hbmFnZXIuY29tcGFyZVNjaGVtZXMoU3RyaW5nLCBTdHJpbmcpCisJICoKKwkgKiBSZXR1cm5zIGFuIGluIGJhc2VkIG9uIHNjaGVtZSAxIDwgc2NoZW1lIDIKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCBjb21wYXJlU2NoZW1lcyhmaW5hbCBTdHJpbmcgc2NoZW1lSWQxLCBmaW5hbCBTdHJpbmcgc2NoZW1lSWQyKSB7CisJCWlmIChhY3RpdmVTY2hlbWVJZHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFzY2hlbWVJZDIuZXF1YWxzKHNjaGVtZUlkMSkpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aXZlU2NoZW1lSWRzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmluYWwgU3RyaW5nIHNjaGVtZVBvaW50ZXIgPSBhY3RpdmVTY2hlbWVJZHNbaV07CisJCQkJaWYgKHNjaGVtZUlkMi5lcXVhbHMoc2NoZW1lUG9pbnRlcikpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfSBlbHNlIGlmIChzY2hlbWVJZDEuZXF1YWxzKHNjaGVtZVBvaW50ZXIpKSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3MvaW50ZXJuYWwvQ29udGV4dFNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvYmluZGluZ3MvaW50ZXJuYWwvQ29udGV4dFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWQ3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9Db250ZXh0U2V0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dE1hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBDb250ZXh0U2V0IHsKKwlwdWJsaWMgc3RhdGljIENvbnRleHRTZXQgRU1QVFkgPSBuZXcgQ29udGV4dFNldChDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ0NvbXAgaW1wbGVtZW50cyBDb21wYXJhdG9yPENvbnRleHQ+IHsKKwkJcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBtYW5hZ2VyOworCisJCXB1YmxpYyBDQ29tcChDb250ZXh0TWFuYWdlciBtYW5hZ2VyKSB7CisJCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgY29tcGFyZShDb250ZXh0IG8xLCBDb250ZXh0IG8yKSB7CisJCQlpZiAobzEuZXF1YWxzKG8yKSkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJaW50IGwxID0gZ2V0TGV2ZWwobzEpOworCQkJaW50IGwyID0gZ2V0TGV2ZWwobzIpOworCQkJaWYgKGwxICE9IGwyKSB7CisJCQkJcmV0dXJuIGwxIC0gbDI7CisJCQl9CisJCQlyZXR1cm4gbzEuZ2V0SWQoKS5jb21wYXJlVG8obzIuZ2V0SWQoKSk7CisJCX0KKworCQlwcml2YXRlIGludCBnZXRMZXZlbChDb250ZXh0IGMpIHsKKwkJCWludCBsID0gMDsKKwkJCXRyeSB7CisJCQkJU3RyaW5nIHBhcmVudElkID0gYy5nZXRQYXJlbnRJZCgpOworCQkJCXdoaWxlIChwYXJlbnRJZCAhPSBudWxsKSB7CisJCQkJCWwrKzsKKwkJCQkJQ29udGV4dCBjb250ZXh0ID0gbWFuYWdlci5nZXRDb250ZXh0KHBhcmVudElkKTsKKwkJCQkJcGFyZW50SWQgPSBjb250ZXh0LmdldFBhcmVudElkKCk7CisJCQkJfQorCQkJfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlyZXR1cm4gbDsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3I8Q29udGV4dD4gQ09OVEVYVF9DT01QID0gbnVsbDsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3I8Q29udGV4dD4gY29tcCkgeworCQlDT05URVhUX0NPTVAgPSBjb21wOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvcjxDb250ZXh0PiBnZXRDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gQ09OVEVYVF9DT01QOworCX0KKworCXByaXZhdGUgTGlzdDxDb250ZXh0PiBjb250ZXh0czsKKworCXB1YmxpYyBDb250ZXh0U2V0KENvbGxlY3Rpb248Q29udGV4dD4gYykgeworCQljb250ZXh0cyA9IG5ldyBBcnJheUxpc3Q8Q29udGV4dD4oYyk7CisJCUNvbGxlY3Rpb25zLnNvcnQoY29udGV4dHMsIENPTlRFWFRfQ09NUCk7CisJfQorCisJcHVibGljIExpc3Q8Q29udGV4dD4gZ2V0Q29udGV4dHMoKSB7CisJCXJldHVybiBjb250ZXh0czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYgKG8gPT0gdGhpcykgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKCEobyBpbnN0YW5jZW9mIENvbnRleHRTZXQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGNvbnRleHRzLmVxdWFscygoKENvbnRleHRTZXQpIG8pLmNvbnRleHRzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gY29udGV4dHMuaGFzaENvZGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9pbnRlcm5hbC9VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4ZDA5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2ludGVybmFsL1V0aWwuamF2YQpAQCAtMCwwICsxLDY2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKKworLyoqCisgKiA8cD4KKyAqIEEgc3RhdGljIGNsYXNzIHByb3ZpZGluZyB1dGlsaXR5IG1ldGhvZHMgdG8gYWxsIG9mIEpGYWNlLgorICogPC9wPgorICoKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFV0aWwgeworCisJLyoqCisJICogQSBjb21tb24gemVyby1sZW5ndGggc3RyaW5nLiBJdCBhdm9pZHMgbmVlZGluZyB3cml0ZSA8Y29kZT5OT04tTkxTPC9jb2RlPgorCSAqIG5leHQgdG8gY29kZSBmcmFnbWVudHMuIEl0J3MgYWxzbyBhIGJpdCBjbGVhcmVyIHRvIHJlYWQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST19MRU5HVEhfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGNoZWNrOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGMKKwkgKiAgICAgICAgICAgIFRoZSBjbGFzcyB3aGljaCB0aGUgb2JqZWN0IHNob3VsZCBiZTsgbXVzdCBub3QgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhc3NlcnRJbnN0YW5jZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzczw/PiBjKSB7CisJCWFzc2VydEluc3RhbmNlKG9iamVjdCwgYywgZmFsc2UpOworCX0KKworCS8qKgorCSAqIFZlcmlmaWVzIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLiBJdCBpcworCSAqIHBvc3NpYmxlIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgb2JqZWN0IGlzIHBlcm1pdHRlZCB0byBiZQorCSAqIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBjaGVjazsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjCisJICogICAgICAgICAgICBUaGUgY2xhc3Mgd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmU7IG11c3Qgbm90IGJlCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYWxsb3dOdWxsCisJICogICAgICAgICAgICBXaGV0aGVyIHRoZSBvYmplY3QgaXMgYWxsb3dlZCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFzc2VydEluc3RhbmNlKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIGJvb2xlYW4gYWxsb3dOdWxsKSB7CisJCWlmIChvYmplY3QgPT0gbnVsbCAmJiBhbGxvd051bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChvYmplY3QgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9IGVsc2UgaWYgKCFjLmlzSW5zdGFuY2Uob2JqZWN0KSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJfQorCisJLyoqCisJICogQ29tcGFyZXMgdHdvIGJvb2xlYW4gdmFsdWVzLiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgY29uc2lkZXJlZCB0byBiZQorCSAqICJsZXNzIHRoYW4iIDxjb2RlPnRydWU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGxlZnQKKwkgKiAgICAgICAgICAgIFRoZSBsZWZ0IHZhbHVlIHRvIGNvbXBhcmUKKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCB2YWx1ZSB0byBjb21wYXJlCisJICogQHJldHVybiA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIGxlZnQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCB0aGUgcmlnaHQKKwkgKiAgICAgICAgIGlzIDxjb2RlPnRydWU8L2NvZGU+LiA8Y29kZT4xPC9jb2RlPiBpZiB0aGUgb3Bwb3NpdGUgaXMgdHJ1ZS4gSWYKKwkgKiAgICAgICAgIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGl0IHJldHVybnMgPGNvZGU+MDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGFyZShmaW5hbCBib29sZWFuIGxlZnQsIGZpbmFsIGJvb2xlYW4gcmlnaHQpIHsKKwkJcmV0dXJuIGxlZnQgPT0gZmFsc2UgPyAocmlnaHQgPT0gdHJ1ZSA/IC0xIDogMCkgOiAxOworCX0KKworCS8qKgorCSAqIENvbXBhcmVzIHR3byBpbnRlZ2VyIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSBsZWZ0CisJICogICAgICAgICAgICBUaGUgbGVmdCB2YWx1ZSB0byBjb21wYXJlCisJICogQHBhcmFtIHJpZ2h0CisJICogICAgICAgICAgICBUaGUgcmlnaHQgdmFsdWUgdG8gY29tcGFyZQorCSAqIEByZXR1cm4gPGNvZGU+bGVmdCAtIHJpZ2h0PC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmUoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQlyZXR1cm4gbGVmdCAtIHJpZ2h0OworCX0KKworCS8qKgorCSAqIENvbXBhcmVzIHRvIGNvbXBhcmFibGUgb2JqZWN0cyAtLSBkZWZlbmRpbmcgYWdhaW5zdCA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSA8VD4KKwkgKgorCSAqIEBwYXJhbSBsZWZ0CisJICogICAgICAgICAgICBUaGUgbGVmdCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IG9iamVjdCB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLiA8Y29kZT5udWxsPC9jb2RlPiBpcyBjb25zaWRlcmVkIHRvCisJICogICAgICAgICBiZSB0aGUgbGVhc3QgcG9zc2libGUgdmFsdWUuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHN0YXRpYyBmaW5hbCA8VD4gaW50IGNvbXBhcmUoZmluYWwgQ29tcGFyYWJsZTxUPiBsZWZ0LCBmaW5hbCBDb21wYXJhYmxlPFQ+IHJpZ2h0KSB7CisJCWlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGVmdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbGVmdC5jb21wYXJlVG8oKFQpIHJpZ2h0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbXBhcmVzIHR3byBhcnJheXMgb2YgY29tcGFyYWJsZSBvYmplY3RzIC0tIGFjY291bnRpbmcgZm9yCisJICogPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGxlZnQgYXJyYXkgdG8gYmUgY29tcGFyZWQ7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBhcnJheSB0byBiZSBjb21wYXJlZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4gPGNvZGU+bnVsbDwvY29kZT4gaXMgY29uc2lkZXJlZCB0bworCSAqICAgICAgICAgYmUgdGhlIGxlYXN0IHBvc3NpYmxlIHZhbHVlLiBBIHNob3J0ZXIgYXJyYXkgaXMgY29uc2lkZXJlZCBsZXNzCisJICogICAgICAgICB0aGFuIGEgbG9uZ2VyIGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgPFQ+IGludCBjb21wYXJlKGZpbmFsIENvbXBhcmFibGU8VD5bXSBsZWZ0LCBmaW5hbCBDb21wYXJhYmxlPFQ+W10gcmlnaHQpIHsKKwkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsZWZ0ID09IG51bGwpIHsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChyaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCWludCBsID0gbGVmdC5sZW5ndGg7CisJCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKKworCQkJaWYgKGwgIT0gcikgeworCQkJCXJldHVybiBsIC0gcjsKKwkJCX0KKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKKwkJCQlpbnQgY29tcGFyZVRvID0gY29tcGFyZShsZWZ0W2ldLCByaWdodFtpXSk7CisKKwkJCQlpZiAoY29tcGFyZVRvICE9IDApIHsKKwkJCQkJcmV0dXJuIGNvbXBhcmVUbzsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoqCisJICogQ29tcGFyZXMgdHdvIGxpc3RzIC0tIGFjY291bnQgZm9yIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgbGlzdHMgbXVzdAorCSAqIGNvbnRhaW4gY29tcGFyYWJsZSBvYmplY3RzLgorCSAqCisJICogQHBhcmFtIGxlZnQKKwkgKiAgICAgICAgICAgIFRoZSBsZWZ0IGxpc3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGxpc3QKKwkgKiAgICAgICAgICAgIG11c3Qgb25seSBjb250YWluIGluc3RhbmNlcyBvZiA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPi4KKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBsaXN0IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBsaXN0CisJICogICAgICAgICAgICBtdXN0IG9ubHkgY29udGFpbiBpbnN0YW5jZXMgb2YgPGNvZGU+Q29tcGFyYWJsZTwvY29kZT4uCisJICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLiA8Y29kZT5udWxsPC9jb2RlPiBpcyBjb25zaWRlcmVkIHRvCisJICogICAgICAgICBiZSB0aGUgbGVhc3QgcG9zc2libGUgdmFsdWUuIEEgc2hvcnRlciBsaXN0IGlzIGNvbnNpZGVyZWQgbGVzcworCSAqICAgICAgICAgdGhhbiBhIGxvbmdlciBsaXN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgPFQ+IGludCBjb21wYXJlKGZpbmFsIExpc3Q8Q29tcGFyYWJsZTxUPj4gbGVmdCwgZmluYWwgTGlzdDxDb21wYXJhYmxlPFQ+PiByaWdodCkgeworCQlpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxlZnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKHJpZ2h0ID09IG51bGwpIHsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJaW50IGwgPSBsZWZ0LnNpemUoKTsKKwkJCWludCByID0gcmlnaHQuc2l6ZSgpOworCisJCQlpZiAobCAhPSByKSB7CisJCQkJcmV0dXJuIGwgLSByOworCQkJfQorCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgeworCQkJCWludCBjb21wYXJlVG8gPSBjb21wYXJlKGxlZnQuZ2V0KGkpLCByaWdodC5nZXQoaSkpOworCisJCQkJaWYgKGNvbXBhcmVUbyAhPSAwKSB7CisJCQkJCXJldHVybiBjb21wYXJlVG87CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGZpcnN0IGFycmF5IGVuZHMgd2l0aCB0aGUgc2Vjb25kIGFycmF5LgorCSAqCisJICogQHBhcmFtIGxlZnQKKwkgKiAgICAgICAgICAgIFRoZSBhcnJheSB0byBjaGVjayAobGFyZ2VyKTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgVGhlIGFycmF5IHRoYXQgc2hvdWxkIGJlIGEgc3Vic2VxdWVuY2UgKHNtYWxsZXIpOyBtYXkgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBlcXVhbHMKKwkgKiAgICAgICAgICAgIFdoZXRoZXIgdGhlIHR3byBhcnJheSBhcmUgYWxsb3dlZCB0byBiZSBlcXVhbC4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWNvbmQgYXJyYXkgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUKKwkgKiAgICAgICAgIGFycmF5IGxpc3QsIGFuZCB0aGV5IHNoYXJlIGVuZCBlbGVtZW50cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZW5kc1dpdGgoZmluYWwgT2JqZWN0W10gbGVmdCwgZmluYWwgT2JqZWN0W10gcmlnaHQsIGZpbmFsIGJvb2xlYW4gZXF1YWxzKSB7CisJCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKKwkJaW50IHIgPSByaWdodC5sZW5ndGg7CisKKwkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykgeworCQkJaWYgKCFlcXVhbHMobGVmdFtsIC0gaSAtIDFdLCByaWdodFtyIC0gaSAtIDFdKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB0d28gb2JqZWN0cyBhcmUgPGNvZGU+bnVsbDwvY29kZT4gLS0gYWxsb3dpbmcgZm9yCisJICogPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGxlZnQgb2JqZWN0IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVpdmFsZW50OworCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBsZWZ0LCBmaW5hbCBPYmplY3QgcmlnaHQpIHsKKwkJcmV0dXJuIGxlZnQgPT0gbnVsbCA/IHJpZ2h0ID09IG51bGwgOiAoKHJpZ2h0ICE9IG51bGwpICYmIGxlZnQuZXF1YWxzKHJpZ2h0KSk7CisJfQorCisJLyoqCisJICogVGVzdHMgd2hldGhlciB0d28gYXJyYXlzIG9mIG9iamVjdHMgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIuIFRoZSBhcnJheXMKKwkgKiBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IHRoZWlyIGVsZW1lbnRzIG1heSBiZQorCSAqIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGxlZnRBcnJheQorCSAqICAgICAgICAgICAgVGhlIGxlZnQgYXJyYXkgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgbWF5CisJICogICAgICAgICAgICBiZSBlbXB0eSBhbmQgbWF5IGNvbnRhaW4gPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCisJICogQHBhcmFtIHJpZ2h0QXJyYXkKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBhcnJheSB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCBtYXkKKwkgKiAgICAgICAgICAgIGJlIGVtcHR5IGFuZCBtYXkgY29udGFpbiA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheXMgYXJlIGVxdWFsIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzCisJICogICAgICAgICBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcmUgZXF1YWw7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3RbXSBsZWZ0QXJyYXksIGZpbmFsIE9iamVjdFtdIHJpZ2h0QXJyYXkpIHsKKwkJaWYgKGxlZnRBcnJheSA9PSByaWdodEFycmF5KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmIChsZWZ0QXJyYXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIChyaWdodEFycmF5ID09IG51bGwpOworCQl9IGVsc2UgaWYgKHJpZ2h0QXJyYXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKGxlZnRBcnJheS5sZW5ndGggIT0gcmlnaHRBcnJheS5sZW5ndGgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVmdEFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlmaW5hbCBPYmplY3QgbGVmdCA9IGxlZnRBcnJheVtpXTsKKwkJCWZpbmFsIE9iamVjdCByaWdodCA9IHJpZ2h0QXJyYXlbaV07CisJCQlmaW5hbCBib29sZWFuIGVxdWFsID0gKGxlZnQgPT0gbnVsbCkgPyAocmlnaHQgPT0gbnVsbCkgOiAobGVmdC5lcXVhbHMocmlnaHQpKTsKKwkJCWlmICghZXF1YWwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBQcm92aWRlcyBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW50ZWdlciB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBpCisJICogICAgICAgICAgICBUaGUgaW50ZWdlciB2YWx1ZQorCSAqIEByZXR1cm4gPGNvZGU+aTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNoQ29kZShmaW5hbCBpbnQgaSkgeworCQlyZXR1cm4gaTsKKwl9CisKKwkvKioKKwkgKiBQcm92aWRlcyBhIGhhc2ggY29kZSBmb3IgdGhlIG9iamVjdCAtLSBkZWZlbmRpbmcgYWdhaW5zdAorCSAqIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgVGhlIG9iamVjdCBmb3Igd2hpY2ggYSBoYXNoIGNvZGUgaXMgcmVxdWlyZWQuCisJICogQHJldHVybiA8Y29kZT5vYmplY3QuaGFzaENvZGU8L2NvZGU+IG9yIDxjb2RlPjA8L2NvZGU+IGlmCisJICogICAgICAgICA8Y29kZT5vYmplY3Q8L2NvZGU+IGlmIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG9iamVjdCAhPSBudWxsID8gb2JqZWN0Lmhhc2hDb2RlKCkgOiAwOworCX0KKworCS8qKgorCSAqIENvbXB1dGVzIHRoZSBoYXNoIGNvZGUgZm9yIGFuIGFycmF5IG9mIG9iamVjdHMsIGJ1dCB3aXRoIGRlZmVuc2UgYWdhaW5zdAorCSAqIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIG9iamVjdHMKKwkgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiBvYmplY3RzIGZvciB3aGljaCBhIGhhc2ggY29kZSBpcyBuZWVkZWQ7IG1heSBiZQorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBUaGUgaGFzaCBjb2RlIGZvciA8Y29kZT5vYmplY3RzPC9jb2RlPjsgb3IgPGNvZGU+MDwvY29kZT4gaWYKKwkgKiAgICAgICAgIDxjb2RlPm9iamVjdHM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGZpbmFsIE9iamVjdFtdIG9iamVjdHMpIHsKKwkJaWYgKG9iamVjdHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpbnQgaGFzaENvZGUgPSA4OTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7CisJCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0c1tpXTsKKwkJCWlmIChvYmplY3QgIT0gbnVsbCkgeworCQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiAzMSArIG9iamVjdC5oYXNoQ29kZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGhhc2hDb2RlOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBzZWNvbmQgYXJyYXkgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUgZmlyc3QgYXJyYXksIGFuZAorCSAqIHRoYXQgdGhleSBzaGFyZSBjb21tb24gc3RhcnRpbmcgZWxlbWVudHMuCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGZpcnN0IGFycmF5IHRvIGNvbXBhcmUgKGxhcmdlKTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgVGhlIHNlY29uZCBhcnJheSB0byBjb21wYXJlIChzbWFsbCk7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZXF1YWxzCisJICogICAgICAgICAgICBXaGV0aGVyIGl0IGlzIGFsbG93ZWQgZm9yIHRoZSB0d28gYXJyYXlzIHRvIGJlIGVxdWl2YWxlbnQuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlyc3QgYXJyYXlzIHN0YXJ0cyB3aXRoIHRoZSBzZWNvbmQKKwkgKiAgICAgICAgIGxpc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgT2JqZWN0W10gbGVmdCwgZmluYWwgT2JqZWN0W10gcmlnaHQsIGZpbmFsIGJvb2xlYW4gZXF1YWxzKSB7CisJCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKKwkJaW50IHIgPSByaWdodC5sZW5ndGg7CisKKwkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykgeworCQkJaWYgKCFlcXVhbHMobGVmdFtpXSwgcmlnaHRbaV0pKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQ29udmVydHMgYW4gYXJyYXkgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB0aGF0IGlzIHN1aXRhYmxlIGZvcgorCSAqIGRlYnVnZ2luZy4KKwkgKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgVGhlIGFycmF5IHRvIGNvbnZlcnQ7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFycmF5OyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhmaW5hbCBPYmplY3RbXSBhcnJheSkgeworCQlpZiAoYXJyYXkgPT0gbnVsbCkgeworCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZCgnWycpOworCisJCWZpbmFsIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpICE9IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKCcsJyk7CisJCQl9CisJCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gYXJyYXlbaV07CisJCQlmaW5hbCBTdHJpbmcgZWxlbWVudCA9IFN0cmluZy52YWx1ZU9mKG9iamVjdCk7CisJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnQpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKworCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogUHJvdmlkZXMgYSB0cmFuc2xhdGlvbiBvZiBhIHBhcnRpY3VsYXIga2V5IGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KKwkgKgorCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQorCSAqICAgICAgICAgICAgVGhlIGtleSB0byBsb29rIHVwIGluIHRoZSByZXNvdXJjZSBidW5kbGU7IHNob3VsZCBub3QgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIFRoZSBrZXkgdG8gbG9vayB1cCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlOyBzaG91bGQgbm90IGJlCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZGVmYXVsdFN0cmluZworCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlIGZvdW5kOyBtYXkgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGVkIHJlc291cmNlIGF0IDxjb2RlPmtleTwvY29kZT4uIElmIHRoZQorCSAqICAgICAgICAga2V5IGNhbm5vdCBiZSBmb3VuZCwgdGhlbiBpdCBpcyBzaW1wbHkgdGhlCisJICogICAgICAgICA8Y29kZT5kZWZhdWx0U3RyaW5nPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoZmluYWwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGZpbmFsIFN0cmluZyBrZXksCisJCQlmaW5hbCBTdHJpbmcgZGVmYXVsdFN0cmluZykgeworCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlmaW5hbCBTdHJpbmcgdHJhbnNsYXRlZFN0cmluZyA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOworCisJCQkJaWYgKHRyYW5zbGF0ZWRTdHJpbmcgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gdHJhbnNsYXRlZFN0cmluZzsKKwkJCQl9CisJCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZU1pc3NpbmdSZXNvdXJjZSkgeworCQkJCS8vIFN1Y2ggaXMgbGlmZS4gV2UnbGwgcmV0dXJuIHRoZSBrZXkKKwkJCX0KKwkJfQorCisJCXJldHVybiBkZWZhdWx0U3RyaW5nOworCX0KKworCS8qKgorCSAqIEZvdW5kYXRpb24gcmVwbGFjZW1lbnQgZm9yIFN0cmluZy5yZXBsYWNlQWxsKCopLgorCSAqCisJICogQHBhcmFtIHNyYworCSAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHN0cmluZy4KKwkgKiBAcGFyYW0gZmluZAorCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBmaW5kLgorCSAqIEBwYXJhbSByZXBsYWNlbWVudAorCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byByZXBsYWNlLgorCSAqIEByZXR1cm4gVGhlIG5ldyBzdHJpbmcuCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlcGxhY2VBbGwoU3RyaW5nIHNyYywgU3RyaW5nIGZpbmQsIFN0cmluZyByZXBsYWNlbWVudCkgeworCQlmaW5hbCBpbnQgbGVuID0gc3JjLmxlbmd0aCgpOworCQlmaW5hbCBpbnQgZmluZExlbiA9IGZpbmQubGVuZ3RoKCk7CisKKwkJaW50IGlkeCA9IHNyYy5pbmRleE9mKGZpbmQpOworCQlpZiAoaWR4IDwgMCkgeworCQkJcmV0dXJuIHNyYzsKKwkJfQorCisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWludCBiZWdpbkluZGV4ID0gMDsKKwkJd2hpbGUgKGlkeCAhPSAtMSAmJiBpZHggPCBsZW4pIHsKKwkJCWJ1Zi5hcHBlbmQoc3JjLnN1YnN0cmluZyhiZWdpbkluZGV4LCBpZHgpKTsKKwkJCWJ1Zi5hcHBlbmQocmVwbGFjZW1lbnQpOworCisJCQliZWdpbkluZGV4ID0gaWR4ICsgZmluZExlbjsKKwkJCWlmIChiZWdpbkluZGV4IDwgbGVuKSB7CisJCQkJaWR4ID0gc3JjLmluZGV4T2YoZmluZCwgYmVnaW5JbmRleCk7CisJCQl9IGVsc2UgeworCQkJCWlkeCA9IC0xOworCQkJfQorCQl9CisJCWlmIChiZWdpbkluZGV4IDwgbGVuKSB7CisJCQlidWYuYXBwZW5kKHNyYy5zdWJzdHJpbmcoYmVnaW5JbmRleCwgKGlkeCA9PSAtMSA/IGxlbiA6IGlkeCkpKTsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJLy8KKwkvLyBNZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlIHdpbmRvd2luZyBzeXN0ZW0KKwkvLworCisJLyoqCisJICogV2luZG93aW5nIHN5c3RlbSBjb25zdGFudC4KKwkgKgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19XSU4zMiA9ICJ3aW4zMiI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogV2luZG93aW5nIHN5c3RlbSBjb25zdGFudC4KKwkgKgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19NT1RJRiA9ICJtb3RpZiI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogV2luZG93aW5nIHN5c3RlbSBjb25zdGFudC4KKwkgKgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19HVEsgPSAiZ3RrIjsvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBXaW5kb3dpbmcgc3lzdGVtIGNvbnN0YW50LgorCSAqCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX1BIT1RPTiA9ICJwaG90b24iOy8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFdpbmRvd2luZyBzeXN0ZW0gY29uc3RhbnQuCisJICoKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NfQ0FSQk9OID0gImNhcmJvbiI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogV2luZG93aW5nIHN5c3RlbSBjb25zdGFudC4KKwkgKgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DT0NPQSA9ICJjb2NvYSI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogV2luZG93aW5nIHN5c3RlbSBjb25zdGFudC4KKwkgKgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19XUEYgPSAid3BmIjsvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBXaW5kb3dpbmcgc3lzdGVtIGNvbnN0YW50LgorCSAqCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX1VOS05PV04gPSAidW5rbm93biI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29tbW9uIFdTIHF1ZXJ5IGhlbHBlciBtZXRob2QuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciB3aW5kb3dzIHBsYXRmb3JtcworCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaW5kb3dzKCkgeworCQlmaW5hbCBTdHJpbmcgd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKwkJcmV0dXJuIFdTX1dJTjMyLmVxdWFscyh3cykgfHwgV1NfV1BGLmVxdWFscyh3cyk7CisJfQorCisJLyoqCisJICogQ29tbW9uIFdTIHF1ZXJ5IGhlbHBlciBtZXRob2QuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciBtYWMgcGxhdGZvcm1zCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc01hYygpIHsKKwkJZmluYWwgU3RyaW5nIHdzID0gU1dULmdldFBsYXRmb3JtKCk7CisJCXJldHVybiBXU19DQVJCT04uZXF1YWxzKHdzKSB8fCBXU19DT0NPQS5lcXVhbHMod3MpOworCX0KKworCS8qKgorCSAqIENvbW1vbiBXUyBxdWVyeSBoZWxwZXIgbWV0aG9kLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgbGludXggcGxhdGZvcm0KKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGludXgoKSB7CisJCWZpbmFsIFN0cmluZyB3cyA9IFNXVC5nZXRQbGF0Zm9ybSgpOworCQlyZXR1cm4gV1NfR1RLLmVxdWFscyh3cykgfHwgV1NfTU9USUYuZXF1YWxzKHdzKTsKKwl9CisKKwkvKioKKwkgKiBDb21tb24gV1MgcXVlcnkgaGVscGVyIG1ldGhvZC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGd0ayBwbGF0Zm9ybXMKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzR3RrKCkgeworCQlmaW5hbCBTdHJpbmcgd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKwkJcmV0dXJuIFdTX0dUSy5lcXVhbHMod3MpOworCX0KKworCS8qKgorCSAqIENvbW1vbiBXUyBxdWVyeSBoZWxwZXIgbWV0aG9kLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgbW90aWYgcGxhdGZvcm1zCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc01vdGlmKCkgeworCQlmaW5hbCBTdHJpbmcgd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKwkJcmV0dXJuIFdTX01PVElGLmVxdWFscyh3cyk7CisJfQorCisJLyoqCisJICogQ29tbW9uIFdTIHF1ZXJ5IGhlbHBlciBtZXRob2QuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciBwaG90b24gcGxhdGZvcm1zCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1Bob3RvbigpIHsKKwkJZmluYWwgU3RyaW5nIHdzID0gU1dULmdldFBsYXRmb3JtKCk7CisJCXJldHVybiBXU19QSE9UT04uZXF1YWxzKHdzKTsKKwl9CisKKwkvKioKKwkgKiBDb21tb24gV1MgcXVlcnkgaGVscGVyIG1ldGhvZC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGNhcmJvbiBwbGF0Zm9ybXMKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzQ2FyYm9uKCkgeworCQlmaW5hbCBTdHJpbmcgd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKwkJcmV0dXJuIFdTX0NBUkJPTi5lcXVhbHMod3MpOworCX0KKworCS8qKgorCSAqIENvbW1vbiBXUyBxdWVyeSBoZWxwZXIgbWV0aG9kLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhlIGNvY29hIHBsYXRmb3JtLgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNDb2NvYSgpIHsKKwkJZmluYWwgU3RyaW5nIHdzID0gU1dULmdldFBsYXRmb3JtKCk7CisJCXJldHVybiBXU19DT0NPQS5lcXVhbHMod3MpOworCX0KKworCS8qKgorCSAqIENvbW1vbiBXUyBxdWVyeSBoZWxwZXIgbWV0aG9kLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgV1BGCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1dwZigpIHsKKwkJZmluYWwgU3RyaW5nIHdzID0gU1dULmdldFBsYXRmb3JtKCk7CisJCXJldHVybiBXU19XUEYuZXF1YWxzKHdzKTsKKwl9CisKKwkvKioKKwkgKiBDb21tb24gV1MgcXVlcnkgaGVscGVyIG1ldGhvZC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHdpbjMyCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1dpbjMyKCkgeworCQlmaW5hbCBTdHJpbmcgd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKwkJcmV0dXJuIFdTX1dJTjMyLmVxdWFscyh3cyk7CisJfQorCisJLyoqCisJICogQ29tbW9uIFdTIHF1ZXJ5IGhlbHBlciBtZXRob2QuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBTV1Qgd2luZG93aW5nIHBsYXRmb3JtIHN0cmluZy4KKwkgKiBAc2VlIFNXVCNnZXRQbGF0Zm9ybSgpCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdTKCkgeworCQlyZXR1cm4gU1dULmdldFBsYXRmb3JtKCk7CisJfQorCisJLyoqCisJICogVGhpcyBjbGFzcyBzaG91bGQgbmV2ZXIgYmUgY29uc3RydWN0ZWQuCisJICovCisJcHJpdmF0ZSBVdGlsKCkgeworCQkvLyBOb3QgYWxsb3dlZC4KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9rZXlzL0NhbmNlbE9uTW9kaWZ5TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2JpbmRpbmdzL2tleXMvQ2FuY2VsT25Nb2RpZnlMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzRkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9iaW5kaW5ncy9rZXlzL0NhbmNlbE9uTW9kaWZ5TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mua2V5czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworCisvKioKKyAqIEEgbGlzdGVuZXIgdGhhdCByZW1vdmVzIHRoZSBvdXQtb2Ytb3JkZXIgbGlzdGVuZXIgaWYgYSBtb2RpZmljYXRpb24gb2NjdXJzIGJlZm9yZSByZWFjaGluZyBpdC4KKyAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBCdWcgNTM0OTcuCisgKiAKKyAqIEBzaW5jZSAzLjAKKyAqLworZmluYWwgY2xhc3MgQ2FuY2VsT25Nb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCS8qKgorCSAqIFRoZSBsaXN0ZW5lciB0byByZW1vdmUgd2hlbiB0aGlzIGxpc3RlbmVyIGNhdGNoZXMgYW55IGV2ZW50LiBUaGlzIHZhbHVlIHNob3VsZCBub3QgYmUKKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3RlbmVyIGNoYWluZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+Q2FuY2VsT25Nb2RpZnlMaXN0ZW5lcjwvY29kZT4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZXZlbnQgb2YgYSBtb2RpZmljYXRpb24gZXZlbnQKKwkgKiAgICAgICAgICAgIGFycml2aW5nOyBzaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUNhbmNlbE9uTW9kaWZ5TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJY2hhaW5lZExpc3RlbmVyID0gbGlzdGVuZXI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJV2lkZ2V0IHdpZGdldCA9IGV2ZW50LndpZGdldDsKKwkJd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOworCQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIGNoYWluZWRMaXN0ZW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzA5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5jbGFzc3BhdGgKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcmFwIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS43Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNGZlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5wcm9qZWN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0PC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyMmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpAQCAtMCwwICsxLDIgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorbGluZS5zZXBhcmF0b3I9XG4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTQwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDQxOSBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24uaW5oZXJpdE51bGxBbm5vdGF0aW9ucz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5taXNzaW5nTm9uTnVsbEJ5RGVmYXVsdEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm5vbm51bGw9b3JnLmVjbGlwc2UuamR0LmFubm90YXRpb24uTm9uTnVsbAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5ub25udWxsYnlkZWZhdWx0PW9yZy5lY2xpcHNlLmpkdC5hbm5vdGF0aW9uLk5vbk51bGxCeURlZmF1bHQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubnVsbGFibGU9b3JnLmVjbGlwc2UuamR0LmFubm90YXRpb24uTnVsbGFibGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubnVsbGFuYWx5c2lzPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4ubWV0aG9kUGFyYW1ldGVycz1kbyBub3QgZ2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5leHBsaWNpdGx5Q2xvc2VkQXV0b0Nsb3NlYWJsZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY2x1ZGVOdWxsSW5mb0Zyb21Bc3NlcnRzPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByb3RlY3RlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlZmF1bHRDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdFbnVtQ2FzZURlc3BpdGVEZWZhdWx0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb249ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25udWxsUGFyYW1ldGVyQW5ub3RhdGlvbkRyb3BwZWQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsQW5ub3RhdGlvbkluZmVyZW5jZUNvbmZsaWN0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFNwZWNWaW9sYXRpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFVuY2hlY2tlZENvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxseVVuY2xvc2VkQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzT3B0aW9uYWxFcnJvcnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRhY3RpY051bGxBbmFseXNpc0ZvckZpZWxkcz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2xvc2VkQ2xvc2VhYmxlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRXhjZXB0aW9uUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRPYmplY3RBbGxvY2F0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkVHlwZVBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNworb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfbGluZV9jb21tZW50X3N0YXJ0aW5nX29uX2ZpcnN0X2NvbHVtbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fd3JhcHBlZF9saW5lcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDZlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSwxMjQgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXBfcHJvZmlsZT1vcmcuZWNsaXBzZS5qZHQudWkuZGVmYXVsdC5lY2xpcHNlX2NsZWFuX3VwX3Byb2ZpbGUKK2NsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCitmb3JtYXR0ZXJfcHJvZmlsZT1vcmcuZWNsaXBzZS5qZHQudWkuZGVmYXVsdC5lY2xpcHNlX3Byb2ZpbGUKK2Zvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCitvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQorb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07CitvcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD05OQorb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9OTkKK29yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gdGhlICR7YmFyZV9maWVsZF9uYW1lfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiAqXG4gKiBDb250cmlidXRvcnNcOlxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxuICpcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcbiAqIFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJkZWxlZ2F0ZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGRlbGVnYXRlIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZGVsZWdhdGVjb21tZW50IiBuYW1lXD0iZGVsZWdhdGVjb21tZW50Ij4vKipcbiAqICR7dGFnc31cbiAqICR7c2VlX3RvX3RhcmdldH1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cblxuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CitzcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK3NwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9dHJ1ZQorc3BfY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitzcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitzcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz10cnVlCitzcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitzcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorc3BfY2xlYW51cC51c2VfbGFtYmRhPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK3NwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK3NwX2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDllYzljCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5wcmVmcwpAQCAtMCwwICsxLDk3IEBACitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9BRERFRF9NRVRIT0RfV0lUSE9VVF9ERUZBVUxUX1ZBTFVFPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9GSUVMRD1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9NRVRIT0Q9RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0FQSV9DT01QT05FTlRfRUxFTUVOVF9UWVBFX1JFTU9WRURfQVBJX1RZUEU9RXJyb3IKK0FQSV9DT01QT05FTlRfRUxFTUVOVF9UWVBFX1JFTU9WRURfUkVFWFBPUlRFRF9BUElfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9SRUVYUE9SVEVEX1RZUEU9RXJyb3IKK0FQSV9DT01QT05FTlRfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRT1FcnJvcgorQVBJX1VTRV9TQ0FOX0ZJRUxEX1NFVkVSSVRZPUVycm9yCitBUElfVVNFX1NDQU5fTUVUSE9EX1NFVkVSSVRZPUVycm9yCitBUElfVVNFX1NDQU5fVFlQRV9TRVZFUklUWT1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0FEREVEX1JFU1RSSUNUSU9OUz1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0FEREVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9DT05UUkFDVEVEX1NVUEVSSU5URVJGQUNFU19TRVQ9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX0FCU1RSQUNUX1RPX0FCU1RSQUNUPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fRklOQUxfVE9fRklOQUw9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfQ09OU1RSVUNUT1I9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9NRVRIT0Q9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1NVUEVSQ0xBU1M9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfTUVNQkVSPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX0FEREVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1ZBUkFSR1NfVE9fQVJSQVk9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFX0NPTlZFUlNJT049RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX1JFTU9WRURfRU5VTV9DT05TVEFOVD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9GSUVMRD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9NRVRIT0Q9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9BRERFRF9WQUxVRT1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9GSU5BTF9UT19OT05fRklOQUxfU1RBVElDX0NPTlNUQU5UPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fRklOQUxfVE9fRklOQUw9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9TVEFUSUNfVE9fU1RBVElDPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9TVEFUSUNfVE9fTk9OX1NUQVRJQz1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRT1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFMVUU9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfQVJHVU1FTlQ9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1ZBTFVFPUVycm9yCitJTExFR0FMX0VYVEVORD1XYXJuaW5nCitJTExFR0FMX0lNUExFTUVOVD1XYXJuaW5nCitJTExFR0FMX0lOU1RBTlRJQVRFPVdhcm5pbmcKK0lMTEVHQUxfT1ZFUlJJREU9V2FybmluZworSUxMRUdBTF9SRUZFUkVOQ0U9V2FybmluZworSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9GSUVMRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9NRVRIT0Q9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfUkVTVFJJQ1RJT05TPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX1NVUEVSX0lOVEVSRkFDRV9XSVRIX01FVEhPRFM9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9DT05UUkFDVEVEX1NVUEVSSU5URVJGQUNFU19TRVQ9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFX0NPTlZFUlNJT049RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9GSUVMRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfTUVNQkVSPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0lOVkFMSURfSkFWQURPQ19UQUc9V2FybmluZworSU5WQUxJRF9SRUZFUkVOQ0VfSU5fU1lTVEVNX0xJQlJBUklFUz1FcnJvcgorTEVBS19FWFRFTkQ9V2FybmluZworTEVBS19GSUVMRF9ERUNMPVdhcm5pbmcKK0xFQUtfSU1QTEVNRU5UPVdhcm5pbmcKK0xFQUtfTUVUSE9EX1BBUkFNPVdhcm5pbmcKK0xFQUtfTUVUSE9EX1JFVFVSTl9UWVBFPVdhcm5pbmcKK01FVEhPRF9FTEVNRU5UX1RZUEVfQURERURfUkVTVFJJQ1RJT05TPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0FEREVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX0FCU1RSQUNUX1RPX0FCU1RSQUNUPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX0ZJTkFMX1RPX0ZJTkFMPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX1NUQVRJQ19UT19TVEFUSUM9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9TVEFUSUNfVE9fTk9OX1NUQVRJQz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1ZBUkFSR1NfVE9fQVJSQVk9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9BTk5PVEFUSU9OX0RFRkFVTFRfVkFMVUU9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorTUlTU0lOR19FRV9ERVNDUklQVElPTlM9V2FybmluZworVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX0FEREVEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQURERURfSU5URVJGQUNFX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9DTEFTU19CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX0NIQU5HRURfSU5URVJGQUNFX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9DTEFTU19CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX1JFTU9WRURfSU5URVJGQUNFX0JPVU5EPUVycm9yCitVTlVTRURfUFJPQkxFTV9GSUxURVJTPVdhcm5pbmcKK2F1dG9tYXRpY2FsbHlfcmVtb3ZlZF91bnVzZWRfcHJvYmxlbV9maWx0ZXJzPWZhbHNlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQoraW5jb21wYXRpYmxlX2FwaV9jb21wb25lbnRfdmVyc2lvbj1FcnJvcgoraW5jb21wYXRpYmxlX2FwaV9jb21wb25lbnRfdmVyc2lvbl9pbmNsdWRlX21ham9yX3dpdGhvdXRfYnJlYWtpbmdfY2hhbmdlPURpc2FibGVkCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uX2luY2x1ZGVfbWlub3Jfd2l0aG91dF9hcGlfY2hhbmdlPURpc2FibGVkCitpbnZhbGlkX3NpbmNlX3RhZ192ZXJzaW9uPUVycm9yCittYWxmb3JtZWRfc2luY2VfdGFnPUVycm9yCittaXNzaW5nX3NpbmNlX3RhZz1FcnJvcgorcmVwb3J0X2FwaV9icmVha2FnZV93aGVuX21ham9yX3ZlcnNpb25faW5jcmVtZW50ZWQ9RGlzYWJsZWQKK3JlcG9ydF9yZXNvbHV0aW9uX2Vycm9yc19hcGlfY29tcG9uZW50PVdhcm5pbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U1MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCkBAIC0wLDAgKzEsMzIgQEAKK2NvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQorY29tcGlsZXJzLmYudW5yZXNvbHZlZC1wbHVnaW5zPTEKK2NvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQorY29tcGlsZXJzLnAuYnVpbGQ9MQorY29tcGlsZXJzLnAuYnVpbGQuYmluLmluY2x1ZGVzPTEKK2NvbXBpbGVycy5wLmJ1aWxkLmVuY29kaW5ncz0yCitjb21waWxlcnMucC5idWlsZC5qYXZhLmNvbXBpbGVyPTIKK2NvbXBpbGVycy5wLmJ1aWxkLmphdmEuY29tcGxpYW5jZT0xCitjb21waWxlcnMucC5idWlsZC5taXNzaW5nLm91dHB1dD0xCitjb21waWxlcnMucC5idWlsZC5vdXRwdXQubGlicmFyeT0xCitjb21waWxlcnMucC5idWlsZC5zb3VyY2UubGlicmFyeT0xCitjb21waWxlcnMucC5idWlsZC5zcmMuaW5jbHVkZXM9MQorY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCitjb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xCitjb21waWxlcnMucC5pbnRlcm5hbD0xCitjb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1leHBvcnQtcGFja2FnZT0yCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24taW1wb3J0LXBhY2thZ2U9MQorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLXJlcXVpcmUtYnVuZGxlPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0xCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCitjb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQorY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCitjb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCitjb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCitjb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQorY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKK2NvbXBpbGVycy5zLm9wZW4tdGFncz0xCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwzMiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dDtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cztidW5kbGUtdmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGk7YnVuZGxlLXZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjAuOS4xIiwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIwLjkuMSIsCisgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4xMDAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDtidW5kbGUtdmVyc2lvbj0iMC45LjEiLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQudWkuZGk7YnVuZGxlLXZlcnNpb249IjAuMTAuMCIsCisgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSIyLjcuMCIsCisgb3JnLmVjbGlwc2UucmFwLnJ3dDtidW5kbGUtdmVyc2lvbj0iMi4zLjAiLAorIG9yZy5lY2xpcHNlLnJhcC5qZmFjZTtidW5kbGUtdmVyc2lvbj0iMi4zLjAiCitSZXF1aXJlLUNhcGFiaWxpdHk6IG9yZy5lY2xpcHNlLnJhcAorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjcKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitJbXBvcnQtUGFja2FnZTogamF2YXguYW5ub3RhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCisgamF2YXguaW5qZWN0O3ZlcnNpb249IjEuMC4wIiwKKyBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LAorIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLmNsZWFudXBhZGRvbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuZG5kYWRkb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLm1pbm1heDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3BsaXR0ZXJhZGRvbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvTUVUQS1JTkYvcDIuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9NRVRBLUlORi9wMi5pbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvTUVUQS1JTkYvcDIuaW5mCkBAIC0wLDAgKzEsMTMgQEAKKyMgRW5zdXJlIHRoYXQgbW9kaWZpZWQgUkFQIGU0IHBsYXRmb3JtIGJ1bmRsZXMgYXJlIG9ubHkgaW5zdGFsbGVkIGluIFJBUCBlbnZpcm9ubWVudAorIyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMTc3CisjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTA5MjIKKworIyBNYWtlIHN1cmUgdGhhdCBhIFJBUCBSV1QgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCityZXF1aXJlcy4wLm5hbWVzcGFjZSA9IG9yZy5lY2xpcHNlLnJhcAorcmVxdWlyZXMuMC5uYW1lID0gb3JnLmVjbGlwc2UucmFwLnJ3dAorCisjIERvIG5vdCBhbGxvdyB0byBpbnN0YWxsIHRoaXMgSVUgaW4gY2FzZSB0aGUgU1dUIGJ1bmRsZSBpcyBhdmFpbGFibGUKK3JlcXVpcmVzLjEubmFtZXNwYWNlID0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdQorcmVxdWlyZXMuMS5uYW1lID0gb3JnLmVjbGlwc2Uuc3d0CityZXF1aXJlcy4xLm1pbiA9IDAKK3JlcXVpcmVzLjEubWF4ID0gMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPk5vdmVtYmVyIDIwLCAyMDA4PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTFmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBvcHlyaWdodCAoYykgMjAxMywgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgICBzcmMtcmFwLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgaWNvbnMvCitzcmMuaW5jbHVkZXMgPSBpY29ucy8sXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbAoranJlLmNvbXBpbGF0aW9uLnByb2ZpbGUgPSBKYXZhU0UtMS43CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvZm9yY2VRdWFsaWZpZXJVcGRhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDcwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dApAQCAtMCwwICsxLDMgQEAKKyMgVG8gZm9yY2UgYSB2ZXJzaW9uIHF1YWxpZmllciB1cGRhdGUgYWRkIHRoZSBidWcgaGVyZQorQnVnIDQwMzM1MiAtIFVwZGF0ZSBhbGwgcGFyZW50IHZlcnNpb25zIHRvIG1hdGNoIG91ciBidWlsZCBzdHJlYW0KK0J1ZyA0MjkxODQgLSBbTWV0YWRhdGFdIGNvbXBhcmF0b3IgZXJyb3JzIGluIG1vc3QgcmVjZW50IEktYnVpbGRzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ljb25zL2Z1bGwvZXRvb2wxNi9mYXN0dmlld19yZXN0b3JlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvaWNvbnMvZnVsbC9ldG9vbDE2L2Zhc3R2aWV3X3Jlc3RvcmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDEwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ljb25zL2Z1bGwvZXRvb2wxNi9mYXN0dmlld19yZXN0b3JlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ljb25zL2Z1bGwvb2JqMTYvbGF5b3V0X2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvaWNvbnMvZnVsbC9vYmoxNi9sYXlvdXRfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGNkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ljb25zL2Z1bGwvb2JqMTYvbGF5b3V0X2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNhM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGx1Z2luTmFtZSA9IEVjbGlwc2UgZTQgV29ya2JlbmNoIEFkZC1vbnMKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCisKK2V4dGVuc2lvbi5hZGRvbnNuaXBwZXQubmFtZSA9IEFkZG9uIFNuaXBwZXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1ZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvcGx1Z2luLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgorPHBsdWdpbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIGlkPSJBZGRvblNuaXBwZXQiCisgICAgICAgICBuYW1lPSIlZXh0ZW5zaW9uLmFkZG9uc25pcHBldC5uYW1lIgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmU0LndvcmtiZW5jaC5tb2RlbCI+CisgICAgICA8cHJvY2Vzc29yCisgICAgICAgICAgICBiZWZvcmVmcmFnbWVudD0idHJ1ZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC5DbGVhbnVwUHJvY2Vzc29yIj4KKyAgICAgIDwvcHJvY2Vzc29yPgorICAgICAgPHByb2Nlc3NvcgorICAgICAgICAgICAgYmVmb3JlZnJhZ21lbnQ9InRydWUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QuTWluTWF4UHJvY2Vzc29yIj4KKyAgICAgIDwvcHJvY2Vzc29yPgorICAgICAgPCEtLXByb2Nlc3NvcgorICAgICAgICAgICAgYmVmb3JlZnJhZ21lbnQ9InRydWUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QuRG5EUHJvY2Vzc29yIj4KKyAgICAgIDwvcHJvY2Vzc29yLS0+CisgICAgICA8cHJvY2Vzc29yCisgICAgICAgICAgICBiZWZvcmVmcmFnbWVudD0idHJ1ZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC5TcGxpdHRlclByb2Nlc3NvciI+CisgICAgICA8L3Byb2Nlc3Nvcj4KKyAgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvcG9tLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDJkMGEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9wb20ueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5yYXAuZTQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0PC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjIuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UucmFwLmU0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQtcmVsZW5nPC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcmVsZW5nL3JlbGVuZy10YXJnZXQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDwhLS0gdG8gZW5zdXJlIHRoYXQgdGhlIGZlYXR1cmUgbG9va3VwIG9mIHRoZSB1aSB0ZXN0IHdvcmtzIC0tPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GLzwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHljaG8tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L1RyaW1QYW5lTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy1yYXAvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9taW5tYXgvVHJpbVBhbmVMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdjMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L1RyaW1QYW5lTGF5b3V0LmphdmEKQEAgLTAsMCArMSwzMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5taW5tYXg7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgVHJpbVBhbmVMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJcHJpdmF0ZSBzdGF0aWMgaW50IEJPUkRFUl9XSURUSCA9IDQ7CisJcHJpdmF0ZSBpbnQgZml4ZWRDb3JuZXI7CisKKwlwdWJsaWMgUmVjdGFuZ2xlIGhTaXppbmdSZWN0OworCXB1YmxpYyBSZWN0YW5nbGUgdlNpemluZ1JlY3Q7CisJcHVibGljIFJlY3RhbmdsZSBjb3JuZXJSZWN0OworCXByaXZhdGUgUmVjdGFuZ2xlIGNsaWVudFJlY3Q7CisJcHJpdmF0ZSBib29sZWFuIHJlc2l6ZUluc3RhbGxlZCA9IGZhbHNlOworCisJLy8gcHJpdmF0ZSBzdGF0aWMgaW50IE5PVF9TSVpJTkcgPSAwOworCS8vIHByaXZhdGUgc3RhdGljIGludCBIT1JJWk9OVEFMX1NJWklORyA9IDE7CisJLy8gcHJpdmF0ZSBzdGF0aWMgaW50IFZFUlRJQ0FMX1NJWklORyA9IDI7CisJLy8gcHJpdmF0ZSBzdGF0aWMgaW50IENPUk5FUl9TSVpJTkcgPSAzOworCisJaW50IHRyYWNrU3RhdGUgPSBTV1QuTk9ORTsKKwlwcm90ZWN0ZWQgUG9pbnQgY3VyUG9zOworCisJLy8gcHJpdmF0ZSBNVG9vbENvbnRyb2wgdG9vbENvbnRyb2w7CisKKwlwdWJsaWMgVHJpbVBhbmVMYXlvdXQoTVRvb2xDb250cm9sIHRvb2xDb250cm9sLCBpbnQgYmFyU2lkZSkgeworCQkvLyB0aGlzLnRvb2xDb250cm9sID0gdG9vbENvbnRyb2w7CisJCXRoaXMuZml4ZWRDb3JuZXIgPSBiYXJTaWRlOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2NvbXB1dGVTaXplKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBpbnQsCisJICogYm9vbGVhbikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgeworCQlyZXR1cm4gbmV3IFBvaW50KDYwMCwgNDAwKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBib29sZWFuKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJaW5zdGFsbFJlc2l6ZShjb21wb3NpdGUpOworCisJCWlmIChjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggIT0gMSkKKwkJCXJldHVybjsKKworCQlpZiAoZml4ZWRDb3JuZXIgPT0gU1dULk5PTkUpCisJCQlyZXR1cm47CisKKwkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMoKTsKKworCQlpZiAoaXNGaXhlZChTV1QuVE9QKSkgeworCQkJaWYgKGlzRml4ZWQoU1dULlJJR0hUKSkgeworCQkJCWhTaXppbmdSZWN0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCBCT1JERVJfV0lEVEgsIGJvdW5kcy5oZWlnaHQgLSBCT1JERVJfV0lEVEgpOworCQkJCXZTaXppbmdSZWN0ID0gbmV3IFJlY3RhbmdsZShCT1JERVJfV0lEVEgsIGJvdW5kcy5oZWlnaHQgLSBCT1JERVJfV0lEVEgsCisJCQkJCQlib3VuZHMud2lkdGggLSBCT1JERVJfV0lEVEgsIEJPUkRFUl9XSURUSCk7CisJCQkJY29ybmVyUmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgYm91bmRzLmhlaWdodCAtIEJPUkRFUl9XSURUSCwgQk9SREVSX1dJRFRILAorCQkJCQkJQk9SREVSX1dJRFRIKTsKKwkJCQljbGllbnRSZWN0ID0gbmV3IFJlY3RhbmdsZShCT1JERVJfV0lEVEgsIDAsIGJvdW5kcy53aWR0aCAtIEJPUkRFUl9XSURUSCwKKwkJCQkJCWJvdW5kcy5oZWlnaHQgLSBCT1JERVJfV0lEVEgpOworCQkJfSBlbHNlIHsKKwkJCQloU2l6aW5nUmVjdCA9IG5ldyBSZWN0YW5nbGUoYm91bmRzLndpZHRoIC0gQk9SREVSX1dJRFRILCAwLCBCT1JERVJfV0lEVEgsCisJCQkJCQlib3VuZHMuaGVpZ2h0IC0gQk9SREVSX1dJRFRIKTsKKwkJCQl2U2l6aW5nUmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgYm91bmRzLmhlaWdodCAtIEJPUkRFUl9XSURUSCwgYm91bmRzLndpZHRoCisJCQkJCQktIEJPUkRFUl9XSURUSCwgQk9SREVSX1dJRFRIKTsKKwkJCQljb3JuZXJSZWN0ID0gbmV3IFJlY3RhbmdsZShib3VuZHMud2lkdGggLSBCT1JERVJfV0lEVEgsIGJvdW5kcy5oZWlnaHQKKwkJCQkJCS0gQk9SREVSX1dJRFRILCBCT1JERVJfV0lEVEgsIEJPUkRFUl9XSURUSCk7CisJCQkJY2xpZW50UmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoIC0gQk9SREVSX1dJRFRILCBib3VuZHMuaGVpZ2h0CisJCQkJCQktIEJPUkRFUl9XSURUSCk7CisJCQl9CisJCX0gZWxzZSBpZiAoaXNGaXhlZChTV1QuQk9UVE9NKSkgeworCQkJaWYgKGlzRml4ZWQoU1dULlJJR0hUKSkgeworCQkJCWhTaXppbmdSZWN0ID0gbmV3IFJlY3RhbmdsZSgwLCBCT1JERVJfV0lEVEgsIEJPUkRFUl9XSURUSCwgYm91bmRzLmhlaWdodAorCQkJCQkJLSBCT1JERVJfV0lEVEgpOworCQkJCXZTaXppbmdSZWN0ID0gbmV3IFJlY3RhbmdsZShCT1JERVJfV0lEVEgsIDAsIGJvdW5kcy53aWR0aCAtIEJPUkRFUl9XSURUSCwKKwkJCQkJCUJPUkRFUl9XSURUSCk7CisJCQkJY29ybmVyUmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgQk9SREVSX1dJRFRILCBCT1JERVJfV0lEVEgpOworCQkJCWNsaWVudFJlY3QgPSBuZXcgUmVjdGFuZ2xlKEJPUkRFUl9XSURUSCwgQk9SREVSX1dJRFRILCBib3VuZHMud2lkdGggLSBCT1JERVJfV0lEVEgsCisJCQkJCQlib3VuZHMuaGVpZ2h0IC0gQk9SREVSX1dJRFRIKTsKKwkJCX0gZWxzZSB7CisJCQkJaFNpemluZ1JlY3QgPSBuZXcgUmVjdGFuZ2xlKGJvdW5kcy53aWR0aCAtIEJPUkRFUl9XSURUSCwgQk9SREVSX1dJRFRILAorCQkJCQkJQk9SREVSX1dJRFRILCBib3VuZHMuaGVpZ2h0IC0gQk9SREVSX1dJRFRIKTsKKwkJCQl2U2l6aW5nUmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoIC0gQk9SREVSX1dJRFRILCBCT1JERVJfV0lEVEgpOworCQkJCWNvcm5lclJlY3QgPSBuZXcgUmVjdGFuZ2xlKGJvdW5kcy53aWR0aCAtIEJPUkRFUl9XSURUSCwgMCwgQk9SREVSX1dJRFRILAorCQkJCQkJQk9SREVSX1dJRFRIKTsKKwkJCQljbGllbnRSZWN0ID0gbmV3IFJlY3RhbmdsZSgwLCBCT1JERVJfV0lEVEgsIGJvdW5kcy53aWR0aCAtIEJPUkRFUl9XSURUSCwKKwkJCQkJCWJvdW5kcy5oZWlnaHQgLSBCT1JERVJfV0lEVEgpOworCQkJfQorCQl9CisJCUNvbnRyb2wgY2hpbGQgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKKwkJY2hpbGQuc2V0Qm91bmRzKGNsaWVudFJlY3QpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsUmVzaXplKGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJaWYgKHJlc2l6ZUluc3RhbGxlZCkKKwkJCXJldHVybjsKKwkJLy8gRklYTUUgUkFQIE5lZWRzIG5hdGl2ZSBzdXBwb3J0IG9uIGNsaWVudAorCQkvLyBjb21wb3NpdGUuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgeworCQkvLyAvKioKKwkJLy8gKgorCQkvLyAqLworCQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKKwkJLy8gUG9pbnQgcCA9IGUuZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOworCQkvLyBpZiAodHJhY2tTdGF0ZSA9PSBOT1RfU0laSU5HKSB7CisJCS8vIHNldEN1cnNvcihjb21wb3NpdGUsIG5ldyBQb2ludChlLngsIGUueSkpOworCQkvLyB9IGVsc2UgaWYgKHRyYWNrU3RhdGUgPT0gSE9SSVpPTlRBTF9TSVpJTkcpIHsKKwkJLy8gZHJhZ0hvcml6b250YWwoY29tcG9zaXRlLCBwKTsKKwkJLy8gfSBlbHNlIGlmICh0cmFja1N0YXRlID09IFZFUlRJQ0FMX1NJWklORykgeworCQkvLyBkcmFnVmVydGljYWwoY29tcG9zaXRlLCBwKTsKKwkJLy8gfSBlbHNlIGlmICh0cmFja1N0YXRlID09IENPUk5FUl9TSVpJTkcpIHsKKwkJLy8gZHJhZ0Nvcm5lcihjb21wb3NpdGUsIHApOworCQkvLyB9CisJCS8vIH0KKwkJLy8gfSk7CisJCS8vCisJCS8vIGNvbXBvc2l0ZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgeworCQkvLworCQkvLyAvKioKKwkJLy8gKgorCQkvLyAqLworCQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7CisJCS8vIGNvbXBvc2l0ZS5zZXRDYXB0dXJlKGZhbHNlKTsKKwkJLy8KKwkJLy8gLy8gUGVyc2lzdCB0aGUgY3VycmVudCBzaXplCisJCS8vIFBvaW50IHNpemUgPSBjb21wb3NpdGUuZ2V0U2l6ZSgpOworCQkvLyB0b29sQ29udHJvbC5nZXRQZXJzaXN0ZWRTdGF0ZSgpCisJCS8vIC5wdXQoVHJpbVN0YWNrLlNUQVRFX1hTSVpFLCBJbnRlZ2VyLnRvU3RyaW5nKHNpemUueCkpOworCQkvLyB0b29sQ29udHJvbC5nZXRQZXJzaXN0ZWRTdGF0ZSgpCisJCS8vIC5wdXQoVHJpbVN0YWNrLlNUQVRFX1lTSVpFLCBJbnRlZ2VyLnRvU3RyaW5nKHNpemUueSkpOworCQkvLworCQkvLyB0cmFja1N0YXRlID0gTk9UX1NJWklORzsKKwkJLy8gfQorCQkvLworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeworCQkvLyBQb2ludCBwID0gbmV3IFBvaW50KGUueCwgZS55KTsKKwkJLy8gaWYgKGhTaXppbmdSZWN0LmNvbnRhaW5zKHApKSB7CisJCS8vIGN1clBvcyA9IGUuZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOworCQkvLyB0cmFja1N0YXRlID0gSE9SSVpPTlRBTF9TSVpJTkc7CisJCS8vIGNvbXBvc2l0ZS5zZXRDYXB0dXJlKHRydWUpOworCQkvLyB9IGVsc2UgaWYgKHZTaXppbmdSZWN0LmNvbnRhaW5zKHApKSB7CisJCS8vIGN1clBvcyA9IGUuZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOworCQkvLyB0cmFja1N0YXRlID0gVkVSVElDQUxfU0laSU5HOworCQkvLyBjb21wb3NpdGUuc2V0Q2FwdHVyZSh0cnVlKTsKKwkJLy8gfSBlbHNlIGlmIChjb3JuZXJSZWN0LmNvbnRhaW5zKHApKSB7CisJCS8vIGN1clBvcyA9IGUuZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOworCQkvLyB0cmFja1N0YXRlID0gQ09STkVSX1NJWklORzsKKwkJLy8gY29tcG9zaXRlLnNldENhcHR1cmUodHJ1ZSk7CisJCS8vIH0KKwkJLy8gfQorCQkvLworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKKwkJLy8gfQorCQkvLyB9KTsKKwkJLy8KKwkJLy8gY29tcG9zaXRlLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0xpc3RlbmVyKCkgeworCQkvLyAvKioKKwkJLy8gKgorCQkvLyAqLworCQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7CisJCS8vIH0KKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKKwkJLy8gQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBlLndpZGdldDsKKwkJLy8gY29tcC5zZXRDdXJzb3IobnVsbCk7CisJCS8vIH0KKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7CisJCS8vIH0KKwkJLy8gfSk7CisJCS8vCisJCS8vIHJlc2l6ZUluc3RhbGxlZCA9IHRydWU7CisJfQorCisJLyoqCisJICogQHBhcmFtIHAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRDdXJzb3IoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgUG9pbnQgcCkgeworCQlpZiAoaFNpemluZ1JlY3QuY29udGFpbnMocCkpIHsKKwkJCWNvbXBvc2l0ZS5zZXRDdXJzb3IoY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoU1dULkNVUlNPUl9TSVpFV0UpKTsKKwkJfSBlbHNlIGlmICh2U2l6aW5nUmVjdC5jb250YWlucyhwKSkgeworCQkJY29tcG9zaXRlLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX1NJWkVOUykpOworCQl9IGVsc2UgaWYgKGNvcm5lclJlY3QuY29udGFpbnMocCkpIHsKKwkJCWlmIChpc0ZpeGVkKFNXVC5UT1ApKSB7CisJCQkJaWYgKGlzRml4ZWQoU1dULlJJR0hUKSkKKwkJCQkJY29tcG9zaXRlLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX1NJWkVTVykpOworCQkJCWVsc2UKKwkJCQkJY29tcG9zaXRlLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX1NJWkVTRSkpOworCQkJfSBlbHNlIGlmIChpc0ZpeGVkKFNXVC5CT1RUT00pKSB7CisJCQkJaWYgKGlzRml4ZWQoU1dULlJJR0hUKSkKKwkJCQkJY29tcG9zaXRlLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX1NJWkVTRSkpOworCQkJCWVsc2UKKwkJCQkJY29tcG9zaXRlLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX1NJWkVTVykpOworCQkJfQorCQl9IGVsc2UgeworCQkJY29tcG9zaXRlLnNldEN1cnNvcihudWxsKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGRyYWdDb3JuZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgUG9pbnQgcCkgeworCQlpbnQgZHggPSBwLnggLSBjdXJQb3MueDsKKwkJaW50IGR5ID0gcC55IC0gY3VyUG9zLnk7CisJCVJlY3RhbmdsZSBib3VuZHMgPSBjb21wb3NpdGUuZ2V0Qm91bmRzKCk7CisKKwkJaWYgKGlzRml4ZWQoU1dULlJJR0hUKSkgeworCQkJYm91bmRzLnggKz0gZHg7CisJCQlib3VuZHMud2lkdGggLT0gZHg7CisJCX0gZWxzZSB7CisJCQlib3VuZHMud2lkdGggKz0gZHg7CisJCX0KKworCQlpZiAoaXNGaXhlZChTV1QuQk9UVE9NKSkgeworCQkJYm91bmRzLnkgKz0gZHk7CisJCQlib3VuZHMuaGVpZ2h0IC09IGR5OworCQl9IGVsc2UgeworCQkJYm91bmRzLmhlaWdodCArPSBkeTsKKwkJfQorCisJCWNvbXBvc2l0ZS5zZXRCb3VuZHMoYm91bmRzKTsKKwkJY29tcG9zaXRlLmdldERpc3BsYXkoKS51cGRhdGUoKTsKKworCQljdXJQb3MgPSBwOworCX0KKworCXByb3RlY3RlZCB2b2lkIGRyYWdWZXJ0aWNhbChDb21wb3NpdGUgY29tcG9zaXRlLCBQb2ludCBwKSB7CisJCWludCBkeSA9IHAueSAtIGN1clBvcy55OworCQlSZWN0YW5nbGUgYm91bmRzID0gY29tcG9zaXRlLmdldEJvdW5kcygpOworCQlpZiAoaXNGaXhlZChTV1QuQk9UVE9NKSkgeworCQkJYm91bmRzLnkgKz0gZHk7CisJCQlib3VuZHMuaGVpZ2h0IC09IGR5OworCQl9IGVsc2UgeworCQkJYm91bmRzLmhlaWdodCArPSBkeTsKKwkJfQorCisJCWNvbXBvc2l0ZS5zZXRCb3VuZHMoYm91bmRzKTsKKwkJY29tcG9zaXRlLmdldERpc3BsYXkoKS51cGRhdGUoKTsKKworCQljdXJQb3MgPSBwOworCX0KKworCXByb3RlY3RlZCB2b2lkIGRyYWdIb3Jpem9udGFsKENvbXBvc2l0ZSBjb21wb3NpdGUsIFBvaW50IHApIHsKKwkJaW50IGR4ID0gcC54IC0gY3VyUG9zLng7CisJCVJlY3RhbmdsZSBib3VuZHMgPSBjb21wb3NpdGUuZ2V0Qm91bmRzKCk7CisJCWlmIChpc0ZpeGVkKFNXVC5SSUdIVCkpIHsKKwkJCWJvdW5kcy54ICs9IGR4OworCQkJYm91bmRzLndpZHRoIC09IGR4OworCQl9IGVsc2UgeworCQkJYm91bmRzLndpZHRoICs9IGR4OworCQl9CisKKwkJY29tcG9zaXRlLnNldEJvdW5kcyhib3VuZHMpOworCQljb21wb3NpdGUuZ2V0RGlzcGxheSgpLnVwZGF0ZSgpOworCisJCWN1clBvcyA9IHA7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRml4ZWQoaW50IHN3dFNpZGUpIHsKKwkJcmV0dXJuIChmaXhlZENvcm5lciAmIHN3dFNpZGUpICE9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9jbGVhbnVwYWRkb24vQ2xlYW51cEFkZG9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL2NsZWFudXBhZGRvbi9DbGVhbnVwQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWJhMzUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9jbGVhbnVwYWRkb24vQ2xlYW51cEFkZG9uLmphdmEKQEAgLTAsMCArMSwzNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5jbGVhbnVwYWRkb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLlVJRXZlbnRUb3BpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkFic3RyYWN0UGFydFJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1BcmVhOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmVTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NQ29tcG9zaXRlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbUJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LlNhc2hMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKKworcHVibGljIGNsYXNzIENsZWFudXBBZGRvbiB7CisJQEluamVjdAorCUlFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKworCUBJbmplY3QKKwlFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlNQXBwbGljYXRpb24gYXBwOworCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY0NoaWxkcmVuKAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5FbGVtZW50Q29udGFpbmVyLlRPUElDX0NISUxEUkVOKSBFdmVudCBldmVudCkgeworCQlPYmplY3QgY2hhbmdlZE9iaiA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJaWYgKFVJRXZlbnRzLmlzUkVNT1ZFKGV2ZW50KSkgeworCQkJZmluYWwgTUVsZW1lbnRDb250YWluZXI8Pz4gY29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPD8+KSBjaGFuZ2VkT2JqOworCQkJTVVJRWxlbWVudCBjb250YWluZXJQYXJlbnQgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisKKwkJCS8vIERldGVybWluZSB0aGUgZWxlbWVudHMgdGhhdCBzaG91bGQgKm5vdCogZXZlciBiZSBhdXRvLWRlc3Ryb3llZAorCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbiB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaworCQkJCQl8fCBjb250YWluZXIgaW5zdGFuY2VvZiBNTWVudUVsZW1lbnQgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgTVRyaW1CYXIKKwkJCQkJfHwgY29udGFpbmVyIGluc3RhbmNlb2YgTVRvb2xCYXIgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgTUFyZWEKKwkJCQkJfHwgY29udGFpbmVyLmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLk5PX0FVVE9fQ09MTEFQU0UpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTVdpbmRvdyAmJiBjb250YWluZXJQYXJlbnQgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOworCisJCQkvLyBTdGFsbCB0aGUgcmVtb3ZhbCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBvbmx5IHRyYW5zaWVudGx5IGVtcHR5CisJCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7CisJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFJlbW92ZSBpdCBmcm9tIHRoZSBkaXNwbGF5IGlmIG5vIHZpc2libGUgY2hpbGRyZW4KKwkJCQkJCWludCB0YnJDb3VudCA9IG1vZGVsU2VydmljZS50b0JlUmVuZGVyZWRDb3VudChjb250YWluZXIpOworCisJCQkJCQkvLyBDYWNoZSB0aGUgdmFsdWUgc2luY2Ugc2V0dGluZyB0aGUgVEJSIG1heSBjaGFuZ2UgdGhlIHJlc3VsdAorCQkJCQkJYm9vbGVhbiBsYXN0U3RhY2sgPSBpc0xhc3RFZGl0b3JTdGFjayhjb250YWluZXIpOworCQkJCQkJaWYgKHRickNvdW50ID09IDAgJiYgIWxhc3RTdGFjaykgeworCQkJCQkJCWNvbnRhaW5lci5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJCQkJfQorCisJCQkJCQkvLyBSZW1vdmUgaXQgZnJvbSB0aGUgbW9kZWwgaWYgaXQgaGFzIG5vIGNoaWxkcmVuIGF0IGFsbAorCQkJCQkJTUVsZW1lbnRDb250YWluZXI8Pz4gbGNsQ29udGFpbmVyID0gY29udGFpbmVyOworCQkJCQkJaWYgKGxjbENvbnRhaW5lci5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAwKSB7CisJCQkJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50ID0gY29udGFpbmVyLmdldFBhcmVudCgpOworCQkJCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhbGFzdFN0YWNrKSB7CisJCQkJCQkJCWNvbnRhaW5lci5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJCQkJCQlwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoY29udGFpbmVyKTsKKwkJCQkJCQl9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCQkJCQkJLy8gTXVzdCBiZSBhIERldGFjaGVkIFdpbmRvdworCQkJCQkJCQlNVUlFbGVtZW50IGVQYXJlbnQgPSAoTVVJRWxlbWVudCkgKChFT2JqZWN0KSBjb250YWluZXIpCisJCQkJCQkJCQkJLmVDb250YWluZXIoKTsKKwkJCQkJCQkJaWYgKGVQYXJlbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmUpIHsKKwkJCQkJCQkJCSgoTVBlcnNwZWN0aXZlKSBlUGFyZW50KS5nZXRXaW5kb3dzKCkucmVtb3ZlKGNvbnRhaW5lcik7CisJCQkJCQkJCX0gZWxzZSBpZiAoZVBhcmVudCBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCQkJCQkJCSgoTVdpbmRvdykgZVBhcmVudCkuZ2V0V2luZG93cygpLnJlbW92ZShjb250YWluZXIpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChjb250YWluZXIuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMQorCQkJCQkJCQkmJiBjb250YWluZXIgaW5zdGFuY2VvZiBNUGFydFNhc2hDb250YWluZXIpIHsKKwkJCQkJCQkvLyBpZiBhIHNhc2ggY29udGFpbmVyIGhhcyBvbmx5IG9uZSBlbGVtZW50IHRoZW4gcmVtb3ZlIGl0IGFuZCBtb3ZlCisJCQkJCQkJLy8gaXRzIGNoaWxkIHVwIHRvIHdoZXJlIGl0IHVzZWQgdG8gYmUKKwkJCQkJCQlNVUlFbGVtZW50IHRoZUNoaWxkID0gY29udGFpbmVyLmdldENoaWxkcmVuKCkuZ2V0KDApOworCQkJCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudENvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKwkJCQkJCQlpZiAocGFyZW50Q29udGFpbmVyICE9IG51bGwpIHsKKwkJCQkJCQkJaW50IGluZGV4ID0gcGFyZW50Q29udGFpbmVyLmdldENoaWxkcmVuKCkuaW5kZXhPZihjb250YWluZXIpOworCisJCQkJCQkJCS8vIE1hZ2ljIGNoZWNrLCBhcmUgd2UgdW53cmFwcGluZyBhIHNhc2ggY29udGFpbmVyCisJCQkJCQkJCWlmICh0aGVDaGlsZCBpbnN0YW5jZW9mIE1QYXJ0U2FzaENvbnRhaW5lcikgeworCQkJCQkJCQkJaWYgKGNvbnRhaW5lci5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJCQkJCQkJCUNvbXBvc2l0ZSB0aGVDb21wID0gKENvbXBvc2l0ZSkgY29udGFpbmVyLmdldFdpZGdldCgpOworCQkJCQkJCQkJCU9iamVjdCB0bXAgPSB0aGVDaGlsZC5nZXRXaWRnZXQoKTsKKwkJCQkJCQkJCQl0aGVDaGlsZC5zZXRXaWRnZXQodGhlQ29tcCk7CisJCQkJCQkJCQkJdGhlQ29tcC5zZXRMYXlvdXQobmV3IFNhc2hMYXlvdXQodGhlQ29tcCwgdGhlQ2hpbGQpKTsKKwkJCQkJCQkJCQl0aGVDb21wLnNldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FLCB0aGVDaGlsZCk7CisJCQkJCQkJCQkJY29udGFpbmVyLnNldFdpZGdldCh0bXApOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisKKwkJCQkJCQkJdGhlQ2hpbGQuc2V0Q29udGFpbmVyRGF0YShjb250YWluZXIuZ2V0Q29udGFpbmVyRGF0YSgpKTsKKwkJCQkJCQkJY29udGFpbmVyLmdldENoaWxkcmVuKCkucmVtb3ZlKHRoZUNoaWxkKTsKKwkJCQkJCQkJcGFyZW50Q29udGFpbmVyLmdldENoaWxkcmVuKCkuYWRkKGluZGV4LCB0aGVDaGlsZCk7CisJCQkJCQkJCWNvbnRhaW5lci5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJCQkJCQlwYXJlbnRDb250YWluZXIuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoY29udGFpbmVyKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBzaG91bGQgbWFrZSBpdHNlbGYgdmlzaWJsZQorCSAqIHdoZW4gaXRzIGZpcnN0IGNoaWxkIGJlY29tZXMgdmlzaWJsZSBhbmQgbWFrZSBpdHNlbGYgaW52aXNpYmxlIHdoZW5ldmVyCisJICogaXRzIGxhc3QgY2hpbGQgYmVjb21lcyBpbnZpc2libGUuIERlZmF1bHRzIHRvIGZhbHNlIGZvciB1bmtub3duIGVsZW1lbnQKKwkgKiB0eXBlcworCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkUmVhY3RUb0NoaWxkVmlzaWJpbGl0eUNoYW5nZXMoTVVJRWxlbWVudCB0aGVFbGVtZW50KSB7CisJCS8vIFRPRE86IEl0IG1heSBiZSBwb3NzaWJsZSB0byByZW1vdmUgdGhlIGluc3RhbmNlb2YgY2hlY2tzIGFuZCBqdXN0IHVzZQorCQkvLyBJUHJlc2VudGF0aW9uRW5naW5lLkhJRERFTl9FWFBMSUNJVExZLiBIb3dldmVyLCB0aGF0IHdvdWxkIHJlcXVpcmUKKwkJLy8gZXhwbGljaXRseSBzZXR0aW5nIElQcmVzZW50YXRpb25FbmdpbmUuSElEREVOX0VYUExJQ0lUTFkgb24gZXZlcnkKKwkJLy8gb2JqZWN0IHdoZXJlIHdlIHdhbnQgdG8ga2VlcCBpdCBoaWRkZW4gZXZlbiBpZiBpdCBoYXMgYSB2aXNpYmxlIGNoaWxkCisJCS8vIChzdWNoIGFzIHRoZSBtYWluIHRvb2xiYXIpLgorCQlyZXR1cm4gKHRoZUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFNhc2hDb250YWluZXIgfHwgdGhlRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2sKKwkJCQl8fCB0aGVFbGVtZW50IGluc3RhbmNlb2YgTUNvbXBvc2l0ZVBhcnQpCisJCQkJJiYgIXRoZUVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKElQcmVzZW50YXRpb25FbmdpbmUuSElEREVOX0VYUExJQ0lUTFkpOworCX0KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVmlzaWJpbGl0eUNoYW5nZWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLlVJRWxlbWVudC5UT1BJQ19WSVNJQkxFKSBFdmVudCBldmVudCkgeworCQlNVUlFbGVtZW50IGNoYW5nZWRPYmogPSAoTVVJRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAoY2hhbmdlZE9iaiBpbnN0YW5jZW9mIE1UcmltQmFyIHx8ICgoT2JqZWN0KSBjaGFuZ2VkT2JqLmdldFBhcmVudCgpKSBpbnN0YW5jZW9mIE1Ub29sQmFyKQorCQkJcmV0dXJuOworCisJCWlmIChjaGFuZ2VkT2JqLmdldFdpZGdldCgpIGluc3RhbmNlb2YgU2hlbGwpIHsKKwkJCSgoU2hlbGwpIGNoYW5nZWRPYmouZ2V0V2lkZ2V0KCkpLnNldFZpc2libGUoY2hhbmdlZE9iai5pc1Zpc2libGUoKSk7CisJCX0gZWxzZSBpZiAoY2hhbmdlZE9iai5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgeworCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50ID0gY2hhbmdlZE9iai5nZXRQYXJlbnQoKTsKKwkJCWlmICghc2hvdWxkUmVhY3RUb0NoaWxkVmlzaWJpbGl0eUNoYW5nZXMocGFyZW50KSkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKGNoYW5nZWRPYmouaXNWaXNpYmxlKCkpIHsKKwkJCQkvLyBNYWtlIGFsbCB0aGUgcGFyZW50cyB2aXNpYmxlCisJCQkJaWYgKCFwYXJlbnQuaXNWaXNpYmxlKCkpCisJCQkJCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSAndmlzaWJsZScgY2hpbGRyZW4gdGhlbiBtYWtlIHRoZSBwYXJlbnQgZ28gYXdheSB0b28KKwkJCQlib29sZWFuIG1ha2VJbnZpc2libGUgPSB0cnVlOworCQkJCWZvciAoTVVJRWxlbWVudCBraWQgOiBwYXJlbnQuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCQlpZiAoa2lkLmlzVG9CZVJlbmRlcmVkKCkgJiYga2lkLmlzVmlzaWJsZSgpKSB7CisJCQkJCQltYWtlSW52aXNpYmxlID0gZmFsc2U7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobWFrZUludmlzaWJsZSkKKwkJCQkJcGFyZW50LnNldFZpc2libGUoZmFsc2UpOworCQkJfQorCQl9IGVsc2UgaWYgKGNoYW5nZWRPYmouZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sKSB7CisJCQlDb250cm9sIGN0cmwgPSAoQ29udHJvbCkgY2hhbmdlZE9iai5nZXRXaWRnZXQoKTsKKwkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudCA9IGNoYW5nZWRPYmouZ2V0UGFyZW50KCk7CisJCQlpZiAocGFyZW50ID09IG51bGwgfHwgKChPYmplY3QpIHBhcmVudCkgaW5zdGFuY2VvZiBNVG9vbEJhcikgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKGNoYW5nZWRPYmouaXNWaXNpYmxlKCkpIHsKKwkJCQlpZiAocGFyZW50LmdldFJlbmRlcmVyKCkgIT0gbnVsbCkgeworCQkJCQlPYmplY3QgbXlQYXJlbnQgPSAoKEFic3RyYWN0UGFydFJlbmRlcmVyKSBwYXJlbnQuZ2V0UmVuZGVyZXIoKSkKKwkJCQkJCQkuZ2V0VUlDb250YWluZXIoY2hhbmdlZE9iaik7CisJCQkJCWlmIChteVBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJCQkJQ29tcG9zaXRlIHBhcmVudENvbXAgPSAoQ29tcG9zaXRlKSBteVBhcmVudDsKKwkJCQkJCWN0cmwuc2V0UGFyZW50KHBhcmVudENvbXApOworCisJCQkJCQlDb250cm9sIHByZXZDb250cm9sID0gbnVsbDsKKwkJCQkJCWZvciAoTVVJRWxlbWVudCBjaGlsZE1FIDogcGFyZW50LmdldENoaWxkcmVuKCkpIHsKKwkJCQkJCQlpZiAoY2hpbGRNRSA9PSBjaGFuZ2VkT2JqKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlpZiAoY2hpbGRNRS5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbnRyb2wgJiYgY2hpbGRNRS5pc1Zpc2libGUoKSkgeworCQkJCQkJCQlwcmV2Q29udHJvbCA9IChDb250cm9sKSBjaGlsZE1FLmdldFdpZGdldCgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChwcmV2Q29udHJvbCAhPSBudWxsKQorCQkJCQkJCWN0cmwubW92ZUJlbG93KHByZXZDb250cm9sKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQljdHJsLm1vdmVBYm92ZShudWxsKTsKKwkJCQkJCWN0cmwuZ2V0U2hlbGwoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IGN0cmwgfSwgU1dULkRFRkVSKTsKKwkJCQkJfQorCisJCQkJCWlmICghc2hvdWxkUmVhY3RUb0NoaWxkVmlzaWJpbGl0eUNoYW5nZXMocGFyZW50KSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCBpcyB2aXNpYmxlCisJCQkJCWlmICghcGFyZW50LmlzVmlzaWJsZSgpKQorCQkJCQkJcGFyZW50LnNldFZpc2libGUodHJ1ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlTaGVsbCBsaW1ibyA9IChTaGVsbCkgYXBwLmdldENvbnRleHQoKS5nZXQoImxpbWJvIik7CisKKwkJCQkvLyBSZXBhcmVudCB0aGUgY29udHJvbCB0byAnbGltYm8nCisJCQkJQ29tcG9zaXRlIGN1clBhcmVudCA9IGN0cmwuZ2V0UGFyZW50KCk7CisJCQkJY3RybC5zZXRQYXJlbnQobGltYm8pOworCQkJCWN1clBhcmVudC5sYXlvdXQodHJ1ZSk7CisJCQkJaWYgKGN1clBhcmVudC5nZXRTaGVsbCgpICE9IGN1clBhcmVudCkKKwkJCQkJY3VyUGFyZW50LmdldFNoZWxsKCkubGF5b3V0KG5ldyBDb250cm9sW10geyBjdXJQYXJlbnQgfSwgU1dULkRFRkVSKTsKKworCQkJCS8vIEFsd2F5cyBsZWF2ZSBXaW5kb3cncyBpbiB0aGUgcHJlc2VudGF0aW9uCisJCQkJaWYgKChPYmplY3QpIHBhcmVudCBpbnN0YW5jZW9mIE1XaW5kb3cpCisJCQkJCXJldHVybjsKKworCQkJCS8vIElmIHRoZXJlIGFyZSBubyBtb3JlICd2aXNpYmxlJyBjaGlsZHJlbiB0aGVuIG1ha2UgdGhlIHBhcmVudCBnbyBhd2F5IHRvbworCQkJCWJvb2xlYW4gbWFrZVBhcmVudEludmlzaWJsZSA9IHRydWU7CisJCQkJZm9yIChNVUlFbGVtZW50IGtpZCA6IHBhcmVudC5nZXRDaGlsZHJlbigpKSB7CisJCQkJCWlmIChraWQuaXNUb0JlUmVuZGVyZWQoKSAmJiBraWQuaXNWaXNpYmxlKCkpIHsKKwkJCQkJCW1ha2VQYXJlbnRJbnZpc2libGUgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCFzaG91bGRSZWFjdFRvQ2hpbGRWaXNpYmlsaXR5Q2hhbmdlcyhwYXJlbnQpKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQkvLyBTcGVjaWFsIGNoZWNrOiBJZiBhIHBlcnNwZWN0aXZlIGdvZXMgaW52aXNpYmUgd2UgbmVlZCB0byBtYWtlIGl0cworCQkJCS8vIFBlcnNwZWN0aXZlU3RhY2sgaW52aXNpYmxlIGFzIHdlbGwuLi5zZWUgYnVnIDM2OTUyOAorCQkJCWlmIChtYWtlUGFyZW50SW52aXNpYmxlKQorCQkJCQlwYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVJlbmRlcmluZ0NoYW5nZWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLlVJRWxlbWVudC5UT1BJQ19UT0JFUkVOREVSRUQpIEV2ZW50IGV2ZW50KSB7CisJCQlNVUlFbGVtZW50IGNoYW5nZWRPYmogPSAoTVVJRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyID0gbnVsbDsKKwkJCWlmIChjaGFuZ2VkT2JqLmdldEN1clNoYXJlZFJlZigpICE9IG51bGwpCisJCQkJY29udGFpbmVyID0gY2hhbmdlZE9iai5nZXRDdXJTaGFyZWRSZWYoKS5nZXRQYXJlbnQoKTsKKwkJCWVsc2UKKwkJCQljb250YWluZXIgPSBjaGFuZ2VkT2JqLmdldFBhcmVudCgpOworCisJCQkvLyB0aGlzIGNhbiBoYXBwZW4gZm9yIHNoYXJlZCBwYXJ0cyB0aGF0IGFyZW4ndCBhdHRhY2hlZCB0byBhbnkgcGxhY2Vob2xkZXJzCisJCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIG5ldmVyIGhpZGUgdG9wLWxldmVsIHdpbmRvd3MKKwkJCU1VSUVsZW1lbnQgY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lcjsKKwkJCWlmIChjb250YWluZXJFbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvdyAmJiBjb250YWluZXJFbGVtZW50LmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIFRoZXNlIGVsZW1lbnRzIHNob3VsZCBuZWl0aGVyIGJlIHNob3duIG5vciBoaWRkZW4gYmFzZWQgb24gdGhlaXIgY29udGFpbm1lbnQgc3RhdGUKKwkJCWlmIChpc0xhc3RFZGl0b3JTdGFjayhjb250YWluZXJFbGVtZW50KSB8fCBjb250YWluZXJFbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlCisJCQkJCXx8IGNvbnRhaW5lckVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykKKwkJCQlyZXR1cm47CisKKwkJCUJvb2xlYW4gdG9CZVJlbmRlcmVkID0gKEJvb2xlYW4pIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQkJaWYgKHRvQmVSZW5kZXJlZCkgeworCQkJCS8vIEJyaW5nIHRoZSBjb250YWluZXIgYmFjayBpZiBvbmUgb2YgaXRzIGNoaWxkcmVuIGdvZXMgdmlzaWJsZQorCQkJCWlmICghY29udGFpbmVyLmlzVG9CZVJlbmRlcmVkKCkpCisJCQkJCWNvbnRhaW5lci5zZXRUb0JlUmVuZGVyZWQodHJ1ZSk7CisJCQkJaWYgKCFjb250YWluZXIuaXNWaXNpYmxlKCkKKwkJCQkJCSYmICFjb250YWluZXIuZ2V0VGFncygpLmNvbnRhaW5zKElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVEKSkKKwkJCQkJY29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIE5ldmVyIGhpZGUgdGhlIGNvbnRhaW5lciBtYXJrZWQgYXMgbm9fY2xvc2UKKwkJCQlpZiAoY29udGFpbmVyLmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLk5PX0FVVE9fQ09MTEFQU0UpKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlpbnQgdmlzQ291bnQgPSBtb2RlbFNlcnZpY2UuY291bnRSZW5kZXJhYmxlQ2hpbGRyZW4oY29udGFpbmVyKTsKKworCQkJCS8vIFJlbW92ZSBzdGFja3Mgd2l0aCBubyB2aXNpYmxlIGNoaWxkcmVuIGZyb20gdGhlIGRpc3BsYXkgKGJ1dCBub3QgdGhlCisJCQkJLy8gbW9kZWwpCisJCQkJZmluYWwgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gdGhlQ29udGFpbmVyID0gY29udGFpbmVyOworCQkJCWlmICh2aXNDb3VudCA9PSAwKSB7CisJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlpbnQgdmlzQ291bnQgPSBtb2RlbFNlcnZpY2UuY291bnRSZW5kZXJhYmxlQ2hpbGRyZW4odGhlQ29udGFpbmVyKTsKKwkJCQkJCQlpZiAoIWlzTGFzdEVkaXRvclN0YWNrKHRoZUNvbnRhaW5lcikgJiYgdmlzQ291bnQgPT0gMCkKKwkJCQkJCQkJdGhlQ29udGFpbmVyLnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGlmIHRoZXJlIGFyZSByZW5kZXJlZCBlbGVtZW50cyBidXQgbm9uZSBhcmUgJ3Zpc2libGUnIHdlIHNob3VsZAorCQkJCQkvLyBtYWtlIHRoZSBjb250YWluZXIgaW52aXNpYmxlIGFzIHdlbGwKKwkJCQkJYm9vbGVhbiBtYWtlSW52aXNpYmxlID0gdHJ1ZTsKKworCQkJCQkvLyBPSywgd2UgaGF2ZSByZW5kZXJlZCBjaGlsZHJlbiwgYXJlIHRoZXkgJ3Zpc2libGUnID8KKwkJCQkJZm9yIChNVUlFbGVtZW50IGtpZCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7CisJCQkJCQlpZiAoIWtpZC5pc1RvQmVSZW5kZXJlZCgpKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJaWYgKGtpZC5pc1Zpc2libGUoKSkgeworCQkJCQkJCW1ha2VJbnZpc2libGUgPSBmYWxzZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChtYWtlSW52aXNpYmxlKSB7CisJCQkJCQljb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJfQorCisJYm9vbGVhbiBpc0xhc3RFZGl0b3JTdGFjayhNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJcmV0dXJuIG1vZGVsU2VydmljZS5pc0xhc3RFZGl0b3JTdGFjayhlbGVtZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL2RuZGFkZG9uL0RuREFkZG9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL2RuZGFkZG9uL0RuREFkZG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNGYwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvZG5kYWRkb24vRG5EQWRkb24uamF2YQpAQCAtMCwwICsxLDE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuZG5kYWRkb247CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIERuREFkZG9uIHsKKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9kbmRhZGRvbi9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9kbmRhZGRvbi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGNkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL2RuZGFkZG9uL1JFQURNRS50eHQKQEAgLTAsMCArMSBAQAorRE5EIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9taW5tYXgvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NGVlNQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLm1pbm1heDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHJpbVN0YWNrX0VtcHR5U3RhY2tUb29sdGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyaW1TdGFja19TaGFyZWRBcmVhVG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmltU3RhY2tfQ2xvc2VUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyaW1TdGFja19EZWZhdWx0T3JpZW50YXRpb25JdGVtOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyaW1TdGFja19SZXN0b3JlVGV4dDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmltU3RhY2tfSG9yaXpvbnRhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmltU3RhY2tfT3JpZW50YXRpb25NZW51OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyaW1TdGFja19WZXJ0aWNhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmltU3RhY2tfU2hvd19Jbl9PcmlnaW5hbF9Mb2NhdGlvbjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLm1pbm1heC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJc3RhdGljIHsKKwkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL21pbm1heC9NaW5NYXhBZGRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9taW5tYXgvTWluTWF4QWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRmMmVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9taW5tYXgvTWluTWF4QWRkb24uamF2YQpAQCAtMCwwICsxLDEwMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIChMYXJzLlZvZ2VsQGdtYWlsLmNvbSkgLSBCdWcgMzMxNjkwCisgKiAgICAgRGlyayBGYXV0aCAoZGlyay5mYXV0aEBnb29nbGVtYWlsLmNvbSkgLSBCdWcgNDU5Mjg1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMubWlubWF4OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlFdmVudFRvcGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQWJzdHJhY3RQYXJ0UmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BbmltYXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5GYWRlckFuaW1hdGlvbkZlZWRiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BZGRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLlNpZGVWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NQXJlYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1CYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1tZWRXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51LmltcGwuTWVudUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuRXZlbnRUYWdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CisKKy8qKgorICogV29ya2JlbmNoIGFkZG9uIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBtaW5pbWl6ZSwgbWF4aW1pemUgYW5kIHJlc3RvcmUgcGFydHMgaW4gdGhlIHdpbmRvdworICovCitwdWJsaWMgY2xhc3MgTWluTWF4QWRkb24geworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBzaGFyZWQgYXJlYSBpbiB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4gVGhpcyB2YWx1ZSBzaG91bGQgYmUgaWRlbnRpY2FsIHRvCisJICogdGhlIHZhbHVlIGRlZmluZWQgaW4gb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQuSURfRURJVE9SX0FSRUEuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VESVRPUl9BUkVBID0gIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9DQUNIRV9JRCA9ICJHbG9iYWwiOyAvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgU3RyaW5nIElEX1NVRkZJWCA9ICIobWluaW1pemVkKSI7IC8vJE5PTi1OTFMtMSQKKworCS8vIHRhZ3MgcmVwcmVzZW50aW5nIHRoZSBtaW4vbWF4IHN0YXRlIChoCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1JTklNSVpFRCA9IElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVEOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBNQVhJTUlaRUQgPSBJUHJlc2VudGF0aW9uRW5naW5lLk1BWElNSVpFRDsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTUlOSU1JWkVEX0JZX1pPT00gPSBJUHJlc2VudGF0aW9uRW5naW5lLk1JTklNSVpFRF9CWV9aT09NOworCisJQEluamVjdAorCUlFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKworCUBJbmplY3QKKwlFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJQEluamVjdAorCXByaXZhdGUgRVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlOworCisJLy8gQWxsb3cgJ2xvY2FsJyBjaGFuZ2VzIHRvIHRoZSB0YWdzCisJcHJpdmF0ZSBib29sZWFuIGlnbm9yZVRhZ0NoYW5nZXMgPSBmYWxzZTsKKworCUBJbmplY3QKKwlNQWRkb24gbWluTWF4QWRkb247CisKKwlwcml2YXRlIENUYWJGb2xkZXIyQWRhcHRlciBDVEZCdXR0b25MaXN0ZW5lciA9IG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7CisJCS8qKgorCQkgKgorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJcHJpdmF0ZSBNVUlFbGVtZW50IGdldEVsZW1lbnRUb0NoYW5nZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKKwkJCUNUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIGV2ZW50LndpZGdldDsKKwkJCU1VSUVsZW1lbnQgZWxlbWVudCA9IChNVUlFbGVtZW50KSBjdGYuZ2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUpOworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQXJlYSkKKwkJCQlyZXR1cm4gZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKTsKKworCQkJTVVJRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCXdoaWxlIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgIShwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTUFyZWEpKQorCQkJCXBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LmdldFBhcmVudCgpOworCisJCQlyZXR1cm4gcGFyZW50RWxlbWVudCAhPSBudWxsID8gcGFyZW50RWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKSA6IGVsZW1lbnQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbWF4aW1pemUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7CisJCQlzZXRTdGF0ZShnZXRFbGVtZW50VG9DaGFuZ2UoZXZlbnQpLCBNQVhJTUlaRUQpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG1pbmltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgeworCQkJc2V0U3RhdGUoZ2V0RWxlbWVudFRvQ2hhbmdlKGV2ZW50KSwgTUlOSU1JWkVEKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCByZXN0b3JlKENUYWJGb2xkZXJFdmVudCBldmVudCkgeworCQkJc2V0U3RhdGUoZ2V0RWxlbWVudFRvQ2hhbmdlKGV2ZW50KSwgbnVsbCk7CisJCX0KKwl9OworCisJcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIENURkRibENsaWNrTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpIHsKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7CisJCQkvLyBIQUNLISBJZiB0aGlzIGlzIGFuIGVtcHR5IHN0YWNrIHRyZWF0IGl0IGFzIHRob3VnaCBpdCB3YXMgdGhlIGVkaXRvciBhcmVhCisJCQkvLyBhbmQgdGVhciBkb3duIGFueSBvcGVuIHRyaW0gc3RhY2tzIChzZWUgYnVnIDM4NDgxNCkKKwkJCUNUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIGUud2lkZ2V0OworCQkJTVVJRWxlbWVudCBlbGVtZW50ID0gKE1VSUVsZW1lbnQpIGN0Zi5nZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSk7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2sgJiYgY3RmLmdldEl0ZW1Db3VudCgpID09IDApIHsKKwkJCQlNV2luZG93IHdpbmRvdyA9IG1vZGVsU2VydmljZS5nZXRUb3BMZXZlbFdpbmRvd0ZvcihlbGVtZW50KTsKKwkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKKwkJCQkJTGlzdDxNVG9vbENvbnRyb2w+IHRjTGlzdCA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMod2luZG93LCBudWxsLAorCQkJCQkJCU1Ub29sQ29udHJvbC5jbGFzcywgbnVsbCk7CisJCQkJCWZvciAoTVRvb2xDb250cm9sIHRjIDogdGNMaXN0KSB7CisJCQkJCQlpZiAodGMuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUcmltU3RhY2spIHsKKwkJCQkJCQlUcmltU3RhY2sgdHMgPSAoVHJpbVN0YWNrKSB0Yy5nZXRPYmplY3QoKTsKKwkJCQkJCQl0cy5zaG93U3RhY2soZmFsc2UpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHJpdmF0ZSBNVUlFbGVtZW50IGdldEVsZW1lbnRUb0NoYW5nZShNb3VzZUV2ZW50IGV2ZW50KSB7CisJCQlDVGFiRm9sZGVyIGN0ZiA9IChDVGFiRm9sZGVyKSBldmVudC53aWRnZXQ7CisJCQlNVUlFbGVtZW50IGVsZW1lbnQgPSAoTVVJRWxlbWVudCkgY3RmLmdldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTUFyZWEpIHsKKwkJCQkvLyBzZXQgdGhlIHN0YXRlIG9uIHRoZSBwbGFjZWhvbGRlcgorCQkJCXJldHVybiBlbGVtZW50LmdldEN1clNoYXJlZFJlZigpOworCQkJfQorCisJCQlNVUlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCQkJd2hpbGUgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiAhKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNQXJlYSkpCisJCQkJcGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7CisKKwkJCXJldHVybiBwYXJlbnRFbGVtZW50ICE9IG51bGwgPyBwYXJlbnRFbGVtZW50LmdldEN1clNoYXJlZFJlZigpIDogZWxlbWVudDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgeworCQkJLy8gb25seSBtYXhpbWl6ZSBpZiB0aGUgcHJpbWFyeSBtb3VzZSBidXR0b24gd2FzIHVzZWQKKwkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7CisJCQkJQ1RhYkZvbGRlciBjdGYgPSAoQ1RhYkZvbGRlcikgZS53aWRnZXQ7CisJCQkJaWYgKCFjdGYuZ2V0TWF4aW1pemVWaXNpYmxlKCkpCisJCQkJCXJldHVybjsKKworCQkJCS8vIE9ubHkgZmlyZSBpZiB3ZSdyZSBpbiB0aGUgJ3RhYicgYXJlYQorCQkJCWlmIChlLnkgPiBjdGYuZ2V0VGFiSGVpZ2h0KCkpCisJCQkJCXJldHVybjsKKworCQkJCU1VSUVsZW1lbnQgZWxlbWVudFRvQ2hhbmdlID0gZ2V0RWxlbWVudFRvQ2hhbmdlKGUpOworCQkJCWlmICghZWxlbWVudFRvQ2hhbmdlLmdldFRhZ3MoKS5jb250YWlucyhNQVhJTUlaRUQpKSB7CisJCQkJCXNldFN0YXRlKGVsZW1lbnRUb0NoYW5nZSwgTUFYSU1JWkVEKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZXRTdGF0ZShlbGVtZW50VG9DaGFuZ2UsIG51bGwpOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisKKwlwcml2YXRlIHZvaWQgc2V0U3RhdGUoTVVJRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgc3RhdGUpIHsKKwkJaWYgKE1JTklNSVpFRC5lcXVhbHMoc3RhdGUpKSB7CisJCQllbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoTUFYSU1JWkVEKTsKKwkJCWVsZW1lbnQuZ2V0VGFncygpLmFkZChNSU5JTUlaRUQpOworCQl9IGVsc2UgaWYgKE1BWElNSVpFRC5lcXVhbHMoc3RhdGUpKSB7CisJCQllbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoTUlOSU1JWkVEKTsKKwkJCWVsZW1lbnQuZ2V0VGFncygpLmFkZChNQVhJTUlaRUQpOworCQl9IGVsc2UgeworCQkJZWxlbWVudC5nZXRUYWdzKCkucmVtb3ZlKE1JTklNSVpFRCk7CisJCQllbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoTUFYSU1JWkVEKTsKKwkJfQorCisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY1dpZGdldChAVUlFdmVudFRvcGljKFVJRXZlbnRzLlVJRWxlbWVudC5UT1BJQ19XSURHRVQpIEV2ZW50IGV2ZW50KSB7CisJCWZpbmFsIE1VSUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAoIShjaGFuZ2VkRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spICYmICEoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNQXJlYSkpCisJCQlyZXR1cm47CisKKwkJZmluYWwgQ1RhYkZvbGRlciBjdGYgPSBnZXRDVEZGb3IoY2hhbmdlZEVsZW1lbnQpOworCQlpZiAoY3RmID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJTVVJRWxlbWVudCBzdGF0ZUVsZW1lbnQgPSBjaGFuZ2VkRWxlbWVudDsKKwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTVBhcnRTdGFjaykgeworCQkJTVBhcnRTdGFjayBzdGFjayA9IChNUGFydFN0YWNrKSBjaGFuZ2VkRWxlbWVudDsKKwkJCU1BcmVhIGFyZWEgPSBnZXRBcmVhRm9yKHN0YWNrKTsKKwkJCWlmIChhcmVhICE9IG51bGwgJiYgIShhcmVhLmdldFdpZGdldCgpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikpCisJCQkJc3RhdGVFbGVtZW50ID0gYXJlYS5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJfSBlbHNlIGlmIChjaGFuZ2VkRWxlbWVudCBpbnN0YW5jZW9mIE1BcmVhKQorCQkJc3RhdGVFbGVtZW50ID0gY2hhbmdlZEVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisKKwkJYWRqdXN0Q1RGQnV0dG9ucyhzdGF0ZUVsZW1lbnQpOworCisJCWN0Zi5yZW1vdmVDVGFiRm9sZGVyMkxpc3RlbmVyKENURkJ1dHRvbkxpc3RlbmVyKTsgLy8gUHJldmVudCBtdWx0aXBsZSBpbnN0YW5jZXMKKwkJY3RmLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIoQ1RGQnV0dG9uTGlzdGVuZXIpOworCisJCWN0Zi5yZW1vdmVNb3VzZUxpc3RlbmVyKENURkRibENsaWNrTGlzdGVuZXIpOyAvLyBQcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlcworCQljdGYuYWRkTW91c2VMaXN0ZW5lcihDVEZEYmxDbGlja0xpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHJlbW92YWxzIGZyb20gdGhlIHBlcnNwZWN0aXZlCisJICoKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKi8KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNDaGlsZHJlbigKKwkJCUBVSUV2ZW50VG9waWMoVUlFdmVudHMuRWxlbWVudENvbnRhaW5lci5UT1BJQ19DSElMRFJFTikgRXZlbnQgZXZlbnQpIHsKKwkJZmluYWwgTVVJRWxlbWVudCBjaGFuZ2VkRWxlbWVudCA9IChNVUlFbGVtZW50KSBldmVudC5nZXRQcm9wZXJ0eShFdmVudFRhZ3MuRUxFTUVOVCk7CisJCU1XaW5kb3cgd2luZG93ID0gbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKGNoYW5nZWRFbGVtZW50KTsKKworCQkvLyB0aGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIG1pbmltaXplZCBzdGFja3MgaW4gYSB0cmltCisJCS8vIGlmIHRoZSByZW1vdmVkIGVsZW1lbnQgaXMgbm8gcGVyc3BlY3RpdmUgYW5kIHRoZSB0b3AgbGV2ZWwgd2luZG93CisJCS8vIGlzIG5vdCBhIHRyaW1tZWQgd2luZG93LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKKwkJaWYgKCEoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykgfHwgd2luZG93ID09IG51bGwgfHwgISh3aW5kb3cgaW5zdGFuY2VvZiBNVHJpbW1lZFdpbmRvdykpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChVSUV2ZW50cy5pc1JFTU9WRShldmVudCkpIHsKKwkJCWZvciAoT2JqZWN0IHJlbW92ZWRFbGVtZW50IDogVUlFdmVudHMuYXNJdGVyYWJsZShldmVudCwgVUlFdmVudHMuRXZlbnRUYWdzLk9MRF9WQUxVRSkpIHsKKwkJCQlNVUlFbGVtZW50IHJlbW92ZWQgPSAoTVVJRWxlbWVudCkgcmVtb3ZlZEVsZW1lbnQ7CisJCQkJU3RyaW5nIHBlcnNwZWN0aXZlSWQgPSByZW1vdmVkLmdldEVsZW1lbnRJZCgpOworCisJCQkJTVRyaW1CYXIgYmFyID0gbW9kZWxTZXJ2aWNlLmdldFRyaW0oKE1UcmltbWVkV2luZG93KSB3aW5kb3csIFNpZGVWYWx1ZS5UT1ApOworCisJCQkJLy8gZ2F0aGVyIHVwIGFueSBtaW5pbWl6ZWQgc3RhY2tzIGZvciB0aGlzIHBlcnNwZWN0aXZlLi4uCisJCQkJTGlzdDxNVG9vbENvbnRyb2w+IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxNVG9vbENvbnRyb2w+KCk7CisJCQkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogYmFyLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJU3RyaW5nIHRyaW1FbGVtZW50SWQgPSBjaGlsZC5nZXRFbGVtZW50SWQoKTsKKwkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTVRvb2xDb250cm9sICYmIHRyaW1FbGVtZW50SWQuY29udGFpbnMocGVyc3BlY3RpdmVJZCkpIHsKKwkJCQkJCXRvUmVtb3ZlLmFkZCgoTVRvb2xDb250cm9sKSBjaGlsZCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyAuLi5hbmQgcmVtb3ZlIHRoZW0KKwkJCQlmb3IgKE1Ub29sQ29udHJvbCBtaW5TdGFjayA6IHRvUmVtb3ZlKSB7CisJCQkJCW1pblN0YWNrLnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCQkJCWJhci5nZXRDaGlsZHJlbigpLnJlbW92ZShtaW5TdGFjayk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlcyBjaGFuZ2VzIG9mIHRoZSBwZXJzcGVjdGl2ZQorCSAqCisJICogQHBhcmFtIGV2ZW50CisJICovCisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljU2VsZWN0ZWRFbGVtZW50KAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5FbGVtZW50Q29udGFpbmVyLlRPUElDX1NFTEVDVEVERUxFTUVOVCkgRXZlbnQgZXZlbnQpIHsKKwkJZmluYWwgTVVJRWxlbWVudCBjaGFuZ2VkRWxlbWVudCA9IChNVUlFbGVtZW50KSBldmVudC5nZXRQcm9wZXJ0eShFdmVudFRhZ3MuRUxFTUVOVCk7CisJCWlmICghKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlU3RhY2spKQorCQkJcmV0dXJuOworCisJCU1QZXJzcGVjdGl2ZVN0YWNrIHBzID0gKE1QZXJzcGVjdGl2ZVN0YWNrKSBjaGFuZ2VkRWxlbWVudDsKKwkJTVdpbmRvdyB3aW5kb3cgPSBtb2RlbFNlcnZpY2UuZ2V0VG9wTGV2ZWxXaW5kb3dGb3IocHMpOworCQlMaXN0PE1Ub29sQ29udHJvbD4gdGNMaXN0ID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW5kb3csIG51bGwsIE1Ub29sQ29udHJvbC5jbGFzcywKKwkJCQludWxsKTsKKworCQlmaW5hbCBNUGVyc3BlY3RpdmUgY3VyUGVyc3AgPSBwcy5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJaWYgKGN1clBlcnNwICE9IG51bGwpIHsKKwkJCUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQl0YWdzLmFkZChJUHJlc2VudGF0aW9uRW5naW5lLk1JTklNSVpFRCk7CisKKwkJCUxpc3Q8TVVJRWxlbWVudD4gbWluaW1pemVkRWxlbWVudHMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKGN1clBlcnNwLCBudWxsLAorCQkJCQlNVUlFbGVtZW50LmNsYXNzLCB0YWdzKTsKKwkJCS8vIFNob3cgYW55IG1pbmltaXplZCBzdGFjayBmcm9tIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlCisJCQlTdHJpbmcgcGVyc3BJZCA9ICcoJyArIGN1clBlcnNwLmdldEVsZW1lbnRJZCgpICsgJyknOworCQkJZm9yIChNVUlFbGVtZW50IGVsZSA6IG1pbmltaXplZEVsZW1lbnRzKSB7CisJCQkJU3RyaW5nIGZ1bGxJZCA9IGVsZS5nZXRFbGVtZW50SWQoKSArIHBlcnNwSWQ7CisKKwkJCQlmb3IgKE1Ub29sQ29udHJvbCB0YyA6IHRjTGlzdCkgeworCQkJCQlpZiAoZnVsbElkLmVxdWFscyh0Yy5nZXRFbGVtZW50SWQoKSkpIHsKKwkJCQkJCXRjLnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gRmluZCB0aGUgZWRpdG9yICdhcmVhJworCQkJTVBsYWNlaG9sZGVyIGVhUGxhY2Vob2xkZXIgPSAoTVBsYWNlaG9sZGVyKSBtb2RlbFNlcnZpY2UuZmluZChJRF9FRElUT1JfQVJFQSwgY3VyUGVyc3ApOworCQkJYWRqdXN0Q1RGQnV0dG9ucyhlYVBsYWNlaG9sZGVyKTsKKwkJfQorCisJCS8vIEhpZGUgYW55IG1pbmltaXplZCBzdGFja3MgZnJvbSB0aGUgb2xkIHBlcnNwZWN0aXZlCisJCWlmIChldmVudC5nZXRQcm9wZXJ0eShFdmVudFRhZ3MuT0xEX1ZBTFVFKSBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJTVBlcnNwZWN0aXZlIG9sZFBlcnNwID0gKE1QZXJzcGVjdGl2ZSkgZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLk9MRF9WQUxVRSk7CisJCQlTdHJpbmcgcGVyc3BJZCA9ICcoJyArIG9sZFBlcnNwLmdldEVsZW1lbnRJZCgpICsgJyknOworCQkJZm9yIChNVG9vbENvbnRyb2wgdGMgOiB0Y0xpc3QpIHsKKwkJCQlpZiAodGMuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUcmltU3RhY2sgJiYgdGMuZ2V0RWxlbWVudElkKCkuY29udGFpbnMocGVyc3BJZCkpIHsKKwkJCQkJVHJpbVN0YWNrIHRzID0gKFRyaW1TdGFjaykgdGMuZ2V0T2JqZWN0KCk7CisJCQkJCXRzLnNob3dTdGFjayhmYWxzZSk7CisJCQkJCXRjLnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZmluYWwgU2hlbGwgd2luU2hlbGwgPSAoU2hlbGwpIHdpbmRvdy5nZXRXaWRnZXQoKTsKKwkJd2luU2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoIXdpblNoZWxsLmlzRGlzcG9zZWQoKSkgeworCQkJCQl3aW5TaGVsbC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIGNoYW5nZXMgaW4gdGFncworCSAqCisJICogQHBhcmFtIGV2ZW50CisJICovCisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljVGFnc0NoYW5nZWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLkFwcGxpY2F0aW9uRWxlbWVudC5UT1BJQ19UQUdTKSBFdmVudCBldmVudCkgeworCQlpZiAoaWdub3JlVGFnQ2hhbmdlcykKKwkJCXJldHVybjsKKworCQlPYmplY3QgY2hhbmdlZE9iaiA9IGV2ZW50LmdldFByb3BlcnR5KEV2ZW50VGFncy5FTEVNRU5UKTsKKworCQlpZiAoIShjaGFuZ2VkT2JqIGluc3RhbmNlb2YgTVVJRWxlbWVudCkpCisJCQlyZXR1cm47CisKKwkJZmluYWwgTVVJRWxlbWVudCBjaGFuZ2VkRWxlbWVudCA9IChNVUlFbGVtZW50KSBjaGFuZ2VkT2JqOworCisJCWlmIChVSUV2ZW50cy5pc0FERChldmVudCkpIHsKKwkJCWlmIChVSUV2ZW50cy5jb250YWlucyhldmVudCwgVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSwgTUlOSU1JWkVEKSkgeworCQkJCW1pbmltaXplKGNoYW5nZWRFbGVtZW50KTsKKwkJCX0gZWxzZSBpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUsIE1BWElNSVpFRCkpIHsKKwkJCQltYXhpbWl6ZShjaGFuZ2VkRWxlbWVudCk7CisJCQl9CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQlpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5PTERfVkFMVUUsIE1JTklNSVpFRCkpIHsKKwkJCQlyZXN0b3JlKGNoYW5nZWRFbGVtZW50KTsKKwkJCX0gZWxzZSBpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5PTERfVkFMVUUsIE1BWElNSVpFRCkpIHsKKwkJCQl1bnpvb20oY2hhbmdlZEVsZW1lbnQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBpZCBvZiB0aGUgZWxlbWVudCBJZiBhIHBlcnNwZWN0aXZlIElEIGNoYW5nZXMgZml4CisJICogYW55IFRyaW1TdGFja3MgdGhhdCByZWZlcmVuY2UgdGhlIG9sZCBpZCB0byBwb2ludCBhdCB0aGUgbmV3IGlkLgorCSAqCisJICogVGhpcyBrZWVwcyB0cmltIHN0YWNrcyBhdHRhY2hlZCB0byB0aGUgY29ycmVjdCBwZXJzcGVjdGl2ZSB3aGVuIGEKKwkgKiBwZXJzcGVjdGl2ZSBpcyBzYXZlZCB3aXRoIGEgbmV3IG5hbWUuCisJICoKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKi8KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNFbGVtZW50SWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLkFwcGxpY2F0aW9uRWxlbWVudC5UT1BJQ19FTEVNRU5USUQpIEV2ZW50IGV2ZW50KSB7CisJCU9iamVjdCBjaGFuZ2VkT2JqZWN0ID0gZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCS8vIE9ubHkgY2FyZSBhYm91dCBNUGVyc3BlY3RpdmUgaWQgY2hhbmdlcworCQlpZiAoIShjaGFuZ2VkT2JqZWN0IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSkKKwkJCXJldHVybjsKKworCQlNUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUgPSAoTVBlcnNwZWN0aXZlKSBjaGFuZ2VkT2JqZWN0OworCisJCVN0cmluZyBuZXdJRCA9IChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQlTdHJpbmcgb2xkSUQgPSAoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKTsKKworCQkvLyBwYXR0ZXJuIGlzIHRyaW1TdGFja0lEKHBlcnNwZWN0aXZlSUQpCisJCW5ld0lEID0gJygnICsgbmV3SUQgKyAnKSc7CisJCW9sZElEID0gJygnICsgb2xkSUQgKyAnKSc7CisKKwkJLy8gU2VhcmNoIHRoZSB0cmltIGZvciB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIHBlcnNwZWN0aXZlCisJCU1XaW5kb3cgcGVyc3BXaW4gPSBtb2RlbFNlcnZpY2UuZ2V0VG9wTGV2ZWxXaW5kb3dGb3IocGVyc3BlY3RpdmUpOworCQlpZiAocGVyc3BXaW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlMaXN0PE1Ub29sQ29udHJvbD4gdHJpbVN0YWNrcyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMocGVyc3BXaW4sIG51bGwsCisJCQkJTVRvb2xDb250cm9sLmNsYXNzLCBudWxsKTsKKwkJZm9yIChNVG9vbENvbnRyb2wgdHJpbVN0YWNrIDogdHJpbVN0YWNrcykgeworCQkJLy8gT25seSBjYXJlIGFib3V0IE1Ub29sQ29udHJvbHMgdGhhdCBhcmUgVHJpbVN0YWNrcworCQkJaWYgKFRyaW1TdGFjay5DT05UUklCVVRJT05fVVJJLmVxdWFscyh0cmltU3RhY2suZ2V0Q29udHJpYnV0aW9uVVJJKCkpKQorCQkJCXRyaW1TdGFjay5zZXRFbGVtZW50SWQodHJpbVN0YWNrLmdldEVsZW1lbnRJZCgpLnJlcGxhY2Uob2xkSUQsIG5ld0lEKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHRoZSBldmVudCB0aGF0IHRoZSBwZXJzcGVjdGl2ZSBpcyBzYXZlZAorCSAqCisJICogQHBhcmFtIGV2ZW50CisJICovCisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljUGVyc3BTYXZlZCgKKwkJCUBVSUV2ZW50VG9waWMoVUlFdmVudHMuVUlMaWZlQ3ljbGUuUEVSU1BFQ1RJVkVfU0FWRUQpIEV2ZW50IGV2ZW50KSB7CisJCWZpbmFsIE1QZXJzcGVjdGl2ZSBzYXZlZFBlcnNwID0gKE1QZXJzcGVjdGl2ZSkgZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLkVMRU1FTlQpOworCQlTdHJpbmcgY2FjaGUgPSBnZXRUcmltQ2FjaGUoc2F2ZWRQZXJzcCk7CisJCW1pbk1heEFkZG9uLmdldFBlcnNpc3RlZFN0YXRlKCkucHV0KHNhdmVkUGVyc3AuZ2V0RWxlbWVudElkKCksIGNhY2hlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUcmltQ2FjaGUoTVBlcnNwZWN0aXZlIHNhdmVkUGVyc3ApIHsKKwkJTVdpbmRvdyB0b3BXaW4gPSBtb2RlbFNlcnZpY2UuZ2V0VG9wTGV2ZWxXaW5kb3dGb3Ioc2F2ZWRQZXJzcCk7CisJCVN0cmluZyBwZXJzcElkU3RyID0gJygnICsgc2F2ZWRQZXJzcC5nZXRFbGVtZW50SWQoKSArICcpJzsKKworCQlTdHJpbmcgY2FjaGUgPSBnZXRXaW5DYWNoZSh0b3BXaW4sIHBlcnNwSWRTdHIpOworCQlmb3IgKE1XaW5kb3cgZHcgOiBzYXZlZFBlcnNwLmdldFdpbmRvd3MoKSkgeworCQkJY2FjaGUgKz0gZ2V0V2luQ2FjaGUoZHcsIHBlcnNwSWRTdHIpOworCQl9CisKKwkJcmV0dXJuIGNhY2hlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFdpbkNhY2hlKE1XaW5kb3cgd2luLCBTdHJpbmcgcGVyc3BJZFN0cikgeworCQlTdHJpbmcgd2luU3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCQlMaXN0PE1QYXJ0U3RhY2s+IHN0YWNrTGlzdCA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMod2luLCBudWxsLCBNUGFydFN0YWNrLmNsYXNzLCBudWxsKTsKKwkJZm9yIChNUGFydFN0YWNrIHN0YWNrIDogc3RhY2tMaXN0KSB7CisJCQl3aW5TdHIgKz0gZ2V0U3RhY2tUcmltTG9jKHN0YWNrLCBwZXJzcElkU3RyKTsKKwkJfQorCQlyZXR1cm4gd2luU3RyOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFN0YWNrVHJpbUxvYyhNUGFydFN0YWNrIHN0YWNrLCBTdHJpbmcgcGVyc3BJZFN0cikgeworCQlNV2luZG93IHN0YWNrV2luID0gbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKHN0YWNrKTsvLyBnZXRDb250YWluaW5nV2luZG93KHN0YWNrKTsKKwkJTVVJRWxlbWVudCB0Y0VsZW1lbnQgPSBtb2RlbFNlcnZpY2UuZmluZChzdGFjay5nZXRFbGVtZW50SWQoKSArIHBlcnNwSWRTdHIsIHN0YWNrV2luKTsKKwkJaWYgKHRjRWxlbWVudCA9PSBudWxsKQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisKKwkJTVRyaW1CYXIgYmFyID0gKE1UcmltQmFyKSAoKE1VSUVsZW1lbnQpIHRjRWxlbWVudC5nZXRQYXJlbnQoKSk7CisJCWludCBzaWRlVmFsID0gYmFyLmdldFNpZGUoKS5nZXRWYWx1ZSgpOworCQlpbnQgaW5kZXggPSBiYXIuZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKHRjRWxlbWVudCk7CisJCXJldHVybiBzdGFjay5nZXRFbGVtZW50SWQoKSArICcgJyArIHNpZGVWYWwgKyAnICcgKyBpbmRleCArICIjIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgdGhlIGV2ZW50IHRoYXQgdGhlIHBlcnNwZWN0aXZlIGlzIHJlc2V0CisJICoKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKi8KKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljUGVyc3BSZXNldChAVUlFdmVudFRvcGljKFVJRXZlbnRzLlVJTGlmZUN5Y2xlLlBFUlNQRUNUSVZFX1JFU0VUKSBFdmVudCBldmVudCkgeworCQlmaW5hbCBNUGVyc3BlY3RpdmUgcmVzZXRQZXJzcCA9IChNUGVyc3BlY3RpdmUpIGV2ZW50LmdldFByb3BlcnR5KEV2ZW50VGFncy5FTEVNRU5UKTsKKworCQkvLyBGaW5kIGFueSBtaW5pbWl6ZWQgc3RhY2tzIGFuZCBzaG93IHRoZWlyIHRyaW0KKwkJTGlzdDxNVUlFbGVtZW50PiBtaW5pbWl6ZWRFbGVtZW50cyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMocmVzZXRQZXJzcCwgbnVsbCwgTVVJRWxlbWVudC5jbGFzcywKKwkJCQlBcnJheXMuYXNMaXN0KElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVEKSk7CisJCWZvciAoTVVJRWxlbWVudCBlbGVtZW50IDogbWluaW1pemVkRWxlbWVudHMpIHsKKwkJCWNyZWF0ZVRyaW0oZWxlbWVudCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHRoZSBldmVudCB0aGF0IHRoZSBwZXJzcGVjdGl2ZSBpcyBvcGVuZWQKKwkgKgorCSAqIEBwYXJhbSBldmVudAorCSAqLworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNQZXJzcE9wZW5lZCgKKwkJCUBVSUV2ZW50VG9waWMoVUlFdmVudHMuVUlMaWZlQ3ljbGUuUEVSU1BFQ1RJVkVfT1BFTkVEKSBFdmVudCBldmVudCkgeworCQlmaW5hbCBNUGVyc3BlY3RpdmUgb3BlbmVkUGVyc3AgPSAoTVBlcnNwZWN0aXZlKSBldmVudC5nZXRQcm9wZXJ0eShFdmVudFRhZ3MuRUxFTUVOVCk7CisKKwkJLy8gRmluZCBhbnkgbWluaW1pemVkIHN0YWNrcyBhbmQgc2hvdyB0aGVpciB0cmltCisJCUxpc3Q8TVVJRWxlbWVudD4gbWluaW1pemVkRWxlbWVudHMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKG9wZW5lZFBlcnNwLCBudWxsLAorCQkJCU1VSUVsZW1lbnQuY2xhc3MsIEFycmF5cy5hc0xpc3QoSVByZXNlbnRhdGlvbkVuZ2luZS5NSU5JTUlaRUQpKTsKKwkJZm9yIChNVUlFbGVtZW50IGVsZW1lbnQgOiBtaW5pbWl6ZWRFbGVtZW50cykgeworCQkJY3JlYXRlVHJpbShlbGVtZW50KTsKKwkJfQorCX0KKworCXByaXZhdGUgTUFyZWEgZ2V0QXJlYUZvcihNUGFydFN0YWNrIHN0YWNrKSB7CisJCU1VSUVsZW1lbnQgcGFyZW50ID0gc3RhY2suZ2V0UGFyZW50KCk7CisJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1BcmVhKQorCQkJCXJldHVybiAoTUFyZWEpIHBhcmVudDsKKwkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q1RGQnV0dG9ucyhDVGFiRm9sZGVyIGN0ZiwgTVVJRWxlbWVudCBzdGF0ZUVsZW1lbnQsIGJvb2xlYW4gaGlkZUJ1dHRvbnMpIHsKKwkJaWYgKGhpZGVCdXR0b25zKSB7CisJCQljdGYuc2V0TWluaW1pemVWaXNpYmxlKGZhbHNlKTsKKwkJCWN0Zi5zZXRNYXhpbWl6ZVZpc2libGUoZmFsc2UpOworCQl9IGVsc2UgeworCQkJaWYgKHN0YXRlRWxlbWVudC5nZXRUYWdzKCkuY29udGFpbnMoTUlOSU1JWkVEKSkgeworCQkJCWN0Zi5zZXRNaW5pbWl6ZVZpc2libGUoZmFsc2UpOworCQkJCWN0Zi5zZXRNYXhpbWl6ZVZpc2libGUodHJ1ZSk7CisJCQkJY3RmLnNldE1heGltaXplZCh0cnVlKTsKKwkJCX0gZWxzZSBpZiAoc3RhdGVFbGVtZW50LmdldFRhZ3MoKS5jb250YWlucyhNQVhJTUlaRUQpKSB7CisJCQkJY3RmLnNldE1pbmltaXplVmlzaWJsZSh0cnVlKTsKKwkJCQljdGYuc2V0TWF4aW1pemVWaXNpYmxlKHRydWUpOworCQkJCWN0Zi5zZXRNYXhpbWl6ZWQodHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCWN0Zi5zZXRNaW5pbWl6ZVZpc2libGUodHJ1ZSk7CisJCQkJY3RmLnNldE1heGltaXplVmlzaWJsZSh0cnVlKTsKKwkJCQljdGYuc2V0TWluaW1pemVkKGZhbHNlKTsKKwkJCQljdGYuc2V0TWF4aW1pemVkKGZhbHNlKTsKKwkJCQljdGYubGF5b3V0KCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBtaW4gLyBtYXggYnV0dG9ucyBvbiB0aGUgQ1RGIGJhc2VkIG9uIHRoZSBtb2RlbAorCSAqIGVsZW1lbnQncyBzdGF0ZS4gVGhlIGlucHV0IGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMKKwkgKiB0aGUgbWluL21heCBzdGF0ZSBpbmZvIHdoaWNoIHNob3VsZCBlaXRoZXIgYmUgYW4gTVBhcnRTdGFjayBvciBhbgorCSAqIE1QbGFjZWhvbGRlciBmb3IgdGhlIHNoYXJlZCBhcmVhLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIHRlc3QKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRqdXN0Q1RGQnV0dG9ucyhNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikpCisJCQlyZXR1cm47CisKKwkJQ1RhYkZvbGRlciBjdGYgPSBnZXRDVEZGb3IoZWxlbWVudCk7CisJCWlmIChjdGYgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJc2V0Q1RGQnV0dG9ucyhjdGYsIGVsZW1lbnQsIGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCU1BcmVhIGFyZWEgPSBnZXRBcmVhRm9yKChNUGFydFN0YWNrKSBlbGVtZW50KTsKKwkJCWlmIChhcmVhID09IG51bGwpIHsKKwkJCQlzZXRDVEZCdXR0b25zKGN0ZiwgZWxlbWVudCwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBDVGFiRm9sZGVyIGdldENURkZvcihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQXJlYSkgeworCQkJaWYgKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKQorCQkJCXJldHVybiAoQ1RhYkZvbGRlcikgZWxlbWVudC5nZXRXaWRnZXQoKTsKKwkJCUxpc3Q8TVBhcnRTdGFjaz4gc3RhY2tzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyhlbGVtZW50LCBudWxsLCBNUGFydFN0YWNrLmNsYXNzLAorCQkJCQludWxsKTsKKwkJCWZvciAoTVBhcnRTdGFjayBzdGFjayA6IHN0YWNrcykgeworCQkJCWlmIChzdGFjay5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpCisJCQkJCXJldHVybiAoQ1RhYkZvbGRlcikgc3RhY2suZ2V0V2lkZ2V0KCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZWxlbWVudC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpCisJCQlyZXR1cm4gKENUYWJGb2xkZXIpIGVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpIHsKKwkJCU1QbGFjZWhvbGRlciBwaCA9IChNUGxhY2Vob2xkZXIpIGVsZW1lbnQ7CisJCQlpZiAocGguZ2V0UmVmKCkgaW5zdGFuY2VvZiBNQXJlYSkgeworCQkJCXJldHVybiBnZXRDVEZGb3IocGguZ2V0UmVmKCkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCWJvb2xlYW4gaXNFbXB0eVBlcnNwZWN0aXZlU3RhY2soTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykpCisJCQlyZXR1cm4gZmFsc2U7CisJCU1QZXJzcGVjdGl2ZVN0YWNrIHBzID0gKE1QZXJzcGVjdGl2ZVN0YWNrKSBlbGVtZW50OworCQlyZXR1cm4gcHMuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMDsKKwl9CisKKwl2b2lkIG1pbmltaXplKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQkvLyBDYW4ndCBtaW5pbWl6ZSBhIG5vbi1yZW5kZXJlZCBlbGVtZW50CisJCWlmICghZWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpKQorCQkJcmV0dXJuOworCisJCWlmIChpc0VtcHR5UGVyc3BlY3RpdmVTdGFjayhlbGVtZW50KSkgeworCQkJZWxlbWVudC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNyZWF0ZVRyaW0oZWxlbWVudCk7CisJCWVsZW1lbnQuc2V0VmlzaWJsZShmYWxzZSk7CisJCWFkanVzdENURkJ1dHRvbnMoZWxlbWVudCk7CisJCS8vIEFjdGl2YXRlIGEgcGFydCBvdGhlciB0aGFuIHRoZSB0cmltU3RhY2sgc28gdGhhdCBpZiB0aGUgdG9vbCBpdGVtIGlzIHByZXNzZWQKKwkJLy8gaW1tZWRpYXRlbHkgaXQgd2lsbCBzdGlsbCBvcGVuIHRoZSBzdGFjay4KKwkJcGFydFNlcnZpY2UucmVxdWVzdEFjdGl2YXRpb24oKTsKKwl9CisKKwl2b2lkIHJlc3RvcmUoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1XaW5kb3cgd2luZG93ID0gbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKGVsZW1lbnQpOworCQlTdHJpbmcgdHJpbUlkID0gZWxlbWVudC5nZXRFbGVtZW50SWQoKSArIGdldE1pbmltaXplZEVsZW1lbnRTdWZmaXgoZWxlbWVudCk7CisJCU1Ub29sQ29udHJvbCB0cmltU3RhY2sgPSAoTVRvb2xDb250cm9sKSBtb2RlbFNlcnZpY2UuZmluZCh0cmltSWQsIHdpbmRvdyk7CisJCWlmICh0cmltU3RhY2sgPT0gbnVsbCB8fCB0cmltU3RhY2suZ2V0T2JqZWN0KCkgPT0gbnVsbCkgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykgeworCQkJCWVsZW1lbnQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCVRyaW1TdGFjayB0cyA9IChUcmltU3RhY2spIHRyaW1TdGFjay5nZXRPYmplY3QoKTsKKwkJdHMucmVzdG9yZVN0YWNrKCk7CisKKwkJYWRqdXN0Q1RGQnV0dG9ucyhlbGVtZW50KTsKKworCQlMaXN0PFN0cmluZz4gbWF4aW1pemVUYWcgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJbWF4aW1pemVUYWcuYWRkKElQcmVzZW50YXRpb25FbmdpbmUuTUFYSU1JWkVEKTsKKwkJTGlzdDxNVUlFbGVtZW50PiBjdXJNYXggPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHdpbmRvdywgbnVsbCwgTVVJRWxlbWVudC5jbGFzcywKKwkJCQltYXhpbWl6ZVRhZywgRU1vZGVsU2VydmljZS5QUkVTRU5UQVRJT04pOworCQlpZiAoY3VyTWF4LnNpemUoKSA+IDApIHsKKwkJCU1VSUVsZW1lbnQgbWF4RWxlbWVudCA9IGN1ck1heC5nZXQoMCk7CisJCQlMaXN0PE1VSUVsZW1lbnQ+IGVsZW1lbnRzTGVmdFRvUmVzdG9yZSA9IGdldEVsZW1lbnRzVG9SZXN0b3JlKG1heEVsZW1lbnQpOworCisJCQkvLyBBcmUgYW55IHN0YWNrcyBzdGlsbCBtaW5pbWl6ZWQgPworCQkJYm9vbGVhbiB1bk1heCA9IHRydWU7CisJCQlmb3IgKE1VSUVsZW1lbnQgdG9SZXN0b3JlIDogZWxlbWVudHNMZWZ0VG9SZXN0b3JlKSB7CisJCQkJaWYgKCF0b1Jlc3RvcmUuaXNWaXNpYmxlKCkpCisJCQkJCXVuTWF4ID0gZmFsc2U7CisJCQl9CisJCQlpZiAodW5NYXgpIHsKKwkJCQltYXhFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoSVByZXNlbnRhdGlvbkVuZ2luZS5NQVhJTUlaRUQpOworCQkJfQorCQl9CisJfQorCisJdm9pZCBtYXhpbWl6ZShmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKCFlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpCisJCQlyZXR1cm47CisKKwkJTGlzdDxNVUlFbGVtZW50PiBlbGVtZW50c1RvTWluaW1pemUgPSBnZXRFbGVtZW50c1RvTWluaW1pemUoZWxlbWVudCk7CisJCVNoZWxsIGhvc3RTaGVsbCA9IChTaGVsbCkgbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKGVsZW1lbnQpLmdldFdpZGdldCgpOworCQlNV2luZG93IHdpbiA9IGdldFdpbmRvd0ZvcihlbGVtZW50KTsKKworCQlGYWRlckFuaW1hdGlvbkZlZWRiYWNrIGZhZGVyID0gbmV3IEZhZGVyQW5pbWF0aW9uRmVlZGJhY2soaG9zdFNoZWxsKTsKKwkJQW5pbWF0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBBbmltYXRpb25FbmdpbmUod2luLmdldENvbnRleHQoKSwgZmFkZXIsIDMwMCk7CisJCWVuZ2luZS5zY2hlZHVsZSgpOworCisJCS8vIFJlc3RvcmUgYW55IGN1cnJlbnRseSBtYXhpbWl6ZWQgZWxlbWVudAorCQlyZXN0b3JlTWF4aW1pemVkRWxlbWVudChlbGVtZW50LCB3aW4pOworCisJCWZvciAoTVVJRWxlbWVudCB0b01pbmltaXplIDogZWxlbWVudHNUb01pbmltaXplKSB7CisJCQl0b01pbmltaXplLmdldFRhZ3MoKS5hZGQoTUlOSU1JWkVEKTsKKwkJCXRvTWluaW1pemUuZ2V0VGFncygpLmFkZChNSU5JTUlaRURfQllfWk9PTSk7CisJCX0KKworCQlhZGp1c3RDVEZCdXR0b25zKGVsZW1lbnQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogQHJldHVybiBUaGUgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG5lZWQgdG8gYmUgbWluaW1pemVkIGR1cmluZyBhIG1heGltaXplCisJICovCisJcHJpdmF0ZSBMaXN0PE1VSUVsZW1lbnQ+IGdldEVsZW1lbnRzVG9NaW5pbWl6ZShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJTVdpbmRvdyB3aW4gPSBnZXRXaW5kb3dGb3IoZWxlbWVudCk7CisJCU1QZXJzcGVjdGl2ZSBwZXJzcCA9IG1vZGVsU2VydmljZS5nZXRBY3RpdmVQZXJzcGVjdGl2ZSh3aW4pOworCisJCUxpc3Q8TVVJRWxlbWVudD4gZWxlbWVudHNUb01pbmltaXplID0gbmV3IEFycmF5TGlzdDxNVUlFbGVtZW50PigpOworCQlpbnQgbG9jID0gbW9kZWxTZXJ2aWNlLmdldEVsZW1lbnRMb2NhdGlvbihlbGVtZW50KTsKKwkJaWYgKChsb2MgJiBFTW9kZWxTZXJ2aWNlLk9VVFNJREVfUEVSU1BFQ1RJVkUpICE9IDApIHsKKwkJCS8vIE1pbmltaXplIGFsbCBvdGhlciBnbG9iYWwgc3RhY2tzCisJCQlMaXN0PE1QYXJ0U3RhY2s+IGdsb2JhbFN0YWNrcyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMod2luLCBudWxsLCBNUGFydFN0YWNrLmNsYXNzLAorCQkJCQludWxsLCBFTW9kZWxTZXJ2aWNlLk9VVFNJREVfUEVSU1BFQ1RJVkUpOworCQkJZm9yIChNUGFydFN0YWNrIGdTdGFjayA6IGdsb2JhbFN0YWNrcykgeworCQkJCWlmIChnU3RhY2sgPT0gZWxlbWVudCB8fCAhZ1N0YWNrLmlzVG9CZVJlbmRlcmVkKCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGdTdGFjay5nZXRXaWRnZXQoKSAhPSBudWxsICYmICFnU3RhY2suZ2V0VGFncygpLmNvbnRhaW5zKE1JTklNSVpFRCkpIHsKKwkJCQkJZWxlbWVudHNUb01pbmltaXplLmFkZChnU3RhY2spOworCQkJCX0KKwkJCX0KKworCQkJLy8gTWluaW1pemUgdGhlIFBlcnNwZWN0aXZlIFN0YWNrCisJCQlNVUlFbGVtZW50IHBlcnNwU3RhY2sgPSBudWxsOworCQkJaWYgKHBlcnNwID09IG51bGwpIHsKKwkJCQkvLyBzcGVjaWFsIGNhc2UgZm9yIHdpbmRvd3Mgd2l0aCBubyBwZXJzcGVjdGl2ZXMgKGVnIGJ1ZyAzNzI2MTQ6CisJCQkJLy8gaW50cm8gcGFydCB3aXRoIG5vIHBlcnNwZWN0aXZlcykuIFdlIGtub3cgd2UncmUgb3V0c2lkZQorCQkJCS8vIG9mIHRoZSBwZXJzcGVjdGl2ZSBzdGFjaywgc28gZmluZCBpdCB0b3AtZG93bgorCQkJCUxpc3Q8TVBlcnNwZWN0aXZlU3RhY2s+IHBTdGFja3MgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHdpbiwgbnVsbCwKKwkJCQkJCU1QZXJzcGVjdGl2ZVN0YWNrLmNsYXNzLCBudWxsKTsKKwkJCQlwZXJzcFN0YWNrID0gKHBTdGFja3Muc2l6ZSgpID4gMCkgPyBwU3RhY2tzLmdldCgwKSA6IG51bGw7CisJCQl9IGVsc2UgeworCQkJCXBlcnNwU3RhY2sgPSBwZXJzcC5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJCWlmIChwZXJzcFN0YWNrICE9IG51bGwpIHsKKwkJCQlpZiAocGVyc3BTdGFjay5nZXRFbGVtZW50SWQoKSA9PSBudWxsIHx8IHBlcnNwU3RhY2suZ2V0RWxlbWVudElkKCkubGVuZ3RoKCkgPT0gMCkKKwkJCQkJcGVyc3BTdGFjay5zZXRFbGVtZW50SWQoIlBlcnNwZWN0aXZlU3RhY2siKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJZWxlbWVudHNUb01pbmltaXplLmFkZChwZXJzcFN0YWNrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxpc3Q8TVBhcnRTdGFjaz4gc3RhY2tzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyhwZXJzcCA9PSBudWxsID8gd2luIDogcGVyc3AsIG51bGwsCisJCQkJCU1QYXJ0U3RhY2suY2xhc3MsIG51bGwsIEVNb2RlbFNlcnZpY2UuUFJFU0VOVEFUSU9OKTsKKwkJCWZvciAoTVBhcnRTdGFjayB0aGVTdGFjayA6IHN0YWNrcykgeworCQkJCWlmICh0aGVTdGFjayA9PSBlbGVtZW50IHx8ICF0aGVTdGFjay5pc1RvQmVSZW5kZXJlZCgpKQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIEV4Y2x1ZGUgc3RhY2tzIGluIERXJ3MKKwkJCQlpZiAoZ2V0V2luZG93Rm9yKHRoZVN0YWNrKSAhPSB3aW4pCisJCQkJCWNvbnRpbnVlOworCisJCQkJbG9jID0gbW9kZWxTZXJ2aWNlLmdldEVsZW1lbnRMb2NhdGlvbih0aGVTdGFjayk7CisJCQkJaWYgKGxvYyAhPSBFTW9kZWxTZXJ2aWNlLklOX1NIQVJFRF9BUkVBICYmIHRoZVN0YWNrLmdldFdpZGdldCgpICE9IG51bGwKKwkJCQkJCSYmIHRoZVN0YWNrLmlzVmlzaWJsZSgpICYmICF0aGVTdGFjay5nZXRUYWdzKCkuY29udGFpbnMoTUlOSU1JWkVEKSkgeworCQkJCQllbGVtZW50c1RvTWluaW1pemUuYWRkKHRoZVN0YWNrKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIEZpbmQgYW55ICdzdGFuZGFsb25lJyB2aWV3cyAqbm90KiBpbiBhIHN0YWNrCisJCQlMaXN0PFN0cmluZz4gc3RhbmRhbG9uZVRhZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJc3RhbmRhbG9uZVRhZy5hZGQoSVByZXNlbnRhdGlvbkVuZ2luZS5TVEFOREFMT05FKTsKKwkJCUxpc3Q8TVBsYWNlaG9sZGVyPiBzdGFuZGFsb25lVmlld3MgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHBlcnNwID09IG51bGwgPyB3aW4KKwkJCQkJOiBwZXJzcCwgbnVsbCwgTVBsYWNlaG9sZGVyLmNsYXNzLCBzdGFuZGFsb25lVGFnLCBFTW9kZWxTZXJ2aWNlLlBSRVNFTlRBVElPTik7CisJCQlmb3IgKE1QbGFjZWhvbGRlciBwYXJ0IDogc3RhbmRhbG9uZVZpZXdzKSB7CisJCQkJaWYgKCFwYXJ0LmlzVG9CZVJlbmRlcmVkKCkpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsZW1lbnRzVG9NaW5pbWl6ZS5hZGQocGFydCk7CisJCQl9CisKKwkJCS8vIEZpbmQgdGhlIGVkaXRvciAnYXJlYScKKwkJCWlmIChwZXJzcCAhPSBudWxsKSB7CisJCQkJTVBsYWNlaG9sZGVyIGVhUGxhY2Vob2xkZXIgPSAoTVBsYWNlaG9sZGVyKSBtb2RlbFNlcnZpY2UKKwkJCQkJCS5maW5kKElEX0VESVRPUl9BUkVBLCBwZXJzcCk7CisJCQkJaWYgKGVsZW1lbnQgIT0gZWFQbGFjZWhvbGRlciAmJiBlYVBsYWNlaG9sZGVyICE9IG51bGwKKwkJCQkJCSYmIGVhUGxhY2Vob2xkZXIuZ2V0V2lkZ2V0KCkgIT0gbnVsbCAmJiBlYVBsYWNlaG9sZGVyLmlzVmlzaWJsZSgpKSB7CisJCQkJCWVsZW1lbnRzVG9NaW5pbWl6ZS5hZGQoZWFQbGFjZWhvbGRlcik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGVsZW1lbnRzVG9NaW5pbWl6ZTsKKwl9CisKKwkvKioKKwkgKiBSZXN0b3JlIGFueSBjdXJyZW50bHkgbWF4aW1pemVkIGVsZW1lbnQgKGV4Y2VwdCB0aGUgb25lIHdlJ3JlIGluIHRoZQorCSAqIHByb2Nlc3Mgb2YgbWF4aW1pemluZworCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiBAcGFyYW0gd2luCisJICovCisJcHJpdmF0ZSB2b2lkIHJlc3RvcmVNYXhpbWl6ZWRFbGVtZW50KGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgTVdpbmRvdyB3aW4pIHsKKwkJTVBlcnNwZWN0aXZlIGVsZVBlcnNwID0gbW9kZWxTZXJ2aWNlLmdldFBlcnNwZWN0aXZlRm9yKGVsZW1lbnQpOworCQlMaXN0PFN0cmluZz4gbWF4VGFnID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCW1heFRhZy5hZGQoTUFYSU1JWkVEKTsKKwkJTGlzdDxNVUlFbGVtZW50PiBjdXJNYXggPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHdpbiwgbnVsbCwgTVVJRWxlbWVudC5jbGFzcywgbWF4VGFnKTsKKwkJaWYgKGN1ck1heC5zaXplKCkgPiAwKSB7CisJCQlmb3IgKE1VSUVsZW1lbnQgbWF4RWxlbWVudCA6IGN1ck1heCkgeworCQkJCS8vIE9ubHkgdW5tYXggZWxlbWVudHMgaW4gdGhpcyB3aW5kb3cKKwkJCQlpZiAoZ2V0V2luZG93Rm9yKG1heEVsZW1lbnQpICE9IHdpbikKKwkJCQkJY29udGludWU7CisKKwkJCQlNUGVyc3BlY3RpdmUgbWF4UGVyc3AgPSBtb2RlbFNlcnZpY2UuZ2V0UGVyc3BlY3RpdmVGb3IobWF4RWxlbWVudCk7CisJCQkJaWYgKG1heFBlcnNwICE9IGVsZVBlcnNwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAobWF4RWxlbWVudCA9PSBlbGVtZW50KQorCQkJCQljb250aW51ZTsKKwkJCQlpZ25vcmVUYWdDaGFuZ2VzID0gdHJ1ZTsKKwkJCQl0cnkgeworCQkJCQltYXhFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoTUFYSU1JWkVEKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlpZ25vcmVUYWdDaGFuZ2VzID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBNV2luZG93IGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50IChpZiBhbnkpLiBUaGlzIG1heSBlaXRoZXIgYmUgYQorCSAqICd0b3AgbGV2ZWwnIHdpbmRvdyAtb3ItIGEgZGV0YWNoZWQgd2luZG93LiBUaGlzIGFsbG93cyB0aGUgbWluLm1heCBjb2RlCisJICogdG8gb25seSBhZmZlY3QgZWxlbWVudHMgaW4gdGhlIHdpbmRvdyBjb250YWluaW5nIHRoZSBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGNoZWNrCisJICoKKwkgKiBAcmV0dXJuIHRoZSB3aW5kb3cgY29udGFpbmluZyB0aGUgZWxlbWVudC4KKwkgKi8KKwlwcml2YXRlIE1XaW5kb3cgZ2V0V2luZG93Rm9yKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlNVUlFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisKKwkJLy8gV2UgcmVseSBoZXJlIG9uIHRoZSBmYWN0IHRoYXQgYSBEVydzICdnZXRQYXJlbnQnIHdpbGwgcmV0dXJuCisJCS8vIG51bGwgc2luY2UgaXQncyBub3QgaW4gdGhlICdjaGlsZHJlbicgaGllcmFyY2h5CisJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1XaW5kb3cpKQorCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCisJCS8vIEEgZGV0YWNoZWQgd2luZG93IHdpbGwgZW5kIHVwIHdpdGggZ2V0UGFyZW50KCkgPT0gbnVsbAorCQlyZXR1cm4gKE1XaW5kb3cpIHBhcmVudDsKKwl9CisKKwl2b2lkIHVuem9vbShmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJTVdpbmRvdyB3aW4gPSBnZXRXaW5kb3dGb3IoZWxlbWVudCk7CisKKwkJU2hlbGwgaG9zdFNoZWxsID0gKFNoZWxsKSB3aW4uZ2V0V2lkZ2V0KCk7CisJCUZhZGVyQW5pbWF0aW9uRmVlZGJhY2sgZmFkZXIgPSBuZXcgRmFkZXJBbmltYXRpb25GZWVkYmFjayhob3N0U2hlbGwpOworCQlBbmltYXRpb25FbmdpbmUgZW5naW5lID0gbmV3IEFuaW1hdGlvbkVuZ2luZSh3aW4uZ2V0Q29udGV4dCgpLCBmYWRlciwgMzAwKTsKKwkJZW5naW5lLnNjaGVkdWxlKCk7CisKKwkJTGlzdDxNVUlFbGVtZW50PiBlbGVtZW50c1RvUmVzdG9yZSA9IGdldEVsZW1lbnRzVG9SZXN0b3JlKGVsZW1lbnQpOworCQlmb3IgKE1VSUVsZW1lbnQgdG9SZXN0b3JlIDogZWxlbWVudHNUb1Jlc3RvcmUpIHsKKwkJCXRvUmVzdG9yZS5nZXRUYWdzKCkucmVtb3ZlKElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVEX0JZX1pPT00pOworCQkJdG9SZXN0b3JlLmdldFRhZ3MoKS5yZW1vdmUoSVByZXNlbnRhdGlvbkVuZ2luZS5NSU5JTUlaRUQpOworCQl9CisKKwkJYWRqdXN0Q1RGQnV0dG9ucyhlbGVtZW50KTsKKworCQkvLyBUaGVyZSBhcmUgbW9yZSB2aWV3cyBhdmFpbGFibGUgdG8gYmUgYWN0aXZlLi4uCisJCXBhcnRTZXJ2aWNlLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBiZSByZXN0b3JlZCBieSBhbiB1bnpvb20KKwkgKi8KKwlwcml2YXRlIExpc3Q8TVVJRWxlbWVudD4gZ2V0RWxlbWVudHNUb1Jlc3RvcmUoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1XaW5kb3cgd2luID0gZ2V0V2luZG93Rm9yKGVsZW1lbnQpOworCQlNUGVyc3BlY3RpdmUgcGVyc3AgPSBtb2RlbFNlcnZpY2UuZ2V0QWN0aXZlUGVyc3BlY3RpdmUod2luKTsKKworCQlMaXN0PE1VSUVsZW1lbnQ+IGVsZW1lbnRzVG9SZXN0b3JlID0gbmV3IEFycmF5TGlzdDxNVUlFbGVtZW50PigpOworCisJCUxpc3Q8U3RyaW5nPiBtaW5UYWcgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJbWluVGFnLmFkZChJUHJlc2VudGF0aW9uRW5naW5lLk1JTklNSVpFRF9CWV9aT09NKTsKKworCQkvLyBSZXN0b3JlIGFueSBtaW5pbWl6ZWQgc3RhY2tzCisJCWJvb2xlYW4gb3V0c2lkZVBlcnNwZWN0aXZlcyA9IChtb2RlbFNlcnZpY2UuZ2V0RWxlbWVudExvY2F0aW9uKGVsZW1lbnQpICYgRU1vZGVsU2VydmljZS5PVVRTSURFX1BFUlNQRUNUSVZFKSAhPSAwOworCQlMaXN0PE1QYXJ0U3RhY2s+IHN0YWNrcyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMod2luLCBudWxsLCBNUGFydFN0YWNrLmNsYXNzLCBtaW5UYWcsCisJCQkJRU1vZGVsU2VydmljZS5QUkVTRU5UQVRJT04pOworCQlmb3IgKE1QYXJ0U3RhY2sgdGhlU3RhY2sgOiBzdGFja3MpIHsKKwkJCWlmICh0aGVTdGFjay5nZXRXaWRnZXQoKSAhPSBudWxsKSB7CisJCQkJLy8gTWFrZSBzdXJlIHdlIGRvbid0IHJlc3RvcmUgcGVyc3BlY3RpdmUtYmFzZWQgc3RhY2tzIGlmIHdlJ3JlCisJCQkJLy8gdW56b29vbWluZyBhbiBlbGVtZW50IG91dHNpZGUgdGhlIHBlcnNwZWN0aXZlcworCQkJCWlmIChvdXRzaWRlUGVyc3BlY3RpdmVzKSB7CisJCQkJCWludCBzdGFja0xvYyA9IG1vZGVsU2VydmljZS5nZXRFbGVtZW50TG9jYXRpb24odGhlU3RhY2spOworCQkJCQlpZiAoKHN0YWNrTG9jICYgRU1vZGVsU2VydmljZS5PVVRTSURFX1BFUlNQRUNUSVZFKSA9PSAwKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gTWFrZSBzdXJlIHdlJ3JlIG9ubHkgd29ya2luZyBvbiAqb3VyKiB3aW5kb3cKKwkJCQlpZiAoZ2V0V2luZG93Rm9yKHRoZVN0YWNrKSA9PSB3aW4pIHsKKwkJCQkJZWxlbWVudHNUb1Jlc3RvcmUuYWRkKHRoZVN0YWNrKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBSZXN0b3JlIGFueSBtaW5pbWl6ZWQgc3RhbmRhbG9uZSB2aWV3cworCQlMaXN0PE1QbGFjZWhvbGRlcj4gdmlld3MgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHdpbiwgbnVsbCwgTVBsYWNlaG9sZGVyLmNsYXNzLCBtaW5UYWcsCisJCQkJRU1vZGVsU2VydmljZS5QUkVTRU5UQVRJT04pOworCQlmb3IgKE1QbGFjZWhvbGRlciBwaCA6IHZpZXdzKSB7CisJCQlpZiAocGguZ2V0V2lkZ2V0KCkgIT0gbnVsbCAmJiBnZXRXaW5kb3dGb3IocGgpID09IHdpbikgeworCQkJCWVsZW1lbnRzVG9SZXN0b3JlLmFkZChwaCk7CisJCQl9CisJCX0KKworCQkvLyBGaW5kIHRoZSBlZGl0b3IgJ2FyZWEnCisJCU1QbGFjZWhvbGRlciBlYVBsYWNlaG9sZGVyID0gKE1QbGFjZWhvbGRlcikgbW9kZWxTZXJ2aWNlLmZpbmQoSURfRURJVE9SX0FSRUEsCisJCQkJcGVyc3AgPT0gbnVsbCA/IHdpbiA6IHBlcnNwKTsKKwkJaWYgKGVsZW1lbnQgIT0gZWFQbGFjZWhvbGRlciAmJiBlYVBsYWNlaG9sZGVyICE9IG51bGwKKwkJCQkmJiBlYVBsYWNlaG9sZGVyLmdldFRhZ3MoKS5jb250YWlucyhNSU5JTUlaRURfQllfWk9PTSkpIHsKKwkJCWVsZW1lbnRzVG9SZXN0b3JlLmFkZChlYVBsYWNlaG9sZGVyKTsKKwkJfQorCisJCS8vIEZpbmQgdGhlIFBlcnNwZWN0aXZlIFN0YWNrCisJCWludCBsb2MgPSBtb2RlbFNlcnZpY2UuZ2V0RWxlbWVudExvY2F0aW9uKGVsZW1lbnQpOworCQlpZiAoKGxvYyAmIEVNb2RlbFNlcnZpY2UuT1VUU0lERV9QRVJTUEVDVElWRSkgIT0gMCkgeworCQkJTGlzdDxNUGVyc3BlY3RpdmVTdGFjaz4gcHNMaXN0ID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW4sIG51bGwsCisJCQkJCU1QZXJzcGVjdGl2ZVN0YWNrLmNsYXNzLCBudWxsKTsKKwkJCWlmIChwc0xpc3Quc2l6ZSgpID09IDEpIHsKKwkJCQlNUGVyc3BlY3RpdmVTdGFjayBwZXJzcFN0YWNrID0gcHNMaXN0LmdldCgwKTsKKwkJCQlpZiAoZWxlbWVudCAhPSBwZXJzcFN0YWNrICYmIHBlcnNwU3RhY2sgIT0gbnVsbAorCQkJCQkJJiYgcGVyc3BTdGFjay5nZXRUYWdzKCkuY29udGFpbnMoTUlOSU1JWkVEX0JZX1pPT00pKSB7CisJCQkJCWVsZW1lbnRzVG9SZXN0b3JlLmFkZChwZXJzcFN0YWNrKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gZWxlbWVudHNUb1Jlc3RvcmU7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyaW0oTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1XaW5kb3cgd2luID0gZ2V0V2luZG93Rm9yKGVsZW1lbnQpOworCQlpZiAoISh3aW4gaW5zdGFuY2VvZiBNVHJpbW1lZFdpbmRvdykpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCU1UcmltbWVkV2luZG93IHdpbmRvdyA9IChNVHJpbW1lZFdpbmRvdykgd2luOworCQlTaGVsbCB3aW5TaGVsbCA9IChTaGVsbCkgd2luZG93LmdldFdpZGdldCgpOworCisJCS8vIElzIHRoZXJlIGFscmVhZHkgYSBUcmltQ29udHJvbCB0aGVyZSA/CisJCVN0cmluZyB0cmltSWQgPSBlbGVtZW50LmdldEVsZW1lbnRJZCgpICsgZ2V0TWluaW1pemVkRWxlbWVudFN1ZmZpeChlbGVtZW50KTsKKwkJTVRvb2xDb250cm9sIHRyaW1TdGFjayA9IChNVG9vbENvbnRyb2wpIG1vZGVsU2VydmljZS5maW5kKHRyaW1JZCwgd2luZG93KTsKKworCQlpZiAodHJpbVN0YWNrID09IG51bGwpIHsKKwkJCXRyaW1TdGFjayA9IE1lbnVGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlVG9vbENvbnRyb2woKTsKKwkJCXRyaW1TdGFjay5zZXRFbGVtZW50SWQodHJpbUlkKTsKKwkJCXRyaW1TdGFjay5zZXRDb250cmlidXRpb25VUkkoVHJpbVN0YWNrLkNPTlRSSUJVVElPTl9VUkkpOworCQkJdHJpbVN0YWNrLmdldFRhZ3MoKS5hZGQoIlRyaW1TdGFjayIpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgbG9jYXRpb24KKwkJCU1UcmltQmFyIGJhciA9IGdldEJhckZvckVsZW1lbnQoZWxlbWVudCwgd2luZG93KTsKKwkJCWludCBpbmRleCA9IGdldENhY2hlZEluZGV4KGVsZW1lbnQpOworCQkJaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID49IGJhci5nZXRDaGlsZHJlbigpLnNpemUoKSkKKwkJCQliYXIuZ2V0Q2hpbGRyZW4oKS5hZGQodHJpbVN0YWNrKTsKKwkJCWVsc2UKKwkJCQliYXIuZ2V0Q2hpbGRyZW4oKS5hZGQoaW5kZXgsIHRyaW1TdGFjayk7CisKKwkJCWJhci5zZXRWaXNpYmxlKHRydWUpOworCisJCQkvLyBnZXQgdGhlIHBhcmVudCB0cmltIGJhciwgc2VlIGJ1ZyAzMjA3NTYKKwkJCWlmIChiYXIuZ2V0V2lkZ2V0KCkgPT0gbnVsbCkgeworCQkJCS8vIGFzayBpdCB0byBiZSByZW5kZXJlZAorCQkJCWJhci5zZXRUb0JlUmVuZGVyZWQodHJ1ZSk7CisKKwkJCQkvLyBjcmVhdGUgdGhlIHdpZGdldAorCQkJCWNvbnRleHQuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MpCisJCQkJCQkuY3JlYXRlR3VpKGJhciwgd2luU2hlbGwsIHdpbmRvdy5nZXRDb250ZXh0KCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gZ2V0IHRoZSBwYXJlbnQgdHJpbSBiYXIsIHNlZSBidWcgMzIwNzU2CisJCQlNVUlFbGVtZW50IHBhcmVudCA9IHRyaW1TdGFjay5nZXRQYXJlbnQoKTsKKwkJCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOworCQkJaWYgKHBhcmVudC5nZXRXaWRnZXQoKSA9PSBudWxsKSB7CisJCQkJLy8gYXNrIGl0IHRvIGJlIHJlbmRlcmVkCisJCQkJcGFyZW50LnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCQkvLyBjcmVhdGUgdGhlIHdpZGdldAorCQkJCWNvbnRleHQuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MpLmNyZWF0ZUd1aShwYXJlbnQsIHdpblNoZWxsLAorCQkJCQkJd2luZG93LmdldENvbnRleHQoKSk7CisJCQl9CisJCQl0cmltU3RhY2suc2V0VG9CZVJlbmRlcmVkKHRydWUpOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q2FjaGVkSW5mbyhNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJU3RyaW5nIGNhY2hlSWQgPSBHTE9CQUxfQ0FDSEVfSUQ7CisJCU1QZXJzcGVjdGl2ZSBwZXJzcCA9IG1vZGVsU2VydmljZS5nZXRQZXJzcGVjdGl2ZUZvcihlbGVtZW50KTsKKwkJaWYgKHBlcnNwICE9IG51bGwpCisJCQljYWNoZUlkID0gcGVyc3AuZ2V0RWxlbWVudElkKCk7CisJCVN0cmluZyBjYWNoZUluZm8gPSBtaW5NYXhBZGRvbi5nZXRQZXJzaXN0ZWRTdGF0ZSgpLmdldChjYWNoZUlkKTsKKworCQlyZXR1cm4gY2FjaGVJbmZvOworCX0KKworCXByaXZhdGUgaW50IGdldENhY2hlZEluZGV4KE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlTdHJpbmcgY2FjaGUgPSBnZXRDYWNoZWRJbmZvKGVsZW1lbnQpOworCQlpZiAoY2FjaGUgPT0gbnVsbCkKKwkJCXJldHVybiAtMTsKKworCQlTdHJpbmdbXSBzdGFja3MgPSBjYWNoZS5zcGxpdCgiIyIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoU3RyaW5nIHN0YWNrSW5mbyA6IHN0YWNrcykgeworCQkJU3RyaW5nW10gdmFscyA9IHN0YWNrSW5mby5zcGxpdCgiICIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAodmFsc1swXS5lcXVhbHMoZWxlbWVudC5nZXRFbGVtZW50SWQoKSkpIHsKKwkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWxzWzJdKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcHJpdmF0ZSBTaWRlVmFsdWUgZ2V0Q2FjaGVkQmFyKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlTdHJpbmcgY2FjaGUgPSBnZXRDYWNoZWRJbmZvKGVsZW1lbnQpOworCQlpZiAoY2FjaGUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCVN0cmluZ1tdIHN0YWNrcyA9IGNhY2hlLnNwbGl0KCIjIik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChTdHJpbmcgc3RhY2tJbmZvIDogc3RhY2tzKSB7CisJCQlTdHJpbmdbXSB2YWxzID0gc3RhY2tJbmZvLnNwbGl0KCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh2YWxzWzBdLmVxdWFscyhlbGVtZW50LmdldEVsZW1lbnRJZCgpKSkgeworCQkJCWludCBzaWRlVmFsID0gSW50ZWdlci5wYXJzZUludCh2YWxzWzFdKTsKKwkJCQlyZXR1cm4gU2lkZVZhbHVlLmdldChzaWRlVmFsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIE1UcmltQmFyIGdldEJhckZvckVsZW1lbnQoTVVJRWxlbWVudCBlbGVtZW50LCBNVHJpbW1lZFdpbmRvdyB3aW5kb3cpIHsKKwkJU2lkZVZhbHVlIHNpZGUgPSBnZXRDYWNoZWRCYXIoZWxlbWVudCk7CisJCWlmIChzaWRlID09IG51bGwpIHsKKwkJCVNoZWxsIHdpblNoZWxsID0gKFNoZWxsKSB3aW5kb3cuZ2V0V2lkZ2V0KCk7CisJCQlSZWN0YW5nbGUgd2luQm91bmRzID0gd2luU2hlbGwuZ2V0Qm91bmRzKCk7CisJCQlpbnQgd2luQ2VudGVyWCA9IHdpbkJvdW5kcy53aWR0aCAvIDI7CisJCQlDb250cm9sIHN0YWNrQ3RybCA9IChDb250cm9sKSBlbGVtZW50LmdldFdpZGdldCgpOworCQkJUmVjdGFuZ2xlIHN0YWNrQm91bmRzID0gc3RhY2tDdHJsLmdldEJvdW5kcygpOworCQkJc3RhY2tCb3VuZHMgPSB3aW5TaGVsbC5nZXREaXNwbGF5KCkubWFwKHN0YWNrQ3RybCwgd2luU2hlbGwsIHN0YWNrQm91bmRzKTsKKwkJCWludCBzdGFja0NlbnRlclggPSBzdGFja0JvdW5kcy54ICsgKHN0YWNrQm91bmRzLndpZHRoIC8gMik7CisJCQlzaWRlID0gc3RhY2tDZW50ZXJYIDwgd2luQ2VudGVyWCA/IFNpZGVWYWx1ZS5MRUZUIDogU2lkZVZhbHVlLlJJR0hUOworCQl9CisJCU1UcmltQmFyIGJhciA9IG1vZGVsU2VydmljZS5nZXRUcmltKHdpbmRvdywgc2lkZSk7CisKKwkJcmV0dXJuIGJhcjsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRNaW5pbWl6ZWRFbGVtZW50U3VmZml4KE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlTdHJpbmcgaWQgPSBJRF9TVUZGSVg7CisJCU1QZXJzcGVjdGl2ZSBwZXJzcCA9IG1vZGVsU2VydmljZS5nZXRQZXJzcGVjdGl2ZUZvcihlbGVtZW50KTsKKwkJaWYgKHBlcnNwICE9IG51bGwpIHsKKwkJCWlkID0gJygnICsgcGVyc3AuZ2V0RWxlbWVudElkKCkgKyAnKSc7CisJCX0KKwkJcmV0dXJuIGlkOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L1RyaW1TdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9taW5tYXgvVHJpbVN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1M2IyMwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L1RyaW1TdGFjay5qYXZhCkBAIC0wLDAgKzEsMTMwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIExhcnMuVm9nZWxAdm9nZWxsYS5jb20gLSBCdWcgNDU0NzEyCisgKiAgICAgZGlyay5mYXV0aEBnb29nbGVtYWlsLmNvbSAtIEJ1ZyA0NDYwOTUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMubWlubWF4OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlFdmVudFRvcGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQ1NTUmVuZGVyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5TaGVsbEFjdGl2YXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NR2VuZXJpY1N0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuU2lkZVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1BcmVhOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmVTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGxhY2Vob2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTUNvbXBvc2l0ZVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NU3RhY2tFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLkV2ZW50VGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRVBhcnRTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LlRyaW1tZWRQYXJ0TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKKworCisvKioKKyAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgd2luZG93IHRyaW0gY29udGFpbmluZyBtaW5pbWl6ZWQgdmlld3MgYW5kIHNoYXJlZCBhcmVhcworICovCitwdWJsaWMgY2xhc3MgVHJpbVN0YWNrIHsKKworCS8qKgorCSAqIENvbnRyaWJ1dGlvbiBVUkkgZm9yIHRoaXMgY2xhc3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05UUklCVVRJT05fVVJJID0gImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5taW5tYXguVHJpbVN0YWNrIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9JQ09OX1VSSSA9ICJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L2ljb25zL2Z1bGwvb2JqMTYvbGF5b3V0X2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUT1JFX0lDT05fVVJJID0gInBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QvaWNvbnMvZnVsbC9ldG9vbDE2L2Zhc3R2aWV3X3Jlc3RvcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX09WRVJMQVlTX0tFWSA9ICJVc2VPdmVybGF5cyI7IC8vJE5PTi1OTFMtMSQKKworCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfWFNJWkUgPSAiWFNpemUiOyAvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1lTSVpFID0gIllTaXplIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOSU1JWkVEX0FORF9TSE9XSU5HID0gIk1pbmltaXplZEFuZFNob3dpbmciOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIEltYWdlIGxheW91dEltYWdlOworCisJcHJpdmF0ZSBJbWFnZSByZXN0b3JlSW1hZ2U7CisKKwlwcml2YXRlIFRvb2xCYXIgdHJpbVN0YWNrVEI7CisKKwkvKioKKwkgKiBUaGUgY29udGV4dCBtZW51IGZvciB0aGlzIHRyaW0gc3RhY2sncyBpdGVtcy4KKwkgKi8KKwlwcml2YXRlIE1lbnUgdHJpbVN0YWNrTWVudTsKKworCXByaXZhdGUgYm9vbGVhbiBjYWNoZWRVc2VPdmVybGF5cyA9IHRydWU7CisJcHJpdmF0ZSBib29sZWFuIGlzU2hvd2luZyA9IGZhbHNlOworCXByaXZhdGUgTVVJRWxlbWVudCBtaW5pbWl6ZWRFbGVtZW50OworCS8vIHByaXZhdGUgQ29tcG9zaXRlIGNsaWVudEFyZWFDb21wb3NpdGU7CisJcHJpdmF0ZSBDb21wb3NpdGUgaG9zdFBhbmU7CisKKwlASW5qZWN0CisJQE5hbWVkKCJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVJlc291cmNlVXRpbGl0aWVzIikKKwlwcml2YXRlIElSZXNvdXJjZVV0aWxpdGllczxJbWFnZURlc2NyaXB0b3I+IHJlc1V0aWxzOworCisJLyoqCisJICogQSBtYXAgb2YgY3JlYXRlZCBpbWFnZXMgZnJvbSBhIHBhcnQncyBpY29uIFVSSSBwYXRoLgorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZywgSW1hZ2U+IGltYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKKworCUNvbnRyb2xMaXN0ZW5lciBjYVJlc2l6ZUxpc3RlbmVyID0gbmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKKwkJCWlmIChob3N0UGFuZSAhPSBudWxsICYmIGhvc3RQYW5lLmlzVmlzaWJsZSgpKQorCQkJCXNldFBhbmVMb2NhdGlvbigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgeworCQl9CisJfTsKKworCS8vIExpc3RlbnMgdG8gRVNDIGFuZCBjbG9zZXMgdGhlIGFjdGl2ZSBmYXN0IHZpZXcKKwlwcml2YXRlIExpc3RlbmVyIGVzY2FwZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgeworCQkvKioKKwkJICoKKwkJICovCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7CisJCQkJc2hvd1N0YWNrKGZhbHNlKTsKKwkJCQlwYXJ0U2VydmljZS5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJfQorCQl9CisJfTsKKworCUBJbmplY3QKKwlFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlFUGFydFNlcnZpY2UgcGFydFNlcnZpY2U7CisKKwlASW5qZWN0CisJTVdpbmRvdyB3aW5kb3c7CisKKwlASW5qZWN0CisJTVRvb2xDb250cm9sIHRvb2xDb250cm9sOworCisJQEluamVjdAorCXByb3RlY3RlZCBJRXZlbnRCcm9rZXIgZXZlbnRCcm9rZXI7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljVGFnc0NoYW5nZWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLkFwcGxpY2F0aW9uRWxlbWVudC5UT1BJQ19UQUdTKSBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50IGV2ZW50KSB7CisJCU9iamVjdCBjaGFuZ2VkT2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCWlmICghKGNoYW5nZWRPYmogaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpKQorCQkJcmV0dXJuOworCisJCWZpbmFsIE1Ub29sQ29udHJvbCBjaGFuZ2VkRWxlbWVudCA9IChNVG9vbENvbnRyb2wpIGNoYW5nZWRPYmo7CisJCWlmIChjaGFuZ2VkRWxlbWVudC5nZXRPYmplY3QoKSAhPSB0aGlzKQorCQkJcmV0dXJuOworCisJCWlmIChVSUV2ZW50cy5pc1JFTU9WRShldmVudCkpIHsKKwkJCWlmIChVSUV2ZW50cy5jb250YWlucyhldmVudCwgVUlFdmVudHMuRXZlbnRUYWdzLk9MRF9WQUxVRSwgTUlOSU1JWkVEX0FORF9TSE9XSU5HKSkgeworCQkJCXNob3dTdGFjayhmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEltYWdlIGdldE92ZXJyaWRlSW1hZ2UoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCUltYWdlIHJlc3VsdCA9IG51bGw7CisKKwkJT2JqZWN0IGltYWdlT2JqZWN0ID0gZWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KAorCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuT1ZFUlJJREVfSUNPTl9JTUFHRV9LRVkpOworCQlpZiAoaW1hZ2VPYmplY3QgIT0gbnVsbCAmJiBpbWFnZU9iamVjdCBpbnN0YW5jZW9mIEltYWdlCisJCQkJJiYgISgoSW1hZ2UpIGltYWdlT2JqZWN0KS5pc0Rpc3Bvc2VkKCkpCisJCQlyZXN1bHQgPSAoSW1hZ2UpIGltYWdlT2JqZWN0OworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldE92ZXJyaWRlVGl0bGVUb29sVGlwKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQlPYmplY3Qgc3RyaW5nT2JqZWN0ID0gZWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KAorCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuT1ZFUlJJREVfVElUTEVfVE9PTF9USVBfS0VZKTsKKwkJaWYgKHN0cmluZ09iamVjdCAhPSBudWxsICYmIHN0cmluZ09iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKKwkJCXJlc3VsdCA9IChTdHJpbmcpIHN0cmluZ09iamVjdDsKKworCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1VSUxhYmVsKSB7CisJCQlTdHJpbmcgbGFiZWwgPSAoKE1VSUxhYmVsKWVsZW1lbnQpLmdldExvY2FsaXplZExhYmVsKCk7CisJCQlpZiAobGFiZWwgIT0gbnVsbCAmJiBsYWJlbC5sZW5ndGgoKSA+IDApIHsKKwkJCQlyZXN1bHQgPSBsYWJlbCArICcgJyArICcoJyArIHJlc3VsdCArICcpJzsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbmV3IHdheSB0byBoYW5kbGUgVUlFdmVudHMgKGFzIG9wcG9zZWQgdG8gc3Vic2NyaW5nIGFuZCB1bnN1YnNjcmliaW5nIHRoZW0gd2l0aAorCSAqIHRoZSBldmVudCBicm9rZXIuCisJICoKKwkgKiBUaGUgbWV0aG9kIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgYXQgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRWNsaXBzZTQvUkNQL0V2ZW50X01vZGVsCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBoYW5kbGVUcmFuc2llbnREYXRhRXZlbnRzKAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5BcHBsaWNhdGlvbkVsZW1lbnQuVE9QSUNfVFJBTlNJRU5UREFUQSkgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudCBldmVudCkgeworCQkvLyBQcmV2ZW50IGV4Y2VwdGlvbnMgb24gc2h1dGRvd24KKwkJaWYgKHRyaW1TdGFja1RCID09IG51bGwgfHwgdHJpbVN0YWNrVEIuaXNEaXNwb3NlZCgpIHx8IG1pbmltaXplZEVsZW1lbnQuZ2V0V2lkZ2V0KCkgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlPYmplY3QgY2hhbmdlZEVsZW1lbnQgPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisJCWlmICghKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTVVJRWxlbWVudCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCVN0cmluZyBrZXk7CisJCWlmIChVSUV2ZW50cy5pc1JFTU9WRShldmVudCkpIHsKKwkJCWtleSA9ICgoRW50cnk8U3RyaW5nLCBPYmplY3Q+KSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKSkKKwkJCQkJLmdldEtleSgpOworCQl9IGVsc2UgeworCQkJa2V5ID0gKChFbnRyeTxTdHJpbmcsIE9iamVjdD4pIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpKQorCQkJCQkuZ2V0S2V5KCk7CisJCX0KKworCQlpZiAoa2V5LmVxdWFscyhJUHJlc2VudGF0aW9uRW5naW5lLk9WRVJSSURFX0lDT05fSU1BR0VfS0VZKSkgeworCQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBnZXRDaGFuZ2VkVG9vbEl0ZW0oKE1VSUVsZW1lbnQpIGNoYW5nZWRFbGVtZW50KTsKKwkJCWlmICh0b29sSXRlbSAhPSBudWxsKQorCQkJCXRvb2xJdGVtLnNldEltYWdlKGdldEltYWdlKChNVUlMYWJlbCkgdG9vbEl0ZW0uZ2V0RGF0YSgpKSk7CisJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJlc2VudGF0aW9uRW5naW5lLk9WRVJSSURFX1RJVExFX1RPT0xfVElQX0tFWSkpIHsKKwkJCVRvb2xJdGVtIHRvb2xJdGVtID0gZ2V0Q2hhbmdlZFRvb2xJdGVtKChNVUlFbGVtZW50KSBjaGFuZ2VkRWxlbWVudCk7CisJCQlpZiAodG9vbEl0ZW0gIT0gbnVsbCkKKwkJCQl0b29sSXRlbS5zZXRUb29sVGlwVGV4dChnZXRMYWJlbFRleHQoKE1VSUxhYmVsKSB0b29sSXRlbS5nZXREYXRhKCkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgVG9vbEl0ZW0gZ2V0Q2hhbmdlZFRvb2xJdGVtKE1VSUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpIHsKKwkJVG9vbEl0ZW1bXSB0b29sSXRlbXMgPSB0cmltU3RhY2tUQi5nZXRJdGVtcygpOworCQlmb3IgKFRvb2xJdGVtIHRvb2xJdGVtIDogdG9vbEl0ZW1zKSB7CisJCQlpZiAoY2hhbmdlZEVsZW1lbnQuZXF1YWxzKHRvb2xJdGVtLmdldERhdGEoKSkpIHsKKwkJCQlyZXR1cm4gdG9vbEl0ZW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgb2xkIHdheSB0byBzdWJzY3JpYmUgdG8gVUlFdmVudHMuIFlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIG5ldyB3YXkgYXMgc2hvd24KKwkgKiBieSBoYW5kbGVUcmFuc2llbnREYXRhRXZlbnRzKCkgYW5kIGRlc2NyaWJlZCBpbiB0aGUgYXJ0aWNsZSBhdAorCSAqIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VjbGlwc2U0L1JDUC9FdmVudF9Nb2RlbAorCSAqLworCXByaXZhdGUgRXZlbnRIYW5kbGVyIGNsb3NlSGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50IGV2ZW50KSB7CisJCQlpZiAoIWlzU2hvd2luZykKKwkJCQlyZXR1cm47CisKKwkJCS8vIFRoZSBvbmx5IHRpbWUgd2UgZG9uJ3QgY2xvc2UgaXMgaWYgSSd2ZSBzZWxlY3RlZCBteSB0YWIuCisJCQlNVUlFbGVtZW50IGNoYW5nZWRFbGVtZW50ID0gKE1VSUVsZW1lbnQpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKworCQkJLy8gUGVyc3BlY3RpdmUgY2hhbmdlZCwgY2xvc2UgdGhlIHZpc2libGUgc3RhY2tzCisJCQlpZiAoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykgeworCQkJCXNob3dTdGFjayhmYWxzZSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNQ29tcG9zaXRlUGFydCkgeworCQkJCU1QYXJ0IGlubmVyUGFydCA9IGdldExlYWZQYXJ0KGNoYW5nZWRFbGVtZW50KTsKKwkJCQlpZiAoaW5uZXJQYXJ0ICE9IG51bGwpIHsKKwkJCQkJZml4VG9vbEl0ZW1TZWxlY3Rpb24oKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNoYW5nZWRFbGVtZW50ID09IGdldExlYWZQYXJ0KG1pbmltaXplZEVsZW1lbnQpKSB7CisJCQkJZml4VG9vbEl0ZW1TZWxlY3Rpb24oKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXNob3dTdGFjayhmYWxzZSk7CisJCX0KKwl9OworCisJLy8gQ2xvc2UgYW55IG9wZW4gc3RhY2tzIGJlZm9yZSBzaHV0dGluZyBkb3duCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgc2h1dGRvd25IYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQgZXZlbnQpIHsKKwkJCXNob3dTdGFjayhmYWxzZSk7CisJCX0KKwl9OworCisJcHJpdmF0ZSB2b2lkIGZpeFRvb2xJdGVtU2VsZWN0aW9uKCkgeworCQlpZiAodHJpbVN0YWNrVEIgPT0gbnVsbCB8fCB0cmltU3RhY2tUQi5pc0Rpc3Bvc2VkKCkpCisJCQlyZXR1cm47CisKKwkJaWYgKCFpc1Nob3dpbmcpIHsKKwkJCS8vIE5vdCBvcGVuLi4ubm8gc2VsZWN0aW9uCisJCQlmb3IgKFRvb2xJdGVtIGl0ZW0gOiB0cmltU3RhY2tUQi5nZXRJdGVtcygpKSB7CisJCQkJaXRlbS5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGlzRWRpdG9yU3RhY2soKSB8fCBtaW5pbWl6ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQkJdHJpbVN0YWNrVEIuZ2V0SXRlbSgxKS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCQl9IGVsc2UgaWYgKGlzUGVyc3BlY3RpdmVTdGFjaygpKSB7CisJCQkJTVBlcnNwZWN0aXZlU3RhY2sgcFN0YWNrID0gKE1QZXJzcGVjdGl2ZVN0YWNrKSBtaW5pbWl6ZWRFbGVtZW50OworCQkJCU1VSUVsZW1lbnQgc2VsRWxlbWVudCA9IHBTdGFjay5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQlmb3IgKFRvb2xJdGVtIGl0ZW0gOiB0cmltU3RhY2tUQi5nZXRJdGVtcygpKSB7CisJCQkJCWl0ZW0uc2V0U2VsZWN0aW9uKGl0ZW0uZ2V0RGF0YSgpID09IHNlbEVsZW1lbnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJTVBhcnRTdGFjayBwYXJ0U3RhY2sgPSAoTVBhcnRTdGFjaykgbWluaW1pemVkRWxlbWVudDsKKwkJCQlNVUlFbGVtZW50IHNlbEVsZW1lbnQgPSBwYXJ0U3RhY2suZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJaWYgKHNlbEVsZW1lbnQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpCisJCQkJCXNlbEVsZW1lbnQgPSAoKE1QbGFjZWhvbGRlcikgc2VsRWxlbWVudCkuZ2V0UmVmKCk7CisKKwkJCQlmb3IgKFRvb2xJdGVtIGl0ZW0gOiB0cmltU3RhY2tUQi5nZXRJdGVtcygpKSB7CisJCQkJCWJvb2xlYW4gaXNTZWwgPSBpdGVtLmdldERhdGEoKSA9PSBzZWxFbGVtZW50OworCQkJCQlpdGVtLnNldFNlbGVjdGlvbihpc1NlbCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRWRpdG9yU3RhY2soKSB7CisJCWlmICghKG1pbmltaXplZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCU1QbGFjZWhvbGRlciBwaCA9IChNUGxhY2Vob2xkZXIpIG1pbmltaXplZEVsZW1lbnQ7CisJCXJldHVybiBwaC5nZXRSZWYoKSBpbnN0YW5jZW9mIE1BcmVhOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1BlcnNwZWN0aXZlU3RhY2soKSB7CisJCXJldHVybiBtaW5pbWl6ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlU3RhY2s7CisJfQorCisJcHJpdmF0ZSBNUGFydCBnZXRMZWFmUGFydChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpCisJCQlyZXR1cm4gZ2V0TGVhZlBhcnQoKChNUGxhY2Vob2xkZXIpIGVsZW1lbnQpLmdldFJlZigpKTsKKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KQorCQkJcmV0dXJuIGdldExlYWZQYXJ0KCgoTUVsZW1lbnRDb250YWluZXI8Pz4pIGVsZW1lbnQpLmdldFNlbGVjdGVkRWxlbWVudCgpKTsKKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KQorCQkJcmV0dXJuIChNUGFydCkgZWxlbWVudDsKKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbGQgd2F5IHRvIHN1YnNjcmliZSB0byBVSUV2ZW50cy4gWW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbmV3IHdheSBhcyBzaG93bgorCSAqIGJ5IGhhbmRsZVRyYW5zaWVudERhdGFFdmVudHMoKSBhbmQgZGVzY3JpYmVkIGluIHRoZSBhcnRpY2xlIGF0CisJICogaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRWNsaXBzZTQvUkNQL0V2ZW50X01vZGVsCisJICovCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgb3BlbkhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudCBldmVudCkgeworCQkJaWYgKGlzU2hvd2luZykKKwkJCQlyZXR1cm47CisKKwkJCU1VSUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCQkvLyBPcGVuIGlmIHNoYXJlZCBhcmVhCisJCQlpZiAoZ2V0TGVhZlBhcnQobWluaW1pemVkRWxlbWVudCkgPT0gY2hhbmdlZEVsZW1lbnQKKwkJCQkJJiYgIShtaW5pbWl6ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlU3RhY2spKSB7CisJCQkJc2hvd1N0YWNrKHRydWUpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJTVVJRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBudWxsOworCisJCQlpZiAobWluaW1pemVkRWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoTVBsYWNlaG9sZGVyKSBtaW5pbWl6ZWRFbGVtZW50KS5nZXRSZWYoKTsKKwkJCX0gZWxzZSBpZiAobWluaW1pemVkRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spIHsKKwkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKE1QYXJ0U3RhY2spIG1pbmltaXplZEVsZW1lbnQpLmdldFNlbGVjdGVkRWxlbWVudCgpOworCQkJfQorCisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50ID09IG51bGwpCisJCQkJcmV0dXJuOworCisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKQorCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoTVBsYWNlaG9sZGVyKSBzZWxlY3RlZEVsZW1lbnQpLmdldFJlZigpOworCisJCQlpZiAoY2hhbmdlZEVsZW1lbnQgIT0gc2VsZWN0ZWRFbGVtZW50KQorCQkJCXJldHVybjsKKworCQkJc2hvd1N0YWNrKHRydWUpOworCQl9CisJfTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9sZCB3YXkgdG8gc3Vic2NyaWJlIHRvIFVJRXZlbnRzLiBZb3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBuZXcgd2F5IGFzIHNob3duCisJICogYnkgaGFuZGxlVHJhbnNpZW50RGF0YUV2ZW50cygpIGFuZCBkZXNjcmliZWQgaW4gdGhlIGFydGljbGUgYXQKKwkgKiBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FY2xpcHNlNC9SQ1AvRXZlbnRfTW9kZWwKKwkgKi8KKwlwcml2YXRlIEV2ZW50SGFuZGxlciB0b0JlUmVuZGVyZWRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQgZXZlbnQpIHsKKwkJCWlmIChtaW5pbWl6ZWRFbGVtZW50ID09IG51bGwgfHwgdHJpbVN0YWNrVEIgPT0gbnVsbCkKKwkJCQlyZXR1cm47CisKKwkJCU1VSUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCQkvLyBpZiBvdXIgc3RhY2sgaXMgZ29pbmcgYXdheSwgc28gc2hvdWxkIHdlCisJCQlpZiAoY2hhbmdlZEVsZW1lbnQgPT0gbWluaW1pemVkRWxlbWVudCAmJiAhbWluaW1pemVkRWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJcmVzdG9yZVN0YWNrKCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBpZiBvbmUgb2YgdGhlIGtpZHMgY2hhbmdlcyBzdGF0ZSwgcmUtc2NyYXBlIHRoZSBDVEYKKwkJCU1VSUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGNoYW5nZWRFbGVtZW50LmdldFBhcmVudCgpOworCQkJaWYgKHBhcmVudEVsZW1lbnQgPT0gbWluaW1pemVkRWxlbWVudCkgeworCQkJCXRyaW1TdGFja1RCLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJdXBkYXRlVHJpbVN0YWNrSXRlbXMoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9CisJfTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9sZCB3YXkgdG8gc3Vic2NyaWJlIHRvIFVJRXZlbnRzLiBZb3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBuZXcgd2F5IGFzIHNob3duCisJICogYnkgaGFuZGxlVHJhbnNpZW50RGF0YUV2ZW50cygpIGFuZCBkZXNjcmliZWQgaW4gdGhlIGFydGljbGUgYXQKKwkgKiBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FY2xpcHNlNC9SQ1AvRXZlbnRfTW9kZWwKKwkgKi8KKwlwcml2YXRlIEV2ZW50SGFuZGxlciBjaGlsZHJlbkhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudCBldmVudCkgeworCQkJaWYgKG1pbmltaXplZEVsZW1lbnQgPT0gbnVsbCB8fCB0cmltU3RhY2tUQiA9PSBudWxsKQorCQkJCXJldHVybjsKKworCQkJT2JqZWN0IGNoYW5nZWRPYmogPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisKKwkJCS8vIGlmIGEgY2hpbGQgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZCwgcmUtc2NhcGUgdGhlIENURgorCQkJaWYgKGNoYW5nZWRPYmogPT0gbWluaW1pemVkRWxlbWVudCkgeworCQkJCXRyaW1TdGFja1RCLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJdXBkYXRlVHJpbVN0YWNrSXRlbXMoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9CisJfTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9sZCB3YXkgdG8gc3Vic2NyaWJlIHRvIFVJRXZlbnRzLiBZb3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBuZXcgd2F5IGFzIHNob3duCisJICogYnkgaGFuZGxlVHJhbnNpZW50RGF0YUV2ZW50cygpIGFuZCBkZXNjcmliZWQgaW4gdGhlIGFydGljbGUgYXQKKwkgKiBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FY2xpcHNlNC9SQ1AvRXZlbnRfTW9kZWwKKwkgKi8KKwlwcml2YXRlIEV2ZW50SGFuZGxlciB3aWRnZXRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQgZXZlbnQpIHsKKwkJCU9iamVjdCBjaGFuZ2VkT2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJaWYgKGNoYW5nZWRPYmogIT0gbWluaW1pemVkRWxlbWVudCkKKwkJCQlyZXR1cm47CisKKwkJCWlmIChtaW5pbWl6ZWRFbGVtZW50LmdldFdpZGdldCgpICE9IG51bGwpIHsKKwkJCQl0cmltU3RhY2tUQi5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCXVwZGF0ZVRyaW1TdGFja0l0ZW1zKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCX07CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbGQgd2F5IHRvIHN1YnNjcmliZSB0byBVSUV2ZW50cy4gWW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbmV3IHdheSBhcyBzaG93bgorCSAqIGJ5IGhhbmRsZVRyYW5zaWVudERhdGFFdmVudHMoKSBhbmQgZGVzY3JpYmVkIGluIHRoZSBhcnRpY2xlIGF0CisJICogaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRWNsaXBzZTQvUkNQL0V2ZW50X01vZGVsCisJICovCisJLy8gTGlzdGVuZXIgYXR0YWNoZWQgdG8gZXZlcnkgVG9vbEl0ZW0gaW4gYSBUcmltU3RhY2suIFJlc3BvbnNpYmxlIGZvciBhY3RpdmF0aW5nIHRoZQorCS8vIGFwcHJvcHJpYXRlIHBhcnQuCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciB0b29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkvKioKKwkJICoKKwkJICovCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQlUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZS53aWRnZXQ7CisJCQlNVUlFbGVtZW50IHVpRWxlbWVudCA9IChNVUlFbGVtZW50KSB0b29sSXRlbS5nZXREYXRhKCk7CisKKwkJCS8vIENsaWNraW5nIG9uIHRoZSBhbHJlYWR5IHNob3dpbmcgaXRlbSA/IE5PVEU6IHRoZSBzZWxlY3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgorCQkJLy8gdHVybmVkIG9mZiBieSB0aGUgdGltZSB0aGUgZXZlbnQgYXJyaXZlcworCQkJaWYgKCF0b29sSXRlbS5nZXRTZWxlY3Rpb24oKSkgeworCQkJCXBhcnRTZXJ2aWNlLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJc2hvd1N0YWNrKGZhbHNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCXBhcnRTZXJ2aWNlLmFjdGl2YXRlKChNUGFydCkgdWlFbGVtZW50KTsKKwkJCX0gZWxzZSBpZiAodWlFbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSB7CisJCQkJdWlFbGVtZW50LmdldFBhcmVudCgpLnNldFNlbGVjdGVkRWxlbWVudCh1aUVsZW1lbnQpOworCQkJfQorCQkJc2hvd1N0YWNrKHRydWUpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQl3aWRnZXRTZWxlY3RlZChlKTsKKwkJfQorCX07CisKKwkvLyBwcml2YXRlIE1UcmltQmFyIGJhcjsKKworCXByaXZhdGUgaW50IGZpeGVkU2lkZXM7CisKKwlwcml2YXRlIENvbXBvc2l0ZSBvcmlnaW5hbFBhcmVudDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9sZCB3YXkgdG8gc3Vic2NyaWJlIHRvIFVJRXZlbnRzLiBZb3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBuZXcgd2F5IGFzIHNob3duCisJICogYnkgaGFuZGxlVHJhbnNpZW50RGF0YUV2ZW50cygpIGFuZCBkZXNjcmliZWQgaW4gdGhlIGFydGljbGUgYXQKKwkgKiBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FY2xpcHNlNC9SQ1AvRXZlbnRfTW9kZWwKKwkgKi8KKwlAUG9zdENvbnN0cnVjdAorCXZvaWQgYWRkTGlzdGVuZXJzKCkgeworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuRWxlbWVudENvbnRhaW5lci5UT1BJQ19DSElMRFJFTiwgY2hpbGRyZW5IYW5kbGVyKTsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLlVJRWxlbWVudC5UT1BJQ19UT0JFUkVOREVSRUQsIHRvQmVSZW5kZXJlZEhhbmRsZXIpOworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuVUlFbGVtZW50LlRPUElDX1dJREdFVCwgd2lkZ2V0SGFuZGxlcik7CisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5VSUxpZmVDeWNsZS5CUklOR1RPVE9QLCBvcGVuSGFuZGxlcik7CisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5VSUxpZmVDeWNsZS5BQ1RJVkFURSwgY2xvc2VIYW5kbGVyKTsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLlVJTGlmZUN5Y2xlLkFQUF9TSFVURE9XTl9TVEFSVEVELCBzaHV0ZG93bkhhbmRsZXIpOworCX0KKworCXByaXZhdGUgQ29tcG9zaXRlIGdldENBQ29tcG9zaXRlKCkgeworCQlpZiAodHJpbVN0YWNrVEIgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCS8vIEdldCB0aGUgc2hlbGwncyBjbGllbnQgYXJlYSBjb21wb3NpdGUKKwkJU2hlbGwgdGhlU2hlbGwgPSB0cmltU3RhY2tUQi5nZXRTaGVsbCgpOworCQlpZiAodGhlU2hlbGwuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBUcmltbWVkUGFydExheW91dCkgeworCQkJVHJpbW1lZFBhcnRMYXlvdXQgdHBsID0gKFRyaW1tZWRQYXJ0TGF5b3V0KSB0aGVTaGVsbC5nZXRMYXlvdXQoKTsKKwkJCWlmICghdHBsLmNsaWVudEFyZWEuaXNEaXNwb3NlZCgpKQorCQkJCXJldHVybiB0cGwuY2xpZW50QXJlYTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbGQgd2F5IHRvIHN1YnNjcmliZSB0byBVSUV2ZW50cy4gWW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbmV3IHdheSBhcyBzaG93bgorCSAqIGJ5IGhhbmRsZVRyYW5zaWVudERhdGFFdmVudHMoKSBhbmQgZGVzY3JpYmVkIGluIHRoZSBhcnRpY2xlIGF0CisJICogaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRWNsaXBzZTQvUkNQL0V2ZW50X01vZGVsCisJICovCisJQFByZURlc3Ryb3kKKwl2b2lkIHJlbW92ZUxpc3RlbmVycygpIHsKKwkJZXZlbnRCcm9rZXIudW5zdWJzY3JpYmUodG9CZVJlbmRlcmVkSGFuZGxlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGNoaWxkcmVuSGFuZGxlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHdpZGdldEhhbmRsZXIpOworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShvcGVuSGFuZGxlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGNsb3NlSGFuZGxlcik7CisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwl2b2lkIGNyZWF0ZVdpZGdldChDb21wb3NpdGUgcGFyZW50LCBNVG9vbENvbnRyb2wgbWUsIENTU1JlbmRlcmluZ1V0aWxzIGNzc1V0aWxzKSB7CisJCWlmIChtaW5pbWl6ZWRFbGVtZW50ID09IG51bGwpIHsKKwkJCW1pbmltaXplZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgpOworCQl9CisKKwkJTVVJRWxlbWVudCBtZVBhcmVudCA9IG1lLmdldFBhcmVudCgpOworCQlpbnQgb3JpZW50YXRpb24gPSBTV1QuSE9SSVpPTlRBTDsKKwkJaWYgKG1lUGFyZW50IGluc3RhbmNlb2YgTVRyaW1CYXIpIHsKKwkJCU1UcmltQmFyIGJhciA9IChNVHJpbUJhcikgbWVQYXJlbnQ7CisJCQlpZiAoYmFyLmdldFNpZGUoKSA9PSBTaWRlVmFsdWUuUklHSFQgfHwgYmFyLmdldFNpZGUoKSA9PSBTaWRlVmFsdWUuTEVGVCkKKwkJCQlvcmllbnRhdGlvbiA9IFNXVC5WRVJUSUNBTDsKKwkJfQorCQl0cmltU3RhY2tUQiA9IG5ldyBUb29sQmFyKHBhcmVudCwgb3JpZW50YXRpb24gfCBTV1QuRkxBVCB8IFNXVC5XUkFQKTsKKwkJdHJpbVN0YWNrVEIuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7CisJCQkJc2hvd1N0YWNrKGZhbHNlKTsKKworCQkJCXRyaW1TdGFja1RCID0gbnVsbDsKKwkJCQl0cmltU3RhY2tNZW51ID0gbnVsbDsKKwkJCX0KKwkJfSk7CisKKwkJdHJpbVN0YWNrVEIuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQkvLyBDbGVhciBhbnkgZXhpc3RpbmcgbWVudXMKKwkJCQl3aGlsZSAodHJpbVN0YWNrTWVudS5nZXRJdGVtQ291bnQoKSA+IDApCisJCQkJCXRyaW1TdGFja01lbnUuZ2V0SXRlbSgwKS5kaXNwb3NlKCk7CisKKwkJCQkvLyBPbmx5IG9wZW4gdGhlIG1lbnUgaWYgYSB0b29sIGl0ZW0gaXMgc2VsZWN0ZWQKKwkJCQlQb2ludCBwb2ludCA9IHRyaW1TdGFja1RCLmdldERpc3BsYXkoKS5tYXAobnVsbCwgdHJpbVN0YWNrVEIsCisJCQkJCQluZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOworCQkJCVRvb2xJdGVtIHNlbGVjdGVkVG9vbEl0ZW0gPSB0cmltU3RhY2tUQi5nZXRJdGVtKHBvaW50KTsKKwkJCQlpZiAoc2VsZWN0ZWRUb29sSXRlbSA9PSBudWxsKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQkvLyBBcmUgd2UgaG92ZXJpbmcgb3ZlciBhIHZhbGlkIHRvb2wgaXRlbSAodnMgcmVzdG9yZSBidXR0b24pCisJCQkJT2JqZWN0IGRhdGEgPSBzZWxlY3RlZFRvb2xJdGVtLmdldERhdGEoKTsKKwkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIE1QYXJ0KSB7CisJCQkJCS8vIEEgcGFydCBvbiBhIHN0YWNrIG9yIGVkaXRvciBhcmVhCisJCQkJCWNyZWF0ZVBhcnRNZW51KChNUGFydCkgZGF0YSk7CisJCQkJfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSB7CisJCQkJCS8vIEEgcGVyc3BlY3RpdmUgaW4gYSBwZXJzcGVjdGl2ZSBzdGFjayAoZm9yIG5vdyB3ZSBqdXN0IHN1cHBvcnQgcmVzdG9yZSkKKwkJCQkJY3JlYXRlRW10cHlFZGl0b3JBcmVhTWVudSgpOworCQkJCX0gZWxzZSBpZiAoaXNFZGl0b3JTdGFjaygpKSB7CisJCQkJCS8vIEFuIGVtcHR5IGVkaXRvciBhcmVhCisJCQkJCWNyZWF0ZUVtdHB5RWRpdG9yQXJlYU1lbnUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQljcmVhdGVVc2VPdmVybGF5c01lbnUoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCXRyaW1TdGFja01lbnUgPSBuZXcgTWVudSh0cmltU3RhY2tUQik7CisJCXRyaW1TdGFja1RCLnNldE1lbnUodHJpbVN0YWNrTWVudSk7CisKKwkJVG9vbEl0ZW0gcmVzdG9yZUJ0biA9IG5ldyBUb29sSXRlbSh0cmltU3RhY2tUQiwgU1dULlBVU0gpOworCQlyZXN0b3JlQnRuLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLlRyaW1TdGFja19SZXN0b3JlVGV4dCk7CisJCXJlc3RvcmVCdG4uc2V0SW1hZ2UoZ2V0UmVzdG9yZUltYWdlKCkpOworCQlyZXN0b3JlQnRuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJbWluaW1pemVkRWxlbWVudC5nZXRUYWdzKCkucmVtb3ZlKElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVEKTsKKwkJCX0KKwkJfSk7CisKKwkJdXBkYXRlVHJpbVN0YWNrSXRlbXMoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgcmVzdG9yZSBtZW51IGl0ZW0gdGhhdCByZW1vdmVzIHRoZSBtaW5pbWl6ZWQgdGFnIGZyb20gdGhlIHtAbGluayAjbWluaW1pemVkRWxlbWVudH0KKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlRW10cHlFZGl0b3JBcmVhTWVudSgpIHsKKwkJTWVudUl0ZW0gcmVzdG9yZUl0ZW0gPSBuZXcgTWVudUl0ZW0odHJpbVN0YWNrTWVudSwgU1dULk5PTkUpOworCQlyZXN0b3JlSXRlbS5zZXRUZXh0KE1lc3NhZ2VzLlRyaW1TdGFja19SZXN0b3JlVGV4dCk7CisJCXJlc3RvcmVJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQltaW5pbWl6ZWRFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoSVByZXNlbnRhdGlvbkVuZ2luZS5NSU5JTUlaRUQpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgcmVzdG9yZSBtZW51IGl0ZW0gdGhhdCByZW1vdmVzIHRoZSBtaW5pbWl6ZWQgdGFnIGZyb20gdGhlIHtAbGluayAjbWluaW1pemVkRWxlbWVudH0KKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlVXNlT3ZlcmxheXNNZW51KCkgeworCQlNZW51SXRlbSB1c2VPdmVybGF5c0l0ZW0gPSBuZXcgTWVudUl0ZW0odHJpbVN0YWNrTWVudSwgU1dULkNIRUNLKTsKKwkJdXNlT3ZlcmxheXNJdGVtLnNldFRleHQoTWVzc2FnZXMuVHJpbVN0YWNrX1Nob3dfSW5fT3JpZ2luYWxfTG9jYXRpb24pOworCQl1c2VPdmVybGF5c0l0ZW0uc2V0U2VsZWN0aW9uKCF1c2VPdmVybGF5cygpKTsKKwkJdXNlT3ZlcmxheXNJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlpZiAodG9vbENvbnRyb2wgIT0gbnVsbCkgeworCQkJCQl0b29sQ29udHJvbC5nZXRQZXJzaXN0ZWRTdGF0ZSgpLnB1dChVU0VfT1ZFUkxBWVNfS0VZLAorCQkJCQkJCUJvb2xlYW4udG9TdHJpbmcoIXVzZU92ZXJsYXlzKCkpKTsKKwkJCQl9CisJCQl9CisJCX0pOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBzZXJpZXMgb2YgbWVudSBpdGVtcyB3aGVuIGEgcGFydCBpcyBzZWxlY3RlZC4gVGhlIG9yaWVudGF0aW9uIHN1Ym1lbnUgY2hhbmdlcyB0aGUKKwkgKiBsYXlvdXQgdGFncyBvbiB0aGUge0BsaW5rICNtaW5pbWl6ZWRFbGVtZW50fS4gVGhlIHJlc3RvcmUgaXRlbSB3aWxsIHJlbW92ZSB0aGUgbWluaW1pemVkIHRhZy4KKwkgKiBUaGUgY2xvc2UgaXRlbSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBlZGl0b3Igc3RhY2ssIGJ1dCB3aWxsIGFzayB0aGUgcGFydCBzZXJ2aWNlIHRvIGhpZGUKKwkgKiB0aGUgcGFydC4KKwkgKgorCSAqIEBwYXJhbSBzZWxlY3RlZFBhcnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJ0IGZyb20gdGhlIGRhdGEgb2YgdGhlIHNlbGVjdGVkIHRvb2wgaXRlbQorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVQYXJ0TWVudShmaW5hbCBNUGFydCBzZWxlY3RlZFBhcnQpIHsKKwkJTWVudUl0ZW0gb3JpZW50YXRpb25JdGVtID0gbmV3IE1lbnVJdGVtKHRyaW1TdGFja01lbnUsIFNXVC5DQVNDQURFKTsKKwkJb3JpZW50YXRpb25JdGVtLnNldFRleHQoTWVzc2FnZXMuVHJpbVN0YWNrX09yaWVudGF0aW9uTWVudSk7CisJCU1lbnUgb3JpZW50YXRpb25NZW51ID0gbmV3IE1lbnUob3JpZW50YXRpb25JdGVtKTsKKwkJb3JpZW50YXRpb25JdGVtLnNldE1lbnUob3JpZW50YXRpb25NZW51KTsKKworCQlNZW51SXRlbSBkZWZhdWx0SXRlbSA9IG5ldyBNZW51SXRlbShvcmllbnRhdGlvbk1lbnUsIFNXVC5SQURJTyk7CisJCWRlZmF1bHRJdGVtLnNldFRleHQoTWVzc2FnZXMuVHJpbVN0YWNrX0RlZmF1bHRPcmllbnRhdGlvbkl0ZW0pOworCQlkZWZhdWx0SXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJYm9vbGVhbiBkb1JlZnJlc2ggPSBtaW5pbWl6ZWRFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoCisJCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpOworCQkJCWRvUmVmcmVzaCB8PSBtaW5pbWl6ZWRFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoCisJCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMKTsKKwkJCQlpZiAoaXNTaG93aW5nICYmIGRvUmVmcmVzaCkgeworCQkJCQlzZXRQYW5lTG9jYXRpb24oKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCU1lbnVJdGVtIGhvcml6b250YWxJdGVtID0gbmV3IE1lbnVJdGVtKG9yaWVudGF0aW9uTWVudSwgU1dULlJBRElPKTsKKwkJaG9yaXpvbnRhbEl0ZW0uc2V0VGV4dChNZXNzYWdlcy5UcmltU3RhY2tfSG9yaXpvbnRhbCk7CisJCWhvcml6b250YWxJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlpZiAoIW1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpCisJCQkJCQkuY29udGFpbnMoSVByZXNlbnRhdGlvbkVuZ2luZS5PUklFTlRBVElPTl9IT1JJWk9OVEFMKSkgeworCQkJCQltaW5pbWl6ZWRFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoSVByZXNlbnRhdGlvbkVuZ2luZS5PUklFTlRBVElPTl9WRVJUSUNBTCk7CisJCQkJCW1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpLmFkZChJUHJlc2VudGF0aW9uRW5naW5lLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpOworCQkJCQlpZiAoaXNTaG93aW5nKSB7CisJCQkJCQlzZXRQYW5lTG9jYXRpb24oKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJTWVudUl0ZW0gdmVydGljYWxJdGVtID0gbmV3IE1lbnVJdGVtKG9yaWVudGF0aW9uTWVudSwgU1dULlJBRElPKTsKKwkJdmVydGljYWxJdGVtLnNldFRleHQoTWVzc2FnZXMuVHJpbVN0YWNrX1ZlcnRpY2FsKTsKKwkJdmVydGljYWxJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlpZiAoIW1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKElQcmVzZW50YXRpb25FbmdpbmUuT1JJRU5UQVRJT05fVkVSVElDQUwpKSB7CisJCQkJCW1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpLnJlbW92ZShJUHJlc2VudGF0aW9uRW5naW5lLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpOworCQkJCQltaW5pbWl6ZWRFbGVtZW50LmdldFRhZ3MoKS5hZGQoSVByZXNlbnRhdGlvbkVuZ2luZS5PUklFTlRBVElPTl9WRVJUSUNBTCk7CisJCQkJCWlmIChpc1Nob3dpbmcpIHsKKwkJCQkJCXNldFBhbmVMb2NhdGlvbigpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKworCQkvLyBTZXQgaW5pdGlhbCBvcmllbnRhdGlvbiBzZWxlY3Rpb24KKwkJaWYgKG1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKElQcmVzZW50YXRpb25FbmdpbmUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCkpIHsKKwkJCWhvcml6b250YWxJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJfSBlbHNlIGlmIChtaW5pbWl6ZWRFbGVtZW50LmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMKSkgeworCQkJdmVydGljYWxJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCWRlZmF1bHRJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJfQorCisJCU1lbnVJdGVtIHJlc3RvcmVJdGVtID0gbmV3IE1lbnVJdGVtKHRyaW1TdGFja01lbnUsIFNXVC5OT05FKTsKKwkJcmVzdG9yZUl0ZW0uc2V0VGV4dChNZXNzYWdlcy5UcmltU3RhY2tfUmVzdG9yZVRleHQpOworCQlyZXN0b3JlSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJbWluaW1pemVkRWxlbWVudC5nZXRUYWdzKCkucmVtb3ZlKElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVEKTsKKwkJCQlwYXJ0U2VydmljZS5hY3RpdmF0ZShzZWxlY3RlZFBhcnQpOworCQkJfQorCQl9KTsKKworCQkvLyBEbyBub3QgYWxsb3cgdGhlIHNoYXJlZCBlZGl0b3IgYXJlYSB0byBiZSBjbG9zZWQKKwkJaWYgKCFpc0VkaXRvclN0YWNrKCkpIHsKKwkJCU1lbnVJdGVtIGNsb3NlSXRlbSA9IG5ldyBNZW51SXRlbSh0cmltU3RhY2tNZW51LCBTV1QuTk9ORSk7CisJCQljbG9zZUl0ZW0uc2V0VGV4dChNZXNzYWdlcy5UcmltU3RhY2tfQ2xvc2VUZXh0KTsKKwkJCWNsb3NlSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJCXBhcnRTZXJ2aWNlLmhpZGVQYXJ0KHNlbGVjdGVkUGFydCk7CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwlAUHJlRGVzdHJveQorCXZvaWQgZGVzdHJveSgpIHsKKwkJZm9yIChJbWFnZSBpbWFnZSA6IGltYWdlTWFwLnZhbHVlcygpKSB7CisJCQlpbWFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAobGF5b3V0SW1hZ2UgIT0gbnVsbCkgeworCQkJbGF5b3V0SW1hZ2UuZGlzcG9zZSgpOworCQkJbGF5b3V0SW1hZ2UgPSBudWxsOworCQl9CisKKwkJaWYgKHJlc3RvcmVJbWFnZSAhPSBudWxsKSB7CisJCQlyZXN0b3JlSW1hZ2UuZGlzcG9zZSgpOworCQkJcmVzdG9yZUltYWdlID0gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBNVUlFbGVtZW50IGdldE1pbmltaXplZEVsZW1lbnQoKSB7CisJCXJldHVybiBtaW5pbWl6ZWRFbGVtZW50OworCX0KKworCXByaXZhdGUgTVVJRWxlbWVudCBmaW5kRWxlbWVudCgpIHsKKwkJTVVJRWxlbWVudCByZXN1bHQ7CisJCUxpc3Q8TVBlcnNwZWN0aXZlU3RhY2s+IHBzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW5kb3csIG51bGwsCisJCQkJTVBlcnNwZWN0aXZlU3RhY2suY2xhc3MsIG51bGwpOworCQlpZiAocHMuc2l6ZSgpID09IDApIHsKKwkJCVN0cmluZyB0b29sQ29udHJvbElkID0gdG9vbENvbnRyb2wuZ2V0RWxlbWVudElkKCk7CisJCQlpbnQgaW5kZXggPSB0b29sQ29udHJvbElkLmluZGV4T2YoJygnKTsKKwkJCVN0cmluZyBzdGFja0lkID0gdG9vbENvbnRyb2xJZC5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJcmVzdWx0ID0gbW9kZWxTZXJ2aWNlLmZpbmQoc3RhY2tJZCwgd2luZG93KTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyB0b29sQ29udHJvbElkID0gdG9vbENvbnRyb2wuZ2V0RWxlbWVudElkKCk7CisJCQlpbnQgaW5kZXggPSB0b29sQ29udHJvbElkLmluZGV4T2YoJygnKTsKKwkJCVN0cmluZyBzdGFja0lkID0gdG9vbENvbnRyb2xJZC5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJU3RyaW5nIHBlcnNwSWQgPSB0b29sQ29udHJvbElkLnN1YnN0cmluZyhpbmRleCArIDEsIHRvb2xDb250cm9sSWQubGVuZ3RoKCkgLSAxKTsKKworCQkJTVBlcnNwZWN0aXZlIHBlcnNwID0gbnVsbDsKKwkJCUxpc3Q8TVBlcnNwZWN0aXZlPiBwZXJzcGVjdGl2ZXMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHBzLmdldCgwKSwgcGVyc3BJZCwgTVBlcnNwZWN0aXZlLmNsYXNzLCBudWxsKTsKKwkJCWlmIChwZXJzcGVjdGl2ZXMgIT0gbnVsbCAmJiAhcGVyc3BlY3RpdmVzLmlzRW1wdHkoKSkgeworCQkJCXBlcnNwID0gcGVyc3BlY3RpdmVzLmdldCgwKTsKKwkJCX0KKworCQkJaWYgKHBlcnNwICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSBtb2RlbFNlcnZpY2UuZmluZChzdGFja0lkLCBwZXJzcCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IG1vZGVsU2VydmljZS5maW5kKHN0YWNrSWQsIHdpbmRvdyk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldExhYmVsVGV4dChNVUlMYWJlbCBsYWJlbCkgeworCQkvLyBVc2Ugb3ZlcnJpZGUgdGV4dCBpZiBhdmFpbGFibGUKKwkJaWYgKGxhYmVsIGluc3RhbmNlb2YgTVVJRWxlbWVudCkgeworCQkJU3RyaW5nIHRleHQgPSBnZXRPdmVycmlkZVRpdGxlVG9vbFRpcCgoTVVJRWxlbWVudCkgbGFiZWwpOworCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkKKwkJCQlyZXR1cm4gdGV4dDsKKwkJfQorCisJCVN0cmluZyBzdHJpbmcgPSBsYWJlbC5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQlyZXR1cm4gc3RyaW5nID09IG51bGwgPyAiIiA6IHN0cmluZzsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoTVVJTGFiZWwgZWxlbWVudCkgeworCQkvLyBVc2Ugb3ZlcnJpZGUgaW1hZ2UgaWYgYXZhaWxhYmxlCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVVJRWxlbWVudCkgeworCQkJSW1hZ2UgaW1hZ2UgPSBnZXRPdmVycmlkZUltYWdlKChNVUlFbGVtZW50KSBlbGVtZW50KTsKKwkJCWlmIChpbWFnZSAhPSBudWxsKQorCQkJCXJldHVybiBpbWFnZTsKKwkJfQorCisJCVN0cmluZyBpY29uVVJJID0gZWxlbWVudC5nZXRJY29uVVJJKCk7CisJCWlmIChpY29uVVJJICE9IG51bGwgJiYgaWNvblVSSS5sZW5ndGgoKSA+IDApIHsKKwkJCUltYWdlIGltYWdlID0gaW1hZ2VNYXAuZ2V0KGljb25VUkkpOworCQkJaWYgKGltYWdlID09IG51bGwpIHsKKwkJCQlpbWFnZSA9IHJlc1V0aWxzLmltYWdlRGVzY3JpcHRvckZyb21VUkkoVVJJLmNyZWF0ZVVSSShpY29uVVJJKSkuY3JlYXRlSW1hZ2UoKTsKKwkJCQlpbWFnZU1hcC5wdXQoaWNvblVSSSwgaW1hZ2UpOworCQkJfQorCQkJcmV0dXJuIGltYWdlOworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBNVUlMYWJlbCBnZXRMYWJlbEVsZW1lbnQoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKQorCQkJZWxlbWVudCA9ICgoTVBsYWNlaG9sZGVyKSBlbGVtZW50KS5nZXRSZWYoKTsKKworCQlyZXR1cm4gKE1VSUxhYmVsKSAoZWxlbWVudCBpbnN0YW5jZW9mIE1VSUxhYmVsID8gZWxlbWVudCA6IG51bGwpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVUcmltU3RhY2tJdGVtcygpIHsKKwkJLy8gUHJldmVudCBleGNlcHRpb25zIG9uIHNodXRkb3duCisJCWlmICh0cmltU3RhY2tUQiA9PSBudWxsIHx8IHRyaW1TdGFja1RCLmlzRGlzcG9zZWQoKSB8fCBtaW5pbWl6ZWRFbGVtZW50LmdldFdpZGdldCgpID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJLy8gUmVtb3ZlIGFueSBjdXJyZW50IGl0ZW1zIGV4Y2VwdCB0aGUgJ3Jlc3RvcmUnIGJ1dHRvbgorCQl3aGlsZSAodHJpbVN0YWNrVEIuZ2V0SXRlbUNvdW50KCkgPiAxKSB7CisJCQl0cmltU3RhY2tUQi5nZXRJdGVtKHRyaW1TdGFja1RCLmdldEl0ZW1Db3VudCgpIC0gMSkuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGlzRWRpdG9yU3RhY2soKSAmJiB0cmltU3RhY2tUQi5nZXRJdGVtQ291bnQoKSA9PSAxKSB7CisJCQlUb29sSXRlbSB0aSA9IG5ldyBUb29sSXRlbSh0cmltU3RhY2tUQiwgU1dULkNIRUNLKTsKKwkJCXRpLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLlRyaW1TdGFja19TaGFyZWRBcmVhVG9vbHRpcCk7CisJCQl0aS5zZXRJbWFnZShnZXRMYXlvdXRJbWFnZSgpKTsKKwkJCXRpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIpOworCQl9IGVsc2UgaWYgKG1pbmltaXplZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpIHsKKwkJCU1QbGFjZWhvbGRlciBwaCA9IChNUGxhY2Vob2xkZXIpIG1pbmltaXplZEVsZW1lbnQ7CisJCQlpZiAocGguZ2V0UmVmKCkgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCU1QYXJ0IHBhcnQgPSAoTVBhcnQpIHBoLmdldFJlZigpOworCQkJCVRvb2xJdGVtIHRpID0gbmV3IFRvb2xJdGVtKHRyaW1TdGFja1RCLCBTV1QuQ0hFQ0spOworCQkJCXRpLnNldERhdGEocGFydCk7CisJCQkJdGkuc2V0SW1hZ2UoZ2V0SW1hZ2UocGFydCkpOworCQkJCXRpLnNldFRvb2xUaXBUZXh0KGdldExhYmVsVGV4dChwYXJ0KSk7CisJCQkJdGkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodG9vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcik7CisJCQl9CisJCX0gZWxzZSBpZiAobWluaW1pemVkRWxlbWVudCBpbnN0YW5jZW9mIE1HZW5lcmljU3RhY2s8Pz4pIHsKKwkJCS8vIEhhbmRsZSAqYm90aCogUGFydFN0YWNrcyBhbmQgUGVyc3BlY3RpdmVTdGFja3MgaGVyZS4uLgorCQkJTUdlbmVyaWNTdGFjazw/PiB0aGVTdGFjayA9IChNR2VuZXJpY1N0YWNrPD8+KSBtaW5pbWl6ZWRFbGVtZW50OworCisJCQkvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBzdGFjayBoYXMgYW55IHZhbGlkIGVsZW1lbnRzCisJCQlib29sZWFuIGhhc1JlbmRlcmVkRWxlbWVudHMgPSBmYWxzZTsKKwkJCWZvciAoTVVJRWxlbWVudCBzdGFja0VsZW1lbnQgOiB0aGVTdGFjay5nZXRDaGlsZHJlbigpKSB7CisJCQkJaWYgKHN0YWNrRWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJCWhhc1JlbmRlcmVkRWxlbWVudHMgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChoYXNSZW5kZXJlZEVsZW1lbnRzKSB7CisJCQkJZm9yIChNVUlFbGVtZW50IHN0YWNrRWxlbWVudCA6IHRoZVN0YWNrLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJaWYgKCFzdGFja0VsZW1lbnQuaXNUb0JlUmVuZGVyZWQoKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlNVUlMYWJlbCBsYWJlbEVsZW1lbnQgPSBnZXRMYWJlbEVsZW1lbnQoc3RhY2tFbGVtZW50KTsKKwkJCQkJVG9vbEl0ZW0gbmV3SXRlbSA9IG5ldyBUb29sSXRlbSh0cmltU3RhY2tUQiwgU1dULkNIRUNLKTsKKwkJCQkJbmV3SXRlbS5zZXREYXRhKGxhYmVsRWxlbWVudCk7CisJCQkJCW5ld0l0ZW0uc2V0SW1hZ2UoZ2V0SW1hZ2UobGFiZWxFbGVtZW50KSk7CisJCQkJCW5ld0l0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0TGFiZWxUZXh0KGxhYmVsRWxlbWVudCkpOworCQkJCQluZXdJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodGhlU3RhY2suZ2V0VGFncygpLmNvbnRhaW5zKElQcmVzZW50YXRpb25FbmdpbmUuTk9fQVVUT19DT0xMQVBTRSkpIHsKKwkJCQkvLyBPSyB0byBiZSBlbXB0eSBhbmQgc3RpbGwgbWluaW1pemVkCisJCQkJVG9vbEl0ZW0gdGkgPSBuZXcgVG9vbEl0ZW0odHJpbVN0YWNrVEIsIFNXVC5DSEVDSyk7CisJCQkJdGkuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuVHJpbVN0YWNrX0VtcHR5U3RhY2tUb29sdGlwKTsKKwkJCQl0aS5zZXRJbWFnZShnZXRMYXlvdXRJbWFnZSgpKTsKKwkJCQl0aS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0b29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiB0aGF0J3Mgc2hvd2luZywgcGxhY2UgaXQgYmFjayBpbiB0aGUgcHJlc2VudGF0aW9uCisJCQkJcmVzdG9yZVN0YWNrKCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJdHJpbVN0YWNrVEIucGFjaygpOworCQl0cmltU3RhY2tUQi5nZXRTaGVsbCgpLmxheW91dChuZXcgQ29udHJvbFtdIHsgdHJpbVN0YWNrVEIgfSwgU1dULkRFRkVSKTsKKwl9CisKKwl2b2lkIHJlc3RvcmVTdGFjaygpIHsKKwkJc2hvd1N0YWNrKGZhbHNlKTsKKworCQltaW5pbWl6ZWRFbGVtZW50LnNldFZpc2libGUodHJ1ZSk7CisJCW1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpLnJlbW92ZShJUHJlc2VudGF0aW9uRW5naW5lLk1JTklNSVpFRCk7CisKKwkJLy8gQWN0aXZhdGUgdGhlIHBhcnQgdGhhdCBpcyBiZWluZyBicm91Z2h0IHVwLi4uCisJCWlmIChtaW5pbWl6ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBhcnRTdGFjaykgeworCQkJTVBhcnRTdGFjayB0aGVTdGFjayA9IChNUGFydFN0YWNrKSBtaW5pbWl6ZWRFbGVtZW50OworCQkJTVN0YWNrRWxlbWVudCBjdXJTZWwgPSB0aGVTdGFjay5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBtaW5pbWl6ZWRFbGVtZW50LmdldFdpZGdldCgpOworCisJCQkvLyBIYWNrIGZvciBlbGVtcyB0aGF0IGFyZSBsYXp5IGluaXRpYWxpemVkCisJCQlpZiAoY3RybCBpbnN0YW5jZW9mIENUYWJGb2xkZXIgJiYgKChDVGFiRm9sZGVyKSBjdHJsKS5nZXRTZWxlY3Rpb24oKSA9PSBudWxsKSB7CisJCQkJdGhlU3RhY2suc2V0U2VsZWN0ZWRFbGVtZW50KG51bGwpOworCQkJCXRoZVN0YWNrLnNldFNlbGVjdGVkRWxlbWVudChjdXJTZWwpOworCQkJfQorCQl9CisKKwkJdG9vbENvbnRyb2wuc2V0VG9CZVJlbmRlcmVkKGZhbHNlKTsKKworCQlpZiAoaG9zdFBhbmUgIT0gbnVsbCAmJiAhaG9zdFBhbmUuaXNEaXNwb3NlZCgpKQorCQkJaG9zdFBhbmUuZGlzcG9zZSgpOworCQlob3N0UGFuZSA9IG51bGw7CisJfQorCisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoaXMgc3RhY2sgc2hvdWxkIGJlIHZpc2libGUgb3IgaGlkZGVuCisJICoKKwkgKiBAcGFyYW0gc2hvdworCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgc3RhY2sgc2hvdWxkIGJlIHZpc2libGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaG93U3RhY2soYm9vbGVhbiBzaG93KSB7CisJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBtaW5pbWl6ZWRFbGVtZW50LmdldFdpZGdldCgpOworCQlDVGFiRm9sZGVyIGN0ZiA9IGN0cmwgaW5zdGFuY2VvZiBDVGFiRm9sZGVyID8gKENUYWJGb2xkZXIpIGN0cmwgOiBudWxsOworCisJCUNvbXBvc2l0ZSBjbGllbnRBcmVhQ29tcG9zaXRlID0gZ2V0Q0FDb21wb3NpdGUoKTsKKwkJaWYgKGNsaWVudEFyZWFDb21wb3NpdGUgPT0gbnVsbCB8fCBjbGllbnRBcmVhQ29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybjsKKworCQlpZiAoc2hvdyAmJiAhaXNTaG93aW5nKSB7CisJCQlpZiAodXNlT3ZlcmxheXMoKSkgeworCQkJCWhvc3RQYW5lID0gZ2V0SG9zdFBhbmUoKTsKKwkJCQlvcmlnaW5hbFBhcmVudCA9IGN0cmwuZ2V0UGFyZW50KCk7CisJCQkJY3RybC5zZXRQYXJlbnQoaG9zdFBhbmUpOworCisJCQkJLy8gSGFjayAhIEZvcmNlIGEgcmVzaXplIG9mIHRoZSBDVEYgdG8gbWFrZSBzdXJlIHRoZSBob3N0ZWQKKwkJCQkvLyB2aWV3IGlzIHRoZSBjb3JyZWN0IHNpemUuLi5zZWUgYnVnIDQzNDA2MiBmb3IgZGV0YWlscworCQkJCWlmIChjdGYgIT0gbnVsbCkgeworCQkJCQlSZWN0YW5nbGUgYmIgPSBjdGYuZ2V0Qm91bmRzKCk7CisJCQkJCWJiLndpZHRoLS07CisJCQkJCWN0Zi5zZXRCb3VuZHMoYmIpOworCQkJCX0KKworCQkJCWNsaWVudEFyZWFDb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKGNhUmVzaXplTGlzdGVuZXIpOworCisJCQkJLy8gU2V0IHRoZSBpbml0aWFsIGxvY2F0aW9uCisJCQkJc2V0UGFuZUxvY2F0aW9uKCk7CisKKwkJCQlob3N0UGFuZS5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGVzY2FwZUxpc3RlbmVyKTsKKworCQkJCWhvc3RQYW5lLmxheW91dCh0cnVlKTsKKwkJCQlob3N0UGFuZS5tb3ZlQWJvdmUobnVsbCk7CisJCQkJaG9zdFBhbmUuc2V0VmlzaWJsZSh0cnVlKTsKKworCQkJCS8vIENhY2hlIHRoZSB2YWx1ZSB0byBlbnN1cmUgdGhhdCBhIHN0YWNrIGlzIGhpZGRlbiB1c2luZyB0aGUgc2FtZSBtb2RlIGl0IHdhcworCQkJCS8vIG9wZW5lZCBpbgorCQkJCWNhY2hlZFVzZU92ZXJsYXlzID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJbWluaW1pemVkRWxlbWVudC5zZXRWaXNpYmxlKHRydWUpOworCQkJCWN0cmwuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBlc2NhcGVMaXN0ZW5lcik7CisKKwkJCQkvLyBDYWNoZSB0aGUgdmFsdWUgdG8gZW5zdXJlIHRoYXQgYSBzdGFjayBpcyBoaWRkZW4gdXNpbmcgdGhlIHNhbWUgbW9kZSBpdCB3YXMKKwkJCQkvLyBvcGVuZWQgaW4KKwkJCQljYWNoZWRVc2VPdmVybGF5cyA9IGZhbHNlOworCQkJfQorCisJCQlpc1Nob3dpbmcgPSB0cnVlOworCQkJdG9vbENvbnRyb2wuZ2V0VGFncygpLmFkZChNSU5JTUlaRURfQU5EX1NIT1dJTkcpOworCisJCQkvLyBBY3RpdmF0ZSB0aGUgcGFydCB0aGF0IGlzIGJlaW5nIGJyb3VnaHQgdXAuLi4KKwkJCWlmIChtaW5pbWl6ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBhcnRTdGFjaykgeworCQkJCU1QYXJ0U3RhY2sgdGhlU3RhY2sgPSAoTVBhcnRTdGFjaykgbWluaW1pemVkRWxlbWVudDsKKwkJCQlNU3RhY2tFbGVtZW50IGN1clNlbCA9IHRoZVN0YWNrLmdldFNlbGVjdGVkRWxlbWVudCgpOworCisJCQkJLy8gSGFjayBmb3IgZWxlbXMgdGhhdCBhcmUgbGF6eSBpbml0aWFsaXplZAorCQkJCWlmIChjdGYgIT0gbnVsbCAmJiBjdGYuZ2V0U2VsZWN0aW9uKCkgPT0gbnVsbCkgeworCQkJCQl0aGVTdGFjay5zZXRTZWxlY3RlZEVsZW1lbnQobnVsbCk7CisJCQkJCXRoZVN0YWNrLnNldFNlbGVjdGVkRWxlbWVudChjdXJTZWwpOworCQkJCX0KKworCQkJCWlmIChjdXJTZWwgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQlwYXJ0U2VydmljZS5hY3RpdmF0ZSgoTVBhcnQpIGN1clNlbCk7CisJCQkJfSBlbHNlIGlmIChjdXJTZWwgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpIHsKKwkJCQkJTVBsYWNlaG9sZGVyIHBoID0gKE1QbGFjZWhvbGRlcikgY3VyU2VsOworCQkJCQlpZiAocGguZ2V0UmVmKCkgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQkJcGFydFNlcnZpY2UuYWN0aXZhdGUoKE1QYXJ0KSBwaC5nZXRSZWYoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKGlzRWRpdG9yU3RhY2soKSkgeworCQkJCU1BcmVhIGFyZWEgPSAoTUFyZWEpICgoTVBsYWNlaG9sZGVyKSBtaW5pbWl6ZWRFbGVtZW50KS5nZXRSZWYoKTsKKworCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZmluZCBhbiBlbGVtZW50IHRvIGFjdGl2YXRlLi4uCisJCQkJTVBhcnQgcGFydFRvQWN0aXZhdGUgPSBudWxsOworCQkJCU1VSUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gYXJlYS5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQl3aGlsZSAocGFydFRvQWN0aXZhdGUgPT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCkgeworCQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCQkJCXBhcnRUb0FjdGl2YXRlID0gKE1QYXJ0KSBzZWxlY3RlZEVsZW1lbnQ7CisJCQkJCX0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQkJCQlNUGxhY2Vob2xkZXIgcGggPSAoTVBsYWNlaG9sZGVyKSBzZWxlY3RlZEVsZW1lbnQ7CisJCQkJCQlpZiAocGguZ2V0UmVmKCkgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQkJCXBhcnRUb0FjdGl2YXRlID0gKE1QYXJ0KSBwaC5nZXRSZWYoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJCQkJTUVsZW1lbnRDb250YWluZXI8Pz4gY29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPD8+KSBzZWxlY3RlZEVsZW1lbnQ7CisJCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBjb250YWluZXIuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIG9uZSB0aGVuIHVzZSB0aGUgZmlyc3QKKwkJCQlpZiAocGFydFRvQWN0aXZhdGUgPT0gbnVsbCkgeworCQkJCQlMaXN0PE1QYXJ0PiBwYXJ0cyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoYXJlYSwgbnVsbCwgTVBhcnQuY2xhc3MsIG51bGwpOworCQkJCQlmb3IgKE1QYXJ0IHBhcnQgOiBwYXJ0cykgeworCQkJCQkJaWYgKHBhcnRTZXJ2aWNlLmlzUGFydFZpc2libGUocGFydCkpIHsKKwkJCQkJCQlwYXJ0VG9BY3RpdmF0ZSA9IHBhcnQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocGFydFRvQWN0aXZhdGUgIT0gbnVsbCkgeworCQkJCQlwYXJ0U2VydmljZS5hY3RpdmF0ZShwYXJ0VG9BY3RpdmF0ZSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChtaW5pbWl6ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQkJTVBsYWNlaG9sZGVyIHBoID0gKE1QbGFjZWhvbGRlcikgbWluaW1pemVkRWxlbWVudDsKKwkJCQlpZiAocGguZ2V0UmVmKCkgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBwaC5nZXRSZWYoKTsKKwkJCQkJcGFydFNlcnZpY2UuYWN0aXZhdGUocGFydCk7CisJCQkJfQorCQkJfQorCisJCQlmaXhUb29sSXRlbVNlbGVjdGlvbigpOworCQl9IGVsc2UgaWYgKCFzaG93ICYmIGlzU2hvd2luZykgeworCQkJaWYgKGNhY2hlZFVzZU92ZXJsYXlzKSB7CisJCQkJLy8gQ2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGNsaWVudCBhcmVhIGlzIG5vbi1udWxsIHNpbmNlIHRoZQorCQkJCS8vIHRyaW1zdGFjayBtYXkgYmUgY3VycmVudGx5IGhvc3RlZCBpbiB0aGUgbGltYm8gc2hlbGwKKwkJCQlpZiAoY2xpZW50QXJlYUNvbXBvc2l0ZSAhPSBudWxsKSB7CisJCQkJCWNsaWVudEFyZWFDb21wb3NpdGUucmVtb3ZlQ29udHJvbExpc3RlbmVyKGNhUmVzaXplTGlzdGVuZXIpOworCQkJCX0KKworCQkJCWN0cmwuc2V0UGFyZW50KG9yaWdpbmFsUGFyZW50KTsKKworCQkJCWhvc3RQYW5lLmRpc3Bvc2UoKTsKKwkJCQlob3N0UGFuZSA9IG51bGw7CisJCQl9IGVsc2UgeworCQkJCWlmIChjdHJsICE9IG51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKQorCQkJCQljdHJsLnJlbW92ZUxpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgZXNjYXBlTGlzdGVuZXIpOworCQkJCW1pbmltaXplZEVsZW1lbnQuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisKKwkJCWlzU2hvd2luZyA9IGZhbHNlOworCQkJdG9vbENvbnRyb2wuZ2V0VGFncygpLnJlbW92ZShNSU5JTUlaRURfQU5EX1NIT1dJTkcpOworCisJCQlmaXhUb29sSXRlbVNlbGVjdGlvbigpOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiAndHJ1ZScgaWZmIHRoZSBtaW5pbWl6ZWQgc3RhY2sgc2hvdWxkIG92ZXJsYXkgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uLCAnZmFsc2UnIG1lYW5zCisJICogICAgICAgICB0byB0ZW1wb3JhcmlseSByZXN0b3JlIHRoZSBzdGFjayBpbnRvIHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdXNlT3ZlcmxheXMoKSB7CisJCWlmICh0b29sQ29udHJvbCA9PSBudWxsKQorCQkJcmV0dXJuIHRydWU7CisKKwkJU3RyaW5nIHVzZU92ZXJsYXlzID0gdG9vbENvbnRyb2wuZ2V0UGVyc2lzdGVkU3RhdGUoKS5nZXQoVVNFX09WRVJMQVlTX0tFWSk7CisJCWlmICh1c2VPdmVybGF5cyA9PSBudWxsKQorCQkJdXNlT3ZlcmxheXMgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKHVzZU92ZXJsYXlzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0UGFuZUxvY2F0aW9uKCkgeworCQlDb21wb3NpdGUgY2xpZW50QXJlYUNvbXBvc2l0ZSA9IGdldENBQ29tcG9zaXRlKCk7CisJCWlmIChjbGllbnRBcmVhQ29tcG9zaXRlID09IG51bGwgfHwgY2xpZW50QXJlYUNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCisJCQlyZXR1cm47CisKKwkJUmVjdGFuZ2xlIGNhUmVjdCA9IGNsaWVudEFyZWFDb21wb3NpdGUuZ2V0Qm91bmRzKCk7CisKKwkJLy8gTk9URTogYWx3YXlzIHN0YXJ0cyBpbiB0aGUgcGVyc2lzdGVkIChvciBkZWZhdWx0KSBzaXplCisJCVBvaW50IHBhbmVTaXplID0gaG9zdFBhbmUuZ2V0U2l6ZSgpOworCisJCS8vIEVuc3VyZSBpdCdzIG5vdCBjbGlwcGVkCisJCWlmIChwYW5lU2l6ZS54ID4gY2FSZWN0LndpZHRoKQorCQkJcGFuZVNpemUueCA9IGNhUmVjdC53aWR0aDsKKwkJaWYgKHBhbmVTaXplLnkgPiBjYVJlY3QuaGVpZ2h0KQorCQkJcGFuZVNpemUueSA9IGNhUmVjdC5oZWlnaHQ7CisKKwkJaWYgKG1pbmltaXplZEVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKElQcmVzZW50YXRpb25FbmdpbmUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCkpCisJCQlwYW5lU2l6ZS54ID0gY2FSZWN0LndpZHRoOworCQlpZiAobWluaW1pemVkRWxlbWVudC5nZXRUYWdzKCkuY29udGFpbnMoSVByZXNlbnRhdGlvbkVuZ2luZS5PUklFTlRBVElPTl9WRVJUSUNBTCkpCisJCQlwYW5lU2l6ZS55ID0gY2FSZWN0LmhlaWdodDsKKworCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoMCwgMCk7CisJCWlmIChpc0ZpeGVkKFNXVC5MRUZUKSkKKwkJCWxvYy54ID0gY2FSZWN0Lng7CisJCWVsc2UKKwkJCWxvYy54ID0gKGNhUmVjdC54ICsgY2FSZWN0LndpZHRoKSAtIHBhbmVTaXplLng7CisKKwkJaWYgKGlzRml4ZWQoU1dULlRPUCkpCisJCQlsb2MueSA9IGNhUmVjdC55OworCQllbHNlCisJCQlsb2MueSA9IChjYVJlY3QueSArIGNhUmVjdC5oZWlnaHQpIC0gcGFuZVNpemUueTsKKworCQlob3N0UGFuZS5zZXRTaXplKHBhbmVTaXplKTsKKwkJaG9zdFBhbmUuc2V0TG9jYXRpb24obG9jKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0SG9zdFNpemUoKSB7CisJCWlmIChob3N0UGFuZSA9PSBudWxsIHx8IGhvc3RQYW5lLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybjsKKworCQlpbnQgeFNpemUgPSA2MDA7CisJCVN0cmluZyB4U2l6ZVN0ciA9IHRvb2xDb250cm9sLmdldFBlcnNpc3RlZFN0YXRlKCkuZ2V0KFNUQVRFX1hTSVpFKTsKKwkJaWYgKHhTaXplU3RyICE9IG51bGwpCisJCQl4U2l6ZSA9IEludGVnZXIucGFyc2VJbnQoeFNpemVTdHIpOworCQlpbnQgeVNpemUgPSA0MDA7CisJCVN0cmluZyB5U2l6ZVN0ciA9IHRvb2xDb250cm9sLmdldFBlcnNpc3RlZFN0YXRlKCkuZ2V0KFNUQVRFX1lTSVpFKTsKKwkJaWYgKHlTaXplU3RyICE9IG51bGwpCisJCQl5U2l6ZSA9IEludGVnZXIucGFyc2VJbnQoeVNpemVTdHIpOworCQlob3N0UGFuZS5zZXRTaXplKHhTaXplLCB5U2l6ZSk7CisJfQorCisJcHJpdmF0ZSBDb21wb3NpdGUgZ2V0SG9zdFBhbmUoKSB7CisJCS8vIENyZWF0ZSBvbmUKKwkJaG9zdFBhbmUgPSBuZXcgQ29tcG9zaXRlKHRyaW1TdGFja1RCLmdldFNoZWxsKCksIFNXVC5OT05FKTsKKwkJaG9zdFBhbmUuc2V0RGF0YShTaGVsbEFjdGl2YXRpb25MaXN0ZW5lci5ESUFMT0dfSUdOT1JFX0tFWSwgQm9vbGVhbi5UUlVFKTsKKworCQlob3N0UGFuZS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQlob3N0UGFuZSA9IG51bGw7CisJCQl9CisJCX0pOworCisJCXNldEhvc3RTaXplKCk7CisKKwkJLy8gU2V0IGEgc3BlY2lhbCBsYXlvdXQgdGhhdCBhbGxvd3MgcmVzaXppbmcKKwkJZml4ZWRTaWRlcyA9IGdldEZpeGVkU2lkZXMoKTsKKwkJaG9zdFBhbmUuc2V0TGF5b3V0KG5ldyBUcmltUGFuZUxheW91dCh0b29sQ29udHJvbCwgZml4ZWRTaWRlcykpOworCisJCXJldHVybiBob3N0UGFuZTsKKwl9CisKKwlwcml2YXRlIGludCBnZXRGaXhlZFNpZGVzKCkgeworCQlNVUlFbGVtZW50IHRjUGFyZW50ID0gdG9vbENvbnRyb2wuZ2V0UGFyZW50KCk7CisJCWlmICghKHRjUGFyZW50IGluc3RhbmNlb2YgTVRyaW1CYXIpKQorCQkJcmV0dXJuIDA7CisJCU1UcmltQmFyIGJhciA9IChNVHJpbUJhcikgdGNQYXJlbnQ7CisJCUNvbXBvc2l0ZSB0cmltQ29tcCA9IChDb21wb3NpdGUpIGJhci5nZXRXaWRnZXQoKTsKKwkJUmVjdGFuZ2xlIHRyaW1Cb3VuZHMgPSB0cmltQ29tcC5nZXRCb3VuZHMoKTsKKwkJUG9pbnQgdHJpbUNlbnRlciA9IG5ldyBQb2ludCh0cmltQm91bmRzLndpZHRoIC8gMiwgdHJpbUJvdW5kcy5oZWlnaHQgLyAyKTsgLy8gYWRqdXN0ZWQgdG8KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICgwLDApCisKKwkJQ29udHJvbCB0cmltQ3RybCA9IChDb250cm9sKSB0b29sQ29udHJvbC5nZXRXaWRnZXQoKTsKKwkJUmVjdGFuZ2xlIGN0cmxCb3VuZHMgPSB0cmltQ3RybC5nZXRCb3VuZHMoKTsKKwkJUG9pbnQgY3RybENlbnRlciA9IG5ldyBQb2ludChjdHJsQm91bmRzLnggKyAoY3RybEJvdW5kcy53aWR0aCAvIDIpLCBjdHJsQm91bmRzLnkKKwkJCQkrIChjdHJsQm91bmRzLmhlaWdodCAvIDIpKTsKKworCQlpZiAoYmFyLmdldFNpZGUoKSA9PSBTaWRlVmFsdWUuTEVGVCkgeworCQkJaW50IHZlcnRpY2FsVmFsdWUgPSBjdHJsQ2VudGVyLnkgPCB0cmltQ2VudGVyLnkgPyBTV1QuVE9QIDogU1dULkJPVFRPTTsKKwkJCXJldHVybiBTV1QuTEVGVCB8IHZlcnRpY2FsVmFsdWU7CisJCX0gZWxzZSBpZiAoYmFyLmdldFNpZGUoKSA9PSBTaWRlVmFsdWUuUklHSFQpIHsKKwkJCWludCB2ZXJ0aWNhbFZhbHVlID0gY3RybENlbnRlci55IDwgdHJpbUNlbnRlci55ID8gU1dULlRPUCA6IFNXVC5CT1RUT007CisJCQlyZXR1cm4gU1dULlJJR0hUIHwgdmVydGljYWxWYWx1ZTsKKwkJfSBlbHNlIGlmIChiYXIuZ2V0U2lkZSgpID09IFNpZGVWYWx1ZS5UT1ApIHsKKwkJCWludCBob3Jpem9udGFsVmFsdWUgPSBjdHJsQ2VudGVyLnggPCB0cmltQ2VudGVyLnggPyBTV1QuTEVGVCA6IFNXVC5SSUdIVDsKKwkJCXJldHVybiBTV1QuVE9QIHwgaG9yaXpvbnRhbFZhbHVlOworCQl9IGVsc2UgaWYgKGJhci5nZXRTaWRlKCkgPT0gU2lkZVZhbHVlLkJPVFRPTSkgeworCQkJaW50IGhvcml6b250YWxWYWx1ZSA9IGN0cmxDZW50ZXIueCA8IHRyaW1DZW50ZXIueCA/IFNXVC5MRUZUIDogU1dULlJJR0hUOworCQkJcmV0dXJuIFNXVC5CT1RUT00gfCBob3Jpem9udGFsVmFsdWU7CisJCX0KKworCQlyZXR1cm4gU1dULkJPVFRPTSB8IFNXVC5SSUdIVDsKKwl9CisKKwlwcml2YXRlIEltYWdlIGdldExheW91dEltYWdlKCkgeworCQlpZiAobGF5b3V0SW1hZ2UgPT0gbnVsbCkgeworCQkJbGF5b3V0SW1hZ2UgPSByZXNVdGlscy5pbWFnZURlc2NyaXB0b3JGcm9tVVJJKFVSSS5jcmVhdGVVUkkoTEFZT1VUX0lDT05fVVJJKSkKKwkJCQkJLmNyZWF0ZUltYWdlKCk7CisJCX0KKwkJcmV0dXJuIGxheW91dEltYWdlOworCX0KKworCXByaXZhdGUgSW1hZ2UgZ2V0UmVzdG9yZUltYWdlKCkgeworCQlpZiAocmVzdG9yZUltYWdlID09IG51bGwpIHsKKwkJCXJlc3RvcmVJbWFnZSA9IHJlc1V0aWxzLmltYWdlRGVzY3JpcHRvckZyb21VUkkoVVJJLmNyZWF0ZVVSSShSRVNUT1JFX0lDT05fVVJJKSkKKwkJCQkJLmNyZWF0ZUltYWdlKCk7CisJCX0KKwkJcmV0dXJuIHJlc3RvcmVJbWFnZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNGaXhlZChpbnQgc3d0U2lkZSkgeworCQlyZXR1cm4gKGZpeGVkU2lkZXMgJiBzd3RTaWRlKSAhPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvbWlubWF4L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL21pbm1heC9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGUzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL21pbm1heC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVHJpbVN0YWNrX0VtcHR5U3RhY2tUb29sdGlwID0gRW1wdHkgU3RhY2sKK1RyaW1TdGFja19TaGFyZWRBcmVhVG9vbHRpcCA9IFNoYXJlZCBBcmVhCitUcmltU3RhY2tfQ2xvc2VUZXh0ID0gJkNsb3NlCitUcmltU3RhY2tfRGVmYXVsdE9yaWVudGF0aW9uSXRlbT0mRGVmYXVsdAorVHJpbVN0YWNrX1Jlc3RvcmVUZXh0ID0gJlJlc3RvcmUKK1RyaW1TdGFja19Ib3Jpem9udGFsID0gJkhvcml6b250YWwKK1RyaW1TdGFja19PcmllbnRhdGlvbk1lbnU9Jk9yaWVudGF0aW9uCitUcmltU3RhY2tfVmVydGljYWwgPSAmVmVydGljYWwKK1RyaW1TdGFja19TaG93X0luX09yaWdpbmFsX0xvY2F0aW9uID0gJlNob3cgaW4gdGhlIE9yaWdpbmFsIExvY2F0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zcGxpdHRlcmFkZG9uL1NwbGl0SG9zdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zcGxpdHRlcmFkZG9uL1NwbGl0SG9zdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMThmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL3NwbGl0dGVyYWRkb24vU3BsaXRIb3N0LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnNwbGl0dGVyYWRkb247DQorDQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5Gb2N1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuUGVyc2lzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuUGVyc2lzdFN0YXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5VSUV2ZW50VG9waWM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NQ29tcG9zaXRlUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7DQoraW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7DQorDQorLyoqDQorICogU3VwcG9ydCBjb250YWlubWVudCBvZiBzcGxpdCBpbnRlcm5hbCBwYXJ0cy4NCisgKi8NCitwdWJsaWMgY2xhc3MgU3BsaXRIb3N0IHsNCisJQEluamVjdA0KKwlFTW9kZWxTZXJ2aWNlIG1zOw0KKwlASW5qZWN0DQorCUVQYXJ0U2VydmljZSBwczsNCisJQEluamVjdA0KKwlNQ29tcG9zaXRlUGFydCBteVBhcnQ7DQorDQorCUxpc3Q8TVBhcnQ+IGdldFN1YlBhcnRzKCkgew0KKwkJTGlzdDxNUGFydD4gY2hpbGRQYXJ0cyA9IG1zLmZpbmRFbGVtZW50cyhteVBhcnQsIG51bGwsIE1QYXJ0LmNsYXNzLCBudWxsKTsNCisJCXJldHVybiBjaGlsZFBhcnRzOw0KKwl9DQorDQorCU1QYXJ0IGZpbmRJbm5lckFjdGl2ZShNQ29tcG9zaXRlUGFydCBvdXRlcikgew0KKwkJTVBhcnQgaW5uZXJBY3RpdmUgPSBudWxsOw0KKwkJTVVJRWxlbWVudCBjdXJQYXJlbnQgPSBvdXRlcjsNCisJCXdoaWxlIChpbm5lckFjdGl2ZSA9PSBudWxsICYmIGN1clBhcmVudCAhPSBudWxsKSB7DQorCQkJaWYgKGN1clBhcmVudCBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KSB7DQorCQkJCU1FbGVtZW50Q29udGFpbmVyPD8+IGNvbnRhaW5lciA9IChNRWxlbWVudENvbnRhaW5lcjw/PikgY3VyUGFyZW50Ow0KKwkJCQlpZiAoY29udGFpbmVyLmdldFNlbGVjdGVkRWxlbWVudCgpIGluc3RhbmNlb2YgTVBhcnQpIHsNCisJCQkJCWlubmVyQWN0aXZlID0gKE1QYXJ0KSBjb250YWluZXIuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7DQorCQkJCX0gZWxzZSBpZiAoY29udGFpbmVyLmdldFNlbGVjdGVkRWxlbWVudCgpIGluc3RhbmNlb2YgTUVsZW1lbnRDb250YWluZXI8Pz4pIHsNCisJCQkJCWN1clBhcmVudCA9IGNvbnRhaW5lci5nZXRTZWxlY3RlZEVsZW1lbnQoKTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWN1clBhcmVudCA9IG51bGw7DQorCQkJCX0NCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4gaW5uZXJBY3RpdmU7DQorCX0NCisNCisJQEluamVjdA0KKwlAT3B0aW9uYWwNCisJdm9pZCB0YnJIYW5kbGVyKEBVSUV2ZW50VG9waWMoVUlFdmVudHMuRGlydHlhYmxlLlRPUElDX0RJUlRZKSBFdmVudCBldmVudERhdGEpIHsNCisJCU1VSUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnREYXRhLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsNCisNCisJCWlmICghaXNPbmVPZk15UGFydHMoY2hhbmdlZEVsZW1lbnQpKQ0KKwkJCXJldHVybjsNCisNCisJCWJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOw0KKwkJTGlzdDxNUGFydD4ga2lkcyA9IGdldFN1YlBhcnRzKCk7DQorCQlraWRzLnJlbW92ZSgwKTsNCisJCWZvciAoTVBhcnQgc3ViUGFydCA6IGtpZHMpIHsNCisJCQlpc0RpcnR5IHw9IHN1YlBhcnQuaXNEaXJ0eSgpOw0KKwkJfQ0KKwkJbXlQYXJ0LnNldERpcnR5KGlzRGlydHkpOw0KKwl9DQorDQorCXByaXZhdGUgYm9vbGVhbiBpc09uZU9mTXlQYXJ0cyhNVUlFbGVtZW50IGNoYW5nZWRFbGVtZW50KSB7DQorCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBjaGFuZ2VkRWxlbWVudC5nZXRQYXJlbnQoKTsNCisJCU9iamVjdCBwYXJlbnRPYmogPSBwYXJlbnQ7DQorCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50T2JqICE9IG15UGFydCkgew0KKwkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsNCisJCQlwYXJlbnRPYmogPSBwYXJlbnQ7DQorCQl9DQorDQorCQlyZXR1cm4gcGFyZW50T2JqID09IG15UGFydDsNCisJfQ0KKw0KKwl2b2lkIGNhbGxpbmdBbGxQYXJ0cyhDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gY2x6KSB7DQorCQlMaXN0PE1QYXJ0PiBwYXJ0cyA9IG1zLmZpbmRFbGVtZW50cyhteVBhcnQsIG51bGwsIE1QYXJ0LmNsYXNzLCBudWxsKTsNCisJCWZvciAoTVBhcnQgcGFydCA6IHBhcnRzKSB7DQorCQkJaWYgKHBhcnQgPT0gbXlQYXJ0KQ0KKwkJCQljb250aW51ZTsNCisNCisJCQlDb250cm9sIGN0cmwgPSAoQ29udHJvbCkgcGFydC5nZXRXaWRnZXQoKTsNCisJCQlpZiAocGFydC5nZXRPYmplY3QoKSAhPSBudWxsICYmIGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpDQorCQkJCUNvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShwYXJ0LmdldE9iamVjdCgpLCBjbHosIHBhcnQuZ2V0Q29udGV4dCgpLCBudWxsKTsNCisJCX0NCisJfQ0KKw0KKwlAUGVyc2lzdA0KKwl2b2lkIHBlcnNpc3QoKSB7DQorCQljYWxsaW5nQWxsUGFydHMoUGVyc2lzdC5jbGFzcyk7DQorCX0NCisNCisJQFBlcnNpc3RTdGF0ZQ0KKwl2b2lkIHBlcnNpc3RTdGF0ZSgpIHsNCisJCWNhbGxpbmdBbGxQYXJ0cyhQZXJzaXN0U3RhdGUuY2xhc3MpOw0KKwl9DQorDQorCUBGb2N1cw0KKwl2b2lkIHNldEZvY3VzKCkgew0KKwkJTVBhcnQgYXAgPSBmaW5kSW5uZXJBY3RpdmUobXlQYXJ0KTsNCisJCWlmIChhcCA9PSBudWxsKQ0KKwkJCXJldHVybjsNCisNCisJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBhcC5nZXRXaWRnZXQoKTsNCisJCWlmIChhcC5nZXRPYmplY3QoKSAhPSBudWxsICYmIGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpDQorCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkuaW52b2tlKGFwLmdldE9iamVjdCgpLCBGb2N1cy5jbGFzcywgYXAuZ2V0Q29udGV4dCgpLCBudWxsKTsNCisJfQ0KKw0KKwkvLyBAUG9zdENvbnN0cnVjdA0KKwkvLyB2b2lkIGNyZWF0ZVdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7DQorCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IFNwbGl0IEhvc3QiKTsNCisJLy8gQ29tcG9zaXRlIG5ld0NvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KKwkvLyBuZXdDb21wLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkVFTikpOw0KKwkvLyBuZXdDb21wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsNCisJLy8gfQ0KK30NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL3NwbGl0dGVyYWRkb24vU3BsaXR0ZXJBZGRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zcGxpdHRlcmFkZG9uL1NwbGl0dGVyQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ0MDYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zcGxpdHRlcmFkZG9uL1NwbGl0dGVyQWRkb24uamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnNwbGl0dGVyYWRkb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlFdmVudFRvcGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTUNvbXBvc2l0ZVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5FdmVudFRhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworCisvKioKKyAqIExpc3RlbnMgZm9yIHRoZSBJUHJlc2VudGF0aW9uRW5naW5lJ3MgU1BMSVRfSE9SSVpPTlRBTCBhbmQgU1BMSVRfVkVSVElDQUwgdGFncyBiZWluZyBhcHBsaWVkIHRvCisgKiBhbiBNUGFydCBhbmQgdGFrZXMgdGhlIGFwcHJvcHJpYXRlIHN0ZXBzIHRvIHNwbGl0IC8gdW5zcGxpdCB0aGUgcGFydAorICovCitwdWJsaWMgY2xhc3MgU3BsaXR0ZXJBZGRvbiB7CisJQEluamVjdAorCUVNb2RlbFNlcnZpY2UgbXM7CisKKwlASW5qZWN0CisJRVBhcnRTZXJ2aWNlIHBzOworCisJLyoqCisJICogSGFuZGxlcyBjaGFuZ2VzIGluIHRhZ3MKKwkgKgorCSAqIEBwYXJhbSBldmVudAorCSAqLworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNUYWdzQ2hhbmdlZCgKKwkJCUBVSUV2ZW50VG9waWMoVUlFdmVudHMuQXBwbGljYXRpb25FbGVtZW50LlRPUElDX1RBR1MpIEV2ZW50IGV2ZW50KSB7CisJCU9iamVjdCBjaGFuZ2VkT2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCWlmICghKGNoYW5nZWRPYmogaW5zdGFuY2VvZiBNUGFydCkpCisJCQlyZXR1cm47CisKKwkJTVBhcnQgcGFydCA9IChNUGFydCkgY2hhbmdlZE9iajsKKworCQlpZiAoVUlFdmVudHMuaXNBREQoZXZlbnQpKSB7CisJCQlpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUsCisJCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuU1BMSVRfSE9SSVpPTlRBTCkpIHsKKwkJCQlzcGxpdFBhcnQocGFydCwgdHJ1ZSk7CisJCQl9IGVsc2UgaWYgKFVJRXZlbnRzLmNvbnRhaW5zKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFLAorCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLlNQTElUX1ZFUlRJQ0FMKSkgeworCQkJCXNwbGl0UGFydChwYXJ0LCBmYWxzZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQlNQ29tcG9zaXRlUGFydCBjb21wUGFydCA9IFNwbGl0dGVyQWRkb24uZmluZENvbnRhaW5pbmdDb21wb3NpdGVQYXJ0KHBhcnQpOworCQkJaWYgKFVJRXZlbnRzLmNvbnRhaW5zKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFLAorCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLlNQTElUX0hPUklaT05UQUwpKSB7CisJCQkJdW5zcGxpdFBhcnQoY29tcFBhcnQpOworCQkJfSBlbHNlIGlmIChVSUV2ZW50cy5jb250YWlucyhldmVudCwgVUlFdmVudHMuRXZlbnRUYWdzLk9MRF9WQUxVRSwKKwkJCQkJSVByZXNlbnRhdGlvbkVuZ2luZS5TUExJVF9WRVJUSUNBTCkpIHsKKwkJCQl1bnNwbGl0UGFydChjb21wUGFydCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBGaW5kcyB0aGUgQ29tcG9zaXRlUGFydCBjb250YWluaW5nIHRoZSBnaXZlbiBwYXJ0IChpZiBhbnkpCisJICoKKwkgKiBAcGFyYW0gcGFydAorCSAqIEByZXR1cm4gVGhlIE1Db21wb3NpdGVQYXJ0IG9yICdudWxsJyBpZiBub25lIGlzIGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBNQ29tcG9zaXRlUGFydCBmaW5kQ29udGFpbmluZ0NvbXBvc2l0ZVBhcnQoTVBhcnQgcGFydCkgeworCQlpZiAocGFydCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJTVVJRWxlbWVudCBjdXJQYXJlbnQgPSBwYXJ0LmdldFBhcmVudCgpOworCQl3aGlsZSAoY3VyUGFyZW50ICE9IG51bGwgJiYgIShjdXJQYXJlbnQgaW5zdGFuY2VvZiBNQ29tcG9zaXRlUGFydCkpCisJCQljdXJQYXJlbnQgPSBjdXJQYXJlbnQuZ2V0UGFyZW50KCk7CisKKwkJcmV0dXJuIChNQ29tcG9zaXRlUGFydCkgY3VyUGFyZW50OworCX0KKworCXByaXZhdGUgdm9pZCB1bnNwbGl0UGFydChNQ29tcG9zaXRlUGFydCBjb21wb3NpdGVQYXJ0KSB7CisJCWlmIChjb21wb3NpdGVQYXJ0ID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJTGlzdDxNUGFydD4gaW5uZXJFbGVtZW50cyA9IG1zLmZpbmRFbGVtZW50cyhjb21wb3NpdGVQYXJ0LCBudWxsLCBNUGFydC5jbGFzcywgbnVsbCk7CisJCWlmIChpbm5lckVsZW1lbnRzLnNpemUoKSA8IDMpCisJCQlyZXR1cm47CisKKwkJTVBhcnQgb3JpZ2luYWxFZGl0b3IgPSBpbm5lckVsZW1lbnRzLmdldCgxKTsgLy8gJzAnIGlzIHRoZSBjb21wb3NpdGUgcGFydAorCisJCS8vIENsb3NlIHRoZSBjbG9uZWQgZWRpdG9yICpiZWZvcmUqIHJlbW92aW5nIGl0IGZyb20gdGhlIG1vZGVsCisJCU1QYXJ0IGNsb25lZEVkaXRvciA9IGlubmVyRWxlbWVudHMuZ2V0KDIpOworCQljbG9uZWRFZGl0b3Iuc2V0VG9CZVJlbmRlcmVkKGZhbHNlKTsKKworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb21wUGFyZW50ID0gY29tcG9zaXRlUGFydC5nZXRQYXJlbnQoKTsKKwkJaW50IGluZGV4ID0gY29tcFBhcmVudC5nZXRDaGlsZHJlbigpLmluZGV4T2YoY29tcG9zaXRlUGFydCk7CisJCWNvbXBQYXJlbnQuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoY29tcG9zaXRlUGFydCk7CisJCW9yaWdpbmFsRWRpdG9yLmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkucmVtb3ZlKG9yaWdpbmFsRWRpdG9yKTsKKwkJY29tcFBhcmVudC5nZXRDaGlsZHJlbigpLmFkZChpbmRleCwgb3JpZ2luYWxFZGl0b3IpOworCisJCWlmIChwcy5nZXRBY3RpdmVQYXJ0KCkgPT0gb3JpZ2luYWxFZGl0b3IpCisJCQlwcy5hY3RpdmF0ZShudWxsKTsKKwkJcHMuYWN0aXZhdGUob3JpZ2luYWxFZGl0b3IpOworCX0KKworCXByaXZhdGUgTUNvbXBvc2l0ZVBhcnQgY3JlYXRlQ29tcG9zaXRlUGFydChNUGFydCBvcmlnaW5hbFBhcnQpIHsKKwkJTUNvbXBvc2l0ZVBhcnQgY29tcFBhcnQgPSBtcy5jcmVhdGVNb2RlbEVsZW1lbnQoTUNvbXBvc2l0ZVBhcnQuY2xhc3MpOworCQljb21wUGFydC5zZXRFbGVtZW50SWQoIlNwbGl0IEhvc3QoIiArIG9yaWdpbmFsUGFydC5nZXRMYWJlbCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNvbXBQYXJ0LnNldExhYmVsKG9yaWdpbmFsUGFydC5nZXRMYWJlbCgpKTsKKwkJY29tcFBhcnQuc2V0VG9vbHRpcChvcmlnaW5hbFBhcnQuZ2V0VG9vbHRpcCgpKTsKKwkJY29tcFBhcnQuc2V0SWNvblVSSShvcmlnaW5hbFBhcnQuZ2V0SWNvblVSSSgpKTsKKwkJY29tcFBhcnQuc2V0Q2xvc2VhYmxlKHRydWUpOworCQljb21wUGFydC5zZXRDb250cmlidXRpb25VUkkoImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zcGxpdHRlcmFkZG9uLlNwbGl0SG9zdCIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQWx3YXlzIHJlbW92ZSB0aGUgY29tcG9zaXRlIHBhcnQgZnJvbSB0aGUgbW9kZWwKKwkJY29tcFBhcnQuZ2V0VGFncygpLmFkZChFUGFydFNlcnZpY2UuUkVNT1ZFX09OX0hJREVfVEFHKTsKKworCQlyZXR1cm4gY29tcFBhcnQ7CisJfQorCisJdm9pZCBzcGxpdFBhcnQoTVBhcnQgcGFydFRvU3BsaXQsIGJvb2xlYW4gaG9yaXpvbnRhbCkgeworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBwYXJ0VG9TcGxpdC5nZXRQYXJlbnQoKTsKKwkJaW50IGluZGV4ID0gcGFyZW50LmdldENoaWxkcmVuKCkuaW5kZXhPZihwYXJ0VG9TcGxpdCk7CisKKwkJTVBhcnQgZWRpdG9yQ2xvbmUgPSAoTVBhcnQpIG1zLmNsb25lRWxlbWVudChwYXJ0VG9TcGxpdCwgbnVsbCk7CisKKwkJTUNvbXBvc2l0ZVBhcnQgY29tcFBhcnQgPSBjcmVhdGVDb21wb3NpdGVQYXJ0KHBhcnRUb1NwbGl0KTsKKworCQkvLyBBZGQgdGhlIG5ldyBjb21wb3NpdGUgcGFydCB0byB0aGUgbW9kZWwKKwkJY29tcFBhcnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZWRpdG9yQ2xvbmUpOworCQljb21wUGFydC5zZXRTZWxlY3RlZEVsZW1lbnQoZWRpdG9yQ2xvbmUpOworCQlwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoaW5kZXgsIGNvbXBQYXJ0KTsKKwkJcGFyZW50LnNldFNlbGVjdGVkRWxlbWVudChjb21wUGFydCk7CisKKwkJLy8gTm93LCBhZGQgdGhlIG9yaWdpbmFsIHBhcnQgaW50byB0aGUgY29tcG9zaXRlCisJCWludCBvcmllbnRhdGlvbiA9IGhvcml6b250YWwgPyBFTW9kZWxTZXJ2aWNlLkFCT1ZFIDogRU1vZGVsU2VydmljZS5MRUZUX09GOworCQltcy5pbnNlcnQocGFydFRvU3BsaXQsIGVkaXRvckNsb25lLCBvcmllbnRhdGlvbiwgMC41Zik7CisKKwkJcHMuYWN0aXZhdGUocGFydFRvU3BsaXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvc3d0L0NsZWFudXBQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvc3d0L0NsZWFudXBQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTk5YjUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zd3QvQ2xlYW51cFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQGdtYWlsLmNvbT4gLSBCdWcgNDI5NDIxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFkZG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKKworLyoqCisgKiBNb2RlbCBwcm9jZXNzb3JzIHdoaWNoIGFkZHMgdGhlIGNsZWFudXAgYWRkLW9uIHRvIHRoZSBhcHBsaWNhdGlvbiBtb2RlbAorICovCitwdWJsaWMgY2xhc3MgQ2xlYW51cFByb2Nlc3NvciB7CisJQEV4ZWN1dGUKKwl2b2lkIGFkZENsZWFudXBBZGRvbihNQXBwbGljYXRpb24gYXBwLCBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZSkgeworCQlMaXN0PE1BZGRvbj4gYWRkb25zID0gYXBwLmdldEFkZG9ucygpOworCisJCS8vIHByZXZlbnQgbXVsdGlwbGUgY29waWVzCisJCWZvciAoTUFkZG9uIGFkZG9uIDogYWRkb25zKSB7CisJCQlpZiAoYWRkb24uZ2V0Q29udHJpYnV0aW9uVVJJKCkKKwkJCQkJLmNvbnRhaW5zKCJ1aS53b3JrYmVuY2guYWRkb25zLmNsZWFudXBhZGRvbi5DbGVhbnVwQWRkb24iKSkgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsKKwkJfQorCisJCS8vIGFkZHMgdGhlIGFkZC1vbiB0byB0aGUgYXBwbGljYXRpb24gbW9kZWwKKwkJTUFkZG9uIGNsZWFudXBBZGRvbiA9IG1vZGVsU2VydmljZS5jcmVhdGVNb2RlbEVsZW1lbnQoTUFkZG9uLmNsYXNzKTsKKwkJY2xlYW51cEFkZG9uLnNldEVsZW1lbnRJZCgiQ2xlYW51cEFkZG9uIik7IC8vJE5PTi1OTFMtMSQKKwkJY2xlYW51cEFkZG9uCisJCQkJLnNldENvbnRyaWJ1dGlvblVSSSgiYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLmNsZWFudXBhZGRvbi5DbGVhbnVwQWRkb24iKTsgLy8kTk9OLU5MUy0xJAorCQlhcHAuZ2V0QWRkb25zKCkuYWRkKGNsZWFudXBBZGRvbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zd3QvRG5EUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvYWRkb25zL3N3dC9EbkRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2YyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zd3QvRG5EUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAZ21haWwuY29tPiAtIEJ1ZyA0Mjk0MjEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQWRkb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworCisvKioKKyAqIE1vZGVsIHByb2Nlc3NvcnMgd2hpY2ggYWRkcyB0aGUgRG5EIGFkZC1vbiB0byB0aGUgYXBwbGljYXRpb24gbW9kZWwKKyAqLworcHVibGljIGNsYXNzIERuRFByb2Nlc3NvciB7CisJQEV4ZWN1dGUKKwl2b2lkIGFkZERuREFkZG9uKE1BcHBsaWNhdGlvbiBhcHAsIEVNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlKSB7CisJCUxpc3Q8TUFkZG9uPiBhZGRvbnMgPSBhcHAuZ2V0QWRkb25zKCk7CisKKwkJLy8gcHJldmVudCBtdWx0aXBsZSBjb3BpZXMKKwkJZm9yIChNQWRkb24gYWRkb24gOiBhZGRvbnMpIHsKKwkJCWlmIChhZGRvbi5nZXRDb250cmlidXRpb25VUkkoKS5jb250YWlucygidWkud29ya2JlbmNoLmFkZG9ucy5kbmRhZGRvbi5EbkRBZGRvbiIpKSAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuOworCQl9CisKKwkJLy8gYWRkcyB0aGUgYWRkLW9uIHRvIHRoZSBhcHBsaWNhdGlvbiBtb2RlbAorCQlNQWRkb24gZG5kQWRkb24gPSBtb2RlbFNlcnZpY2UuY3JlYXRlTW9kZWxFbGVtZW50KE1BZGRvbi5jbGFzcyk7CisJCWRuZEFkZG9uLnNldEVsZW1lbnRJZCgiRG5EQWRkb24iKTsgLy8kTk9OLU5MUy0xJAorCQlkbmRBZGRvbi5zZXRDb250cmlidXRpb25VUkkoImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5kbmRhZGRvbi5EbkRBZGRvbiIpOyAvLyROT04tTkxTLTEkCisJCWFwcC5nZXRBZGRvbnMoKS5hZGQoZG5kQWRkb24pOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvc3d0L01pbk1heFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zd3QvTWluTWF4UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5ZDI2NQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvc3d0L01pbk1heFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQGdtYWlsLmNvbT4gLSBCdWcgNDI5NDIxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFkZG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKKworLyoqCisgKiBNb2RlbCBwcm9jZXNzb3JzIHdoaWNoIGFkZHMgdGhlIE1pbk1heCBhZGQtb24gdG8gdGhlIGFwcGxpY2F0aW9uIG1vZGVsCisgKi8KK3B1YmxpYyBjbGFzcyBNaW5NYXhQcm9jZXNzb3IgeworCUBFeGVjdXRlCisJdm9pZCBhZGRNaW5NYXhBZGRvbihNQXBwbGljYXRpb24gYXBwLCBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZSkgeworCQlMaXN0PE1BZGRvbj4gYWRkb25zID0gYXBwLmdldEFkZG9ucygpOworCisJCS8vIHByZXZlbnQgbXVsdGlwbGUgY29waWVzCisJCWZvciAoTUFkZG9uIGFkZG9uIDogYWRkb25zKSB7CisJCQlpZiAoYWRkb24uZ2V0Q29udHJpYnV0aW9uVVJJKCkuY29udGFpbnMoInVpLndvcmtiZW5jaC5hZGRvbnMubWlubWF4Lk1pbk1heEFkZG9uIikpIC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm47CisJCX0KKworCQkvLyBhZGQgdGhlIGFkZC1vbiB0byB0aGUgYXBwbGljYXRpb24gbW9kZWwKKwkJTUFkZG9uIG1pbk1heEFkZG9uID0gbW9kZWxTZXJ2aWNlLmNyZWF0ZU1vZGVsRWxlbWVudChNQWRkb24uY2xhc3MpOworCQltaW5NYXhBZGRvbi5zZXRFbGVtZW50SWQoIk1pbk1heEFkZG9uIik7IC8vJE5PTi1OTFMtMSQKKwkJbWluTWF4QWRkb24KKwkJCQkuc2V0Q29udHJpYnV0aW9uVVJJKCJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0L29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMubWlubWF4Lk1pbk1heEFkZG9uIik7IC8vJE5PTi1OTFMtMSQKKwkJYXBwLmdldEFkZG9ucygpLmFkZChtaW5NYXhBZGRvbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2FkZG9ucy9zd3QvU3BsaXR0ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvc3d0L1NwbGl0dGVyUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmNmEyNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9hZGRvbnMvc3d0L1NwbGl0dGVyUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAZ21haWwuY29tPiAtIEJ1ZyA0Mjk0MjEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQWRkb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworCisvKioKKyAqIE1vZGVsIHByb2Nlc3NvcnMgd2hpY2ggYWRkcyB0aGUgU3BsaXR0ZXIgYWRkLW9uIHRvIHRoZSBhcHBsaWNhdGlvbiBtb2RlbAorICovCisKK3B1YmxpYyBjbGFzcyBTcGxpdHRlclByb2Nlc3NvciB7CisJQEV4ZWN1dGUKKwl2b2lkIGFkZFNwbGl0dGVyQWRkb24oTUFwcGxpY2F0aW9uIGFwcCwgRU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UpIHsKKwkJTGlzdDxNQWRkb24+IGFkZG9ucyA9IGFwcC5nZXRBZGRvbnMoKTsKKworCQkvLyBwcmV2ZW50IG11bHRpcGxlIGNvcGllcworCQlmb3IgKE1BZGRvbiBhZGRvbiA6IGFkZG9ucykgeworCQkJaWYgKGFkZG9uLmdldENvbnRyaWJ1dGlvblVSSSgpLmNvbnRhaW5zKAorCQkJCQkidWkud29ya2JlbmNoLmFkZG9ucy5zcGxpdHRlcmFkZG9uLlNwbGl0dGVyQWRkb24iKSkgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsKKwkJfQorCisJCS8vIGFkZHMgdGhlIGFkZC1vbiB0byB0aGUgYXBwbGljYXRpb24gbW9kZWwKKwkJTUFkZG9uIHNwbGl0dGVyQWRkb24gPSBtb2RlbFNlcnZpY2UuY3JlYXRlTW9kZWxFbGVtZW50KE1BZGRvbi5jbGFzcyk7CisJCXNwbGl0dGVyQWRkb24uc2V0RWxlbWVudElkKCJTcGxpdHRlckFkZG9uIik7IC8vJE5PTi1OTFMtMSQKKwkJc3BsaXR0ZXJBZGRvbgorCQkJCS5zZXRDb250cmlidXRpb25VUkkoImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zcGxpdHRlcmFkZG9uLlNwbGl0dGVyQWRkb24iKTsgLy8kTk9OLU5MUy0xJAorCQlhcHAuZ2V0QWRkb25zKCkuYWRkKHNwbGl0dGVyQWRkb24pOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGVhOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS43Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOWQ0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5wcm9qZWN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0PC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyMmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpAQCAtMCwwICsxLDIgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorbGluZS5zZXBhcmF0b3I9XG4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzN2M2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDQxOCBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24uaW5oZXJpdE51bGxBbm5vdGF0aW9ucz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5taXNzaW5nTm9uTnVsbEJ5RGVmYXVsdEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm5vbm51bGw9b3JnLmVjbGlwc2UuamR0LmFubm90YXRpb24uTm9uTnVsbAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5ub25udWxsYnlkZWZhdWx0PW9yZy5lY2xpcHNlLmpkdC5hbm5vdGF0aW9uLk5vbk51bGxCeURlZmF1bHQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubnVsbGFibGU9b3JnLmVjbGlwc2UuamR0LmFubm90YXRpb24uTnVsbGFibGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubnVsbGFuYWx5c2lzPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4ubWV0aG9kUGFyYW1ldGVycz1kbyBub3QgZ2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5leHBsaWNpdGx5Q2xvc2VkQXV0b0Nsb3NlYWJsZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNsdWRlTnVsbEluZm9Gcm9tQXNzZXJ0cz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcm90ZWN0ZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZWZhdWx0Q2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRW51bUNhc2VEZXNwaXRlRGVmYXVsdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbm51bGxQYXJhbWV0ZXJBbm5vdGF0aW9uRHJvcHBlZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxBbm5vdGF0aW9uSW5mZXJlbmNlQ29uZmxpY3Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsU3BlY1Zpb2xhdGlvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsVW5jaGVja2VkQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbGx5VW5jbG9zZWRDbG9zZWFibGU9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlcG9ydE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlcG9ydE1ldGhvZENhbkJlU3RhdGljPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NPcHRpb25hbEVycm9ycz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGFjdGljTnVsbEFuYWx5c2lzRm9yRmllbGRzPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuYXZvaWRhYmxlR2VuZXJpY1R5cGVQcm9ibGVtcz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jbG9zZWRDbG9zZWFibGU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRFeGNlcHRpb25QYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZE9iamVjdEFsbG9jYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRUeXBlUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5PTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2xhbWJkYV9ib2R5PWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiN2EyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDEyNCBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cF9wcm9maWxlPW9yZy5lY2xpcHNlLmpkdC51aS5kZWZhdWx0LmVjbGlwc2VfY2xlYW5fdXBfcHJvZmlsZQorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKK2Zvcm1hdHRlcl9wcm9maWxlPW9yZy5lY2xpcHNlLmpkdC51aS5kZWZhdWx0LmVjbGlwc2VfcHJvZmlsZQorZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKK29yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCitvcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKK29yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTk5CitvcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQorb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxyXG4gKiBAcmV0dXJuIHRoZSAke2JhcmVfZmllbGRfbmFtZX1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcclxuICogQHBhcmFtICR7cGFyYW19IHRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXHJcbiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxyXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxyXG4gKiBodHRwXDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcclxuICpcclxuICogQ29udHJpYnV0b3JzXDpcclxuICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcclxuICpcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXHJcbiAqIFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXHJcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZGVsZWdhdGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBkZWxlZ2F0ZSBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmRlbGVnYXRlY29tbWVudCIgbmFtZVw9ImRlbGVnYXRlY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICogJHtzZWVfdG9fdGFyZ2V0fVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XHJcbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cclxuXHJcbiR7dHlwZWNvbW1lbnR9XHJcbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xyXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxyXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxyXG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KK3NwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitzcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitzcF9jbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK3NwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK3NwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT10cnVlCitzcF9jbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitzcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK3NwX2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitzcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK3NwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPXRydWUKK3NwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK3NwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfcmVkdW5kYW50X3R5cGVfYXJndW1lbnRzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitzcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9hbm9ueW1vdXNfY2xhc3NfY3JlYXRpb249ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQorc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2xhbWJkYT1mYWxzZQorc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitzcF9jbGVhbnVwLnVzZV90eXBlX2FyZ3VtZW50cz1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5ZWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMucHJlZnMKQEAgLTAsMCArMSw5NyBAQAorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfQURERURfTUVUSE9EX1dJVEhPVVRfREVGQVVMVF9WQUxVRT1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFX0NPTlZFUlNJT049RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfTUVNQkVSPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0FQSV9UWVBFPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1JFRVhQT1JURURfQVBJX1RZUEU9RXJyb3IKK0FQSV9DT01QT05FTlRfRUxFTUVOVF9UWVBFX1JFTU9WRURfUkVFWFBPUlRFRF9UWVBFPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEU9RXJyb3IKK0FQSV9VU0VfU0NBTl9GSUVMRF9TRVZFUklUWT1FcnJvcgorQVBJX1VTRV9TQ0FOX01FVEhPRF9TRVZFUklUWT1FcnJvcgorQVBJX1VTRV9TQ0FOX1RZUEVfU0VWRVJJVFk9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9BRERFRF9NRVRIT0Q9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfQ09OVFJBQ1RFRF9TVVBFUklOVEVSRkFDRVNfU0VUPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9BQlNUUkFDVF9UT19BQlNUUkFDVD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX0ZJTkFMX1RPX0ZJTkFMPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFX0NPTlZFUlNJT049RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0NPTlNUUlVDVE9SPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9GSUVMRD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9TVVBFUkNMQVNTPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQVJBUkdTX1RPX0FSUkFZPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9DT05UUkFDVEVEX1NVUEVSSU5URVJGQUNFU19TRVQ9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0VOVU1fQ09OU1RBTlQ9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfTUVNQkVSPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQURERURfVkFMVUU9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfRklOQUxfVE9fTk9OX0ZJTkFMX1NUQVRJQ19DT05TVEFOVD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX0ZJTkFMX1RPX0ZJTkFMPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fU1RBVElDX1RPX1NUQVRJQz1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfU1RBVElDX1RPX05PTl9TVEFUSUM9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEU9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1ZBTFVFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX0FSR1VNRU5UPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9WQUxVRT1FcnJvcgorSUxMRUdBTF9FWFRFTkQ9V2FybmluZworSUxMRUdBTF9JTVBMRU1FTlQ9V2FybmluZworSUxMRUdBTF9JTlNUQU5USUFURT1XYXJuaW5nCitJTExFR0FMX09WRVJSSURFPVdhcm5pbmcKK0lMTEVHQUxfUkVGRVJFTkNFPVdhcm5pbmcKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfRklFTEQ9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfTUVUSE9EPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX1JFU1RSSUNUSU9OUz1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9TVVBFUl9JTlRFUkZBQ0VfV0lUSF9NRVRIT0RTPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0NIQU5HRURfQ09OVFJBQ1RFRF9TVVBFUklOVEVSRkFDRVNfU0VUPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9NRVRIT0Q9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitJTlZBTElEX0pBVkFET0NfVEFHPVdhcm5pbmcKK0lOVkFMSURfUkVGRVJFTkNFX0lOX1NZU1RFTV9MSUJSQVJJRVM9RXJyb3IKK0xFQUtfRVhURU5EPVdhcm5pbmcKK0xFQUtfRklFTERfREVDTD1XYXJuaW5nCitMRUFLX0lNUExFTUVOVD1XYXJuaW5nCitMRUFLX01FVEhPRF9QQVJBTT1XYXJuaW5nCitMRUFLX01FVEhPRF9SRVRVUk5fVFlQRT1XYXJuaW5nCitNRVRIT0RfRUxFTUVOVF9UWVBFX0FEREVEX1JFU1RSSUNUSU9OUz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9BQlNUUkFDVF9UT19BQlNUUkFDVD1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9TVEFUSUNfVE9fU1RBVElDPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfU1RBVElDX1RPX05PTl9TVEFUSUM9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQVJBUkdTX1RPX0FSUkFZPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX1JFTU9WRURfQU5OT1RBVElPTl9ERUZBVUxUX1ZBTFVFPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK01JU1NJTkdfRUVfREVTQ1JJUFRJT05TPVdhcm5pbmcKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9BRERFRF9DTEFTU19CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX0FEREVEX0lOVEVSRkFDRV9CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX0NIQU5HRURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0lOVEVSRkFDRV9CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX1JFTU9WRURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0lOVEVSRkFDRV9CT1VORD1FcnJvcgorVU5VU0VEX1BST0JMRU1fRklMVEVSUz1XYXJuaW5nCithdXRvbWF0aWNhbGx5X3JlbW92ZWRfdW51c2VkX3Byb2JsZW1fZmlsdGVycz1mYWxzZQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb249RXJyb3IKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb25faW5jbHVkZV9tYWpvcl93aXRob3V0X2JyZWFraW5nX2NoYW5nZT1EaXNhYmxlZAoraW5jb21wYXRpYmxlX2FwaV9jb21wb25lbnRfdmVyc2lvbl9pbmNsdWRlX21pbm9yX3dpdGhvdXRfYXBpX2NoYW5nZT1EaXNhYmxlZAoraW52YWxpZF9zaW5jZV90YWdfdmVyc2lvbj1FcnJvcgorbWFsZm9ybWVkX3NpbmNlX3RhZz1FcnJvcgorbWlzc2luZ19zaW5jZV90YWc9RXJyb3IKK3JlcG9ydF9hcGlfYnJlYWthZ2Vfd2hlbl9tYWpvcl92ZXJzaW9uX2luY3JlbWVudGVkPURpc2FibGVkCityZXBvcnRfcmVzb2x1dGlvbl9lcnJvcnNfYXBpX2NvbXBvbmVudD1XYXJuaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlNTA0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDMyIEBACitjb21waWxlcnMuZi51bnJlc29sdmVkLWZlYXR1cmVzPTEKK2NvbXBpbGVycy5mLnVucmVzb2x2ZWQtcGx1Z2lucz0xCitjb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTEKK2NvbXBpbGVycy5wLmJ1aWxkPTEKK2NvbXBpbGVycy5wLmJ1aWxkLmJpbi5pbmNsdWRlcz0xCitjb21waWxlcnMucC5idWlsZC5lbmNvZGluZ3M9MgorY29tcGlsZXJzLnAuYnVpbGQuamF2YS5jb21waWxlcj0yCitjb21waWxlcnMucC5idWlsZC5qYXZhLmNvbXBsaWFuY2U9MQorY29tcGlsZXJzLnAuYnVpbGQubWlzc2luZy5vdXRwdXQ9MQorY29tcGlsZXJzLnAuYnVpbGQub3V0cHV0LmxpYnJhcnk9MQorY29tcGlsZXJzLnAuYnVpbGQuc291cmNlLmxpYnJhcnk9MQorY29tcGlsZXJzLnAuYnVpbGQuc3JjLmluY2x1ZGVzPTEKK2NvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQorY29tcGlsZXJzLnAuZGlzY291cmFnZWQtY2xhc3M9MQorY29tcGlsZXJzLnAuaW50ZXJuYWw9MQorY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0xCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tZXhwb3J0LXBhY2thZ2U9MgorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWltcG9ydC1wYWNrYWdlPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1yZXF1aXJlLWJ1bmRsZT0xCitjb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAorY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQorY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MQorY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCitjb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQorY29tcGlsZXJzLnAudW5rbm93bi1pZGVudGlmaWVyPTEKK2NvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQorY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAorY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAorY29tcGlsZXJzLnMuY3JlYXRlLWRvY3M9ZmFsc2UKK2NvbXBpbGVycy5zLmRvYy1mb2xkZXI9ZG9jCitjb21waWxlcnMucy5vcGVuLXRhZ3M9MQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYmRlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMzYgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMC4xMy4wLnF1YWxpZmllcgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42CitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcztidW5kbGUtdmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHM7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpO2J1bmRsZS12ZXJzaW9uPSIxLjEuMCIsCisgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0O2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IlszLjYuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMjAwLDQuMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iWzMuNi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQudWkuZGk7YnVuZGxlLXZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IjIuNy4wIiwKKyBvcmcuZWNsaXBzZS5yYXAucnd0LAorIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMsCisgb3JnLmVjbGlwc2UucmFwLmpmYWNlLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucztidW5kbGUtdmVyc2lvbj0iMC4xMi4wIiwKKyBvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjUuMjAwIgorUmVxdWlyZS1DYXBhYmlsaXR5OiBvcmcuZWNsaXBzZS5yYXAKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giLAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0LG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitJbXBvcnQtUGFja2FnZTogamF2YXguYW5ub3RhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCisgamF2YXguaW5qZWN0O3ZlcnNpb249IjEuMC4wIiwKKyBvcmcudzNjLmRvbS5jc3M7dmVyc2lvbj0iMi4wLjAiCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC5TV1RSZW5kZXJlcnNBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvTUVUQS1JTkYvcDIuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9NRVRBLUlORi9wMi5pbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvTUVUQS1JTkYvcDIuaW5mCkBAIC0wLDAgKzEsMTMgQEAKKyMgRW5zdXJlIHRoYXQgbW9kaWZpZWQgUkFQIGU0IHBsYXRmb3JtIGJ1bmRsZXMgYXJlIG9ubHkgaW5zdGFsbGVkIGluIFJBUCBlbnZpcm9ubWVudAorIyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMTc3CisjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTA5MjIKKworIyBNYWtlIHN1cmUgdGhhdCBhIFJBUCBSV1QgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCityZXF1aXJlcy4wLm5hbWVzcGFjZSA9IG9yZy5lY2xpcHNlLnJhcAorcmVxdWlyZXMuMC5uYW1lID0gb3JnLmVjbGlwc2UucmFwLnJ3dAorCisjIERvIG5vdCBhbGxvdyB0byBpbnN0YWxsIHRoaXMgSVUgaW4gY2FzZSB0aGUgU1dUIGJ1bmRsZSBpcyBhdmFpbGFibGUKK3JlcXVpcmVzLjEubmFtZXNwYWNlID0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdQorcmVxdWlyZXMuMS5uYW1lID0gb3JnLmVjbGlwc2Uuc3d0CityZXF1aXJlcy4xLm1pbiA9IDAKK3JlcXVpcmVzLjEubWF4ID0gMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPk5vdmVtYmVyIDIwLCAyMDA4PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICAgc3JjLXJhcC8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBpY29ucy8KK3NyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKK2pyZS5jb21waWxhdGlvbi5wcm9maWxlID0gSmF2YVNFLTEuNwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9mb3JjZVF1YWxpZmllclVwZGF0ZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFkZGMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9mb3JjZVF1YWxpZmllclVwZGF0ZS50eHQKQEAgLTAsMCArMSw0IEBACisjIFRvIGZvcmNlIGEgdmVyc2lvbiBxdWFsaWZpZXIgdXBkYXRlIGFkZCB0aGUgYnVnIGhlcmUKK0J1ZyA0MDMzNTIgLSBVcGRhdGUgYWxsIHBhcmVudCB2ZXJzaW9ucyB0byBtYXRjaCBvdXIgYnVpbGQgc3RyZWFtCitCdWcgNDA3OTYxIC0gQ29tcGFyYXRvciBsb2cgc2hvd3Mgc3BlY2lhbCBwcm9ibGVtIHRoYXQgd2lsbCByZXF1aXJlICJ0b3VjaGVzIgorCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2ljb25zL2Z1bGwvb3ZyMTYvcGlubmVkX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2ljb25zL2Z1bGwvb3ZyMTYvcGlubmVkX292ci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYjIwMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvaWNvbnMvZnVsbC9vdnIxNi9waW5uZWRfb3ZyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2ljb25zL3ZpZXdNZW51LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvaWNvbnMvdmlld01lbnUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOWIyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L2ljb25zL3ZpZXdNZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJjNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGx1Z2luTmFtZSA9IEVjbGlwc2UgZTQgV29ya2JlbmNoIFNXVCBSZW5kZXJlcgorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvcG9tLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDgzNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9wb20ueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5yYXAuZTQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0PC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4wLjEzLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5yYXAuZTQudGFyZ2V0LXJlbGVuZzwvYXJ0aWZhY3RJZD4KKyAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3JlbGVuZy9yZWxlbmctdGFyZ2V0L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8IS0tIHRvIGVuc3VyZSB0aGF0IHRoZSBmZWF0dXJlIGxvb2t1cCBvZiB0aGUgdWkgdGVzdCB3b3JrcyAtLT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi88L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudHljaG88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR5Y2hvLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0Fic3RyYWN0VGFibGVJbmZvcm1hdGlvbkNvbnRyb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0Fic3RyYWN0VGFibGVJbmZvcm1hdGlvbkNvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNjNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQWJzdHJhY3RUYWJsZUluZm9ybWF0aW9uQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsNTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHkuU2VhcmNoUGF0dGVybjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHkuV29ya2JlbmNoU1dUTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhYmxlSW5mb3JtYXRpb25Db250cm9sIHsKKworCS8qKgorCSAqIFRoZSBOYW1lUGF0dGVybkZpbHRlciBzZWxlY3RzIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaCB0aGUgZ2l2ZW4gc3RyaW5nCisJICogcGF0dGVybnMuCisJICovCisJcHJvdGVjdGVkIGNsYXNzIE5hbWVQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKworCQkvKioKKwkJICoKKwkJICovCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsCisJCQkJT2JqZWN0IGVsZW1lbnQpIHsKKwkJCVNlYXJjaFBhdHRlcm4gbWF0Y2hlciA9IGdldE1hdGNoZXIoKTsKKwkJCWlmIChtYXRjaGVyID09IG51bGwgfHwgISh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7CisKKwkJCVN0cmluZyBtYXRjaE5hbWUgPSAoKElMYWJlbFByb3ZpZGVyKSB0YWJsZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCkpCisJCQkJCS5nZXRUZXh0KGVsZW1lbnQpOworCisJCQlpZiAobWF0Y2hOYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkvLyBBIGRpcnR5IGVkaXRvcidzIGxhYmVsIHdpbGwgc3RhcnQgd2l0aCBkaXJ0eSBwcmVmaXgsIHRoaXMgcHJlZml4CisJCQkvLyBzaG91bGQgbm90IGJlIHRha2VuIGluIGNvbnNpZGVyYXRpb24gd2hlbiBtYXRjaGluZyB3aXRoIGEgcGF0dGVybgorCQkJaWYgKG1hdGNoTmFtZS5zdGFydHNXaXRoKCIqIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW1hdGNoTmFtZSA9IG1hdGNoTmFtZS5zdWJzdHJpbmcoMSk7CisJCQl9CisJCQlyZXR1cm4gbWF0Y2hlci5tYXRjaGVzKG1hdGNoTmFtZSk7CisJCX0KKwl9CisKKwkvKiogVGhlIGNvbnRyb2wncyBzaGVsbCAqLworCXByaXZhdGUgU2hlbGwgZlNoZWxsOworCisJLyoqIFRoZSBjb21wb3NpdGUgKi8KKwlwcml2YXRlIENvbXBvc2l0ZSBmQ29tcG9zaXRlOworCisJLyoqIFRoZSBjb250cm9sJ3MgdGV4dCB3aWRnZXQgKi8KKwlwcml2YXRlIFRleHQgZkZpbHRlclRleHQ7CisKKwkvKiogVGhlIGNvbnRyb2wncyB0YWJsZSB3aWRnZXQgKi8KKwlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKKworCS8qKiBUaGUgY3VycmVudCBzZWFyY2ggcGF0dGVybiAqLworCXByaXZhdGUgU2VhcmNoUGF0dGVybiBmU2VhcmNoUGF0dGVybjsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIFRoZSBnaXZlbgorCSAqIHN0eWxlcyBhcmUgYXBwbGllZCB0byB0aGUgc2hlbGwgYW5kIHRoZSB0YWJsZSB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCisJICogQHBhcmFtIHNoZWxsU3R5bGUKKwkgKiAgICAgICAgICAgIHRoZSBhZGRpdGlvbmFsIHN0eWxlcyBmb3IgdGhlIHNoZWxsCisJICogQHBhcmFtIGNvbnRyb2xTdHlsZQorCSAqICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgc3R5bGVzIGZvciB0aGUgY29udHJvbAorCSAqLworCXB1YmxpYyBBYnN0cmFjdFRhYmxlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCwgaW50IHNoZWxsU3R5bGUsCisJCQlpbnQgY29udHJvbFN0eWxlKSB7CisJCWZTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIHNoZWxsU3R5bGUpOworCQlmU2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOworCisJCS8vIENvbXBvc2l0ZSBmb3IgZmlsdGVyIHRleHQgYW5kIHZpZXdlcgorCQlmQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmU2hlbGwsIFNXVC5SRVNJWkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKKwkJZkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY3JlYXRlRmlsdGVyVGV4dChmQ29tcG9zaXRlKTsKKworCQlmVGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcihmQ29tcG9zaXRlLCBjb250cm9sU3R5bGUpOworCisJCWZpbmFsIFRhYmxlIHRhYmxlID0gZlRhYmxlVmlld2VyLmdldFRhYmxlKCk7CisJCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLmtleUNvZGUpIHsKKwkJCQljYXNlIFNXVC5FU0M6CisJCQkJCWRpc3Bvc2UoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTV1QuREVMOgorCQkJCQlyZW1vdmVTZWxlY3RlZEl0ZW1zKCk7CisJCQkJCWUuY2hhcmFjdGVyID0gU1dULk5PTkU7CisJCQkJCWUuZG9pdCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNXVC5BUlJPV19VUDoKKwkJCQkJaWYgKHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgeworCQkJCQkJLy8gb24gdGhlIGZpcnN0IGl0ZW0sIGdvaW5nIHVwIHNob3VsZCBncmFudCBmb2N1cyB0bworCQkJCQkJLy8gdGV4dCBmaWVsZAorCQkJCQkJZkZpbHRlclRleHQuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgorCQkJCQlpZiAodGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSB0YWJsZS5nZXRJdGVtQ291bnQoKSAtIDEpIHsKKwkJCQkJCS8vIG9uIHRoZSBsYXN0IGl0ZW0sIGdvaW5nIGRvd24gc2hvdWxkIGdyYW50IGZvY3VzIHRvCisJCQkJCQkvLyB0aGUgdGV4dCBmaWVsZAorCQkJCQkJZkZpbHRlclRleHQuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKwkJfSk7CisKKwkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJLy8gZG8gbm90aGluZzsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWdvdG9TZWxlY3RlZEVsZW1lbnQoKTsKKwkJCX0KKwkJfSk7CisKKwkJLyoKKwkJICogQnVnIGluIEdUSywgc2VlIFNXVCBidWc6IDYyNDA1IEVkaXRvciBkcm9wIGRvd24gcGVyZm9ybWFuY2Ugc2xvdyBvbgorCQkgKiBMaW51eC1HVEsgb24gbW91c2UgbW92ZS4gUmF0aGVyIHRoZW4gcmVtb3ZpbmcgdGhlIHN1cHBvcnQgYWx0b2dldGhlcgorCQkgKiB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gd29ya2VkIGFyb3VuZCBmb3IgR1RLIG9ubHkgYXMgd2UgZXhwZWN0IHRoYXQKKwkJICogbmV3ZXIgdmVyc2lvbnMgb2YgR1RLIHdpbGwgbm8gbG9uZ2VyIGV4aGliaXQgdGhpcyBxdWFsaXR5IGFuZCB3ZSB3aWxsCisJCSAqIGJlIGFibGUgdG8gaGF2ZSB0aGUgZGVzaXJlZCBzdXBwb3J0IHJ1bm5pbmcgb24gYWxsIHBsYXRmb3Jtcy4gU2VlCisJCSAqIGNvbW1lbnQgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNDA1I2MyMiBUT0RPOgorCQkgKiByZW1vdmUgdGhpcyBjb2RlIG9uY2UgYnVnIDYyNDA1IGlzIGZpeGVkIGZvciB0aGUgbWFpbnN0cmVhbSBHVEsKKwkJICogdmVyc2lvbgorCQkgKi8KKwkJLy8gZmluYWwgaW50IGlnbm9yZUV2ZW50Q291bnQgPSBVdGlsLmlzR3RrKCkgPyA0IDogMTsKKwkJLy8gRklYTUUgUkFQIGRvZXMgbm90IHN1cHBvcnQgbW91c2UgbW92ZQorLy8KKy8vCQl0YWJsZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7CisvLwkJCS8qKgorLy8JCQkgKgorLy8JCQkgKi8KKy8vCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisvLwkJCVRhYmxlSXRlbSBmTGFzdEl0ZW0gPSBudWxsOworLy8JCQlpbnQgbGFzdFkgPSAwOworLy8JCQlpbnQgaXRlbUhlaWdodGRpdjQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgLyA0OworLy8JCQlpbnQgdGFibGVIZWlnaHQgPSB0YWJsZS5nZXRCb3VuZHMoKS5oZWlnaHQ7CisvLwkJCVBvaW50IHRhYmxlTG9jID0gdGFibGUudG9EaXNwbGF5KDAsIDApOworLy8JCQlpbnQgZGl2Q291bnQgPSAwOworLy8KKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKKy8vCQkJCWlmIChkaXZDb3VudCA9PSBpZ25vcmVFdmVudENvdW50KSB7CisvLwkJCQkJZGl2Q291bnQgPSAwOworLy8JCQkJfQorLy8JCQkJaWYgKHRhYmxlLmVxdWFscyhlLmdldFNvdXJjZSgpKSAmICsrZGl2Q291bnQgPT0gaWdub3JlRXZlbnRDb3VudCkgeworLy8JCQkJCU9iamVjdCBvID0gdGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKKy8vCQkJCQlpZiAoZkxhc3RJdGVtID09IG51bGwgXiBvID09IG51bGwpIHsKKy8vCQkJCQkJdGFibGUuc2V0Q3Vyc29yKG8gPT0gbnVsbCA/IG51bGwgOiB0YWJsZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfSEFORCkpOworLy8JCQkJCX0KKy8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIFRhYmxlSXRlbSAmJiBsYXN0WSAhPSBlLnkpIHsKKy8vCQkJCQkJbGFzdFkgPSBlLnk7CisvLwkJCQkJCWlmICghby5lcXVhbHMoZkxhc3RJdGVtKSkgeworLy8JCQkJCQkJZkxhc3RJdGVtID0gKFRhYmxlSXRlbSkgbzsKKy8vCQkJCQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBmTGFzdEl0ZW0gfSk7CisvLwkJCQkJCX0gZWxzZSBpZiAoZS55IDwgaXRlbUhlaWdodGRpdjQpIHsKKy8vCQkJCQkJCS8vIFNjcm9sbCB1cAorLy8JCQkJCQkJSXRlbSBpdGVtID0gZlRhYmxlVmlld2VyLnNjcm9sbFVwKGUueCArIHRhYmxlTG9jLngsIGUueSArIHRhYmxlTG9jLnkpOworLy8JCQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKKy8vCQkJCQkJCQlmTGFzdEl0ZW0gPSAoVGFibGVJdGVtKSBpdGVtOworLy8JCQkJCQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBmTGFzdEl0ZW0gfSk7CisvLwkJCQkJCQl9CisvLwkJCQkJCX0gZWxzZSBpZiAoZS55ID4gdGFibGVIZWlnaHQgLSBpdGVtSGVpZ2h0ZGl2NCkgeworLy8JCQkJCQkJLy8gU2Nyb2xsIGRvd24KKy8vCQkJCQkJCUl0ZW0gaXRlbSA9IGZUYWJsZVZpZXdlci5zY3JvbGxEb3duKGUueCArIHRhYmxlTG9jLngsIGUueSArIHRhYmxlTG9jLnkpOworLy8JCQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKKy8vCQkJCQkJCQlmTGFzdEl0ZW0gPSAoVGFibGVJdGVtKSBpdGVtOworLy8JCQkJCQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBmTGFzdEl0ZW0gfSk7CisvLwkJCQkJCQl9CisvLwkJCQkJCX0KKy8vCQkJCQl9IGVsc2UgaWYgKG8gPT0gbnVsbCkgeworLy8JCQkJCQlmTGFzdEl0ZW0gPSBudWxsOworLy8JCQkJCX0KKy8vCQkJCX0KKy8vCQkJfQorLy8JCX0pOworCisJCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKKwkJCQlpZiAodGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA8IDEpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7CisJCQkJCWlmICh0YWJsZS5lcXVhbHMoZS5nZXRTb3VyY2UoKSkpIHsKKwkJCQkJCU9iamVjdCBvID0gdGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKKwkJCQkJCVRhYmxlSXRlbSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKVswXTsKKwkJCQkJCWlmIChzZWxlY3Rpb24uZXF1YWxzKG8pKSB7CisJCQkJCQkJZ290b1NlbGVjdGVkRWxlbWVudCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChlLmJ1dHRvbiA9PSAzKSB7CisJCQkJCVRhYmxlSXRlbSB0SXRlbSA9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0oCisJCQkJCQkJbmV3IFBvaW50KGUueCwgZS55KSk7CisJCQkJCWlmICh0SXRlbSAhPSBudWxsKSB7CisJCQkJCQlNZW51IG1lbnUgPSBuZXcgTWVudShmVGFibGVWaWV3ZXIuZ2V0VGFibGUoKSk7CisJCQkJCQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CisJCQkJCQltSXRlbS5zZXRUZXh0KFNXVFJlbmRlcmVyc01lc3NhZ2VzLm1lbnVDbG9zZSk7CisJCQkJCQltSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJCQkvKioKKwkJCQkJCQkgKgorCQkJCQkJCSAqLworCQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoCisJCQkJCQkJCQlTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgeworCQkJCQkJCQlyZW1vdmVTZWxlY3RlZEl0ZW1zKCk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCQltZW51LnNldFZpc2libGUodHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0pOworCQkvLyBGSVhNRSBSQVAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29uc3RhbnRzIGJlbG93CisvLwkJZlNoZWxsLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7CisvLwkJCS8qKgorLy8JCQkgKgorLy8JCQkgKi8KKy8vCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisvLworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgeworLy8JCQkJc3dpdGNoIChlLmRldGFpbCkgeworLy8JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUOgorLy8JCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7CisvLwkJCQkJZS5kb2l0ID0gdHJ1ZTsgeworLy8JCQkJCWludCBuID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7CisvLwkJCQkJaWYgKG4gPT0gMCkKKy8vCQkJCQkJcmV0dXJuOworLy8KKy8vCQkJCQlpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOworLy8JCQkJCWlmIChpID49IG4pCisvLwkJCQkJCWkgPSAwOworLy8JCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKKy8vCQkJCX0KKy8vCQkJCQlicmVhazsKKy8vCisvLwkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTOgorLy8JCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7CisvLwkJCQkJZS5kb2l0ID0gdHJ1ZTsgeworLy8JCQkJCWludCBuID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7CisvLwkJCQkJaWYgKG4gPT0gMCkKKy8vCQkJCQkJcmV0dXJuOworLy8KKy8vCQkJCQlpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgLSAxOworLy8JCQkJCWlmIChpIDwgMCkKKy8vCQkJCQkJaSA9IG4gLSAxOworLy8JCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKKy8vCQkJCX0KKy8vCQkJCQlicmVhazsKKy8vCQkJCX0KKy8vCQkJfQorLy8JCX0pOworCisJCXNldEluZm9TeXN0ZW1Db2xvcigpOworCQlpbnN0YWxsRmlsdGVyKCk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUgc2VsZWN0ZWQgaXRlbXMgZnJvbSB0aGUgbGlzdCBhbmQgY2xvc2VzIHRoZWlyIGNvcnJlc3BvbmRpbmcKKwkgKiB0YWJzIFNlbGVjdHMgdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdCBvciBkaXNwb3NlcyBpdCBpZiBpdHMgcHJlc2VudGF0aW9uCisJICogaXMgZGlzcG9zZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKCkgeworCQlpbnQgc2VsSW5kID0gZlRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJaWYgKGRlbGV0ZVNlbGVjdGVkRWxlbWVudHMoKSkgeworCQkJcmV0dXJuOworCQl9CisJCWZUYWJsZVZpZXdlci5yZWZyZXNoKCk7CisJCWlmIChzZWxJbmQgPj0gZlRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkpIHsKKwkJCXNlbEluZCA9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMTsKKwkJfQorCQlpZiAoc2VsSW5kID49IDApIHsKKwkJCWZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihzZWxJbmQpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IFRhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7CisKKwlwdWJsaWMgVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7CisJCXJldHVybiBmVGFibGVWaWV3ZXI7CisJfQorCisJcHJvdGVjdGVkIFRleHQgY3JlYXRlRmlsdGVyVGV4dChDb21wb3NpdGUgcGFyZW50KSB7CisJCWZGaWx0ZXJUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTk9ORSk7CisKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOworCQlnYy5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQlGb250TWV0cmljcyBmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7CisJCWdjLmRpc3Bvc2UoKTsKKworCQlkYXRhLmhlaWdodEhpbnQgPSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZworCQkJCS5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCAxKTsKKwkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKKwkJZkZpbHRlclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKworCQlmRmlsdGVyVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgeworCQkJCXN3aXRjaCAoZS5rZXlDb2RlKSB7CisJCQkJY2FzZSBTV1QuQ1I6CisJCQkJY2FzZSBTV1QuS0VZUEFEX0NSOgorCQkJCQlnb3RvU2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1dULkFSUk9XX0RPV046CisJCQkJCWZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7CisJCQkJCWZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbigwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTV1QuQVJST1dfVVA6CisJCQkJCWZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7CisJCQkJCWZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbigKKwkJCQkJCQlmVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNXVC5FU0M6CisJCQkJCWRpc3Bvc2UoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKKwkJCQkvLyBkbyBub3RoaW5nCisJCQl9CisJCX0pOworCisJCS8vIEhvcml6b250YWwgc2VwYXJhdG9yIGxpbmUKKwkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKKwkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCisJCXJldHVybiBmRmlsdGVyVGV4dDsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0SW5mb1N5c3RlbUNvbG9yKCkgeworCQlEaXNwbGF5IGRpc3BsYXkgPSBmU2hlbGwuZ2V0RGlzcGxheSgpOworCQlzZXRGb3JlZ3JvdW5kQ29sb3IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7CisJCXNldEJhY2tncm91bmRDb2xvcihkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbEZpbHRlcigpIHsKKwkJZkZpbHRlclRleHQuc2V0TWVzc2FnZShXb3JrYmVuY2hTV1RNZXNzYWdlcy5GaWx0ZXJlZFRyZWVfRmlsdGVyTWVzc2FnZSk7CisJCWZGaWx0ZXJUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisKKwkJZkZpbHRlclRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlTdHJpbmcgdGV4dCA9ICgoVGV4dCkgZS53aWRnZXQpLmdldFRleHQoKTsKKwkJCQlzZXRNYXRjaGVyU3RyaW5nKHRleHQpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3RyaW5nIG1hdGNoZXIgaGFzIGJlZW4gbW9kaWZpZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisJICogcmVmcmVzaGVzIHRoZSB2aWV3IGFuZCBzZWxlY3RzIHRoZSBmaXJzdCBtYXRjaGVkIGVsZW1lbnQKKwkgKi8KKwlwcml2YXRlIHZvaWQgc3RyaW5nTWF0Y2hlclVwZGF0ZWQoKSB7CisJCS8vIHJlZnJlc2ggdmlld2VyIHRvIHJlZmlsdGVyCisJCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKKwkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKKwkJc2VsZWN0Rmlyc3RNYXRjaCgpOworCQlmVGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBwYXR0ZXJucyB0byBmaWx0ZXIgb3V0IGZvciB0aGUgcmVjZWl2ZXIuCisJICogPHA+CisJICogVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGhhdmUgc3BlY2lhbCBtZWFuaW5nOiA/ID0+IGFueSBjaGFyYWN0ZXIgKiA9PgorCSAqIGFueSBzdHJpbmcKKwkgKiA8L3A+CisJICovCisJcHJpdmF0ZSB2b2lkIHNldE1hdGNoZXJTdHJpbmcoU3RyaW5nIHBhdHRlcm4pIHsKKwkJaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkgeworCQkJZlNlYXJjaFBhdHRlcm4gPSBudWxsOworCQl9IGVsc2UgeworCQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuTWF0Y2hlciA9IG5ldyBTZWFyY2hQYXR0ZXJuKCk7CisJCQlwYXR0ZXJuTWF0Y2hlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOworCQkJZlNlYXJjaFBhdHRlcm4gPSBwYXR0ZXJuTWF0Y2hlcjsKKwkJfQorCQlzdHJpbmdNYXRjaGVyVXBkYXRlZCgpOworCX0KKworCXByaXZhdGUgU2VhcmNoUGF0dGVybiBnZXRNYXRjaGVyKCkgeworCQlyZXR1cm4gZlNlYXJjaFBhdHRlcm47CisJfQorCisJLyoqCisJICogSW1wbGVtZW50ZXJzIGNhbiBtb2RpZnkKKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkRWxlbWVudCgpIHsKKwkJcmV0dXJuICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkKKwkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZ290b1NlbGVjdGVkRWxlbWVudCgpOworCisJLyoqCisJICogRGVsZXRlIGFsbCBzZWxlY3RlZCBlbGVtZW50cy4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGxlZnQgYWZ0ZXIgZGVsZXRpb24uCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZGVsZXRlU2VsZWN0ZWRFbGVtZW50cygpOworCisJLyoqCisJICogU2VsZWN0cyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgdGFibGUgd2hpY2ggbWF0Y2hlcyB0aGUgY3VycmVudCBmaWx0ZXIKKwkgKiBwYXR0ZXJuLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlbGVjdEZpcnN0TWF0Y2goKSB7CisJCVRhYmxlIHRhYmxlID0gZlRhYmxlVmlld2VyLmdldFRhYmxlKCk7CisJCU9iamVjdCBlbGVtZW50ID0gZmluZEVsZW1lbnQodGFibGUuZ2V0SXRlbXMoKSk7CisJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKKwkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCksIHRydWUpOworCQl9IGVsc2UgeworCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJfQorCX0KKworCXByaXZhdGUgT2JqZWN0IGZpbmRFbGVtZW50KFRhYmxlSXRlbVtdIGl0ZW1zKSB7CisJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpIGZUYWJsZVZpZXdlcgorCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCU9iamVjdCBlbGVtZW50ID0gaXRlbXNbaV0uZ2V0RGF0YSgpOworCQkJaWYgKGZTZWFyY2hQYXR0ZXJuID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZWxlbWVudDsKKwkJCX0KKworCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworCQkJCVN0cmluZyBsYWJlbCA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKKwkJCQlpZiAobGFiZWwgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJLy8gcmVtb3ZlIHRoZSBkaXJ0eSBwcmVmaXggZnJvbSB0aGUgZWRpdG9yJ3MgbGFiZWwKKwkJCQlpZiAobGFiZWwuc3RhcnRzV2l0aCgiKiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMSk7CisJCQkJfQorCQkJCWlmIChmU2VhcmNoUGF0dGVybi5tYXRjaGVzKGxhYmVsKSkgeworCQkJCQlyZXR1cm4gZWxlbWVudDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJZlNoZWxsLnNldFZpc2libGUodmlzaWJsZSk7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGZTaGVsbCAhPSBudWxsKSB7CisJCQlpZiAoIWZTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQlmU2hlbGwuZGlzcG9zZSgpOworCQkJfQorCQkJZlNoZWxsID0gbnVsbDsKKwkJCWZUYWJsZVZpZXdlciA9IG51bGw7CisJCQlmQ29tcG9zaXRlID0gbnVsbDsKKwkJCWZGaWx0ZXJUZXh0ID0gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZUhpbnQoKSB7CisJCS8vIFJlc2l6ZSB0aGUgdGFibGUncyBoZWlnaHQgYWNjb3JkaW5nbHkgdG8gdGhlIG5ldyBpbnB1dAorCQlUYWJsZSB2aWV3ZXJUYWJsZSA9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpOworCQlQb2ludCB0YWJsZVNpemUgPSB2aWV3ZXJUYWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCQlpbnQgdGFibGVNYXhIZWlnaHQgPSBmQ29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRCb3VuZHMoKS5oZWlnaHQgLyAyOworCQkvLyByZW1vdmVzIHBhZGRpbmcgaWYgbmVjZXNzYXJ5CisJCWludCB0YWJsZUhlaWdodCA9ICh0YWJsZVNpemUueSA8PSB0YWJsZU1heEhlaWdodCkgPyB0YWJsZVNpemUueQorCQkJCS0gdmlld2VyVGFibGUuZ2V0SXRlbUhlaWdodCgpIC0gdmlld2VyVGFibGUuZ2V0SXRlbUhlaWdodCgpIC8gMgorCQkJCTogdGFibGVNYXhIZWlnaHQ7CisJCSgoR3JpZERhdGEpIHZpZXdlclRhYmxlLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IHRhYmxlSGVpZ2h0OworCQlQb2ludCBmQ29tcFNpemUgPSBmQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7CisJCWZDb21wb3NpdGUuc2V0U2l6ZShmQ29tcFNpemUpOworCQlyZXR1cm4gZkNvbXBTaXplOworCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IGxvY2F0aW9uKSB7CisJCVJlY3RhbmdsZSB0cmltID0gZlNoZWxsLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOworCQlQb2ludCB0ZXh0TG9jYXRpb24gPSBmQ29tcG9zaXRlLmdldExvY2F0aW9uKCk7CisJCWxvY2F0aW9uLnggKz0gdHJpbS54IC0gdGV4dExvY2F0aW9uLng7CisJCWxvY2F0aW9uLnkgKz0gdHJpbS55IC0gdGV4dExvY2F0aW9uLnk7CisJCWZTaGVsbC5zZXRMb2NhdGlvbihsb2NhdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwkJZlNoZWxsLnNldFNpemUod2lkdGgsIGhlaWdodCk7CisJfQorCisJcHVibGljIFNoZWxsIGdldFNoZWxsKCkgeworCQlyZXR1cm4gZlNoZWxsOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgZm9yZWdyb3VuZCkgeworCQlmVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOworCQlmRmlsdGVyVGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOworCQlmQ29tcG9zaXRlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBiYWNrZ3JvdW5kKSB7CisJCWZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7CisJCWZGaWx0ZXJUZXh0LnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7CisJCWZDb21wb3NpdGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZlNoZWxsLmZvcmNlRm9jdXMoKTsKKwkJZkZpbHRlclRleHQuc2V0Rm9jdXMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9CYXNpY1BhcnRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9CYXNpY1BhcnRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyOGYzOAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0Jhc2ljUGFydExpc3QuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1EaXJ0eWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGxhY2Vob2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC5TdGFja1JlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKKworcHVibGljIGNsYXNzIEJhc2ljUGFydExpc3QgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlSW5mb3JtYXRpb25Db250cm9sIHsKKworCXByaXZhdGUgY2xhc3MgQmFzaWNTdGFja0xpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciB7CisKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJcHJpdmF0ZSBGb250IGJvbGRGb250OworCisJCXB1YmxpYyBCYXNpY1N0YWNrTGlzdExhYmVsUHJvdmlkZXIoKSB7CisJCQlGb250IGZvbnQgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Gb250KCk7CisJCQlGb250RGF0YVtdIGZvbnREYXRhcyA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKKwkJCWZvciAoRm9udERhdGEgZm9udERhdGEgOiBmb250RGF0YXMpIHsKKwkJCQlmb250RGF0YS5zZXRTdHlsZShmb250RGF0YS5nZXRTdHlsZSgpIHwgU1dULkJPTEQpOworCQkJfQorCQkJYm9sZEZvbnQgPSBuZXcgRm9udChEaXNwbGF5LmdldERlZmF1bHQoKSwgZm9udERhdGFzKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSB7CisJCQkJTVBhcnQgcGFydCA9IChNUGFydCkgZWxlbWVudDsKKwkJCQlDVGFiSXRlbSBpdGVtID0gcmVuZGVyZXIuZmluZEl0ZW1Gb3JQYXJ0KHBhcnQpOworCQkJCWlmIChpdGVtICE9IG51bGwgJiYgIWl0ZW0uaXNTaG93aW5nKCkpIHsKKwkJCQkJcmV0dXJuIGJvbGRGb250OworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBzdXBlci5nZXRGb250KGVsZW1lbnQpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNRGlydHlhYmxlCisJCQkJCSYmICgoTURpcnR5YWJsZSkgZWxlbWVudCkuaXNEaXJ0eSgpKSB7CisJCQkJcmV0dXJuICIqIiArICgoTVVJTGFiZWwpIGVsZW1lbnQpLmdldExvY2FsaXplZExhYmVsKCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiAoKE1VSUxhYmVsKSBlbGVtZW50KS5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIHJlbmRlcmVyLmdldEltYWdlKChNVUlMYWJlbCkgZWxlbWVudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuICgoTVVJTGFiZWwpIGVsZW1lbnQpLmdldExvY2FsaXplZFRvb2x0aXAoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiB1c2VOYXRpdmVUb29sVGlwKE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQlib2xkRm9udC5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIE1FbGVtZW50Q29udGFpbmVyPD8+IGlucHV0OworCisJcHJpdmF0ZSBFUGFydFNlcnZpY2UgcGFydFNlcnZpY2U7CisKKwlwcml2YXRlIFN0YWNrUmVuZGVyZXIgcmVuZGVyZXI7CisKKwkvLyBwcml2YXRlIElTYXZlSGFuZGxlciBzYXZlSGFuZGxlcjsKKworCXB1YmxpYyBCYXNpY1BhcnRMaXN0KFNoZWxsIHBhcmVudCwgaW50IHNoZWxsU3R5bGUsIGludCB0cmVlU3R5bGVyLAorCQkJRVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlLCBNRWxlbWVudENvbnRhaW5lcjw/PiBpbnB1dCwKKyBTdGFja1JlbmRlcmVyIHJlbmRlcmVyLCBib29sZWFuIG1ydSkgeworCQlzdXBlcihwYXJlbnQsIHNoZWxsU3R5bGUsIHRyZWVTdHlsZXIpOworCQl0aGlzLnBhcnRTZXJ2aWNlID0gcGFydFNlcnZpY2U7CisJCXRoaXMuaW5wdXQgPSBpbnB1dDsKKwkJdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOworCQkvLyB0aGlzLnNhdmVIYW5kbGVyID0gc2F2ZUhhbmRsZXI7CisJCWlmIChtcnUgJiYgZ2V0VGFibGVWaWV3ZXIoKSAhPSBudWxsKSB7CisJCQlnZXRUYWJsZVZpZXdlcigpLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQkJTVBhcnQgcGFydCA9IChNUGFydCkgZWxlbWVudDsKKwkJCQkJCUNUYWJJdGVtIGl0ZW0gPSBCYXNpY1BhcnRMaXN0LnRoaXMucmVuZGVyZXIuZmluZEl0ZW1Gb3JQYXJ0KHBhcnQpOworCQkJCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiAhaXRlbS5pc1Nob3dpbmcoKSkgeworCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjcmVhdGVUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuU0lOR0xFIHwgKHN0eWxlICYgflNXVC5NVUxUSSkpOworCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwKKwkJCQlmYWxzZSkpOworCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7CisJCXRhYmxlVmlld2VyLmFkZEZpbHRlcihuZXcgTmFtZVBhdHRlcm5GaWx0ZXIoKSk7CisJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihBcnJheUNvbnRlbnRQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKKwkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQmFzaWNTdGFja0xpc3RMYWJlbFByb3ZpZGVyKCkpOworCisJCUNvbHVtblZpZXdlclRvb2xUaXBTdXBwb3J0LmVuYWJsZUZvcih0YWJsZVZpZXdlcik7CisJCXJldHVybiB0YWJsZVZpZXdlcjsKKwl9CisKKwlwcml2YXRlIExpc3Q8T2JqZWN0PiBnZXRJbnB1dCgpIHsKKwkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJZm9yIChNVUlFbGVtZW50IGVsZW1lbnQgOiBpbnB1dC5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJCWlmICghZWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpIHx8ICFlbGVtZW50LmlzVmlzaWJsZSgpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWVsZW1lbnQgPSAoKE1QbGFjZWhvbGRlcikgZWxlbWVudCkuZ2V0UmVmKCk7CisJCQl9CisKKwkJCWlmIChlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkgJiYgZWxlbWVudC5pc1Zpc2libGUoKQorCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCQlsaXN0LmFkZChlbGVtZW50KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dCgpIHsKKwkJZ2V0VGFibGVWaWV3ZXIoKS5zZXRJbnB1dChnZXRJbnB1dCgpKTsKKwkJc2VsZWN0Rmlyc3RNYXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGdvdG9TZWxlY3RlZEVsZW1lbnQoKSB7CisJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKKworCQkvLyBjbG9zZSB0aGUgc2hlbGwKKwkJZGlzcG9zZSgpOworCisJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJcGFydFNlcnZpY2UuYWN0aXZhdGUoKE1QYXJ0KSBzZWxlY3RlZEVsZW1lbnQpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlU2VsZWN0ZWRFbGVtZW50cygpIHsKKwkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudCgpOworCQlpZiAoc2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpIHsKKwkJCWlmIChwYXJ0U2VydmljZS5zYXZlUGFydCgoTVBhcnQpIHNlbGVjdGVkRWxlbWVudCwgdHJ1ZSkpCisJCQkJcGFydFNlcnZpY2UuaGlkZVBhcnQoKE1QYXJ0KSBzZWxlY3RlZEVsZW1lbnQpOworCisJCQlpZiAoZ2V0U2hlbGwoKSA9PSBudWxsKSB7CisJCQkJLy8gQnVnIDQyMTE3MDogQ29udHJhY3Qgc2F5cyB0byByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8KKwkJCQkvLyBlbGVtZW50cyBsZWZ0LiBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIG5vIHNoZWxsIGxlZnQgYmVjYXVzZQorCQkJCS8vIHdlIHBvcHBlZCBhIHNhdmUgZGlhbG9nIGFuZCBhdXRvLWNsb3NlZCB0aGUgbGlzdC4gRXJnbywgdGhlcmUKKwkJCQkvLyBhcmUgbm8gZWxlbWVudHMgbGVmdC4KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWlmIChnZXRJbnB1dCgpLmlzRW1wdHkoKSkgeworCQkJCWdldFNoZWxsKCkuZGlzcG9zZSgpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQkvLyBSZW1vdmUgcGFydCBmcm9tIHZpZXdlciBtb2RlbAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlMaXN0PE9iamVjdD4gdmlld2VySW5wdXQgPSAoTGlzdDxPYmplY3Q+KSBnZXRUYWJsZVZpZXdlcigpCisJCQkJCS5nZXRJbnB1dCgpOworCQkJdmlld2VySW5wdXQucmVtb3ZlKHNlbGVjdGVkRWxlbWVudCk7CisKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9JVXBkYXRlU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvSVVwZGF0ZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjQ2YzU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvSVVwZGF0ZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1JdGVtOworCisvKioKKyAqIEEgYnJpZGdpbmcgaW50ZXJmYWNlIHdpdGggdGhlIDMueCBJQ29tbWFuZFNlcnZpY2UgZm9yIHJlZ2lzdGVyaW5nIGVsZW1lbnQKKyAqIGl0ZW0gdXBkYXRlIGNhbGxiYWNrcy4KKyAqIDxwPgorICogU2VlIGJ1ZyAzNjY1NjguCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZVNlcnZpY2UgeworCisJcHVibGljIFJ1bm5hYmxlIHJlZ2lzdGVyRWxlbWVudEZvclVwZGF0ZSgKKwkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcmFtZXRlcml6ZWRDb21tYW5kLCBNSXRlbSBpdGVtKTsKKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvU1dUUmVuZGVyZXJzQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TV1RSZW5kZXJlcnNBY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGRjNDJhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvU1dUUmVuZGVyZXJzQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBCdW5kbGUgYWN0aXZhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBTV1RSZW5kZXJlcnNBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCisJLyoqCisJICogVGhlIGJ1bmRsZSBhc3NvY2lhdGVkIHRoaXMgcGx1Zy1pbgorCSAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJ1bmRsZUNvbnRleHQgPSBudWxsOworCX0KKworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBidW5kbGVDb250ZXh0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvU1dUUmVuZGVyZXJzTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1NXVFJlbmRlcmVyc01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZmI0YgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1NXVFJlbmRlcmVyc01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFNpbW9uIFNjaG9seiA8c2Nob2x6c2ltb25AYXJjb3IuZGUgLSBCdWcgNDI5NzI5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCisvKioKKyAqIFNXVFJlbmRlcmVycyBtZXNzYWdlIGNhdGFsb2cKKyAqLworcHVibGljIGNsYXNzIFNXVFJlbmRlcmVyc01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnJlbmRlcmVycy5zd3QubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9vc2VQYXJ0c1RvU2F2ZVRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNob29zZVBhcnRzVG9TYXZlOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbWVudUNsb3NlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lbnVDbG9zZU90aGVyczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBtZW51Q2xvc2VBbGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbWVudUNsb3NlUmlnaHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbWVudUNsb3NlTGVmdDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdNZW51OworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdGFiU2Nyb2xsaW5nTGVmdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJTY3JvbGxpbmdSaWdodDsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlyZWxvYWRNZXNzYWdlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRNZXNzYWdlcygpIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU1dUUmVuZGVyZXJzTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU5MTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDI1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyAgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAgICBTaW1vbiBTY2hvbHogPHNjaG9senNpbW9uQGFyY29yLmRlIC0gQnVnIDQyOTcyOQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFNXVCBSZW5kZXJlcnMgcGx1Z2luIG1lc3NhZ2VzCisKK2Nob29zZVBhcnRzVG9TYXZlVGl0bGU9U2F2ZSBQYXJ0cworY2hvb3NlUGFydHNUb1NhdmU9U2VsZWN0IHRoZSBwYXJ0cyB0byBzYXZlOgorbWVudUNsb3NlID0gJkNsb3NlCittZW51Q2xvc2VPdGhlcnMgPSBDbG9zZSAmT3RoZXJzCittZW51Q2xvc2VBbGwgPSBDbG9zZSAmQWxsCittZW51Q2xvc2VSaWdodCA9IENsb3NlIFRhYnMgdG8gdGhlICZSaWdodAorbWVudUNsb3NlTGVmdCA9IENsb3NlIFRhYnMgdG8gdGhlICZMZWZ0CisKK3ZpZXdNZW51ID0gVmlldyBNZW51CisKK3RhYlNjcm9sbGluZ0xlZnQgPSBTY3JvbGwgbGlzdCBsZWZ0Cit0YWJTY3JvbGxpbmdSaWdodCA9IFNjcm9sbCBsaXN0IHJpZ2h0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9BcmVhUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0FyZWFSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDBhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9BcmVhUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkFic3RyYWN0UGFydFJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTUFyZWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLkV2ZW50VGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCisvKioKKyAqIENyZWF0ZSBhIGNvbnRyaWJ1dGUgcGFydC4KKyAqLworcHVibGljIGNsYXNzIEFyZWFSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRXZlbnRCcm9rZXIgZXZlbnRCcm9rZXI7CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBpdGVtVXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNQXJlYQorCQkJaWYgKCEoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpIGluc3RhbmNlb2YgTUFyZWEpKQorCQkJCXJldHVybjsKKworCQkJTUFyZWEgYXJlYU1vZGVsID0gKE1BcmVhKSBldmVudAorCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJQ1RhYkZvbGRlciBjdGYgPSAoQ1RhYkZvbGRlcikgYXJlYU1vZGVsLmdldFdpZGdldCgpOworCQkJQ1RhYkl0ZW0gYXJlYUl0ZW0gPSBjdGYuZ2V0SXRlbSgwKTsKKworCQkJLy8gTm8gd2lkZ2V0ID09IG5vdGhpbmcgdG8gdXBkYXRlCisJCQlpZiAoYXJlYUl0ZW0gPT0gbnVsbCkKKwkJCQlyZXR1cm47CisKKwkJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5BVFROQU1FKTsKKwkJCWlmIChVSUV2ZW50cy5VSUxhYmVsLkxBQkVMLmVxdWFscyhhdHROYW1lKQorCQkJCQl8fCBVSUV2ZW50cy5VSUxhYmVsLkxPQ0FMSVpFRF9MQUJFTC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQlhcmVhSXRlbS5zZXRUZXh0KGFyZWFNb2RlbC5nZXRMb2NhbGl6ZWRMYWJlbCgpKTsKKwkJCX0gZWxzZSBpZiAoVUlFdmVudHMuVUlMYWJlbC5JQ09OVVJJLmVxdWFscyhhdHROYW1lKSkgeworCQkJCWFyZWFJdGVtLnNldEltYWdlKGdldEltYWdlKGFyZWFNb2RlbCkpOworCQkJfSBlbHNlIGlmIChVSUV2ZW50cy5VSUxhYmVsLlRPT0xUSVAuZXF1YWxzKGF0dE5hbWUpCisJCQkJCXx8IFVJRXZlbnRzLlVJTGFiZWwuTE9DQUxJWkVEX1RPT0xUSVAuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQkJYXJlYUl0ZW0uc2V0VG9vbFRpcFRleHQoYXJlYU1vZGVsLmdldExvY2FsaXplZFRvb2x0aXAoKSk7CisJCQl9CisJCX0KKwl9OworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgd2lkZ2V0TGlzdGVuZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCWZpbmFsIE1VSUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KEV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCWlmICghKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTVBhcnRTdGFjaykpCisJCQkJcmV0dXJuOworCisJCQlNQXJlYSBhcmVhTW9kZWwgPSBmaW5kQXJlYShjaGFuZ2VkRWxlbWVudCk7CisJCQlpZiAoYXJlYU1vZGVsICE9IG51bGwpCisJCQkJc3luY2hDVEZTdGF0ZShhcmVhTW9kZWwpOworCQl9CisKKwkJcHJpdmF0ZSBNQXJlYSBmaW5kQXJlYShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJCU1VSUVsZW1lbnQgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNQXJlYSkKKwkJCQkJcmV0dXJuIChNQXJlYSkgcGFyZW50OworCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfTsKKworCUBQb3N0Q29uc3RydWN0CisJdm9pZCBpbml0KCkgeworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuVUlMYWJlbC5UT1BJQ19BTEwsIGl0ZW1VcGRhdGVyKTsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRWxlbWVudC5UT1BJQ19XSURHRVQsIHdpZGdldExpc3RlbmVyKTsKKwl9CisKKwlAUHJlRGVzdHJveQorCXZvaWQgY29udGV4dERpc3Bvc2VkKCkgeworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShpdGVtVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHdpZGdldExpc3RlbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1BcmVhKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkpCisJCQlyZXR1cm4gbnVsbDsKKworCQlDb21wb3NpdGUgcGFyZW50Q29tcCA9IChDb21wb3NpdGUpIHBhcmVudDsKKworCQlDb21wb3NpdGUgYXJlYUNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudENvbXAsIFNXVC5OT05FKTsKKwkJYXJlYUNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOworCisJCXJldHVybiBhcmVhQ29tcDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZW5zdXJlQ1RGKE1BcmVhIGFyZWFNb2RlbCkgeworCQlpZiAoYXJlYU1vZGVsLmdldFdpZGdldCgpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikKKwkJCXJldHVybjsKKworCQlDb21wb3NpdGUgY3VyQ29tcCA9IChDb21wb3NpdGUpIGFyZWFNb2RlbC5nZXRXaWRnZXQoKTsKKwkJQ29tcG9zaXRlIHBhcmVudENvbXAgPSBjdXJDb21wLmdldFBhcmVudCgpOworCQlDVGFiRm9sZGVyIGN0ZiA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudENvbXAsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKKworCQkvLyBGaW5kIHRoZSBzdGFjayBpbiB0aGUgYXJlYSB0aGF0IHVzZWQgdG8gaGF2ZSB0aGUgbWluL21heCBzdGF0ZQorCQlMaXN0PE1QYXJ0U3RhY2s+IHN0YWNrcyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoYXJlYU1vZGVsLCBudWxsLAorCQkJCU1QYXJ0U3RhY2suY2xhc3MsIG51bGwpOworCQlNUGFydFN0YWNrIGN1clN0YWNrID0gbnVsbDsKKwkJZm9yIChNUGFydFN0YWNrIHN0YWNrIDogc3RhY2tzKSB7CisJCQlpZiAoc3RhY2suaXNUb0JlUmVuZGVyZWQoKQorCQkJCQkmJiBzdGFjay5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQlDVGFiRm9sZGVyIHN0YWNrQ1RGID0gKENUYWJGb2xkZXIpIHN0YWNrLmdldFdpZGdldCgpOworCQkJCWlmIChzdGFja0NURi5nZXRNaW5pbWl6ZVZpc2libGUoKQorCQkJCQkJfHwgc3RhY2tDVEYuZ2V0TWF4aW1pemVWaXNpYmxlKCkpIHsKKwkJCQkJY3VyU3RhY2sgPSBzdGFjazsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gLi4uYW5kIGNvcHkgb3ZlciBpdHMgbWluL21heCBzdGF0ZQorCQlpZiAoY3VyU3RhY2sgIT0gbnVsbCkgeworCQkJQ1RhYkZvbGRlciBjdXJDVEYgPSAoQ1RhYkZvbGRlcikgY3VyU3RhY2suZ2V0V2lkZ2V0KCk7CisJCQljdGYuc2V0TWluaW1pemVWaXNpYmxlKGN1ckNURi5nZXRNaW5pbWl6ZVZpc2libGUoKSk7CisJCQljdGYuc2V0TWF4aW1pemVWaXNpYmxlKGN1ckNURi5nZXRNYXhpbWl6ZVZpc2libGUoKSk7CisJCQljdGYuc2V0TWluaW1pemVkKGN1ckNURi5nZXRNaW5pbWl6ZWQoKSk7CisJCQljdGYuc2V0TWF4aW1pemVkKGN1ckNURi5nZXRNYXhpbWl6ZWQoKSk7CisKKwkJCWN1ckNURi5zZXRNaW5pbWl6ZVZpc2libGUoZmFsc2UpOworCQkJY3VyQ1RGLnNldE1heGltaXplVmlzaWJsZShmYWxzZSk7CisJCX0KKworCQlDVGFiSXRlbSBjdGkgPSBuZXcgQ1RhYkl0ZW0oY3RmLCBTV1QuTk9ORSk7CisJCWlmIChhcmVhTW9kZWwuZ2V0TGFiZWwoKSAhPSBudWxsKQorCQkJY3RpLnNldFRleHQoYXJlYU1vZGVsLmdldExvY2FsaXplZExhYmVsKCkpOworCQlpZiAoYXJlYU1vZGVsLmdldFRvb2x0aXAoKSAhPSBudWxsKQorCQkJY3RpLnNldFRvb2xUaXBUZXh0KGFyZWFNb2RlbC5nZXRMb2NhbGl6ZWRUb29sdGlwKCkpOworCQlpZiAoYXJlYU1vZGVsLmdldEljb25VUkkoKSAhPSBudWxsKQorCQkJY3RpLnNldEltYWdlKGdldEltYWdlKGFyZWFNb2RlbCkpOworCisJCWN1ckNvbXAuc2V0UGFyZW50KGN0Zik7CisJCWN0aS5zZXRDb250cm9sKGN1ckNvbXApOworCQljdGYuc2V0U2VsZWN0aW9uKGN0aSk7CisKKwkJY3VyQ29tcC5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbnVsbCk7CisJCWJpbmRXaWRnZXQoYXJlYU1vZGVsLCBjdGYpOworCQljdGYuZ2V0UGFyZW50KCkubGF5b3V0KG51bGwsIFNXVC5BTEwgfCBTV1QuREVGRVIgfCBTV1QuQ0hBTkdFRCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuc3VyZUNvbXBvc2l0ZShNQXJlYSBhcmVhTW9kZWwpIHsKKwkJaWYgKGFyZWFNb2RlbC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCUNUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIGFyZWFNb2RlbC5nZXRXaWRnZXQoKTsKKwkJCUNUYWJJdGVtIGN0aSA9IGN0Zi5nZXRJdGVtKDApOworCQkJQ29tcG9zaXRlIGlubmVyQ29tcCA9IChDb21wb3NpdGUpIGN0aS5nZXRDb250cm9sKCk7CisJCQlpbm5lckNvbXAuc2V0UGFyZW50KGN0Zi5nZXRQYXJlbnQoKSk7CisJCQljdGkuc2V0Q29udHJvbChudWxsKTsKKworCQkJLy8gT0sgbm93IGNvcHkgb3ZlciB0aGUgbWluL21heCBzdGF0ZSBvZiB0aGUgYXJlYSBzdGFjayB0byB0aGUKKwkJCS8vIHJlbWFpbmluZyBwYXJ0IHN0YWNrCisJCQlMaXN0PE1QYXJ0U3RhY2s+IHN0YWNrcyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoYXJlYU1vZGVsLAorCQkJCQludWxsLCBNUGFydFN0YWNrLmNsYXNzLCBudWxsKTsKKwkJCWZvciAoTVBhcnRTdGFjayBzdGFjayA6IHN0YWNrcykgeworCQkJCWlmIChzdGFjay5pc1RvQmVSZW5kZXJlZCgpCisJCQkJCQkmJiBzdGFjay5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkJQ1RhYkZvbGRlciBzdGFja0NURiA9IChDVGFiRm9sZGVyKSBzdGFjay5nZXRXaWRnZXQoKTsKKwkJCQkJc3RhY2tDVEYuc2V0TWluaW1pemVWaXNpYmxlKGN0Zi5nZXRNaW5pbWl6ZVZpc2libGUoKSk7CisJCQkJCXN0YWNrQ1RGLnNldE1heGltaXplVmlzaWJsZShjdGYuZ2V0TWF4aW1pemVWaXNpYmxlKCkpOworCQkJCQlzdGFja0NURi5zZXRNaW5pbWl6ZWQoY3RmLmdldE1pbmltaXplZCgpKTsKKwkJCQkJc3RhY2tDVEYuc2V0TWF4aW1pemVkKGN0Zi5nZXRNYXhpbWl6ZWQoKSk7CisJCQkJfQorCQkJfQorCisJCQljdGYuc2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUsIG51bGwpOworCQkJY3RmLmRpc3Bvc2UoKTsKKworCQkJYmluZFdpZGdldChhcmVhTW9kZWwsIGlubmVyQ29tcCk7CisJCQlpbm5lckNvbXAuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCWlubmVyQ29tcC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc3luY2hDVEZTdGF0ZShNQXJlYSBhcmVhTW9kZWwpIHsKKwkJTGlzdDxNUGFydFN0YWNrPiBzdGFja3MgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKGFyZWFNb2RlbCwgbnVsbCwKKwkJCQlNUGFydFN0YWNrLmNsYXNzLCBudWxsKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChNUGFydFN0YWNrIHN0YWNrIDogc3RhY2tzKSB7CisJCQlpZiAoc3RhY2suaXNUb0JlUmVuZGVyZWQoKSkKKwkJCQljb3VudCsrOworCQl9CisKKwkJLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIHN0YWNrIHZpc2libGUgd2UgdXNlIGEgQ1RGCisJCWlmIChjb3VudCA+IDEpCisJCQllbnN1cmVDVEYoYXJlYU1vZGVsKTsKKwkJZWxzZQorCQkJZW5zdXJlQ29tcG9zaXRlKGFyZWFNb2RlbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVSUNvbnRhaW5lcihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJTVVJRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKworCQlpZiAoIShwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTUFyZWEpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJTUFyZWEgYXJlYU1vZGVsID0gKE1BcmVhKSBwYXJlbnRFbGVtZW50OworCQlzeW5jaENURlN0YXRlKGFyZWFNb2RlbCk7CisKKwkJaWYgKGFyZWFNb2RlbC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCUNUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIGFyZWFNb2RlbC5nZXRXaWRnZXQoKTsKKwkJCXJldHVybiBjdGYuZ2V0SXRlbSgwKS5nZXRDb250cm9sKCk7CisJCX0KKworCQlyZXR1cm4gcGFyZW50RWxlbWVudC5nZXRXaWRnZXQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9DU1NFbmdpbmVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0NTU0VuZ2luZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWVjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9DU1NFbmdpbmVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVN0eWxpbmdFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7CitpbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3IgcmV0cmlldmluZyBDU1MgdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgY29udHJvbCBzbyBpdCBjYW4gYmUKKyAqIHVzZWQgYnkgcmVuZGVyZXJzLgorICovCitwdWJsaWMgY2xhc3MgQ1NTRW5naW5lSGVscGVyIHsKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgQ29udHJvbCBjb250cm9sOworCXByaXZhdGUgSVN0eWxpbmdFbmdpbmUgZW5naW5lOworCXByaXZhdGUgQ1NTU3R5bGVEZWNsYXJhdGlvbiBzdHlsZTsKKworCS8qKgorCSAqIENyZWF0ZSBhIENTU0VuZ2luZUhlbHBlciB0aGF0IGNhbiByZXRyaWV2ZSBlbmdpbmUgdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIKKwkgKiBjb250cm9sLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqLworCXB1YmxpYyBDU1NFbmdpbmVIZWxwZXIoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsIENvbnRyb2wgY29udHJvbCkgeworCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOworCQlpbml0aWFsaXplKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisJCXRoaXMuZW5naW5lID0gY29udGV4dC5nZXQoSVN0eWxpbmdFbmdpbmUuY2xhc3MpOworCQlpZiAoZW5naW5lICE9IG51bGwpIHsKKwkJCXN0eWxlID0gZW5naW5lLmdldFN0eWxlKGNvbnRyb2wpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBtYXJnaW4gYm90dG9tIGFzIHNwZWNpZmllZCBpbiB0aGUgc3R5bGVzaGVldCBmb3IgdGhpcyBjb250cm9sLAorCSAqIG9yIHRoZSBkZWZhdWx0VmFsdWUgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogQHJldHVybiB0aGUgbWFyZ2luIGluIHBpeGVscworCSAqLworCXB1YmxpYyBpbnQgZ2V0TWFyZ2luQm90dG9tKGludCBkZWZhdWx0VmFsdWUpIHsKKwkJaWYgKHN0eWxlID09IG51bGwpCisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQlyZXR1cm4gZ2V0UHhWYWx1ZSgKKwkJCQlzdHlsZS5nZXRQcm9wZXJ0eUNTU1ZhbHVlKCJtYXJnaW4tYm90dG9tIiksIGRlZmF1bHRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG1hcmdpbiB0b3AgYXMgc3BlY2lmaWVkIGluIHRoZSBzdHlsZXNoZWV0IGZvciB0aGlzIGNvbnRyb2wsIG9yCisJICogdGhlIGRlZmF1bHRWYWx1ZSBpZiBub25lIGlzIHNwZWNpZmllZC4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiBAcmV0dXJuIHRoZSBtYXJnaW4gaW4gcGl4ZWxzCisJICovCisJcHVibGljIGludCBnZXRNYXJnaW5Ub3AoaW50IGRlZmF1bHRWYWx1ZSkgeworCQlpZiAoc3R5bGUgPT0gbnVsbCkKKwkJCXJldHVybiBkZWZhdWx0VmFsdWU7CisJCXJldHVybiBnZXRQeFZhbHVlKHN0eWxlLmdldFByb3BlcnR5Q1NTVmFsdWUoIm1hcmdpbi10b3AiKSwgZGVmYXVsdFZhbHVlKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgbWFyZ2luIGxlZnQgYXMgc3BlY2lmaWVkIGluIHRoZSBzdHlsZXNoZWV0IGZvciB0aGlzIGNvbnRyb2wsCisJICogb3IgdGhlIGRlZmF1bHRWYWx1ZSBpZiBub25lIGlzIHNwZWNpZmllZC4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiBAcmV0dXJuIHRoZSBtYXJnaW4gaW4gcGl4ZWxzCisJICovCisJcHVibGljIGludCBnZXRNYXJnaW5MZWZ0KGludCBkZWZhdWx0VmFsdWUpIHsKKwkJaWYgKHN0eWxlID09IG51bGwpCisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQlyZXR1cm4gZ2V0UHhWYWx1ZSgKKwkJCQlzdHlsZS5nZXRQcm9wZXJ0eUNTU1ZhbHVlKCJtYXJnaW4tbGVmdCIpLCBkZWZhdWx0VmFsdWUpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBtYXJnaW4gcmlnaHQgYXMgc3BlY2lmaWVkIGluIHRoZSBzdHlsZXNoZWV0IGZvciB0aGlzIGNvbnRyb2wsCisJICogb3IgdGhlIGRlZmF1bHRWYWx1ZSBpZiBub25lIGlzIHNwZWNpZmllZC4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiBAcmV0dXJuIHRoZSBtYXJnaW4gaW4gcGl4ZWxzCisJICovCisJcHVibGljIGludCBnZXRNYXJnaW5SaWdodChpbnQgZGVmYXVsdFZhbHVlKSB7CisJCWlmIChzdHlsZSA9PSBudWxsKQorCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKwkJcmV0dXJuIGdldFB4VmFsdWUoCisJCQkJc3R5bGUuZ2V0UHJvcGVydHlDU1NWYWx1ZSgibWFyZ2luLXJpZ2h0IiksIGRlZmF1bHRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIGludCBnZXRQeFZhbHVlKENTU1ZhbHVlIHZhbHVlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisJCWlmICh2YWx1ZSAhPSBudWxsCisJCQkJJiYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpCisJCQkJJiYgKCgoQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlKS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYKSkgeworCQkJcmV0dXJuIChpbnQpICgoQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlKQorCQkJCQkuZ2V0RmxvYXRWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFgpOworCQl9CisJCXJldHVybiBkZWZhdWx0VmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQ1RhYlJlbmRlcmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQ1RhYlJlbmRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDQ4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9DVGFiUmVuZGVyaW5nLmphdmEKQEAgLTAsMCArMSw2NjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CisKKy8vRklYTUUgUkFQIE1vZGlmaWVkCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIENUYWJSZW5kZXJpbmcgLyoKKwkJCQkJCQkgKiBleHRlbmRzIENUYWJGb2xkZXJSZW5kZXJlciBpbXBsZW1lbnRzCisJCQkJCQkJICogSUNUYWJSZW5kZXJpbmcKKwkJCQkJCQkgKi97CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlCisJICogb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwuY3NzLnN3dC5JQ1RhYlJlbmRlcmluZyNzZXRTZWxlY3RlZFRhYkZpbGwoCisJICogb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVGFiRmlsbChDb2xvciBjb2xvcikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlCisJICogb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwuY3NzLnN3dC5JQ1RhYlJlbmRlcmluZyNzZXRUYWJPdXRsaW5lKG9yZy5lY2xpcHNlCisJICogLnN3dC5ncmFwaGljcy5Db2xvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYWJPdXRsaW5lKENvbG9yIGNvbG9yKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC5jc3Muc3d0LklDVGFiUmVuZGVyaW5nI3NldElubmVyS2V5bGluZShvcmcKKwkgKiAuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IpCisJICovCisJcHVibGljIHZvaWQgc2V0SW5uZXJLZXlsaW5lKENvbG9yIGNvbG9yKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC5jc3Muc3d0LklDVGFiUmVuZGVyaW5nI3NldE91dGVyS2V5bGluZShvcmcKKwkgKiAuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IpCisJICovCisJcHVibGljIHZvaWQgc2V0T3V0ZXJLZXlsaW5lKENvbG9yIGNvbG9yKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC5jc3Muc3d0LklDVGFiUmVuZGVyaW5nI3NldFNoYWRvd0NvbG9yKG9yZy4KKwkgKiBlY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaGFkb3dDb2xvcihDb2xvciBjb2xvcikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlCisJICogb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwuY3NzLnN3dC5JQ1RhYlJlbmRlcmluZyNzZXRBY3RpdmVUb29sYmFyR3JhZGllbnQKKwkgKiAob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yW10sIGludFtdKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVRvb2xiYXJHcmFkaWVudChDb2xvcltdIGNvbG9yLCBpbnRbXSBwZXJjZW50cykgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlCisJICogb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwuY3NzLnN3dC5JQ1RhYlJlbmRlcmluZyNzZXRJbmFjdGl2ZVRvb2xiYXJHcmFkaWVudAorCSAqIChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3JbXSwgaW50W10pCisJICovCisJcHVibGljIHZvaWQgc2V0SW5hY3RpdmVUb29sYmFyR3JhZGllbnQoQ29sb3JbXSBjb2xvciwgaW50W10gcGVyY2VudHMpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZQorCSAqIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLmNzcy5zd3QuSUNUYWJSZW5kZXJpbmcjc2V0Q29ybmVyUmFkaXVzKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb3JuZXJSYWRpdXMoaW50IHJhZGl1cykgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlCisJICogb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwuY3NzLnN3dC5JQ1RhYlJlbmRlcmluZyNzZXRTaGFkb3dWaXNpYmxlKGJvb2xlYW4KKwkgKiApCisJICovCisJcHVibGljIHZvaWQgc2V0U2hhZG93VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJfQorCS8qCisJICogLy8gQ29uc3RhbnRzIGZvciBjaXJjbGUgZHJhd2luZyBmaW5hbCBzdGF0aWMgaW50IExFRlRfVE9QID0gMDsgZmluYWwKKwkgKiBzdGF0aWMgaW50IExFRlRfQk9UVE9NID0gMTsgZmluYWwgc3RhdGljIGludCBSSUdIVF9UT1AgPSAyOyBmaW5hbCBzdGF0aWMKKwkgKiBpbnQgUklHSFRfQk9UVE9NID0gMzsKKwkgKiAKKwkgKiAvLyBkcm9wIHNoYWRvdyBjb25zdGFudHMgZmluYWwgc3RhdGljIGludCBTSURFX0RST1BfV0lEVEggPSAzOyBmaW5hbAorCSAqIHN0YXRpYyBpbnQgQk9UVE9NX0RST1BfV0lEVEggPSA0OworCSAqIAorCSAqIC8vIGtleWxpbmVzIGZpbmFsIHN0YXRpYyBpbnQgT1VURVJfS0VZTElORSA9IDE7IGZpbmFsIHN0YXRpYyBpbnQKKwkgKiBJTk5FUl9LRVlMSU5FID0gMDsgZmluYWwgc3RhdGljIGludCBUT1BfS0VZTElORSA9IDA7CisJICogCisJICogLy8gSXRlbSBDb25zdGFudHMgc3RhdGljIGZpbmFsIGludCBJVEVNX1RPUF9NQVJHSU4gPSAyOyBzdGF0aWMgZmluYWwgaW50CisJICogSVRFTV9CT1RUT01fTUFSR0lOID0gNjsgc3RhdGljIGZpbmFsIGludCBJVEVNX0xFRlRfTUFSR0lOID0gNDsgc3RhdGljCisJICogZmluYWwgaW50IElURU1fUklHSFRfTUFSR0lOID0gNDsgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9TUEFDSU5HID0gNDsKKwkgKiAKKwkgKiBzdGF0aWMgZmluYWwgU3RyaW5nIEU0X1RPT0xCQVJfQUNUSVZFX0lNQUdFID0KKwkgKiAib3JnLmVjbGlwc2UuZTQucmVuZGVyZXIudG9vbGJhcl9iYWNrZ3JvdW5kX2FjdGl2ZV9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKwkgKiBzdGF0aWMgZmluYWwgU3RyaW5nIEU0X1RPT0xCQVJfSU5BQ1RJVkVfSU1BR0UgPQorCSAqICJvcmcuZWNsaXBzZS5lNC5yZW5kZXJlci50b29sYmFyX2JhY2tncm91bmRfaW5hY3RpdmVfaW1hZ2UiOworCSAqIC8vJE5PTi1OTFMtMSQKKwkgKiAKKwkgKiBpbnRbXSBzaGFwZTsKKwkgKiAKKwkgKiBJbWFnZSBzaGFkb3dJbWFnZSwgdG9vbGJhckFjdGl2ZUltYWdlLCB0b29sYmFySW5hY3RpdmVJbWFnZTsKKwkgKiAKKwkgKiBpbnQgY29ybmVyU2l6ZSA9IDE0OworCSAqIAorCSAqIGJvb2xlYW4gc2hhZG93RW5hYmxlZCA9IHRydWU7IENvbG9yIHNoYWRvd0NvbG9yOyBDb2xvciBvdXRlcktleWxpbmUsCisJICogaW5uZXJLZXlsaW5lOyBDb2xvcltdIGFjdGl2ZVRvb2xiYXI7IGludFtdIGFjdGl2ZVBlcmNlbnRzOyBDb2xvcltdCisJICogaW5hY3RpdmVUb29sYmFyOyBpbnRbXSBpbmFjdGl2ZVBlcmNlbnRzOyBib29sZWFuIGFjdGl2ZTsgQ29sb3IKKwkgKiBzZWxlY3RlZFRhYkZpbGxDb2xvcjsgQ29sb3IgdGFiT3V0bGluZUNvbG9yOworCSAqIAorCSAqIGludCBwYWRkaW5nTGVmdCA9IDAsIHBhZGRpbmdSaWdodCA9IDAsIHBhZGRpbmdUb3AgPSAwLCBwYWRkaW5nQm90dG9tID0gMDsKKwkgKiAKKwkgKiBASW5qZWN0IHB1YmxpYyBDVGFiUmVuZGVyaW5nKENUYWJGb2xkZXIgcGFyZW50KSB7IHN1cGVyKHBhcmVudCk7IH0KKwkgKiAKKwkgKiBwcm90ZWN0ZWQgUmVjdGFuZ2xlIGNvbXB1dGVUcmltKGludCBwYXJ0LCBpbnQgc3RhdGUsIGludCB4LCBpbnQgeSwgaW50CisJICogd2lkdGgsIGludCBoZWlnaHQpIHsgYm9vbGVhbiBvbkJvdHRvbSA9IHBhcmVudC5nZXRUYWJQb3NpdGlvbigpID09CisJICogU1dULkJPVFRPTTsgaW50IGJvcmRlclRvcCA9IG9uQm90dG9tID8gSU5ORVJfS0VZTElORSArIE9VVEVSX0tFWUxJTkUgOgorCSAqIFRPUF9LRVlMSU5FICsgT1VURVJfS0VZTElORTsgaW50IGJvcmRlckJvdHRvbSA9IG9uQm90dG9tID8gVE9QX0tFWUxJTkUgKworCSAqIE9VVEVSX0tFWUxJTkUgOiBJTk5FUl9LRVlMSU5FICsgT1VURVJfS0VZTElORTsgaW50IG1hcmdpbldpZHRoID0KKwkgKiBwYXJlbnQubWFyZ2luV2lkdGg7IGludCBtYXJnaW5IZWlnaHQgPSBwYXJlbnQubWFyZ2luSGVpZ2h0OyBpbnQKKwkgKiBzaWRlRHJvcFdpZHRoID0gc2hhZG93RW5hYmxlZCA/IFNJREVfRFJPUF9XSURUSCA6IDA7IHN3aXRjaCAocGFydCkgeyBjYXNlCisJICogUEFSVF9CT0RZOiBpZiAoc3RhdGUgPT0gU1dULkZJTEwpIHsgeCA9IC0xIC0gcGFkZGluZ0xlZnQ7IGludCB0YWJIZWlnaHQgPQorCSAqIHBhcmVudC5nZXRUYWJIZWlnaHQoKSArIDE7IHkgPSBvbkJvdHRvbSA/IHkgLSBwYWRkaW5nVG9wIC0gbWFyZ2luSGVpZ2h0IC0KKwkgKiBib3JkZXJUb3AgLSAoY29ybmVyU2l6ZSAvIDQpIDogeSAtIHBhZGRpbmdUb3AgLSBtYXJnaW5IZWlnaHQgLSB0YWJIZWlnaHQKKwkgKiAtIGJvcmRlclRvcCAtIChjb3JuZXJTaXplIC8gNCk7IHdpZHRoID0gMiArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0OworCSAqIGhlaWdodCArPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTsgaGVpZ2h0ICs9IHRhYkhlaWdodCArIChjb3JuZXJTaXplIC8KKwkgKiA0KSArIGJvcmRlckJvdHRvbSArIGJvcmRlclRvcDsgfSBlbHNlIHsgeCA9IHggLSBtYXJnaW5XaWR0aCAtCisJICogT1VURVJfS0VZTElORSAtIElOTkVSX0tFWUxJTkUgLSBzaWRlRHJvcFdpZHRoIC0gKGNvcm5lclNpemUgLyAyKTsgd2lkdGggPQorCSAqIHdpZHRoICsgMiAqIE9VVEVSX0tFWUxJTkUgKyAyICogSU5ORVJfS0VZTElORSArIDIgbWFyZ2luV2lkdGggKyAyICoKKwkgKiBzaWRlRHJvcFdpZHRoICsgY29ybmVyU2l6ZTsgaW50IHRhYkhlaWdodCA9IHBhcmVudC5nZXRUYWJIZWlnaHQoKSArIDE7IC8vCisJICogVE9ETzogRmlndXJlIG91dCAvLyB3aGF0IC8vIHRvIGRvIGFib3V0IHRoZSAvLyArMSAvLyBUT0RPOiBGaXggaWYKKwkgKiAocGFyZW50LmdldE1pbmltaXplZCgpKSB7IHkgPSBvbkJvdHRvbSA/IHkgLSBib3JkZXJUb3AgLSA1IDogeSAtCisJICogdGFiSGVpZ2h0IC0gYm9yZGVyVG9wIC0gNTsgaGVpZ2h0ID0gYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tICsgdGFiSGVpZ2h0OworCSAqIH0gZWxzZSB7IC8vIHkgPSB0YWJGb2xkZXIub25Cb3R0b20gPyB5IC0gbWFyZ2luSGVpZ2h0IC0gLy8KKwkgKiBoaWdobGlnaHRfbWFyZ2luIC8vIC0gYm9yZGVyVG9wOiB5IC0gbWFyZ2luSGVpZ2h0IC0gaGlnaGxpZ2h0X2hlYWRlciAtIC8vCisJICogdGFiSGVpZ2h0IC8vIC0gYm9yZGVyVG9wOyB5ID0gb25Cb3R0b20gPyB5IC0gbWFyZ2luSGVpZ2h0IC0gYm9yZGVyVG9wIC0KKwkgKiAoY29ybmVyU2l6ZSAvIDQpIDogeSAtIG1hcmdpbkhlaWdodCAtIHRhYkhlaWdodCAtIGJvcmRlclRvcCAtIChjb3JuZXJTaXplCisJICogLyA0KTsgaGVpZ2h0ID0gaGVpZ2h0ICsgYm9yZGVyQm90dG9tICsgYm9yZGVyVG9wICsgMiBtYXJnaW5IZWlnaHQgKworCSAqIHRhYkhlaWdodCArIGNvcm5lclNpemUgLyAyICsgY29ybmVyU2l6ZSAvIDQgKyAoc2hhZG93RW5hYmxlZCA/CisJICogQk9UVE9NX0RST1BfV0lEVEggOiAwKTsgfSB9IGJyZWFrOyBjYXNlIFBBUlRfSEVBREVSOiB4ID0geCAtCisJICogKElOTkVSX0tFWUxJTkUgKyBPVVRFUl9LRVlMSU5FKSAtIHNpZGVEcm9wV2lkdGg7IHdpZHRoID0gd2lkdGggKyAyICoKKwkgKiAoSU5ORVJfS0VZTElORSArIE9VVEVSX0tFWUxJTkUgKyBzaWRlRHJvcFdpZHRoKTsKKwkgKiAKKwkgKiBicmVhazsgY2FzZSBQQVJUX0JPUkRFUjogeCA9IHggLSBJTk5FUl9LRVlMSU5FIC0gT1VURVJfS0VZTElORSAtCisJICogc2lkZURyb3BXaWR0aCAtIChjb3JuZXJTaXplIC8gNCk7IHdpZHRoID0gd2lkdGggKyAyICogKElOTkVSX0tFWUxJTkUgKworCSAqIE9VVEVSX0tFWUxJTkUgKyBzaWRlRHJvcFdpZHRoKSArIGNvcm5lclNpemUgLyAyOyBoZWlnaHQgPSBoZWlnaHQgKworCSAqIGJvcmRlclRvcCArIGJvcmRlckJvdHRvbTsgeSA9IHkgLSBib3JkZXJUb3A7IGlmIChvbkJvdHRvbSkgeyBpZgorCSAqIChzaGFkb3dFbmFibGVkKSB7IGhlaWdodCArPSAzOyB9IH0KKwkgKiAKKwkgKiBicmVhazsgZGVmYXVsdDogaWYgKDAgPD0gcGFydCAmJiBwYXJ0IDwgcGFyZW50LmdldEl0ZW1Db3VudCgpKSB7IHggPSB4IC0KKwkgKiBJVEVNX0xFRlRfTUFSR0lOOy8vIC0gKENPUk5FUl9TSVpFLzIpOyB3aWR0aCA9IHdpZHRoICsgSVRFTV9MRUZUX01BUkdJTiArCisJICogSVRFTV9SSUdIVF9NQVJHSU4gKyAxOyB5ID0geSAtIElURU1fVE9QX01BUkdJTjsgaGVpZ2h0ID0gaGVpZ2h0ICsKKwkgKiBJVEVNX1RPUF9NQVJHSU4gKyBJVEVNX0JPVFRPTV9NQVJHSU47IH0gYnJlYWs7IH0gcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwKKwkgKiB5LCB3aWR0aCwgaGVpZ2h0KTsgfQorCSAqIAorCSAqIHByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShpbnQgcGFydCwgaW50IHN0YXRlLCBHQyBnYywgaW50IHdIaW50LCBpbnQKKwkgKiBoSGludCkgeyB3SGludCArPSBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodDsgaEhpbnQgKz0gcGFkZGluZ1RvcCArCisJICogcGFkZGluZ0JvdHRvbTsgaWYgKDAgPD0gcGFydCAmJiBwYXJ0IDwgcGFyZW50LmdldEl0ZW1Db3VudCgpKSB7CisJICogZ2Muc2V0QWR2YW5jZWQodHJ1ZSk7IFBvaW50IHJlc3VsdCA9IHN1cGVyLmNvbXB1dGVTaXplKHBhcnQsIHN0YXRlLCBnYywKKwkgKiB3SGludCwgaEhpbnQpOyByZXR1cm4gcmVzdWx0OyB9IHJldHVybiBzdXBlci5jb21wdXRlU2l6ZShwYXJ0LCBzdGF0ZSwgZ2MsCisJICogd0hpbnQsIGhIaW50KTsgfQorCSAqIAorCSAqIHByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7IGlmIChzaGFkb3dJbWFnZSAhPSBudWxsICYmCisJICogIXNoYWRvd0ltYWdlLmlzRGlzcG9zZWQoKSkgeyBzaGFkb3dJbWFnZS5kaXNwb3NlKCk7IHNoYWRvd0ltYWdlID0gbnVsbDsgfQorCSAqIHN1cGVyLmRpc3Bvc2UoKTsgfQorCSAqIAorCSAqIHByb3RlY3RlZCB2b2lkIGRyYXcoaW50IHBhcnQsIGludCBzdGF0ZSwgUmVjdGFuZ2xlIGJvdW5kcywgR0MgZ2MpIHsKKwkgKiAKKwkgKiBzd2l0Y2ggKHBhcnQpIHsgY2FzZSBQQVJUX0JPRFk6IHRoaXMuZHJhd1RhYkJvZHkoZ2MsIGJvdW5kcywgc3RhdGUpOworCSAqIHJldHVybjsgY2FzZSBQQVJUX0hFQURFUjogdGhpcy5kcmF3VGFiSGVhZGVyKGdjLCBib3VuZHMsIHN0YXRlKTsgcmV0dXJuOworCSAqIGRlZmF1bHQ6IGlmICgwIDw9IHBhcnQgJiYgcGFydCA8IHBhcmVudC5nZXRJdGVtQ291bnQoKSkgeworCSAqIGdjLnNldEFkdmFuY2VkKHRydWUpOyBpZiAoYm91bmRzLndpZHRoID09IDAgfHwgYm91bmRzLmhlaWdodCA9PSAwKQorCSAqIHJldHVybjsgaWYgKChzdGF0ZSAmIFNXVC5TRUxFQ1RFRCkgIT0gMCkgeyBkcmF3U2VsZWN0ZWRUYWIocGFydCwgZ2MsCisJICogYm91bmRzLCBzdGF0ZSk7IHN0YXRlICY9IH5TV1QuQkFDS0dST1VORDsgc3VwZXIuZHJhdyhwYXJ0LCBzdGF0ZSwgYm91bmRzLAorCSAqIGdjKTsgfSBlbHNlIHsgZHJhd1Vuc2VsZWN0ZWRUYWIocGFydCwgZ2MsIGJvdW5kcywgc3RhdGUpOyBpZiAoKHN0YXRlICYKKwkgKiBTV1QuSE9UKSA9PSAwICYmICFhY3RpdmUpIHsgZ2Muc2V0QWxwaGEoMHg3Zik7IHN0YXRlICY9IH5TV1QuQkFDS0dST1VORDsKKwkgKiBzdXBlci5kcmF3KHBhcnQsIHN0YXRlLCBib3VuZHMsIGdjKTsgZ2Muc2V0QWxwaGEoMHhmZik7IH0gZWxzZSB7IHN0YXRlICY9CisJICogflNXVC5CQUNLR1JPVU5EOyBzdXBlci5kcmF3KHBhcnQsIHN0YXRlLCBib3VuZHMsIGdjKTsgfSB9IHJldHVybjsgfSB9CisJICogc3VwZXIuZHJhdyhwYXJ0LCBzdGF0ZSwgYm91bmRzLCBnYyk7IH0KKwkgKiAKKwkgKiB2b2lkIGRyYXdUYWJIZWFkZXIoR0MgZ2MsIFJlY3RhbmdsZSBib3VuZHMsIGludCBzdGF0ZSkgeyAvLworCSAqIGdjLnNldENsaXBwaW5nKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCAvLyBwYXJlbnQuZ2V0VGFiSGVpZ2h0KCkKKwkgKiArIDEpOworCSAqIAorCSAqIGJvb2xlYW4gb25Cb3R0b20gPSBwYXJlbnQuZ2V0VGFiUG9zaXRpb24oKSA9PSBTV1QuQk9UVE9NOyBpbnRbXSBwb2ludHMgPQorCSAqIG5ldyBpbnRbMTAyNF07IGludCBpbmRleCA9IDA7IGludCByYWRpdXMgPSBjb3JuZXJTaXplIC8gMjsgaW50CisJICogbWFyZ2luV2lkdGggPSBwYXJlbnQubWFyZ2luV2lkdGg7IGludCBtYXJnaW5IZWlnaHQgPSBwYXJlbnQubWFyZ2luSGVpZ2h0OworCSAqIGludCBkZWx0YSA9IElOTkVSX0tFWUxJTkUgKyBPVVRFUl9LRVlMSU5FICsgMiAoc2hhZG93RW5hYmxlZCA/CisJICogU0lERV9EUk9QX1dJRFRIIDogMCkgKyAyICogbWFyZ2luV2lkdGg7IGludCB3aWR0aCA9IGJvdW5kcy53aWR0aCAtIGRlbHRhOworCSAqIGludCBoZWlnaHQgPSBib3VuZHMuaGVpZ2h0IC0gSU5ORVJfS0VZTElORSAtIE9VVEVSX0tFWUxJTkUgLSAyCisJICogbWFyZ2luSGVpZ2h0IC0gKHNoYWRvd0VuYWJsZWQgPyBCT1RUT01fRFJPUF9XSURUSCA6IDApOyBpbnQgY2lyY1ggPQorCSAqIGJvdW5kcy54ICsgZGVsdGEgLyAyICsgcmFkaXVzOyBpbnQgY2lyY1kgPSBib3VuZHMueSArIHJhZGl1czsKKwkgKiAKKwkgKiAvLyBGaWxsIGluIGJhY2tncm91bmQgUmVnaW9uIGNsaXBwaW5nID0gbmV3IFJlZ2lvbigpOworCSAqIGdjLmdldENsaXBwaW5nKGNsaXBwaW5nKTsgUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKwkgKiByZWdpb24uYWRkKHNoYXBlKTsgcmVnaW9uLmludGVyc2VjdChjbGlwcGluZyk7IGdjLnNldENsaXBwaW5nKHJlZ2lvbik7CisJICogCisJICogaW50IGhlYWRlciA9IHNoYWRvd0VuYWJsZWQgPyBvbkJvdHRvbSA/IDYgOiAzIDogMTsgLy8gVE9ETzogdGhpcyBuZWVkcyAvLworCSAqIHRvIGJlIGFkZGVkIHRvIC8vIGNvbXB1dGVUcmltIGZvciAvLyBIRUFERVIgUmVjdGFuZ2xlIHRyaW0gPQorCSAqIGNvbXB1dGVUcmltKFBBUlRfSEVBREVSLCBzdGF0ZSwgMCwgMCwgMCwgMCk7IHRyaW0ud2lkdGggPSBib3VuZHMud2lkdGggLQorCSAqIHRyaW0ud2lkdGg7CisJICogCisJICogLy8gWFhYOiBUaGUgbWFnaWMgbnVtYmVycyBuZWVkIHRvIGJlIGNsZWFuZWQgdXAuIFNlZQorCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy80MjU3NzcgZm9yIGRldGFpbHMuIHRyaW0uaGVpZ2h0ID0KKwkgKiAocGFyZW50LmdldFRhYkhlaWdodCgpICsgKG9uQm90dG9tID8gNyA6IDQpKSAtIHRyaW0uaGVpZ2h0OworCSAqIAorCSAqIHRyaW0ueCA9IC10cmltLng7IHRyaW0ueSA9IG9uQm90dG9tID8gYm91bmRzLmhlaWdodCAtCisJICogcGFyZW50LmdldFRhYkhlaWdodCgpIC0gMSAtIGhlYWRlciA6IC10cmltLnk7IGRyYXcoUEFSVF9CQUNLR1JPVU5ELAorCSAqIFNXVC5OT05FLCB0cmltLCBnYyk7CisJICogCisJICogZ2Muc2V0Q2xpcHBpbmcoY2xpcHBpbmcpOyBjbGlwcGluZy5kaXNwb3NlKCk7IHJlZ2lvbi5kaXNwb3NlKCk7CisJICogCisJICogaW50W10gbHR0ID0gZHJhd0NpcmNsZShjaXJjWCArIDEsIGNpcmNZICsgMSwgcmFkaXVzLCBMRUZUX1RPUCk7CisJICogU3lzdGVtLmFycmF5Y29weShsdHQsIDAsIHBvaW50cywgaW5kZXgsIGx0dC5sZW5ndGgpOyBpbmRleCArPSBsdHQubGVuZ3RoOworCSAqIAorCSAqIGludFtdIGxiYiA9IGRyYXdDaXJjbGUoY2lyY1ggKyAxLCBjaXJjWSArIGhlaWdodCAtIChyYWRpdXMgKiAyKSAtIDIsCisJICogcmFkaXVzLCBMRUZUX0JPVFRPTSk7IFN5c3RlbS5hcnJheWNvcHkobGJiLCAwLCBwb2ludHMsIGluZGV4LAorCSAqIGxiYi5sZW5ndGgpOyBpbmRleCArPSBsYmIubGVuZ3RoOworCSAqIAorCSAqIGludFtdIHJiID0gZHJhd0NpcmNsZShjaXJjWCArIHdpZHRoIC0gKHJhZGl1cyAqIDIpIC0gMiwgY2lyY1kgKyBoZWlnaHQgLQorCSAqIChyYWRpdXMgKiAyKSAtIDIsIHJhZGl1cywgUklHSFRfQk9UVE9NKTsgU3lzdGVtLmFycmF5Y29weShyYiwgMCwgcG9pbnRzLAorCSAqIGluZGV4LCByYi5sZW5ndGgpOyBpbmRleCArPSByYi5sZW5ndGg7CisJICogCisJICogaW50W10gcnQgPSBkcmF3Q2lyY2xlKGNpcmNYICsgd2lkdGggLSAocmFkaXVzICogMikgLSAyLCBjaXJjWSArIDEsCisJICogcmFkaXVzLCBSSUdIVF9UT1ApOyBTeXN0ZW0uYXJyYXljb3B5KHJ0LCAwLCBwb2ludHMsIGluZGV4LCBydC5sZW5ndGgpOworCSAqIGluZGV4ICs9IHJ0Lmxlbmd0aDsgcG9pbnRzW2luZGV4KytdID0gcG9pbnRzWzBdOyBwb2ludHNbaW5kZXgrK10gPQorCSAqIHBvaW50c1sxXTsKKwkgKiAKKwkgKiBpbnRbXSB0ZW1wUG9pbnRzID0gbmV3IGludFtpbmRleF07IFN5c3RlbS5hcnJheWNvcHkocG9pbnRzLCAwLAorCSAqIHRlbXBQb2ludHMsIDAsIGluZGV4KTsKKwkgKiAKKwkgKiBpZiAob3V0ZXJLZXlsaW5lID09IG51bGwpIG91dGVyS2V5bGluZSA9CisJICogZ2MuZ2V0RGV2aWNlKCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKKwkgKiBnYy5zZXRGb3JlZ3JvdW5kKG91dGVyS2V5bGluZSk7IGdjLmRyYXdQb2x5bGluZShzaGFwZSk7IH0KKwkgKiAKKwkgKiB2b2lkIGRyYXdUYWJCb2R5KEdDIGdjLCBSZWN0YW5nbGUgYm91bmRzLCBpbnQgc3RhdGUpIHsgaW50W10gcG9pbnRzID0gbmV3CisJICogaW50WzEwMjRdOyBpbnQgaW5kZXggPSAwOyBpbnQgcmFkaXVzID0gY29ybmVyU2l6ZSAvIDI7IGludCBtYXJnaW5XaWR0aCA9CisJICogcGFyZW50Lm1hcmdpbldpZHRoOyBpbnQgbWFyZ2luSGVpZ2h0ID0gcGFyZW50Lm1hcmdpbkhlaWdodDsgaW50IGRlbHRhID0KKwkgKiBJTk5FUl9LRVlMSU5FICsgT1VURVJfS0VZTElORSArIDIgKHNoYWRvd0VuYWJsZWQgPyBTSURFX0RST1BfV0lEVEggOiAwKSArCisJICogMiAqIG1hcmdpbldpZHRoOyBpbnQgd2lkdGggPSBib3VuZHMud2lkdGggLSBkZWx0YTsgaW50IGhlaWdodCA9CisJICogTWF0aC5tYXgocGFyZW50LmdldFRhYkhlaWdodCgpICsgSU5ORVJfS0VZTElORSArIE9VVEVSX0tFWUxJTkUgKworCSAqIChzaGFkb3dFbmFibGVkID8gQk9UVE9NX0RST1BfV0lEVEggOiAwKSwgYm91bmRzLmhlaWdodCAtIElOTkVSX0tFWUxJTkUgLQorCSAqIE9VVEVSX0tFWUxJTkUgLSAyIG1hcmdpbkhlaWdodCAtIChzaGFkb3dFbmFibGVkID8gQk9UVE9NX0RST1BfV0lEVEggOgorCSAqIDApKTsKKwkgKiAKKwkgKiBpbnQgY2lyY1ggPSBib3VuZHMueCArIGRlbHRhIC8gMiArIHJhZGl1czsgaW50IGNpcmNZID0gYm91bmRzLnkgKyByYWRpdXM7CisJICogCisJICogLy8gQm9keSBpbmRleCA9IDA7IGludFtdIGx0dCA9IGRyYXdDaXJjbGUoY2lyY1gsIGNpcmNZLCByYWRpdXMsCisJICogTEVGVF9UT1ApOyBTeXN0ZW0uYXJyYXljb3B5KGx0dCwgMCwgcG9pbnRzLCBpbmRleCwgbHR0Lmxlbmd0aCk7IGluZGV4ICs9CisJICogbHR0Lmxlbmd0aDsKKwkgKiAKKwkgKiBpbnRbXSBsYmIgPSBkcmF3Q2lyY2xlKGNpcmNYLCBjaXJjWSArIGhlaWdodCAtIChyYWRpdXMgKiAyKSwgcmFkaXVzLAorCSAqIExFRlRfQk9UVE9NKTsgU3lzdGVtLmFycmF5Y29weShsYmIsIDAsIHBvaW50cywgaW5kZXgsIGxiYi5sZW5ndGgpOyBpbmRleAorCSAqICs9IGxiYi5sZW5ndGg7CisJICogCisJICogaW50W10gcmIgPSBkcmF3Q2lyY2xlKGNpcmNYICsgd2lkdGggLSAocmFkaXVzICogMiksIGNpcmNZICsgaGVpZ2h0IC0KKwkgKiAocmFkaXVzICogMiksIHJhZGl1cywgUklHSFRfQk9UVE9NKTsgU3lzdGVtLmFycmF5Y29weShyYiwgMCwgcG9pbnRzLAorCSAqIGluZGV4LCByYi5sZW5ndGgpOyBpbmRleCArPSByYi5sZW5ndGg7CisJICogCisJICogaW50W10gcnQgPSBkcmF3Q2lyY2xlKGNpcmNYICsgd2lkdGggLSAocmFkaXVzICogMiksIGNpcmNZLCByYWRpdXMsCisJICogUklHSFRfVE9QKTsgU3lzdGVtLmFycmF5Y29weShydCwgMCwgcG9pbnRzLCBpbmRleCwgcnQubGVuZ3RoKTsgaW5kZXggKz0KKwkgKiBydC5sZW5ndGg7IHBvaW50c1tpbmRleCsrXSA9IGNpcmNYOyBwb2ludHNbaW5kZXgrK10gPSBjaXJjWSAtIHJhZGl1czsKKwkgKiAKKwkgKiBpbnRbXSB0ZW1wUG9pbnRzID0gbmV3IGludFtpbmRleF07IFN5c3RlbS5hcnJheWNvcHkocG9pbnRzLCAwLAorCSAqIHRlbXBQb2ludHMsIDAsIGluZGV4KTsgZ2MuZmlsbFBvbHlnb24odGVtcFBvaW50cyk7CisJICogCisJICogLy8gRmlsbCBpbiBwYXJlbnQgYmFja2dyb3VuZCBmb3Igbm9uLXJlY3Rhbmd1bGFyIHNoYXBlIFJlZ2lvbiByID0gbmV3CisJICogUmVnaW9uKCk7IHIuYWRkKGJvdW5kcyk7IHIuc3VidHJhY3QodGVtcFBvaW50cyk7CisJICogZ2Muc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZCgpKTsgRGlzcGxheSBkaXNwbGF5ID0KKwkgKiBwYXJlbnQuZ2V0RGlzcGxheSgpOyBSZWdpb24gY2xpcHBpbmcgPSBuZXcgUmVnaW9uKCk7CisJICogZ2MuZ2V0Q2xpcHBpbmcoY2xpcHBpbmcpOyByLmludGVyc2VjdChjbGlwcGluZyk7IGdjLnNldENsaXBwaW5nKHIpOworCSAqIFJlY3RhbmdsZSBtYXBwZWRCb3VuZHMgPSBkaXNwbGF5IC5tYXAocGFyZW50LCBwYXJlbnQuZ2V0UGFyZW50KCksCisJICogYm91bmRzKTsgcGFyZW50LmdldFBhcmVudCgpLmRyYXdCYWNrZ3JvdW5kKGdjLCBib3VuZHMueCwgYm91bmRzLnksCisJICogYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBtYXBwZWRCb3VuZHMueCwgbWFwcGVkQm91bmRzLnkpOworCSAqIAorCSAqIC8vIFNoYWRvdyBpZiAoc2hhZG93RW5hYmxlZCkgZHJhd1NoYWRvdyhkaXNwbGF5LCBib3VuZHMsIGdjKTsKKwkgKiAKKwkgKiBnYy5zZXRDbGlwcGluZyhjbGlwcGluZyk7IGNsaXBwaW5nLmRpc3Bvc2UoKTsgci5kaXNwb3NlKCk7CisJICogCisJICogLy8gUmVtZW1iZXIgZm9yIHVzZSBpbiBoZWFkZXIgZHJhd2luZyBzaGFwZSA9IHRlbXBQb2ludHM7IH0KKwkgKiAKKwkgKiB2b2lkIGRyYXdTZWxlY3RlZFRhYihpbnQgaXRlbUluZGV4LCBHQyBnYywgUmVjdGFuZ2xlIGJvdW5kcywgaW50IHN0YXRlKSB7CisJICogaWYgKHBhcmVudC5nZXRTaW5nbGUoKSAmJiBwYXJlbnQuZ2V0SXRlbShpdGVtSW5kZXgpLmlzU2hvd2luZygpKSByZXR1cm47CisJICogCisJICogYm9vbGVhbiBvbkJvdHRvbSA9IHBhcmVudC5nZXRUYWJQb3NpdGlvbigpID09IFNXVC5CT1RUT007IGludCBoZWFkZXIgPQorCSAqIHNoYWRvd0VuYWJsZWQgPyAyIDogMDsgaW50IHdpZHRoID0gYm91bmRzLndpZHRoOyBpbnRbXSBwb2ludHMgPSBuZXcKKwkgKiBpbnRbMTAyNF07IGludCBpbmRleCA9IDA7IGludCByYWRpdXMgPSBjb3JuZXJTaXplIC8gMjsgaW50IGNpcmNYID0KKwkgKiBib3VuZHMueCArIHJhZGl1czsgaW50IGNpcmNZID0gb25Cb3R0b20gPyBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgKyAxIC0KKwkgKiBoZWFkZXIgLSByYWRpdXMgOiBib3VuZHMueSAtIDEgKyByYWRpdXM7IGludCBzZWxlY3Rpb25YMSwgc2VsZWN0aW9uWTEsCisJICogc2VsZWN0aW9uWDIsIHNlbGVjdGlvblkyOyBpbnQgYm90dG9tWSA9IG9uQm90dG9tID8gYm91bmRzLnkgLSBoZWFkZXIgOgorCSAqIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDsgaWYgKGl0ZW1JbmRleCA9PSAwICYmIGJvdW5kcy54ID09CisJICogLWNvbXB1dGVUcmltKENUYWJGb2xkZXJSZW5kZXJlci5QQVJUX0hFQURFUiwgU1dULk5PTkUsIDAsIDAsIDAsIDApLngpIHsKKwkgKiBjaXJjWCAtPSAxOyBwb2ludHNbaW5kZXgrK10gPSBjaXJjWCAtIHJhZGl1czsgcG9pbnRzW2luZGV4KytdID0gYm90dG9tWTsKKwkgKiAKKwkgKiBwb2ludHNbaW5kZXgrK10gPSBzZWxlY3Rpb25YMSA9IGNpcmNYIC0gcmFkaXVzOyBwb2ludHNbaW5kZXgrK10gPQorCSAqIHNlbGVjdGlvblkxID0gYm90dG9tWTsgfSBlbHNlIHsgaWYgKGFjdGl2ZSkgeyBwb2ludHNbaW5kZXgrK10gPQorCSAqIHNoYWRvd0VuYWJsZWQgPyBTSURFX0RST1BfV0lEVEggOiAwICsgSU5ORVJfS0VZTElORSArIE9VVEVSX0tFWUxJTkU7CisJICogcG9pbnRzW2luZGV4KytdID0gYm90dG9tWTsgfSBwb2ludHNbaW5kZXgrK10gPSBzZWxlY3Rpb25YMSA9IGJvdW5kcy54OworCSAqIHBvaW50c1tpbmRleCsrXSA9IHNlbGVjdGlvblkxID0gYm90dG9tWTsgfQorCSAqIAorCSAqIGludCBzdGFydFggPSAtMSwgZW5kWCA9IC0xOyBpZiAoIW9uQm90dG9tKSB7IGludFtdIGx0dCA9CisJICogZHJhd0NpcmNsZShjaXJjWCwgY2lyY1ksIHJhZGl1cywgTEVGVF9UT1ApOyBzdGFydFggPSBsdHRbNl07IGZvciAoaW50IGkgPQorCSAqIDA7IGkgPCBsdHQubGVuZ3RoIC8gMjsgaSArPSAyKSB7IGludCB0bXAgPSBsdHRbaV07IGx0dFtpXSA9CisJICogbHR0W2x0dC5sZW5ndGggLSBpIC0gMl07IGx0dFtsdHQubGVuZ3RoIC0gaSAtIDJdID0gdG1wOyB0bXAgPSBsdHRbaSArIDFdOworCSAqIGx0dFtpICsgMV0gPSBsdHRbbHR0Lmxlbmd0aCAtIGkgLSAxXTsgbHR0W2x0dC5sZW5ndGggLSBpIC0gMV0gPSB0bXA7IH0KKwkgKiBTeXN0ZW0uYXJyYXljb3B5KGx0dCwgMCwgcG9pbnRzLCBpbmRleCwgbHR0Lmxlbmd0aCk7IGluZGV4ICs9IGx0dC5sZW5ndGg7CisJICogCisJICogaW50W10gcnQgPSBkcmF3Q2lyY2xlKGNpcmNYICsgd2lkdGggLSAocmFkaXVzICogMiksIGNpcmNZLCByYWRpdXMsCisJICogUklHSFRfVE9QKTsgZW5kWCA9IHJ0W3J0Lmxlbmd0aCAtIDRdOyBmb3IgKGludCBpID0gMDsgaSA8IHJ0Lmxlbmd0aCAvIDI7CisJICogaSArPSAyKSB7IGludCB0bXAgPSBydFtpXTsgcnRbaV0gPSBydFtydC5sZW5ndGggLSBpIC0gMl07IHJ0W3J0Lmxlbmd0aCAtCisJICogaSAtIDJdID0gdG1wOyB0bXAgPSBydFtpICsgMV07IHJ0W2kgKyAxXSA9IHJ0W3J0Lmxlbmd0aCAtIGkgLSAxXTsKKwkgKiBydFtydC5sZW5ndGggLSBpIC0gMV0gPSB0bXA7IH0gU3lzdGVtLmFycmF5Y29weShydCwgMCwgcG9pbnRzLCBpbmRleCwKKwkgKiBydC5sZW5ndGgpOyBpbmRleCArPSBydC5sZW5ndGg7CisJICogCisJICogcG9pbnRzW2luZGV4KytdID0gc2VsZWN0aW9uWDIgPSBib3VuZHMud2lkdGggKyBjaXJjWCAtIHJhZGl1czsKKwkgKiBwb2ludHNbaW5kZXgrK10gPSBzZWxlY3Rpb25ZMiA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDsgfSBlbHNlIHsgaW50W10KKwkgKiBsdHQgPSBkcmF3Q2lyY2xlKGNpcmNYLCBjaXJjWSwgcmFkaXVzLCBMRUZUX0JPVFRPTSk7IHN0YXJ0WCA9IGx0dFs2XTsKKwkgKiBTeXN0ZW0uYXJyYXljb3B5KGx0dCwgMCwgcG9pbnRzLCBpbmRleCwgbHR0Lmxlbmd0aCk7IGluZGV4ICs9IGx0dC5sZW5ndGg7CisJICogCisJICogaW50W10gcnQgPSBkcmF3Q2lyY2xlKGNpcmNYICsgd2lkdGggLSAocmFkaXVzICogMiksIGNpcmNZLCByYWRpdXMsCisJICogUklHSFRfQk9UVE9NKTsgZW5kWCA9IHJ0W3J0Lmxlbmd0aCAtIDRdOyBTeXN0ZW0uYXJyYXljb3B5KHJ0LCAwLCBwb2ludHMsCisJICogaW5kZXgsIHJ0Lmxlbmd0aCk7IGluZGV4ICs9IHJ0Lmxlbmd0aDsKKwkgKiAKKwkgKiBwb2ludHNbaW5kZXgrK10gPSBzZWxlY3Rpb25YMiA9IGJvdW5kcy53aWR0aCArIGNpcmNYIC0gcmFkaXVzOworCSAqIHBvaW50c1tpbmRleCsrXSA9IHNlbGVjdGlvblkyID0gYm90dG9tWTsgfQorCSAqIAorCSAqIGlmIChhY3RpdmUpIHsgcG9pbnRzW2luZGV4KytdID0gcGFyZW50LmdldFNpemUoKS54IC0gKHNoYWRvd0VuYWJsZWQgPworCSAqIFNJREVfRFJPUF9XSURUSCA6IDAgKyBJTk5FUl9LRVlMSU5FICsgT1VURVJfS0VZTElORSk7IHBvaW50c1tpbmRleCsrXSA9CisJICogYm90dG9tWTsgfSBnYy5zZXRDbGlwcGluZygwLCBvbkJvdHRvbSA/IGJvdW5kcy55IC0gaGVhZGVyIDogYm91bmRzLnksCisJICogcGFyZW50LmdldFNpemUoKS54IC0gKHNoYWRvd0VuYWJsZWQgPyBTSURFX0RST1BfV0lEVEggOiAwICsgSU5ORVJfS0VZTElORQorCSAqICsgT1VURVJfS0VZTElORSksIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCk7Ly8gYm91bmRzLmhlaWdodCAvLyArIC8vIDQpOworCSAqIGlmIChzZWxlY3RlZFRhYkZpbGxDb2xvciA9PSBudWxsKSBzZWxlY3RlZFRhYkZpbGxDb2xvciA9CisJICogZ2MuZ2V0RGV2aWNlKCkuZ2V0U3lzdGVtQ29sb3IoIFNXVC5DT0xPUl9XSElURSk7CisJICogZ2Muc2V0QmFja2dyb3VuZChzZWxlY3RlZFRhYkZpbGxDb2xvcik7CisJICogZ2Muc2V0Rm9yZWdyb3VuZChzZWxlY3RlZFRhYkZpbGxDb2xvcik7IENvbG9yIGdyYWRpZW50VG9wID0gbnVsbDsgUGF0dGVybgorCSAqIGJhY2tncm91bmRQYXR0ZXJuID0gbnVsbDsgaWYgKCFhY3RpdmUgJiYgIW9uQm90dG9tKSB7IFJHQiBibGVuZENvbG9yID0KKwkgKiBnYy5nZXREZXZpY2UoKSAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1cpLmdldFJHQigpOworCSAqIFJHQiB0b3BHcmFkaWVudCA9IGJsZW5kKGJsZW5kQ29sb3IsIHBhcmVudC5nZXRQYXJlbnQoKQorCSAqIC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCksIDQwKTsgZ3JhZGllbnRUb3AgPSBuZXcgQ29sb3IoZ2MuZ2V0RGV2aWNlKCksCisJICogdG9wR3JhZGllbnQpOyBiYWNrZ3JvdW5kUGF0dGVybiA9IG5ldyBQYXR0ZXJuKGdjLmdldERldmljZSgpLCAwLCAwLCAwLAorCSAqIGJvdW5kcy5oZWlnaHQgKyAxLCBncmFkaWVudFRvcCwgZ2MuZ2V0RGV2aWNlKCkKKwkgKiAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7CisJICogZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4oYmFja2dyb3VuZFBhdHRlcm4pOyB9IGludFtdIHRtcFBvaW50cyA9IG5ldworCSAqIGludFtpbmRleF07IFN5c3RlbS5hcnJheWNvcHkocG9pbnRzLCAwLCB0bXBQb2ludHMsIDAsIGluZGV4KTsKKwkgKiBnYy5maWxsUG9seWdvbih0bXBQb2ludHMpOyBnYy5kcmF3TGluZShzZWxlY3Rpb25YMSwgc2VsZWN0aW9uWTEsCisJICogc2VsZWN0aW9uWDIsIHNlbGVjdGlvblkyKTsgaWYgKHRhYk91dGxpbmVDb2xvciA9PSBudWxsKSB0YWJPdXRsaW5lQ29sb3IgPQorCSAqIGdjLmdldERldmljZSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7CisJICogZ2Muc2V0Rm9yZWdyb3VuZCh0YWJPdXRsaW5lQ29sb3IpOyBDb2xvciBncmFkaWVudExpbmVUb3AgPSBudWxsOyBQYXR0ZXJuCisJICogZm9yZWdyb3VuZFBhdHRlcm4gPSBudWxsOyBpZiAoIWFjdGl2ZSAmJiAhb25Cb3R0b20pIHsgUkdCIGJsZW5kQ29sb3IgPQorCSAqIGdjLmdldERldmljZSgpIC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVykuZ2V0UkdCKCk7CisJICogUkdCIHRvcEdyYWRpZW50ID0gYmxlbmQoYmxlbmRDb2xvciwgdGFiT3V0bGluZUNvbG9yLmdldFJHQigpLCA0MCk7CisJICogZ3JhZGllbnRMaW5lVG9wID0gbmV3IENvbG9yKGdjLmdldERldmljZSgpLCB0b3BHcmFkaWVudCk7CisJICogZm9yZWdyb3VuZFBhdHRlcm4gPSBuZXcgUGF0dGVybihnYy5nZXREZXZpY2UoKSwgMCwgMCwgMCwgYm91bmRzLmhlaWdodCArCisJICogMSwgZ3JhZGllbnRMaW5lVG9wLCBnYy5nZXREZXZpY2UoKSAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7CisJICogZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4oZm9yZWdyb3VuZFBhdHRlcm4pOyB9IGdjLmRyYXdQb2x5bGluZSh0bXBQb2ludHMpOworCSAqIFJlY3RhbmdsZSByZWN0ID0gbnVsbDsgZ2Muc2V0Q2xpcHBpbmcocmVjdCk7CisJICogCisJICogaWYgKGFjdGl2ZSkgeyBpZiAob3V0ZXJLZXlsaW5lID09IG51bGwpIG91dGVyS2V5bGluZSA9CisJICogZ2MuZ2V0RGV2aWNlKCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7CisJICogZ2Muc2V0Rm9yZWdyb3VuZChvdXRlcktleWxpbmUpOyBnYy5kcmF3UG9seWxpbmUoc2hhcGUpOyB9IGVsc2UgeyBpZgorCSAqICghb25Cb3R0b20pIHsgZ2MuZHJhd0xpbmUoc3RhcnRYLCAwLCBlbmRYLCAwKTsgfSBpZiAoZ3JhZGllbnRUb3AgIT0gbnVsbCkKKwkgKiBncmFkaWVudFRvcC5kaXNwb3NlKCk7IGlmIChiYWNrZ3JvdW5kUGF0dGVybiAhPSBudWxsKQorCSAqIGJhY2tncm91bmRQYXR0ZXJuLmRpc3Bvc2UoKTsgaWYgKGdyYWRpZW50TGluZVRvcCAhPSBudWxsKQorCSAqIGdyYWRpZW50TGluZVRvcC5kaXNwb3NlKCk7IGlmIChmb3JlZ3JvdW5kUGF0dGVybiAhPSBudWxsKQorCSAqIGZvcmVncm91bmRQYXR0ZXJuLmRpc3Bvc2UoKTsKKwkgKiAKKwkgKiB9IH0KKwkgKiAKKwkgKiB2b2lkIGRyYXdVbnNlbGVjdGVkVGFiKGludCBpdGVtSW5kZXgsIEdDIGdjLCBSZWN0YW5nbGUgYm91bmRzLCBpbnQgc3RhdGUpCisJICogeyBpZiAoKHN0YXRlICYgU1dULkhPVCkgIT0gMCkgeyBpbnQgaGVhZGVyID0gc2hhZG93RW5hYmxlZCA/IDIgOiAwOyBpbnQKKwkgKiB3aWR0aCA9IGJvdW5kcy53aWR0aDsgYm9vbGVhbiBvbkJvdHRvbSA9IHBhcmVudC5nZXRUYWJQb3NpdGlvbigpID09CisJICogU1dULkJPVFRPTTsgaW50W10gcG9pbnRzID0gbmV3IGludFsxMDI0XTsgaW50W10gaW5hY3RpdmUgPSBuZXcgaW50WzhdOworCSAqIGludCBpbmRleCA9IDAsIGluYWN0aXZlX2luZGV4ID0gMDsgaW50IHJhZGl1cyA9IGNvcm5lclNpemUgLyAyOyBpbnQgY2lyY1gKKwkgKiA9IGJvdW5kcy54ICsgcmFkaXVzOyBpbnQgY2lyY1kgPSBvbkJvdHRvbSA/IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCArIDEKKwkgKiAtIGhlYWRlciAtIHJhZGl1cyA6IGJvdW5kcy55IC0gMSArIHJhZGl1czsgaW50IGJvdHRvbVkgPSBvbkJvdHRvbSA/CisJICogYm91bmRzLnkgLSBoZWFkZXIgOiBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7CisJICogCisJICogaW50IGxlZnRJbmRleCA9IGNpcmNYOyBpZiAoaXRlbUluZGV4ID09IDApIHsgaWYKKwkgKiAocGFyZW50LmdldFNlbGVjdGlvbkluZGV4KCkgIT0gMCkgbGVmdEluZGV4IC09IDE7IHBvaW50c1tpbmRleCsrXSA9CisJICogbGVmdEluZGV4IC0gcmFkaXVzOyBwb2ludHNbaW5kZXgrK10gPSBib3R0b21ZOyB9IGVsc2UgeyBwb2ludHNbaW5kZXgrK10gPQorCSAqIGJvdW5kcy54OyBwb2ludHNbaW5kZXgrK10gPSBib3R0b21ZOyB9CisJICogCisJICogaWYgKCFhY3RpdmUpIHsgU3lzdGVtLmFycmF5Y29weShwb2ludHMsIDAsIGluYWN0aXZlLCAwLCBpbmRleCk7CisJICogaW5hY3RpdmVfaW5kZXggKz0gMjsgfQorCSAqIAorCSAqIGludCByaWdodEluZGV4ID0gY2lyY1ggLSAxOyBpZiAoIW9uQm90dG9tKSB7IGludFtdIGx0dCA9CisJICogZHJhd0NpcmNsZShsZWZ0SW5kZXgsIGNpcmNZLCByYWRpdXMsIExFRlRfVE9QKTsgZm9yIChpbnQgaSA9IDA7IGkgPAorCSAqIGx0dC5sZW5ndGggLyAyOyBpICs9IDIpIHsgaW50IHRtcCA9IGx0dFtpXTsgbHR0W2ldID0gbHR0W2x0dC5sZW5ndGggLSBpIC0KKwkgKiAyXTsgbHR0W2x0dC5sZW5ndGggLSBpIC0gMl0gPSB0bXA7IHRtcCA9IGx0dFtpICsgMV07IGx0dFtpICsgMV0gPQorCSAqIGx0dFtsdHQubGVuZ3RoIC0gaSAtIDFdOyBsdHRbbHR0Lmxlbmd0aCAtIGkgLSAxXSA9IHRtcDsgfQorCSAqIFN5c3RlbS5hcnJheWNvcHkobHR0LCAwLCBwb2ludHMsIGluZGV4LCBsdHQubGVuZ3RoKTsgaW5kZXggKz0gbHR0Lmxlbmd0aDsKKwkgKiAKKwkgKiBpZiAoIWFjdGl2ZSkgeyBTeXN0ZW0uYXJyYXljb3B5KGx0dCwgMCwgaW5hY3RpdmUsIGluYWN0aXZlX2luZGV4LCAyKTsKKwkgKiBpbmFjdGl2ZV9pbmRleCArPSAyOyB9CisJICogCisJICogaW50W10gcnQgPSBkcmF3Q2lyY2xlKHJpZ2h0SW5kZXggKyB3aWR0aCAtIChyYWRpdXMgKiAyKSwgY2lyY1ksIHJhZGl1cywKKwkgKiBSSUdIVF9UT1ApOyBmb3IgKGludCBpID0gMDsgaSA8IHJ0Lmxlbmd0aCAvIDI7IGkgKz0gMikgeyBpbnQgdG1wID0gcnRbaV07CisJICogcnRbaV0gPSBydFtydC5sZW5ndGggLSBpIC0gMl07IHJ0W3J0Lmxlbmd0aCAtIGkgLSAyXSA9IHRtcDsgdG1wID0gcnRbaSArCisJICogMV07IHJ0W2kgKyAxXSA9IHJ0W3J0Lmxlbmd0aCAtIGkgLSAxXTsgcnRbcnQubGVuZ3RoIC0gaSAtIDFdID0gdG1wOyB9CisJICogU3lzdGVtLmFycmF5Y29weShydCwgMCwgcG9pbnRzLCBpbmRleCwgcnQubGVuZ3RoKTsgaW5kZXggKz0gcnQubGVuZ3RoOyBpZgorCSAqICghYWN0aXZlKSB7IFN5c3RlbS5hcnJheWNvcHkocnQsIHJ0Lmxlbmd0aCAtIDQsIGluYWN0aXZlLCBpbmFjdGl2ZV9pbmRleCwKKwkgKiAyKTsgaW5hY3RpdmVbaW5hY3RpdmVfaW5kZXhdIC09IDE7IGluYWN0aXZlX2luZGV4ICs9IDI7IH0gfSBlbHNlIHsgaW50W10KKwkgKiBsdHQgPSBkcmF3Q2lyY2xlKGxlZnRJbmRleCwgY2lyY1ksIHJhZGl1cywgTEVGVF9CT1RUT00pOworCSAqIFN5c3RlbS5hcnJheWNvcHkobHR0LCAwLCBwb2ludHMsIGluZGV4LCBsdHQubGVuZ3RoKTsgaW5kZXggKz0gbHR0Lmxlbmd0aDsKKwkgKiAKKwkgKiBpZiAoIWFjdGl2ZSkgeyBTeXN0ZW0uYXJyYXljb3B5KGx0dCwgMCwgaW5hY3RpdmUsIGluYWN0aXZlX2luZGV4LCAyKTsKKwkgKiBpbmFjdGl2ZV9pbmRleCArPSAyOyB9CisJICogCisJICogaW50W10gcnQgPSBkcmF3Q2lyY2xlKHJpZ2h0SW5kZXggKyB3aWR0aCAtIChyYWRpdXMgKiAyKSwgY2lyY1ksIHJhZGl1cywKKwkgKiBSSUdIVF9CT1RUT00pOyBTeXN0ZW0uYXJyYXljb3B5KHJ0LCAwLCBwb2ludHMsIGluZGV4LCBydC5sZW5ndGgpOyBpbmRleAorCSAqICs9IHJ0Lmxlbmd0aDsgaWYgKCFhY3RpdmUpIHsgU3lzdGVtLmFycmF5Y29weShydCwgcnQubGVuZ3RoIC0gNCwKKwkgKiBpbmFjdGl2ZSwgaW5hY3RpdmVfaW5kZXgsIDIpOyBpbmFjdGl2ZVtpbmFjdGl2ZV9pbmRleF0gLT0gMTsKKwkgKiBpbmFjdGl2ZV9pbmRleCArPSAyOyB9CisJICogCisJICogfQorCSAqIAorCSAqIHBvaW50c1tpbmRleCsrXSA9IGJvdW5kcy53aWR0aCArIHJpZ2h0SW5kZXggLSByYWRpdXM7IHBvaW50c1tpbmRleCsrXSA9CisJICogYm90dG9tWTsKKwkgKiAKKwkgKiBpZiAoIWFjdGl2ZSkgeyBTeXN0ZW0uYXJyYXljb3B5KHBvaW50cywgaW5kZXggLSAyLCBpbmFjdGl2ZSwKKwkgKiBpbmFjdGl2ZV9pbmRleCwgMik7IGluYWN0aXZlW2luYWN0aXZlX2luZGV4XSAtPSAxOyBpbmFjdGl2ZV9pbmRleCArPSAyOyB9CisJICogZ2Muc2V0Q2xpcHBpbmcocG9pbnRzWzBdLCBvbkJvdHRvbSA/IGJvdW5kcy55IC0gaGVhZGVyIDogYm91bmRzLnksCisJICogcGFyZW50LmdldFNpemUoKS54IC0gKHNoYWRvd0VuYWJsZWQgPyBTSURFX0RST1BfV0lEVEggOiAwICsgSU5ORVJfS0VZTElORQorCSAqICsgT1VURVJfS0VZTElORSksIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCk7CisJICogCisJICogZ2Muc2V0QmFja2dyb3VuZChnYy5nZXREZXZpY2UoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsgaW50W10KKwkgKiB0bXBQb2ludHMgPSBuZXcgaW50W2luZGV4XTsgU3lzdGVtLmFycmF5Y29weShwb2ludHMsIDAsIHRtcFBvaW50cywgMCwKKwkgKiBpbmRleCk7IGdjLmZpbGxQb2x5Z29uKHRtcFBvaW50cyk7IENvbG9yIHRlbXBCb3JkZXIgPSBuZXcKKwkgKiBDb2xvcihnYy5nZXREZXZpY2UoKSwgMTgyLCAxODgsIDIwNCk7IGdjLnNldEZvcmVncm91bmQodGVtcEJvcmRlcik7CisJICogdGVtcEJvcmRlci5kaXNwb3NlKCk7IGlmIChhY3RpdmUpIHsgZ2MuZHJhd1BvbHlsaW5lKHRtcFBvaW50cyk7IH0gZWxzZSB7CisJICogZ2MuZHJhd0xpbmUoaW5hY3RpdmVbMF0sIGluYWN0aXZlWzFdLCBpbmFjdGl2ZVsyXSwgaW5hY3RpdmVbM10pOworCSAqIGdjLmRyYXdMaW5lKGluYWN0aXZlWzRdLCBpbmFjdGl2ZVs1XSwgaW5hY3RpdmVbNl0sIGluYWN0aXZlWzddKTsgfQorCSAqIAorCSAqIFJlY3RhbmdsZSByZWN0ID0gbnVsbDsgZ2Muc2V0Q2xpcHBpbmcocmVjdCk7CisJICogCisJICogaWYgKG91dGVyS2V5bGluZSA9PSBudWxsKSBvdXRlcktleWxpbmUgPQorCSAqIGdjLmdldERldmljZSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7IC8vCisJICogZ2Muc2V0Rm9yZWdyb3VuZChvdXRlcktleWxpbmUpOyAvLyBnYy5kcmF3UG9seWxpbmUoc2hhcGUpOyB9IH0KKwkgKiAKKwkgKiBzdGF0aWMgaW50W10gZHJhd0NpcmNsZShpbnQgeEMsIGludCB5QywgaW50IHIsIGludCBjaXJjbGVQYXJ0KSB7IGludCB4ID0KKwkgKiAwLCB5ID0gciwgdSA9IDEsIHYgPSAyICogciAtIDEsIGUgPSAwOyBpbnRbXSBwb2ludHMgPSBuZXcgaW50WzEwMjRdOworCSAqIGludFtdIHBvaW50c01pcnJvciA9IG5ldyBpbnRbMTAyNF07IGludCBsb29wID0gMDsgaW50IGxvb3BNaXJyb3IgPSAwOworCSAqIHdoaWxlICh4IDwgeSkgeyBpZiAoY2lyY2xlUGFydCA9PSBSSUdIVF9CT1RUT00pIHsgcG9pbnRzW2xvb3ArK10gPSB4QyArCisJICogeDsgcG9pbnRzW2xvb3ArK10gPSB5QyArIHk7IH0gaWYgKGNpcmNsZVBhcnQgPT0gUklHSFRfVE9QKSB7CisJICogcG9pbnRzW2xvb3ArK10gPSB4QyArIHk7IHBvaW50c1tsb29wKytdID0geUMgLSB4OyB9IGlmIChjaXJjbGVQYXJ0ID09CisJICogTEVGVF9UT1ApIHsgcG9pbnRzW2xvb3ArK10gPSB4QyAtIHg7IHBvaW50c1tsb29wKytdID0geUMgLSB5OyB9IGlmCisJICogKGNpcmNsZVBhcnQgPT0gTEVGVF9CT1RUT00pIHsgcG9pbnRzW2xvb3ArK10gPSB4QyAtIHk7IHBvaW50c1tsb29wKytdID0KKwkgKiB5QyArIHg7IH0geCsrOyBlICs9IHU7IHUgKz0gMjsgaWYgKHYgPCAyICogZSkgeyB5LS07IGUgLT0gdjsgdiAtPSAyOyB9IGlmCisJICogKHggPiB5KSBicmVhazsgaWYgKGNpcmNsZVBhcnQgPT0gUklHSFRfQk9UVE9NKSB7CisJICogcG9pbnRzTWlycm9yW2xvb3BNaXJyb3IrK10gPSB4QyArIHk7IHBvaW50c01pcnJvcltsb29wTWlycm9yKytdID0geUMgKyB4OworCSAqIH0gaWYgKGNpcmNsZVBhcnQgPT0gUklHSFRfVE9QKSB7IHBvaW50c01pcnJvcltsb29wTWlycm9yKytdID0geEMgKyB4OworCSAqIHBvaW50c01pcnJvcltsb29wTWlycm9yKytdID0geUMgLSB5OyB9IGlmIChjaXJjbGVQYXJ0ID09IExFRlRfVE9QKSB7CisJICogcG9pbnRzTWlycm9yW2xvb3BNaXJyb3IrK10gPSB4QyAtIHk7IHBvaW50c01pcnJvcltsb29wTWlycm9yKytdID0geUMgLSB4OworCSAqIH0gaWYgKGNpcmNsZVBhcnQgPT0gTEVGVF9CT1RUT00pIHsgcG9pbnRzTWlycm9yW2xvb3BNaXJyb3IrK10gPSB4QyAtIHg7CisJICogcG9pbnRzTWlycm9yW2xvb3BNaXJyb3IrK10gPSB5QyArIHk7IH0gLy8gZ3Jvdz8gaWYgKChsb29wICsgMSkgPgorCSAqIHBvaW50cy5sZW5ndGgpIHsgaW50IGxlbmd0aCA9IHBvaW50cy5sZW5ndGggKiAyOyBpbnRbXSBuZXdQb2ludFRhYmxlID0KKwkgKiBuZXcgaW50W2xlbmd0aF07IGludFtdIG5ld1BvaW50VGFibGVNaXJyb3IgPSBuZXcgaW50W2xlbmd0aF07CisJICogU3lzdGVtLmFycmF5Y29weShwb2ludHMsIDAsIG5ld1BvaW50VGFibGUsIDAsIHBvaW50cy5sZW5ndGgpOyBwb2ludHMgPQorCSAqIG5ld1BvaW50VGFibGU7IFN5c3RlbS5hcnJheWNvcHkocG9pbnRzTWlycm9yLCAwLCBuZXdQb2ludFRhYmxlTWlycm9yLCAwLAorCSAqIHBvaW50c01pcnJvci5sZW5ndGgpOyBwb2ludHNNaXJyb3IgPSBuZXdQb2ludFRhYmxlTWlycm9yOyB9IH0gaW50W10KKwkgKiBmaW5hbEFycmF5ID0gbmV3IGludFtsb29wICsgbG9vcE1pcnJvcl07IFN5c3RlbS5hcnJheWNvcHkocG9pbnRzLCAwLAorCSAqIGZpbmFsQXJyYXksIDAsIGxvb3ApOyBmb3IgKGludCBpID0gbG9vcE1pcnJvciAtIDEsIGogPSBsb29wOyBpID4gMDsgaSA9IGkKKwkgKiAtIDIsIGogPSBqICsgMikgeyBpbnQgdGVtcFkgPSBwb2ludHNNaXJyb3JbaV07IGludCB0ZW1wWCA9IHBvaW50c01pcnJvcltpCisJICogLSAxXTsgZmluYWxBcnJheVtqXSA9IHRlbXBYOyBmaW5hbEFycmF5W2ogKyAxXSA9IHRlbXBZOyB9IHJldHVybgorCSAqIGZpbmFsQXJyYXk7IH0KKwkgKiAKKwkgKiBzdGF0aWMgUkdCIGJsZW5kKFJHQiBjMSwgUkdCIGMyLCBpbnQgcmF0aW8pIHsgaW50IHIgPSBibGVuZChjMS5yZWQsCisJICogYzIucmVkLCByYXRpbyk7IGludCBnID0gYmxlbmQoYzEuZ3JlZW4sIGMyLmdyZWVuLCByYXRpbyk7IGludCBiID0KKwkgKiBibGVuZChjMS5ibHVlLCBjMi5ibHVlLCByYXRpbyk7IHJldHVybiBuZXcgUkdCKHIsIGcsIGIpOyB9CisJICogCisJICogc3RhdGljIGludCBibGVuZChpbnQgdjEsIGludCB2MiwgaW50IHJhdGlvKSB7IGludCBiID0gKHJhdGlvICogdjEgKyAoMTAwCisJICogLSByYXRpbykgKiB2MikgLyAxMDA7IHJldHVybiBNYXRoLm1pbigyNTUsIGIpOyB9CisJICogCisJICogdm9pZCBkcmF3U2hhZG93KGZpbmFsIERpc3BsYXkgZGlzcGxheSwgUmVjdGFuZ2xlIGJvdW5kcywgR0MgZ2MpIHsgaWYKKwkgKiAoc2hhZG93SW1hZ2UgPT0gbnVsbCkgeyBjcmVhdGVTaGFkb3coZGlzcGxheSk7IH0gaW50IHggPSBib3VuZHMueDsgaW50IHkKKwkgKiA9IGJvdW5kcy55OyBpbnQgU0laRSA9IHNoYWRvd0ltYWdlLmdldEJvdW5kcygpLndpZHRoIC8gMzsKKwkgKiAKKwkgKiBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgU0laRSAqIDIpOyBpbnQgd2lkdGggPQorCSAqIE1hdGgubWF4KGJvdW5kcy53aWR0aCwgU0laRSAqIDIpOyAvLyB0b3AgbGVmdCBnYy5kcmF3SW1hZ2Uoc2hhZG93SW1hZ2UsCisJICogMCwgMCwgU0laRSwgU0laRSwgMiwgMTAsIFNJWkUsIDIwKTsgaW50IGZpbGxIZWlnaHQgPSBoZWlnaHQgLSBTSVpFICogMjsKKwkgKiBpbnQgZmlsbFdpZHRoID0gd2lkdGggKyA1IC0gU0laRSAqIDI7CisJICogCisJICogaW50IHhGaWxsID0gMDsgZm9yIChpbnQgaSA9IFNJWkU7IGkgPCBmaWxsSGVpZ2h0OyBpICs9IFNJWkUpIHsgeEZpbGwgPSBpOworCSAqIGdjLmRyYXdJbWFnZShzaGFkb3dJbWFnZSwgMCwgU0laRSwgU0laRSwgU0laRSwgMiwgaSwgU0laRSwgU0laRSk7IH0KKwkgKiAKKwkgKiAvLyBQYWQgdGhlIHJlc3Qgb2YgdGhlIHNoYWRvdyBnYy5kcmF3SW1hZ2Uoc2hhZG93SW1hZ2UsIDAsIFNJWkUsIFNJWkUsCisJICogZmlsbEhlaWdodCAtIHhGaWxsLCAyLCB4RmlsbCArIFNJWkUsIFNJWkUsIGZpbGxIZWlnaHQgLSB4RmlsbCk7CisJICogCisJICogLy8gYmwgZ2MuZHJhd0ltYWdlKHNoYWRvd0ltYWdlLCAwLCA0MCwgMjAsIDIwLCAyLCB5ICsgaGVpZ2h0IC0gU0laRSwgMjAsCisJICogMjApOworCSAqIAorCSAqIGludCB5RmlsbCA9IDA7IGZvciAoaW50IGkgPSBTSVpFOyBpIDw9IGZpbGxXaWR0aDsgaSArPSBTSVpFKSB7IHlGaWxsID0gaTsKKwkgKiBnYy5kcmF3SW1hZ2Uoc2hhZG93SW1hZ2UsIFNJWkUsIFNJWkUgKiAyLCBTSVpFLCBTSVpFLCBpLCB5ICsgaGVpZ2h0IC0KKwkgKiBTSVpFLCBTSVpFLCBTSVpFKTsgfSAvLyBQYWQgdGhlIHJlc3Qgb2YgdGhlIHNoYWRvdworCSAqIGdjLmRyYXdJbWFnZShzaGFkb3dJbWFnZSwgU0laRSwgU0laRSAqIDIsIGZpbGxXaWR0aCAtIHlGaWxsLCBTSVpFLCB5RmlsbAorCSAqICsgU0laRSwgeSArIGhlaWdodCAtIFNJWkUsIGZpbGxXaWR0aCAtIHlGaWxsLCBTSVpFKTsKKwkgKiAKKwkgKiAvLyBiciBnYy5kcmF3SW1hZ2Uoc2hhZG93SW1hZ2UsIFNJWkUgKiAyLCBTSVpFICogMiwgU0laRSwgU0laRSwgeCArIHdpZHRoCisJICogLSBTSVpFIC0gMSwgeSArIGhlaWdodCAtIFNJWkUsIFNJWkUsIFNJWkUpOworCSAqIAorCSAqIC8vIHRyIGdjLmRyYXdJbWFnZShzaGFkb3dJbWFnZSwgKFNJWkUgKiAyKSwgMCwgU0laRSwgU0laRSwgeCArIHdpZHRoIC0KKwkgKiBTSVpFIC0gMSwgMTAsIFNJWkUsIFNJWkUpOworCSAqIAorCSAqIHhGaWxsID0gMDsgZm9yIChpbnQgaSA9IFNJWkU7IGkgPCBmaWxsSGVpZ2h0OyBpICs9IFNJWkUpIHsgeEZpbGwgPSBpOworCSAqIGdjLmRyYXdJbWFnZShzaGFkb3dJbWFnZSwgU0laRSAqIDIsIFNJWkUsIFNJWkUsIFNJWkUsIHggKyB3aWR0aCAtIFNJWkUgLQorCSAqIDEsIGksIFNJWkUsIFNJWkUpOyB9CisJICogCisJICogLy8gUGFkIHRoZSByZXN0IG9mIHRoZSBzaGFkb3cgZ2MuZHJhd0ltYWdlKHNoYWRvd0ltYWdlLCBTSVpFICogMiwgU0laRSwKKwkgKiBTSVpFLCBmaWxsSGVpZ2h0IC0geEZpbGwsIHggKyB3aWR0aCAtIFNJWkUgLSAxLCB4RmlsbCArIFNJWkUsIFNJWkUsCisJICogZmlsbEhlaWdodCAtIHhGaWxsKTsgfQorCSAqIAorCSAqIHZvaWQgY3JlYXRlU2hhZG93KGZpbmFsIERpc3BsYXkgZGlzcGxheSkgeyBpZiAoc2hhZG93SW1hZ2UgIT0gbnVsbCkgeworCSAqIHNoYWRvd0ltYWdlLmRpc3Bvc2UoKTsgc2hhZG93SW1hZ2UgPSBudWxsOyB9IEltYWdlRGF0YSBkYXRhID0gbmV3CisJICogSW1hZ2VEYXRhKDYwLCA2MCwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7IEltYWdlCisJICogdG1wSW1hZ2UgPSBzaGFkb3dJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsgR0MgZ2MgPSBuZXcKKwkgKiBHQyh0bXBJbWFnZSk7IGlmIChzaGFkb3dDb2xvciA9PSBudWxsKSBzaGFkb3dDb2xvciA9CisJICogZ2MuZ2V0RGV2aWNlKCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpOworCSAqIGdjLnNldEJhY2tncm91bmQoc2hhZG93Q29sb3IpOyBkcmF3VGFiQm9keShnYywgbmV3IFJlY3RhbmdsZSgwLCAwLCA2MCwKKwkgKiA2MCksIFNXVC5Ob25lKTsgSW1hZ2VEYXRhIGJsdXJlZCA9IGJsdXIodG1wSW1hZ2UsIDUsIDI1KTsgc2hhZG93SW1hZ2UgPQorCSAqIG5ldyBJbWFnZShkaXNwbGF5LCBibHVyZWQpOyB0bXBJbWFnZS5kaXNwb3NlKCk7IH0KKwkgKiAKKwkgKiBwdWJsaWMgSW1hZ2VEYXRhIGJsdXIoSW1hZ2Ugc3JjLCBpbnQgcmFkaXVzLCBpbnQgc2lnbWEpIHsgZmxvYXRbXSBrZXJuZWwKKwkgKiA9IGNyZWF0ZTFES2VybmVsKHJhZGl1cywgc2lnbWEpOworCSAqIAorCSAqIEltYWdlRGF0YSBpbWdQaXhlbHMgPSBzcmMuZ2V0SW1hZ2VEYXRhKCk7IGludCB3aWR0aCA9IGltZ1BpeGVscy53aWR0aDsKKwkgKiBpbnQgaGVpZ2h0ID0gaW1nUGl4ZWxzLmhlaWdodDsKKwkgKiAKKwkgKiBpbnRbXSBpblBpeGVscyA9IG5ldyBpbnRbd2lkdGggKiBoZWlnaHRdOyBpbnRbXSBvdXRQaXhlbHMgPSBuZXcgaW50W3dpZHRoCisJICogKiBoZWlnaHRdOyBpbnQgb2Zmc2V0ID0gMDsgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeyBmb3IgKGludCB4CisJICogPSAwOyB4IDwgd2lkdGg7IHgrKykgeyBSR0IgcmdiID0KKwkgKiBpbWdQaXhlbHMucGFsZXR0ZS5nZXRSR0IoaW1nUGl4ZWxzLmdldFBpeGVsKHgsIHkpKTsgaWYgKHJnYi5yZWQgPT0gMjU1ICYmCisJICogcmdiLmdyZWVuID09IDI1NSAmJiByZ2IuYmx1ZSA9PSAyNTUpIHsgaW5QaXhlbHNbb2Zmc2V0XSA9IChyZ2IucmVkIDw8IDE2KQorCSAqIHwgKHJnYi5ncmVlbiA8PCA4KSB8IHJnYi5ibHVlOyB9IGVsc2UgeyBpblBpeGVsc1tvZmZzZXRdID0KKwkgKiAoaW1nUGl4ZWxzLmdldEFscGhhKHgsIHkpIDw8IDI0KSB8IChyZ2IucmVkIDw8IDE2KSB8IChyZ2IuZ3JlZW4gPDwgOCkgfAorCSAqIHJnYi5ibHVlOyB9IG9mZnNldCsrOyB9IH0KKwkgKiAKKwkgKiBjb252b2x2ZShrZXJuZWwsIGluUGl4ZWxzLCBvdXRQaXhlbHMsIHdpZHRoLCBoZWlnaHQsIHRydWUpOworCSAqIGNvbnZvbHZlKGtlcm5lbCwgb3V0UGl4ZWxzLCBpblBpeGVscywgaGVpZ2h0LCB3aWR0aCwgdHJ1ZSk7CisJICogCisJICogSW1hZ2VEYXRhIGRzdCA9IG5ldyBJbWFnZURhdGEoaW1nUGl4ZWxzLndpZHRoLCBpbWdQaXhlbHMuaGVpZ2h0LCAyNCwgbmV3CisJICogUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4ZmYwMCwgMHhmZikpOworCSAqIAorCSAqIGRzdC5zZXRQaXhlbHMoMCwgMCwgaW5QaXhlbHMubGVuZ3RoLCBpblBpeGVscywgMCk7IG9mZnNldCA9IDA7IGZvciAoaW50IHkKKwkgKiA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeyBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsgaWYKKwkgKiAoaW5QaXhlbHNbb2Zmc2V0XSA9PSAtMSkgeyBkc3Quc2V0QWxwaGEoeCwgeSwgMCk7IH0gZWxzZSB7IGludCBhID0KKwkgKiAoaW5QaXhlbHNbb2Zmc2V0XSA+PiAyNCkgJiAweGZmOyAvLyBpZiAoYSA8IDE1MCkgYSA9IDA7IGRzdC5zZXRBbHBoYSh4LAorCSAqIHksIGEpOyB9IG9mZnNldCsrOyB9IH0gcmV0dXJuIGRzdDsgfQorCSAqIAorCSAqIHByaXZhdGUgdm9pZCBjb252b2x2ZShmbG9hdFtdIGtlcm5lbCwgaW50W10gaW5QaXhlbHMsIGludFtdIG91dFBpeGVscywKKwkgKiBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gYWxwaGEpIHsgaW50IGtlcm5lbFdpZHRoID0ga2VybmVsLmxlbmd0aDsKKwkgKiBpbnQga2VybmVsTWlkID0ga2VybmVsV2lkdGggLyAyOyBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7IGludAorCSAqIGluZGV4ID0geTsgaW50IGN1cnJlbnRMaW5lID0geSAqIHdpZHRoOyBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkgKiAvLyBkbyBwb2ludCBmbG9hdCBhID0gMCwgciA9IDAsIGcgPSAwLCBiID0gMDsgZm9yIChpbnQgayA9IC1rZXJuZWxNaWQ7IGsKKwkgKiA8PSBrZXJuZWxNaWQ7IGsrKykgeyBmbG9hdCB2YWwgPSBrZXJuZWxbayArIGtlcm5lbE1pZF07IGludCB4Y29vcmQgPSB4ICsKKwkgKiBrOyBpZiAoeGNvb3JkIDwgMCkgeGNvb3JkID0gMDsgaWYgKHhjb29yZCA+PSB3aWR0aCkgeGNvb3JkID0gd2lkdGggLSAxOworCSAqIGludCBwaXhlbCA9IGluUGl4ZWxzW2N1cnJlbnRMaW5lICsgeGNvb3JkXTsgLy8gZmxvYXQgYWxwID0gKChwaXhlbCA+PiAyNCkKKwkgKiAmIDB4ZmYpOyBhICs9IHZhbCAqICgocGl4ZWwgPj4gMjQpICYgMHhmZik7IHIgKz0gdmFsICogKCgocGl4ZWwgPj4gMTYpICYKKwkgKiAweGZmKSk7IGcgKz0gdmFsICogKCgocGl4ZWwgPj4gOCkgJiAweGZmKSk7IGIgKz0gdmFsICogKCgocGl4ZWwpICYKKwkgKiAweGZmKSk7IH0gaW50IGlhID0gYWxwaGEgPyBjbGFtcCgoaW50KSAoYSArIDAuNSkpIDogMHhmZjsgaW50IGlyID0KKwkgKiBjbGFtcCgoaW50KSAociArIDAuNSkpOyBpbnQgaWcgPSBjbGFtcCgoaW50KSAoZyArIDAuNSkpOyBpbnQgaWIgPQorCSAqIGNsYW1wKChpbnQpIChiICsgMC41KSk7IG91dFBpeGVsc1tpbmRleF0gPSAoaWEgPDwgMjQpIHwgKGlyIDw8IDE2KSB8IChpZworCSAqIDw8IDgpIHwgaWI7IGluZGV4ICs9IGhlaWdodDsgfSB9CisJICogCisJICogfQorCSAqIAorCSAqIHByaXZhdGUgaW50IGNsYW1wKGludCB2YWx1ZSkgeyBpZiAodmFsdWUgPiAyNTUpIHJldHVybiAyNTU7IGlmICh2YWx1ZSA8CisJICogMCkgcmV0dXJuIDA7IHJldHVybiB2YWx1ZTsgfQorCSAqIAorCSAqIHByaXZhdGUgZmxvYXRbXSBjcmVhdGUxREtlcm5lbChpbnQgcmFkaXVzLCBpbnQgc2lnbWEpIHsgLy8gZ3VpZGVsaW5lOgorCSAqIDMqc2lnbWEgc2hvdWxkIGJlIHRoZSByYWRpdXMgaW50IHNpemUgPSByYWRpdXMgKiAyICsgMTsgZmxvYXRbXSBrZXJuZWwgPQorCSAqIG5ldyBmbG9hdFtzaXplXTsgaW50IHJhZGl1c1NxdWFyZSA9IHJhZGl1cyAqIHJhZGl1czsgZmxvYXQgc2lnbWFTcXVhcmUgPQorCSAqIDIgKiBzaWdtYSAqIHNpZ21hOyBmbG9hdCBwaVNpZ21hID0gMiAqIChmbG9hdCkgTWF0aC5QSSAqIHNpZ21hOyBmbG9hdAorCSAqIHNxcnRTaWdtYVBpMiA9IChmbG9hdCkgTWF0aC5zcXJ0KHBpU2lnbWEpOyBpbnQgc3RhcnQgPSBzaXplIC8gMjsgaW50CisJICogaW5kZXggPSAwOyBmbG9hdCB0b3RhbCA9IDA7IGZvciAoaW50IGkgPSAtc3RhcnQ7IGkgPD0gc3RhcnQ7IGkrKykgeyBmbG9hdAorCSAqIGQgPSBpICogaTsgaWYgKGQgPiByYWRpdXNTcXVhcmUpIHsga2VybmVsW2luZGV4XSA9IDA7IH0gZWxzZSB7CisJICoga2VybmVsW2luZGV4XSA9IChmbG9hdCkgTWF0aC5leHAoLShkKSAvIHNpZ21hU3F1YXJlKSAvIHNxcnRTaWdtYVBpMjsgfQorCSAqIHRvdGFsICs9IGtlcm5lbFtpbmRleF07IGluZGV4Kys7IH0gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkgKiBrZXJuZWxbaV0gLz0gdG90YWw7IH0gcmV0dXJuIGtlcm5lbDsgfQorCSAqIAorCSAqIHB1YmxpYyBSZWN0YW5nbGUgZ2V0UGFkZGluZygpIHsgcmV0dXJuIG5ldyBSZWN0YW5nbGUocGFkZGluZ1RvcCwKKwkgKiBwYWRkaW5nUmlnaHQsIHBhZGRpbmdCb3R0b20sIHBhZGRpbmdMZWZ0KTsgfQorCSAqIAorCSAqIHB1YmxpYyB2b2lkIHNldFBhZGRpbmcoaW50IHBhZGRpbmdMZWZ0LCBpbnQgcGFkZGluZ1JpZ2h0LCBpbnQgcGFkZGluZ1RvcCwKKwkgKiBpbnQgcGFkZGluZ0JvdHRvbSkgeyB0aGlzLnBhZGRpbmdMZWZ0ID0gcGFkZGluZ0xlZnQ7IHRoaXMucGFkZGluZ1JpZ2h0ID0KKwkgKiBwYWRkaW5nUmlnaHQ7IHRoaXMucGFkZGluZ1RvcCA9IHBhZGRpbmdUb3A7IHRoaXMucGFkZGluZ0JvdHRvbSA9CisJICogcGFkZGluZ0JvdHRvbTsgcGFyZW50LnJlZHJhdygpOyB9CisJICogCisJICogcHVibGljIHZvaWQgc2V0Q29ybmVyUmFkaXVzKGludCByYWRpdXMpIHsgY29ybmVyU2l6ZSA9IHJhZGl1czsKKwkgKiBwYXJlbnQucmVkcmF3KCk7IH0KKwkgKiAKKwkgKiBwdWJsaWMgdm9pZCBzZXRTaGFkb3dWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeyB0aGlzLnNoYWRvd0VuYWJsZWQgPQorCSAqIHZpc2libGU7IHBhcmVudC5yZWRyYXcoKTsgfQorCSAqIAorCSAqIHB1YmxpYyB2b2lkIHNldFNoYWRvd0NvbG9yKENvbG9yIGNvbG9yKSB7IHRoaXMuc2hhZG93Q29sb3IgPSBjb2xvcjsKKwkgKiBjcmVhdGVTaGFkb3cocGFyZW50LmdldERpc3BsYXkoKSk7IHBhcmVudC5yZWRyYXcoKTsgfQorCSAqIAorCSAqIHB1YmxpYyB2b2lkIHNldE91dGVyS2V5bGluZShDb2xvciBjb2xvcikgeyB0aGlzLm91dGVyS2V5bGluZSA9IGNvbG9yOyAvLworCSAqIFRPRE86IEhBQ0shIFNob3VsZCBiZSBzZXQgYmFzZWQgb24gcHNldWRvLXN0YXRlLiBpZiAoY29sb3IgIT0gbnVsbCkgeworCSAqIHNldEFjdGl2ZSghKGNvbG9yLmdldFJlZCgpID09IDI1NSAmJiBjb2xvci5nZXRHcmVlbigpID09IDI1NSAmJiBjb2xvcgorCSAqIC5nZXRCbHVlKCkgPT0gMjU1KSk7IH0gcGFyZW50LnJlZHJhdygpOyB9CisJICogCisJICogcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRUYWJGaWxsKENvbG9yIGNvbG9yKSB7IHRoaXMuc2VsZWN0ZWRUYWJGaWxsQ29sb3IgPQorCSAqIGNvbG9yOyBwYXJlbnQucmVkcmF3KCk7IH0KKwkgKiAKKwkgKiBwdWJsaWMgdm9pZCBzZXRUYWJPdXRsaW5lKENvbG9yIGNvbG9yKSB7IHRoaXMudGFiT3V0bGluZUNvbG9yID0gY29sb3I7CisJICogcGFyZW50LnJlZHJhdygpOyB9CisJICogCisJICogcHVibGljIHZvaWQgc2V0SW5uZXJLZXlsaW5lKENvbG9yIGNvbG9yKSB7IHRoaXMuaW5uZXJLZXlsaW5lID0gY29sb3I7CisJICogcGFyZW50LnJlZHJhdygpOyB9CisJICogCisJICogcHVibGljIHZvaWQgc2V0QWN0aXZlVG9vbGJhckdyYWRpZW50KENvbG9yW10gY29sb3IsIGludFtdIHBlcmNlbnRzKSB7CisJICogYWN0aXZlVG9vbGJhciA9IGNvbG9yOyBhY3RpdmVQZXJjZW50cyA9IHBlcmNlbnRzOyB9CisJICogCisJICogcHVibGljIHZvaWQgc2V0SW5hY3RpdmVUb29sYmFyR3JhZGllbnQoQ29sb3JbXSBjb2xvciwgaW50W10gcGVyY2VudHMpIHsKKwkgKiBpbmFjdGl2ZVRvb2xiYXIgPSBjb2xvcjsgaW5hY3RpdmVQZXJjZW50cyA9IHBlcmNlbnRzOyB9CisJICogCisJICogcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7IHRoaXMuYWN0aXZlID0gYWN0aXZlOyB9CisJICovCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Db21wb3NpdGVSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQ29tcG9zaXRlUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjJlMmMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQ29tcG9zaXRlUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKKy8qKgorICogRmFjdG9yeSBmb3IgPGNvZGU+b3JnLmVjbGlwc2UuZTQud29ya2JlbmNoLmVtZi53b3JrYmVuY2guQ29tcG9zaXRlPC9jb2RlPgorICovCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUmVuZGVyZXIgZXh0ZW5kcyBTV1RQYXJ0UmVuZGVyZXIgeworCisJcHVibGljIENvbXBvc2l0ZVJlbmRlcmVyKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlV2lkZ2V0KE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSkKKwkJCXJldHVybiBudWxsOworCisJCWZpbmFsIFdpZGdldCBwYXJlbnRXaWRnZXQgPSAoV2lkZ2V0KSBwYXJlbnQ7CisJCVN0cmluZyBwb2xpY3kgPSAiVmVydGljYWxDb21wb3NpdGUiOyAvL2NvbXBvc2l0ZU1vZGVsLmdldFBvbGljeSgpOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKHBvbGljeSAhPSBudWxsICYmIChwb2xpY3kuZXF1YWxzKCJIb3Jpem9udGFsQ29tcG9zaXRlIikgLy8kTk9OLU5MUy0xJAorCQkJCXx8IHBvbGljeS5lcXVhbHMoIlZlcnRpY2FsQ29tcG9zaXRlIikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlKChDb21wb3NpdGUpIHBhcmVudFdpZGdldCwgU1dULk5PTkUpOworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9zdFByb2Nlc3MoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyLnBvc3RQcm9jZXNzKGVsZW1lbnQpOworCisJCVN0cmluZyBwb2xpY3kgPSAiVmVydGljYWxDb21wb3NpdGUiOyAvL2NvbXBvc2l0ZU1vZGVsLmdldFBvbGljeSgpOyAvLyROT04tTkxTLTEkCisJCWlmIChwb2xpY3kgIT0gbnVsbCAmJiBwb2xpY3kuZW5kc1dpdGgoIkNvbXBvc2l0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBlbGVtZW50LmdldFdpZGdldCgpOworCQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisJCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoCisJCQkJCXBvbGljeS5zdGFydHNXaXRoKCJIb3Jpem9udGFsIikgPyBjaGlsZHJlbi5sZW5ndGggOiAxLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCWdsLmhvcml6b250YWxTcGFjaW5nID0gMDsKKwkJCWdsLnZlcnRpY2FsU3BhY2luZyA9IDA7CisJCQlnbC5tYXJnaW5IZWlnaHQgPSAwOworCQkJZ2wubWFyZ2luV2lkdGggPSAwOworCQkJY29tcG9zaXRlLnNldExheW91dChnbCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCWJvb2xlYW4gZ3JhYlYgPSAhKGNoaWxkIGluc3RhbmNlb2YgVG9vbEJhcik7CisJCQkJYm9vbGVhbiBncmFiSCA9ICEoY2hpbGQgaW5zdGFuY2VvZiBUb29sQmFyKTsKKwkJCQljaGlsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGdyYWJILAorCQkJCQkJZ3JhYlYpKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0NvbnRyaWJ1dGVkUGFydFJlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Db250cmlidXRlZFBhcnRSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmM4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Db250cmlidXRlZFBhcnRSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMjkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDI2NDYwLCA0NDExNTAKKyAqICAgICBBbmRyZXkgTG9za3V0b3YgPGxvc2t1dG92QGdteC5kZT4gLSBCdWcgNDY2NTI0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5jb250cmlidXRpb25zLklDb250cmlidXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QbGFjZWhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworLyoqCisgKiBEZWZhdWx0IFNXVCByZW5kZXJlciByZXNwb25zaWJsZSBmb3IgYW4gTVBhcnQuIFNlZQorICoge0BsaW5rIFdvcmtiZW5jaFJlbmRlcmVyRmFjdG9yeX0KKyAqLworcHVibGljIGNsYXNzIENvbnRyaWJ1dGVkUGFydFJlbmRlcmVyIGV4dGVuZHMgU1dUUGFydFJlbmRlcmVyIHsKKworCUBJbmplY3QKKwlwcml2YXRlIElQcmVzZW50YXRpb25FbmdpbmUgZW5naW5lOworCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKKworCXByaXZhdGUgTVBhcnQgcGFydFRvQWN0aXZhdGU7CisKKwlwcml2YXRlIExpc3RlbmVyIGFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCS8vIHdlIG9ubHkgd2FudCB0byBhY3RpdmF0ZSB0aGUgcGFydCBpZiB0aGUgYWN0aXZhdGVkIHdpZGdldCBpcworCQkJLy8gYWN0dWFsbHkgYm91bmQgdG8gYSBtb2RlbCBlbGVtZW50CisJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBldmVudC53aWRnZXQuZ2V0RGF0YShPV05JTkdfTUUpOworCQkJaWYgKHBhcnQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXBhcnRUb0FjdGl2YXRlID0gcGFydDsKKwkJCQkJYWN0aXZhdGUocGFydFRvQWN0aXZhdGUpOworCQkJCX0gZmluYWxseSB7CisJCQkJCXBhcnRUb0FjdGl2YXRlID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwl9OworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVXaWRnZXQoZmluYWwgTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJV2lkZ2V0IHBhcmVudFdpZGdldCA9IChXaWRnZXQpIHBhcmVudDsKKwkJV2lkZ2V0IG5ld1dpZGdldCA9IG51bGw7CisJCWZpbmFsIE1QYXJ0IHBhcnQgPSAoTVBhcnQpIGVsZW1lbnQ7CisKKwkJZmluYWwgQ29tcG9zaXRlIG5ld0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoKENvbXBvc2l0ZSkgcGFyZW50V2lkZ2V0LAorCQkJCVNXVC5OT05FKSB7CisKKwkJCS8qKgorCQkJCQkgKgorCQkJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCQkJLyoqCisJCQkgKiBGaWVsZCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGluIHRoZSBtaWRzdCBvZgorCQkJICogZ3JhbnRpbmcgZm9jdXMgdG8gdGhlIHBhcnQuCisJCQkgKi8KKwkJCXByaXZhdGUgYm9vbGVhbiBiZWluZ0ZvY3VzZWQgPSBmYWxzZTsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKKwkJCQlpZiAoIWJlaW5nRm9jdXNlZCkgeworCQkJCQl0cnkgeworCQkJCQkJLy8gd2UgYXJlIGN1cnJlbnRseSBhc2tpbmcgdGhlIHBhcnQgdG8gdGFrZSBmb2N1cworCQkJCQkJYmVpbmdGb2N1c2VkID0gdHJ1ZTsKKworCQkJCQkJLy8gZGVsZWdhdGUgYW4gYXR0ZW1wdCB0byBzZXQgdGhlIGZvY3VzIGhlcmUgdG8gdGhlCisJCQkJCQkvLyBwYXJ0J3MgaW1wbGVtZW50YXRpb24gKGlmIHRoZXJlIGlzIG9uZSkKKwkJCQkJCU9iamVjdCBvYmplY3QgPSBwYXJ0LmdldE9iamVjdCgpOworCQkJCQkJaWYgKG9iamVjdCAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7CisJCQkJCQkJSVByZXNlbnRhdGlvbkVuZ2luZSBwZSA9IHBhcnQuZ2V0Q29udGV4dCgpLmdldCgKKwkJCQkJCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MpOworCQkJCQkJCXBlLmZvY3VzR3VpKHBhcnQpOworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIHN1cGVyLnNldEZvY3VzKCk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQkvLyB3ZSBhcmUgZG9uZSwgdW5zZXQgb3VyIGZsYWcKKwkJCQkJCWJlaW5nRm9jdXNlZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gYWxyZWFkeSBiZWluZyBmb2N1c2VkLCBsaWtlbHkgc29tZSBzdHJhbmdlIHJlY3Vyc2l2ZSBjYWxsLAorCQkJCS8vIGp1c3QgcmV0dXJuCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX07CisKKwkJbmV3Q29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKKworCQluZXdXaWRnZXQgPSBuZXdDb21wb3NpdGU7CisJCWJpbmRXaWRnZXQoZWxlbWVudCwgbmV3V2lkZ2V0KTsKKworCQkvLyBDcmVhdGUgYSBjb250ZXh0IGZvciB0aGlzIHBhcnQKKwkJSUVjbGlwc2VDb250ZXh0IGxvY2FsQ29udGV4dCA9IHBhcnQuZ2V0Q29udGV4dCgpOworCQlsb2NhbENvbnRleHQuc2V0KENvbXBvc2l0ZS5jbGFzcywgbmV3Q29tcG9zaXRlKTsKKworCQlJQ29udHJpYnV0aW9uRmFjdG9yeSBjb250cmlidXRpb25GYWN0b3J5ID0gbG9jYWxDb250ZXh0LmdldChJQ29udHJpYnV0aW9uRmFjdG9yeS5jbGFzcyk7CisJCU9iamVjdCBuZXdQYXJ0ID0gY29udHJpYnV0aW9uRmFjdG9yeS5jcmVhdGUocGFydC5nZXRDb250cmlidXRpb25VUkkoKSwKKwkJCQlsb2NhbENvbnRleHQpOworCQlwYXJ0LnNldE9iamVjdChuZXdQYXJ0KTsKKworCQlyZXR1cm4gbmV3V2lkZ2V0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXJ0CisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKE1QYXJ0IHBhcnQsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlpZiAoIShwYXJ0LmdldFdpZGdldCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlKSkKKwkJCXJldHVybjsKKworCQlDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpIHBhcnQuZ2V0V2lkZ2V0KCk7CisKKwkJLy8gRG8gd2UgYWxyZWFkeSBoYXZlIGEgbGFiZWw/CisJCWlmIChjLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDMpIHsKKwkJCUxhYmVsIGxhYmVsID0gKExhYmVsKSBjLmdldENoaWxkcmVuKClbMF07CisJCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJCQlkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCisJCQkvLyBoaWRlIHRoZSBsYWJlbCBpZiB0aGVyZSBpcyBubyB0ZXh0IHRvIHNob3cKKwkJCWJvb2xlYW4gaGFzVGV4dCA9ICFkZXNjcmlwdGlvbi5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQlsYWJlbC5zZXRWaXNpYmxlKGhhc1RleHQpOworCQkJbGFiZWwuc2V0VGV4dChkZXNjcmlwdGlvbik7CisJCQlsYWJlbC5zZXRUb29sVGlwVGV4dChkZXNjcmlwdGlvbik7CisKKwkJCS8vIGFsc28gaGlkZSB0aGUgc2VwYXJhdG9yCisJCQljLmdldENoaWxkcmVuKClbMV0uc2V0VmlzaWJsZShoYXNUZXh0KTsKKwkJCWMubGF5b3V0KCk7CisJCX0gZWxzZSBpZiAoYy5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAxKSB7CisJCQljLnNldExheW91dChuZXcgTGF5b3V0KCkgeworCisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsCisJCQkJCQlpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgeworCQkJCQlyZXR1cm4gbmV3IFBvaW50KDAsIDApOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMoKTsKKwkJCQkJaWYgKGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAxKSB7CisJCQkJCQljb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXS5zZXRCb3VuZHMoY29tcG9zaXRlCisJCQkJCQkJCS5nZXRCb3VuZHMoKSk7CisJCQkJCX0gZWxzZSBpZiAoY29tcG9zaXRlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDMpIHsKKwkJCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKKwkJCQkJCUxhYmVsIHNlcGFyYXRvciA9IChMYWJlbCkgY29tcG9zaXRlLmdldENoaWxkcmVuKClbMV07CisJCQkJCQlDb250cm9sIHBhcnRDdHJsID0gY29tcG9zaXRlLmdldENoaWxkcmVuKClbMl07CisKKwkJCQkJCS8vIGlmIHRoZSBsYWJlbCBpcyBlbXB0eSwgZ2l2ZSBpdCBhIHplcm8gc2l6ZQorCQkJCQkJaW50IGxhYmVsSGVpZ2h0ID0gIWxhYmVsLmdldFRleHQoKS5pc0VtcHR5KCkgPyBsYWJlbAorCQkJCQkJCQkuY29tcHV0ZVNpemUoYm91bmRzLndpZHRoLCBTV1QuREVGQVVMVCkueSA6IDA7CisJCQkJCQlsYWJlbC5zZXRCb3VuZHMoMCwgMCwgYm91bmRzLndpZHRoLCBsYWJlbEhlaWdodCk7CisKKwkJCQkJCWludCBzZXBhcmF0b3JIZWlnaHQgPSBsYWJlbEhlaWdodCA+IDAgPyBzZXBhcmF0b3IKKwkJCQkJCQkJLmNvbXB1dGVTaXplKGJvdW5kcy53aWR0aCwgU1dULkRFRkFVTFQpLnkgOiAwOworCQkJCQkJc2VwYXJhdG9yLnNldEJvdW5kcygwLCBsYWJlbEhlaWdodCwgYm91bmRzLndpZHRoLAorCQkJCQkJCQlzZXBhcmF0b3JIZWlnaHQpOworCisJCQkJCQlwYXJ0Q3RybC5zZXRCb3VuZHMoMCwgbGFiZWxIZWlnaHQgKyBzZXBhcmF0b3JIZWlnaHQsCisJCQkJCQkJCWJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCAtIGxhYmVsSGVpZ2h0CisJCQkJCQkJCQkJLSBzZXBhcmF0b3JIZWlnaHQpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisKKwkJCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOworCQkJc2VwYXJhdG9yLm1vdmVBYm92ZShudWxsKTsKKwkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5OT05FKTsKKwkJCWxhYmVsLnNldFRleHQoZGVzY3JpcHRpb24pOworCQkJbGFiZWwuc2V0VG9vbFRpcFRleHQoZGVzY3JpcHRpb24pOworCQkJbGFiZWwubW92ZUFib3ZlKG51bGwpOworCQkJYy5sYXlvdXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzRm9jdXMoTVBhcnQgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCA9PSBwYXJ0VG9BY3RpdmF0ZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIHN1cGVyLnJlcXVpcmVzRm9jdXMoZWxlbWVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaG9va0NvbnRyb2xsZXJMb2dpYyhmaW5hbCBNVUlFbGVtZW50IG1lKSB7CisJCXN1cGVyLmhvb2tDb250cm9sbGVyTG9naWMobWUpOworCQlpZiAoIShtZSBpbnN0YW5jZW9mIE1QYXJ0KSkgeworCQkJcmV0dXJuOworCQl9CisJCVdpZGdldCB3aWRnZXQgPSAoV2lkZ2V0KSBtZS5nZXRXaWRnZXQoKTsKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgYWN0aXZhdGlvbkxpc3RlbmVyKTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVSUNvbnRhaW5lcihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNVG9vbEJhcikgeworCQkJTVVJRWxlbWVudCBjb250YWluZXIgPSAoTVVJRWxlbWVudCkgKChFT2JqZWN0KSBlbGVtZW50KQorCQkJCQkuZUNvbnRhaW5lcigpOworCQkJTVVJRWxlbWVudCBwYXJlbnQgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQlNUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBjb250YWluZXIuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQkJaWYgKHBsYWNlaG9sZGVyICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyLmdldFBhcmVudCgpLmdldFdpZGdldCgpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHBhcmVudC5nZXRXaWRnZXQoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0VUlDb250YWluZXIoZWxlbWVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZVdpZGdldChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJTVBhcnQgcGFydCA9IChNUGFydCkgZWxlbWVudDsKKwkJCU1Ub29sQmFyIHRvb2xCYXIgPSBwYXJ0LmdldFRvb2xiYXIoKTsKKwkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKKwkJCQlXaWRnZXQgd2lkZ2V0ID0gKFdpZGdldCkgdG9vbEJhci5nZXRXaWRnZXQoKTsKKwkJCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKKwkJCQkJdW5iaW5kV2lkZ2V0KHRvb2xCYXIpOworCQkJCQl3aWRnZXQuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChNTWVudSBtZW51IDogcGFydC5nZXRNZW51cygpKSB7CisJCQkJZW5naW5lLnJlbW92ZUd1aShtZW51KTsKKwkJCX0KKwkJfQorCisJCUNvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOworCQlpZiAoZWxlbWVudC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJcGFyZW50ID0gKChDb21wb3NpdGUpIGVsZW1lbnQuZ2V0V2lkZ2V0KCkpLmdldFBhcmVudCgpOworCQl9CisKKwkJaWYgKHBhcmVudCAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXBhcmVudC5zZXRSZWRyYXcoZmFsc2UpOworCQkJCXN1cGVyLmRpc3Bvc2VXaWRnZXQoZWxlbWVudCk7CisJCQl9IGZpbmFsbHkgeworCQkJCXBhcmVudC5zZXRSZWRyYXcodHJ1ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdXBlci5kaXNwb3NlV2lkZ2V0KGVsZW1lbnQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQ29udHJpYnV0aW9uUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Db250cmlidXRpb25SZWNvcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQxZWIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvQ29udHJpYnV0aW9uUmVjb3JkLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5leHByZXNzaW9ucy5PckV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FeHByZXNzaW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkVjbGlwc2VDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkNvbnRyaWJ1dGlvbnNBbmFseXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29yZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuaW1wbC5VaUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51U2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBDb250cmlidXRpb25SZWNvcmQgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUlkgPSAiQ29udHJpYnV0aW9uRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKKwlzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19DT05URVhUID0gIkNvbnRyaWJ1dGlvbkZhY3RvcnlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJTU1lbnUgbWVudU1vZGVsOworCXByaXZhdGUgTU1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWJ1dGlvbjsKKwlwcml2YXRlIEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+IGdlbmVyYXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+KCk7CisJcHJpdmF0ZSBIYXNoU2V0PE1NZW51RWxlbWVudD4gc2hhcmVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxNTWVudUVsZW1lbnQ+KCk7CisJcHJpdmF0ZSBNZW51TWFuYWdlclJlbmRlcmVyIHJlbmRlcmVyOworCWJvb2xlYW4gaXNWaXNpYmxlID0gdHJ1ZTsKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBpbmZvQ29udGV4dDsKKwlwcml2YXRlIFJ1bm5hYmxlIGZhY3RvcnlEaXNwb3NlOworCisJcHVibGljIENvbnRyaWJ1dGlvblJlY29yZChNTWVudSBtZW51TW9kZWwsIE1NZW51Q29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiwKKwkJCU1lbnVNYW5hZ2VyUmVuZGVyZXIgcmVuZGVyZXIpIHsKKwkJdGhpcy5tZW51TW9kZWwgPSBtZW51TW9kZWw7CisJCXRoaXMubWVudUNvbnRyaWJ1dGlvbiA9IGNvbnRyaWJ1dGlvbjsKKwkJdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOworCX0KKworCXB1YmxpYyBNZW51TWFuYWdlciBnZXRNYW5hZ2VyRm9yTW9kZWwoKSB7CisJCXJldHVybiByZW5kZXJlci5nZXRNYW5hZ2VyKG1lbnVNb2RlbCk7CisJfQorCisJcHVibGljIE1NZW51Q29udHJpYnV0aW9uIGdldE1lbnVDb250cmlidXRpb24oKSB7CisJCXJldHVybiBtZW51Q29udHJpYnV0aW9uOworCX0KKworCS8qKgorCSAqIEFjY2VzcyB0byBhbmFseXplIGZvciB0ZXN0cy4gRm9yIExvb2tpbmcsIG5vdCB0b3VjaGluZyEKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBlbGVtZW50cyBjb2xsZWN0aW9uCisJICovCisJcHVibGljIENvbGxlY3Rpb248TU1lbnVFbGVtZW50PiBnZXRTaGFyZWRFbGVtZW50cygpIHsKKwkJcmV0dXJuIHNoYXJlZEVsZW1lbnRzOworCX0KKworCS8qKgorCSAqIEFjY2VzcyB0byBhbmFseXplIGZvciB0ZXN0cy4gRm9yIExvb2tpbmcsIG5vdCB0b3VjaGluZyEKKwkgKgorCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBlbGVtZW50cyBjb2xsZWN0aW9uCisJICovCisJcHVibGljIENvbGxlY3Rpb248TU1lbnVFbGVtZW50PiBnZXRHZW5lcmF0ZWRFbGVtZW50cygpIHsKKwkJcmV0dXJuIGdlbmVyYXRlZEVsZW1lbnRzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgdXBkYXRlVmlzaWJpbGl0eShJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlFeHByZXNzaW9uQ29udGV4dCBleHByQ29udGV4dCA9IG5ldyBFeHByZXNzaW9uQ29udGV4dChjb250ZXh0KTsKKwkJdXBkYXRlSXNWaXNpYmxlKGV4cHJDb250ZXh0KTsKKwkJSGFzaFNldDxDb250cmlidXRpb25SZWNvcmQ+IHJlY2VudGx5VXBkYXRlZCA9IG5ldyBIYXNoU2V0PENvbnRyaWJ1dGlvblJlY29yZD4oKTsKKwkJcmVjZW50bHlVcGRhdGVkLmFkZCh0aGlzKTsKKwkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW0gOiBnZW5lcmF0ZWRFbGVtZW50cykgeworCQkJYm9vbGVhbiBjdXJyZW50VmlzaWJpbGl0eSA9IGNvbXB1dGVWaXNpYmlsaXR5KHJlY2VudGx5VXBkYXRlZCwKKwkJCQkJaXRlbSwgZXhwckNvbnRleHQpOworCQkJaWYgKGl0ZW0uaXNWaXNpYmxlKCkgIT0gY3VycmVudFZpc2liaWxpdHkpIHsKKwkJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJCQlpdGVtLnNldFZpc2libGUoY3VycmVudFZpc2liaWxpdHkpOworCQkJfQorCQl9CisJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW0gOiBzaGFyZWRFbGVtZW50cykgeworCQkJYm9vbGVhbiBjdXJyZW50VmlzaWJpbGl0eSA9IGNvbXB1dGVWaXNpYmlsaXR5KHJlY2VudGx5VXBkYXRlZCwKKwkJCQkJaXRlbSwgZXhwckNvbnRleHQpOworCQkJaWYgKGl0ZW0uaXNWaXNpYmxlKCkgIT0gY3VycmVudFZpc2liaWxpdHkpIHsKKwkJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJCQlpdGVtLnNldFZpc2libGUoY3VycmVudFZpc2liaWxpdHkpOworCQkJfQorCQl9CisKKwkJaWYgKGNoYW5nZWQpIHsKKwkJCU1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNYW5hZ2VyRm9yTW9kZWwoKTsKKwkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKKwkJCQltYW5hZ2VyLm1hcmtEaXJ0eSgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgY29sbGVjdEluZm8oRXhwcmVzc2lvbkluZm8gaW5mbykgeworCQlDb250cmlidXRpb25zQW5hbHl6ZXIuY29sbGVjdEluZm8oaW5mbywKKwkJCQltZW51Q29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCkpOworCQlmb3IgKE1NZW51RWxlbWVudCBpdGVtIDogZ2VuZXJhdGVkRWxlbWVudHMpIHsKKwkJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5jb2xsZWN0SW5mbyhpbmZvLCBpdGVtLmdldFZpc2libGVXaGVuKCkpOworCQl9CisJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW0gOiBzaGFyZWRFbGVtZW50cykgeworCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLmNvbGxlY3RJbmZvKGluZm8sIGl0ZW0uZ2V0VmlzaWJsZVdoZW4oKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVJc1Zpc2libGUoRXhwcmVzc2lvbkNvbnRleHQgZXhwckNvbnRleHQpIHsKKwkJaXNWaXNpYmxlID0gQ29udHJpYnV0aW9uc0FuYWx5emVyLmlzVmlzaWJsZShtZW51Q29udHJpYnV0aW9uLAorCQkJCWV4cHJDb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb21wdXRlVmlzaWJpbGl0eSgKKwkJCUhhc2hTZXQ8Q29udHJpYnV0aW9uUmVjb3JkPiByZWNlbnRseVVwZGF0ZWQsIE1NZW51RWxlbWVudCBpdGVtLAorCQkJRXhwcmVzc2lvbkNvbnRleHQgZXhwckNvbnRleHQpIHsKKwkJYm9vbGVhbiBjdXJyZW50VmlzaWJpbGl0eSA9IGlzVmlzaWJsZTsKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBNTWVudSB8fCBpdGVtIGluc3RhbmNlb2YgTU1lbnVTZXBhcmF0b3IpIHsKKwkJCUFycmF5TGlzdDxDb250cmlidXRpb25SZWNvcmQ+IGxpc3QgPSByZW5kZXJlci5nZXRMaXN0KGl0ZW0pOworCQkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJCUl0ZXJhdG9yPENvbnRyaWJ1dGlvblJlY29yZD4gY3IgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKCFjdXJyZW50VmlzaWJpbGl0eSAmJiBjci5oYXNOZXh0KCkpIHsKKwkJCQkJQ29udHJpYnV0aW9uUmVjb3JkIHJlYyA9IGNyLm5leHQoKTsKKwkJCQkJaWYgKCFyZWNlbnRseVVwZGF0ZWQuY29udGFpbnMocmVjKSkgeworCQkJCQkJcmVjLnVwZGF0ZUlzVmlzaWJsZShleHByQ29udGV4dCk7CisJCQkJCQlyZWNlbnRseVVwZGF0ZWQuYWRkKHJlYyk7CisJCQkJCX0KKwkJCQkJY3VycmVudFZpc2liaWxpdHkgfD0gcmVjLmlzVmlzaWJsZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGN1cnJlbnRWaXNpYmlsaXR5CisJCQkJJiYgaXRlbS5nZXRQZXJzaXN0ZWRTdGF0ZSgpLmdldCgKKwkJCQkJCU1lbnVNYW5hZ2VyUmVuZGVyZXIuVklTSUJJTElUWV9JREVOVElGSUVSKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgaWRlbnRpZmllciA9IGl0ZW0uZ2V0UGVyc2lzdGVkU3RhdGUoKS5nZXQoCisJCQkJCU1lbnVNYW5hZ2VyUmVuZGVyZXIuVklTSUJJTElUWV9JREVOVElGSUVSKTsKKwkJCU9iamVjdCByYyA9IGV4cHJDb250ZXh0LmVjbGlwc2VDb250ZXh0LmdldChpZGVudGlmaWVyKTsKKwkJCWlmIChyYyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkJCQljdXJyZW50VmlzaWJpbGl0eSA9ICgoQm9vbGVhbikgcmMpLmJvb2xlYW5WYWx1ZSgpOworCQkJfQorCQl9CisJCWlmIChjdXJyZW50VmlzaWJpbGl0eQorCQkJCSYmIGl0ZW0uZ2V0VmlzaWJsZVdoZW4oKSBpbnN0YW5jZW9mIE1Db3JlRXhwcmVzc2lvbikgeworCQkJYm9vbGVhbiB2YWwgPSBDb250cmlidXRpb25zQW5hbHl6ZXIuaXNWaXNpYmxlKAorCQkJCQkoTUNvcmVFeHByZXNzaW9uKSBpdGVtLmdldFZpc2libGVXaGVuKCksIGV4cHJDb250ZXh0KTsKKwkJCWN1cnJlbnRWaXNpYmlsaXR5ID0gdmFsOworCQl9CisJCXJldHVybiBjdXJyZW50VmlzaWJpbGl0eTsKKwl9CisKKwlwcml2YXRlIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTUNvcmVFeHByZXNzaW9uKSB7CisJCQlPYmplY3QgY29yZUV4cHJlc3Npb24gPSAoKE1Db3JlRXhwcmVzc2lvbikgZXhwcmVzc2lvbikKKwkJCQkJLmdldENvcmVFeHByZXNzaW9uKCk7CisJCQlyZXR1cm4gY29yZUV4cHJlc3Npb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uID8gKEV4cHJlc3Npb24pIGNvcmVFeHByZXNzaW9uCisJCQkJCTogbnVsbDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIE1FeHByZXNzaW9uIG1lcmdlKE1FeHByZXNzaW9uIGV4cHJlc3Npb25BLCBNRXhwcmVzc2lvbiBleHByZXNzaW9uQikgeworCQlFeHByZXNzaW9uIGNvcmVFeHByZXNzaW9uQSA9IGdldEV4cHJlc3Npb24oZXhwcmVzc2lvbkEpOworCQlFeHByZXNzaW9uIGNvcmVFeHByZXNzaW9uQiA9IGdldEV4cHJlc3Npb24oZXhwcmVzc2lvbkIpOworCQlpZiAoY29yZUV4cHJlc3Npb25BID09IG51bGwgfHwgY29yZUV4cHJlc3Npb25CID09IG51bGwpIHsKKwkJCS8vIGltcGxpZWQgdG8gYWx3YXlzIGJlIHZpc2libGUKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChjb3JlRXhwcmVzc2lvbkEuZXF1YWxzKGNvcmVFeHByZXNzaW9uQikpIHsKKwkJCXJldHVybiBleHByZXNzaW9uQTsKKwkJfQorCisJCS8vIGNvbWJpbmUgdGhlIHR3byBleHByZXNzaW9ucworCQlPckV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBPckV4cHJlc3Npb24oKTsKKwkJZXhwcmVzc2lvbi5hZGQoY29yZUV4cHJlc3Npb25BKTsKKwkJZXhwcmVzc2lvbi5hZGQoY29yZUV4cHJlc3Npb25CKTsKKworCQlNQ29yZUV4cHJlc3Npb24gZXhwID0gVWlGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQ29yZUV4cHJlc3Npb24oKTsKKwkJZXhwLnNldENvcmVFeHByZXNzaW9uSWQoInByb2dyYW1tYXRpYy52YWx1ZSIpOyAvLyROT04tTkxTLTEkCisJCWV4cC5zZXRDb3JlRXhwcmVzc2lvbihleHByZXNzaW9uKTsKKwkJcmV0dXJuIGV4cDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBtZXJnZUludG9Nb2RlbCgpIHsKKwkJaW50IGlkeCA9IGdldEluZGV4KG1lbnVNb2RlbCwgbWVudUNvbnRyaWJ1dGlvbi5nZXRQb3NpdGlvbkluUGFyZW50KCkpOworCQlpZiAoaWR4ID09IC0xKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmaW5hbCBMaXN0PE1NZW51RWxlbWVudD4gY29weUVsZW1lbnRzOworCQlpZiAobWVudUNvbnRyaWJ1dGlvbi5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KEZBQ1RPUlkpICE9IG51bGwpIHsKKwkJCWNvcHlFbGVtZW50cyA9IG1lcmdlRmFjdG9yeUludG9Nb2RlbCgpOworCQl9IGVsc2UgeworCQkJY29weUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+KCk7CisJCQlmb3IgKE1NZW51RWxlbWVudCBpdGVtIDogbWVudUNvbnRyaWJ1dGlvbi5nZXRDaGlsZHJlbigpKSB7CisJCQkJTU1lbnVFbGVtZW50IGNvcHkgPSAoTU1lbnVFbGVtZW50KSBFY29yZVV0aWwKKwkJCQkJCS5jb3B5KChFT2JqZWN0KSBpdGVtKTsKKwkJCQljb3B5RWxlbWVudHMuYWRkKGNvcHkpOworCQkJfQorCQl9CisKKwkJZm9yIChNTWVudUVsZW1lbnQgY29weSA6IGNvcHlFbGVtZW50cykgeworCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBNTWVudSkgeworCQkJCU1NZW51IHNoYXJlZCA9IGZpbmRFeGlzdGluZ01lbnUoY29weS5nZXRFbGVtZW50SWQoKSk7CisJCQkJaWYgKHNoYXJlZCA9PSBudWxsKSB7CisJCQkJCXNoYXJlZCA9IChNTWVudSkgY29weTsKKwkJCQkJcmVuZGVyZXIubGlua0VsZW1lbnRUb0NvbnRyaWJ1dGlvblJlY29yZChjb3B5LCB0aGlzKTsKKwkJCQkJbWVudU1vZGVsLmdldENoaWxkcmVuKCkuYWRkKGlkeCsrLCBjb3B5KTsKKwkJCQl9IGVsc2UgeworCQkJCQlzaGFyZWQuc2V0VmlzaWJsZVdoZW4obWVyZ2UoY29weS5nZXRWaXNpYmxlV2hlbigpLAorCQkJCQkJCXNoYXJlZC5nZXRWaXNpYmxlV2hlbigpKSk7CisJCQkJCWNvcHkgPSBzaGFyZWQ7CisJCQkJfQorCQkJCXNoYXJlZEVsZW1lbnRzLmFkZChzaGFyZWQpOworCQkJfSBlbHNlIGlmIChjb3B5IGluc3RhbmNlb2YgTU1lbnVTZXBhcmF0b3IpIHsKKwkJCQlNTWVudVNlcGFyYXRvciBzaGFyZWQgPSBmaW5kRXhpc3RpbmdTZXBhcmF0b3IoY29weQorCQkJCQkJLmdldEVsZW1lbnRJZCgpKTsKKwkJCQlpZiAoc2hhcmVkID09IG51bGwpIHsKKwkJCQkJc2hhcmVkID0gKE1NZW51U2VwYXJhdG9yKSBjb3B5OworCQkJCQlyZW5kZXJlci5saW5rRWxlbWVudFRvQ29udHJpYnV0aW9uUmVjb3JkKGNvcHksIHRoaXMpOworCQkJCQltZW51TW9kZWwuZ2V0Q2hpbGRyZW4oKS5hZGQoaWR4KyssIGNvcHkpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvcHkgPSBzaGFyZWQ7CisJCQkJfQorCQkJCXNoYXJlZEVsZW1lbnRzLmFkZChzaGFyZWQpOworCQkJfSBlbHNlIHsKKwkJCQlnZW5lcmF0ZWRFbGVtZW50cy5hZGQoY29weSk7CisJCQkJcmVuZGVyZXIubGlua0VsZW1lbnRUb0NvbnRyaWJ1dGlvblJlY29yZChjb3B5LCB0aGlzKTsKKwkJCQltZW51TW9kZWwuZ2V0Q2hpbGRyZW4oKS5hZGQoaWR4KyssIGNvcHkpOworCQkJfQorCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBNTWVudSB8fCBjb3B5IGluc3RhbmNlb2YgTU1lbnVTZXBhcmF0b3IpIHsKKwkJCQlyZW5kZXJlci5hZGRSZWNvcmQoY29weSwgdGhpcyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgTGlzdDxNTWVudUVsZW1lbnQ+IG1lcmdlRmFjdG9yeUludG9Nb2RlbCgpIHsKKwkJT2JqZWN0IG9iaiA9IG1lbnVDb250cmlidXRpb24uZ2V0VHJhbnNpZW50RGF0YSgpLmdldChGQUNUT1JZKTsKKwkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbnRleHRGdW5jdGlvbikpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQl9CisJCUlFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gZ2V0U3RhdGljQ29udGV4dCgpOworCQlzdGF0aWNDb250ZXh0LnJlbW92ZShMaXN0LmNsYXNzKTsKKwkJZmFjdG9yeURpc3Bvc2UgPSAoUnVubmFibGUpICgoSUNvbnRleHRGdW5jdGlvbikgb2JqKS5jb21wdXRlKAorCQkJCXN0YXRpY0NvbnRleHQsIG51bGwpOworCQlyZXR1cm4gc3RhdGljQ29udGV4dC5nZXQoTGlzdC5jbGFzcyk7CisJfQorCisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgZ2V0U3RhdGljQ29udGV4dCgpIHsKKwkJaWYgKGluZm9Db250ZXh0ID09IG51bGwpIHsKKwkJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gcmVuZGVyZXIuZ2V0Q29udGV4dChtZW51TW9kZWwpOworCQkJaWYgKHBhcmVudENvbnRleHQgIT0gbnVsbCkgeworCQkJCWluZm9Db250ZXh0ID0gcGFyZW50Q29udGV4dC5jcmVhdGVDaGlsZChTVEFUSUNfQ09OVEVYVCk7CisJCQl9IGVsc2UgeworCQkJCWluZm9Db250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5LmNyZWF0ZShTVEFUSUNfQ09OVEVYVCk7CisJCQl9CisJCQlDb250cmlidXRpb25zQW5hbHl6ZXIucG9wdWxhdGVNb2RlbEludGVyZmFjZXMobWVudU1vZGVsLAorCQkJCQlpbmZvQ29udGV4dCwgbWVudU1vZGVsLmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKTsKKwkJCWluZm9Db250ZXh0LnNldChNZW51TWFuYWdlclJlbmRlcmVyLmNsYXNzLCByZW5kZXJlcik7CisJCX0KKwkJcmV0dXJuIGluZm9Db250ZXh0OworCX0KKworCU1NZW51IGZpbmRFeGlzdGluZ01lbnUoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmb3IgKE1NZW51RWxlbWVudCBpdGVtIDogbWVudU1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChpdGVtIGluc3RhbmNlb2YgTU1lbnUgJiYgaWQuZXF1YWxzKGl0ZW0uZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJcmV0dXJuIChNTWVudSkgaXRlbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlNTWVudVNlcGFyYXRvciBmaW5kRXhpc3RpbmdTZXBhcmF0b3IoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmb3IgKE1NZW51RWxlbWVudCBpdGVtIDogbWVudU1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChpdGVtIGluc3RhbmNlb2YgTU1lbnVTZXBhcmF0b3IKKwkJCQkJJiYgaWQuZXF1YWxzKGl0ZW0uZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJcmV0dXJuIChNTWVudVNlcGFyYXRvcikgaXRlbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlmb3IgKE1NZW51RWxlbWVudCBjb3B5IDogZ2VuZXJhdGVkRWxlbWVudHMpIHsKKwkJCW1lbnVNb2RlbC5nZXRDaGlsZHJlbigpLnJlbW92ZShjb3B5KTsKKwkJfQorCQlmb3IgKE1NZW51RWxlbWVudCBzaGFyZWQgOiBzaGFyZWRFbGVtZW50cykgeworCQkJcmVuZGVyZXIucmVtb3ZlUmVjb3JkKHNoYXJlZCwgdGhpcyk7CisJCQlBcnJheUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPiBhcnJheSA9IHJlbmRlcmVyLmdldExpc3Qoc2hhcmVkKTsKKwkJCWlmIChhcnJheS5pc0VtcHR5KCkpIHsKKwkJCQltZW51TW9kZWwuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoc2hhcmVkKTsKKwkJCX0KKwkJfQorCQlpZiAoZmFjdG9yeURpc3Bvc2UgIT0gbnVsbCkgeworCQkJZmFjdG9yeURpc3Bvc2UucnVuKCk7CisJCQlmYWN0b3J5RGlzcG9zZSA9IG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW5kZXgoTUVsZW1lbnRDb250YWluZXI8Pz4gbWVudU1vZGVsLAorCQkJU3RyaW5nIHBvc2l0aW9uSW5QYXJlbnQpIHsKKwkJU3RyaW5nIGlkID0gbnVsbDsKKwkJU3RyaW5nIG1vZGlmaWVyID0gbnVsbDsKKwkJaWYgKHBvc2l0aW9uSW5QYXJlbnQgIT0gbnVsbCAmJiBwb3NpdGlvbkluUGFyZW50Lmxlbmd0aCgpID4gMCkgeworCQkJU3RyaW5nW10gYXJyYXkgPSBwb3NpdGlvbkluUGFyZW50LnNwbGl0KCI9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCW1vZGlmaWVyID0gYXJyYXlbMF07CisJCQlpZCA9IGFycmF5WzFdOworCQl9CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbWVudU1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpOworCQl9CisKKwkJaW50IGlkeCA9IDA7CisJCWludCBzaXplID0gbWVudU1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpOworCQl3aGlsZSAoaWR4IDwgc2l6ZSkgeworCQkJaWYgKGlkLmVxdWFscyhtZW51TW9kZWwuZ2V0Q2hpbGRyZW4oKS5nZXQoaWR4KS5nZXRFbGVtZW50SWQoKSkpIHsKKwkJCQlpZiAoImFmdGVyIi5lcXVhbHMobW9kaWZpZXIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWR4Kys7CisJCQkJfSBlbHNlIGlmICgiZW5kb2YiLmVxdWFscyhtb2RpZmllcikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkvLyBTa2lwIGN1cnJlbnQgbWVudSBpdGVtCisJCQkJCWlkeCsrOworCisJCQkJCS8vIFNraXAgYWxsIG1lbnUgaXRlbXMgdW50aWwgbmV4dCBNZW51U2VwYXJhdG9yIGlzIGZvdW5kCisJCQkJCXdoaWxlIChpZHggPCBzaXplCisJCQkJCQkJJiYgIShtZW51TW9kZWwuZ2V0Q2hpbGRyZW4oKS5nZXQoaWR4KSBpbnN0YW5jZW9mIE1NZW51U2VwYXJhdG9yICYmIG1lbnVNb2RlbAorCQkJCQkJCQkJLmdldENoaWxkcmVuKCkuZ2V0KGlkeCkuZ2V0RWxlbWVudElkKCkgIT0gbnVsbCkpIHsKKwkJCQkJCWlkeCsrOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBpZHg7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCQlyZXR1cm4gaWQuZXF1YWxzKCJhZGRpdGlvbnMiKSA/IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpLnNpemUoKSA6IC0xOyAvLyROT04tTkxTLTEkCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0RpcmVjdENvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0RpcmVjdENvbnRyaWJ1dGlvbkl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM3YzUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRGlyZWN0Q29udHJpYnV0aW9uSXRlbS5qYXZhCkBAIC0wLDAgKzEsNTc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSm9zZXBoIENhcnJvbGwgPGpkc2FsaW5nZXJqckBnbWFpbC5jb20+IC0gQnVnIDM4NTQxNCBDb250cmlidXRpbmcgd2l6YXJkcworICogICAgIHRvIHRvb2xiYXIgYWx3YXlzIGRpc3BsYXlzIGljb24gYW5kIHRleHQKKyAqICAgICBCcnVjZSBTa2luZ2xlIDxCcnVjZS5Ta2luZ2xlQGltbXV0aWZ5LmNvbT4gLSBCdWcgNDQzMDkyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkVjbGlwc2VDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5DYW5FeGVjdXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Qb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLlJlbmRlcmVkRWxlbWVudFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BYnN0cmFjdFBhcnRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQ29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5JdGVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LnV0aWwuSVNXVFJlc291cmNlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKK3B1YmxpYyBjbGFzcyBEaXJlY3RDb250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7CisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCS8qKiBJbnRlcm5hbCBrZXkgZm9yIHRyYW5zaWVudCBtYXBzIHRvIHByb3ZpZGUgYSBydW5uYWJsZSBvbiB3aWRnZXQgZGlzcG9zYWwgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NBQkxFID0gIklEaXNwb3NhYmxlIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkNFX1RFWFQgPSAiRk9SQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9VUkkgPSAiaWNvblVSSSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfVVJJID0gImRpc2FibGVkVVJJIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQ0lfU1RBVElDX0NPTlRFWFQgPSAiRENJLXN0YXRpY0NvbnRleHQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgbWlzc2luZ0V4ZWN1dGUgPSBuZXcgT2JqZWN0KCk7CisKKwlwcml2YXRlIE1JdGVtIG1vZGVsOworCXByaXZhdGUgV2lkZ2V0IHdpZGdldDsKKwlwcml2YXRlIExpc3RlbmVyIG1lbnVJdGVtTGlzdGVuZXI7CisJcHJpdmF0ZSBMb2NhbFJlc291cmNlTWFuYWdlciBsb2NhbFJlc291cmNlTWFuYWdlcjsKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBpbmZvQ29udGV4dDsKKworCUBJbmplY3QKKwlwcml2YXRlIElDb250cmlidXRpb25GYWN0b3J5IGNvbnRyaWJGYWN0b3J5OworCisJQEluamVjdAorCXByaXZhdGUgRU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2U7CisKKwlwcml2YXRlIElTV1RSZXNvdXJjZVV0aWxpdGllcyByZXNVdGlscyA9IG51bGw7CisKKwlASW5qZWN0CisJdm9pZCBzZXRSZXNvdXJjZVV0aWxzKElSZXNvdXJjZVV0aWxpdGllczxJbWFnZURlc2NyaXB0b3I+IHV0aWxzKSB7CisJCXJlc1V0aWxzID0gKElTV1RSZXNvdXJjZVV0aWxpdGllcykgdXRpbHM7CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKKworCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCQl1cGRhdGUobnVsbCk7CisJCX0KKwl9OworCisJcHVibGljIHZvaWQgc2V0TW9kZWwoTUl0ZW0gaXRlbSkgeworCQltb2RlbCA9IGl0ZW07CisJCXNldElkKG1vZGVsLmdldEVsZW1lbnRJZCgpKTsKKwkJdXBkYXRlVmlzaWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKKwkJaWYgKG1vZGVsID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgc3R5bGUgPSBTV1QuUFVTSDsKKwkJaWYgKG1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5QVVNIKQorCQkJc3R5bGUgPSBTV1QuUFVTSDsKKwkJZWxzZSBpZiAobW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLkNIRUNLKQorCQkJc3R5bGUgPSBTV1QuQ0hFQ0s7CisJCWVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5SQURJTykKKwkJCXN0eWxlID0gU1dULlJBRElPOworCQlNZW51SXRlbSBpdGVtID0gbnVsbDsKKwkJaWYgKGluZGV4ID49IDApIHsKKwkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgc3R5bGUsIGluZGV4KTsKKwkJfSBlbHNlIHsKKwkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgc3R5bGUpOworCQl9CisJCWl0ZW0uc2V0RGF0YSh0aGlzKTsKKworCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBnZXRJdGVtTGlzdGVuZXIoKSk7CisJCWl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBnZXRJdGVtTGlzdGVuZXIoKSk7CisKKwkJd2lkZ2V0ID0gaXRlbTsKKwkJbW9kZWwuc2V0V2lkZ2V0KHdpZGdldCk7CisJCXdpZGdldC5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbW9kZWwpOworCisJCXVwZGF0ZShudWxsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsKFRvb2xCYXIgcGFyZW50LCBpbnQgaW5kZXgpIHsKKwkJaWYgKG1vZGVsID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIGlzRHJvcGRvd24gPSBmYWxzZTsKKwkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTVRvb2xJdGVtKSB7CisJCQlNTWVudSBtZW51ID0gKChNVG9vbEl0ZW0pIG1vZGVsKS5nZXRNZW51KCk7CisJCQlpc0Ryb3Bkb3duID0gbWVudSAhPSBudWxsOworCQl9CisJCWludCBzdHlsZSA9IFNXVC5QVVNIOworCQlpZiAoaXNEcm9wZG93bikKKwkJCXN0eWxlID0gU1dULkRST1BfRE9XTjsKKwkJZWxzZSBpZiAobW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLkNIRUNLKQorCQkJc3R5bGUgPSBTV1QuQ0hFQ0s7CisJCWVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5SQURJTykKKwkJCXN0eWxlID0gU1dULlJBRElPOworCQlUb29sSXRlbSBpdGVtID0gbnVsbDsKKwkJaWYgKGluZGV4ID49IDApIHsKKwkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0ocGFyZW50LCBzdHlsZSwgaW5kZXgpOworCQl9IGVsc2UgeworCQkJaXRlbSA9IG5ldyBUb29sSXRlbShwYXJlbnQsIHN0eWxlKTsKKwkJfQorCQlpdGVtLnNldERhdGEodGhpcyk7CisKKwkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGdldEl0ZW1MaXN0ZW5lcigpKTsKKwkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCisJCXdpZGdldCA9IGl0ZW07CisJCW1vZGVsLnNldFdpZGdldCh3aWRnZXQpOworCQl3aWRnZXQuc2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUsIG1vZGVsKTsKKworCQl1cGRhdGUobnVsbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVZpc2libGUoKSB7CisJCXNldFZpc2libGUoKG1vZGVsKS5pc1Zpc2libGUoKSk7CisJCWZpbmFsIElDb250cmlidXRpb25NYW5hZ2VyIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlpZiAocGFyZW50ICE9IG51bGwpIHsKKwkJCXBhcmVudC5tYXJrRGlydHkoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdXBkYXRlKG51bGwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgaWQpIHsKKwkJdXBkYXRlSWNvbnMoKTsKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIE1lbnVJdGVtKSB7CisJCQl1cGRhdGVNZW51SXRlbSgpOworCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7CisJCQl1cGRhdGVUb29sSXRlbSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lbnVJdGVtKCkgeworCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSB3aWRnZXQ7CisJCVN0cmluZyB0ZXh0ID0gbW9kZWwuZ2V0TG9jYWxpemVkTGFiZWwoKTsKKwkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJaXRlbS5zZXRUZXh0KHRleHQpOworCQl9IGVsc2UgeworCQkJaXRlbS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWl0ZW0uc2V0U2VsZWN0aW9uKG1vZGVsLmlzU2VsZWN0ZWQoKSk7CisJCWl0ZW0uc2V0RW5hYmxlZChtb2RlbC5pc0VuYWJsZWQoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRvb2xJdGVtKCkgeworCQlUb29sSXRlbSBpdGVtID0gKFRvb2xJdGVtKSB3aWRnZXQ7CisJCWZpbmFsIFN0cmluZyB0ZXh0ID0gbW9kZWwuZ2V0TG9jYWxpemVkTGFiZWwoKTsKKwkJSW1hZ2UgaWNvbiA9IGl0ZW0uZ2V0SW1hZ2UoKTsKKwkJYm9vbGVhbiBtb2RlID0gbW9kZWwuZ2V0VGFncygpLmNvbnRhaW5zKEZPUkNFX1RFWFQpOworCQlpZiAoKGljb24gPT0gbnVsbCB8fCBtb2RlKSAmJiB0ZXh0ICE9IG51bGwpIHsKKwkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWl0ZW0uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlmaW5hbCBTdHJpbmcgdG9vbHRpcCA9IG1vZGVsLmdldExvY2FsaXplZFRvb2x0aXAoKTsKKwkJaXRlbS5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKKwkJaXRlbS5zZXRTZWxlY3Rpb24obW9kZWwuaXNTZWxlY3RlZCgpKTsKKwkJaXRlbS5zZXRFbmFibGVkKG1vZGVsLmlzRW5hYmxlZCgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlSWNvbnMoKSB7CisJCWlmICghKHdpZGdldCBpbnN0YW5jZW9mIEl0ZW0pKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSXRlbSBpdGVtID0gKEl0ZW0pIHdpZGdldDsKKwkJU3RyaW5nIGljb25VUkkgPSBtb2RlbC5nZXRJY29uVVJJKCkgIT0gbnVsbCA/IG1vZGVsLmdldEljb25VUkkoKSA6ICIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBkaXNhYmxlZFVSSSA9IGdldERpc2FibGVkSWNvblVSSShtb2RlbCk7CisJCWlmICghaWNvblVSSS5lcXVhbHMoaXRlbS5nZXREYXRhKElDT05fVVJJKSkKKwkJCQl8fCAhZGlzYWJsZWRVUkkuZXF1YWxzKGl0ZW0uZ2V0RGF0YShESVNBQkxFRF9VUkkpKSkgeworCQkJTG9jYWxSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyID0gbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKAorCQkJCQlKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKSk7CisJCQlJbWFnZSBpY29uSW1hZ2UgPSBnZXRJbWFnZShpY29uVVJJLCByZXNvdXJjZU1hbmFnZXIpOworCQkJaXRlbS5zZXRJbWFnZShpY29uSW1hZ2UpOworCQkJaXRlbS5zZXREYXRhKElDT05fVVJJLCBpY29uVVJJKTsKKwkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKKwkJCQlpY29uSW1hZ2UgPSBnZXRJbWFnZShkaXNhYmxlZFVSSSwgcmVzb3VyY2VNYW5hZ2VyKTsKKwkJCQkoKFRvb2xJdGVtKSBpdGVtKS5zZXREaXNhYmxlZEltYWdlKGljb25JbWFnZSk7CisJCQkJaXRlbS5zZXREYXRhKERJU0FCTEVEX1VSSSwgZGlzYWJsZWRVUkkpOworCQkJfQorCQkJZGlzcG9zZU9sZEltYWdlcygpOworCQkJbG9jYWxSZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7CisJCX0KKwl9CisKKwlwcml2YXRlIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uVVJJLCBMb2NhbFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKKwkJSW1hZ2UgaW1hZ2UgPSBudWxsOworCisJCWlmIChpY29uVVJJICE9IG51bGwgJiYgaWNvblVSSS5sZW5ndGgoKSA+IDApIHsKKwkJCUltYWdlRGVzY3JpcHRvciBpY29uRGVzY3JpcHRvciA9IHJlc1V0aWxzCisJCQkJCS5pbWFnZURlc2NyaXB0b3JGcm9tVVJJKFVSSS5jcmVhdGVVUkkoaWNvblVSSSkpOworCQkJaWYgKGljb25EZXNjcmlwdG9yICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlpbWFnZSA9IHJlc291cmNlTWFuYWdlci5jcmVhdGVJbWFnZShpY29uRGVzY3JpcHRvcik7CisJCQkJfSBjYXRjaCAoRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQlpY29uRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvcgorCQkJCQkJCS5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7CisJCQkJCWltYWdlID0gcmVzb3VyY2VNYW5hZ2VyLmNyZWF0ZUltYWdlKGljb25EZXNjcmlwdG9yKTsKKwkJCQkJLy8gYXMgd2UgcmVwbGFjZWQgdGhlIGZhaWxlZCBpY29uLCBsb2cgdGhlIG1lc3NhZ2Ugb25jZS4KKwkJCQkJQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5ERUJVR19NRU5VUywKKwkJCQkJCQkiZmFpbGVkIHRvIGNyZWF0ZSBpbWFnZSAiICsgaWNvblVSSSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldERpc2FibGVkSWNvblVSSShNSXRlbSB0b29sSXRlbSkgeworCQlPYmplY3Qgb2JqID0gdG9vbEl0ZW0uZ2V0VHJhbnNpZW50RGF0YSgpLmdldCgKKwkJCQlJUHJlc2VudGF0aW9uRW5naW5lLkRJU0FCTEVEX0lDT05fSU1BR0VfS0VZKTsKKwkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFN0cmluZyA/IChTdHJpbmcpIG9iaiA6ICIiOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSB2b2lkIGRpc3Bvc2VPbGRJbWFnZXMoKSB7CisJCWlmIChsb2NhbFJlc291cmNlTWFuYWdlciAhPSBudWxsKSB7CisJCQlsb2NhbFJlc291cmNlTWFuYWdlci5kaXNwb3NlKCk7CisJCQlsb2NhbFJlc291cmNlTWFuYWdlciA9IG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIExpc3RlbmVyIGdldEl0ZW1MaXN0ZW5lcigpIHsKKwkJaWYgKG1lbnVJdGVtTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJbWVudUl0ZW1MaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQkJc3dpdGNoIChldmVudC50eXBlKSB7CisJCQkJCWNhc2UgU1dULkRpc3Bvc2U6CisJCQkJCQloYW5kbGVXaWRnZXREaXNwb3NlKGV2ZW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNXVC5EZWZhdWx0U2VsZWN0aW9uOgorCQkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCQlpZiAoZXZlbnQud2lkZ2V0ICE9IG51bGwpIHsKKwkJCQkJCQloYW5kbGVXaWRnZXRTZWxlY3Rpb24oZXZlbnQpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBtZW51SXRlbUxpc3RlbmVyOworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVXaWRnZXREaXNwb3NlKEV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudC53aWRnZXQgPT0gd2lkZ2V0KSB7CisJCQlpZiAoaW5mb0NvbnRleHQgIT0gbnVsbCkgeworCQkJCWluZm9Db250ZXh0LmRpc3Bvc2UoKTsKKwkJCQlpbmZvQ29udGV4dCA9IG51bGw7CisJCQl9CisJCQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQkJd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCBnZXRJdGVtTGlzdGVuZXIoKSk7CisJCQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGdldEl0ZW1MaXN0ZW5lcigpKTsKKwkJCXdpZGdldCA9IG51bGw7CisJCQlPYmplY3Qgb2JqID0gbW9kZWwuZ2V0VHJhbnNpZW50RGF0YSgpLmdldChESVNQT1NBQkxFKTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBSdW5uYWJsZSkgeworCQkJCSgoUnVubmFibGUpIG9iaikucnVuKCk7CisJCQl9CisJCQltb2RlbC5zZXRXaWRnZXQobnVsbCk7CisJCQlkaXNwb3NlT2xkSW1hZ2VzKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKKwkJCXdpZGdldC5kaXNwb3NlKCk7CisJCQl3aWRnZXQgPSBudWxsOworCQkJbW9kZWwuc2V0V2lkZ2V0KG51bGwpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZGdldFNlbGVjdGlvbihFdmVudCBldmVudCkgeworCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCWlmIChkcm9wZG93bkV2ZW50KGV2ZW50KSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChtb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuQ0hFQ0sKKwkJCQkJfHwgbW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLlJBRElPKSB7CisJCQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBmYWxzZTsKKwkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgTWVudUl0ZW0pIHsKKwkJCQkJc2VsZWN0aW9uID0gKChNZW51SXRlbSkgd2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKKwkJCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7CisJCQkJCXNlbGVjdGlvbiA9ICgoVG9vbEl0ZW0pIHdpZGdldCkuZ2V0U2VsZWN0aW9uKCk7CisJCQkJfQorCQkJCW1vZGVsLnNldFNlbGVjdGVkKHNlbGVjdGlvbik7CisJCQl9CisJCQlpZiAoY2FuRXhlY3V0ZUl0ZW0oZXZlbnQpKSB7CisJCQkJZXhlY3V0ZUl0ZW0oZXZlbnQpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGRyb3Bkb3duRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cgJiYgbW9kZWwgaW5zdGFuY2VvZiBNVG9vbEl0ZW0pIHsKKwkJCVRvb2xJdGVtIHRpID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7CisJCQlNTWVudSBtbWVudSA9ICgoTVRvb2xJdGVtKSBtb2RlbCkuZ2V0TWVudSgpOworCQkJaWYgKG1tZW51ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlNZW51IG1lbnUgPSBnZXRNZW51KG1tZW51LCB0aSk7CisJCQlpZiAobWVudSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IHRpLmdldEJvdW5kcygpOworCQkJUG9pbnQgZGlzcGxheUF0ID0gdGkuZ2V0UGFyZW50KCkudG9EaXNwbGF5KGl0ZW1Cb3VuZHMueCwKKwkJCQkJaXRlbUJvdW5kcy55ICsgaXRlbUJvdW5kcy5oZWlnaHQpOworCQkJbWVudS5zZXRMb2NhdGlvbihkaXNwbGF5QXQpOworCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOworCisJCQlEaXNwbGF5IGRpc3BsYXkgPSBtZW51LmdldERpc3BsYXkoKTsKKwkJCXdoaWxlIChtZW51LmlzVmlzaWJsZSgpKSB7CisJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7CisJCQkJCWRpc3BsYXkuc2xlZXAoKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIE1lbnUgZ2V0TWVudShmaW5hbCBNTWVudSBtbWVudSwgVG9vbEl0ZW0gdG9vbEl0ZW0pIHsKKwkJT2JqZWN0IG9iaiA9IG1tZW51LmdldFdpZGdldCgpOworCQlpZiAob2JqIGluc3RhbmNlb2YgTWVudSAmJiAhKChNZW51KSBvYmopLmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuIChNZW51KSBvYmo7CisJCX0KKwkJLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSBwYXNzdGhyb3VnaCBvZiB0aGUgSU1lbnVDcmVhdG9yCisJCWlmIChSZW5kZXJlZEVsZW1lbnRVdGlsLmlzUmVuZGVyZWRNZW51KG1tZW51KSkgeworCQkJb2JqID0gUmVuZGVyZWRFbGVtZW50VXRpbC5nZXRDb250cmlidXRpb25NYW5hZ2VyKG1tZW51KTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29udGV4dEZ1bmN0aW9uKSB7CisJCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBnZXRDb250ZXh0KG1tZW51KTsKKwkJCQlvYmogPSAoKElDb250ZXh0RnVuY3Rpb24pIG9iaikuY29tcHV0ZShsY2xDb250ZXh0LCBudWxsKTsKKwkJCQlSZW5kZXJlZEVsZW1lbnRVdGlsLnNldENvbnRyaWJ1dGlvbk1hbmFnZXIobW1lbnUsIG9iaik7CisJCQl9CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSU1lbnVDcmVhdG9yKSB7CisJCQkJZmluYWwgSU1lbnVDcmVhdG9yIGNyZWF0b3IgPSAoSU1lbnVDcmVhdG9yKSBvYmo7CisJCQkJZmluYWwgTWVudSBtZW51ID0gY3JlYXRvci5nZXRNZW51KHRvb2xJdGVtLmdldFBhcmVudCgpCisJCQkJCQkuZ2V0U2hlbGwoKSk7CisJCQkJaWYgKG1lbnUgIT0gbnVsbCkgeworCQkJCQl0b29sSXRlbS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkJCS8qKgorCQkJCQkJICoKKwkJCQkJCSAqLworCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJCQlpZiAobWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQljcmVhdG9yLmRpc3Bvc2UoKTsKKwkJCQkJCQkJbW1lbnUuc2V0V2lkZ2V0KG51bGwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJCS8vIG1tZW51LnNldFdpZGdldChtZW51KTsKKwkJCQkJbWVudS5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbWVudSk7CisJCQkJCXJldHVybiBtZW51OworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtb2RlbCk7CisJCQlJUHJlc2VudGF0aW9uRW5naW5lIGVuZ2luZSA9IGxjbENvbnRleHQKKwkJCQkJLmdldChJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzKTsKKwkJCW9iaiA9IGVuZ2luZS5jcmVhdGVHdWkobW1lbnUsIHRvb2xJdGVtLmdldFBhcmVudCgpLCBsY2xDb250ZXh0KTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBNZW51KSB7CisJCQkJcmV0dXJuIChNZW51KSBvYmo7CisJCQl9CisJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIlJlbmRlcmluZyByZXR1cm5lZCAiICsgb2JqKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGdldFN0YXRpY0NvbnRleHQoRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGluZm9Db250ZXh0ID09IG51bGwpIHsKKwkJCWluZm9Db250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5LmNyZWF0ZShEQ0lfU1RBVElDX0NPTlRFWFQpOworCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKG1vZGVsLCBpbmZvQ29udGV4dCwKKwkJCQkJbW9kZWwuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpOworCQl9CisJCWlmIChldmVudCA9PSBudWxsKSB7CisJCQlpbmZvQ29udGV4dC5yZW1vdmUoRXZlbnQuY2xhc3MpOworCQl9IGVsc2UgeworCQkJaW5mb0NvbnRleHQuc2V0KEV2ZW50LmNsYXNzLCBldmVudCk7CisJCX0KKwkJcmV0dXJuIGluZm9Db250ZXh0OworCX0KKworCXByaXZhdGUgdm9pZCBleGVjdXRlSXRlbShFdmVudCB0cmlnZ2VyKSB7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtb2RlbCk7CisJCWlmICghY2hlY2tDb250cmlidXRpb24obGNsQ29udGV4dCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlNQ29udHJpYnV0aW9uIGNvbnRyaWIgPSAoTUNvbnRyaWJ1dGlvbikgbW9kZWw7CisJCUlFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gZ2V0U3RhdGljQ29udGV4dCh0cmlnZ2VyKTsKKwkJT2JqZWN0IHJlc3VsdCA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShjb250cmliLmdldE9iamVjdCgpLCBFeGVjdXRlLmNsYXNzLAorCQkJCWdldEV4ZWN1dGlvbkNvbnRleHQobGNsQ29udGV4dCksIHN0YXRpY0NvbnRleHQsIG1pc3NpbmdFeGVjdXRlKTsKKwkJaWYgKHJlc3VsdCA9PSBtaXNzaW5nRXhlY3V0ZSAmJiBsb2dnZXIgIT0gbnVsbCkgeworCQkJbG9nZ2VyLmVycm9yKCJDb250cmlidXRpb24gaXMgbWlzc2luZyBARXhlY3V0ZTogIiArIGNvbnRyaWIuZ2V0Q29udHJpYnV0aW9uVVJJKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2FuRXhlY3V0ZUl0ZW0oRXZlbnQgdHJpZ2dlcikgeworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQobW9kZWwpOworCQlpZiAoIWNoZWNrQ29udHJpYnV0aW9uKGxjbENvbnRleHQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJTUNvbnRyaWJ1dGlvbiBjb250cmliID0gKE1Db250cmlidXRpb24pIG1vZGVsOworCQlJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IGdldFN0YXRpY0NvbnRleHQodHJpZ2dlcik7CisJCUJvb2xlYW4gcmVzdWx0ID0gKChCb29sZWFuKSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoCisJCQkJY29udHJpYi5nZXRPYmplY3QoKSwgQ2FuRXhlY3V0ZS5jbGFzcywKKwkJCQlnZXRFeGVjdXRpb25Db250ZXh0KGxjbENvbnRleHQpLCBzdGF0aWNDb250ZXh0LCBCb29sZWFuLlRSVUUpKTsKKwkJcmV0dXJuIHJlc3VsdC5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgQENhbkV4ZWN1dGUgYW5kIEBFeGVjdXRlIG1ldGhvZHMuCisJICogVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IHVzZWQgYnkgdGhlCisJICogRUhhbmRsZXJTZXJ2aWNlLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IGZvciB0aGlzIGl0ZW0KKwkgKiBAcmV0dXJuIHRoZSBleGVjdXRpb24gY29udGV4dAorCSAqLworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGdldEV4ZWN1dGlvbkNvbnRleHQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJaWYgKGNvbnRleHQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCXJldHVybiBjb250ZXh0LmdldEFjdGl2ZUxlYWYoKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tDb250cmlidXRpb24oSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQpIHsKKwkJaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBNQ29udHJpYnV0aW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCU1Db250cmlidXRpb24gY29udHJpYiA9IChNQ29udHJpYnV0aW9uKSBtb2RlbDsKKwkJaWYgKGNvbnRyaWIuZ2V0T2JqZWN0KCkgPT0gbnVsbCkgeworCQkJY29udHJpYi5zZXRPYmplY3QoY29udHJpYkZhY3RvcnkuY3JlYXRlKAorCQkJCQljb250cmliLmdldENvbnRyaWJ1dGlvblVSSSgpLCBsY2xDb250ZXh0KSk7CisJCX0KKwkJcmV0dXJuIGNvbnRyaWIuZ2V0T2JqZWN0KCkgIT0gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgcGFyZW50KSB7CisJCWlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgeworCQkJSU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSAoSU1lbnVNYW5hZ2VyKSBnZXRQYXJlbnQoKTsKKwkJCW1lbnVNZ3IucmVtb3ZlTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7CisJCX0KKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgeworCQkJSU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSAoSU1lbnVNYW5hZ2VyKSBwYXJlbnQ7CisJCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOworCQl9CisJCXN1cGVyLnNldFBhcmVudChwYXJlbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIHBhcmVudCBjb250ZXh0IGZvciB0aGlzIHBhcnQuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20KKwkgKiBAcmV0dXJuIHRoZSBwYXJlbnQncyBjbG9zZXN0IGNvbnRleHQsIG9yIGdsb2JhbCBjb250ZXh0IGlmIG5vbmUgaW4gdGhlCisJICogICAgICAgICBoaWVyYXJjaHkKKwkgKi8KKwlwcm90ZWN0ZWQgSUVjbGlwc2VDb250ZXh0IGdldENvbnRleHRGb3JQYXJlbnQoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXJldHVybiBtb2RlbFNlcnZpY2UuZ2V0Q29udGFpbmluZ0NvbnRleHQoZWxlbWVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgY29udGV4dCBmb3IgdGhpcyBwYXJ0LgorCSAqCisJICogQHBhcmFtIHBhcnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tCisJICogQHJldHVybiB0aGUgY2xvc2VzdCBjb250ZXh0LCBvciBnbG9iYWwgY29udGV4dCBpZiBub25lIGluIHRoZSBoaWVyYXJjaHkKKwkgKi8KKwlwcm90ZWN0ZWQgSUVjbGlwc2VDb250ZXh0IGdldENvbnRleHQoTVVJRWxlbWVudCBwYXJ0KSB7CisJCWlmIChwYXJ0IGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCXJldHVybiAoKE1Db250ZXh0KSBwYXJ0KS5nZXRDb250ZXh0KCk7CisJCX0KKwkJcmV0dXJuIGdldENvbnRleHRGb3JQYXJlbnQocGFydCk7CisJfQorCisJcHVibGljIFdpZGdldCBnZXRXaWRnZXQoKSB7CisJCXJldHVybiB3aWRnZXQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRGlyZWN0TWVudUl0ZW1SZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRGlyZWN0TWVudUl0ZW1SZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODdiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9EaXJlY3RNZW51SXRlbVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5FeGVjdXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5JdGVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EaXJlY3RNZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CisKKy8qKgorICogQ3JlYXRlIGEgY29udHJpYnV0ZSBwYXJ0LgorICovCitwdWJsaWMgY2xhc3MgRGlyZWN0TWVudUl0ZW1SZW5kZXJlciBleHRlbmRzIE1lbnVJdGVtUmVuZGVyZXIgeworCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1EaXJlY3RNZW51SXRlbSkgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBNZW51KSkKKwkJCXJldHVybiBudWxsOworCisJCU1EaXJlY3RNZW51SXRlbSBpdGVtTW9kZWwgPSAoTURpcmVjdE1lbnVJdGVtKSBlbGVtZW50OworCQlpZiAoaXRlbU1vZGVsLmdldFZpc2libGVXaGVuKCkgIT0gbnVsbCkgeworCQkJcHJvY2Vzc1Zpc2libGUoaXRlbU1vZGVsKTsKKwkJfQorCisJCWlmICghaXRlbU1vZGVsLmlzVmlzaWJsZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGRldGVybWluZSB0aGUgaW5kZXggYXQgd2hpY2ggd2Ugc2hvdWxkIGNyZWF0ZSB0aGUgbmV3IGl0ZW0KKwkJaW50IGFkZEluZGV4ID0gY2FsY1Zpc2libGVJbmRleChlbGVtZW50KTsKKworCQkvLyBPSywgaXQncyBhIHJlYWwgbWVudSBpdGVtLCB3aGF0IGtpbmQ/CisJCWludCBmbGFncyA9IDA7CisJCWlmIChpdGVtTW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLlBVU0gpCisJCQlmbGFncyA9IFNXVC5QVVNIOworCQllbHNlIGlmIChpdGVtTW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLkNIRUNLKQorCQkJZmxhZ3MgPSBTV1QuQ0hFQ0s7CisJCWVsc2UgaWYgKGl0ZW1Nb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuUkFESU8pCisJCQlmbGFncyA9IFNXVC5SQURJTzsKKworCQlNZW51SXRlbSBuZXdJdGVtID0gbmV3IE1lbnVJdGVtKChNZW51KSBwYXJlbnQsIGZsYWdzLCBhZGRJbmRleCk7CisJCXNldEl0ZW1UZXh0KGl0ZW1Nb2RlbCwgbmV3SXRlbSk7CisJCW5ld0l0ZW0uc2V0SW1hZ2UoZ2V0SW1hZ2UoaXRlbU1vZGVsKSk7CisJCXNldEVuYWJsZWQoaXRlbU1vZGVsLCBuZXdJdGVtKTsKKwkJbmV3SXRlbS5zZXRFbmFibGVkKGl0ZW1Nb2RlbC5pc0VuYWJsZWQoKSk7CisJCW5ld0l0ZW0uc2V0U2VsZWN0aW9uKGl0ZW1Nb2RlbC5pc1NlbGVjdGVkKCkpOworCisJCXJldHVybiBuZXdJdGVtOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRFbmFibGVkKE1EaXJlY3RNZW51SXRlbSBpdGVtTW9kZWwsIGZpbmFsIE1lbnVJdGVtIG5ld0l0ZW0pIHsKKwkJLy8gVE9ETyBkaXJlY3QgcXVlcnkgdG8gQENhbkV4ZWN1dGUgZ29lcyBoZXJlCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaG9va0NvbnRyb2xsZXJMb2dpYyhNVUlFbGVtZW50IG1lKSB7CisJCXN1cGVyLmhvb2tDb250cm9sbGVyTG9naWMobWUpOworCisJCS8vICdFeGVjdXRlJyB0aGUgb3BlcmF0aW9uIGlmIHBvc3NpYmxlCisJCWlmIChtZSBpbnN0YW5jZW9mIE1EaXJlY3RNZW51SXRlbQorCQkJCSYmICgoTURpcmVjdE1lbnVJdGVtKSBtZSkuZ2V0Q29udHJpYnV0aW9uVVJJKCkgIT0gbnVsbCkgeworCQkJZmluYWwgTU1lbnVJdGVtIGl0ZW0gPSAoTU1lbnVJdGVtKSBtZTsKKwkJCWZpbmFsIE1EaXJlY3RNZW51SXRlbSBjb250cmliID0gKE1EaXJlY3RNZW51SXRlbSkgbWU7CisJCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQobWUpOworCQkJTWVudUl0ZW0gbWkgPSAoTWVudUl0ZW0pIG1lLmdldFdpZGdldCgpOworCQkJbWkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCS8qKgorCQkJCSAqCisJCQkJICovCisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWxjbENvbnRleHQuc2V0KE1JdGVtLmNsYXNzLmdldE5hbWUoKSwgaXRlbSk7CisJCQkJCUNvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShjb250cmliLmdldE9iamVjdCgpLAorCQkJCQkJCUV4ZWN1dGUuY2xhc3MsIGxjbENvbnRleHQpOworCQkJCQlsY2xDb250ZXh0LnJlbW92ZShNSXRlbS5jbGFzcy5nZXROYW1lKCkpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJfQorCQkJfSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9EeW5hbWljQ29udHJpYnV0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRHluYW1pY0NvbnRyaWJ1dGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYwMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRHluYW1pY0NvbnRyaWJ1dGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIE1FREVWSVQsIEZIViBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWFyY28gRGVzY2hlciA8bWFyY29AZGVzY2hlci5hdD4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKKworLyoqCisgKiBUaGlzIGl0ZW0gY3VycmVudGx5IHNlcnZlcyBhcyBhIHBsYWNlaG9sZGVyIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBsb2NhdGlvbgorICogb2YgYSBkeW5hbWljIG1lbnUgY29udHJpYnV0aW9uIGVudHJ5LgorICovCitjbGFzcyBEeW5hbWljQ29udHJpYnV0aW9uQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0geworCS8qKgorCSAqCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwlwcml2YXRlIE1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbiBtb2RlbDsKKworCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCQltYW5hZ2VyLm1hcmtEaXJ0eSgpOworCQl9CisJfTsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaXRlbSBhbmQgYXNzb2NpYXRlZCBtb2RlbDsKKwkgKgorCSAqIEBwYXJhbSBpdGVtCisJICovCisJcHVibGljIER5bmFtaWNDb250cmlidXRpb25Db250cmlidXRpb25JdGVtKE1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbiBpdGVtKSB7CisJCXN1cGVyKGl0ZW0uZ2V0RWxlbWVudElkKCkpOworCQltb2RlbCA9IGl0ZW07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtb2RlbCBlbGVtZW50CisJICovCisJcHVibGljIE1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbiBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIG1vZGVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFBhcmVudChJQ29udHJpYnV0aW9uTWFuYWdlciBwYXJlbnQpIHsKKwkJaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKSB7CisJCQlJTWVudU1hbmFnZXIgbWVudU1nciA9IChJTWVudU1hbmFnZXIpIGdldFBhcmVudCgpOworCQkJbWVudU1nci5yZW1vdmVNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKKwkJfQorCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKSB7CisJCQlJTWVudU1hbmFnZXIgbWVudU1nciA9IChJTWVudU1hbmFnZXIpIHBhcmVudDsKKwkJCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7CisJCX0KKwkJc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRWxlbWVudFJlZmVyZW5jZVJlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9FbGVtZW50UmVmZXJlbmNlUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTEwN2IyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvRWxlbWVudFJlZmVyZW5jZVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QbGFjZWhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVByZXNlbnRhdGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKKworLyoqCisgKiBDcmVhdGUgYW4gZWxlbWVudCBmcm9tIGEgcmVmZXJlbmNlCisgKi8KK3B1YmxpYyBjbGFzcyBFbGVtZW50UmVmZXJlbmNlUmVuZGVyZXIgZXh0ZW5kcyBTV1RQYXJ0UmVuZGVyZXIgeworCUBJbmplY3QKKwlATmFtZWQoV29ya2JlbmNoUmVuZGVyZXJGYWN0b3J5LlNIQVJFRF9FTEVNRU5UU19TVE9SRSkKKwlwcml2YXRlIE1hcDxNVUlFbGVtZW50LCBTZXQ8TVBsYWNlaG9sZGVyPj4gcmVuZGVyZWRNYXA7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJUHJlc2VudGF0aW9uRW5naW5lIHJlbmRlcmluZ0VuZ2luZTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlV2lkZ2V0KGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlNUGxhY2Vob2xkZXIgcGggPSAoTVBsYWNlaG9sZGVyKSBlbGVtZW50OworCQlmaW5hbCBNVUlFbGVtZW50IHJlZiA9IHBoLmdldFJlZigpOworCQlyZWYuc2V0Q3VyU2hhcmVkUmVmKHBoKTsKKworCQlTZXQ8TVBsYWNlaG9sZGVyPiByZW5kZXJlZFJlZnMgPSByZW5kZXJlZE1hcC5nZXQocmVmKTsKKwkJaWYgKHJlbmRlcmVkUmVmcyA9PSBudWxsKSB7CisJCQlyZW5kZXJlZFJlZnMgPSBuZXcgSGFzaFNldDxNUGxhY2Vob2xkZXI+KCk7CisJCQlyZW5kZXJlZE1hcC5wdXQocmVmLCByZW5kZXJlZFJlZnMpOworCQl9CisKKwkJaWYgKCFyZW5kZXJlZFJlZnMuY29udGFpbnMocGgpKQorCQkJcmVuZGVyZWRSZWZzLmFkZChwaCk7CisKKwkJQ29tcG9zaXRlIG5ld0NvbXAgPSBuZXcgQ29tcG9zaXRlKChDb21wb3NpdGUpIHBhcmVudCwgU1dULk5PTkUpOworCQluZXdDb21wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKKworCQkvLyBpZiB0aGUgcGxhY2Vob2xkZXIgaXMgKm5vdCogaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUKKwkJLy8gdGhlbiBkb24ndCByZS1wYXJlbnQgdGhlIGN1cnJlbnQgdmlldworCQlpbnQgcGhMb2MgPSBtb2RlbFNlcnZpY2UuZ2V0RWxlbWVudExvY2F0aW9uKHBoKTsKKwkJaWYgKHBoTG9jID09IEVNb2RlbFNlcnZpY2UuSU5fQUNUSVZFX1BFUlNQRUNUSVZFCisJCQkJfHwgcGhMb2MgPT0gRU1vZGVsU2VydmljZS5JTl9TSEFSRURfQVJFQQorCQkJCXx8IHBoTG9jID09IEVNb2RlbFNlcnZpY2UuT1VUU0lERV9QRVJTUEVDVElWRSkgeworCQkJQ29udHJvbCByZWZXaWRnZXQgPSAoQ29udHJvbCkgcmVmLmdldFdpZGdldCgpOworCQkJaWYgKHJlZldpZGdldCA9PSBudWxsKSB7CisJCQkJcmVmLnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCQlyZWZXaWRnZXQgPSAoQ29udHJvbCkgcmVuZGVyaW5nRW5naW5lLmNyZWF0ZUd1aShyZWYsIG5ld0NvbXAsCisJCQkJCQlnZXRDb250ZXh0Rm9yUGFyZW50KHJlZikpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVmV2lkZ2V0LmdldFBhcmVudCgpICE9IG5ld0NvbXApIHsKKwkJCQkJcmVmV2lkZ2V0LnNldFBhcmVudChuZXdDb21wKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChyZWYgaW5zdGFuY2VvZiBNQ29udGV4dCkgeworCQkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gKChNQ29udGV4dCkgcmVmKS5nZXRDb250ZXh0KCk7CisJCQkJSUVjbGlwc2VDb250ZXh0IG5ld1BhcmVudENvbnRleHQgPSBnZXRDb250ZXh0KHBoKTsKKwkJCQlpZiAoY29udGV4dC5nZXRQYXJlbnQoKSAhPSBuZXdQYXJlbnRDb250ZXh0KSB7CisJCQkJCWNvbnRleHQuc2V0UGFyZW50KG5ld1BhcmVudENvbnRleHQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBuZXdDb21wOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2VXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1QbGFjZWhvbGRlciBwaCA9IChNUGxhY2Vob2xkZXIpIGVsZW1lbnQ7CisJCU1VSUVsZW1lbnQgcmVmRWxlbWVudCA9IHBoLmdldFJlZigpOworCQlDb250cm9sIHJlZkN0cmwgPSAoQ29udHJvbCkgcmVmRWxlbWVudC5nZXRXaWRnZXQoKTsKKworCQkvLyBSZW1vdmUgdGhlIGVsZW1lbnQgcmVmIGZyb20gdGhlIHJlbmRlcmVkIGxpc3QKKwkJU2V0PE1QbGFjZWhvbGRlcj4gcmVmcyA9IHJlbmRlcmVkTWFwLmdldChyZWZFbGVtZW50KTsKKwkJcmVmcy5yZW1vdmUocGgpOworCisJCUlFY2xpcHNlQ29udGV4dCBjdXJDb250ZXh0ID0gbW9kZWxTZXJ2aWNlLmdldENvbnRhaW5pbmdDb250ZXh0KHBoKTsKKworCQlpZiAocmVmcy5zaXplKCkgPT0gMCkgeworCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGltYWdlIGlzIHRoZSAnb3JpZ2luYWwnIGltYWdlIGZvciB0aGlzCisJCQkvLyBwYXJ0LiBTZWUgYnVnIDM0NzQ3MSBmb3IgZGV0YWlscworCQkJaWYgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCU1QYXJ0IHRoZVBhcnQgPSAoTVBhcnQpIHJlZkVsZW1lbnQ7CisJCQkJU3RyaW5nIGltYWdlVVJJID0gdGhlUGFydC5nZXRJY29uVVJJKCk7CisJCQkJdGhlUGFydC5zZXRJY29uVVJJKG51bGwpOworCQkJCXRoZVBhcnQuc2V0SWNvblVSSShpbWFnZVVSSSk7CisJCQl9CisKKwkJCXJlbmRlcmluZ0VuZ2luZS5yZW1vdmVHdWkocmVmRWxlbWVudCk7CisJCX0gZWxzZSB7CisJCQkvLyBFbnN1cmUgdGhhdCB0aGUgZGlzcG9zZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgZG9lc24ndCBjYXNjYWRlCisJCQkvLyB0byBkaXNwb3NlIHRoZSAncmVhbCcgcGFydAorCQkJaWYgKHJlZkN0cmwgIT0gbnVsbCAmJiAhcmVmQ3RybC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQlNUGxhY2Vob2xkZXIgY3VycmVudFJlZiA9IHJlZkVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQkJaWYgKGN1cnJlbnRSZWYgPT0gcGgpIHsKKwkJCQkJLy8gRmluZCBhbm90aGVyICpyZW5kZXJlZCogcmVmIHRvIHBhc3MgdGhlIHBhcnQgb24gdG8KKwkJCQkJZm9yIChNUGxhY2Vob2xkZXIgYVBIIDogcmVmcykgeworCQkJCQkJQ29tcG9zaXRlIHBoQ29tcCA9IChDb21wb3NpdGUpIGFQSC5nZXRXaWRnZXQoKTsKKwkJCQkJCWlmIChwaENvbXAgPT0gbnVsbCB8fCBwaENvbXAuaXNEaXNwb3NlZCgpKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkvLyBSZXBhcmVudCB0aGUgY29udGV4dChzKSAoaWYgYW55KQorCQkJCQkJSUVjbGlwc2VDb250ZXh0IG5ld1BhcmVudENvbnRleHQgPSBtb2RlbFNlcnZpY2UKKwkJCQkJCQkJLmdldENvbnRhaW5pbmdDb250ZXh0KGFQSCk7CisJCQkJCQlMaXN0PE1Db250ZXh0PiBhbGxDb250ZXh0cyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoCisJCQkJCQkJCXJlZkVsZW1lbnQsIG51bGwsIE1Db250ZXh0LmNsYXNzLCBudWxsKTsKKwkJCQkJCWZvciAoTUNvbnRleHQgY3R4dEVsZW1lbnQgOiBhbGxDb250ZXh0cykgeworCQkJCQkJCUlFY2xpcHNlQ29udGV4dCB0aGVDb250ZXh0ID0gY3R4dEVsZW1lbnQKKwkJCQkJCQkJCS5nZXRDb250ZXh0KCk7CisJCQkJCQkJLy8gdGhpcyBtYXkgYmUgbnVsbCBpZiBpdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQKKwkJCQkJCQlpZiAodGhlQ29udGV4dCAhPSBudWxsKSB7CisJCQkJCQkJCWlmICh0aGVDb250ZXh0LmdldFBhcmVudCgpID09IGN1ckNvbnRleHQpIHsKKwkJCQkJCQkJCS8vIGFib3V0IHRvIHJlcGFyZW50IHRoZSBjb250ZXh0LCBpZiB3ZSdyZQorCQkJCQkJCQkJLy8gdGhlIGFjdGl2ZSBjaGlsZCBvZiB0aGUgY3VycmVudCBwYXJlbnQsCisJCQkJCQkJCQkvLyBkZWFjdGl2YXRlIG91cnNlbHZlcyBmaXJzdAorCQkJCQkJCQkJaWYgKGN1ckNvbnRleHQuZ2V0QWN0aXZlQ2hpbGQoKSA9PSB0aGVDb250ZXh0KSB7CisJCQkJCQkJCQkJdGhlQ29udGV4dC5kZWFjdGl2YXRlKCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQl0aGVDb250ZXh0LnNldFBhcmVudChuZXdQYXJlbnRDb250ZXh0KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gcmVzZXQgdGhlICdjdXInIHJlZgorCQkJCQkJcmVmRWxlbWVudC5zZXRDdXJTaGFyZWRSZWYoYVBIKTsKKworCQkJCQkJLy8gUmVwYXJlbnQgdGhlIHdpZGdldAorCQkJCQkJcmVmQ3RybC5zZXRQYXJlbnQocGhDb21wKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChjdXJyZW50UmVmICE9IG51bGwpIHsKKwkJCQkJQ29tcG9zaXRlIHBoQ29tcCA9IChDb21wb3NpdGUpIGN1cnJlbnRSZWYuZ2V0V2lkZ2V0KCk7CisJCQkJCWlmIChwaENvbXAgPT0gbnVsbCB8fCBwaENvbXAuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQlzdXBlci5kaXNwb3NlV2lkZ2V0KGVsZW1lbnQpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJLy8gUmVwYXJlbnQgdGhlIGNvbnRleHQocykgKGlmIGFueSkKKwkJCQkJSUVjbGlwc2VDb250ZXh0IG5ld1BhcmVudENvbnRleHQgPSBtb2RlbFNlcnZpY2UKKwkJCQkJCQkuZ2V0Q29udGFpbmluZ0NvbnRleHQoY3VycmVudFJlZik7CisJCQkJCUxpc3Q8TUNvbnRleHQ+IGFsbENvbnRleHRzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cygKKwkJCQkJCQlyZWZFbGVtZW50LCBudWxsLCBNQ29udGV4dC5jbGFzcywgbnVsbCk7CisJCQkJCWZvciAoTUNvbnRleHQgY3R4dEVsZW1lbnQgOiBhbGxDb250ZXh0cykgeworCQkJCQkJSUVjbGlwc2VDb250ZXh0IHRoZUNvbnRleHQgPSBjdHh0RWxlbWVudC5nZXRDb250ZXh0KCk7CisJCQkJCQkvLyB0aGlzIG1heSBiZSBudWxsIGlmIGl0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldAorCQkJCQkJaWYgKHRoZUNvbnRleHQgIT0gbnVsbAorCQkJCQkJCQkmJiB0aGVDb250ZXh0LmdldFBhcmVudCgpID09IGN1ckNvbnRleHQpIHsKKwkJCQkJCQkvLyBhYm91dCB0byByZXBhcmVudCB0aGUgY29udGV4dCwgaWYgd2UncmUgdGhlCisJCQkJCQkJLy8gYWN0aXZlIGNoaWxkIG9mIHRoZSBjdXJyZW50IHBhcmVudCwgZGVhY3RpdmF0ZQorCQkJCQkJCS8vIG91cnNlbHZlcyBmaXJzdAorCQkJCQkJCWlmIChjdXJDb250ZXh0LmdldEFjdGl2ZUNoaWxkKCkgPT0gdGhlQ29udGV4dCkgeworCQkJCQkJCQl0aGVDb250ZXh0LmRlYWN0aXZhdGUoKTsKKwkJCQkJCQl9CisJCQkJCQkJdGhlQ29udGV4dC5zZXRQYXJlbnQobmV3UGFyZW50Q29udGV4dCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlzdXBlci5kaXNwb3NlV2lkZ2V0KGVsZW1lbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0hhbmRsZWRDb250cmlidXRpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9IYW5kbGVkQ29udHJpYnV0aW9uSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODliMGIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9IYW5kbGVkQ29udHJpYnV0aW9uSXRlbS5qYXZhCkBAIC0wLDAgKzEsODk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSm9zZXBoIENhcnJvbGwgPGpkc2FsaW5nZXJqckBnbWFpbC5jb20+IC0gQnVnIDM4NTQxNCBDb250cmlidXRpbmcgd2l6YXJkcyB0byB0b29sYmFyIGFsd2F5cyBkaXNwbGF5cyBpY29uIGFuZCB0ZXh0CisgKiAgICAgU25qZXphbmEgUGVjbyA8c25qZXphbmEucGVjb0ByZWRoYXQuY29tPiAtIE1lbW9yeSBsZWFrcyBpbiBKdW5vIHdoZW4gb3BlbmluZyBhbmQgY2xvc2luZyBYTUwgRWRpdG9yIC0gaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvMzk3OTA5CisgKiAgICAgTWFyY28gRGVzY2hlciA8bWFyY29AZGVzY2hlci5hdD4gLSBCdWcgMzk3Njc3CisgKiAgICAgRG1pdHJ5IFNwaXJpZGVub2sgLSBCdWcgNDI5NzU2CisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDQ1NzIzLCA0NTA4NjMKKyAqICAgICBEaXJrIEZhdXRoIDxkaXJrLmZhdXRoQGdvb2dsZW1haWwuY29tPiAtIEJ1ZyA0NjEwMjYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FQ29tbWFuZFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FSGFuZGxlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5JQ29tbWFuZEhlbHBTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuRWNsaXBzZUNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5FQmluZGluZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Qb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLlJlbmRlcmVkRWxlbWVudFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnJlbmRlcmVycy5zd3QuSVVwZGF0ZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BYnN0cmFjdFBhcnRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5JdGVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1IYW5kbGVkSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuaGVscC5FSGVscFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LnV0aWwuSVNXVFJlc291cmNlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubWVudXMuSU1lbnVTdGF0ZUlkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKK3B1YmxpYyBjbGFzcyBIYW5kbGVkQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0geworCS8qKgorCSAqCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkvKioKKwkgKiBDb25zdGFudCBmcm9tIG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLlJhZGlvU3RhdGUuUEFSQU1FVEVSX0lECisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1VJX0NPTU1BTkRTX1JBRElPX1NUQVRFX1BBUkFNRVRFUiA9ICJvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5yYWRpb1N0YXRlUGFyYW1ldGVyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29uc3RhbnQgZnJvbSBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5SYWRpb1N0YXRlLlNUQVRFX0lECisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1VJX0NPTU1BTkRTX1JBRElPX1NUQVRFID0gIm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLnJhZGlvU3RhdGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdGFudCBmcm9tIG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLlJlZ2lzdHJ5VG9nZ2xlU3RhdGUuU1RBVEVfSUQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVUlfQ09NTUFORFNfVE9HR0xFX1NUQVRFID0gIm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLnRvZ2dsZVN0YXRlIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkNFX1RFWFQgPSAiRk9SQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9VUkkgPSAiaWNvblVSSSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfVVJJID0gImRpc2FibGVkVVJJIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NBQkxFX0NIRUNLID0gIklEaXNwb3NhYmxlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXV19TVVBQT1JUID0gIm9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3ciOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhDSV9TVEFUSUNfQ09OVEVYVCA9ICJIQ0ktc3RhdGljQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIE1IYW5kbGVkSXRlbSBtb2RlbDsKKwlwcml2YXRlIFdpZGdldCB3aWRnZXQ7CisJcHJpdmF0ZSBMaXN0ZW5lciBtZW51SXRlbUxpc3RlbmVyOworCXByaXZhdGUgTG9jYWxSZXNvdXJjZU1hbmFnZXIgbG9jYWxSZXNvdXJjZU1hbmFnZXI7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOworCisJLy8gV2UnbGwgb25seSBldmVyIGxvZyBhbiBlcnJvciBkdXJpbmcgdXBkYXRlIG9uY2UgdG8gcHJldmVudCBzcGFtbWluZyB0aGUKKwkvLyBsb2cKKwlwcml2YXRlIGJvb2xlYW4gbG9nZ2VkID0gZmFsc2U7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2U7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlwcml2YXRlIEVCaW5kaW5nU2VydmljZSBiaW5kaW5nU2VydmljZTsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIElVcGRhdGVTZXJ2aWNlIHVwZGF0ZVNlcnZpY2U7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSBFSGVscFNlcnZpY2UgaGVscFNlcnZpY2U7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKwlwcml2YXRlIElDb21tYW5kSGVscFNlcnZpY2UgY29tbWFuZEhlbHBTZXJ2aWNlOworCisJcHJpdmF0ZSBSdW5uYWJsZSB1bnJlZmVyZW5jZVJ1bm5hYmxlOworCisJcHJpdmF0ZSBJU1dUUmVzb3VyY2VVdGlsaXRpZXMgcmVzVXRpbHMgPSBudWxsOworCisJcHJpdmF0ZSBJU3RhdGVMaXN0ZW5lciBzdGF0ZUxpc3RlbmVyID0gbmV3IElTdGF0ZUxpc3RlbmVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoU3RhdGUgc3RhdGUsIE9iamVjdCBvbGRWYWx1ZSkgeworCQkJdXBkYXRlU3RhdGUoKTsKKwkJfQorCX07CisKKwlASW5qZWN0CisJdm9pZCBzZXRSZXNvdXJjZVV0aWxzKElSZXNvdXJjZVV0aWxpdGllczxJbWFnZURlc2NyaXB0b3I+IHV0aWxzKSB7CisJCXJlc1V0aWxzID0gKElTV1RSZXNvdXJjZVV0aWxpdGllcykgdXRpbHM7CisJfQorCisJcHJpdmF0ZSBJU2FmZVJ1bm5hYmxlIGdldFVwZGF0ZVJ1bm5lcigpIHsKKwkJaWYgKHVwZGF0ZVJ1bm5lciA9PSBudWxsKSB7CisJCQl1cGRhdGVSdW5uZXIgPSBuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJYm9vbGVhbiBzaG91bGRFbmFibGUgPSBjYW5FeGVjdXRlSXRlbShudWxsKTsKKwkJCQkJaWYgKHNob3VsZEVuYWJsZSAhPSBtb2RlbC5pc0VuYWJsZWQoKSkgeworCQkJCQkJbW9kZWwuc2V0RW5hYmxlZChzaG91bGRFbmFibGUpOworCQkJCQkJdXBkYXRlKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQlpZiAoIWxvZ2dlZCkgeworCQkJCQkJbG9nZ2VkID0gdHJ1ZTsKKwkJCQkJCWlmIChsb2dnZXIgIT0gbnVsbCkgeworCQkJCQkJCWxvZ2dlci5lcnJvcigKKwkJCQkJCQkJCWV4Y2VwdGlvbiwKKwkJCQkJCQkJCSJJbnRlcm5hbCBlcnJvciBkdXJpbmcgdG9vbCBpdGVtIGVuYWJsZW1lbnQgdXBkYXRpbmcsIHRoaXMgaXMgb25seSBsb2dnZWQgb25jZSBwZXIgdG9vbCBpdGVtLiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiB1cGRhdGVSdW5uZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSXRlbUVuYWJsZW1lbnQoKSB7CisJCWlmICghKG1vZGVsLmdldFdpZGdldCgpIGluc3RhbmNlb2YgVG9vbEl0ZW0pKQorCQkJcmV0dXJuOworCisJCVRvb2xJdGVtIHdpZGdldCA9IChUb29sSXRlbSkgbW9kZWwuZ2V0V2lkZ2V0KCk7CisJCWlmICh3aWRnZXQgPT0gbnVsbCB8fCB3aWRnZXQuaXNEaXNwb3NlZCgpKQorCQkJcmV0dXJuOworCisJCVNhZmVSdW5uZXIucnVuKGdldFVwZGF0ZVJ1bm5lcigpKTsKKwl9CisKKwlwcml2YXRlIElNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IElNZW51TGlzdGVuZXIoKSB7CisJCS8qKgorCQkgKgorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgeworCQkJdXBkYXRlKG51bGwpOworCQl9CisJfTsKKworCXByaXZhdGUgSVNhZmVSdW5uYWJsZSB1cGRhdGVSdW5uZXI7CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBpbmZvQ29udGV4dDsKKworCXByaXZhdGUgU3RhdGUgc3R5bGVTdGF0ZTsKKworCXByaXZhdGUgU3RhdGUgdG9nZ2xlU3RhdGU7CisKKwlwcml2YXRlIFN0YXRlIHJhZGlvU3RhdGU7CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RlbChNSGFuZGxlZEl0ZW0gaXRlbSkgeworCQltb2RlbCA9IGl0ZW07CisJCXNldElkKG1vZGVsLmdldEVsZW1lbnRJZCgpKTsKKwkJZ2VuZXJhdGVDb21tYW5kKCk7CisJCWlmIChtb2RlbC5nZXRDb21tYW5kKCkgPT0gbnVsbCkgeworCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7CisJCQkJbG9nZ2VyLmVycm9yKCJFbGVtZW50ICIgKyBtb2RlbC5nZXRFbGVtZW50SWQoKSArICIgaW52YWxpZCwgbm8gY29tbWFuZCBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKwkJfQorCQl1cGRhdGVWaXNpYmxlKCk7CisJfQorCisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVDb21tYW5kKCkgeworCQlpZiAobW9kZWwuZ2V0Q29tbWFuZCgpICE9IG51bGwgJiYgbW9kZWwuZ2V0V2JDb21tYW5kKCkgPT0gbnVsbCkgeworCQkJU3RyaW5nIGNtZElkID0gbW9kZWwuZ2V0Q29tbWFuZCgpLmdldEVsZW1lbnRJZCgpOworCQkJaWYgKGNtZElkID09IG51bGwpIHsKKwkJCQlBY3RpdmF0b3IubG9nKElTdGF0dXMuRVJST1IsICJVbmFibGUgdG8gZ2VuZXJhdGUgcGFyYW1ldGVyaXplZCBjb21tYW5kIGZvciAiICsgbW9kZWwgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyAiLiBFbGVtZW50SWQgaXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsKKwkJCX0KKwkJCUxpc3Q8TVBhcmFtZXRlcj4gbW9kZWxQYXJtcyA9IG1vZGVsLmdldFBhcmFtZXRlcnMoKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0Pig0KTsKKwkJCWZvciAoTVBhcmFtZXRlciBtUGFybSA6IG1vZGVsUGFybXMpIHsKKwkJCQlwYXJhbWV0ZXJzLnB1dChtUGFybS5nZXROYW1lKCksIG1QYXJtLmdldFZhbHVlKCkpOworCQkJfQorCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgcGFybUNtZCA9IGNvbW1hbmRTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoY21kSWQsCisJCQkJCXBhcmFtZXRlcnMpOworCQkJQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5ERUJVR19NRU5VUywgImNvbW1hbmQ6ICIgKyBwYXJtQ21kLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHBhcm1DbWQgPT0gbnVsbCkgeworCQkJCUFjdGl2YXRvci5sb2coSVN0YXR1cy5FUlJPUiwKKwkJCQkJCSJVbmFibGUgdG8gZ2VuZXJhdGUgcGFyYW1ldGVyaXplZCBjb21tYW5kIGZvciAiICsgbW9kZWwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrICIgd2l0aCAiICsgcGFyYW1ldGVycyk7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCW1vZGVsLnNldFdiQ29tbWFuZChwYXJtQ21kKTsKKworCQkJc3R5bGVTdGF0ZSA9IHBhcm1DbWQuZ2V0Q29tbWFuZCgpLmdldFN0YXRlKElNZW51U3RhdGVJZHMuU1RZTEUpOworCQkJdG9nZ2xlU3RhdGUgPSBwYXJtQ21kLmdldENvbW1hbmQoKS5nZXRTdGF0ZSgKKwkJCQkJT1JHX0VDTElQU0VfVUlfQ09NTUFORFNfVE9HR0xFX1NUQVRFKTsKKwkJCXJhZGlvU3RhdGUgPSBwYXJtQ21kLmdldENvbW1hbmQoKS5nZXRTdGF0ZSgKKwkJCQkJT1JHX0VDTElQU0VfVUlfQ09NTUFORFNfUkFESU9fU1RBVEUpOworCQkJdXBkYXRlU3RhdGUoKTsKKworCQkJaWYgKHN0eWxlU3RhdGUgIT0gbnVsbCkgeworCQkJCXN0eWxlU3RhdGUuYWRkTGlzdGVuZXIoc3RhdGVMaXN0ZW5lcik7CisJCQl9IGVsc2UgaWYgKHRvZ2dsZVN0YXRlICE9IG51bGwpIHsKKwkJCQl0b2dnbGVTdGF0ZS5hZGRMaXN0ZW5lcihzdGF0ZUxpc3RlbmVyKTsKKwkJCX0gZWxzZSBpZiAocmFkaW9TdGF0ZSAhPSBudWxsKSB7CisJCQkJcmFkaW9TdGF0ZS5hZGRMaXN0ZW5lcihzdGF0ZUxpc3RlbmVyKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZSgpIHsKKwkJaWYgKHN0eWxlU3RhdGUgIT0gbnVsbCkgeworCQkJbW9kZWwuc2V0U2VsZWN0ZWQoKChCb29sZWFuKSBzdHlsZVN0YXRlLmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJfSBlbHNlIGlmICh0b2dnbGVTdGF0ZSAhPSBudWxsKSB7CisJCQltb2RlbC5zZXRTZWxlY3RlZCgoKEJvb2xlYW4pIHRvZ2dsZVN0YXRlLmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJfSBlbHNlIGlmIChyYWRpb1N0YXRlICE9IG51bGwgJiYgbW9kZWwuZ2V0V2JDb21tYW5kKCkgIT0gbnVsbCkgeworCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgYyA9IG1vZGVsLmdldFdiQ29tbWFuZCgpOworCQkJT2JqZWN0IHBhcmFtZXRlciA9IGMuZ2V0UGFyYW1ldGVyTWFwKCkuZ2V0KAorCQkJCQlPUkdfRUNMSVBTRV9VSV9DT01NQU5EU19SQURJT19TVEFURV9QQVJBTUVURVIpOworCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcmFkaW9TdGF0ZS5nZXRWYWx1ZSgpOworCQkJbW9kZWwuc2V0U2VsZWN0ZWQodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMocGFyYW1ldGVyKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7CisJCWlmIChtb2RlbCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHdpZGdldCAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHN0eWxlID0gU1dULlBVU0g7CisJCWlmIChtb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuUFVTSCkKKwkJCXN0eWxlID0gU1dULlBVU0g7CisJCWVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5DSEVDSykKKwkJCXN0eWxlID0gU1dULkNIRUNLOworCQllbHNlIGlmIChtb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuUkFESU8pCisJCQlzdHlsZSA9IFNXVC5SQURJTzsKKwkJTWVudUl0ZW0gaXRlbSA9IG51bGw7CisJCWlmIChpbmRleCA+PSAwKSB7CisJCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIHN0eWxlLCBpbmRleCk7CisJCX0gZWxzZSB7CisJCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIHN0eWxlKTsKKwkJfQorCQlpdGVtLnNldERhdGEodGhpcyk7CisKKwkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGdldEl0ZW1MaXN0ZW5lcigpKTsKKwkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5IZWxwLCBnZXRJdGVtTGlzdGVuZXIoKSk7CisKKwkJd2lkZ2V0ID0gaXRlbTsKKwkJbW9kZWwuc2V0V2lkZ2V0KHdpZGdldCk7CisJCXdpZGdldC5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbW9kZWwpOworCisJCXVwZGF0ZShudWxsKTsKKworCQlpZiAodXBkYXRlU2VydmljZSAhPSBudWxsKSB7CisJCQl1bnJlZmVyZW5jZVJ1bm5hYmxlID0gdXBkYXRlU2VydmljZS5yZWdpc3RlckVsZW1lbnRGb3JVcGRhdGUoCisJCQkJCW1vZGVsLmdldFdiQ29tbWFuZCgpLCBtb2RlbCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsKFRvb2xCYXIgcGFyZW50LCBpbnQgaW5kZXgpIHsKKwkJaWYgKG1vZGVsID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIGlzRHJvcGRvd24gPSBmYWxzZTsKKwkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTVRvb2xJdGVtKSB7CisJCQlNTWVudSBtZW51ID0gKChNVG9vbEl0ZW0pIG1vZGVsKS5nZXRNZW51KCk7CisJCQlpc0Ryb3Bkb3duID0gbWVudSAhPSBudWxsOworCQl9CisJCWludCBzdHlsZSA9IFNXVC5QVVNIOworCQlpZiAoaXNEcm9wZG93bikKKwkJCXN0eWxlID0gU1dULkRST1BfRE9XTjsKKwkJZWxzZSBpZiAobW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLkNIRUNLKQorCQkJc3R5bGUgPSBTV1QuQ0hFQ0s7CisJCWVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5SQURJTykKKwkJCXN0eWxlID0gU1dULlJBRElPOworCQlUb29sSXRlbSBpdGVtID0gbnVsbDsKKwkJaWYgKGluZGV4ID49IDApIHsKKwkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0ocGFyZW50LCBzdHlsZSwgaW5kZXgpOworCQl9IGVsc2UgeworCQkJaXRlbSA9IG5ldyBUb29sSXRlbShwYXJlbnQsIHN0eWxlKTsKKwkJfQorCQlpdGVtLnNldERhdGEodGhpcyk7CisKKwkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGdldEl0ZW1MaXN0ZW5lcigpKTsKKwkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCisJCXdpZGdldCA9IGl0ZW07CisJCW1vZGVsLnNldFdpZGdldCh3aWRnZXQpOworCQl3aWRnZXQuc2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUsIG1vZGVsKTsKKwkJVG9vbEl0ZW1VcGRhdGVyIHVwZGF0ZXIgPSBnZXRVcGRhdGVyKCk7CisJCWlmICh1cGRhdGVyICE9IG51bGwpIHsKKwkJCXVwZGF0ZXIucmVnaXN0ZXJJdGVtKHRoaXMpOworCQl9CisKKwkJdXBkYXRlKG51bGwpOworCQlob29rQ2hlY2tMaXN0ZW5lcigpOworCisJCWlmICh1cGRhdGVTZXJ2aWNlICE9IG51bGwpIHsKKwkJCXVucmVmZXJlbmNlUnVubmFibGUgPSB1cGRhdGVTZXJ2aWNlLnJlZ2lzdGVyRWxlbWVudEZvclVwZGF0ZSgKKwkJCQkJbW9kZWwuZ2V0V2JDb21tYW5kKCksIG1vZGVsKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBob29rQ2hlY2tMaXN0ZW5lcigpIHsKKwkJaWYgKG1vZGVsLmdldFR5cGUoKSAhPSBJdGVtVHlwZS5DSEVDSykgeworCQkJcmV0dXJuOworCQl9CisJCU9iamVjdCBvYmogPSBtb2RlbC5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KEl0ZW1UeXBlLkNIRUNLLnRvU3RyaW5nKCkpOworCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbnRleHRGdW5jdGlvbikgeworCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KG1vZGVsKTsKKwkJCUlFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gZ2V0U3RhdGljQ29udGV4dChudWxsKTsKKwkJCXN0YXRpY0NvbnRleHQuc2V0KE1QYXJ0LmNsYXNzLCBjb250ZXh0LmdldChNUGFydC5jbGFzcykpOworCQkJc3RhdGljQ29udGV4dC5zZXQoV1dfU1VQUE9SVCwgY29udGV4dC5nZXQoV1dfU1VQUE9SVCkpOworCisJCQlJQ29udGV4dEZ1bmN0aW9uIGZ1bmMgPSAoSUNvbnRleHRGdW5jdGlvbikgb2JqOworCQkJb2JqID0gZnVuYy5jb21wdXRlKHN0YXRpY0NvbnRleHQsIG51bGwpOworCQkJaWYgKG9iaiAhPSBudWxsKSB7CisJCQkJbW9kZWwuZ2V0VHJhbnNpZW50RGF0YSgpLnB1dChESVNQT1NBQkxFX0NIRUNLLCBvYmopOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVuaG9va0NoZWNrTGlzdGVuZXIoKSB7CisJCWlmIChtb2RlbC5nZXRUeXBlKCkgIT0gSXRlbVR5cGUuQ0hFQ0spIHsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBPYmplY3Qgb2JqID0gbW9kZWwuZ2V0VHJhbnNpZW50RGF0YSgpLnJlbW92ZShESVNQT1NBQkxFX0NIRUNLKTsKKwkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJKChSdW5uYWJsZSkgb2JqKS5ydW4oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVmlzaWJsZSgpIHsKKwkJc2V0VmlzaWJsZSgobW9kZWwpLmlzVmlzaWJsZSgpKTsKKwkJZmluYWwgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJcGFyZW50Lm1hcmtEaXJ0eSgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl1cGRhdGUobnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFN0cmluZyBpZCkgeworCQl1cGRhdGVJY29ucygpOworCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgTWVudUl0ZW0pIHsKKwkJCXVwZGF0ZU1lbnVJdGVtKCk7CisJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKKwkJCXVwZGF0ZVRvb2xJdGVtKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlTWVudUl0ZW0oKSB7CisJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pIHdpZGdldDsKKwkJU3RyaW5nIHRleHQgPSBtb2RlbC5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBwYXJtQ21kID0gbW9kZWwuZ2V0V2JDb21tYW5kKCk7CisJCVN0cmluZyBrZXlCaW5kaW5nVGV4dCA9IG51bGw7CisJCWlmIChwYXJtQ21kICE9IG51bGwpIHsKKwkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0VtcHR5KCkpIHsKKwkJCQl0ZXh0ID0gbW9kZWwuZ2V0Q29tbWFuZCgpLmdldExvY2FsaXplZENvbW1hbmROYW1lKCk7CisJCQl9CisJCQlpZiAoYmluZGluZ1NlcnZpY2UgIT0gbnVsbCkgeworCQkJCVRyaWdnZXJTZXF1ZW5jZSBiaW5kaW5nID0gYmluZGluZ1NlcnZpY2UKKwkJCQkJCS5nZXRCZXN0U2VxdWVuY2VGb3IocGFybUNtZCk7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkKKwkJCQkJa2V5QmluZGluZ1RleHQgPSBiaW5kaW5nLmZvcm1hdCgpOworCQkJfQorCQl9CisJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE1NZW51RWxlbWVudCkgeworCQkJCVN0cmluZyBtbmVtb25pY3MgPSAoKE1NZW51RWxlbWVudCkgbW9kZWwpLmdldE1uZW1vbmljcygpOworCQkJCWlmIChtbmVtb25pY3MgIT0gbnVsbCAmJiAhbW5lbW9uaWNzLmlzRW1wdHkoKSkgeworCQkJCQlpbnQgaWR4ID0gdGV4dC5pbmRleE9mKG1uZW1vbmljcyk7CisJCQkJCWlmIChpZHggIT0gLTEpIHsKKwkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpZHgpICsgJyYnCisJCQkJCQkJCSsgdGV4dC5zdWJzdHJpbmcoaWR4KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChrZXlCaW5kaW5nVGV4dCA9PSBudWxsKQorCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKKwkJCWVsc2UKKwkJCQlpdGVtLnNldFRleHQodGV4dCArICdcdCcgKyBrZXlCaW5kaW5nVGV4dCk7CisJCX0gZWxzZSB7CisJCQlpdGVtLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaXRlbS5zZXRTZWxlY3Rpb24obW9kZWwuaXNTZWxlY3RlZCgpKTsKKwkJaXRlbS5zZXRFbmFibGVkKG1vZGVsLmlzRW5hYmxlZCgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVG9vbEl0ZW0oKSB7CisJCVRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pIHdpZGdldDsKKworCQlpZiAoaXRlbS5nZXRJbWFnZSgpID09IG51bGwgfHwgbW9kZWwuZ2V0VGFncygpLmNvbnRhaW5zKEZPUkNFX1RFWFQpKSB7CisJCQlmaW5hbCBTdHJpbmcgdGV4dCA9IG1vZGVsLmdldExvY2FsaXplZExhYmVsKCk7CisJCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgeworCQkJCWZpbmFsIE1Db21tYW5kIGNvbW1hbmQgPSBtb2RlbC5nZXRDb21tYW5kKCk7CisJCQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworCQkJCQkvLyBTZXQgc29tZSB0ZXh0IHNvIHRoYXQgdGhlIGl0ZW0gc3RheXMgdmlzaWJsZSBpbiB0aGUgbWVudQorCQkJCQlpdGVtLnNldFRleHQoIlVuTGFibGVkIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQlpdGVtLnNldFRleHQoY29tbWFuZC5nZXRMb2NhbGl6ZWRDb21tYW5kTmFtZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWl0ZW0uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCWZpbmFsIFN0cmluZyB0b29sdGlwID0gZ2V0VG9vbFRpcFRleHQoKTsKKwkJaXRlbS5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKKwkJaXRlbS5zZXRTZWxlY3Rpb24obW9kZWwuaXNTZWxlY3RlZCgpKTsKKwkJaXRlbS5zZXRFbmFibGVkKG1vZGVsLmlzRW5hYmxlZCgpKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKKwkJU3RyaW5nIHRleHQgPSBtb2RlbC5nZXRMb2NhbGl6ZWRUb29sdGlwKCk7CisJCVBhcmFtZXRlcml6ZWRDb21tYW5kIHBhcm1DbWQgPSBtb2RlbC5nZXRXYkNvbW1hbmQoKTsKKwkJaWYgKHBhcm1DbWQgPT0gbnVsbCkgeworCQkJZ2VuZXJhdGVDb21tYW5kKCk7CisJCQlwYXJtQ21kID0gbW9kZWwuZ2V0V2JDb21tYW5kKCk7CisJCX0KKworCQlpZiAocGFybUNtZCAhPSBudWxsICYmIHRleHQgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQl0ZXh0ID0gcGFybUNtZC5nZXROYW1lKCk7CisJCQl9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCisJCVRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSA9IGJpbmRpbmdTZXJ2aWNlLmdldEJlc3RTZXF1ZW5jZUZvcihwYXJtQ21kKTsKKwkJaWYgKHNlcXVlbmNlICE9IG51bGwpIHsKKwkJCXRleHQgPSB0ZXh0ICsgIiAoIiArIHNlcXVlbmNlLmZvcm1hdCgpICsgJyknOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHRleHQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUljb25zKCkgeworCQlpZiAoISh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSkgeworCQkJcmV0dXJuOworCQl9CisJCUl0ZW0gaXRlbSA9IChJdGVtKSB3aWRnZXQ7CisJCVN0cmluZyBpY29uVVJJID0gbW9kZWwuZ2V0SWNvblVSSSgpICE9IG51bGwgPyBtb2RlbC5nZXRJY29uVVJJKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgZGlzYWJsZWRVUkkgPSBnZXREaXNhYmxlZEljb25VUkkobW9kZWwpOworCQlPYmplY3QgZGlzYWJsZWREYXRhID0gaXRlbS5nZXREYXRhKERJU0FCTEVEX1VSSSk7CisJCWlmIChkaXNhYmxlZERhdGEgPT0gbnVsbCkKKwkJCWRpc2FibGVkRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCisJCWlmICghaWNvblVSSS5lcXVhbHMoaXRlbS5nZXREYXRhKElDT05fVVJJKSkKKwkJCQl8fCAhZGlzYWJsZWRVUkkuZXF1YWxzKGRpc2FibGVkRGF0YSkpIHsKKwkJCUxvY2FsUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciA9IG5ldyBMb2NhbFJlc291cmNlTWFuYWdlcigKKwkJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkpOworCQkJSW1hZ2UgaWNvbkltYWdlID0gZ2V0SW1hZ2UoaWNvblVSSSwgcmVzb3VyY2VNYW5hZ2VyKTsKKwkJCWl0ZW0uc2V0SW1hZ2UoaWNvbkltYWdlKTsKKwkJCWl0ZW0uc2V0RGF0YShJQ09OX1VSSSwgaWNvblVSSSk7CisJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7CisJCQkJaWNvbkltYWdlID0gZ2V0SW1hZ2UoZGlzYWJsZWRVUkksIHJlc291cmNlTWFuYWdlcik7CisJCQkJKChUb29sSXRlbSkgaXRlbSkuc2V0RGlzYWJsZWRJbWFnZShpY29uSW1hZ2UpOworCQkJCWl0ZW0uc2V0RGF0YShESVNBQkxFRF9VUkksIGRpc2FibGVkVVJJKTsKKwkJCX0KKwkJCWRpc3Bvc2VPbGRJbWFnZXMoKTsKKwkJCWxvY2FsUmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGlzYWJsZWRJY29uVVJJKE1JdGVtIHRvb2xJdGVtKSB7CisJCU9iamVjdCBvYmogPSB0b29sSXRlbS5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KAorCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuRElTQUJMRURfSUNPTl9JTUFHRV9LRVkpOworCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU3RyaW5nID8gKFN0cmluZykgb2JqIDogIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uVVJJLCBMb2NhbFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKKwkJSW1hZ2UgaW1hZ2UgPSBudWxsOworCisJCWlmIChpY29uVVJJICE9IG51bGwgJiYgaWNvblVSSS5sZW5ndGgoKSA+IDApIHsKKwkJCUltYWdlRGVzY3JpcHRvciBpY29uRGVzY3JpcHRvciA9IHJlc1V0aWxzCisJCQkJCS5pbWFnZURlc2NyaXB0b3JGcm9tVVJJKFVSSS5jcmVhdGVVUkkoaWNvblVSSSkpOworCQkJaWYgKGljb25EZXNjcmlwdG9yICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlpbWFnZSA9IHJlc291cmNlTWFuYWdlci5jcmVhdGVJbWFnZShpY29uRGVzY3JpcHRvcik7CisJCQkJfSBjYXRjaCAoRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQlpY29uRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvcgorCQkJCQkJCS5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7CisJCQkJCWltYWdlID0gcmVzb3VyY2VNYW5hZ2VyLmNyZWF0ZUltYWdlKGljb25EZXNjcmlwdG9yKTsKKwkJCQkJLy8gYXMgd2UgcmVwbGFjZWQgdGhlIGZhaWxlZCBpY29uLCBsb2cgdGhlIG1lc3NhZ2Ugb25jZS4KKwkJCQkJQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5ERUJVR19NRU5VUywKKwkJCQkJCQkiZmFpbGVkIHRvIGNyZWF0ZSBpbWFnZSAiICsgaWNvblVSSSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKworCXByaXZhdGUgdm9pZCBkaXNwb3NlT2xkSW1hZ2VzKCkgeworCQlpZiAobG9jYWxSZXNvdXJjZU1hbmFnZXIgIT0gbnVsbCkgeworCQkJbG9jYWxSZXNvdXJjZU1hbmFnZXIuZGlzcG9zZSgpOworCQkJbG9jYWxSZXNvdXJjZU1hbmFnZXIgPSBudWxsOworCQl9CisJfQorCisJcHJpdmF0ZSBMaXN0ZW5lciBnZXRJdGVtTGlzdGVuZXIoKSB7CisJCWlmIChtZW51SXRlbUxpc3RlbmVyID09IG51bGwpIHsKKwkJCW1lbnVJdGVtTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCQkJCQljYXNlIFNXVC5EaXNwb3NlOgorCQkJCQkJaGFuZGxlV2lkZ2V0RGlzcG9zZShldmVudCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTV1QuRGVmYXVsdFNlbGVjdGlvbjoKKwkJCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgorCQkJCQkJaWYgKGV2ZW50LndpZGdldCAhPSBudWxsKSB7CisJCQkJCQkJaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGV2ZW50KTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNXVC5IZWxwOgorCQkJCQkJaGFuZGxlSGVscFJlcXVlc3QoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfTsKKwkJfQorCQlyZXR1cm4gbWVudUl0ZW1MaXN0ZW5lcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0RGlzcG9zZShFdmVudCBldmVudCkgeworCQlpZiAoZXZlbnQud2lkZ2V0ID09IHdpZGdldCkgeworCQkJaWYgKHVucmVmZXJlbmNlUnVubmFibGUgIT0gbnVsbCkgeworCQkJCXVucmVmZXJlbmNlUnVubmFibGUucnVuKCk7CisJCQkJdW5yZWZlcmVuY2VSdW5uYWJsZSA9IG51bGw7CisJCQl9CisJCQl1bmhvb2tDaGVja0xpc3RlbmVyKCk7CisJCQlUb29sSXRlbVVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKKwkJCWlmICh1cGRhdGVyICE9IG51bGwpIHsKKwkJCQl1cGRhdGVyLnJlbW92ZUl0ZW0odGhpcyk7CisJCQl9CisJCQlpZiAoaW5mb0NvbnRleHQgIT0gbnVsbCkgeworCQkJCWluZm9Db250ZXh0LmRpc3Bvc2UoKTsKKwkJCQlpbmZvQ29udGV4dCA9IG51bGw7CisJCQl9CisJCQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQkJd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCBnZXRJdGVtTGlzdGVuZXIoKSk7CisJCQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGdldEl0ZW1MaXN0ZW5lcigpKTsKKwkJCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuSGVscCwgZ2V0SXRlbUxpc3RlbmVyKCkpOworCQkJd2lkZ2V0ID0gbnVsbDsKKwkJCW1vZGVsLnNldFdpZGdldChudWxsKTsKKwkJCWRpc3Bvc2VPbGRJbWFnZXMoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmICh3aWRnZXQgIT0gbnVsbCkgeworCQkJaWYgKHVucmVmZXJlbmNlUnVubmFibGUgIT0gbnVsbCkgeworCQkJCXVucmVmZXJlbmNlUnVubmFibGUucnVuKCk7CisJCQkJdW5yZWZlcmVuY2VSdW5uYWJsZSA9IG51bGw7CisJCQl9CisKKwkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQgPSBtb2RlbC5nZXRXYkNvbW1hbmQoKTsKKwkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKKwkJCQlpZiAoc3R5bGVTdGF0ZSAhPSBudWxsKSB7CisJCQkJCXN0eWxlU3RhdGUucmVtb3ZlTGlzdGVuZXIoc3RhdGVMaXN0ZW5lcik7CisJCQkJCXN0eWxlU3RhdGUgPSBudWxsOworCQkJCX0KKwkJCQlpZiAodG9nZ2xlU3RhdGUgIT0gbnVsbCkgeworCQkJCQl0b2dnbGVTdGF0ZS5yZW1vdmVMaXN0ZW5lcihzdGF0ZUxpc3RlbmVyKTsKKwkJCQkJdG9nZ2xlU3RhdGUgPSBudWxsOworCQkJCX0KKwkJCQlpZiAocmFkaW9TdGF0ZSAhPSBudWxsKSB7CisJCQkJCXJhZGlvU3RhdGUucmVtb3ZlTGlzdGVuZXIoc3RhdGVMaXN0ZW5lcik7CisJCQkJCXJhZGlvU3RhdGUgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJCXdpZGdldC5kaXNwb3NlKCk7CisJCQl3aWRnZXQgPSBudWxsOworCQkJbW9kZWwuc2V0V2lkZ2V0KG51bGwpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZGdldFNlbGVjdGlvbihFdmVudCBldmVudCkgeworCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCWlmIChkcm9wZG93bkV2ZW50KGV2ZW50KSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChtb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuQ0hFQ0sKKwkJCQkJfHwgbW9kZWwuZ2V0VHlwZSgpID09IEl0ZW1UeXBlLlJBRElPKSB7CisJCQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBmYWxzZTsKKwkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgTWVudUl0ZW0pIHsKKwkJCQkJc2VsZWN0aW9uID0gKChNZW51SXRlbSkgd2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKKwkJCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7CisJCQkJCXNlbGVjdGlvbiA9ICgoVG9vbEl0ZW0pIHdpZGdldCkuZ2V0U2VsZWN0aW9uKCk7CisJCQkJfQorCQkJCW1vZGVsLnNldFNlbGVjdGVkKHNlbGVjdGlvbik7CisJCQl9CisJCQlpZiAoY2FuRXhlY3V0ZUl0ZW0oZXZlbnQpKSB7CisJCQkJZXhlY3V0ZUl0ZW0oZXZlbnQpOworCQkJfQorCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKwlwcml2YXRlIHZvaWQgaGFuZGxlSGVscFJlcXVlc3QoKSB7CisJCU1Db21tYW5kIGNvbW1hbmQgPSBtb2RlbC5nZXRDb21tYW5kKCk7CisJCWlmIChjb21tYW5kID09IG51bGwgfHwgaGVscFNlcnZpY2UgPT0gbnVsbAorCQkJCXx8IGNvbW1hbmRIZWxwU2VydmljZSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgY29udGV4dEhlbHBJZCA9IGNvbW1hbmRIZWxwU2VydmljZS5nZXRIZWxwQ29udGV4dElkKAorCQkJCWNvbW1hbmQuZ2V0RWxlbWVudElkKCksIGdldENvbnRleHQobW9kZWwpKTsKKwkJaWYgKGNvbnRleHRIZWxwSWQgIT0gbnVsbCkgeworCQkJaGVscFNlcnZpY2UuZGlzcGxheUhlbHAoY29udGV4dEhlbHBJZCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGRyb3Bkb3duRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cgJiYgbW9kZWwgaW5zdGFuY2VvZiBNVG9vbEl0ZW0pIHsKKwkJCVRvb2xJdGVtIHRpID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7CisJCQlNTWVudSBtbWVudSA9ICgoTVRvb2xJdGVtKSBtb2RlbCkuZ2V0TWVudSgpOworCQkJaWYgKG1tZW51ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlNZW51IG1lbnUgPSBnZXRNZW51KG1tZW51LCB0aSk7CisJCQlpZiAobWVudSA9PSBudWxsIHx8IG1lbnUuaXNEaXNwb3NlZCgpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IHRpLmdldEJvdW5kcygpOworCQkJUG9pbnQgZGlzcGxheUF0ID0gdGkuZ2V0UGFyZW50KCkudG9EaXNwbGF5KGl0ZW1Cb3VuZHMueCwKKwkJCQkJaXRlbUJvdW5kcy55ICsgaXRlbUJvdW5kcy5oZWlnaHQpOworCQkJbWVudS5zZXRMb2NhdGlvbihkaXNwbGF5QXQpOworCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOworCisJCQlEaXNwbGF5IGRpc3BsYXkgPSBtZW51LmdldERpc3BsYXkoKTsKKwkJCXdoaWxlICghbWVudS5pc0Rpc3Bvc2VkKCkgJiYgbWVudS5pc1Zpc2libGUoKSkgeworCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgeworCQkJCQlkaXNwbGF5LnNsZWVwKCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBNZW51IGdldE1lbnUoZmluYWwgTU1lbnUgbW1lbnUsIFRvb2xJdGVtIHRvb2xJdGVtKSB7CisJCU9iamVjdCBvYmogPSBtbWVudS5nZXRXaWRnZXQoKTsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIE1lbnUgJiYgISgoTWVudSkgb2JqKS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJldHVybiAoTWVudSkgb2JqOworCQl9CisJCS8vIHRoaXMgaXMgYSB0ZW1wb3JhcnkgcGFzc3Rocm91Z2ggb2YgdGhlIElNZW51Q3JlYXRvcgorCQlpZiAoUmVuZGVyZWRFbGVtZW50VXRpbC5pc1JlbmRlcmVkTWVudShtbWVudSkpIHsKKwkJCW9iaiA9IFJlbmRlcmVkRWxlbWVudFV0aWwuZ2V0Q29udHJpYnV0aW9uTWFuYWdlcihtbWVudSk7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbnRleHRGdW5jdGlvbikgeworCQkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtbWVudSk7CisJCQkJb2JqID0gKChJQ29udGV4dEZ1bmN0aW9uKSBvYmopLmNvbXB1dGUobGNsQ29udGV4dCwgbnVsbCk7CisJCQkJUmVuZGVyZWRFbGVtZW50VXRpbC5zZXRDb250cmlidXRpb25NYW5hZ2VyKG1tZW51LCBvYmopOworCQkJfQorCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNZW51Q3JlYXRvcikgeworCQkJCWZpbmFsIElNZW51Q3JlYXRvciBjcmVhdG9yID0gKElNZW51Q3JlYXRvcikgb2JqOworCQkJCWZpbmFsIE1lbnUgbWVudSA9IGNyZWF0b3IuZ2V0TWVudSh0b29sSXRlbS5nZXRQYXJlbnQoKQorCQkJCQkJLmdldFNoZWxsKCkpOworCQkJCWlmIChtZW51ICE9IG51bGwpIHsKKwkJCQkJdG9vbEl0ZW0uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkJCQkvKioKKwkJCQkJCSAqCisJCQkJCQkgKi8KKwkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7CisJCQkJCQkJaWYgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJCQkJY3JlYXRvci5kaXNwb3NlKCk7CisJCQkJCQkJCW1tZW51LnNldFdpZGdldChudWxsKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0pOworCQkJCQkvLyBtbWVudS5zZXRXaWRnZXQobWVudSk7CisJCQkJCW1lbnUuc2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUsIG1lbnUpOworCQkJCQlyZXR1cm4gbWVudTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQobW9kZWwpOworCQkJSVByZXNlbnRhdGlvbkVuZ2luZSBlbmdpbmUgPSBsY2xDb250ZXh0CisJCQkJCS5nZXQoSVByZXNlbnRhdGlvbkVuZ2luZS5jbGFzcyk7CisJCQlvYmogPSBlbmdpbmUuY3JlYXRlR3VpKG1tZW51LCB0b29sSXRlbS5nZXRQYXJlbnQoKSwgbGNsQ29udGV4dCk7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgTWVudSkgeworCQkJCU1lbnUgbWVudSA9IChNZW51KSBvYmo7CisJCQkJLy8gbWVudS5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbWVudSk7CisJCQkJcmV0dXJuIG1lbnU7CisJCQl9CisJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIlJlbmRlcmluZyByZXR1cm5lZCAiICsgb2JqKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGdldFN0YXRpY0NvbnRleHQoRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGluZm9Db250ZXh0ID09IG51bGwpIHsKKwkJCWluZm9Db250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5LmNyZWF0ZShIQ0lfU1RBVElDX0NPTlRFWFQpOworCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKG1vZGVsLCBpbmZvQ29udGV4dCwKKwkJCQkJbW9kZWwuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpOworCQl9CisJCWlmIChldmVudCA9PSBudWxsKSB7CisJCQlpbmZvQ29udGV4dC5yZW1vdmUoRXZlbnQuY2xhc3MpOworCQl9IGVsc2UgeworCQkJaW5mb0NvbnRleHQuc2V0KEV2ZW50LmNsYXNzLCBldmVudCk7CisJCX0KKwkJcmV0dXJuIGluZm9Db250ZXh0OworCX0KKworCXByaXZhdGUgdm9pZCBleGVjdXRlSXRlbShFdmVudCB0cmlnZ2VyKSB7CisJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCA9IG1vZGVsLmdldFdiQ29tbWFuZCgpOworCQlpZiAoY21kID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQobW9kZWwpOworCQlFSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IChFSGFuZGxlclNlcnZpY2UpIGxjbENvbnRleHQKKwkJCQkuZ2V0KEVIYW5kbGVyU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IGdldFN0YXRpY0NvbnRleHQodHJpZ2dlcik7CisJCXNlcnZpY2UuZXhlY3V0ZUhhbmRsZXIoY21kLCBzdGF0aWNDb250ZXh0KTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2FuRXhlY3V0ZUl0ZW0oRXZlbnQgdHJpZ2dlcikgeworCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjbWQgPSBtb2RlbC5nZXRXYkNvbW1hbmQoKTsKKwkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBnZXRDb250ZXh0KG1vZGVsKTsKKwkJRUhhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBsY2xDb250ZXh0LmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MpOworCQlpZiAoc2VydmljZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQgPSBnZXRTdGF0aWNDb250ZXh0KHRyaWdnZXIpOworCQlyZXR1cm4gc2VydmljZS5jYW5FeGVjdXRlKGNtZCwgc3RhdGljQ29udGV4dCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UGFyZW50KElDb250cmlidXRpb25NYW5hZ2VyIHBhcmVudCkgeworCQlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKKwkJCUlNZW51TWFuYWdlciBtZW51TWdyID0gKElNZW51TWFuYWdlcikgZ2V0UGFyZW50KCk7CisJCQltZW51TWdyLnJlbW92ZU1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOworCQl9CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKKwkJCUlNZW51TWFuYWdlciBtZW51TWdyID0gKElNZW51TWFuYWdlcikgcGFyZW50OworCQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKKwkJfQorCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBwYXJlbnQgY29udGV4dCBmb3IgdGhpcyBwYXJ0LgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tCisJICogQHJldHVybiB0aGUgcGFyZW50J3MgY2xvc2VzdCBjb250ZXh0LCBvciBnbG9iYWwgY29udGV4dCBpZiBub25lIGluIHRoZQorCSAqICAgICAgICAgaGllcmFyY2h5CisJICovCisJcHJvdGVjdGVkIElFY2xpcHNlQ29udGV4dCBnZXRDb250ZXh0Rm9yUGFyZW50KE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gbW9kZWxTZXJ2aWNlLmdldENvbnRhaW5pbmdDb250ZXh0KGVsZW1lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIGNvbnRleHQgZm9yIHRoaXMgcGFydC4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbQorCSAqIEByZXR1cm4gdGhlIGNsb3Nlc3QgY29udGV4dCwgb3IgZ2xvYmFsIGNvbnRleHQgaWYgbm9uZSBpbiB0aGUgaGllcmFyY2h5CisJICovCisJcHJvdGVjdGVkIElFY2xpcHNlQ29udGV4dCBnZXRDb250ZXh0KE1VSUVsZW1lbnQgcGFydCkgeworCQlpZiAocGFydCBpbnN0YW5jZW9mIE1Db250ZXh0KSB7CisJCQlyZXR1cm4gKChNQ29udGV4dCkgcGFydCkuZ2V0Q29udGV4dCgpOworCQl9CisJCXJldHVybiBnZXRDb250ZXh0Rm9yUGFyZW50KHBhcnQpOworCX0KKworCXB1YmxpYyBXaWRnZXQgZ2V0V2lkZ2V0KCkgeworCQlyZXR1cm4gd2lkZ2V0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1vZGVsCisJICovCisJcHVibGljIE1IYW5kbGVkSXRlbSBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIG1vZGVsOworCX0KKworCXByaXZhdGUgVG9vbEl0ZW1VcGRhdGVyIGdldFVwZGF0ZXIoKSB7CisJCWlmIChtb2RlbCAhPSBudWxsKSB7CisJCQlPYmplY3Qgb2JqID0gbW9kZWwuZ2V0UmVuZGVyZXIoKTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sQmFyTWFuYWdlclJlbmRlcmVyKSB7CisJCQkJcmV0dXJuICgoVG9vbEJhck1hbmFnZXJSZW5kZXJlcikgb2JqKS5nZXRVcGRhdGVyKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvSGFuZGxlZE1lbnVJdGVtUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0hhbmRsZWRNZW51SXRlbVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmYWI4MgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0hhbmRsZWRNZW51SXRlbVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRUNvbW1hbmRTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRUhhbmRsZXJTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuRWNsaXBzZUNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLkVCaW5kaW5nU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmNvbW1hbmRzLk1QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lkl0ZW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTUhhbmRsZWRJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTUhhbmRsZWRNZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOworCisvKioKKyAqIENyZWF0ZSBhIGNvbnRyaWJ1dGUgcGFydC4KKyAqLworcHVibGljIGNsYXNzIEhhbmRsZWRNZW51SXRlbVJlbmRlcmVyIGV4dGVuZHMgTWVudUl0ZW1SZW5kZXJlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE1JX1NUQVRJQ19DT05URVhUID0gIkhNSVItc3RhdGljQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlV2lkZ2V0KGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTUhhbmRsZWRNZW51SXRlbSkgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBNZW51KSkKKwkJCXJldHVybiBudWxsOworCisJCU1IYW5kbGVkTWVudUl0ZW0gaXRlbU1vZGVsID0gKE1IYW5kbGVkTWVudUl0ZW0pIGVsZW1lbnQ7CisJCWlmIChpdGVtTW9kZWwuZ2V0VmlzaWJsZVdoZW4oKSAhPSBudWxsKSB7CisJCQlwcm9jZXNzVmlzaWJsZShpdGVtTW9kZWwpOworCQl9CisKKwkJaWYgKCFpdGVtTW9kZWwuaXNWaXNpYmxlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLy8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCB3ZSBzaG91bGQgY3JlYXRlIHRoZSBuZXcgaXRlbQorCQlpbnQgYWRkSW5kZXggPSBjYWxjVmlzaWJsZUluZGV4KGVsZW1lbnQpOworCisJCS8vIE9LLCBpdCdzIGEgcmVhbCBtZW51IGl0ZW0sIHdoYXQga2luZD8KKwkJaW50IGZsYWdzID0gMDsKKwkJaWYgKGl0ZW1Nb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuUFVTSCkKKwkJCWZsYWdzID0gU1dULlBVU0g7CisJCWVsc2UgaWYgKGl0ZW1Nb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuQ0hFQ0spCisJCQlmbGFncyA9IFNXVC5DSEVDSzsKKwkJZWxzZSBpZiAoaXRlbU1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5SQURJTykKKwkJCWZsYWdzID0gU1dULlJBRElPOworCisJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCA9IGl0ZW1Nb2RlbC5nZXRXYkNvbW1hbmQoKTsKKwkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQlJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQoaXRlbU1vZGVsKTsKKwkJCWNtZCA9IGdlbmVyYXRlUGFyYW1ldGVyaXplZENvbW1hbmQoaXRlbU1vZGVsLCBsY2xDb250ZXh0KTsKKwkJfQorCQlNZW51SXRlbSBuZXdJdGVtID0gbmV3IE1lbnVJdGVtKChNZW51KSBwYXJlbnQsIGZsYWdzLCBhZGRJbmRleCk7CisJCXNldEl0ZW1UZXh0KGl0ZW1Nb2RlbCwgbmV3SXRlbSk7CisJCXNldEVuYWJsZWQoaXRlbU1vZGVsLCBuZXdJdGVtKTsKKwkJbmV3SXRlbS5zZXRJbWFnZShnZXRJbWFnZShpdGVtTW9kZWwpKTsKKwkJbmV3SXRlbS5zZXRTZWxlY3Rpb24oaXRlbU1vZGVsLmlzU2VsZWN0ZWQoKSk7CisKKwkJcmV0dXJuIG5ld0l0ZW07CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWQoTUhhbmRsZWRNZW51SXRlbSBpdGVtTW9kZWwsIE1lbnVJdGVtIG5ld0l0ZW0pIHsKKwkJUGFyYW1ldGVyaXplZENvbW1hbmQgY21kID0gaXRlbU1vZGVsLmdldFdiQ29tbWFuZCgpOworCQlpZiAoY21kID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQoaXRlbU1vZGVsKTsKKwkJRUhhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBsY2xDb250ZXh0LmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MpOworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IEVjbGlwc2VDb250ZXh0RmFjdG9yeQorCQkJCS5jcmVhdGUoSE1JX1NUQVRJQ19DT05URVhUKTsKKwkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKGl0ZW1Nb2RlbCwgc3RhdGljQ29udGV4dCwKKwkJCQlpdGVtTW9kZWwuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpOworCisJCXRyeSB7CisJCQlpdGVtTW9kZWwuc2V0RW5hYmxlZChzZXJ2aWNlLmNhbkV4ZWN1dGUoY21kLCBzdGF0aWNDb250ZXh0KSk7CisJCX0gZmluYWxseSB7CisJCQlzdGF0aWNDb250ZXh0LmRpc3Bvc2UoKTsKKwkJfQorCQluZXdJdGVtLnNldEVuYWJsZWQoaXRlbU1vZGVsLmlzRW5hYmxlZCgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJdGVtVGV4dChNTWVudUl0ZW0gbW9kZWwsIE1lbnVJdGVtIGl0ZW0pIHsKKwkJU3RyaW5nIHRleHQgPSBtb2RlbC5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBNSGFuZGxlZEl0ZW0pIHsKKwkJCU1IYW5kbGVkSXRlbSBoYW5kbGVkSXRlbSA9IChNSGFuZGxlZEl0ZW0pIG1vZGVsOworCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KG1vZGVsKTsKKwkJCUVCaW5kaW5nU2VydmljZSBicyA9IChFQmluZGluZ1NlcnZpY2UpIGNvbnRleHQKKwkJCQkJLmdldChFQmluZGluZ1NlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCA9IGhhbmRsZWRJdGVtLmdldFdiQ29tbWFuZCgpOworCQkJaWYgKGNtZCAhPSBudWxsICYmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSkgeworCQkJCXRyeSB7CisJCQkJCXRleHQgPSBjbWQuZ2V0TmFtZSgpOworCQkJCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgeworCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQkJVHJpZ2dlclNlcXVlbmNlIHNlcXVlbmNlID0gYnMuZ2V0QmVzdFNlcXVlbmNlRm9yKGhhbmRsZWRJdGVtCisJCQkJCS5nZXRXYkNvbW1hbmQoKSk7CisJCQlpZiAoc2VxdWVuY2UgIT0gbnVsbCkgeworCQkJCXRleHQgPSB0ZXh0ICsgJ1x0JyArIHNlcXVlbmNlLmZvcm1hdCgpOworCQkJfQorCQkJaXRlbS5zZXRUZXh0KHRleHQgPT0gbnVsbCA/IGhhbmRsZWRJdGVtLmdldENvbW1hbmQoKS5nZXRFbGVtZW50SWQoKQorCQkJCQk6IHRleHQpOworCQl9IGVsc2UgeworCQkJc3VwZXIuc2V0SXRlbVRleHQobW9kZWwsIGl0ZW0pOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaG9va0NvbnRyb2xsZXJMb2dpYyhNVUlFbGVtZW50IG1lKSB7CisJCS8vIElmIHRoZSBpdGVtIGlzIGEgQ0hFQ0sgb3IgUkFESU8gdXBkYXRlIHRoZSBtb2RlbCdzIHN0YXRlIHRvIG1hdGNoCisJCXN1cGVyLmhvb2tDb250cm9sbGVyTG9naWMobWUpOworCisJCS8vICdFeGVjdXRlJyB0aGUgb3BlcmF0aW9uIGlmIHBvc3NpYmxlCisJCWlmIChtZSBpbnN0YW5jZW9mIE1IYW5kbGVkSXRlbSkgeworCQkJZmluYWwgTUhhbmRsZWRJdGVtIGl0ZW0gPSAoTUhhbmRsZWRJdGVtKSBtZTsKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtZSk7CisJCQlNZW51SXRlbSBtaSA9IChNZW51SXRlbSkgbWUuZ2V0V2lkZ2V0KCk7CisJCQltaS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKKwkJCQkJRUhhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSAoRUhhbmRsZXJTZXJ2aWNlKSBsY2xDb250ZXh0CisJCQkJCQkJLmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgY21kID0gaXRlbS5nZXRXYkNvbW1hbmQoKTsKKwkJCQkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkKKwkJCQkJCQkuY3JlYXRlKEhNSV9TVEFUSUNfQ09OVEVYVCk7CisJCQkJCWlmIChlICE9IG51bGwpIHsKKwkJCQkJCXN0YXRpY0NvbnRleHQuc2V0KEV2ZW50LmNsYXNzLCBlKTsKKwkJCQkJfQorCQkJCQlDb250cmlidXRpb25zQW5hbHl6ZXIucG9wdWxhdGVNb2RlbEludGVyZmFjZXMoaXRlbSwKKwkJCQkJCQlzdGF0aWNDb250ZXh0LCBpdGVtLmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXNlcnZpY2UuZXhlY3V0ZUhhbmRsZXIoY21kLCBzdGF0aWNDb250ZXh0KTsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCXN0YXRpY0NvbnRleHQuZGlzcG9zZSgpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFBhcmFtZXRlcml6ZWRDb21tYW5kIGdlbmVyYXRlUGFyYW1ldGVyaXplZENvbW1hbmQoCisJCQlmaW5hbCBNSGFuZGxlZEl0ZW0gaXRlbSwgZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQpIHsKKwkJRUNvbW1hbmRTZXJ2aWNlIGNtZFNlcnZpY2UgPSAoRUNvbW1hbmRTZXJ2aWNlKSBsY2xDb250ZXh0CisJCQkJLmdldChFQ29tbWFuZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzID0gbnVsbDsKKwkJTGlzdDxNUGFyYW1ldGVyPiBtb2RlbFBhcm1zID0gaXRlbS5nZXRQYXJhbWV0ZXJzKCk7CisJCWlmIChtb2RlbFBhcm1zICE9IG51bGwgJiYgIW1vZGVsUGFybXMuaXNFbXB0eSgpKSB7CisJCQlwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlmb3IgKE1QYXJhbWV0ZXIgbVBhcm0gOiBtb2RlbFBhcm1zKSB7CisJCQkJcGFyYW1ldGVycy5wdXQobVBhcm0uZ2V0TmFtZSgpLCBtUGFybS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjbWQgPSBjbWRTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoaXRlbS5nZXRDb21tYW5kKCkKKwkJCQkuZ2V0RWxlbWVudElkKCksIHBhcmFtZXRlcnMpOworCQlpdGVtLnNldFdiQ29tbWFuZChjbWQpOworCQlyZXR1cm4gY21kOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0xheW91dE1vZGlmaWVyVG9vbENvbnRyb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0xheW91dE1vZGlmaWVyVG9vbENvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjcyMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTGF5b3V0TW9kaWZpZXJUb29sQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgaXMgYSBzcGVjaWFsaXplZCB0b29sIGNvbnRyb2wgdXNlZCBieSB0aGUgVHJpbUJhckxheW91dCB0byBtb2RpZnkgdGhlCisgKiBsYXlvdXQgbWVjaGFuaXNtcy4KKyAqLworcHVibGljIGNsYXNzIExheW91dE1vZGlmaWVyVG9vbENvbnRyb2wgeworCUBQb3N0Q29uc3RydWN0CisJdm9pZCBjcmVhdGVXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgTVRvb2xDb250cm9sIHRjKSB7CisJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCQkJcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsKKwkJCX0KKwkJfTsKKwkJY29tcC5zZXRTaXplKDAsIDApOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L0xhenlTdGFja1JlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9MYXp5U3RhY2tSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjcyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9MYXp5U3RhY2tSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDQxMTUwCisgKiAgICAgRmFiaW8gWmFkcm96bnkgKGZhYmlvZnpAZ21haWwuY29tKSAtIEJ1ZyA0MzY3NjMKKyAqICAgICBEaXJrIEZhdXRoIDxkaXJrLmZhdXRoQGdvb2dsZW1haWwuY29tPiAtIEJ1ZyA0NTc5MzkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1HZW5lcmljU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVByZXNlbnRhdGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGZ1bmN0aW9uYWxpdHkgbmVjZXNzYXJ5IHRvIG1hbmFnZSBzdGFja3Mgb2YgcGFydHMKKyAqIGluIGEgJ2xhenkgbG9hZGluZycgbWFubmVyLiBGb3IgdGhlc2Ugc3RhY2tzIG9ubHkgdGhlIGN1cnJlbnRseSAnYWN0aXZlJworICogY2hpbGQgPGI+bW9zdDwvYj4gYmUgcmVuZGVyZWQgc28gaW4gdGhpcyBjbGFzcyB3ZSBvdmVyIHJpZGUgdGhhdCBkZWZhdWx0CisgKiBiZWhhdmlvciBmb3IgcHJvY2Vzc2luZyB0aGUgc3RhY2sncyBjb250ZW50cyB0byBwcmV2ZW50IGFsbCBvZiB0aGUgY29udGVudHMKKyAqIGZyb20gYmVpbmcgcmVuZGVyZWQsIGNhbGxpbmcgJ2NoaWxkQWRkZWQnIGluc3RlYWQuIFRoaXMgbm90IG9ubHkgc2F2ZXMgdGltZQorICogYW5kIFNXVCByZXNvdXJjZXMgYnV0IGlzIG5lY2Vzc2FyeSBpbiBhbiBJREUgd29ybGQgd2hlcmUgd2UgbXVzdCBub3QKKyAqIGFyYml0cmFyaWx5IGNhdXNlIHBsdWctaW4gbG9hZGluZy4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXp5U3RhY2tSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgbGF6eUxvYWRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisKKwkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNR2VuZXJpY1N0YWNrPD8+KSkKKwkJCQlyZXR1cm47CisKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJTUdlbmVyaWNTdGFjazxNVUlFbGVtZW50PiBzdGFjayA9IChNR2VuZXJpY1N0YWNrPE1VSUVsZW1lbnQ+KSBlbGVtZW50OworCQkJaWYgKHN0YWNrLmdldFJlbmRlcmVyKCkgIT0gTGF6eVN0YWNrUmVuZGVyZXIudGhpcykKKwkJCQlyZXR1cm47CisJCQlMYXp5U3RhY2tSZW5kZXJlciBsc3IgPSAoTGF6eVN0YWNrUmVuZGVyZXIpIHN0YWNrLmdldFJlbmRlcmVyKCk7CisKKwkJCS8vIEdhdGhlciB1cCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcgJ2hpZGRlbicgYnkgdGhpcyBjaGFuZ2UKKwkJCU1VSUVsZW1lbnQgb2xkU2VsID0gKE1VSUVsZW1lbnQpIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKTsKKwkJCWlmIChvbGRTZWwgIT0gbnVsbCkgeworCQkJCWhpZGVFbGVtZW50UmVjdXJzaXZlKG9sZFNlbCk7CisJCQl9CisKKwkJCWlmIChzdGFjay5nZXRTZWxlY3RlZEVsZW1lbnQoKSAhPSBudWxsKQorCQkJCWxzci5zaG93VGFiKHN0YWNrLmdldFNlbGVjdGVkRWxlbWVudCgpKTsKKwkJfQorCX07CisKKwlwdWJsaWMgdm9pZCBpbml0KElFdmVudEJyb2tlciBldmVudEJyb2tlcikgeworCQkvLyBFbnN1cmUgdGhhdCB0aGVyZSBvbmx5IGV2ZXIgKm9uZSogbGlzdGVuZXIuIEVhY2ggc3ViY2xhc3MKKwkJLy8gd2lsbCBjYWxsIHRoaXMgbWV0aG9kCisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGxhenlMb2FkZXIpOworCisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5FbGVtZW50Q29udGFpbmVyLlRPUElDX1NFTEVDVEVERUxFTUVOVCwKKwkJCQlsYXp5TG9hZGVyKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnRCcm9rZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb250ZXh0RGlzcG9zZWQoSUV2ZW50QnJva2VyIGV2ZW50QnJva2VyKSB7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGxhenlMb2FkZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RQcm9jZXNzKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlU3RhY2spCisJCQkJJiYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1HZW5lcmljU3RhY2s8Pz4pIHx8IGlzTWluaW1pemVkU3RhY2soZWxlbWVudCkpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTUdlbmVyaWNTdGFjazxNVUlFbGVtZW50PiBzdGFjayA9IChNR2VuZXJpY1N0YWNrPE1VSUVsZW1lbnQ+KSBlbGVtZW50OworCQlNVUlFbGVtZW50IHNlbFBhcnQgPSBzdGFjay5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJaWYgKHNlbFBhcnQgIT0gbnVsbCkgeworCQkJc2hvd1RhYihzZWxQYXJ0KTsKKwkJfSBlbHNlIGlmIChzdGFjay5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApIHsKKwkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBmaXJzdCByZW5kZXJhYmxlIGVsZW1lbnQKKwkJCWZvciAoTVVJRWxlbWVudCBraWQgOiBzdGFjay5nZXRDaGlsZHJlbigpKSB7CisJCQkJaWYgKGtpZC5pc1RvQmVSZW5kZXJlZCgpICYmIGtpZC5pc1Zpc2libGUoKSkgeworCQkJCQlzdGFjay5zZXRTZWxlY3RlZEVsZW1lbnQoa2lkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRlbnRzKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IG1lKSB7CisJCS8vIExhenkgTG9hZGluZzogaGVyZSB3ZSBvbmx5IHByb2Nlc3MgdGhlIGNvbnRlbnRzIHRocm91Z2ggY2hpbGRBZGRlZCwKKwkJLy8gd2Ugc3BlY2lmaWNhbGx5IGRvIG5vdCByZW5kZXIgdGhlbQorCQlJUHJlc2VudGF0aW9uRW5naW5lIHJlbmRlcmVyID0gKElQcmVzZW50YXRpb25FbmdpbmUpIGNvbnRleHQKKwkJCQkuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MuZ2V0TmFtZSgpKTsKKworCQlmb3IgKE1VSUVsZW1lbnQgZWxlbWVudCA6IG1lLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmICghZWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpIHx8ICFlbGVtZW50LmlzVmlzaWJsZSgpKQorCQkJCWNvbnRpbnVlOworCQkJYm9vbGVhbiBsYXp5ID0gdHJ1ZTsKKworCQkJLy8gU3BlY2lhbCBjYXNlOiB3ZSBhbHNvIHJlbmRlciBhbnkgcGxhY2Vob2xkZXIgdGhhdCByZWZlcnMgdG8KKwkJCS8vIGFuICpleGlzdGluZyogcGFydCwgdGhpcyBkb2Vzbid0IGJyZWFrIGxhenkgbG9hZGluZyBzaW5jZSB0aGUKKwkJCS8vIHBhcnQgaXMgYWxyZWFkeSB0aGVyZS4uLnNlZSBidWcgMzc4MTM4IGZvciBkZXRhaWxzCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJCU1QbGFjZWhvbGRlciBwaCA9IChNUGxhY2Vob2xkZXIpIGVsZW1lbnQ7CisJCQkJaWYgKHBoLmdldFJlZigpIGluc3RhbmNlb2YgTVBhcnQKKwkJCQkJCSYmIHBoLmdldFJlZigpLmdldFdpZGdldCgpICE9IG51bGwpIHsKKwkJCQkJbGF6eSA9IGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGxhenkpIHsKKwkJCQljcmVhdGVUYWIobWUsIGVsZW1lbnQpOworCQkJfSBlbHNlIHsKKwkJCQlyZW5kZXJlci5jcmVhdGVHdWkoZWxlbWVudCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgdGhlIHBhcmVudCBjb250YWluZXIgdG8gc2hvdyBhZmZvcmRhbmNlCisJICogKGkuZS4gdGFicykgZm9yIGNoaWxkIGVsZW1lbnRzIC13aXRob3V0LSBjcmVhdGluZyB0aGUgYWN0dWFsIHBhcnQKKwkgKgorCSAqIEBwYXJhbSBtZQorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBtb2RlbCBlbGVtZW50CisJICogQHBhcmFtIHBhcnQKKwkgKiAgICAgICAgICAgIFRoZSBjaGlsZCB0byBzaG93IHRoZSBhZmZvcmRhbmNlIGZvcgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYihNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBtZSwgTVVJRWxlbWVudCBwYXJ0KSB7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJLy8gTm93IHByb2Nlc3MgYW55IG5ld2x5IHZpc2libGUgZWxlbWVudHMKKwkJTVVJRWxlbWVudCBjdXJTZWwgPSBlbGVtZW50LmdldFBhcmVudCgpLmdldFNlbGVjdGVkRWxlbWVudCgpOworCQlpZiAoY3VyU2VsICE9IG51bGwpIHsKKwkJCXNob3dFbGVtZW50UmVjdXJzaXZlKGN1clNlbCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaGlkZUVsZW1lbnRSZWN1cnNpdmUoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRXaWRnZXQoKSA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQlNUGxhY2Vob2xkZXIgcGggPSAoTVBsYWNlaG9sZGVyKSBlbGVtZW50OworCQkJZWxlbWVudCA9IHBoLmdldFJlZigpOworCQl9CisKKwkJLy8gSGlkZSBhbnkgZmxvYXRpbmcgd2luZG93cworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1XaW5kb3cgJiYgZWxlbWVudC5nZXRXaWRnZXQoKSAhPSBudWxsKSB7CisJCQllbGVtZW50LnNldFZpc2libGUoZmFsc2UpOworCQl9CisKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNR2VuZXJpY1N0YWNrPD8+KSB7CisJCQkvLyBGb3Igc3RhY2tzIG9ubHkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYmVpbmcgaGlkZGVuCisJCQlNR2VuZXJpY1N0YWNrPD8+IGNvbnRhaW5lciA9IChNR2VuZXJpY1N0YWNrPD8+KSBlbGVtZW50OworCQkJTVVJRWxlbWVudCBjdXJTZWwgPSBjb250YWluZXIuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQloaWRlRWxlbWVudFJlY3Vyc2l2ZShjdXJTZWwpOworCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJTUVsZW1lbnRDb250YWluZXI8Pz4gY29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPD8+KSBlbGVtZW50OworCQkJZm9yIChNVUlFbGVtZW50IGNoaWxkRWxlbWVudCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7CisJCQkJaGlkZUVsZW1lbnRSZWN1cnNpdmUoY2hpbGRFbGVtZW50KTsKKwkJCX0KKworCQkJLy8gT0ssIG5vdyBwcm9jZXNzIGRldGFjaGVkIHdpbmRvd3MKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJCWZvciAoTVdpbmRvdyB3IDogKChNV2luZG93KSBlbGVtZW50KS5nZXRXaW5kb3dzKCkpIHsKKwkJCQkJaGlkZUVsZW1lbnRSZWN1cnNpdmUodyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSB7CisJCQkJZm9yIChNV2luZG93IHcgOiAoKE1QZXJzcGVjdGl2ZSkgZWxlbWVudCkuZ2V0V2luZG93cygpKSB7CisJCQkJCWhpZGVFbGVtZW50UmVjdXJzaXZlKHcpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzaG93RWxlbWVudFJlY3Vyc2l2ZShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKCFlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpCisJCQlyZXR1cm47CisKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrCisJCQkJJiYgZWxlbWVudC5nZXRSZW5kZXJlcigpIGluc3RhbmNlb2YgU3RhY2tSZW5kZXJlcikgeworCQkJTVBhcnRTdGFjayBzdGFja01vZGVsID0gKE1QYXJ0U3RhY2spIGVsZW1lbnQ7CisJCQlTdGFja1JlbmRlcmVyIHNyID0gKFN0YWNrUmVuZGVyZXIpIGVsZW1lbnQuZ2V0UmVuZGVyZXIoKTsKKwkJCUNUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIGVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisKKwkJCU1VSUVsZW1lbnQgY3VyU2VsID0gc3RhY2tNb2RlbC5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCU1QYXJ0IHBhcnQgPSAoTVBhcnQpICgoY3VyU2VsIGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSA/ICgoTVBsYWNlaG9sZGVyKSBjdXJTZWwpCisJCQkJCS5nZXRSZWYoKSA6IGN1clNlbCk7CisKKwkJCS8vIEVuc3VyZSB0aGF0IHRoZSBwbGFjZWhvbGRlcidzIHJlZiBpcyBzZXQgY29ycmVjdGx5IGJlZm9yZQorCQkJLy8gYWRqdXN0aW5nIGl0cyB0b29sYmFyCisJCQlpZiAoY3VyU2VsIGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQkJcGFydC5zZXRDdXJTaGFyZWRSZWYoKE1QbGFjZWhvbGRlcikgY3VyU2VsKTsKKwkJCX0KKwkJCXNyLmFkanVzdFRvcFJpZ2h0KGN0Zik7CisJCX0KKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlciAmJiBlbGVtZW50LmdldFdpZGdldCgpICE9IG51bGwpIHsKKwkJCU1QbGFjZWhvbGRlciBwaCA9IChNUGxhY2Vob2xkZXIpIGVsZW1lbnQ7CisJCQlNVUlFbGVtZW50IHJlZiA9IHBoLmdldFJlZigpOworCQkJcmVmLnNldEN1clNoYXJlZFJlZihwaCk7CisKKwkJCUNvbXBvc2l0ZSBwaENvbXAgPSAoQ29tcG9zaXRlKSBwaC5nZXRXaWRnZXQoKTsKKwkJCUNvbnRyb2wgcmVmQ3RybCA9IChDb250cm9sKSBwaC5nZXRSZWYoKS5nZXRXaWRnZXQoKTsKKworCQkJLy8gSWYgdGhlIHBhcmVudCBjaGFuZ2VzIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBib3VuZHMgb2YgdGhlIGNoaWxkCisJCQkvLyB3ZSBkbyBub3QgY2FsbCBsYXlvdXQoKSBiZWNhdXNlIHRoaXMgY291bGQgbGVhZCB0bworCQkJLy8gYSBiaWcgYW1vdW50IG9mIGxheW91dCBjYWxscyBpbiB1bnJlbGF0ZWQgcGxhY2VzIGUuZy4gbm9uZQorCQkJLy8gdmlzaWJsZSBjaGlsZHJlbiBvZiBhIENUYWJGb2xkZXIgKHNlZSA0NjA3NDUpCisJCQlpZiAocmVmQ3RybC5nZXRQYXJlbnQoKSAhPSBwaENvbXApIHsKKwkJCQlyZWZDdHJsLnNldFBhcmVudChwaENvbXApOworCQkJCXJlZkN0cmwuc2V0U2l6ZShwaENvbXAuZ2V0U2l6ZSgpKTsKKwkJCX0KKworCQkJZWxlbWVudCA9IHJlZjsKKwkJfQorCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gKChNQ29udGV4dCkgZWxlbWVudCkuZ2V0Q29udGV4dCgpOworCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJCUlFY2xpcHNlQ29udGV4dCBuZXdQYXJlbnRDb250ZXh0ID0gbW9kZWxTZXJ2aWNlCisJCQkJCQkuZ2V0Q29udGFpbmluZ0NvbnRleHQoZWxlbWVudCk7CisJCQkJaWYgKGNvbnRleHQuZ2V0UGFyZW50KCkgIT0gbmV3UGFyZW50Q29udGV4dCkgeworCQkJCQkvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVcGRhdGUgQ29udGV4dDogIiArIGNvbnRleHQudG9TdHJpbmcoKSAvLyROT04tTkxTLTEkCisJCQkJCS8vCQkJCQkJCSsgIiBuZXcgcGFyZW50OiAiICsgbmV3UGFyZW50Q29udGV4dC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQljb250ZXh0LnNldFBhcmVudChuZXdQYXJlbnRDb250ZXh0KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlTaGVsbCBsYXlvdXRTaGVsbExhdGVyID0gbnVsbDsKKwkJLy8gU2hvdyBhbnkgZmxvYXRpbmcgd2luZG93cworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1XaW5kb3cgJiYgZWxlbWVudC5nZXRXaWRnZXQoKSAhPSBudWxsKSB7CisJCQlpbnQgdmlzQ291bnQgPSAwOworCQkJZm9yIChNVUlFbGVtZW50IGtpZCA6ICgoTVdpbmRvdykgZWxlbWVudCkuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCWlmIChraWQuaXNUb0JlUmVuZGVyZWQoKSAmJiBraWQuaXNWaXNpYmxlKCkpCisJCQkJCXZpc0NvdW50Kys7CisJCQl9CisJCQlpZiAodmlzQ291bnQgPiAwKSB7CisJCQkJZWxlbWVudC5zZXRWaXNpYmxlKHRydWUpOworCQkJCU9iamVjdCB3aWRnZXQgPSBlbGVtZW50LmdldFdpZGdldCgpOworCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBTaGVsbCkgeworCQkJCQlTaGVsbCBzaGVsbCA9IChTaGVsbCkgd2lkZ2V0OworCQkJCQlsYXlvdXRTaGVsbExhdGVyID0gc2hlbGw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNR2VuZXJpY1N0YWNrPD8+KSB7CisJCQkvLyBGb3Igc3RhY2tzIG9ubHkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYmVpbmcgdmlzaWJsZQorCQkJTUdlbmVyaWNTdGFjazw/PiBjb250YWluZXIgPSAoTUdlbmVyaWNTdGFjazw/PikgZWxlbWVudDsKKwkJCU1VSUVsZW1lbnQgY3VyU2VsID0gY29udGFpbmVyLmdldFNlbGVjdGVkRWxlbWVudCgpOworCQkJaWYgKGN1clNlbCA9PSBudWxsICYmIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCisJCQkJY3VyU2VsID0gY29udGFpbmVyLmdldENoaWxkcmVuKCkuZ2V0KDApOworCQkJaWYgKGN1clNlbCAhPSBudWxsKQorCQkJCXNob3dFbGVtZW50UmVjdXJzaXZlKGN1clNlbCk7CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KSB7CisJCQlNRWxlbWVudENvbnRhaW5lcjw/PiBjb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8Pz4pIGVsZW1lbnQ7CisJCQlMaXN0PE1VSUVsZW1lbnQ+IGtpZHMgPSBuZXcgQXJyYXlMaXN0PE1VSUVsZW1lbnQ+KAorCQkJCQljb250YWluZXIuZ2V0Q2hpbGRyZW4oKSk7CisJCQlmb3IgKE1VSUVsZW1lbnQgY2hpbGRFbGVtZW50IDoga2lkcykgeworCQkJCXNob3dFbGVtZW50UmVjdXJzaXZlKGNoaWxkRWxlbWVudCk7CisJCQl9CisKKwkJCS8vIE9LLCBub3cgcHJvY2VzcyBkZXRhY2hlZCB3aW5kb3dzCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCQlmb3IgKE1XaW5kb3cgdyA6ICgoTVdpbmRvdykgZWxlbWVudCkuZ2V0V2luZG93cygpKSB7CisJCQkJCXNob3dFbGVtZW50UmVjdXJzaXZlKHcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJCWZvciAoTVdpbmRvdyB3IDogKChNUGVyc3BlY3RpdmUpIGVsZW1lbnQpLmdldFdpbmRvd3MoKSkgeworCQkJCQlzaG93RWxlbWVudFJlY3Vyc2l2ZSh3KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBpLmUuOiBCdWcgNDM2NzYzOiBhZnRlciB3ZSBtYWtlIGl0ZW1zIHZpc2libGUsIGlmIHdlIG1hZGUgYSBuZXcKKwkJLy8gZmxvYXRpbmcgc2hlbGwgdmlzaWJsZSwgd2UgaGF2ZSB0byByZS1sYXlvdXQgaXQgZm9yIGl0cyBjb250ZW50cyB0bworCQkvLyBiZWNvbWUgY29ycmVjdC4KKwkJaWYgKGxheW91dFNoZWxsTGF0ZXIgIT0gbnVsbCkgeworCQkJbGF5b3V0U2hlbGxMYXRlci5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNNaW5pbWl6ZWRTdGFjayhNVUlFbGVtZW50IHN0YWNrKSB7CisJCXJldHVybiBzdGFjay5nZXRUYWdzKCkuY29udGFpbnMoSVByZXNlbnRhdGlvbkVuZ2luZS5NSU5JTUlaRUQpCisJCQkJJiYgIXN0YWNrLmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLkFDVElWRSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTWVudUl0ZW1SZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTWVudUl0ZW1SZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjhkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZW51SXRlbVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuZXhwcmVzc2lvbnMuUmVmZXJlbmNlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuUnVuQW5kVHJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LldvcmtiZW5jaFNXVEFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29yZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lkl0ZW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKKworLyoqCisgKiBDcmVhdGUgYSBjb250cmlidXRlIHBhcnQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZW51SXRlbVJlbmRlcmVyIGV4dGVuZHMgU1dUUGFydFJlbmRlcmVyIHsKKwlzdGF0aWMgY2xhc3MgVmlzaWJsZVJBVCBleHRlbmRzIFJ1bkFuZFRyYWNrIHsKKwkJRXhwcmVzc2lvbiBleHA7CisJCU1NZW51SXRlbSBpdGVtOworCQlFeHByZXNzaW9uQ29udGV4dCBlYzsKKwkJYm9vbGVhbiBwYXJ0aWNpcGF0aW5nID0gdHJ1ZTsKKworCQlwdWJsaWMgVmlzaWJsZVJBVChNTWVudUl0ZW0gaSwgRXhwcmVzc2lvbiBlLCBJRWNsaXBzZUNvbnRleHQgYykgeworCQkJZXhwID0gZTsKKwkJCWl0ZW0gPSBpOworCQkJZWMgPSBuZXcgRXhwcmVzc2lvbkNvbnRleHQoYyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gY2hhbmdlZChJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQkJdHJ5IHsKKwkJCQlpdGVtLnNldFZpc2libGUoRXZhbHVhdGlvblJlc3VsdC5GQUxTRSAhPSBleHAuZXZhbHVhdGUoZWMpKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJV29ya2JlbmNoU1dUQWN0aXZhdG9yLnRyYWNlKAorCQkJCQkJIi90cmFjZS9tZW51cyIsICJWaXNpYmxlUkFUIGZhaWxlZCIsIGUpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJcmV0dXJuIHBhcnRpY2lwYXRpbmc7CisJCX0KKwl9CisKKwlwcml2YXRlIEhhc2hNYXA8TU1lbnVJdGVtLCBFeHByZXNzaW9uPiBtZW51SXRlbVRvRXhwcmVzc2lvbiA9IG5ldyBIYXNoTWFwPE1NZW51SXRlbSwgRXhwcmVzc2lvbj4oKTsKKwlwcml2YXRlIEhhc2hNYXA8TU1lbnVJdGVtLCBWaXNpYmxlUkFUPiBtZW51SXRlbVRvUkFUID0gbmV3IEhhc2hNYXA8TU1lbnVJdGVtLCBWaXNpYmxlUkFUPigpOworCisJQEluamVjdAorCUxvZ2dlciBsb2dnZXI7CisJQEluamVjdAorCUlFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBpdGVtVXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNTWVudUl0ZW0KKwkJCWlmICghKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1NZW51SXRlbSkpCisJCQkJcmV0dXJuOworCisJCQlNTWVudUl0ZW0gaXRlbU1vZGVsID0gKE1NZW51SXRlbSkgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCU1lbnVJdGVtIG1lbnVJdGVtID0gKE1lbnVJdGVtKSBpdGVtTW9kZWwuZ2V0V2lkZ2V0KCk7CisKKwkJCS8vIE5vIHdpZGdldCA9PSBub3RoaW5nIHRvIHVwZGF0ZQorCQkJaWYgKG1lbnVJdGVtID09IG51bGwpCisJCQkJcmV0dXJuOworCisJCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuQVRUTkFNRSk7CisJCQlpZiAoVUlFdmVudHMuVUlMYWJlbC5MQUJFTC5lcXVhbHMoYXR0TmFtZSkKKwkJCQkJfHwgVUlFdmVudHMuVUlMYWJlbC5MT0NBTElaRURfTEFCRUwuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQkJc2V0SXRlbVRleHQoaXRlbU1vZGVsLCBtZW51SXRlbSk7CisJCQl9IGVsc2UgaWYgKFVJRXZlbnRzLlVJTGFiZWwuSUNPTlVSSS5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQltZW51SXRlbS5zZXRJbWFnZShnZXRJbWFnZShpdGVtTW9kZWwpKTsKKwkJCX0KKwkJfQorCX07CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBzZWxlY3Rpb25VcGRhdGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1Ub29sSXRlbQorCQkJaWYgKCEoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpIGluc3RhbmNlb2YgTU1lbnVJdGVtKSkKKwkJCQlyZXR1cm47CisKKwkJCU1NZW51SXRlbSBpdGVtTW9kZWwgPSAoTU1lbnVJdGVtKSBldmVudAorCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSAoTWVudUl0ZW0pIGl0ZW1Nb2RlbC5nZXRXaWRnZXQoKTsKKwkJCWlmIChtZW51SXRlbSAhPSBudWxsKSB7CisJCQkJbWVudUl0ZW0uc2V0U2VsZWN0aW9uKGl0ZW1Nb2RlbC5pc1NlbGVjdGVkKCkpOworCQkJfQorCQl9CisJfTsKKworCXByaXZhdGUgRXZlbnRIYW5kbGVyIGVuYWJsZWRVcGRhdGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1NZW51SXRlbQorCQkJaWYgKCEoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpIGluc3RhbmNlb2YgTU1lbnVJdGVtKSkKKwkJCQlyZXR1cm47CisKKwkJCU1NZW51SXRlbSBpdGVtTW9kZWwgPSAoTU1lbnVJdGVtKSBldmVudAorCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSAoTWVudUl0ZW0pIGl0ZW1Nb2RlbC5nZXRXaWRnZXQoKTsKKwkJCWlmIChtZW51SXRlbSAhPSBudWxsKSB7CisJCQkJbWVudUl0ZW0uc2V0RW5hYmxlZChpdGVtTW9kZWwuaXNFbmFibGVkKCkpOworCQkJfQorCQl9CisJfTsKKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLlVJTGFiZWwuVE9QSUNfQUxMLCBpdGVtVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5JdGVtLlRPUElDX1NFTEVDVEVELCBzZWxlY3Rpb25VcGRhdGVyKTsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkl0ZW0uVE9QSUNfRU5BQkxFRCwgZW5hYmxlZFVwZGF0ZXIpOworCX0KKworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgY29udGV4dERpc3Bvc2VkKCkgeworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShpdGVtVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHNlbGVjdGlvblVwZGF0ZXIpOworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShlbmFibGVkVXBkYXRlcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Zpc2libGUoTU1lbnVJdGVtIGl0ZW0pIHsKKwkJaWYgKG1lbnVJdGVtVG9FeHByZXNzaW9uLmdldChpdGVtKSAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJTUNvcmVFeHByZXNzaW9uIGV4cCA9IChNQ29yZUV4cHJlc3Npb24pIGl0ZW0uZ2V0VmlzaWJsZVdoZW4oKTsKKwkJRXhwcmVzc2lvbiByZWYgPSBudWxsOworCQlpZiAoZXhwLmdldENvcmVFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CisJCQlyZWYgPSAoRXhwcmVzc2lvbikgZXhwLmdldENvcmVFeHByZXNzaW9uKCk7CisJCX0gZWxzZSB7CisJCQlyZWYgPSBuZXcgUmVmZXJlbmNlRXhwcmVzc2lvbihleHAuZ2V0Q29yZUV4cHJlc3Npb25JZCgpKTsKKwkJCWV4cC5zZXRDb3JlRXhwcmVzc2lvbihyZWYpOworCQl9CisJCW1lbnVJdGVtVG9FeHByZXNzaW9uLnB1dChpdGVtLCByZWYpOworCQlJRWNsaXBzZUNvbnRleHQgaXRlbUNvbnRleHQgPSBnZXRDb250ZXh0KGl0ZW0pOworCQlWaXNpYmxlUkFUIHJhdCA9IG5ldyBWaXNpYmxlUkFUKGl0ZW0sIHJlZiwgaXRlbUNvbnRleHQpOworCQltZW51SXRlbVRvUkFULnB1dChpdGVtLCByYXQpOworCQlpdGVtQ29udGV4dC5ydW5BbmRUcmFjayhyYXQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVDaGlsZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBjaGlsZCkgeworCQlzdXBlci5oaWRlQ2hpbGQocGFyZW50RWxlbWVudCwgY2hpbGQpOworCisJCS8vIFNpbmNlIHRoZXJlJ3Mgbm8gcGxhY2UgdG8gJ3N0b3JlJyBhIGNoaWxkIHRoYXQncyBub3QgaW4gYSBtZW51CisJCS8vIHdlJ2xsIGJsb3cgaXQgYXdheSBhbmQgcmUtY3JlYXRlIG9uIGFuIGFkZAorCQlXaWRnZXQgd2lkZ2V0ID0gKFdpZGdldCkgY2hpbGQuZ2V0V2lkZ2V0KCk7CisJCWlmICh3aWRnZXQgIT0gbnVsbCAmJiAhd2lkZ2V0LmlzRGlzcG9zZWQoKSkKKwkJCXdpZGdldC5kaXNwb3NlKCk7CisJCW1lbnVJdGVtVG9FeHByZXNzaW9uLnJlbW92ZShjaGlsZCk7CisJCVZpc2libGVSQVQgcmF0ID0gbWVudUl0ZW1Ub1JBVC5yZW1vdmUoY2hpbGQpOworCQlpZiAocmF0ICE9IG51bGwpIHsKKwkJCXJhdC5wYXJ0aWNpcGF0aW5nID0gZmFsc2U7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJdGVtVGV4dChNTWVudUl0ZW0gbW9kZWwsIE1lbnVJdGVtIGl0ZW0pIHsKKwkJU3RyaW5nIHRleHQgPSBtb2RlbC5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQlpZiAodGV4dCA9PSBudWxsKSB7CisJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpdGVtLnNldFRleHQodGV4dCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaG9va0NvbnRyb2xsZXJMb2dpYyhNVUlFbGVtZW50IG1lKSB7CisJCS8vIElmIHRoZSBpdGVtIGlzIGEgQ0hFQ0sgb3IgUkFESU8gdXBkYXRlIHRoZSBtb2RlbCdzIHN0YXRlIHRvIG1hdGNoCisJCWlmIChtZSBpbnN0YW5jZW9mIE1JdGVtKSB7CisJCQlmaW5hbCBNSXRlbSBpdGVtID0gKE1JdGVtKSBtZTsKKwkJCWlmIChpdGVtLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5DSEVDSworCQkJCQl8fCBpdGVtLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5SQURJTykgeworCQkJCU1lbnVJdGVtIHRpID0gKE1lbnVJdGVtKSBtZS5nZXRXaWRnZXQoKTsKKwkJCQl0aS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJCS8qKgorCQkJCQkgKgorCQkJCQkgKi8KKwkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCWl0ZW0uc2V0U2VsZWN0ZWQoKChNZW51SXRlbSkgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJaXRlbS5zZXRTZWxlY3RlZCgoKE1lbnVJdGVtKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZW51TWFuYWdlckhpZGVQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lbnVNYW5hZ2VySGlkZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDg5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZW51TWFuYWdlckhpZGVQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1hcmNvIERlc2NoZXIgPG1hcmNvQGRlc2NoZXIuYXQ+IC0gQnVnIDQwMzA4MSwgNDAzMDgzCisgKiAgICAgQnJ1Y2UgU2tpbmdsZSA8QnJ1Y2UuU2tpbmdsZUBpbW11dGlmeS5jb20+IC0gQnVnIDQ0MjU3MAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuRWNsaXBzZUNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLkFib3V0VG9IaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTUR5bmFtaWNNZW51Q29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NUG9wdXBNZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworCisvKioKKyAqIDxjb2RlPk1lbnVNYW5hZ2VySGlkZVByb2Nlc3NvcjwvY29kZT4gcHJvdmlkZXMgaG9va3MgZm9yIHJlbmRlcmVyIHByb2Nlc3NpbmcKKyAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIDxjb2RlPk1lbnVNYW5hZ2VyPC9jb2RlPiBjYWxscyBvdXQgdG8gaXRzCisgKiA8Y29kZT5JTWVudU1hbmFnZXJMaXN0ZW5lcjI8L2NvZGU+IGZvciB0aGUgPGNvZGU+bWVudUFib3V0VG9IaWRlPC9jb2RlPgorICogZXZlbnRzLgorICovCitwdWJsaWMgY2xhc3MgTWVudU1hbmFnZXJIaWRlUHJvY2Vzc29yIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lcjIgeworCisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCUBJbmplY3QKKwlwcml2YXRlIE1lbnVNYW5hZ2VyUmVuZGVyZXIgcmVuZGVyZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgeworCQlpZiAoIShtYW5hZ2VyIGluc3RhbmNlb2YgTWVudU1hbmFnZXIpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSAoTWVudU1hbmFnZXIpIG1hbmFnZXI7CisJCWZpbmFsIE1NZW51IG1lbnVNb2RlbCA9IHJlbmRlcmVyLmdldE1lbnVNb2RlbChtZW51TWFuYWdlcik7CisJCWZpbmFsIE1lbnUgbWVudSA9IG1lbnVNYW5hZ2VyLmdldE1lbnUoKTsKKwkJaWYgKG1lbnVNb2RlbCBpbnN0YW5jZW9mIE1Qb3B1cE1lbnUpIHsKKwkJCWhpZGVQb3B1cChtZW51LCAoTVBvcHVwTWVudSkgbWVudU1vZGVsLCBtZW51TWFuYWdlcik7CisJCX0KKwkJaWYgKG1lbnVNb2RlbCAhPSBudWxsICYmIG1lbnUgIT0gbnVsbCkKKwkJCXByb2Nlc3NEeW5hbWljRWxlbWVudHMoKE1lbnVNYW5hZ2VyKSBtYW5hZ2VyLCBtZW51LCBtZW51TW9kZWwpOworCX0KKworCS8qKgorCSAqIFByb2Nlc3MgZHluYW1pYyBtZW51IGNvbnRyaWJ1dGlvbnMgcHJvdmlkZWQgYnkKKwkgKiB7QGxpbmsgTUR5bmFtaWNNZW51Q29udHJpYnV0aW9ufSBhcHBsaWNhdGlvbiBtb2RlbCBlbGVtZW50cworCSAqCisJICogQHBhcmFtIG1lbnUKKwkgKiBAcGFyYW0gbWVudU1vZGVsCisJICoKKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0R5bmFtaWNFbGVtZW50cyhmaW5hbCBNZW51TWFuYWdlciBtZW51TWFuYWdlciwgTWVudSBtZW51LCBmaW5hbCBNTWVudSBtZW51TW9kZWwpIHsKKwkJLy8gV2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgZHluYW1pYyBpdGVtcyB3aGljaCBuZWVkIHRvIGJlIHJlbW92ZWQKKwkJLy8gYmVjYXVzZSB0aGUgYWN0dWFsIHJlbW92ZSBoYXBwZW5zIGFzeW5jaHJvbm91c2x5LgorCQlmaW5hbCBNYXA8TUR5bmFtaWNNZW51Q29udHJpYnV0aW9uLCBBcnJheUxpc3Q8TU1lbnVFbGVtZW50Pj4gdG9CZUhpZGRlbiA9IG5ldyBIYXNoTWFwPE1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbiwgQXJyYXlMaXN0PE1NZW51RWxlbWVudD4+KCk7CisKKwkJZm9yIChNTWVudUVsZW1lbnQgY3VycmVudE1lbnVFbGVtZW50IDogbWVudU1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChjdXJyZW50TWVudUVsZW1lbnQgaW5zdGFuY2VvZiBNRHluYW1pY01lbnVDb250cmlidXRpb24pIHsKKworCQkJCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RvcmFnZU1hcCA9IGN1cnJlbnRNZW51RWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCk7CisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQkJQXJyYXlMaXN0PE1NZW51RWxlbWVudD4gbWVsID0gKEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+KSBzdG9yYWdlTWFwCisJCQkJCQkuZ2V0KE1lbnVNYW5hZ2VyU2hvd1Byb2Nlc3Nvci5EWU5BTUlDX0VMRU1FTlRfU1RPUkFHRV9LRVkpOworCisJCQkJdG9CZUhpZGRlbi5wdXQoKE1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbikgY3VycmVudE1lbnVFbGVtZW50LCBtZWwpOworCisJCQkJLy8gbWFrZSBleGlzdGluZyBlbnRyaWVzIGZvciB0aGlzIGR5bmFtaWMgY29udHJpYnV0aW9uIGl0ZW0KKwkJCQkvLyBpbnZpc2libGUgaWYgdGhlcmUgYXJlIGFueQorCQkJCWlmIChtZWwgIT0gbnVsbCAmJiBtZWwuc2l6ZSgpID4gMCkgeworCisJCQkJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW0gOiBtZWwpIHsKKwkJCQkJCWl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJY3VycmVudE1lbnVFbGVtZW50LmdldFRyYW5zaWVudERhdGEoKS5yZW1vdmUoTWVudU1hbmFnZXJTaG93UHJvY2Vzc29yLkRZTkFNSUNfRUxFTUVOVF9TVE9SQUdFX0tFWSk7CisJCQl9CisJCX0KKworCQlpZiAoIW1lbnUuaXNEaXNwb3NlZCgpKSB7CisJCQltZW51LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJZm9yIChFbnRyeTxNRHluYW1pY01lbnVDb250cmlidXRpb24sIEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+PiBlbnRyeSA6IHRvQmVIaWRkZW4uZW50cnlTZXQoKSkgeworCQkJCQkJTUR5bmFtaWNNZW51Q29udHJpYnV0aW9uIGN1cnJlbnRNZW51RWxlbWVudCA9IGVudHJ5LmdldEtleSgpOworCQkJCQkJT2JqZWN0IGNvbnRyaWJ1dGlvbiA9IGN1cnJlbnRNZW51RWxlbWVudC5nZXRPYmplY3QoKTsKKwkJCQkJCUlFY2xpcHNlQ29udGV4dCBkeW5hbWljTWVudUNvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkuY3JlYXRlKCk7CisKKwkJCQkJCUFycmF5TGlzdDxNTWVudUVsZW1lbnQ+IG1lbCA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQkJCWR5bmFtaWNNZW51Q29udGV4dC5zZXQoTGlzdC5jbGFzcywgbWVsKTsKKwkJCQkJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gbW9kZWxTZXJ2aWNlLmdldENvbnRhaW5pbmdDb250ZXh0KGN1cnJlbnRNZW51RWxlbWVudCk7CisJCQkJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoY29udHJpYnV0aW9uLCBBYm91dFRvSGlkZS5jbGFzcywgcGFyZW50Q29udGV4dCwKKwkJCQkJCQkJZHluYW1pY01lbnVDb250ZXh0LCBudWxsKTsKKwkJCQkJCWR5bmFtaWNNZW51Q29udGV4dC5kaXNwb3NlKCk7CisJCQkJCQkvLyByZW1vdmUgZXhpc3RpbmcgZW50cmllcyBmb3IgdGhpcyBkeW5hbWljCisJCQkJCQkvLyBjb250cmlidXRpb24gaXRlbSBpZiB0aGVyZSBhcmUgYW55CisJCQkJCQlpZiAobWVsICE9IG51bGwgJiYgbWVsLnNpemUoKSA+IDApIHsKKwkJCQkJCQlyZW5kZXJlci5yZW1vdmVEeW5hbWljTWVudUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIG1lbnVNb2RlbCwgbWVsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9IaWRlKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhpZGVQb3B1cChNZW51IG1lbnUsIE1Qb3B1cE1lbnUgbWVudU1vZGVsLAorCQkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHBvcHVwQ29udGV4dCA9IG1lbnVNb2RlbC5nZXRDb250ZXh0KCk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBvcmlnaW5hbENoaWxkID0gKElFY2xpcHNlQ29udGV4dCkgcG9wdXBDb250ZXh0CisJCQkJLmdldChNZW51TWFuYWdlclJlbmRlcmVyRmlsdGVyLlRNUF9PUklHSU5BTF9DT05URVhUKTsKKwkJcG9wdXBDb250ZXh0LnJlbW92ZShNZW51TWFuYWdlclJlbmRlcmVyRmlsdGVyLlRNUF9PUklHSU5BTF9DT05URVhUKTsKKwkJaWYgKCFtZW51LmlzRGlzcG9zZWQoKSkgeworCQkJbWVudS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCWlmIChvcmlnaW5hbENoaWxkID09IG51bGwpIHsKKwkJCQkJCXBvcHVwQ29udGV4dC5kZWFjdGl2YXRlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvcmlnaW5hbENoaWxkLmFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lbnVNYW5hZ2VyUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lbnVNYW5hZ2VyUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZhMTBiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTWVudU1hbmFnZXJSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMTE5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1hcmNvIERlc2NoZXIgPG1hcmNvQGRlc2NoZXIuYXQ+IC0gQnVnIDM4OTA2MywgQnVnIDM5ODg2NSwgQnVnIDM5ODg2NiwgQnVnIDQwNTQ3MQorICogICAgIFNvcG90IENlbGEgPHNvcG90Y2VsYUBnbWFpbC5jb20+CisgKiAgICAgU3RldmVuIFNwdW5naW4gPHN0ZXZlbkBzcHVuZ2luLnR2PiAtIEJ1ZyA0Mzc3NDcKKyAqICAgICBBbGFuIFN0YXZlcyA8YWxhbi5zdGF2ZXNAbWljcm9mb2N1cy5jb20+IC0gQnVnIDQzNTI3NAorICogICAgIFBhdHJpY2sgTmFpc2ggPHBhdHJpY2submFpc2hAbWljcm9mb2N1cy5jb20+IC0gQnVnIDQzNTI3NAorICogICAgIFJlbsOpIEJyYW5kc3RldHRlciA8UmVuZS5CcmFuZHN0ZXR0ZXJAZ214Lm5ldD4gLSBCdWcgMzc4ODQ5CisgKiAgICAgQW5kcmV5IExvc2t1dG92IDxsb3NrdXRvdkBnbXguZGU+IC0gQnVnIDM3ODg0OQorICogICAgIERpcmsgRmF1dGggPGRpcmsuZmF1dGhAZ29vZ2xlbWFpbC5jb20+IC0gQnVnIDQ2MDU1NgorICogICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAdm9nZWxsYS5jb20+IC0gQnVnIDM5MTQzMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JQ29udGV4dEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuUnVuQW5kVHJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5sb2cuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLlVJRXZlbnRUb3BpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5PcGFxdWVFbGVtZW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUmVuZGVyZWRFbGVtZW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUNvcmVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EaXJlY3RNZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1IYW5kbGVkTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51Q29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVTZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NUG9wdXBNZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUmVzb3VyY2VVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QudXRpbC5JU1dUUmVzb3VyY2VVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWJzdHJhY3RHcm91cE1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC5NZW51TWFuYWdlckV2ZW50SGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CisKKy8qKgorICogQ3JlYXRlIGEgY29udHJpYnV0ZSBwYXJ0LgorICovCitwdWJsaWMgY2xhc3MgTWVudU1hbmFnZXJSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSUJJTElUWV9JREVOVElGSUVSID0gIklJZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19MQUJFTCA9ICJVbkxhYmxlZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9NQVJLRVIgPSAib3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyLkdyb3VwTWFya2VyKFN0cmluZykiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIE1hcDxNTWVudSwgTWVudU1hbmFnZXI+IG1vZGVsVG9NYW5hZ2VyID0gbmV3IEhhc2hNYXA8TU1lbnUsIE1lbnVNYW5hZ2VyPigpOworCXByaXZhdGUgTWFwPE1lbnVNYW5hZ2VyLCBNTWVudT4gbWFuYWdlclRvTW9kZWwgPSBuZXcgSGFzaE1hcDxNZW51TWFuYWdlciwgTU1lbnU+KCk7CisKKwlwcml2YXRlIE1hcDxNTWVudUVsZW1lbnQsIElDb250cmlidXRpb25JdGVtPiBtb2RlbFRvQ29udHJpYnV0aW9uID0gbmV3IEhhc2hNYXA8TU1lbnVFbGVtZW50LCBJQ29udHJpYnV0aW9uSXRlbT4oKTsKKwlwcml2YXRlIE1hcDxJQ29udHJpYnV0aW9uSXRlbSwgTU1lbnVFbGVtZW50PiBjb250cmlidXRpb25Ub01vZGVsID0gbmV3IEhhc2hNYXA8SUNvbnRyaWJ1dGlvbkl0ZW0sIE1NZW51RWxlbWVudD4oKTsKKworCXByaXZhdGUgTWFwPE1NZW51RWxlbWVudCwgQ29udHJpYnV0aW9uUmVjb3JkPiBtb2RlbENvbnRyaWJ1dGlvblRvUmVjb3JkID0gbmV3IEhhc2hNYXA8TU1lbnVFbGVtZW50LCBDb250cmlidXRpb25SZWNvcmQ+KCk7CisJcHJpdmF0ZSBNYXA8TU1lbnVFbGVtZW50LCBBcnJheUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPj4gc2hhcmVkRWxlbWVudFRvUmVjb3JkID0gbmV3IEhhc2hNYXA8TU1lbnVFbGVtZW50LCBBcnJheUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPj4oKTsKKworCXByaXZhdGUgQ29sbGVjdGlvbjxJQ29udHJpYnV0aW9uTWFuYWdlcj4gbWdyVG9VcGRhdGUgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOworCisJQEluamVjdAorCXByaXZhdGUgTUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworCisJQEluamVjdAorCUlFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBpdGVtVXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNTWVudUl0ZW0KKwkJCWlmICghKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1NZW51SXRlbSkpCisJCQkJcmV0dXJuOworCisJCQlNTWVudUl0ZW0gaXRlbU1vZGVsID0gKE1NZW51SXRlbSkgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKworCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGl0ZW1Nb2RlbCk7CisJCQlpZiAoaWNpID09IG51bGwpIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5BVFROQU1FKTsKKwkJCWlmIChVSUV2ZW50cy5VSUxhYmVsLkxBQkVMLmVxdWFscyhhdHROYW1lKQorCQkJCQl8fCBVSUV2ZW50cy5VSUxhYmVsLkxPQ0FMSVpFRF9MQUJFTC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQlpY2kudXBkYXRlKCk7CisJCQl9IGVsc2UgaWYgKFVJRXZlbnRzLlVJTGFiZWwuSUNPTlVSSS5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQlpY2kudXBkYXRlKCk7CisJCQl9CisJCX0KKwl9OworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgbGFiZWxVcGRhdGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1NZW51CisJCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNTWVudSkpCisJCQkJcmV0dXJuOworCisJCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuQVRUTkFNRSk7CisJCQlNTWVudSBtb2RlbCA9IChNTWVudSkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJTWVudU1hbmFnZXIgbWFuYWdlciA9IGdldE1hbmFnZXIobW9kZWwpOworCQkJaWYgKChtYW5hZ2VyID09IG51bGwpKQorCQkJCXJldHVybjsKKwkJCWlmIChVSUV2ZW50cy5VSUxhYmVsLkxBQkVMLmVxdWFscyhhdHROYW1lKQorCQkJCQl8fCBVSUV2ZW50cy5VSUxhYmVsLkxPQ0FMSVpFRF9MQUJFTC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQltYW5hZ2VyLnNldE1lbnVUZXh0KGdldFRleHQobW9kZWwpKTsKKwkJCQltYW5hZ2VyLnVwZGF0ZShJQWN0aW9uLlRFWFQpOworCQkJfQorCQkJaWYgKFVJRXZlbnRzLlVJTGFiZWwuSUNPTlVSSS5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQltYW5hZ2VyLnNldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IobW9kZWwpKTsKKwkJCQltYW5hZ2VyLnVwZGF0ZShJQWN0aW9uLklNQUdFKTsKKwkJCX0KKwkJfQorCX07CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciB0b0JlUmVuZGVyZWRVcGRhdGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQlPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5BVFROQU1FKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTU1lbnVJdGVtKSB7CisJCQkJTU1lbnVJdGVtIGl0ZW1Nb2RlbCA9IChNTWVudUl0ZW0pIGVsZW1lbnQ7CisJCQkJaWYgKFVJRXZlbnRzLlVJRWxlbWVudC5UT0JFUkVOREVSRUQuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQkJCU9iamVjdCBvYmogPSBpdGVtTW9kZWwuZ2V0UGFyZW50KCk7CisJCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIE1NZW51KSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCU1lbnVNYW5hZ2VyIHBhcmVudCA9IGdldE1hbmFnZXIoKE1NZW51KSBvYmopOworCQkJCQlpZiAoaXRlbU1vZGVsLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJCQkJCW1vZGVsUHJvY2Vzc1N3aXRjaChwYXJlbnQsIGl0ZW1Nb2RlbCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJCQkJCWNsZWFyTW9kZWxUb0NvbnRyaWJ1dGlvbihpdGVtTW9kZWwsIGljaSk7CisJCQkJCQlpZiAoaWNpICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKKwkJCQkJCQlwYXJlbnQucmVtb3ZlKGljaSk7CisJCQkJCQl9CisJCQkJCQlpZiAoaWNpICE9IG51bGwpIHsKKwkJCQkJCQlpY2kuZGlzcG9zZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSB7CisJCQkJTVBhcnQgcGFydCA9IChNUGFydCkgZWxlbWVudDsKKwkJCQlpZiAoVUlFdmVudHMuVUlFbGVtZW50LlRPQkVSRU5ERVJFRC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQkJYm9vbGVhbiB0YnIgPSAoQm9vbGVhbikgZXZlbnQKKwkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSk7CisJCQkJCWlmICghdGJyKSB7CisJCQkJCQlMaXN0PE1NZW51PiBtZW51cyA9IHBhcnQuZ2V0TWVudXMoKTsKKwkJCQkJCWZvciAoTU1lbnUgbWVudSA6IG1lbnVzKSB7CisJCQkJCQkJaWYgKG1lbnUgaW5zdGFuY2VvZiBNUG9wdXBNZW51KQorCQkJCQkJCQl1bmxpbmtNZW51KG1lbnUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoVUlFdmVudHMuVUlFbGVtZW50LlZJU0lCTEUuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNTWVudSkgeworCQkJCQlNTWVudSBtZW51TW9kZWwgPSAoTU1lbnUpIGVsZW1lbnQ7CisJCQkJCU1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNYW5hZ2VyKG1lbnVNb2RlbCk7CisJCQkJCWlmIChtYW5hZ2VyID09IG51bGwpIHsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQltYW5hZ2VyLnNldFZpc2libGUobWVudU1vZGVsLmlzVmlzaWJsZSgpKTsKKwkJCQkJaWYgKG1hbmFnZXIuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworCQkJCQkJbWFuYWdlci5nZXRQYXJlbnQoKS5tYXJrRGlydHkoKTsKKwkJCQkJCXNjaGVkdWxlTWFuYWdlclVwZGF0ZShtYW5hZ2VyLmdldFBhcmVudCgpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1NZW51RWxlbWVudCkgeworCQkJCQlNTWVudUVsZW1lbnQgaXRlbU1vZGVsID0gKE1NZW51RWxlbWVudCkgZWxlbWVudDsKKwkJCQkJT2JqZWN0IG9iaiA9IGdldENvbnRyaWJ1dGlvbihpdGVtTW9kZWwpOworCQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cmlidXRpb25JdGVtKSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChDb250cmlidXRpb25JdGVtKSBvYmo7CisJCQkJCWl0ZW0uc2V0VmlzaWJsZShpdGVtTW9kZWwuaXNWaXNpYmxlKCkpOworCQkJCQlpZiAoaXRlbS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisJCQkJCQlpdGVtLmdldFBhcmVudCgpLm1hcmtEaXJ0eSgpOworCQkJCQkJc2NoZWR1bGVNYW5hZ2VyVXBkYXRlKGl0ZW0uZ2V0UGFyZW50KCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfTsKKworCXByaXZhdGUgRXZlbnRIYW5kbGVyIHNlbGVjdGlvblVwZGF0ZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTVRvb2xJdGVtCisJCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNTWVudUl0ZW0pKQorCQkJCXJldHVybjsKKworCQkJTU1lbnVJdGVtIGl0ZW1Nb2RlbCA9IChNTWVudUl0ZW0pIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisJCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJCWlmIChpY2kgIT0gbnVsbCkgeworCQkJCWljaS51cGRhdGUoKTsKKwkJCX0KKwkJfQorCX07CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBlbmFibGVkVXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNTWVudUl0ZW0KKwkJCWlmICghKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1NZW51SXRlbSkpCisJCQkJcmV0dXJuOworCisJCQlNTWVudUl0ZW0gaXRlbU1vZGVsID0gKE1NZW51SXRlbSkgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCUlDb250cmlidXRpb25JdGVtIGljaSA9IGdldENvbnRyaWJ1dGlvbihpdGVtTW9kZWwpOworCQkJaWYgKGljaSAhPSBudWxsKSB7CisJCQkJaWNpLnVwZGF0ZSgpOworCQkJfQorCQl9CisJfTsKKworCXByaXZhdGUgTWVudU1hbmFnZXJSZW5kZXJlckZpbHRlciByZW5kZXJlckZpbHRlcjsKKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLlVJTGFiZWwuVE9QSUNfQUxMLCBpdGVtVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5VSUxhYmVsLlRPUElDX0FMTCwgbGFiZWxVcGRhdGVyKTsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkl0ZW0uVE9QSUNfU0VMRUNURUQsIHNlbGVjdGlvblVwZGF0ZXIpOworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuSXRlbS5UT1BJQ19FTkFCTEVELCBlbmFibGVkVXBkYXRlcik7CisJCWV2ZW50QnJva2VyCisJCQkJLnN1YnNjcmliZShVSUV2ZW50cy5VSUVsZW1lbnQuVE9QSUNfQUxMLCB0b0JlUmVuZGVyZWRVcGRhdGVyKTsKKworCQljb250ZXh0LnNldChNZW51TWFuYWdlclJlbmRlcmVyLmNsYXNzLCB0aGlzKTsKKwkJRGlzcGxheSBkaXNwbGF5ID0gY29udGV4dC5nZXQoRGlzcGxheS5jbGFzcyk7CisJCXJlbmRlcmVyRmlsdGVyID0gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZSgKKwkJCQlNZW51TWFuYWdlclJlbmRlcmVyRmlsdGVyLmNsYXNzLCBjb250ZXh0KTsKKwkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULlNob3csIHJlbmRlcmVyRmlsdGVyKTsKKwkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULkhpZGUsIHJlbmRlcmVyRmlsdGVyKTsKKwkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULkRpc3Bvc2UsIHJlbmRlcmVyRmlsdGVyKTsKKwkJY29udGV4dC5zZXQoTWVudU1hbmFnZXJSZW5kZXJlckZpbHRlci5jbGFzcywgcmVuZGVyZXJGaWx0ZXIpOworCQlNZW51TWFuYWdlckV2ZW50SGVscGVyLmdldEluc3RhbmNlKCkuc2V0U2hvd0hlbHBlcigKKwkJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKE1lbnVNYW5hZ2VyU2hvd1Byb2Nlc3Nvci5jbGFzcywKKwkJCQkJCWNvbnRleHQpKTsKKwkJTWVudU1hbmFnZXJFdmVudEhlbHBlci5nZXRJbnN0YW5jZSgpLnNldEhpZGVIZWxwZXIoCisJCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShNZW51TWFuYWdlckhpZGVQcm9jZXNzb3IuY2xhc3MsCisJCQkJCQljb250ZXh0KSk7CisKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljQ2hpbGRBZGRlZChAVUlFdmVudFRvcGljKEVsZW1lbnRDb250YWluZXIuVE9QSUNfQ0hJTERSRU4pIEV2ZW50IGV2ZW50KSB7CisJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTU1lbnVJdGVtCisJCWlmICghKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1NZW51KSkgeworCQkJcmV0dXJuOworCQl9CisJCU1NZW51IG1lbnVNb2RlbCA9IChNTWVudSkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAoVUlFdmVudHMuaXNBREQoZXZlbnQpKSB7CisJCQlPYmplY3Qgb2JqID0gbWVudU1vZGVsOworCQkJcHJvY2Vzc0NvbnRlbnRzKChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50Pikgb2JqKTsKKwkJfQorCX0KKworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgY29udGV4dERpc3Bvc2VkKCkgeworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShpdGVtVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGxhYmVsVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHNlbGVjdGlvblVwZGF0ZXIpOworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShlbmFibGVkVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHRvQmVSZW5kZXJlZFVwZGF0ZXIpOworCisJCUNvbnRleHRJbmplY3Rpb25GYWN0b3J5LnVuaW5qZWN0KE1lbnVNYW5hZ2VyRXZlbnRIZWxwZXIuZ2V0SW5zdGFuY2UoKQorCQkJCS5nZXRTaG93SGVscGVyKCksCisJCQkJY29udGV4dCk7CisJCU1lbnVNYW5hZ2VyRXZlbnRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5zZXRTaG93SGVscGVyKG51bGwpOworCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS51bmluamVjdCgKK01lbnVNYW5hZ2VyRXZlbnRIZWxwZXIuZ2V0SW5zdGFuY2UoKQorCQkJCS5nZXRIaWRlSGVscGVyKCksCisJCQkJY29udGV4dCk7CisJCU1lbnVNYW5hZ2VyRXZlbnRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5zZXRIaWRlSGVscGVyKG51bGwpOworCisJCWNvbnRleHQucmVtb3ZlKE1lbnVNYW5hZ2VyUmVuZGVyZXJGaWx0ZXIuY2xhc3MpOworCQlEaXNwbGF5IGRpc3BsYXkgPSBjb250ZXh0LmdldChEaXNwbGF5LmNsYXNzKTsKKwkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkgJiYgcmVuZGVyZXJGaWx0ZXIgIT0gbnVsbCkgeworCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIoU1dULlNob3csIHJlbmRlcmVyRmlsdGVyKTsKKwkJCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5IaWRlLCByZW5kZXJlckZpbHRlcik7CisJCQlkaXNwbGF5LnJlbW92ZUZpbHRlcihTV1QuRGlzcG9zZSwgcmVuZGVyZXJGaWx0ZXIpOworCQl9CisJCWlmIChyZW5kZXJlckZpbHRlciAhPSBudWxsKSB7CisJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS51bmluamVjdChyZW5kZXJlckZpbHRlciwgY29udGV4dCk7CisJCQlyZW5kZXJlckZpbHRlciA9IG51bGw7CisJCX0KKwkJY29udGV4dC5yZW1vdmUoTWVudU1hbmFnZXJSZW5kZXJlci5jbGFzcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNTWVudSkpCisJCQlyZXR1cm4gbnVsbDsKKworCQlmaW5hbCBNTWVudSBtZW51TW9kZWwgPSAoTU1lbnUpIGVsZW1lbnQ7CisJCU1lbnUgbmV3TWVudSA9IG51bGw7CisJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbnVsbDsKKwkJYm9vbGVhbiBtZW51QmFyID0gZmFsc2U7CisKKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIERlY29yYXRpb25zKSB7CisJCQlNVUlFbGVtZW50IGNvbnRhaW5lciA9IChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpCisJCQkJCS5lQ29udGFpbmVyKCk7CisJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJCW1lbnVNYW5hZ2VyID0gZ2V0TWFuYWdlcihtZW51TW9kZWwpOworCQkJCWlmIChtZW51TWFuYWdlciA9PSBudWxsKSB7CisJCQkJCW1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE5PX0xBQkVMLAorCQkJCQkJCW1lbnVNb2RlbC5nZXRFbGVtZW50SWQoKSk7CisJCQkJCWxpbmtNb2RlbFRvTWFuYWdlcihtZW51TW9kZWwsIG1lbnVNYW5hZ2VyKTsKKwkJCQl9CisJCQkJbmV3TWVudSA9IG1lbnVNYW5hZ2VyLmNyZWF0ZU1lbnVCYXIoKERlY29yYXRpb25zKSBwYXJlbnQpOworCQkJCSgoRGVjb3JhdGlvbnMpIHBhcmVudCkuc2V0TWVudUJhcihuZXdNZW51KTsKKwkJCQluZXdNZW51LnNldERhdGEobWVudU1hbmFnZXIpOworCQkJCW1lbnVCYXIgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQltZW51TWFuYWdlciA9IGdldE1hbmFnZXIobWVudU1vZGVsKTsKKwkJCQlpZiAobWVudU1hbmFnZXIgPT0gbnVsbCkgeworCQkJCQltZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihOT19MQUJFTCwKKwkJCQkJCQltZW51TW9kZWwuZ2V0RWxlbWVudElkKCkpOworCQkJCQlsaW5rTW9kZWxUb01hbmFnZXIobWVudU1vZGVsLCBtZW51TWFuYWdlcik7CisJCQkJfQorCQkJCW5ld01lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSgoQ29udHJvbCkgcGFyZW50KTsKKwkJCQkvLyB3ZSBjYW4ndCBiZSBzdXJlIHRoaXMgaXMgdGhlIGNvcnJlY3QgcGFyZW50LgorCQkJCS8vICgoQ29udHJvbCkgcGFyZW50KS5zZXRNZW51KG5ld01lbnUpOworCQkJCW5ld01lbnUuc2V0RGF0YShtZW51TWFuYWdlcik7CisJCQl9CisJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgTWVudSkgeworCQkJLy8gT2JqZWN0IGRhdGEgPSAoKE1lbnUpIHBhcmVudCkuZ2V0RGF0YSgpOworCQkJbG9nZ2VyLmRlYnVnKG5ldyBFeGNlcHRpb24oKSwgIlRyeWluZyB0byByZW5kZXIgYSBzdWIgbWVudSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBtZW51TW9kZWwgKyAiXG5cdCIgKyBwYXJlbnQpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbnVsbDsKKworCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnRyb2wpIHsKKwkJCW1lbnVNYW5hZ2VyID0gZ2V0TWFuYWdlcihtZW51TW9kZWwpOworCQkJaWYgKG1lbnVNYW5hZ2VyID09IG51bGwpIHsKKwkJCQltZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihOT19MQUJFTCwKKwkJCQkJCW1lbnVNb2RlbC5nZXRFbGVtZW50SWQoKSk7CisJCQkJbGlua01vZGVsVG9NYW5hZ2VyKG1lbnVNb2RlbCwgbWVudU1hbmFnZXIpOworCQkJfQorCQkJbmV3TWVudSA9IG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KChDb250cm9sKSBwYXJlbnQpOworCQkJLy8gd2UgY2FuJ3QgYmUgc3VyZSB0aGlzIGlzIHRoZSBjb3JyZWN0IHBhcmVudC4KKwkJCS8vICgoQ29udHJvbCkgcGFyZW50KS5zZXRNZW51KG5ld01lbnUpOworCQkJbmV3TWVudS5zZXREYXRhKG1lbnVNYW5hZ2VyKTsKKwkJfQorCQlpZiAoIW1lbnVNYW5hZ2VyLmdldFJlbW92ZUFsbFdoZW5TaG93bigpKSB7CisJCQlwcm9jZXNzQ29udHJpYnV0aW9ucyhtZW51TW9kZWwsIG1lbnVNb2RlbC5nZXRFbGVtZW50SWQoKSwgbWVudUJhciwKKwkJCQkJbWVudU1vZGVsIGluc3RhbmNlb2YgTVBvcHVwTWVudSk7CisJCX0KKwkJaWYgKG5ld01lbnUgIT0gbnVsbCkgeworCQkJbmV3TWVudS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJY2xlYW5VcChtZW51TW9kZWwpOworCQkJCQlNZW51TWFuYWdlciBtYW5hZ2VyID0gZ2V0TWFuYWdlcihtZW51TW9kZWwpOworCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7CisJCQkJCQltYW5hZ2VyLm1hcmtEaXJ0eSgpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0KKwkJcmV0dXJuIG5ld01lbnU7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1lbnVNb2RlbAorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFuVXAoTU1lbnUgbWVudU1vZGVsKSB7CisJCWZvciAoTU1lbnVFbGVtZW50IGNoaWxkRWxlbWVudCA6IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoY2hpbGRFbGVtZW50IGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCQljbGVhblVwKChNTWVudSkgY2hpbGRFbGVtZW50KTsKKwkJCX0KKwkJfQorCQlDb2xsZWN0aW9uPENvbnRyaWJ1dGlvblJlY29yZD4gdmFscyA9IG1vZGVsQ29udHJpYnV0aW9uVG9SZWNvcmQKKwkJCQkudmFsdWVzKCk7CisJCUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPiBkaXNwb3NlZFJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PENvbnRyaWJ1dGlvblJlY29yZD4oKTsKKwkJZm9yIChDb250cmlidXRpb25SZWNvcmQgcmVjb3JkIDogdmFscworCQkJCS50b0FycmF5KG5ldyBDb250cmlidXRpb25SZWNvcmRbdmFscy5zaXplKCldKSkgeworCQkJaWYgKHJlY29yZC5tZW51TW9kZWwgPT0gbWVudU1vZGVsKSB7CisJCQkJcmVjb3JkLmRpc3Bvc2UoKTsKKwkJCQlmb3IgKE1NZW51RWxlbWVudCBjb3B5IDogcmVjb3JkLmdldEdlbmVyYXRlZEVsZW1lbnRzKCkpIHsKKwkJCQkJY2xlYW5VcENvcHkocmVjb3JkLCBjb3B5KTsKKwkJCQl9CisJCQkJZm9yIChNTWVudUVsZW1lbnQgY29weSA6IHJlY29yZC5nZXRTaGFyZWRFbGVtZW50cygpKSB7CisJCQkJCWNsZWFuVXBDb3B5KHJlY29yZCwgY29weSk7CisJCQkJfQorCQkJCXJlY29yZC5nZXRHZW5lcmF0ZWRFbGVtZW50cygpLmNsZWFyKCk7CisJCQkJcmVjb3JkLmdldFNoYXJlZEVsZW1lbnRzKCkuY2xlYXIoKTsKKwkJCQlkaXNwb3NlZFJlY29yZHMuYWRkKHJlY29yZCk7CisJCQl9CisJCX0KKworCQlJdGVyYXRvcjxFbnRyeTxNTWVudUVsZW1lbnQsIENvbnRyaWJ1dGlvblJlY29yZD4+IGl0ZXJhdG9yID0gbW9kZWxDb250cmlidXRpb25Ub1JlY29yZAorCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlFbnRyeTxNTWVudUVsZW1lbnQsIENvbnRyaWJ1dGlvblJlY29yZD4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlDb250cmlidXRpb25SZWNvcmQgcmVjb3JkID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCWlmIChkaXNwb3NlZFJlY29yZHMuY29udGFpbnMocmVjb3JkKSkKKwkJCQlpdGVyYXRvci5yZW1vdmUoKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNsZWFuVXBDb3B5KENvbnRyaWJ1dGlvblJlY29yZCByZWNvcmQsIE1NZW51RWxlbWVudCBjb3B5KSB7CisJCW1vZGVsQ29udHJpYnV0aW9uVG9SZWNvcmQucmVtb3ZlKGNvcHkpOworCQlpZiAoY29weSBpbnN0YW5jZW9mIE1NZW51KSB7CisJCQlNTWVudSBtZW51Q29weSA9IChNTWVudSkgY29weTsKKwkJCWNsZWFuVXAobWVudUNvcHkpOworCQkJTWVudU1hbmFnZXIgY29weU1hbmFnZXIgPSBnZXRNYW5hZ2VyKG1lbnVDb3B5KTsKKwkJCWNsZWFyTW9kZWxUb01hbmFnZXIobWVudUNvcHksIGNvcHlNYW5hZ2VyKTsKKwkJCWlmIChjb3B5TWFuYWdlciAhPSBudWxsKSB7CisJCQkJcmVjb3JkLmdldE1hbmFnZXJGb3JNb2RlbCgpLnJlbW92ZShjb3B5TWFuYWdlcik7CisJCQkJY29weU1hbmFnZXIuZGlzcG9zZSgpOworCQkJfQorCQl9IGVsc2UgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGNvcHkpOworCQkJY2xlYXJNb2RlbFRvQ29udHJpYnV0aW9uKGNvcHksIGljaSk7CisJCQlpZiAoaWNpICE9IG51bGwpIHsKKwkJCQlyZWNvcmQuZ2V0TWFuYWdlckZvck1vZGVsKCkucmVtb3ZlKGljaSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVudU1vZGVsCisJICogQHBhcmFtIGlzTWVudUJhcgorCSAqIEBwYXJhbSBpc1BvcHVwCisJICovCisJcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRyaWJ1dGlvbnMoTU1lbnUgbWVudU1vZGVsLCBTdHJpbmcgZWxlbWVudElkLAorCQkJYm9vbGVhbiBpc01lbnVCYXIsIGJvb2xlYW4gaXNQb3B1cCkgeworCQlpZiAoZWxlbWVudElkID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSA9IG5ldyBBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+KCk7CisJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5YWFhnYXRoZXJNZW51Q29udHJpYnV0aW9ucyhtZW51TW9kZWwsCisJCQkJYXBwbGljYXRpb24uZ2V0TWVudUNvbnRyaWJ1dGlvbnMoKSwgZWxlbWVudElkLCB0b0NvbnRyaWJ1dGUsCisJCQkJbnVsbCwgaXNQb3B1cCk7CisJCWdlbmVyYXRlQ29udHJpYnV0aW9ucyhtZW51TW9kZWwsIHRvQ29udHJpYnV0ZSwgaXNNZW51QmFyKTsKKwkJZm9yIChNTWVudUVsZW1lbnQgZWxlbWVudCA6IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1NZW51KSB7CisJCQkJcHJvY2Vzc0NvbnRyaWJ1dGlvbnMoKE1NZW51KSBlbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnRJZCgpLAorCQkJCQkJZmFsc2UsIGlzUG9wdXApOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIG1lbnVNb2RlbAorCSAqIEBwYXJhbSB0b0NvbnRyaWJ1dGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVDb250cmlidXRpb25zKE1NZW51IG1lbnVNb2RlbCwKKwkJCUFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4gdG9Db250cmlidXRlLCBib29sZWFuIG1lbnVCYXIpIHsKKwkJSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nTWVudUlkcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nU2VwYXJhdG9yTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoTU1lbnVFbGVtZW50IGNoaWxkIDogbWVudU1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCVN0cmluZyBlbGVtZW50SWQgPSBjaGlsZC5nZXRFbGVtZW50SWQoKTsKKwkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1NZW51ICYmIGVsZW1lbnRJZCAhPSBudWxsKSB7CisJCQkJZXhpc3RpbmdNZW51SWRzLmFkZChlbGVtZW50SWQpOworCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1NZW51U2VwYXJhdG9yICYmIGVsZW1lbnRJZCAhPSBudWxsKSB7CisJCQkJZXhpc3RpbmdTZXBhcmF0b3JOYW1lcy5hZGQoZWxlbWVudElkKTsKKwkJCX0KKwkJfQorCisJCU1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNYW5hZ2VyKG1lbnVNb2RlbCk7CisJCWJvb2xlYW4gZG9uZSA9IHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gMDsKKwkJd2hpbGUgKCFkb25lKSB7CisJCQlBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+IGN1ckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1NZW51Q29udHJpYnV0aW9uPigKKwkJCQkJdG9Db250cmlidXRlKTsKKwkJCWludCByZXRyeUNvdW50ID0gdG9Db250cmlidXRlLnNpemUoKTsKKwkJCXRvQ29udHJpYnV0ZS5jbGVhcigpOworCisJCQlmb3IgKE1NZW51Q29udHJpYnV0aW9uIG1lbnVDb250cmlidXRpb24gOiBjdXJMaXN0KSB7CisJCQkJaWYgKCFwcm9jZXNzQWRkaXRpb24obWVudU1vZGVsLCBtYW5hZ2VyLCBtZW51Q29udHJpYnV0aW9uLAorCQkJCQkJZXhpc3RpbmdNZW51SWRzLCBleGlzdGluZ1NlcGFyYXRvck5hbWVzLCBtZW51QmFyKSkgeworCQkJCQl0b0NvbnRyaWJ1dGUuYWRkKG1lbnVDb250cmlidXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJLy8gV2UncmUgZG9uZSBpZiB0aGUgcmV0cnlMaXN0IGlzIG5vdyBlbXB0eSAoZXZlcnl0aGluZyBkb25lKSBvcgorCQkJLy8gaWYgdGhlIGxpc3QgaGFzbid0IGNoYW5nZWQgYXQgYWxsIChubyBob3BlKQorCQkJZG9uZSA9ICh0b0NvbnRyaWJ1dGUuc2l6ZSgpID09IDApCisJCQkJCXx8ICh0b0NvbnRyaWJ1dGUuc2l6ZSgpID09IHJldHJ5Q291bnQpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIG1lbnVNb2RlbAorCSAqIEBwYXJhbSBtYW5hZ2VyCisJICogQHBhcmFtIG1lbnVDb250cmlidXRpb24KKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lbnVDb250cmlidXRpb24gd2FzIHByb2Nlc3NlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQWRkaXRpb24oTU1lbnUgbWVudU1vZGVsLCBmaW5hbCBNZW51TWFuYWdlciBtYW5hZ2VyLAorCQkJTU1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWJ1dGlvbiwKKwkJCWZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBleGlzdGluZ01lbnVJZHMsCisJCQlIYXNoU2V0PFN0cmluZz4gZXhpc3RpbmdTZXBhcmF0b3JOYW1lcywgYm9vbGVhbiBtZW51QmFyKSB7CisJCWZpbmFsIENvbnRyaWJ1dGlvblJlY29yZCByZWNvcmQgPSBuZXcgQ29udHJpYnV0aW9uUmVjb3JkKG1lbnVNb2RlbCwKKwkJCQltZW51Q29udHJpYnV0aW9uLCB0aGlzKTsKKwkJaWYgKCFyZWNvcmQubWVyZ2VJbnRvTW9kZWwoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChtZW51QmFyIHx8IGlzUGFydE1lbnUobWVudU1vZGVsKSkgeworCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQgPSBnZXRDb250ZXh0KG1lbnVNb2RlbCk7CisJCQlwYXJlbnRDb250ZXh0LnJ1bkFuZFRyYWNrKG5ldyBSdW5BbmRUcmFjaygpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCQkJCXJlY29yZC51cGRhdGVWaXNpYmlsaXR5KHBhcmVudENvbnRleHQuZ2V0QWN0aXZlTGVhZigpKTsKKwkJCQkJc2NoZWR1bGVNYW5hZ2VyVXBkYXRlKG1hbmFnZXIpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0TWVudShNTWVudSBtZW51TW9kZWwpIHsKKwkJLy8gZG9uJ3Qgd2FudCBwb3B1cCBtZW51cyBhcyB0aGVpciB2aXNpYmlsaXR5IGRvZXMgbm90IG5lZWQgdG8gYmUKKwkJLy8gdHJhY2tlZCBieSBhIHNlcGFyYXRlIFJ1bkFuZFRyYWNrCisJCXJldHVybiAhKG1lbnVNb2RlbCBpbnN0YW5jZW9mIE1Qb3B1cE1lbnUpCisJCQkJJiYgKChFT2JqZWN0KSBtZW51TW9kZWwpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE1QYXJ0OworCX0KKworCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxDb250cmlidXRpb25SZWNvcmQ+IERFRkFVTFQgPSBuZXcgQXJyYXlMaXN0PENvbnRyaWJ1dGlvblJlY29yZD4oKTsKKworCXB1YmxpYyBBcnJheUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPiBnZXRMaXN0KE1NZW51RWxlbWVudCBpdGVtKSB7CisJCUFycmF5TGlzdDxDb250cmlidXRpb25SZWNvcmQ+IHRtcCA9IHNoYXJlZEVsZW1lbnRUb1JlY29yZC5nZXQoaXRlbSk7CisJCWlmICh0bXAgPT0gbnVsbCkgeworCQkJdG1wID0gREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gdG1wOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFJlY29yZChNTWVudUVsZW1lbnQgaXRlbSwgQ29udHJpYnV0aW9uUmVjb3JkIHJlYykgeworCQlBcnJheUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPiB0bXAgPSBzaGFyZWRFbGVtZW50VG9SZWNvcmQuZ2V0KGl0ZW0pOworCQlpZiAodG1wID09IG51bGwpIHsKKwkJCXRtcCA9IG5ldyBBcnJheUxpc3Q8Q29udHJpYnV0aW9uUmVjb3JkPigpOworCQkJc2hhcmVkRWxlbWVudFRvUmVjb3JkLnB1dChpdGVtLCB0bXApOworCQl9CisJCXRtcC5hZGQocmVjKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVSZWNvcmQoTU1lbnVFbGVtZW50IGl0ZW0sIENvbnRyaWJ1dGlvblJlY29yZCByZWMpIHsKKwkJQXJyYXlMaXN0PENvbnRyaWJ1dGlvblJlY29yZD4gdG1wID0gc2hhcmVkRWxlbWVudFRvUmVjb3JkLmdldChpdGVtKTsKKwkJaWYgKHRtcCAhPSBudWxsKSB7CisJCQl0bXAucmVtb3ZlKHJlYyk7CisJCQlpZiAodG1wLmlzRW1wdHkoKSkgeworCQkJCXNoYXJlZEVsZW1lbnRUb1JlY29yZC5yZW1vdmUoaXRlbSk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIHJlbW92ZU1lbnVDb250cmlidXRpb25zKGZpbmFsIE1NZW51IG1lbnVNb2RlbCwKKwkJCWZpbmFsIEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+IG1lbnVDb250cmlidXRpb25zVG9SZW1vdmUpIHsKKwkJZm9yIChNTWVudUVsZW1lbnQgaXRlbSA6IG1lbnVDb250cmlidXRpb25zVG9SZW1vdmUpIHsKKwkJCW1lbnVNb2RlbC5nZXRDaGlsZHJlbigpLnJlbW92ZShpdGVtKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZW50cyhNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIpIHsKKwkJLy8gSSBjYW4gZWl0aGVyIHNpbXBseSBzdG9wIHByb2Nlc3NpbmcsIG9yIHdlIGNhbiB3YWxrIHRoZSBtb2RlbAorCQkvLyBvdXJzZWx2ZXMgbGlrZSB0aGUgIm9sZCIgZGF5cworCQkvLyBFTUYgZ2l2ZXMgdXMgbnVsbCBsaXN0cyBpZiBlbXB0eQorCQlpZiAoY29udGFpbmVyID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJLy8gdGhpcyBpcyBpbiBkaXJlY3QgdmlvbGF0aW9uIG9mIGdvb2QgcHJvZ3JhbW1pbmcKKwkJTWVudU1hbmFnZXIgcGFyZW50TWFuYWdlciA9IGdldE1hbmFnZXIoKE1NZW51KSAoKE9iamVjdCkgY29udGFpbmVyKSk7CisJCWlmIChwYXJlbnRNYW5hZ2VyID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBQcm9jZXNzIGFueSBjb250ZW50cyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBNRQorCQlMaXN0PE1VSUVsZW1lbnQ+IHBhcnRzID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7CisJCWlmIChwYXJ0cyAhPSBudWxsKSB7CisJCQlNVUlFbGVtZW50W10gcGxpc3QgPSBwYXJ0cy50b0FycmF5KG5ldyBNVUlFbGVtZW50W3BhcnRzLnNpemUoKV0pOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbGlzdC5sZW5ndGg7IGkrKykgeworCQkJCU1VSUVsZW1lbnQgY2hpbGRNRSA9IHBsaXN0W2ldOworCQkJCW1vZGVsUHJvY2Vzc1N3aXRjaChwYXJlbnRNYW5hZ2VyLCAoTU1lbnVFbGVtZW50KSBjaGlsZE1FKTsKKwkJCX0KKwkJfQorCQlzY2hlZHVsZU1hbmFnZXJVcGRhdGUocGFyZW50TWFuYWdlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFRvTWFuYWdlcihNZW51TWFuYWdlciBwYXJlbnRNYW5hZ2VyLCBNTWVudUVsZW1lbnQgbW9kZWwsCisJCQlJQ29udHJpYnV0aW9uSXRlbSBtZW51TWFuYWdlcikgeworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoKTsKKwkJLy8gdGVjaG5pY2FsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJcGFyZW50TWFuYWdlci5hZGQobWVudU1hbmFnZXIpOworCQl9IGVsc2UgeworCQkJaW50IGluZGV4ID0gcGFyZW50LmdldENoaWxkcmVuKCkuaW5kZXhPZihtb2RlbCk7CisJCQkvLyBzaG91bGRuJ3QgYmUgLTEsIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5CisJCQlpZiAoaW5kZXggPiBwYXJlbnRNYW5hZ2VyLmdldFNpemUoKSB8fCBpbmRleCA9PSAtMSkgeworCQkJCXBhcmVudE1hbmFnZXIuYWRkKG1lbnVNYW5hZ2VyKTsKKwkJCX0gZWxzZSB7CisJCQkJcGFyZW50TWFuYWdlci5pbnNlcnQoaW5kZXgsIG1lbnVNYW5hZ2VyKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VyCisJICogQHBhcmFtIG1lbnVNb2RlbAorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzTWVudShNZW51TWFuYWdlciBwYXJlbnRNYW5hZ2VyLCBNTWVudSBtZW51TW9kZWwpIHsKKwkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBnZXRNYW5hZ2VyKG1lbnVNb2RlbCk7CisJCWlmIChtZW51TWFuYWdlciA9PSBudWxsKSB7CisJCQltZW51TW9kZWwuc2V0UmVuZGVyZXIodGhpcyk7CisJCQlTdHJpbmcgbWVudVRleHQgPSBnZXRUZXh0KG1lbnVNb2RlbCk7CisJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihtZW51TW9kZWwpOworCQkJbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIobWVudVRleHQsIGRlc2MsCisJCQkJCW1lbnVNb2RlbC5nZXRFbGVtZW50SWQoKSk7CisJCQlsaW5rTW9kZWxUb01hbmFnZXIobWVudU1vZGVsLCBtZW51TWFuYWdlcik7CisJCQltZW51TWFuYWdlci5zZXRWaXNpYmxlKG1lbnVNb2RlbC5pc1Zpc2libGUoKSk7CisJCQlhZGRUb01hbmFnZXIocGFyZW50TWFuYWdlciwgbWVudU1vZGVsLCBtZW51TWFuYWdlcik7CisJCX0KKwkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbnMobWVudU1vZGVsLCBmYWxzZSk7CisJCUxpc3Q8TU1lbnVFbGVtZW50PiBwYXJ0cyA9IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpOworCQlpZiAocGFydHMgIT0gbnVsbCkgeworCQkJTU1lbnVFbGVtZW50W10gcGxpc3QgPSBwYXJ0cworCQkJCQkudG9BcnJheShuZXcgTU1lbnVFbGVtZW50W3BhcnRzLnNpemUoKV0pOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbGlzdC5sZW5ndGg7IGkrKykgeworCQkJCU1NZW51RWxlbWVudCBjaGlsZE1FID0gcGxpc3RbaV07CisJCQkJbW9kZWxQcm9jZXNzU3dpdGNoKG1lbnVNYW5hZ2VyLCBjaGlsZE1FKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBtZW51TWFuYWdlcgorCSAqIEBwYXJhbSBjaGlsZE1FCisJICovCisJdm9pZCBtb2RlbFByb2Nlc3NTd2l0Y2goTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIE1NZW51RWxlbWVudCBjaGlsZE1FKSB7CisJCWlmICghY2hpbGRNRS5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKFJlbmRlcmVkRWxlbWVudFV0aWwuaXNSZW5kZXJlZE1lbnVJdGVtKGNoaWxkTUUpKSB7CisJCQlNTWVudUl0ZW0gaXRlbU1vZGVsID0gKE1NZW51SXRlbSkgY2hpbGRNRTsKKwkJCXByb2Nlc3NSZW5kZXJlZEl0ZW0obWVudU1hbmFnZXIsIGl0ZW1Nb2RlbCk7CisJCX0gZWxzZSBpZiAoT3BhcXVlRWxlbWVudFV0aWwuaXNPcGFxdWVNZW51SXRlbShjaGlsZE1FKSkgeworCQkJTU1lbnVJdGVtIGl0ZW1Nb2RlbCA9IChNTWVudUl0ZW0pIGNoaWxkTUU7CisJCQlwcm9jZXNzT3BhcXVlSXRlbShtZW51TWFuYWdlciwgaXRlbU1vZGVsKTsKKwkJfSBlbHNlIGlmIChjaGlsZE1FIGluc3RhbmNlb2YgTUhhbmRsZWRNZW51SXRlbSkgeworCQkJTUhhbmRsZWRNZW51SXRlbSBpdGVtTW9kZWwgPSAoTUhhbmRsZWRNZW51SXRlbSkgY2hpbGRNRTsKKwkJCXByb2Nlc3NIYW5kbGVkSXRlbShtZW51TWFuYWdlciwgaXRlbU1vZGVsKTsKKwkJfSBlbHNlIGlmIChjaGlsZE1FIGluc3RhbmNlb2YgTURpcmVjdE1lbnVJdGVtKSB7CisJCQlNRGlyZWN0TWVudUl0ZW0gaXRlbU1vZGVsID0gKE1EaXJlY3RNZW51SXRlbSkgY2hpbGRNRTsKKwkJCXByb2Nlc3NEaXJlY3RJdGVtKG1lbnVNYW5hZ2VyLCBpdGVtTW9kZWwsIG51bGwpOworCQl9IGVsc2UgaWYgKGNoaWxkTUUgaW5zdGFuY2VvZiBNTWVudVNlcGFyYXRvcikgeworCQkJTU1lbnVTZXBhcmF0b3Igc2VwID0gKE1NZW51U2VwYXJhdG9yKSBjaGlsZE1FOworCQkJcHJvY2Vzc1NlcGFyYXRvcihtZW51TWFuYWdlciwgc2VwKTsKKwkJCS8vIH0gZWxzZSBpZiAoY2hpbGRNRSBpbnN0YW5jZW9mIE1PcGFxdWVNZW51KSB7CisJCQkvLyBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBoZXJlCisJCQkvLyBzbyBJJ2xsIGp1c3QgdGFrZSBpdCBvdXQgb2YgdGhlIHJ1bm5pbmcKKwkJfSBlbHNlIGlmIChjaGlsZE1FIGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCU1NZW51IGl0ZW1Nb2RlbCA9IChNTWVudSkgY2hpbGRNRTsKKwkJCXByb2Nlc3NNZW51KG1lbnVNYW5hZ2VyLCBpdGVtTW9kZWwpOworCQl9IGVsc2UgaWYgKGNoaWxkTUUgaW5zdGFuY2VvZiBNRHluYW1pY01lbnVDb250cmlidXRpb24pIHsKKwkJCU1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbiBpdGVtTW9kZWwgPSAoTUR5bmFtaWNNZW51Q29udHJpYnV0aW9uKSBjaGlsZE1FOworCQkJcHJvY2Vzc0R5bmFtaWNNZW51Q29udHJpYnV0aW9uKG1lbnVNYW5hZ2VyLCBpdGVtTW9kZWwpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhcmVudE1hbmFnZXIKKwkgKiBAcGFyYW0gaXRlbU1vZGVsCisJICovCisJdm9pZCBwcm9jZXNzUmVuZGVyZWRJdGVtKE1lbnVNYW5hZ2VyIHBhcmVudE1hbmFnZXIsCisgTU1lbnVJdGVtIGl0ZW1Nb2RlbCkgeworCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJaWYgKGljaSAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaXRlbU1vZGVsLnNldFJlbmRlcmVyKHRoaXMpOworCQlPYmplY3Qgb2JqID0gUmVuZGVyZWRFbGVtZW50VXRpbC5nZXRDb250cmlidXRpb25NYW5hZ2VyKGl0ZW1Nb2RlbCk7CisJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29udGV4dEZ1bmN0aW9uKSB7CisJCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQoaXRlbU1vZGVsKTsKKwkJCWljaSA9IChJQ29udHJpYnV0aW9uSXRlbSkgKChJQ29udGV4dEZ1bmN0aW9uKSBvYmopLmNvbXB1dGUoCisJCQkJCWxjbENvbnRleHQsIG51bGwpOworCQkJUmVuZGVyZWRFbGVtZW50VXRpbC5zZXRDb250cmlidXRpb25NYW5hZ2VyKGl0ZW1Nb2RlbCwgaWNpKTsKKwkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29udHJpYnV0aW9uSXRlbSkgeworCQkJaWNpID0gKElDb250cmlidXRpb25JdGVtKSBvYmo7CisJCX0gZWxzZSB7CisJCQkvLyBUT0RPIHBvdGVudGlhbGx5IGxvZyB0aGUgc3RhdGUsIHdlJ3ZlIGdvdCBzb21ldGhpbmcgd2UncmUgbm90CisJCQkvLyBoYXBweSB3aXRoCisJCQlyZXR1cm47CisJCX0KKwkJaWNpLnNldFZpc2libGUoaXRlbU1vZGVsLmlzVmlzaWJsZSgpKTsKKwkJYWRkVG9NYW5hZ2VyKHBhcmVudE1hbmFnZXIsIGl0ZW1Nb2RlbCwgaWNpKTsKKwkJbGlua01vZGVsVG9Db250cmlidXRpb24oaXRlbU1vZGVsLCBpY2kpOworCX0KKworCXZvaWQgcHJvY2Vzc09wYXF1ZUl0ZW0oTWVudU1hbmFnZXIgcGFyZW50TWFuYWdlciwgTU1lbnVJdGVtIGl0ZW1Nb2RlbCkgeworCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJaWYgKGljaSAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaXRlbU1vZGVsLnNldFJlbmRlcmVyKHRoaXMpOworCQlPYmplY3Qgb2JqID0gT3BhcXVlRWxlbWVudFV0aWwuZ2V0T3BhcXVlSXRlbShpdGVtTW9kZWwpOworCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCWljaSA9IChJQ29udHJpYnV0aW9uSXRlbSkgb2JqOworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisJCWljaS5zZXRWaXNpYmxlKGl0ZW1Nb2RlbC5pc1Zpc2libGUoKSk7CisJCWFkZFRvTWFuYWdlcihwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwsIGljaSk7CisJCWxpbmtNb2RlbFRvQ29udHJpYnV0aW9uKGl0ZW1Nb2RlbCwgaWNpKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIKKwkgKiBAcGFyYW0gaXRlbU1vZGVsCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZXBhcmF0b3IoTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCisJCQlNTWVudVNlcGFyYXRvciBpdGVtTW9kZWwpIHsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGl0ZW1Nb2RlbCk7CisJCWlmIChpY2kgIT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWl0ZW1Nb2RlbC5zZXRSZW5kZXJlcih0aGlzKTsKKwkJQWJzdHJhY3RHcm91cE1hcmtlciBtYXJrZXIgPSBudWxsOworCQlpZiAoaXRlbU1vZGVsLmdldFRhZ3MoKS5jb250YWlucyhHUk9VUF9NQVJLRVIpCisJCQkJfHwgIWl0ZW1Nb2RlbC5pc1Zpc2libGUoKSkgeworCQkJaWYgKGl0ZW1Nb2RlbC5nZXRFbGVtZW50SWQoKSAhPSBudWxsKSB7CisJCQkJbWFya2VyID0gbmV3IEdyb3VwTWFya2VyKGl0ZW1Nb2RlbC5nZXRFbGVtZW50SWQoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQltYXJrZXIgPSBuZXcgU2VwYXJhdG9yKCk7CisJCQltYXJrZXIuc2V0SWQoaXRlbU1vZGVsLmdldEVsZW1lbnRJZCgpKTsKKwkJfQorCQlpZiAobWFya2VyID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlhZGRUb01hbmFnZXIobWVudU1hbmFnZXIsIGl0ZW1Nb2RlbCwgbWFya2VyKTsKKwkJbGlua01vZGVsVG9Db250cmlidXRpb24oaXRlbU1vZGVsLCBtYXJrZXIpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VyCisJICogQHBhcmFtIGl0ZW1Nb2RlbAorCSAqIEBwYXJhbSBpZAorCSAqLworCXZvaWQgcHJvY2Vzc0RpcmVjdEl0ZW0oTWVudU1hbmFnZXIgcGFyZW50TWFuYWdlciwKKwkJCU1EaXJlY3RNZW51SXRlbSBpdGVtTW9kZWwsIFN0cmluZyBpZCkgeworCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJaWYgKGljaSAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaXRlbU1vZGVsLnNldFJlbmRlcmVyKHRoaXMpOworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQoaXRlbU1vZGVsKTsKKwkJRGlyZWN0Q29udHJpYnV0aW9uSXRlbSBjaSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoCisJCQkJRGlyZWN0Q29udHJpYnV0aW9uSXRlbS5jbGFzcywgbGNsQ29udGV4dCk7CisJCWNpLnNldE1vZGVsKGl0ZW1Nb2RlbCk7CisJCWNpLnNldFZpc2libGUoaXRlbU1vZGVsLmlzVmlzaWJsZSgpKTsKKwkJYWRkVG9NYW5hZ2VyKHBhcmVudE1hbmFnZXIsIGl0ZW1Nb2RlbCwgY2kpOworCQlsaW5rTW9kZWxUb0NvbnRyaWJ1dGlvbihpdGVtTW9kZWwsIGNpKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIKKwkgKiBAcGFyYW0gaXRlbU1vZGVsCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NEeW5hbWljTWVudUNvbnRyaWJ1dGlvbihNZW51TWFuYWdlciBtZW51TWFuYWdlciwKKwkJCU1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbiBpdGVtTW9kZWwpIHsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGl0ZW1Nb2RlbCk7CisJCWlmIChpY2kgIT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWl0ZW1Nb2RlbC5zZXRSZW5kZXJlcih0aGlzKTsKKwkJRHluYW1pY0NvbnRyaWJ1dGlvbkNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSBuZXcgRHluYW1pY0NvbnRyaWJ1dGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCisJCQkJaXRlbU1vZGVsKTsKKwkJYWRkVG9NYW5hZ2VyKG1lbnVNYW5hZ2VyLCBpdGVtTW9kZWwsIGNpKTsKKwkJbGlua01vZGVsVG9Db250cmlidXRpb24oaXRlbU1vZGVsLCBjaSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhcmVudE1hbmFnZXIKKwkgKiBAcGFyYW0gaXRlbU1vZGVsCisJICovCisJdm9pZCBwcm9jZXNzSGFuZGxlZEl0ZW0oTWVudU1hbmFnZXIgcGFyZW50TWFuYWdlciwKKwkJCU1IYW5kbGVkTWVudUl0ZW0gaXRlbU1vZGVsKSB7CisJCUlDb250cmlidXRpb25JdGVtIGljaSA9IGdldENvbnRyaWJ1dGlvbihpdGVtTW9kZWwpOworCQlpZiAoaWNpICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpdGVtTW9kZWwuc2V0UmVuZGVyZXIodGhpcyk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChpdGVtTW9kZWwpOworCQlIYW5kbGVkQ29udHJpYnV0aW9uSXRlbSBjaSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoCisJCQkJSGFuZGxlZENvbnRyaWJ1dGlvbkl0ZW0uY2xhc3MsIGxjbENvbnRleHQpOworCQljaS5zZXRNb2RlbChpdGVtTW9kZWwpOworCQljaS5zZXRWaXNpYmxlKGl0ZW1Nb2RlbC5pc1Zpc2libGUoKSk7CisJCWFkZFRvTWFuYWdlcihwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwsIGNpKTsKKwkJbGlua01vZGVsVG9Db250cmlidXRpb24oaXRlbU1vZGVsLCBjaSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dChNTWVudSBtZW51TW9kZWwpIHsKKwkJU3RyaW5nIHRleHQgPSBtZW51TW9kZWwuZ2V0TG9jYWxpemVkTGFiZWwoKTsKKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiBOT19MQUJFTDsKKwkJfQorCQlyZXR1cm4gdGV4dDsKKwl9CisKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoTVVJTGFiZWwgZWxlbWVudCkgeworCQlJRWNsaXBzZUNvbnRleHQgbG9jYWxDb250ZXh0ID0gY29udGV4dDsKKwkJU3RyaW5nIGljb25VUkkgPSBlbGVtZW50LmdldEljb25VUkkoKTsKKwkJaWYgKGljb25VUkkgIT0gbnVsbCAmJiBpY29uVVJJLmxlbmd0aCgpID4gMCkgeworCQkJSVNXVFJlc291cmNlVXRpbGl0aWVzIHJlc1V0aWxzID0gKElTV1RSZXNvdXJjZVV0aWxpdGllcykgbG9jYWxDb250ZXh0CisJCQkJCS5nZXQoSVJlc291cmNlVXRpbGl0aWVzLmNsYXNzLmdldE5hbWUoKSk7CisJCQlyZXR1cm4gcmVzVXRpbHMuaW1hZ2VEZXNjcmlwdG9yRnJvbVVSSShVUkkuY3JlYXRlVVJJKGljb25VUkkpKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTWVudU1hbmFnZXIgZ2V0TWFuYWdlcihNTWVudSBtb2RlbCkgeworCQlyZXR1cm4gbW9kZWxUb01hbmFnZXIuZ2V0KG1vZGVsKTsKKwl9CisKKwlwdWJsaWMgTU1lbnUgZ2V0TWVudU1vZGVsKE1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJcmV0dXJuIG1hbmFnZXJUb01vZGVsLmdldChtYW5hZ2VyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsaW5rTW9kZWxUb01hbmFnZXIoTU1lbnUgbW9kZWwsIE1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJbW9kZWxUb01hbmFnZXIucHV0KG1vZGVsLCBtYW5hZ2VyKTsKKwkJbWFuYWdlclRvTW9kZWwucHV0KG1hbmFnZXIsIG1vZGVsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGVhck1vZGVsVG9NYW5hZ2VyKE1NZW51IG1vZGVsLCBNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCWZvciAoTU1lbnVFbGVtZW50IGVsZW1lbnQgOiBtb2RlbC5nZXRDaGlsZHJlbigpKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oZWxlbWVudCk7CisJCQljbGVhck1vZGVsVG9Db250cmlidXRpb24oZWxlbWVudCwgaWNpKTsKKwkJfQorCQltb2RlbFRvTWFuYWdlci5yZW1vdmUobW9kZWwpOworCQltYW5hZ2VyVG9Nb2RlbC5yZW1vdmUobWFuYWdlcik7CisJfQorCisJcHVibGljIElDb250cmlidXRpb25JdGVtIGdldENvbnRyaWJ1dGlvbihNTWVudUVsZW1lbnQgbW9kZWwpIHsKKwkJcmV0dXJuIG1vZGVsVG9Db250cmlidXRpb24uZ2V0KG1vZGVsKTsKKwl9CisKKwlwdWJsaWMgTU1lbnVFbGVtZW50IGdldE1lbnVFbGVtZW50KElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKKwkJcmV0dXJuIGNvbnRyaWJ1dGlvblRvTW9kZWwuZ2V0KGl0ZW0pOworCX0KKworCXB1YmxpYyB2b2lkIGxpbmtNb2RlbFRvQ29udHJpYnV0aW9uKE1NZW51RWxlbWVudCBtb2RlbCwKKwkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKKwkJbW9kZWxUb0NvbnRyaWJ1dGlvbi5wdXQobW9kZWwsIGl0ZW0pOworCQljb250cmlidXRpb25Ub01vZGVsLnB1dChpdGVtLCBtb2RlbCk7CisJfQorCisJcHVibGljIHZvaWQgY2xlYXJNb2RlbFRvQ29udHJpYnV0aW9uKE1NZW51RWxlbWVudCBtb2RlbCwKKwkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKKwkJbW9kZWxUb0NvbnRyaWJ1dGlvbi5yZW1vdmUobW9kZWwpOworCQljb250cmlidXRpb25Ub01vZGVsLnJlbW92ZShpdGVtKTsKKwl9CisKKwlwdWJsaWMgQ29udHJpYnV0aW9uUmVjb3JkIGdldENvbnRyaWJ1dGlvblJlY29yZChNTWVudUVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gbW9kZWxDb250cmlidXRpb25Ub1JlY29yZC5nZXQoZWxlbWVudCk7CisJfQorCisJcHVibGljIHZvaWQgbGlua0VsZW1lbnRUb0NvbnRyaWJ1dGlvblJlY29yZChNTWVudUVsZW1lbnQgZWxlbWVudCwKKwkJCUNvbnRyaWJ1dGlvblJlY29yZCByZWNvcmQpIHsKKwkJbW9kZWxDb250cmlidXRpb25Ub1JlY29yZC5wdXQoZWxlbWVudCwgcmVjb3JkKTsKKwl9CisKKwkvKioKKwkgKiBTZWFyY2ggdGhlIHJlY29yZHMgZm9yIHRlc3RpbmcuIExvb2ssIGJ1dCBkb24ndCB0b3VjaCEKKwkgKgorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGFjdGl2ZSBDb250cmlidXRpb25SZWNvcmRzLgorCSAqLworCXB1YmxpYyBDb250cmlidXRpb25SZWNvcmRbXSBnZXRDb250cmlidXRpb25SZWNvcmRzKCkgeworCQlIYXNoU2V0PENvbnRyaWJ1dGlvblJlY29yZD4gcmVjb3JkcyA9IG5ldyBIYXNoU2V0PENvbnRyaWJ1dGlvblJlY29yZD4oCisJCQkJbW9kZWxDb250cmlidXRpb25Ub1JlY29yZC52YWx1ZXMoKSk7CisJCXJldHVybiByZWNvcmRzLnRvQXJyYXkobmV3IENvbnRyaWJ1dGlvblJlY29yZFtyZWNvcmRzLnNpemUoKV0pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJRWNsaXBzZUNvbnRleHQgZ2V0Q29udGV4dChNVUlFbGVtZW50IGVsKSB7CisJCXJldHVybiBzdXBlci5nZXRDb250ZXh0KGVsKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIKKwkgKiBAcGFyYW0gbWVudU1vZGVsCisJICovCisJcHVibGljIHZvaWQgcmVjb25jaWxlTWFuYWdlclRvTW9kZWwoTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIE1NZW51IG1lbnVNb2RlbCkgeworCQlMaXN0PE1NZW51RWxlbWVudD4gbW9kZWxDaGlsZHJlbiA9IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpOworCisJCUhhc2hTZXQ8TU1lbnVJdGVtPiBvbGRNb2RlbEl0ZW1zID0gbmV3IEhhc2hTZXQ8TU1lbnVJdGVtPigpOworCQlIYXNoU2V0PE1NZW51PiBvbGRNZW51cyA9IG5ldyBIYXNoU2V0PE1NZW51PigpOworCQlIYXNoU2V0PE1NZW51U2VwYXJhdG9yPiBvbGRTZXBzID0gbmV3IEhhc2hTZXQ8TU1lbnVTZXBhcmF0b3I+KCk7CisJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW1Nb2RlbCA6IG1vZGVsQ2hpbGRyZW4pIHsKKwkJCWlmIChPcGFxdWVFbGVtZW50VXRpbC5pc09wYXF1ZU1lbnVTZXBhcmF0b3IoaXRlbU1vZGVsKSkgeworCQkJCW9sZFNlcHMuYWRkKChNTWVudVNlcGFyYXRvcikgaXRlbU1vZGVsKTsKKwkJCX0gZWxzZSBpZiAoT3BhcXVlRWxlbWVudFV0aWwuaXNPcGFxdWVNZW51SXRlbShpdGVtTW9kZWwpKSB7CisJCQkJb2xkTW9kZWxJdGVtcy5hZGQoKE1NZW51SXRlbSkgaXRlbU1vZGVsKTsKKwkJCX0gZWxzZSBpZiAoT3BhcXVlRWxlbWVudFV0aWwuaXNPcGFxdWVNZW51KGl0ZW1Nb2RlbCkpIHsKKwkJCQlvbGRNZW51cy5hZGQoKE1NZW51KSBpdGVtTW9kZWwpOworCQkJfQorCQl9CisKKwkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1lbnVNYW5hZ2VyLmdldEl0ZW1zKCk7CisJCWZvciAoaW50IHNyYyA9IDAsIGRlc3QgPSAwOyBzcmMgPCBpdGVtcy5sZW5ndGg7IHNyYysrLCBkZXN0KyspIHsKKwkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tzcmNdOworCisJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkvLyBnZXQgdGhlIHdyYXBwZWQgY29udHJpYnV0aW9uIGl0ZW0KKwkJCQlpdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBpdGVtKS5nZXRJbm5lckl0ZW0oKTsKKwkJCX0KKworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51TWFuYWdlcikgeworCQkJCU1lbnVNYW5hZ2VyIGNoaWxkTWFuYWdlciA9IChNZW51TWFuYWdlcikgaXRlbTsKKwkJCQlNTWVudSBjaGlsZE1vZGVsID0gZ2V0TWVudU1vZGVsKGNoaWxkTWFuYWdlcik7CisJCQkJaWYgKGNoaWxkTW9kZWwgPT0gbnVsbCkgeworCQkJCQlNTWVudSBsZWdhY3lNb2RlbCA9IE9wYXF1ZUVsZW1lbnRVdGlsLmNyZWF0ZU9wYXF1ZU1lbnUoKTsKKwkJCQkJbGVnYWN5TW9kZWwuc2V0RWxlbWVudElkKGNoaWxkTWFuYWdlci5nZXRJZCgpKTsKKwkJCQkJbGVnYWN5TW9kZWwuc2V0VmlzaWJsZShjaGlsZE1hbmFnZXIuaXNWaXNpYmxlKCkpOworCQkJCQlsZWdhY3lNb2RlbC5zZXRMYWJlbChjaGlsZE1hbmFnZXIuZ2V0TWVudVRleHQoKSk7CisKKwkJCQkJbGlua01vZGVsVG9NYW5hZ2VyKGxlZ2FjeU1vZGVsLCBjaGlsZE1hbmFnZXIpOworCQkJCQlPcGFxdWVFbGVtZW50VXRpbC5zZXRPcGFxdWVJdGVtKGxlZ2FjeU1vZGVsLCBjaGlsZE1hbmFnZXIpOworCQkJCQlpZiAobW9kZWxDaGlsZHJlbi5zaXplKCkgPiBkZXN0KSB7CisJCQkJCQltb2RlbENoaWxkcmVuLmFkZChkZXN0LCBsZWdhY3lNb2RlbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltb2RlbENoaWxkcmVuLmFkZChsZWdhY3lNb2RlbCk7CisJCQkJCX0KKwkJCQkJcmVjb25jaWxlTWFuYWdlclRvTW9kZWwoY2hpbGRNYW5hZ2VyLCBsZWdhY3lNb2RlbCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKE9wYXF1ZUVsZW1lbnRVdGlsLmlzT3BhcXVlTWVudShjaGlsZE1vZGVsKSkgeworCQkJCQkJb2xkTWVudXMucmVtb3ZlKGNoaWxkTW9kZWwpOworCQkJCQl9CisJCQkJCWlmIChtb2RlbENoaWxkcmVuLnNpemUoKSA+IGRlc3QpIHsKKwkJCQkJCWlmIChtb2RlbENoaWxkcmVuLmdldChkZXN0KSAhPSBjaGlsZE1vZGVsKSB7CisJCQkJCQkJbW9kZWxDaGlsZHJlbi5yZW1vdmUoY2hpbGRNb2RlbCk7CisJCQkJCQkJbW9kZWxDaGlsZHJlbi5hZGQoZGVzdCwgY2hpbGRNb2RlbCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQltb2RlbENoaWxkcmVuLmFkZChjaGlsZE1vZGVsKTsKKwkJCQkJfQorCQkJCQlpZiAoY2hpbGRNb2RlbCBpbnN0YW5jZW9mIE1Qb3B1cE1lbnUpIHsKKwkJCQkJCWlmICgoKE1Qb3B1cE1lbnUpIGNoaWxkTW9kZWwpLmdldENvbnRleHQoKSA9PSBudWxsKSB7CisJCQkJCQkJSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBnZXRDb250ZXh0KG1lbnVNb2RlbCk7CisJCQkJCQkJaWYgKGxjbENvbnRleHQgIT0gbnVsbCkgeworCQkJCQkJCQkoKE1Qb3B1cE1lbnUpIGNoaWxkTW9kZWwpCisJCQkJCQkJCQkJLnNldENvbnRleHQobGNsQ29udGV4dAorCQkJCQkJCQkJCQkJLmNyZWF0ZUNoaWxkKGNoaWxkTW9kZWwKKwkJCQkJCQkJCQkJCQkJLmdldEVsZW1lbnRJZCgpKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGNoaWxkTW9kZWwuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgIT0gY2hpbGRNYW5hZ2VyLmdldFNpemUoKSkgeworCQkJCQkJcmVjb25jaWxlTWFuYWdlclRvTW9kZWwoY2hpbGRNYW5hZ2VyLCBjaGlsZE1vZGVsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoaXRlbS5pc1NlcGFyYXRvcigpIHx8IGl0ZW0uaXNHcm91cE1hcmtlcigpKSB7CisJCQkJTU1lbnVFbGVtZW50IG1lbnVFbGVtZW50ID0gZ2V0TWVudUVsZW1lbnQoaXRlbSk7CisJCQkJaWYgKG1lbnVFbGVtZW50ID09IG51bGwpIHsKKwkJCQkJTU1lbnVTZXBhcmF0b3IgbGVnYWN5U2VwID0gT3BhcXVlRWxlbWVudFV0aWwKKwkJCQkJCQkuY3JlYXRlT3BhcXVlTWVudVNlcGFyYXRvcigpOworCQkJCQlsZWdhY3lTZXAuc2V0RWxlbWVudElkKGl0ZW0uZ2V0SWQoKSk7CisJCQkJCWxlZ2FjeVNlcC5zZXRWaXNpYmxlKGl0ZW0uaXNWaXNpYmxlKCkpOworCQkJCQlPcGFxdWVFbGVtZW50VXRpbC5zZXRPcGFxdWVJdGVtKGxlZ2FjeVNlcCwgaXRlbSk7CisJCQkJCWxpbmtNb2RlbFRvQ29udHJpYnV0aW9uKGxlZ2FjeVNlcCwgaXRlbSk7CisJCQkJCWlmIChtb2RlbENoaWxkcmVuLnNpemUoKSA+IGRlc3QpIHsKKwkJCQkJCW1vZGVsQ2hpbGRyZW4uYWRkKGRlc3QsIGxlZ2FjeVNlcCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltb2RlbENoaWxkcmVuLmFkZChsZWdhY3lTZXApOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChPcGFxdWVFbGVtZW50VXRpbC5pc09wYXF1ZU1lbnVTZXBhcmF0b3IobWVudUVsZW1lbnQpKSB7CisJCQkJCU1NZW51U2VwYXJhdG9yIGxlZ2FjeVNlcCA9IChNTWVudVNlcGFyYXRvcikgbWVudUVsZW1lbnQ7CisJCQkJCW9sZFNlcHMucmVtb3ZlKGxlZ2FjeVNlcCk7CisJCQkJCWlmIChtb2RlbENoaWxkcmVuLnNpemUoKSA+IGRlc3QpIHsKKwkJCQkJCWlmIChtb2RlbENoaWxkcmVuLmdldChkZXN0KSAhPSBsZWdhY3lTZXApIHsKKwkJCQkJCQltb2RlbENoaWxkcmVuLnJlbW92ZShsZWdhY3lTZXApOworCQkJCQkJCW1vZGVsQ2hpbGRyZW4uYWRkKGRlc3QsIGxlZ2FjeVNlcCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQltb2RlbENoaWxkcmVuLmFkZChsZWdhY3lTZXApOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlNTWVudUVsZW1lbnQgbWVudUVsZW1lbnQgPSBnZXRNZW51RWxlbWVudChpdGVtKTsKKwkJCQlpZiAobWVudUVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQlNTWVudUl0ZW0gbGVnYWN5SXRlbSA9IE9wYXF1ZUVsZW1lbnRVdGlsCisJCQkJCQkJLmNyZWF0ZU9wYXF1ZU1lbnVJdGVtKCk7CisJCQkJCWxlZ2FjeUl0ZW0uc2V0RWxlbWVudElkKGl0ZW0uZ2V0SWQoKSk7CisJCQkJCWxlZ2FjeUl0ZW0uc2V0VmlzaWJsZShpdGVtLmlzVmlzaWJsZSgpKTsKKwkJCQkJT3BhcXVlRWxlbWVudFV0aWwuc2V0T3BhcXVlSXRlbShsZWdhY3lJdGVtLCBpdGVtKTsKKwkJCQkJbGlua01vZGVsVG9Db250cmlidXRpb24obGVnYWN5SXRlbSwgaXRlbSk7CisJCQkJCWlmIChtb2RlbENoaWxkcmVuLnNpemUoKSA+IGRlc3QpIHsKKwkJCQkJCW1vZGVsQ2hpbGRyZW4uYWRkKGRlc3QsIGxlZ2FjeUl0ZW0pOworCQkJCQl9IGVsc2UgeworCQkJCQkJbW9kZWxDaGlsZHJlbi5hZGQobGVnYWN5SXRlbSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKE9wYXF1ZUVsZW1lbnRVdGlsLmlzT3BhcXVlTWVudUl0ZW0obWVudUVsZW1lbnQpKSB7CisJCQkJCU1NZW51SXRlbSBsZWdhY3lJdGVtID0gKE1NZW51SXRlbSkgbWVudUVsZW1lbnQ7CisJCQkJCW9sZE1vZGVsSXRlbXMucmVtb3ZlKGxlZ2FjeUl0ZW0pOworCQkJCQlpZiAobW9kZWxDaGlsZHJlbi5zaXplKCkgPiBkZXN0KSB7CisJCQkJCQlpZiAobW9kZWxDaGlsZHJlbi5nZXQoZGVzdCkgIT0gbGVnYWN5SXRlbSkgeworCQkJCQkJCW1vZGVsQ2hpbGRyZW4ucmVtb3ZlKGxlZ2FjeUl0ZW0pOworCQkJCQkJCW1vZGVsQ2hpbGRyZW4uYWRkKGRlc3QsIGxlZ2FjeUl0ZW0pOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJbW9kZWxDaGlsZHJlbi5hZGQobGVnYWN5SXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFvbGRNb2RlbEl0ZW1zLmlzRW1wdHkoKSkgeworCQkJbW9kZWxDaGlsZHJlbi5yZW1vdmVBbGwob2xkTW9kZWxJdGVtcyk7CisJCQlmb3IgKE1NZW51SXRlbSBtb2RlbCA6IG9sZE1vZGVsSXRlbXMpIHsKKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIE9wYXF1ZUVsZW1lbnRVdGlsCisJCQkJCQkuZ2V0T3BhcXVlSXRlbShtb2RlbCk7CisJCQkJY2xlYXJNb2RlbFRvQ29udHJpYnV0aW9uKG1vZGVsLCBpY2kpOworCQkJfQorCQl9CisJCWlmICghb2xkTWVudXMuaXNFbXB0eSgpKSB7CisJCQltb2RlbENoaWxkcmVuLnJlbW92ZUFsbChvbGRNZW51cyk7CisJCQlmb3IgKE1NZW51IG9sZE1lbnUgOiBvbGRNZW51cykgeworCQkJCU1lbnVNYW5hZ2VyIG9sZE1hbmFnZXIgPSBnZXRNYW5hZ2VyKG9sZE1lbnUpOworCQkJCWNsZWFyTW9kZWxUb01hbmFnZXIob2xkTWVudSwgb2xkTWFuYWdlcik7CisJCQl9CisJCX0KKwkJaWYgKCFvbGRTZXBzLmlzRW1wdHkoKSkgeworCQkJbW9kZWxDaGlsZHJlbi5yZW1vdmVBbGwob2xkU2Vwcyk7CisJCQlmb3IgKE1NZW51U2VwYXJhdG9yIG1vZGVsIDogb2xkU2VwcykgeworCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIE9wYXF1ZUVsZW1lbnRVdGlsCisJCQkJCQkuZ2V0T3BhcXVlSXRlbShtb2RlbCk7CisJCQkJY2xlYXJNb2RlbFRvQ29udHJpYnV0aW9uKG1vZGVsLCBpdGVtKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBtZW51TWFuYWdlcgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogQHBhcmFtIGV2YWxDb250ZXh0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVZpc2liaWxpdHkoTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCisJCQlNTWVudUVsZW1lbnQgZWxlbWVudCwgRXhwcmVzc2lvbkNvbnRleHQgZXZhbENvbnRleHQpIHsKKwkJYm9vbGVhbiBjdXJyZW50ID0gZWxlbWVudC5pc1Zpc2libGUoKTsKKwkJYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKKwkJYm9vbGVhbiBldmFsdWF0ZWQgPSBmYWxzZTsKKwkJaWYgKGVsZW1lbnQuZ2V0UGVyc2lzdGVkU3RhdGUoKS5nZXQoVklTSUJJTElUWV9JREVOVElGSUVSKSAhPSBudWxsKSB7CisJCQlldmFsdWF0ZWQgPSB0cnVlOworCQkJU3RyaW5nIGlkZW50aWZpZXIgPSBlbGVtZW50LmdldFBlcnNpc3RlZFN0YXRlKCkuZ2V0KAorCQkJCQlWSVNJQklMSVRZX0lERU5USUZJRVIpOworCQkJT2JqZWN0IHJjID0gZXZhbENvbnRleHQuZWNsaXBzZUNvbnRleHQuZ2V0KGlkZW50aWZpZXIpOworCQkJaWYgKHJjIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJCXZpc2libGUgPSAoKEJvb2xlYW4pIHJjKS5ib29sZWFuVmFsdWUoKTsKKwkJCX0KKwkJfQorCQlpZiAodmlzaWJsZSAmJiAoZWxlbWVudC5nZXRWaXNpYmxlV2hlbigpIGluc3RhbmNlb2YgTUNvcmVFeHByZXNzaW9uKSkgeworCQkJZXZhbHVhdGVkID0gdHJ1ZTsKKwkJCXZpc2libGUgPSBDb250cmlidXRpb25zQW5hbHl6ZXIuaXNWaXNpYmxlKAorCQkJCQkoTUNvcmVFeHByZXNzaW9uKSBlbGVtZW50LmdldFZpc2libGVXaGVuKCksIGV2YWxDb250ZXh0KTsKKwkJfQorCQlpZiAoZXZhbHVhdGVkICYmIHZpc2libGUgIT0gY3VycmVudCkgeworCQkJZWxlbWVudC5zZXRWaXNpYmxlKHZpc2libGUpOworCQkJbWVudU1hbmFnZXIubWFya0RpcnR5KCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbGVhbiBkeW5hbWljIG1lbnUgY29udHJpYnV0aW9ucyBwcm92aWRlZCBieQorCSAqIHtAbGluayBNRHluYW1pY01lbnVDb250cmlidXRpb259IGFwcGxpY2F0aW9uIG1vZGVsIGVsZW1lbnRzCisJICoKKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIKKwkgKiBAcGFyYW0gbWVudU1vZGVsCisJICogQHBhcmFtIGR1bXAKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVEeW5hbWljTWVudUNvbnRyaWJ1dGlvbnMoTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCisJCQlNTWVudSBtZW51TW9kZWwsIEFycmF5TGlzdDxNTWVudUVsZW1lbnQ+IGR1bXApIHsKKwkJcmVtb3ZlTWVudUNvbnRyaWJ1dGlvbnMobWVudU1vZGVsLCBkdW1wKTsKKwkJZm9yIChNTWVudUVsZW1lbnQgbU1lbnVFbGVtZW50IDogZHVtcCkgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKG1NZW51RWxlbWVudCk7CisJCQlpZiAoaWNpID09IG51bGwgJiYgbU1lbnVFbGVtZW50IGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCQlNTWVudSBtZW51RWxlbWVudCA9IChNTWVudSkgbU1lbnVFbGVtZW50OworCQkJCWljaSA9IGdldE1hbmFnZXIobWVudUVsZW1lbnQpOworCQkJCWNsZWFyTW9kZWxUb01hbmFnZXIobWVudUVsZW1lbnQsIChNZW51TWFuYWdlcikgaWNpKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xlYXJNb2RlbFRvQ29udHJpYnV0aW9uKG1lbnVNb2RlbCwgaWNpKTsKKwkJCX0KKwkJCW1lbnVNYW5hZ2VyLnJlbW92ZShpY2kpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVubGlua01lbnUoTU1lbnUgbWVudSkgeworCisJCUxpc3Q8TU1lbnVFbGVtZW50PiBjaGlsZHJlbiA9IG1lbnUuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChNTWVudUVsZW1lbnQgY2hpbGQgOiBjaGlsZHJlbikgeworCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTU1lbnUpCisJCQkJdW5saW5rTWVudSgoTU1lbnUpIGNoaWxkKTsKKwkJCWVsc2UgeworCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbiA9IGdldENvbnRyaWJ1dGlvbihjaGlsZCk7CisJCQkJY2xlYXJNb2RlbFRvQ29udHJpYnV0aW9uKGNoaWxkLCBjb250cmlidXRpb24pOworCQkJfQorCQl9CisJCU1lbnVNYW5hZ2VyIG1tID0gZ2V0TWFuYWdlcihtZW51KTsKKwkJY2xlYXJNb2RlbFRvTWFuYWdlcihtZW51LCBtbSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNjaGVkdWxlTWFuYWdlclVwZGF0ZShJQ29udHJpYnV0aW9uTWFuYWdlciBtZ3IpIHsKKwkJLy8gQnVnIDQ2NzAwMDogQXZvaWQgcmVwZWF0ZWRseSB1cGRhdGluZyBtZW51IG1hbmFnZXJzCisJCS8vIFRoaXMgd29ya2Fyb3VuZCBpcyBvcHQtaW4gZm9yIDQuNQorCQlib29sZWFuIHdvcmthcm91bmRFbmFibGVkID0gQm9vbGVhbi5nZXRCb29sZWFuKCJlY2xpcHNlLndvcmthcm91bmQuYnVnNDY3MDAwIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKCF3b3JrYXJvdW5kRW5hYmxlZCkgeworCQkJbWdyLnVwZGF0ZShmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3luY2hyb25pemVkIChtZ3JUb1VwZGF0ZSkgeworCQkJaWYgKHRoaXMubWdyVG9VcGRhdGUuaXNFbXB0eSgpKSB7CisJCQkJRGlzcGxheSBkaXNwbGF5ID0gY29udGV4dC5nZXQoRGlzcGxheS5jbGFzcyk7CisJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJZGlzcGxheS50aW1lckV4ZWMoMTAwLCBuZXcgUnVubmFibGUoKSB7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCUNvbGxlY3Rpb248SUNvbnRyaWJ1dGlvbk1hbmFnZXI+IHRvVXBkYXRlID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCQkJCQkJCXN5bmNocm9uaXplZCAobWdyVG9VcGRhdGUpIHsKKwkJCQkJCQkJdG9VcGRhdGUuYWRkQWxsKG1nclRvVXBkYXRlKTsKKwkJCQkJCQkJbWdyVG9VcGRhdGUuY2xlYXIoKTsKKwkJCQkJCQl9CisJCQkJCQkJZm9yIChJQ29udHJpYnV0aW9uTWFuYWdlciBtZ3IgOiB0b1VwZGF0ZSkgeworCQkJCQkJCQltZ3IudXBkYXRlKGZhbHNlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCQl0aGlzLm1nclRvVXBkYXRlLmFkZChtZ3IpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTWVudU1hbmFnZXJSZW5kZXJlckZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTWVudU1hbmFnZXJSZW5kZXJlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTRhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZW51TWFuYWdlclJlbmRlcmVyRmlsdGVyLmphdmEKQEAgLTAsMCArMSwzMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25JbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRUhhbmRsZXJTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRXhwcmVzc2lvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkVjbGlwc2VDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkNhbkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5jb250cmlidXRpb25zLklDb250cmlidXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQWJzdHJhY3RQYXJ0UmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5NZW51U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LlBvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LldvcmtiZW5jaFNXVEFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTURpcmVjdE1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTUhhbmRsZWRNZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVBvcHVwTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworcHVibGljIGNsYXNzIE1lbnVNYW5hZ2VyUmVuZGVyZXJGaWx0ZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7CisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNTVJGX1NUQVRJQ19DT05URVhUID0gIkhDSS1zdGF0aWNDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMX01FTlVfSVRFTSA9ICIoTm9uZSBBcHBsaWNhYmxlKSI7IC8vJE5PTi1OTFMtMSQKKworCXN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QX09SSUdJTkFMX0NPTlRFWFQgPSAiTWVudVNlcnZpY2VGaWx0ZXIub3JpZ2luYWwuY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIG1zZywgV2lkZ2V0IG1lbnUsIE1NZW51IG1lbnVNb2RlbCkgeworCQlXb3JrYmVuY2hTV1RBY3RpdmF0b3IudHJhY2UoUG9saWN5Lk1FTlVTLCBtc2cgKyAiOiAiICsgbWVudSArICI6ICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyBtZW51TW9kZWwsIG51bGwpOworCX0KKworCUBJbmplY3QKKwlwcml2YXRlIExvZ2dlciBsb2dnZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlwcml2YXRlIE1lbnVNYW5hZ2VyUmVuZGVyZXIgcmVuZGVyZXI7CisKKwlwcml2YXRlIEhhc2hNYXA8TWVudSwgUnVubmFibGU+IHBlbmRpbmdDbGVhbnVwID0gbmV3IEhhc2hNYXA8TWVudSwgUnVubmFibGU+KCk7CisKKwlwcml2YXRlIGNsYXNzIFNhZmVXcmFwcGVyIGltcGxlbWVudHMgSVNhZmVSdW5uYWJsZSB7CisJCUV2ZW50IGV2ZW50OworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKKwkJCWlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHsKKwkJCQkvLyBlcnJvcnMgYXJlIGRlYWRseSwgd2Ugc2hvdWxkbid0IGlnbm9yZSB0aGVzZQorCQkJCXRocm93IChFcnJvcikgZTsKKwkJCX0KKwkJCS8vIGxvZyBleGNlcHRpb25zIG90aGVyd2lzZQorCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7CisJCQkJbG9nZ2VyLmVycm9yKGUpOworCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJc2FmZUhhbmRsZUV2ZW50KGV2ZW50KTsKKwkJfQorCX0KKworCXByaXZhdGUgU2FmZVdyYXBwZXIgc2FmZVdyYXBwZXIgPSBuZXcgU2FmZVdyYXBwZXIoKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGV2ZW50KSB7CisJCS8vIHdyYXAgdGhlIGhhbmRsaW5nIGluIGEgU2FmZVJ1bm5lciBzbyB0aGF0IGV4Y2VwdGlvbnMgZG8gbm90IHByZXZlbnQKKwkJLy8gdGhlIG1lbnUgZnJvbSBiZWluZyBzaG93bgorCQlzYWZlV3JhcHBlci5ldmVudCA9IGV2ZW50OworCQlTYWZlUnVubmVyLnJ1bihzYWZlV3JhcHBlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNhZmVIYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQlpZiAoIShldmVudC53aWRnZXQgaW5zdGFuY2VvZiBNZW51KSkgeworCQkJcmV0dXJuOworCQl9CisJCWZpbmFsIE1lbnUgbWVudSA9IChNZW51KSBldmVudC53aWRnZXQ7CisJCWlmICgobWVudS5nZXRTdHlsZSgpICYgU1dULkJBUikgIT0gMCkgeworCQkJLy8gZG9uJ3QgcHJvY2VzcyB0aGUgbWVudSBiYXIsIGl0J3Mgbm90IGZhaXIgOi0pCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRpc3Bvc2UpIHsKKwkJCXRyYWNlKCJoYW5kbGVNZW51LkRpc3Bvc2UiLCBtZW51LCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJY2xlYW5VcChtZW51LCBudWxsLCBudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGZpbGwgaW4gYWxsIG9mIHRoZSBwaWVjZXMKKwkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBudWxsOworCQlPYmplY3Qgb2JqID0gbWVudS5nZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSk7CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJT2JqZWN0IHRtcCA9IG1lbnUKKwkJCQkJLmdldERhdGEoIm9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlci5tYW5hZ2VyS2V5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh0bXAgaW5zdGFuY2VvZiBNZW51TWFuYWdlcikgeworCQkJCU1lbnVNYW5hZ2VyIHRtcE1hbmFnZXIgPSAoTWVudU1hbmFnZXIpIHRtcDsKKwkJCQltZW51TWFuYWdlciA9IHRtcE1hbmFnZXI7CisJCQkJb2JqID0gcmVuZGVyZXIuZ2V0TWVudU1vZGVsKHRtcE1hbmFnZXIpOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNUG9wdXBNZW51KSB7CisJCQkJCU1Qb3B1cE1lbnUgcG9wdXBNZW51ID0gKE1Qb3B1cE1lbnUpIG9iajsKKwkJCQkJaWYgKHBvcHVwTWVudS5nZXRXaWRnZXQoKSA9PSBudWxsCisJCQkJCQkJJiYgbWVudU1hbmFnZXIuZ2V0TWVudSgpICE9IG51bGwpIHsKKwkJCQkJCWZpbmFsIE1VSUVsZW1lbnQgY29udGFpbmVyID0gbW9kZWxTZXJ2aWNlCisJCQkJCQkJCS5nZXRDb250YWluZXIocG9wdXBNZW51KTsKKwkJCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQkJCU1lbnVTZXJ2aWNlLnJlZ2lzdGVyTWVudShtZW51TWFuYWdlci5nZXRNZW51KCkKKwkJCQkJCQkJCS5nZXRQYXJlbnQoKSwgcG9wdXBNZW51LAorCQkJCQkJCQkJKChNUGFydCkgY29udGFpbmVyKS5nZXRDb250ZXh0KCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZm8KKwkgKiBAcGFyYW0gbWVudU1vZGVsCisJICogQHBhcmFtIHJlbmRlcmVyCisJICogQHBhcmFtIGV2YWxDb250ZXh0CisJICogQHBhcmFtIHJlY3Vyc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdEluZm8oRXhwcmVzc2lvbkluZm8gaW5mbywgZmluYWwgTU1lbnUgbWVudU1vZGVsLAorCQkJZmluYWwgTWVudU1hbmFnZXJSZW5kZXJlciByZW5kZXJlciwKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBldmFsQ29udGV4dCwgYm9vbGVhbiByZWN1cnNlKSB7CisJCUhhc2hTZXQ8Q29udHJpYnV0aW9uUmVjb3JkPiByZWNvcmRzID0gbmV3IEhhc2hTZXQ8Q29udHJpYnV0aW9uUmVjb3JkPigpOworCQlmb3IgKE1NZW51RWxlbWVudCBlbGVtZW50IDogbWVudU1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCUNvbnRyaWJ1dGlvblJlY29yZCByZWNvcmQgPSByZW5kZXJlci5nZXRDb250cmlidXRpb25SZWNvcmQoZWxlbWVudCk7CisJCQlpZiAocmVjb3JkICE9IG51bGwpIHsKKwkJCQlpZiAocmVjb3Jkcy5hZGQocmVjb3JkKSkgeworCQkJCQlyZWNvcmQuY29sbGVjdEluZm8oaW5mbyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlDb250cmlidXRpb25zQW5hbHl6ZXIuY29sbGVjdEluZm8oaW5mbywKKwkJCQkJCWVsZW1lbnQuZ2V0VmlzaWJsZVdoZW4oKSk7CisJCQl9CisJCQlpZiAocmVjdXJzZSAmJiBlbGVtZW50IGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCQlNTWVudSBjaGlsZE1lbnUgPSAoTU1lbnUpIGVsZW1lbnQ7CisJCQkJY29sbGVjdEluZm8oaW5mbywgY2hpbGRNZW51LCByZW5kZXJlciwgZXZhbENvbnRleHQsIGZhbHNlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBtZW51TW9kZWwKKwkgKiBAcGFyYW0gcmVuZGVyZXIKKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIKKwkgKiBAcGFyYW0gZXZhbENvbnRleHQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlRWxlbWVudFZpc2liaWxpdHkoZmluYWwgTU1lbnUgbWVudU1vZGVsLAorCQkJTWVudU1hbmFnZXJSZW5kZXJlciByZW5kZXJlciwgTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCisJCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgZXZhbENvbnRleHQsIGZpbmFsIGludCByZWN1cnNlTGV2ZWwsCisJCQlib29sZWFuIHVwZGF0ZUVuYWJsZW1lbnQpIHsKKwkJZmluYWwgRXhwcmVzc2lvbkNvbnRleHQgZXhwckNvbnRleHQgPSBuZXcgRXhwcmVzc2lvbkNvbnRleHQoZXZhbENvbnRleHQpOworCQlIYXNoU2V0PENvbnRyaWJ1dGlvblJlY29yZD4gcmVjb3JkcyA9IG5ldyBIYXNoU2V0PENvbnRyaWJ1dGlvblJlY29yZD4oKTsKKwkJZm9yIChNTWVudUVsZW1lbnQgZWxlbWVudCA6IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpKSB7CisJCQlDb250cmlidXRpb25SZWNvcmQgcmVjb3JkID0gcmVuZGVyZXIuZ2V0Q29udHJpYnV0aW9uUmVjb3JkKGVsZW1lbnQpOworCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7CisJCQkJaWYgKHJlY29yZHMuYWRkKHJlY29yZCkpIHsKKwkJCQkJcmVjb3JkLnVwZGF0ZVZpc2liaWxpdHkoZXZhbENvbnRleHQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJTWVudU1hbmFnZXJSZW5kZXJlci51cGRhdGVWaXNpYmlsaXR5KG1lbnVNYW5hZ2VyLCBlbGVtZW50LAorCQkJCQkJZXhwckNvbnRleHQpOworCQkJfQorCQkJaWYgKHJlY3Vyc2VMZXZlbCA+IDAgJiYgZWxlbWVudC5pc1Zpc2libGUoKQorCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCQlNTWVudSBjaGlsZE1lbnUgPSAoTU1lbnUpIGVsZW1lbnQ7CisJCQkJTWVudU1hbmFnZXIgY2hpbGRNYW5hZ2VyID0gcmVuZGVyZXIuZ2V0TWFuYWdlcihjaGlsZE1lbnUpOworCQkJCWlmIChjaGlsZE1hbmFnZXIgIT0gbnVsbCkgeworCQkJCQl1cGRhdGVFbGVtZW50VmlzaWJpbGl0eShjaGlsZE1lbnUsIHJlbmRlcmVyLCBjaGlsZE1hbmFnZXIsCisJCQkJCQkJZXZhbENvbnRleHQsIHJlY3Vyc2VMZXZlbCAtIDEsIGZhbHNlKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh1cGRhdGVFbmFibGVtZW50ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBNSGFuZGxlZE1lbnVJdGVtKSB7CisJCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgY21kID0gKChNSGFuZGxlZE1lbnVJdGVtKSBlbGVtZW50KQorCQkJCQkJLmdldFdiQ29tbWFuZCgpOworCQkJCUVIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmljZSA9IGV2YWxDb250ZXh0CisJCQkJCQkuZ2V0KEVIYW5kbGVyU2VydmljZS5jbGFzcyk7CisJCQkJaWYgKGNtZCAhPSBudWxsICYmIGhhbmRsZXJTZXJ2aWNlICE9IG51bGwpIHsKKwkJCQkJTUhhbmRsZWRNZW51SXRlbSBpdGVtID0gKE1IYW5kbGVkTWVudUl0ZW0pIGVsZW1lbnQ7CisJCQkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5CisJCQkJCQkJLmNyZWF0ZShNTVJGX1NUQVRJQ19DT05URVhUKTsKKwkJCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKGl0ZW0sCisJCQkJCQkJc3RhdGljQ29udGV4dCwgaXRlbS5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSk7CisJCQkJCXRyeSB7CisJCQkJCQkoKE1IYW5kbGVkTWVudUl0ZW0pIGVsZW1lbnQpLnNldEVuYWJsZWQoaGFuZGxlclNlcnZpY2UKKwkJCQkJCQkJLmNhbkV4ZWN1dGUoY21kLCBzdGF0aWNDb250ZXh0KSk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlzdGF0aWNDb250ZXh0LmRpc3Bvc2UoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAodXBkYXRlRW5hYmxlbWVudCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTURpcmVjdE1lbnVJdGVtKSB7CisJCQkJTURpcmVjdE1lbnVJdGVtIGNvbnRyaWIgPSAoTURpcmVjdE1lbnVJdGVtKSBlbGVtZW50OworCQkJCWlmIChjb250cmliLmdldE9iamVjdCgpID09IG51bGwpIHsKKwkJCQkJSUNvbnRyaWJ1dGlvbkZhY3RvcnkgaWNmID0gZXZhbENvbnRleHQKKwkJCQkJCQkuZ2V0KElDb250cmlidXRpb25GYWN0b3J5LmNsYXNzKTsKKworCQkJCQljb250cmliLnNldE9iamVjdChpY2YuY3JlYXRlKGNvbnRyaWIuZ2V0Q29udHJpYnV0aW9uVVJJKCksCisJCQkJCQkJZXZhbENvbnRleHQsIEVjbGlwc2VDb250ZXh0RmFjdG9yeS5jcmVhdGUoKSkpOworCQkJCX0KKwkJCQlpZiAoY29udHJpYi5nZXRPYmplY3QoKSA9PSBudWxsKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlNRGlyZWN0TWVudUl0ZW0gaXRlbSA9IChNRGlyZWN0TWVudUl0ZW0pIGVsZW1lbnQ7CisJCQkJSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkKKwkJCQkJCS5jcmVhdGUoTU1SRl9TVEFUSUNfQ09OVEVYVCk7CisJCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKGl0ZW0sCisJCQkJCQlzdGF0aWNDb250ZXh0LCBpdGVtLmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKTsKKwkJCQl0cnkgeworCQkJCQlPYmplY3QgcmMgPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoCisJCQkJCQkJY29udHJpYi5nZXRPYmplY3QoKSwgQ2FuRXhlY3V0ZS5jbGFzcywgZXZhbENvbnRleHQsCisJCQkJCQkJc3RhdGljQ29udGV4dCwgQm9vbGVhbi5UUlVFKTsKKwkJCQkJaWYgKHJjIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJCQkJY29udHJpYi5zZXRFbmFibGVkKChCb29sZWFuKSByYyk7CisJCQkJCX0KKwkJCQl9IGZpbmFsbHkgeworCQkJCQlzdGF0aWNDb250ZXh0LmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIHNldEVuYWJsZWQoTUhhbmRsZWRNZW51SXRlbSBpdGVtKSB7CisJCWlmICghaXRlbS5pc1RvQmVSZW5kZXJlZCgpIHx8ICFpdGVtLmlzVmlzaWJsZSgpCisJCQkJfHwgaXRlbS5nZXRXaWRnZXQoKSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJUGFyYW1ldGVyaXplZENvbW1hbmQgY21kID0gaXRlbS5nZXRXYkNvbW1hbmQoKTsKKwkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSByZW5kZXJlci5nZXRDb250ZXh0KGl0ZW0pOworCQlFSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IGxjbENvbnRleHQuZ2V0KEVIYW5kbGVyU2VydmljZS5jbGFzcyk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5CisJCQkJLmNyZWF0ZShNTVJGX1NUQVRJQ19DT05URVhUKTsKKwkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKGl0ZW0sIHN0YXRpY0NvbnRleHQsIGl0ZW0KKwkJCQkuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpOworCQl0cnkgeworCQkJaXRlbS5zZXRFbmFibGVkKHNlcnZpY2UuY2FuRXhlY3V0ZShjbWQsIHN0YXRpY0NvbnRleHQpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXN0YXRpY0NvbnRleHQuZGlzcG9zZSgpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgY2xlYW5VcChmaW5hbCBNZW51IG1lbnUsIE1NZW51IG1lbnVNb2RlbCwKKwkJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXRyYWNlKCJjbGVhblVwIiwgbWVudSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHBlbmRpbmdDbGVhbnVwLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisJCVJ1bm5hYmxlIGNsZWFuVXAgPSBwZW5kaW5nQ2xlYW51cC5yZW1vdmUobWVudSk7CisJCWlmIChjbGVhblVwICE9IG51bGwpIHsKKwkJCXRyYWNlKCJjbGVhblVwLnJ1bigpIiwgbWVudSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCWNsZWFuVXAucnVuKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlNZW51W10ga2V5cyA9IHBlbmRpbmdDbGVhbnVwLmtleVNldCgpLnRvQXJyYXkoCisJCQkJbmV3IE1lbnVbcGVuZGluZ0NsZWFudXAuc2l6ZSgpXSk7CisJCWZvciAoTWVudSBtZW51IDoga2V5cykgeworCQkJY2xlYW5VcChtZW51LCBudWxsLCBudWxsKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lbnVNYW5hZ2VyU2VydmljZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvTWVudU1hbmFnZXJTZXJ2aWNlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNjFhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lbnVNYW5hZ2VyU2VydmljZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BYnN0cmFjdFBhcnRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LlBvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LldvcmtiZW5jaFNXVEFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVBvcHVwTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworcHVibGljIGNsYXNzIE1lbnVNYW5hZ2VyU2VydmljZUZpbHRlciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKKwkvKioKKwkgKgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMX01FTlVfSVRFTSA9ICIoTm9uZSBBcHBsaWNhYmxlKSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUTVBfT1JJR0lOQUxfQ09OVEVYVCA9ICJNZW51U2VydmljZUZpbHRlci5vcmlnaW5hbC5jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgbXNnLCBXaWRnZXQgbWVudSwgTU1lbnUgbWVudU1vZGVsKSB7CisJCVdvcmtiZW5jaFNXVEFjdGl2YXRvci50cmFjZShQb2xpY3kuTUVOVVMsIG1zZyArICI6ICIgKyBtZW51ICsgIjogIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrIG1lbnVNb2RlbCwgbnVsbCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGFib3V0VG9TaG93OworCisJcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0QWJvdXRUb1Nob3coKSB7CisJCWlmIChhYm91dFRvU2hvdyA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCWFib3V0VG9TaG93ID0gTWVudU1hbmFnZXIuY2xhc3MKKwkJCQkJCS5nZXREZWNsYXJlZE1ldGhvZCgiaGFuZGxlQWJvdXRUb1Nob3ciKTsgLy8kTk9OLU5MUy0xJAorCQkJCWFib3V0VG9TaG93LnNldEFjY2Vzc2libGUodHJ1ZSk7CisJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCXJldHVybiBhYm91dFRvU2hvdzsKKwl9CisKKwlASW5qZWN0CisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOworCisJQEluamVjdAorCUVNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgRXZlbnQgZXZlbnQpIHsKKwkJLy8gd3JhcCB0aGUgaGFuZGxpbmcgaW4gYSBTYWZlUnVubmVyIHNvIHRoYXQgZXhjZXB0aW9ucyBkbyBub3QgcHJldmVudAorCQkvLyB0aGUgbWVudSBmcm9tIGJlaW5nIHNob3duCisJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKKwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7CisJCQkJCS8vIGVycm9ycyBhcmUgZGVhZGx5LCB3ZSBzaG91bGRuJ3QgaWdub3JlIHRoZXNlCisJCQkJCXRocm93IChFcnJvcikgZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBsb2cgZXhjZXB0aW9ucyBvdGhlcndpc2UKKwkJCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7CisJCQkJCQlsb2dnZXIuZXJyb3IoZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJc2FmZUhhbmRsZUV2ZW50KGV2ZW50KTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNhZmVIYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQlpZiAoIShldmVudC53aWRnZXQgaW5zdGFuY2VvZiBNZW51KSkgeworCQkJcmV0dXJuOworCQl9CisJCWZpbmFsIE1lbnUgbWVudSA9IChNZW51KSBldmVudC53aWRnZXQ7CisJCWlmIChldmVudC50eXBlID09IFNXVC5EaXNwb3NlKSB7CisJCQl0cmFjZSgiaGFuZGxlTWVudS5EaXNwb3NlIiwgbWVudSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCWNsZWFuVXAobWVudSk7CisJCX0KKwkJT2JqZWN0IG9iaiA9IG1lbnUuZ2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUpOworCQlpZiAob2JqID09IG51bGwgJiYgbWVudS5nZXRQYXJlbnRJdGVtKCkgIT0gbnVsbCkgeworCQkJb2JqID0gbWVudS5nZXRQYXJlbnRJdGVtKCkuZ2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUpOworCQl9CisJCWlmIChvYmogaW5zdGFuY2VvZiBNUG9wdXBNZW51KSB7CisJCQloYW5kbGVDb250ZXh0TWVudShldmVudCwgbWVudSwgKE1Qb3B1cE1lbnUpIG9iaik7CisJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCWhhbmRsZU1lbnUoZXZlbnQsIG1lbnUsIChNTWVudSkgb2JqKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVNZW51KGZpbmFsIEV2ZW50IGV2ZW50LCBmaW5hbCBNZW51IG1lbnUsCisJCQlmaW5hbCBNTWVudSBtZW51TW9kZWwpIHsKKwkJaWYgKChtZW51LmdldFN0eWxlKCkgJiBTV1QuQkFSKSAhPSAwKSB7CisJCQkvLyBkb24ndCBwcm9jZXNzIHRoZSBtZW51IGJhciwgaXQncyBub3QgZmFpciA6LSkKKwkJCXJldHVybjsKKwkJfQorCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwkJY2FzZSBTV1QuU2hvdzoKKwkJCWNsZWFuVXAobWVudSk7CisJCQlzaG93TWVudShldmVudCwgbWVudSwgbWVudU1vZGVsKTsKKwkJCWJyZWFrOworCQljYXNlIFNXVC5IaWRlOgorCQkJLy8gVE9ETyB3ZSdsbCBjbGVhbiB1cCBvbiBzaG93CisJCQlicmVhazsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNob3dNZW51KGZpbmFsIEV2ZW50IGV2ZW50LCBmaW5hbCBNZW51IG1lbnUsCisJCQlmaW5hbCBNTWVudSBtZW51TW9kZWwpIHsKKwkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJzaG93TWVudTogIiArIG1lbnVNb2RlbCArICJcblx0IiArIG1lbnUpOworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVDb250ZXh0TWVudShmaW5hbCBFdmVudCBldmVudCwgZmluYWwgTWVudSBtZW51LAorCQkJZmluYWwgTVBvcHVwTWVudSBtZW51TW9kZWwpIHsKKwkJc3dpdGNoIChldmVudC50eXBlKSB7CisJCWNhc2UgU1dULlNob3c6CisJCQljbGVhblVwKG1lbnUpOworCQkJc2hvd1BvcHVwKGV2ZW50LCBtZW51LCBtZW51TW9kZWwpOworCQkJYnJlYWs7CisJCWNhc2UgU1dULkhpZGU6CisJCQloaWRlUG9wdXAoZXZlbnQsIG1lbnUsIG1lbnVNb2RlbCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGhpZGVQb3B1cChFdmVudCBldmVudCwgTWVudSBtZW51LCBNUG9wdXBNZW51IG1lbnVNb2RlbCkgeworCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oImhpZGVQb3B1cDogIiArIG1lbnVNb2RlbCArICJcblx0IiArIG1lbnUpOworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgcG9wdXBDb250ZXh0ID0gbWVudU1vZGVsLmdldENvbnRleHQoKTsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IG9yaWdpbmFsQ2hpbGQgPSAoSUVjbGlwc2VDb250ZXh0KSBwb3B1cENvbnRleHQKKwkJCQkuZ2V0KFRNUF9PUklHSU5BTF9DT05URVhUKTsKKwkJcG9wdXBDb250ZXh0LnJlbW92ZShUTVBfT1JJR0lOQUxfQ09OVEVYVCk7CisJCWlmICghbWVudS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCW1lbnUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlpZiAob3JpZ2luYWxDaGlsZCA9PSBudWxsKSB7CisJCQkJCQlwb3B1cENvbnRleHQuZGVhY3RpdmF0ZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJb3JpZ2luYWxDaGlsZC5hY3RpdmF0ZSgpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzaG93UG9wdXAoZmluYWwgRXZlbnQgZXZlbnQsIGZpbmFsIE1lbnUgbWVudSwKKwkJCWZpbmFsIE1Qb3B1cE1lbnUgbWVudU1vZGVsKSB7CisJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigic2hvd1BvcHVwOiAiICsgbWVudU1vZGVsICsgIlxuXHQiICsgbWVudSk7CisJCS8vIHdlIG5lZWQgc29tZSBjb250ZXh0IGZvb2xlcnkgaGVyZQorCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgcG9wdXBDb250ZXh0ID0gbWVudU1vZGVsLmdldENvbnRleHQoKTsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQgPSBwb3B1cENvbnRleHQuZ2V0UGFyZW50KCk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBvcmlnaW5hbENoaWxkID0gcGFyZW50Q29udGV4dC5nZXRBY3RpdmVDaGlsZCgpOworCQlwb3B1cENvbnRleHQuYWN0aXZhdGUoKTsKKwkJcG9wdXBDb250ZXh0LnNldChUTVBfT1JJR0lOQUxfQ09OVEVYVCwgb3JpZ2luYWxDaGlsZCk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGVhblVwKGZpbmFsIE1lbnUgbWVudSkgeworCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oImNsZWFuVXA6ICIgKyBtZW51KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oImRpc3Bvc2UiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZW51TWFuYWdlclNob3dQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lbnVNYW5hZ2VyU2hvd1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWQ5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZW51TWFuYWdlclNob3dQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1hcmNvIERlc2NoZXIgPG1hcmNvQGRlc2NoZXIuYXQ+IC0gQnVnIDM4OTA2MywzOTg4NjUsMzk4ODY2LDQwMzA4MSw0MDMwODMKKyAqICAgICBCcnVjZSBTa2luZ2xlIDxCcnVjZS5Ta2luZ2xlQGltbXV0aWZ5LmNvbT4gLSBCdWcgNDQyNTcwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkVjbGlwc2VDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuQWJvdXRUb1Nob3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BYnN0cmFjdFBhcnRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LlBvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LldvcmtiZW5jaFNXVEFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVBvcHVwTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmZhY3Rvcmllcy5JUmVuZGVyZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworLyoqCisgKiA8Y29kZT5NZW51TWFuYWdlclNob3dQcm9jZXNzb3I8L2NvZGU+IHByb3ZpZGVzIGhvb2tzIGZvciByZW5kZXJlciBwcm9jZXNzaW5nCisgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSA8Y29kZT5NZW51TWFuYWdlcjwvY29kZT4gY2FsbHMgb3V0IHRvIGl0cworICogPGNvZGU+SU1lbnVNYW5hZ2VyTGlzdGVuZXIyPC9jb2RlPiBmb3IgdGhlIDxjb2RlPm1lbnVBYm91dFRvU2hvdzwvY29kZT4KKyAqIGV2ZW50cy4KKyAqLworcHVibGljIGNsYXNzIE1lbnVNYW5hZ2VyU2hvd1Byb2Nlc3NvciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIyIHsKKworCS8qKgorCSAqCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBtc2csIFdpZGdldCBtZW51LCBNTWVudSBtZW51TW9kZWwpIHsKKwkJV29ya2JlbmNoU1dUQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5NRU5VUywgbXNnICsgIjogIiArIG1lbnUgKyAiOiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgbWVudU1vZGVsLCBudWxsKTsKKwl9CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlwcml2YXRlIElSZW5kZXJlckZhY3RvcnkgcmVuZGVyZXJGYWN0b3J5OworCisJQEluamVjdAorCXByaXZhdGUgTWVudU1hbmFnZXJSZW5kZXJlciByZW5kZXJlcjsKKworCUBJbmplY3QKKwlwcml2YXRlIElDb250cmlidXRpb25GYWN0b3J5IGNvbnRyaWJ1dGlvbkZhY3Rvcnk7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOworCisJcHJpdmF0ZSBIYXNoTWFwPE1lbnUsIFJ1bm5hYmxlPiBwZW5kaW5nQ2xlYW51cCA9IG5ldyBIYXNoTWFwPE1lbnUsIFJ1bm5hYmxlPigpOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCWlmICghKG1hbmFnZXIgaW5zdGFuY2VvZiBNZW51TWFuYWdlcikpIHsKKwkJCXJldHVybjsKKwkJfQorCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IChNZW51TWFuYWdlcikgbWFuYWdlcjsKKwkJZmluYWwgTU1lbnUgbWVudU1vZGVsID0gcmVuZGVyZXIuZ2V0TWVudU1vZGVsKG1lbnVNYW5hZ2VyKTsKKwkJZmluYWwgTWVudSBtZW51ID0gbWVudU1hbmFnZXIuZ2V0TWVudSgpOworCisJCWlmIChtZW51TW9kZWwgIT0gbnVsbCAmJiBtZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQljbGVhblVwKG1lbnUsIG1lbnVNb2RlbCwgbWVudU1hbmFnZXIpOworCQl9CisJCWlmIChtZW51TW9kZWwgaW5zdGFuY2VvZiBNUG9wdXBNZW51KSB7CisJCQlzaG93UG9wdXAobWVudSwgKE1Qb3B1cE1lbnUpIG1lbnVNb2RlbCwgbWVudU1hbmFnZXIpOworCQl9CisJCUFic3RyYWN0UGFydFJlbmRlcmVyIG9iaiA9IHJlbmRlcmVyRmFjdG9yeS5nZXRSZW5kZXJlcihtZW51TW9kZWwsCisJCQkJbWVudS5nZXRQYXJlbnQoKSk7CisJCWlmICghKG9iaiBpbnN0YW5jZW9mIE1lbnVNYW5hZ2VyUmVuZGVyZXIpKSB7CisJCQl0cmFjZSgiTm90IHRoZSBjb3JyZWN0IHJlbmRlcmVyOiAiICsgb2JqLCBtZW51LCBtZW51TW9kZWwpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwkJTWVudU1hbmFnZXJSZW5kZXJlciByZW5kZXJlciA9IChNZW51TWFuYWdlclJlbmRlcmVyKSBvYmo7CisJCWlmIChtZW51TW9kZWwuZ2V0V2lkZ2V0KCkgPT0gbnVsbCkgeworCQkJcmVuZGVyZXIuYmluZFdpZGdldChtZW51TW9kZWwsIG1lbnVNYW5hZ2VyLmdldE1lbnUoKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb0hpZGUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJaWYgKCEobWFuYWdlciBpbnN0YW5jZW9mIE1lbnVNYW5hZ2VyKSkgeworCQkJcmV0dXJuOworCQl9CisJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gKE1lbnVNYW5hZ2VyKSBtYW5hZ2VyOworCQlmaW5hbCBNTWVudSBtZW51TW9kZWwgPSByZW5kZXJlci5nZXRNZW51TW9kZWwobWVudU1hbmFnZXIpOworCQlmaW5hbCBNZW51IG1lbnUgPSBtZW51TWFuYWdlci5nZXRNZW51KCk7CisJCWlmIChtZW51TW9kZWwgIT0gbnVsbCkgeworCQkJcHJvY2Vzc0R5bmFtaWNFbGVtZW50cyhtZW51TW9kZWwsIG1lbnVNYW5hZ2VyKTsKKwkJCXNob3dNZW51KG1lbnUsIG1lbnVNb2RlbCwgbWVudU1hbmFnZXIpOworCQl9CisJfQorCisJLyoqCisJICogSGFzaE1hcCBrZXkgZm9yIHN0b3JhZ2Ugb2Yge0BsaW5rIE1EeW5hbWljTWVudUNvbnRyaWJ1dGlvbn0gZWxlbWVudHMgdXNlZAorCSAqIGluIHtAbGluayAjcHJvY2Vzc0R5bmFtaWNFbGVtZW50cyhNTWVudSwgTWVudU1hbmFnZXIpfQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfRUxFTUVOVF9TVE9SQUdFX0tFWSA9IE1lbnVNYW5hZ2VyU2hvd1Byb2Nlc3Nvci5jbGFzcworCQkJLmdldFNpbXBsZU5hbWUoKSArICIuZHluYW1pY0VsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUHJvY2VzcyBkeW5hbWljIG1lbnUgY29udHJpYnV0aW9ucyBwcm92aWRlZCBieQorCSAqIHtAbGluayBNRHluYW1pY01lbnVDb250cmlidXRpb259IGFwcGxpY2F0aW9uIG1vZGVsIGVsZW1lbnRzCisJICoKKwkgKiBAcGFyYW0gbWVudU1vZGVsCisJICogQHBhcmFtIG1lbnVNYW5hZ2VyCisJICoKKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0R5bmFtaWNFbGVtZW50cyhNTWVudSBtZW51TW9kZWwsIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCU1NZW51RWxlbWVudFtdIG1sID0gbWVudU1vZGVsLmdldENoaWxkcmVuKCkudG9BcnJheSgKKwkJCQluZXcgTU1lbnVFbGVtZW50W21lbnVNb2RlbC5nZXRDaGlsZHJlbigpLnNpemUoKV0pOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1sLmxlbmd0aDsgaSsrKSB7CisKKwkJCU1NZW51RWxlbWVudCBjdXJyZW50TWVudUVsZW1lbnQgPSBtbFtpXTsKKwkJCWlmIChjdXJyZW50TWVudUVsZW1lbnQgaW5zdGFuY2VvZiBNRHluYW1pY01lbnVDb250cmlidXRpb24pIHsKKwkJCQlPYmplY3QgY29udHJpYnV0aW9uID0gKChNRHluYW1pY01lbnVDb250cmlidXRpb24pIGN1cnJlbnRNZW51RWxlbWVudCkKKwkJCQkJCS5nZXRPYmplY3QoKTsKKwkJCQlpZiAoY29udHJpYnV0aW9uID09IG51bGwpIHsKKwkJCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBtb2RlbFNlcnZpY2UKKwkJCQkJCQkuZ2V0Q29udGFpbmluZ0NvbnRleHQobWVudU1vZGVsKTsKKwkJCQkJY29udHJpYnV0aW9uID0gY29udHJpYnV0aW9uRmFjdG9yeS5jcmVhdGUoCisJCQkJCQkJKChNRHluYW1pY01lbnVDb250cmlidXRpb24pIGN1cnJlbnRNZW51RWxlbWVudCkKKwkJCQkJCQkJCS5nZXRDb250cmlidXRpb25VUkkoKSwgY29udGV4dCk7CisJCQkJCSgoTUR5bmFtaWNNZW51Q29udHJpYnV0aW9uKSBjdXJyZW50TWVudUVsZW1lbnQpCisJCQkJCQkJLnNldE9iamVjdChjb250cmlidXRpb24pOworCQkJCX0KKworCQkJCUlFY2xpcHNlQ29udGV4dCBkeW5hbWljTWVudUNvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkKKwkJCQkJCS5jcmVhdGUoKTsKKwkJCQlBcnJheUxpc3Q8TU1lbnVFbGVtZW50PiBtZWwgPSBuZXcgQXJyYXlMaXN0PE1NZW51RWxlbWVudD4oKTsKKwkJCQlkeW5hbWljTWVudUNvbnRleHQuc2V0KExpc3QuY2xhc3MsIG1lbCk7CisJCQkJSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQgPSBtb2RlbFNlcnZpY2UKKwkJCQkJCS5nZXRDb250YWluaW5nQ29udGV4dChjdXJyZW50TWVudUVsZW1lbnQpOworCQkJCU9iamVjdCByYyA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShjb250cmlidXRpb24sCisJCQkJCQlBYm91dFRvU2hvdy5jbGFzcywgcGFyZW50Q29udGV4dCwgZHluYW1pY01lbnVDb250ZXh0LAorCQkJCQkJdGhpcyk7CisJCQkJZHluYW1pY01lbnVDb250ZXh0LmRpc3Bvc2UoKTsKKwkJCQlpZiAocmMgPT0gdGhpcykgeworCQkJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKKwkJCQkJCWxvZ2dlci5lcnJvcigiTWlzc2luZyBAQWJvdXRUb1Nob3cgbWV0aG9kIGluICIgKyBjb250cmlidXRpb24pOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKG1lbC5zaXplKCkgPiAwKSB7CisKKwkJCQkJaW50IHBvc2l0aW9uID0gMDsKKwkJCQkJd2hpbGUgKHBvc2l0aW9uIDwgbWVudU1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpKSB7CisJCQkJCQlpZiAoY3VycmVudE1lbnVFbGVtZW50ID09IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpLmdldCgKKwkJCQkJCQkJcG9zaXRpb24pKSB7CisJCQkJCQkJcG9zaXRpb24rKzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXBvc2l0aW9uKys7CisJCQkJCX0KKworCQkJCQkvLyBlbnN1cmUgdGhhdCBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgaGFzIGEgdmFsaWQgZWxlbWVudAorCQkJCQkvLyBpZAorCQkJCQkvLyBhbmQgc2V0IHRoZSBwYXJlbnQgb2YgdGhlIGVudHJpZXMKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZWwuc2l6ZSgpOyBqKyspIHsKKwkJCQkJCU1NZW51RWxlbWVudCBtZW51RWxlbWVudCA9IG1lbC5nZXQoaik7CisJCQkJCQlpZiAobWVudUVsZW1lbnQuZ2V0RWxlbWVudElkKCkgPT0gbnVsbAorCQkJCQkJCQl8fCBtZW51RWxlbWVudC5nZXRFbGVtZW50SWQoKS5sZW5ndGgoKSA8IDEpIHsKKwkJCQkJCQltZW51RWxlbWVudC5zZXRFbGVtZW50SWQoY3VycmVudE1lbnVFbGVtZW50CisJCQkJCQkJCQkuZ2V0RWxlbWVudElkKCkgKyAiLiIgKyBqKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJbWVudU1vZGVsLmdldENoaWxkcmVuKCkuYWRkKHBvc2l0aW9uKyssIG1lbnVFbGVtZW50KTsKKwkJCQkJCXJlbmRlcmVyLm1vZGVsUHJvY2Vzc1N3aXRjaChtZW51TWFuYWdlciwgbWVudUVsZW1lbnQpOworCQkJCQl9CisJCQkJCWN1cnJlbnRNZW51RWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCkucHV0KERZTkFNSUNfRUxFTUVOVF9TVE9SQUdFX0tFWSwgbWVsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2xlYW5VcChmaW5hbCBNZW51IG1lbnUsIE1NZW51IG1lbnVNb2RlbCwKKwkJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXRyYWNlKCJjbGVhblVwIiwgbWVudSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHBlbmRpbmdDbGVhbnVwLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisJCVJ1bm5hYmxlIGNsZWFuVXAgPSBwZW5kaW5nQ2xlYW51cC5yZW1vdmUobWVudSk7CisJCWlmIChjbGVhblVwICE9IG51bGwpIHsKKwkJCXRyYWNlKCJjbGVhblVwLnJ1bigpIiwgbWVudSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCWNsZWFuVXAucnVuKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2hvd1BvcHVwKGZpbmFsIE1lbnUgbWVudSwgZmluYWwgTVBvcHVwTWVudSBtZW51TW9kZWwsCisJCQlNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oInNob3dQb3B1cDogIiArIG1lbnVNb2RlbCArICJcblx0IiArIG1lbnUpOworCQkvLyB3ZSBuZWVkIHNvbWUgY29udGV4dCBmb29sZXJ5IGhlcmUKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHBvcHVwQ29udGV4dCA9IG1lbnVNb2RlbC5nZXRDb250ZXh0KCk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gcG9wdXBDb250ZXh0LmdldFBhcmVudCgpOworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgb3JpZ2luYWxDaGlsZCA9IHBhcmVudENvbnRleHQuZ2V0QWN0aXZlQ2hpbGQoKTsKKwkJcG9wdXBDb250ZXh0LmFjdGl2YXRlKCk7CisJCXBvcHVwQ29udGV4dC5zZXQoTWVudU1hbmFnZXJSZW5kZXJlckZpbHRlci5UTVBfT1JJR0lOQUxfQ09OVEVYVCwKKwkJCQlvcmlnaW5hbENoaWxkKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2hvd01lbnUoZmluYWwgTWVudSBtZW51LCBmaW5hbCBNTWVudSBtZW51TW9kZWwsCisJCQlNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBldmFsQ29udGV4dDsKKwkJaWYgKG1lbnVNb2RlbCBpbnN0YW5jZW9mIE1Db250ZXh0KSB7CisJCQlldmFsQ29udGV4dCA9ICgoTUNvbnRleHQpIG1lbnVNb2RlbCkuZ2V0Q29udGV4dCgpOworCQl9IGVsc2UgeworCQkJZXZhbENvbnRleHQgPSBtb2RlbFNlcnZpY2UuZ2V0Q29udGFpbmluZ0NvbnRleHQobWVudU1vZGVsKTsKKwkJfQorCQlNZW51TWFuYWdlclJlbmRlcmVyRmlsdGVyLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KG1lbnVNb2RlbCwgcmVuZGVyZXIsCisJCQkJbWVudU1hbmFnZXIsIGV2YWxDb250ZXh0LCAyLCB0cnVlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjM5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgdm9nZWxsYSBHbWJIIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQHZvZ2VsbGEuY29tPiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9vbEJhck1hbmFnZXJSZW5kZXJlcl9NZW51Q2xvc2VUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvb2xCYXJNYW5hZ2VyUmVuZGVyZXJfTWVudVJlc3RvcmVUZXh0OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1BlcnNwZWN0aXZlUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1BlcnNwZWN0aXZlUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzkyODk3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvUGVyc3BlY3RpdmVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVN0eWxpbmdFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisKKworCUBPdmVycmlkZQorCXB1YmxpYyBXaWRnZXQgY3JlYXRlV2lkZ2V0KE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKQorCQkJCXx8ICEocGFyZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSkKKwkJCXJldHVybiBudWxsOworCisJCUNvbXBvc2l0ZSBwZXJzcEFyZWEgPSBuZXcgQ29tcG9zaXRlKChDb21wb3NpdGUpIHBhcmVudCwgU1dULk5PTkUpOworCQlwZXJzcEFyZWEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOworCQlJU3R5bGluZ0VuZ2luZSBzdHlsaW5nRW5naW5lID0gKElTdHlsaW5nRW5naW5lKSBnZXRDb250ZXh0KGVsZW1lbnQpCisJCQkJLmdldChJU3R5bGluZ0VuZ2luZS5TRVJWSUNFX05BTUUpOworCQlzdHlsaW5nRW5naW5lLnNldENsYXNzbmFtZShwZXJzcEFyZWEsICJwZXJzcGVjdGl2ZUxheW91dCIpOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIHBlcnNwQXJlYTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGVudHMoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyKSB7CisJCXN1cGVyLnByb2Nlc3NDb250ZW50cyhjb250YWluZXIpOworCisJCUlQcmVzZW50YXRpb25FbmdpbmUgcmVuZGVyZXIgPSAoSVByZXNlbnRhdGlvbkVuZ2luZSkgY29udGV4dAorCQkJCS5nZXQoSVByZXNlbnRhdGlvbkVuZ2luZS5jbGFzcy5nZXROYW1lKCkpOworCisJCU1QZXJzcGVjdGl2ZSBwZXJzcCA9IChNUGVyc3BlY3RpdmUpICgoTVVJRWxlbWVudCkgY29udGFpbmVyKTsKKwkJU2hlbGwgc2hlbGwgPSAoKENvbXBvc2l0ZSkgcGVyc3AuZ2V0V2lkZ2V0KCkpLmdldFNoZWxsKCk7CisJCWZvciAoTVdpbmRvdyBkdyA6IHBlcnNwLmdldFdpbmRvd3MoKSkgeworCQkJcmVuZGVyZXIuY3JlYXRlR3VpKGR3LCBzaGVsbCwgcGVyc3AuZ2V0Q29udGV4dCgpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VUlDb250YWluZXIoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNV2luZG93KSkKKwkJCXJldHVybiBzdXBlci5nZXRVSUNvbnRhaW5lcihlbGVtZW50KTsKKworCQlNUGVyc3BlY3RpdmUgcGVyc3AgPSAoTVBlcnNwZWN0aXZlKSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJaWYgKHBlcnNwLmdldFdpZGdldCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7CisJCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIHBlcnNwLmdldFdpZGdldCgpOworCQkJcmV0dXJuIGNvbXAuZ2V0U2hlbGwoKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1BlcnNwZWN0aXZlU3RhY2tSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvUGVyc3BlY3RpdmVTdGFja1JlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjNDg4NQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1BlcnNwZWN0aXZlU3RhY2tSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZVN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLklTdHlsaW5nRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVN0YWNrUmVuZGVyZXIgZXh0ZW5kcyBMYXp5U3RhY2tSZW5kZXJlciB7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJUHJlc2VudGF0aW9uRW5naW5lIHJlbmRlcmVyOworCisJQEluamVjdAorCXByaXZhdGUgSUV2ZW50QnJva2VyIGV2ZW50QnJva2VyOworCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlzdXBlci5pbml0KGV2ZW50QnJva2VyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZVN0YWNrKQorCQkJCXx8ICEocGFyZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSkKKwkJCXJldHVybiBudWxsOworCisJCUNvbXBvc2l0ZSBwZXJzcFN0YWNrID0gbmV3IENvbXBvc2l0ZSgoQ29tcG9zaXRlKSBwYXJlbnQsIFNXVC5OT05FKTsKKwkJSVN0eWxpbmdFbmdpbmUgc3R5bGluZ0VuZ2luZSA9IChJU3R5bGluZ0VuZ2luZSkgZ2V0Q29udGV4dChlbGVtZW50KQorCQkJCS5nZXQoSVN0eWxpbmdFbmdpbmUuU0VSVklDRV9OQU1FKTsKKwkJc3R5bGluZ0VuZ2luZS5zZXRDbGFzc25hbWUocGVyc3BTdGFjaywgInBlcnNwZWN0aXZlTGF5b3V0Iik7IC8vJE5PTi1OTFMtMSQKKwkJcGVyc3BTdGFjay5zZXRMYXlvdXQobmV3IFN0YWNrTGF5b3V0KCkpOworCisJCXJldHVybiBwZXJzcFN0YWNrOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RQcm9jZXNzKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlci5wb3N0UHJvY2VzcyhlbGVtZW50KTsKKworCQlNUGVyc3BlY3RpdmVTdGFjayBwcyA9IChNUGVyc3BlY3RpdmVTdGFjaykgZWxlbWVudDsKKwkJaWYgKHBzLmdldFNlbGVjdGVkRWxlbWVudCgpICE9IG51bGwKKwkJCQkmJiBwcy5nZXRTZWxlY3RlZEVsZW1lbnQoKS5nZXRXaWRnZXQoKSAhPSBudWxsKSB7CisJCQlDb250cm9sIGN0cmwgPSAoQ29udHJvbCkgcHMuZ2V0U2VsZWN0ZWRFbGVtZW50KCkuZ2V0V2lkZ2V0KCk7CisJCQlDb21wb3NpdGUgcHNDb21wID0gKENvbXBvc2l0ZSkgcHMuZ2V0V2lkZ2V0KCk7CisJCQlTdGFja0xheW91dCBzbCA9IChTdGFja0xheW91dCkgcHNDb21wLmdldExheW91dCgpOworCQkJc2wudG9wQ29udHJvbCA9IGN0cmw7CisJCQlwc0NvbXAubGF5b3V0KCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFiKE1VSUVsZW1lbnQgdGFiRWxlbWVudCkgeworCQlNUGVyc3BlY3RpdmUgcGVyc3AgPSAoTVBlcnNwZWN0aXZlKSB0YWJFbGVtZW50OworCisJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSB0YWJFbGVtZW50LmdldFdpZGdldCgpOworCQlpZiAoY3RybCA9PSBudWxsKSB7CisJCQljdHJsID0gKENvbnRyb2wpIHJlbmRlcmVyLmNyZWF0ZUd1aSh0YWJFbGVtZW50KTsKKwkJfSBlbHNlIGlmIChjdHJsLmdldFBhcmVudCgpICE9IHRhYkVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0V2lkZ2V0KCkpIHsKKwkJCUNvbXBvc2l0ZSBwYXJlbnQgPSAoQ29tcG9zaXRlKSB0YWJFbGVtZW50LmdldFBhcmVudCgpLmdldFdpZGdldCgpOworCQkJY3RybC5zZXRQYXJlbnQocGFyZW50KTsKKwkJfQorCisJCXN1cGVyLnNob3dUYWIodGFiRWxlbWVudCk7CisKKwkJLy8gcmVsYXlvdXQgdGhlIHBlcnNwZWN0aXZlCisJCUNvbXBvc2l0ZSBwc0NvbXAgPSBjdHJsLmdldFBhcmVudCgpOworCQlTdGFja0xheW91dCBzbCA9IChTdGFja0xheW91dCkgcHNDb21wLmdldExheW91dCgpOworCQlpZiAoc2wgIT0gbnVsbCkgeworCQkJc2wudG9wQ29udHJvbCA9IGN0cmw7CisJCQlwc0NvbXAubGF5b3V0KCk7CisJCX0KKworCQljdHJsLm1vdmVBYm92ZShudWxsKTsKKworCQkvLyBGb3JjZSBhIGNvbnRleHQgc3dpdGNoCisJCWlmICh0YWJFbGVtZW50IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSB7CisJCQlNUGVyc3BlY3RpdmUgc2VsZWN0ZWQgPSAoTVBlcnNwZWN0aXZlKSB0YWJFbGVtZW50LmdldFBhcmVudCgpCisJCQkJCS5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7CisJCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBzZWxlY3RlZC5nZXRDb250ZXh0KCk7CisJCQkJY29udGV4dC5nZXQoRVBhcnRTZXJ2aWNlLmNsYXNzKS5zd2l0Y2hQZXJzcGVjdGl2ZShzZWxlY3RlZCk7CisJCQl9CisJCX0KKworCQkvLyBNb3ZlIGFueSBvdGhlciBjb250cm9scyB0byAnbGltYm8nCisJCUNvbnRyb2xbXSBraWRzID0gY3RybC5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOworCQlTaGVsbCBsaW1ibyA9IChTaGVsbCkgcGVyc3AuZ2V0Q29udGV4dCgpLmdldCgibGltYm8iKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBraWRzKSB7CisJCQlpZiAoY2hpbGQgIT0gY3RybCkgeworCQkJCWNoaWxkLnNldFBhcmVudChsaW1ibyk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TV1RQYXJ0UmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1NXVFBhcnRSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGY2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TV1RQYXJ0UmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDM5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFJhZ25hciBOZXZyaWVzIDxyLmVjbGlwc2VAbmV2cmkuZXM+IC0gQnVnIDQ0MzUxNAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BYnN0cmFjdFBhcnRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkNTU0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLk1QYXJ0RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLklTdHlsaW5nRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUmVzb3VyY2VVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC51dGlsLklTV1RSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNXVFBhcnRSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0UGFydFJlbmRlcmVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9VUklfRk9SX1BBUlQgPSAiSWNvblVyaUZvclBhcnQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEltYWdlPiBpbWFnZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2U+KCk7CisKKwlwcml2YXRlIFN0cmluZyBwaW5VUkkgPSAicGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9pY29ucy9mdWxsL292cjE2L3Bpbm5lZF9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgSW1hZ2UgcGluSW1hZ2U7CisKKwlwcml2YXRlIElTV1RSZXNvdXJjZVV0aWxpdGllcyByZXNVdGlsczsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZW50cyhNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIpIHsKKwkJLy8gRU1GIGdpdmVzIHVzIG51bGwgbGlzdHMgaWYgZW1wdHkKKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCS8vIFByb2Nlc3MgYW55IGNvbnRlbnRzIG9mIHRoZSBuZXdseSBjcmVhdGVkIE1FCisJCUxpc3Q8TVVJRWxlbWVudD4gcGFydHMgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKKwkJaWYgKHBhcnRzICE9IG51bGwpIHsKKwkJCS8vIGxvYWRpbmcgYSBsZWdhY3kgYXBwIHdpbGwgYWRkIGNoaWxkcmVuIHRvIHRoZSB3aW5kb3cgd2hpbGUgaXQgaXMKKwkJCS8vIGJlaW5nIHJlbmRlcmVkLgorCQkJLy8gdGhpcyBpcyAqbm90KiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhpcworCQkJLy8gaG9wZSB0aGF0IHRoZSBBREQgZXZlbnQgd2lsbCBwaWNrIHVwIHRoZSBuZXcgcGFydC4KKwkJCUlQcmVzZW50YXRpb25FbmdpbmUgcmVuZGVyZXIgPSAoSVByZXNlbnRhdGlvbkVuZ2luZSkgY29udGV4dAorCQkJCQkuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCU1VSUVsZW1lbnRbXSBwbGlzdCA9IHBhcnRzLnRvQXJyYXkobmV3IE1VSUVsZW1lbnRbcGFydHMuc2l6ZSgpXSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsaXN0Lmxlbmd0aDsgaSsrKSB7CisJCQkJTVVJRWxlbWVudCBjaGlsZE1FID0gcGxpc3RbaV07CisJCQkJcmVuZGVyZXIuY3JlYXRlR3VpKGNoaWxkTUUpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgc3R5bGVFbGVtZW50KE1VSUVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBhY3RpdmUpIHsKKwkJaWYgKCFhY3RpdmUpCisJCQllbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoQ1NTQ29uc3RhbnRzLkNTU19BQ1RJVkVfQ0xBU1MpOworCQllbHNlCisJCQllbGVtZW50LmdldFRhZ3MoKS5hZGQoQ1NTQ29uc3RhbnRzLkNTU19BQ1RJVkVfQ0xBU1MpOworCisJCWlmIChlbGVtZW50LmdldFdpZGdldCgpICE9IG51bGwpCisJCQlzZXRDU1NJbmZvKGVsZW1lbnQsIGVsZW1lbnQuZ2V0V2lkZ2V0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENTU0luZm8oTVVJRWxlbWVudCBtZSwgT2JqZWN0IHdpZGdldCkgeworCQkvLyBObyBTV1Qgd2lkZ2V0LCBub3RoaW5nIHRvIHN0eWxlLi4uCisJCWlmICh3aWRnZXQgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBTZXQgdXAgdGhlIENTUyBTdHlsaW5nIHBhcmFtZXRlcnM7IGlkICYgY2xhc3MKKwkJSUVjbGlwc2VDb250ZXh0IGN0eHQgPSBnZXRDb250ZXh0KG1lKTsKKwkJaWYgKGN0eHQgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZmluYWwgSVN0eWxpbmdFbmdpbmUgZW5naW5lID0gKElTdHlsaW5nRW5naW5lKSBjdHh0CisJCQkJLmdldChJU3R5bGluZ0VuZ2luZS5TRVJWSUNFX05BTUUpOworCQlpZiAoZW5naW5lID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJLy8gUHV0IGFsbCB0aGUgdGFncyBpbnRvIHRoZSBjbGFzcyBzdHJpbmcKKwkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG1lOworCQlTdHJpbmcgY3NzQ2xhc3NTdHIgPSAnTScgKyBlT2JqLmVDbGFzcygpLmdldE5hbWUoKTsKKwkJZm9yIChTdHJpbmcgdGFnIDogbWUuZ2V0VGFncygpKQorCQkJY3NzQ2xhc3NTdHIgKz0gJyAnICsgdGFnOworCisJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHN0eWxlKCkKKwkJU3RyaW5nIGlkID0gbWUuZ2V0RWxlbWVudElkKCk7CisJCWlmIChpZCAhPSBudWxsKSB7CisJCQlpZCA9IGlkLnJlcGxhY2UoIi4iLCAiLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQllbmdpbmUuc2V0Q2xhc3NuYW1lQW5kSWQod2lkZ2V0LCBjc3NDbGFzc1N0ciwgaWQpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisJcHJvdGVjdGVkIHZvaWQgcmVhcHBseVN0eWxlcyhXaWRnZXQgd2lkZ2V0KSB7CisJCS8vIEZJWE1FIFJBUCBkb2VzIG5vdCBzdXBwb3J0IENTUworCQkvLyBDU1NFbmdpbmUgZW5naW5lID0gV2lkZ2V0RWxlbWVudC5nZXRFbmdpbmUod2lkZ2V0KTsKKwkJLy8gaWYgKGVuZ2luZSAhPSBudWxsKSB7CisJCS8vIGVuZ2luZS5hcHBseVN0eWxlcyh3aWRnZXQsIGZhbHNlKTsKKwkJLy8gfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGJpbmRXaWRnZXQoTVVJRWxlbWVudCBtZSwgT2JqZWN0IHdpZGdldCkgeworCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgV2lkZ2V0KSB7CisJCQkoKFdpZGdldCkgd2lkZ2V0KS5zZXREYXRhKE9XTklOR19NRSwgbWUpOworCisJCQkvLyBTZXQgdXAgdGhlIENTUyBTdHlsaW5nIHBhcmFtZXRlcnM7IGlkICYgY2xhc3MKKwkJCXNldENTU0luZm8obWUsIHdpZGdldCk7CisKKwkJCS8vIEVuc3VyZSB0aGF0IGRpc3Bvc2VkIHdpZGdldHMgYXJlIHVuYm91bmQgZm9ybSB0aGUgbW9kZWwKKwkJCVdpZGdldCBzd3RXaWRnZXQgPSAoV2lkZ2V0KSB3aWRnZXQ7CisJCQlzd3RXaWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7CisJCQkJCU1VSUVsZW1lbnQgZWxlbWVudCA9IChNVUlFbGVtZW50KSBlLndpZGdldAorCQkJCQkJCS5nZXREYXRhKE9XTklOR19NRSk7CisJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpCisJCQkJCQl1bmJpbmRXaWRnZXQoZWxlbWVudCk7CisJCQkJfQorCQkJfSk7CisJCX0KKworCQkvLyBDcmVhdGUgYSBiaS1kaXJlY3Rpb25hbCBsaW5rIGJldHdlZW4gdGhlIHdpZGdldCBhbmQgdGhlIG1vZGVsCisJCW1lLnNldFdpZGdldCh3aWRnZXQpOworCX0KKworCXB1YmxpYyBPYmplY3QgdW5iaW5kV2lkZ2V0KE1VSUVsZW1lbnQgbWUpIHsKKwkJV2lkZ2V0IHdpZGdldCA9IChXaWRnZXQpIG1lLmdldFdpZGdldCgpOworCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKKwkJCW1lLnNldFdpZGdldChudWxsKTsKKwkJCWlmICghd2lkZ2V0LmlzRGlzcG9zZWQoKSkKKwkJCQl3aWRnZXQuc2V0RGF0YShPV05JTkdfTUUsIG51bGwpOworCQl9CisKKwkJLy8gQ2xlYXIgdGhlIGZhY3RvcnkgcmVmZXJlbmNlCisJCW1lLnNldFJlbmRlcmVyKG51bGwpOworCisJCXJldHVybiB3aWRnZXQ7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFdpZGdldCBnZXRQYXJlbnRXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXJldHVybiAoV2lkZ2V0KSBlbGVtZW50LmdldFBhcmVudCgpLmdldFdpZGdldCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2VXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50KSB7CisKKwkJaWYgKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBXaWRnZXQpIHsKKwkJCVdpZGdldCBjdXJXaWRnZXQgPSAoV2lkZ2V0KSBlbGVtZW50LmdldFdpZGdldCgpOworCisJCQlpZiAoY3VyV2lkZ2V0ICE9IG51bGwgJiYgIWN1cldpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQl1bmJpbmRXaWRnZXQoZWxlbWVudCk7CisJCQkJdHJ5IHsKKwkJCQkJY3VyV2lkZ2V0LmRpc3Bvc2UoKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlMb2dnZXIgbG9nU2VydmljZSA9IGNvbnRleHQuZ2V0KExvZ2dlci5jbGFzcyk7CisJCQkJCWlmIChsb2dTZXJ2aWNlICE9IG51bGwpIHsKKwkJCQkJCVN0cmluZyBtc2cgPSAiRXJyb3IgZGlzcG9zaW5nIHdpZGdldCBmb3IgOiAiICsgZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNVUlMYWJlbCkgeworCQkJCQkJCW1zZyArPSAnICcgKyAoKE1VSUxhYmVsKSBlbGVtZW50KQorCQkJCQkJCQkJLmdldExvY2FsaXplZExhYmVsKCk7CisJCQkJCQl9CisJCQkJCQlsb2dTZXJ2aWNlLmVycm9yKGUsIG1zZyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxlbWVudC5zZXRXaWRnZXQobnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaG9va0NvbnRyb2xsZXJMb2dpYyhmaW5hbCBNVUlFbGVtZW50IG1lKSB7CisJCU9iamVjdCB3aWRnZXQgPSBtZS5nZXRXaWRnZXQoKTsKKworCQkvLyBhZGQgYW4gYWNjZXNzaWJpbGl0eSBsaXN0ZW5lciAobm90IHN1cmUgaWYgdGhpcyBpcyBpbiB0aGUgd3JvbmcgcGxhY2UKKwkJLy8gKGZhY3Rvcnk/KQorCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCAmJiBtZSBpbnN0YW5jZW9mIE1VSUxhYmVsKSB7CisJCQkoKENvbnRyb2wpIHdpZGdldCkuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcigKKwkJCQkJbmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgeworCQkJCS8qKgorCQkJCSAqCisJCQkJICovCisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgeworCQkJCQkJCWUucmVzdWx0ID0gKChNVUlMYWJlbCkgbWUpLmdldExvY2FsaXplZExhYmVsKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQl9CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUb29sVGlwKE1VSUxhYmVsIGVsZW1lbnQpIHsKKwkJU3RyaW5nIG92ZXJyaWRlVGlwID0gKFN0cmluZykgKChNVUlFbGVtZW50KSBlbGVtZW50KS5nZXRUcmFuc2llbnREYXRhKCkKKwkJCQkuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuT1ZFUlJJREVfVElUTEVfVE9PTF9USVBfS0VZKTsKKwkJcmV0dXJuIG92ZXJyaWRlVGlwID09IG51bGwgPyBlbGVtZW50LmdldExvY2FsaXplZFRvb2x0aXAoKSA6IG92ZXJyaWRlVGlwOworCX0KKworCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21VUkkoU3RyaW5nIGljb25VUkkpIHsKKwkJaWYgKGljb25VUkkgPT0gbnVsbCB8fCBpY29uVVJJLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQlJbWFnZSBpbWFnZSA9IGltYWdlTWFwLmdldChpY29uVVJJKTsKKwkJaWYgKGltYWdlID09IG51bGwpIHsKKwkJCWltYWdlID0gcmVzVXRpbHMuaW1hZ2VEZXNjcmlwdG9yRnJvbVVSSShVUkkuY3JlYXRlVVJJKGljb25VUkkpKQorCQkJCQkuY3JlYXRlSW1hZ2UoKTsKKwkJCWltYWdlTWFwLnB1dChpY29uVVJJLCBpbWFnZSk7CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShNVUlMYWJlbCBlbGVtZW50KSB7CisJCUltYWdlIGltYWdlID0gKEltYWdlKSAoKE1VSUVsZW1lbnQpIGVsZW1lbnQpLmdldFRyYW5zaWVudERhdGEoKS5nZXQoCisJCQkJSVByZXNlbnRhdGlvbkVuZ2luZS5PVkVSUklERV9JQ09OX0lNQUdFX0tFWSk7CisJCWlmIChpbWFnZSA9PSBudWxsIHx8IGltYWdlLmlzRGlzcG9zZWQoKSkgeworCQkJaW1hZ2UgPSBnZXRJbWFnZUZyb21VUkkoZ2V0SWNvblVSSShlbGVtZW50KSk7CisJCX0KKworCQlpZiAoaW1hZ2UgIT0gbnVsbCkgeworCQkJaW1hZ2UgPSBhZG9ybkltYWdlKChNVUlFbGVtZW50KSBlbGVtZW50LCBpbWFnZSk7CisJCX0KKworCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0SWNvblVSSShNVUlMYWJlbCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCU1QYXJ0IHBhcnQgPSAoTVBhcnQpIGVsZW1lbnQ7CisJCQlTdHJpbmcgaWNvblVSSSA9IChTdHJpbmcpIHBhcnQuZ2V0VHJhbnNpZW50RGF0YSgpLmdldChJQ09OX1VSSV9GT1JfUEFSVCk7CisJCQlpZiAoaWNvblVSSSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGljb25VUkk7CisJCQl9CisKKwkJCU1QYXJ0RGVzY3JpcHRvciBkZXNjID0gbW9kZWxTZXJ2aWNlLmdldFBhcnREZXNjcmlwdG9yKHBhcnQuZ2V0RWxlbWVudElkKCkpOworCQkJaWNvblVSSSA9IGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldEljb25VUkkoKSAhPSBudWxsID8gZGVzYy5nZXRJY29uVVJJKCkgOiBlbGVtZW50LmdldEljb25VUkkoKTsKKwkJCXBhcnQuZ2V0VHJhbnNpZW50RGF0YSgpLnB1dChJQ09OX1VSSV9GT1JfUEFSVCwgaWNvblVSSSk7CisKKwkJCXJldHVybiBpY29uVVJJOworCQl9CisJCXJldHVybiBlbGVtZW50LmdldEljb25VUkkoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqIEBwYXJhbSBpbWFnZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEltYWdlIGFkb3JuSW1hZ2UoTVVJRWxlbWVudCBlbGVtZW50LCBJbWFnZSBpbWFnZSkgeworCQkvLyBSZW1vdmUgYW5kIGRpc3Bvc2UgYW55IHByZXZpb3VzIGFkb3JuZWQgaW1hZ2UKKwkJSW1hZ2UgcHJldmlvdXNseUFkb3JuZWRJbWFnZSA9IChJbWFnZSkgZWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KAorCQkJCSJwcmV2aW91c2x5QWRvcm5lZCIpOyAvLyROT04tTkxTLTEkCisJCWlmIChwcmV2aW91c2x5QWRvcm5lZEltYWdlICE9IG51bGwKKwkJCQkmJiAhcHJldmlvdXNseUFkb3JuZWRJbWFnZS5pc0Rpc3Bvc2VkKCkpCisJCQlwcmV2aW91c2x5QWRvcm5lZEltYWdlLmRpc3Bvc2UoKTsKKwkJZWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCkucmVtb3ZlKElQcmVzZW50YXRpb25FbmdpbmUuQURPUk5NRU5UX1BJTik7CisKKwkJSW1hZ2UgYWRvcm5lZEltYWdlID0gaW1hZ2U7CisJCWlmIChlbGVtZW50LmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLkFET1JOTUVOVF9QSU4pKSB7CisJCQlhZG9ybmVkSW1hZ2UgPSByZXNVdGlscy5hZG9ybkltYWdlKGltYWdlLCBwaW5JbWFnZSk7CisJCQlpZiAoYWRvcm5lZEltYWdlICE9IGltYWdlKQorCQkJCWVsZW1lbnQuZ2V0VHJhbnNpZW50RGF0YSgpLnB1dCgKKwkJCQkJCSJwcmV2aW91c2x5QWRvcm5lZCIsIGFkb3JuZWRJbWFnZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCXJldHVybiBhZG9ybmVkSW1hZ2U7CisJfQorCisJLyoqCisJICogQ2FsY3VsYXRlcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gdGVybXMgb2YgdGhlIG90aGVyIDxiPnJlbmRlcmVkPC9iPgorCSAqIGVsZW1lbnRzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuICdpbnNlcnRpbmcnIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YKKwkgKiBleGlzdGluZywgcmVuZGVyZWQgcGFyZW50cy4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBnZXQgdGhlIGluZGV4IGZvcgorCSAqIEByZXR1cm4gVGhlIHZpc2libGUgaW5kZXggb3IgLTEgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGEgY2hpbGQgb2YgdGhlCisJICogICAgICAgICBwYXJlbnQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGNhbGNWaXNpYmxlSW5kZXgoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisKKwkJaW50IGN1ckluZGV4ID0gMDsKKwkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogcGFyZW50LmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChjaGlsZCA9PSBlbGVtZW50KSB7CisJCQkJcmV0dXJuIGN1ckluZGV4OworCQkJfQorCisJCQlpZiAoY2hpbGQuZ2V0V2lkZ2V0KCkgIT0gbnVsbCkKKwkJCQljdXJJbmRleCsrOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IGNhbGNJbmRleChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJcmV0dXJuIHBhcmVudC5nZXRDaGlsZHJlbigpLmluZGV4T2YoZWxlbWVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hpbGRSZW5kZXJlZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBlbGVtZW50KSB7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlzdXBlci5pbml0KGNvbnRleHQpOworCisJCXJlc1V0aWxzID0gKElTV1RSZXNvdXJjZVV0aWxpdGllcykgY29udGV4dC5nZXQoSVJlc291cmNlVXRpbGl0aWVzLmNsYXNzCisJCQkJLmdldE5hbWUoKSk7CisJCXBpbkltYWdlID0gZ2V0SW1hZ2VGcm9tVVJJKHBpblVSSSk7CisKKwkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZm9yIChJbWFnZSBpbWFnZSA6IGltYWdlTWFwLnZhbHVlcygpKSB7CisJCQkJCWltYWdlLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzRm9jdXMoTVBhcnQgZWxlbWVudCkgeworCQlNVUlFbGVtZW50IGZvY3Vzc2VkID0gZ2V0TW9kZWxFbGVtZW50KERpc3BsYXkuZ2V0RGVmYXVsdCgpCisJCQkJLmdldEZvY3VzQ29udHJvbCgpKTsKKwkJaWYgKGZvY3Vzc2VkID09IG51bGwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCS8vIHdlIGlnbm9yZSBtZW51cworCQlkbyB7CisJCQlpZiAoZm9jdXNzZWQgPT0gZWxlbWVudCB8fCBmb2N1c3NlZCA9PSBlbGVtZW50LmdldFRvb2xiYXIoKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWZvY3Vzc2VkID0gZm9jdXNzZWQuZ2V0UGFyZW50KCk7CisJCX0gd2hpbGUgKGZvY3Vzc2VkICE9IG51bGwpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlzdGF0aWMgcHJvdGVjdGVkIE1VSUVsZW1lbnQgZ2V0TW9kZWxFbGVtZW50KENvbnRyb2wgY3RybCkgeworCQlpZiAoY3RybCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJTVVJRWxlbWVudCBlbGVtZW50ID0gKE1VSUVsZW1lbnQpIGN0cmwKKwkJCQkuZ2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUpOworCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7CisJCQlyZXR1cm4gZWxlbWVudDsKKwkJCS8vIEZJWE1FOiBEbmRVdGlsLmdldE1vZGVsRWxlbWVudCgpIGhhcyB0aGUgZm9sbG93aW5nIGNoZWNrOworCQkJLy8gZG8gd2UgbmVlZCB0aGlzPworCQkJLy8gaWYgKG1vZGVsU2VydmljZS5nZXRUb3BMZXZlbFdpbmRvd0ZvcihlbGVtZW50KSA9PSB0b3BMZXZlbFdpbmRvdykKKwkJCS8vIHsKKwkJCS8vIHJldHVybiBlbGVtZW50OworCQkJLy8gfQorCQkJLy8gcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gZ2V0TW9kZWxFbGVtZW50KGN0cmwuZ2V0UGFyZW50KCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZvcmNlRm9jdXMoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50LmdldFdpZGdldCgpIGluc3RhbmNlb2YgQ29udHJvbCkgeworCQkJLy8gSGF2ZSBTV1Qgc2V0IHRoZSBmb2N1cworCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIGVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCQlpZiAoIWN0cmwuaXNEaXNwb3NlZCgpKQorCQkJCWN0cmwuZm9yY2VGb2N1cygpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvU2FzaExheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvU2FzaExheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMGI3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TYXNoTGF5b3V0LmphdmEKQEAgLTAsMCArMSw0MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUdlbmVyaWNUaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCitwdWJsaWMgY2xhc3MgU2FzaExheW91dCBleHRlbmRzIExheW91dCB7CisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCS8vIFRoZSBtaW5pbXVtIHZhbHVlIChhcyBhIHBlcmNlbnRhZ2UpIHRoYXQgYSBzYXNoIGNhbiBiZSBkcmFnZ2VkIHRvCisJaW50IG1pblNhc2hQZXJjZW50ID0gMTA7CisKKwlpbnQgbWFyZ2luTGVmdCA9IDA7CisJaW50IG1hcmdpblJpZ2h0ID0gMDsKKwlpbnQgbWFyZ2luVG9wID0gMDsKKwlpbnQgbWFyZ2luQm90dG9tID0gMDsKKwlpbnQgc2FzaFdpZHRoID0gNDsKKworCU1VSUVsZW1lbnQgcm9vdDsKKwlwcml2YXRlIENvbXBvc2l0ZSBob3N0OworCisJY2xhc3MgU2FzaFJlY3QgeworCQlSZWN0YW5nbGUgcmVjdDsKKwkJTUdlbmVyaWNUaWxlPD8+IGNvbnRhaW5lcjsKKwkJTVVJRWxlbWVudCBsZWZ0OworCQlNVUlFbGVtZW50IHJpZ2h0OworCisJCXB1YmxpYyBTYXNoUmVjdChSZWN0YW5nbGUgcmVjdCwgTUdlbmVyaWNUaWxlPD8+IGNvbnRhaW5lciwKKwkJCQlNVUlFbGVtZW50IGxlZnQsIE1VSUVsZW1lbnQgcmlnaHQpIHsKKwkJCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworCQkJdGhpcy5yZWN0ID0gcmVjdDsKKwkJCXRoaXMubGVmdCA9IGxlZnQ7CisJCQl0aGlzLnJpZ2h0ID0gcmlnaHQ7CisJCX0KKwl9CisKKwlMaXN0PFNhc2hSZWN0PiBzYXNoZXMgPSBuZXcgQXJyYXlMaXN0PFNhc2hSZWN0PigpOworCisJYm9vbGVhbiBkcmFnZ2luZ1Nhc2hlcyA9IGZhbHNlOworCUxpc3Q8U2FzaFJlY3Q+IHNhc2hlc1RvRHJhZzsKKworCXB1YmxpYyBib29sZWFuIGxheW91dFVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKworCXB1YmxpYyBTYXNoTGF5b3V0KGZpbmFsIENvbXBvc2l0ZSBob3N0LCBNVUlFbGVtZW50IHJvb3QpIHsKKwkJdGhpcy5yb290ID0gcm9vdDsKKwkJdGhpcy5ob3N0ID0gaG9zdDsKKwkJLy8gUkFQIGRvZXMgbm90IHN1cHBvcnQgbW91c2UgdHJhY2svbW92ZSBsaXN0ZW5lcnMKKwkJLy8gaG9zdC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7CisJCS8vIH0KKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKKwkJLy8gaG9zdC5zZXRDdXJzb3IobnVsbCk7CisJCS8vIH0KKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7CisJCS8vIH0KKwkJLy8gfSk7CisJCS8vCisJCS8vIGhvc3QuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgeworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIHZvaWQgbW91c2VNb3ZlKGZpbmFsIE1vdXNlRXZlbnQgZSkgeworCQkvLyBpZiAoIWRyYWdnaW5nU2FzaGVzKSB7CisJCS8vIC8vIFNldCB0aGUgY3Vyc29yIGZlZWRiYWNrCisJCS8vIExpc3Q8U2FzaFJlY3Q+IHNhc2hMaXN0ID0gZ2V0U2FzaFJlY3RzKGUueCwgZS55KTsKKwkJLy8gaWYgKHNhc2hMaXN0LnNpemUoKSA9PSAwKSB7CisJCS8vIGhvc3Quc2V0Q3Vyc29yKGhvc3QuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKKwkJLy8gU1dULkNVUlNPUl9BUlJPVykpOworCQkvLyB9IGVsc2UgaWYgKHNhc2hMaXN0LnNpemUoKSA9PSAxKSB7CisJCS8vIGlmIChzYXNoTGlzdC5nZXQoMCkuY29udGFpbmVyLmlzSG9yaXpvbnRhbCgpKQorCQkvLyBob3N0LnNldEN1cnNvcihob3N0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoCisJCS8vIFNXVC5DVVJTT1JfU0laRVdFKSk7CisJCS8vIGVsc2UKKwkJLy8gaG9zdC5zZXRDdXJzb3IoaG9zdC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKAorCQkvLyBTV1QuQ1VSU09SX1NJWkVOUykpOworCQkvLyB9IGVsc2UgeworCQkvLyBob3N0LnNldEN1cnNvcihob3N0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoCisJCS8vIFNXVC5DVVJTT1JfU0laRUFMTCkpOworCQkvLyB9CisJCS8vIH0gZWxzZSB7CisJCS8vIHRyeSB7CisJCS8vIGxheW91dFVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworCQkvLyBhZGp1c3RXZWlnaHRzKHNhc2hlc1RvRHJhZywgZS54LCBlLnkpOworCQkvLyBob3N0LmxheW91dCgpOworCQkvLyBob3N0LnVwZGF0ZSgpOworCQkvLyB9IGZpbmFsbHkgeworCQkvLyBsYXlvdXRVcGRhdGVJblByb2dyZXNzID0gZmFsc2U7CisJCS8vIH0KKwkJLy8gfQorCQkvLyB9CisJCS8vIH0pOworCQkvLworCQkvLyBob3N0LmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7CisJCS8vIEBPdmVycmlkZQorCQkvLyBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgeworCQkvLyBob3N0LnNldENhcHR1cmUoZmFsc2UpOworCQkvLyBkcmFnZ2luZ1Nhc2hlcyA9IGZhbHNlOworCQkvLyB9CisJCS8vCisJCS8vIEBPdmVycmlkZQorCQkvLyBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7CisJCS8vIGlmIChlLmJ1dHRvbiAhPSAxKSB7CisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyBzYXNoZXNUb0RyYWcgPSBnZXRTYXNoUmVjdHMoZS54LCBlLnkpOworCQkvLyBpZiAoc2FzaGVzVG9EcmFnLnNpemUoKSA+IDApIHsKKwkJLy8gZHJhZ2dpbmdTYXNoZXMgPSB0cnVlOworCQkvLyBob3N0LnNldENhcHR1cmUodHJ1ZSk7CisJCS8vIH0KKwkJLy8gfQorCQkvLworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKKwkJLy8gfQorCQkvLyB9KTsKKwkJLy8KKwkJLy8gaG9zdC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgeworCQkvLyAvLyBmb3IgKFNhc2hSZWN0IHNyIDogc2FzaGVzKSB7CisJCS8vIC8vIENvbG9yIGNvbG9yOworCQkvLyAvLyBpZiAoc3IuY29udGFpbmVyLmlzSG9yaXpvbnRhbCgpKQorCQkvLyAvLyBjb2xvciA9IGUuZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSk7CisJCS8vIC8vIGVsc2UKKwkJLy8gLy8gY29sb3IgPSBlLmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pOworCQkvLyAvLyBlLmdjLnNldEZvcmVncm91bmQoY29sb3IpOworCQkvLyAvLyBlLmdjLnNldEJhY2tncm91bmQoY29sb3IpOworCQkvLyAvLyBlLmdjLmZpbGxSZWN0YW5nbGUoc3IucmVjdCk7CisJCS8vIC8vIH0KKwkJLy8gfQorCQkvLyB9KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCWlmIChyb290ID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMoKTsKKwkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNoZWxsKQorCQkJYm91bmRzID0gKChTaGVsbCkgY29tcG9zaXRlKS5nZXRDbGllbnRBcmVhKCk7CisJCWVsc2UgeworCQkJYm91bmRzLnggPSAwOworCQkJYm91bmRzLnkgPSAwOworCQl9CisKKwkJYm91bmRzLndpZHRoIC09IChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQpOworCQlib3VuZHMuaGVpZ2h0IC09IChtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b20pOworCQlib3VuZHMueCArPSBtYXJnaW5MZWZ0OworCQlib3VuZHMueSArPSBtYXJnaW5Ub3A7CisKKwkJc2FzaGVzLmNsZWFyKCk7CisJCXRpbGVTdWJOb2Rlcyhib3VuZHMsIHJvb3QpOworCQkvLyBSQVA6IFVzZSByZWFsIFNhc2ggd2lkZ2V0cyBpbnN0ZWFkIG9mIG1vdXNlIHRyYWNrL21vdmUgbGlzdGVuZXJzCisJCXVwZGF0ZVNhc2hXaWRnZXRzKCk7CisJCS8vIFJBUEVORAorCX0KKworCS8vIFJBUDogVXNlIHJlYWwgU2FzaCB3aWRnZXRzIGluc3RlYWQgb2YgbW91c2UgdHJhY2svbW92ZSBsaXN0ZW5lcnMKKwlMaXN0PFNhc2g+IHNhc2hXaWRnZXRzID0gbmV3IEFycmF5TGlzdDxTYXNoPigpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RJT05fTElTVEVORVJfSUQgPSAic2VsTGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHZvaWQgdXBkYXRlU2FzaFdpZGdldHMoKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaGVzLnNpemUoKTsgaSsrKSB7CisJCQlTYXNoUmVjdCBzYXNoUmVjdCA9IHNhc2hlcy5nZXQoaSk7CisJCQlpZiAoaSA8IHNhc2hXaWRnZXRzLnNpemUoKSkgeworCQkJCVNhc2ggc2FzaFdpZGdldCA9IHNhc2hXaWRnZXRzLmdldChpKTsKKwkJCQlpZiAoaXNTYW1lT3JpZW50YXRpb24oc2FzaFdpZGdldCwgc2FzaFJlY3QpKSB7CisJCQkJCXNhc2hXaWRnZXQuc2V0Qm91bmRzKHNhc2hSZWN0LnJlY3QpOworCQkJCQlzYXNoV2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIChMaXN0ZW5lcikgc2FzaFdpZGdldC5nZXREYXRhKFNFTEVDVElPTl9MSVNURU5FUl9JRCkpOworCisJCQkJCVNlbGVjdGlvbkxpc3RlbmVyIHNlbExpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKHNhc2hSZWN0LCBzYXNoV2lkZ2V0KTsKKwkJCQkJc2FzaFdpZGdldC5zZXREYXRhKFNFTEVDVElPTl9MSVNURU5FUl9JRCwgc2VsTGlzdGVuZXIpOworCQkJCQlzYXNoV2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNlbExpc3RlbmVyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzYXNoV2lkZ2V0cy5zZXQoaSwgY3JlYXRlU2FzaChzYXNoUmVjdCkpLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNhc2hXaWRnZXRzLmFkZChjcmVhdGVTYXNoKHNhc2hSZWN0KSk7CisJCQl9CisJCX0KKwkJd2hpbGUgKHNhc2hXaWRnZXRzLnNpemUoKSA+IHNhc2hlcy5zaXplKCkpIHsKKwkJCXNhc2hXaWRnZXRzLnJlbW92ZShzYXNoV2lkZ2V0cy5zaXplKCkgLSAxKS5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwljbGFzcyBTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKKwkJLyoqCisJCSAqCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQlTYXNoUmVjdCBzYXNoUmVjdDsKKwkJU2FzaCBzYXNoOworCisJCXB1YmxpYyBTZWxlY3Rpb25MaXN0ZW5lcihTYXNoUmVjdCBzciwgU2FzaCBzYXNoKSB7CisJCQlzYXNoUmVjdCA9IHNyOworCQkJdGhpcy5zYXNoID0gc2FzaDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJRGlzcGxheSBkaXNwbGF5ID0gaG9zdC5nZXREaXNwbGF5KCk7CisJCQlQb2ludCBjdXJzb3JMb2NhdGlvbiA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKKwkJCVBvaW50IG1hcHBlZCA9IGRpc3BsYXkubWFwKG51bGwsIGhvc3QsIGN1cnNvckxvY2F0aW9uKTsKKwkJCUxpc3Q8U2FzaFJlY3Q+IHNhc2hlc1RvRHJhZyA9IG5ldyBBcnJheUxpc3Q8U2FzaExheW91dC5TYXNoUmVjdD4oKTsKKwkJCXNhc2hlc1RvRHJhZy5hZGQoc2FzaFJlY3QpOworCQkJYWRqdXN0V2VpZ2h0cyhzYXNoZXNUb0RyYWcsIG1hcHBlZC54LCBtYXBwZWQueSk7CisJCQlob3N0LmxheW91dCgpOworCQkJaG9zdC51cGRhdGUoKTsKKwkJfQorCX0KKworCXByaXZhdGUgU2FzaCBjcmVhdGVTYXNoKGZpbmFsIFNhc2hSZWN0IHNhc2hSZWN0KSB7CisJCWJvb2xlYW4gaG9yaXpvbnRhbCA9ICFzYXNoUmVjdC5jb250YWluZXIuaXNIb3Jpem9udGFsKCk7CisJCVNhc2ggc2FzaCA9IG5ldyBTYXNoKGhvc3QsIGhvcml6b250YWwgPyBTV1QuSE9SSVpPTlRBTCA6IFNXVC5WRVJUSUNBTCk7CisJCXNhc2guc2V0Qm91bmRzKHNhc2hSZWN0LnJlY3QpOworCisJCVNlbGVjdGlvbkxpc3RlbmVyIHNlbExpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKHNhc2hSZWN0LCBzYXNoKTsKKwkJc2FzaC5zZXREYXRhKFNFTEVDVElPTl9MSVNURU5FUl9JRCwgc2VsTGlzdGVuZXIpOworCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNlbExpc3RlbmVyKTsKKwkJcmV0dXJuIHNhc2g7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzU2FtZU9yaWVudGF0aW9uKFNhc2ggc2FzaCwgU2FzaFJlY3Qgc2FzaFJlY3QpIHsKKwkJYm9vbGVhbiBpc1Nhc2hIb3Jpem9udGFsID0gKHNhc2guZ2V0U3R5bGUoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwOworCQlib29sZWFuIGlzU2FzaENvbnRhaW5lckhvcml6b250YWwgPSBzYXNoUmVjdC5jb250YWluZXIuaXNIb3Jpem9udGFsKCk7CisJCXJldHVybiBpc1Nhc2hIb3Jpem9udGFsICE9IGlzU2FzaENvbnRhaW5lckhvcml6b250YWw7CisJfQorCS8vIFJBUEVORAorCisJcHJvdGVjdGVkIHZvaWQgYWRqdXN0V2VpZ2h0cyhMaXN0PFNhc2hSZWN0PiBzYXNoZXMsIGludCBjdXJYLCBpbnQgY3VyWSkgeworCQlmb3IgKFNhc2hSZWN0IHNyIDogc2FzaGVzKSB7CisJCQlpbnQgdG90YWxXZWlnaHQgPSBnZXRXZWlnaHQoc3IubGVmdCkgKyBnZXRXZWlnaHQoc3IucmlnaHQpOworCQkJaW50IG1pblNhc2hWYWx1ZSA9IChpbnQpICgoKHRvdGFsV2VpZ2h0IC8gMTAwLjApICogbWluU2FzaFBlcmNlbnQpICsgMC41KTsKKworCQkJUmVjdGFuZ2xlIGxlZnRSZWN0ID0gZ2V0UmVjdGFuZ2xlKHNyLmxlZnQpOworCQkJUmVjdGFuZ2xlIHJpZ2h0UmVjdCA9IGdldFJlY3RhbmdsZShzci5yaWdodCk7CisJCQlpZiAobGVmdFJlY3QgPT0gbnVsbCB8fCByaWdodFJlY3QgPT0gbnVsbCkKKwkJCQljb250aW51ZTsKKworCQkJaW50IGxlZnRXZWlnaHQ7CisJCQlpbnQgcmlnaHRXZWlnaHQ7CisKKwkJCWlmIChzci5jb250YWluZXIuaXNIb3Jpem9udGFsKCkpIHsKKwkJCQlkb3VibGUgbGVmdCA9IGxlZnRSZWN0Lng7CisJCQkJZG91YmxlIHJpZ2h0ID0gcmlnaHRSZWN0LnggKyByaWdodFJlY3Qud2lkdGg7CisJCQkJZG91YmxlIHBjdCA9IChjdXJYIC0gbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKwkJCQlsZWZ0V2VpZ2h0ID0gKGludCkgKCh0b3RhbFdlaWdodCAqIHBjdCkgKyAwLjUpOworCQkJCWlmIChsZWZ0V2VpZ2h0IDwgbWluU2FzaFZhbHVlKQorCQkJCQlsZWZ0V2VpZ2h0ID0gbWluU2FzaFZhbHVlOworCQkJCWlmIChsZWZ0V2VpZ2h0ID4gKHRvdGFsV2VpZ2h0IC0gbWluU2FzaFZhbHVlKSkKKwkJCQkJbGVmdFdlaWdodCA9IHRvdGFsV2VpZ2h0IC0gbWluU2FzaFZhbHVlOworCQkJCXJpZ2h0V2VpZ2h0ID0gdG90YWxXZWlnaHQgLSBsZWZ0V2VpZ2h0OworCQkJfSBlbHNlIHsKKwkJCQlkb3VibGUgdG9wID0gbGVmdFJlY3QueTsKKwkJCQlkb3VibGUgYm90dG9tID0gcmlnaHRSZWN0LnkgKyByaWdodFJlY3QuaGVpZ2h0OworCQkJCWRvdWJsZSBwY3QgPSAoY3VyWSAtIHRvcCkgLyAoYm90dG9tIC0gdG9wKTsKKwkJCQlsZWZ0V2VpZ2h0ID0gKGludCkgKCh0b3RhbFdlaWdodCAqIHBjdCkgKyAwLjUpOworCQkJCWlmIChsZWZ0V2VpZ2h0IDwgbWluU2FzaFZhbHVlKQorCQkJCQlsZWZ0V2VpZ2h0ID0gbWluU2FzaFZhbHVlOworCQkJCWlmIChsZWZ0V2VpZ2h0ID4gKHRvdGFsV2VpZ2h0IC0gbWluU2FzaFZhbHVlKSkKKwkJCQkJbGVmdFdlaWdodCA9IHRvdGFsV2VpZ2h0IC0gbWluU2FzaFZhbHVlOworCQkJCXJpZ2h0V2VpZ2h0ID0gdG90YWxXZWlnaHQgLSBsZWZ0V2VpZ2h0OworCQkJfQorCisJCQlzZXRXZWlnaHQoc3IubGVmdCwgbGVmdFdlaWdodCk7CisJCQlzZXRXZWlnaHQoc3IucmlnaHQsIHJpZ2h0V2VpZ2h0KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXRXZWlnaHQoTVVJRWxlbWVudCBlbGVtZW50LCBpbnQgd2VpZ2h0KSB7CisJCWVsZW1lbnQuc2V0Q29udGFpbmVyRGF0YShJbnRlZ2VyLnRvU3RyaW5nKHdlaWdodCkpOworCX0KKworCXByaXZhdGUgUmVjdGFuZ2xlIGdldFJlY3RhbmdsZShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBSZWN0YW5nbGUpCisJCQlyZXR1cm4gKFJlY3RhbmdsZSkgZWxlbWVudC5nZXRXaWRnZXQoKTsKKwkJZWxzZSBpZiAoZWxlbWVudC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbnRyb2wpCisJCQlyZXR1cm4gKChDb250cm9sKSAoZWxlbWVudC5nZXRXaWRnZXQoKSkpLmdldEJvdW5kcygpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdDxTYXNoUmVjdD4gZ2V0U2FzaFJlY3RzKGludCB4LCBpbnQgeSkgeworCQlMaXN0PFNhc2hSZWN0PiBzcnMgPSBuZXcgQXJyYXlMaXN0PFNhc2hSZWN0PigpOworCQlSZWN0YW5nbGUgdGFyZ2V0ID0gbmV3IFJlY3RhbmdsZSh4IC0gNSwgeSAtIDUsIDEwLCAxMCk7CisJCWZvciAoU2FzaFJlY3Qgc3IgOiBzYXNoZXMpIHsKKwkJCWlmICghc3IuY29udGFpbmVyLmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLk5PX01PVkUpCisJCQkJCSYmIHNyLnJlY3QuaW50ZXJzZWN0cyh0YXJnZXQpKQorCQkJCXNycy5hZGQoc3IpOworCQl9CisJCXJldHVybiBzcnM7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LAorCQkJYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCXJldHVybiBuZXcgUG9pbnQoNjAwLCA0MDApOworCX0KKworCXByaXZhdGUgaW50IHRvdGFsV2VpZ2h0KE1HZW5lcmljVGlsZTw/PiBub2RlKSB7CisJCWludCB0b3RhbCA9IDA7CisJCWZvciAoTVVJRWxlbWVudCBzdWJOb2RlIDogbm9kZS5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoc3ViTm9kZS5pc1RvQmVSZW5kZXJlZCgpICYmIHN1Yk5vZGUuaXNWaXNpYmxlKCkpCisJCQkJdG90YWwgKz0gZ2V0V2VpZ2h0KHN1Yk5vZGUpOworCQl9CisJCXJldHVybiB0b3RhbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGlsZVN1Yk5vZGVzKFJlY3RhbmdsZSBib3VuZHMsIE1VSUVsZW1lbnQgbm9kZSkgeworCQlpZiAobm9kZSAhPSByb290KQorCQkJc2V0UmVjdGFuZ2xlKG5vZGUsIGJvdW5kcyk7CisKKwkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIE1HZW5lcmljVGlsZTw/PikpCisJCQlyZXR1cm47CisKKwkJTUdlbmVyaWNUaWxlPD8+IHNhc2hDb250YWluZXIgPSAoTUdlbmVyaWNUaWxlPD8+KSBub2RlOworCQlMaXN0PE1VSUVsZW1lbnQ+IHZpc2libGVDaGlsZHJlbiA9IGdldFZpc2libGVDaGlsZHJlbihzYXNoQ29udGFpbmVyKTsKKwkJaW50IGNoaWxkQ291bnQgPSB2aXNpYmxlQ2hpbGRyZW4uc2l6ZSgpOworCisJCS8vIEhvdyBtYW55IHBpeGVscyBkbyB3ZSBoYXZlPworCQlpbnQgYXZhaWxhYmxlV2lkdGggPSBzYXNoQ29udGFpbmVyLmlzSG9yaXpvbnRhbCgpID8gYm91bmRzLndpZHRoCisJCQkJOiBib3VuZHMuaGVpZ2h0OworCisJCS8vIFN1YnRyYWN0IG9mZiB0aGUgcm9vbSBmb3IgdGhlIHNhc2hlcworCQlhdmFpbGFibGVXaWR0aCAtPSAoKGNoaWxkQ291bnQgLSAxKSAqIHNhc2hXaWR0aCk7CisKKwkJLy8gR2V0IHRoZSB0b3RhbCBvZiB0aGUgd2VpZ2h0cworCQlkb3VibGUgdG90YWxXZWlnaHQgPSB0b3RhbFdlaWdodChzYXNoQ29udGFpbmVyKTsKKwkJaW50IHRpbGVQb3MgPSBzYXNoQ29udGFpbmVyLmlzSG9yaXpvbnRhbCgpID8gYm91bmRzLnggOiBib3VuZHMueTsKKworCQlNVUlFbGVtZW50IHByZXYgPSBudWxsOworCQlmb3IgKE1VSUVsZW1lbnQgc3ViTm9kZSA6IHZpc2libGVDaGlsZHJlbikgeworCQkJLy8gQWRkIGEgJ3Nhc2gnIGJldHdlZW4gdGhpcyBub2RlIGFuZCB0aGUgJ3ByZXYnCisJCQlpZiAocHJldiAhPSBudWxsKSB7CisJCQkJUmVjdGFuZ2xlIHNhc2hSZWN0ID0gc2FzaENvbnRhaW5lci5pc0hvcml6b250YWwoKSA/IG5ldyBSZWN0YW5nbGUoCisJCQkJCQl0aWxlUG9zLCBib3VuZHMueSwgc2FzaFdpZHRoLCBib3VuZHMuaGVpZ2h0KQorCQkJCQkJOiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy54LCB0aWxlUG9zLCBib3VuZHMud2lkdGgsCisJCQkJCQkJCXNhc2hXaWR0aCk7CisJCQkJc2FzaGVzLmFkZChuZXcgU2FzaFJlY3Qoc2FzaFJlY3QsIHNhc2hDb250YWluZXIsIHByZXYsIHN1Yk5vZGUpKTsKKwkJCQlob3N0LnJlZHJhdyhzYXNoUmVjdC54LCBzYXNoUmVjdC55LCBzYXNoUmVjdC53aWR0aCwKKwkJCQkJCXNhc2hSZWN0LmhlaWdodCwgZmFsc2UpOworCQkJCXRpbGVQb3MgKz0gc2FzaFdpZHRoOworCQkJfQorCisJCQkvLyBDYWxjIHRoZSBuZXcgc2l6ZSBhcyBhICUnYWdlIG9mIHRoZSB0b3RhbAorCQkJZG91YmxlIHJhdGlvID0gZ2V0V2VpZ2h0KHN1Yk5vZGUpIC8gdG90YWxXZWlnaHQ7CisJCQlpbnQgbmV3U2l6ZSA9IChpbnQpICgoYXZhaWxhYmxlV2lkdGggKiByYXRpbykgKyAwLjUpOworCisJCQlSZWN0YW5nbGUgc3ViQm91bmRzID0gc2FzaENvbnRhaW5lci5pc0hvcml6b250YWwoKSA/IG5ldyBSZWN0YW5nbGUoCisJCQkJCXRpbGVQb3MsIGJvdW5kcy55LCBuZXdTaXplLCBib3VuZHMuaGVpZ2h0KSA6IG5ldyBSZWN0YW5nbGUoCisJCQkJCWJvdW5kcy54LCB0aWxlUG9zLCBib3VuZHMud2lkdGgsIG5ld1NpemUpOworCQkJdGlsZVBvcyArPSBuZXdTaXplOworCisJCQl0aWxlU3ViTm9kZXMoc3ViQm91bmRzLCBzdWJOb2RlKTsKKwkJCXByZXYgPSBzdWJOb2RlOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcGFyYW0gYm91bmRzCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFJlY3RhbmdsZShNVUlFbGVtZW50IG5vZGUsIFJlY3RhbmdsZSBib3VuZHMpIHsKKwkJaWYgKG5vZGUuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sKSB7CisJCQlDb250cm9sIGN0cmwgPSAoQ29udHJvbCkgbm9kZS5nZXRXaWRnZXQoKTsKKwkJCWN0cmwuc2V0Qm91bmRzKGJvdW5kcyk7CisJCX0gZWxzZSBpZiAobm9kZS5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgeworCQkJUmVjdGFuZ2xlIHRoZVJlY3QgPSAoUmVjdGFuZ2xlKSBub2RlLmdldFdpZGdldCgpOworCQkJdGhlUmVjdC54ID0gYm91bmRzLng7CisJCQl0aGVSZWN0LnkgPSBib3VuZHMueTsKKwkJCXRoZVJlY3Qud2lkdGggPSBib3VuZHMud2lkdGg7CisJCQl0aGVSZWN0LmhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7CisJCX0KKwl9CisKKwlwcml2YXRlIExpc3Q8TVVJRWxlbWVudD4gZ2V0VmlzaWJsZUNoaWxkcmVuKE1HZW5lcmljVGlsZTw/PiBzYXNoQ29udGFpbmVyKSB7CisJCUxpc3Q8TVVJRWxlbWVudD4gdmlzS2lkcyA9IG5ldyBBcnJheUxpc3Q8TVVJRWxlbWVudD4oKTsKKwkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogc2FzaENvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoY2hpbGQuaXNUb0JlUmVuZGVyZWQoKSAmJiBjaGlsZC5pc1Zpc2libGUoKSkKKwkJCQl2aXNLaWRzLmFkZChjaGlsZCk7CisJCX0KKwkJcmV0dXJuIHZpc0tpZHM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IGdldFdlaWdodChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJU3RyaW5nIGluZm8gPSBlbGVtZW50LmdldENvbnRhaW5lckRhdGEoKTsKKwkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdHJ5IHsKKwkJCWludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoaW5mbyk7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Nhc2hSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvU2FzaFJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViZWJlNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Nhc2hSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDQxMTUwLCA0NDExMjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5VSUV2ZW50VG9waWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKKworLyoqCisgKiBEZWZhdWx0IFNXVCByZW5kZXJlciByZXNwb25zaWJsZSBmb3IgYSBNUGFydFNhc2hDb250YWluZXIuIFNlZQorICoge0BsaW5rIFdvcmtiZW5jaFJlbmRlcmVyRmFjdG9yeX0KKyAqLworcHVibGljIGNsYXNzIFNhc2hSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEX1dFSUdIVCA9IC0xOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dFSUdIVCA9IDUwMDA7CisKKwlwcml2YXRlIGludCBwcm9jZXNzZWRDb250ZW50ID0gMDsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNPcmllbnRhdGlvbkNoYW5nZWQoQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5HZW5lcmljVGlsZS5UT1BJQ19IT1JJWk9OVEFMKSBFdmVudCBldmVudCkgeworCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1QYXJ0U2FzaENvbnRhaW5lcgorCQlNVUlFbGVtZW50IGVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAoZWxlbWVudC5nZXRSZW5kZXJlcigpICE9IFNhc2hSZW5kZXJlci50aGlzKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yY2VMYXlvdXQoKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSBlbGVtZW50KTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljU2FzaFdlaWdodENoYW5nZWQoQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5VSUVsZW1lbnQuVE9QSUNfQ09OVEFJTkVSREFUQSkgRXZlbnQgZXZlbnQpIHsKKwkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNUGFydFNhc2hDb250YWluZXIKKwkJTVVJRWxlbWVudCBlbGVtZW50ID0gKE1VSUVsZW1lbnQpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJaWYgKGVsZW1lbnQuZ2V0UmVuZGVyZXIoKSAhPSBTYXNoUmVuZGVyZXIudGhpcykgeworCQkJcmV0dXJuOworCQl9CisJCWZvcmNlTGF5b3V0KChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PikgZWxlbWVudCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBzY01vZGVsCisJICovCisJcHJvdGVjdGVkIHZvaWQgZm9yY2VMYXlvdXQoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcHNjTW9kZWwpIHsKKwkJaWYgKHByb2Nlc3NlZENvbnRlbnQgIT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIGxheW91dCB0aGUgY29udGFpbmluZyBDb21wb3NpdGUKKwkJd2hpbGUgKCEocHNjTW9kZWwuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb21wb3NpdGUpKQorCQkJcHNjTW9kZWwgPSBwc2NNb2RlbC5nZXRQYXJlbnQoKTsKKworCQlDb21wb3NpdGUgcyA9IChDb21wb3NpdGUpIHBzY01vZGVsLmdldFdpZGdldCgpOworCQlMYXlvdXQgbGF5b3V0ID0gcy5nZXRMYXlvdXQoKTsKKwkJaWYgKGxheW91dCBpbnN0YW5jZW9mIFNhc2hMYXlvdXQpIHsKKwkJCWlmICgoKFNhc2hMYXlvdXQpIGxheW91dCkubGF5b3V0VXBkYXRlSW5Qcm9ncmVzcykgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlzLmxheW91dCh0cnVlLCB0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJTVVJRWxlbWVudCBlbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKGVsZW1lbnRQYXJlbnQgPT0gbnVsbCAmJiBlbGVtZW50LmdldEN1clNoYXJlZFJlZigpICE9IG51bGwpCisJCQllbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKTsKKworCQlpZiAoZWxlbWVudFBhcmVudCAhPSBudWxsICYmIGVsZW1lbnRQYXJlbnQuZ2V0UmVuZGVyZXIoKSA9PSB0aGlzKSB7CisJCQlSZWN0YW5nbGUgbmV3UmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7CisKKwkJCS8vIElmIG15IGxheW91dCdzIGNvbnRhaW5lciBnZXRzIGRpc3Bvc2VkICd1bmJpbmQnIHRoZSBzYXNoIGVsZW1lbnRzCisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7CisJCQkJKChDb21wb3NpdGUpIHBhcmVudCkuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkJCS8qKgorCQkJCQkgKgorCQkJCQkgKi8KKwkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7CisJCQkJCQllbGVtZW50LnNldFdpZGdldChudWxsKTsKKwkJCQkJCWVsZW1lbnQuc2V0UmVuZGVyZXIobnVsbCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJCXJldHVybiBuZXdSZWN0OworCQl9CisKKwkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBuZXcgUFNDIGFkZGVkICdhYm92ZScgdGhlIHByZXZpb3VzICdyb290JworCQkvLyBzYXNoCisJCUNvbXBvc2l0ZSBzYXNoQ29tcG9zaXRlID0gbnVsbDsKKwkJTVBhcnRTYXNoQ29udGFpbmVyIHBzYyA9IChNUGFydFNhc2hDb250YWluZXIpIGVsZW1lbnQ7CisJCWZvciAoTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCBwc2NlIDogcHNjLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChwc2NlIGluc3RhbmNlb2YgTVBhcnRTYXNoQ29udGFpbmVyCisJCQkJCSYmIHBzY2UuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKKwkJCQkvLyAnQWRvcHQnIHRoZSBwcmV2aW91cyByb290J3MgbGF5b3V0IC8gY29tcG9zaXRlCisJCQkJc2FzaENvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHBzY2UuZ2V0V2lkZ2V0KCk7CisJCQkJYmluZFdpZGdldChwc2NlLCBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKTsKKwkJCX0KKwkJfQorCQkvLyBUaGlzIGlzIGEgJ3Jvb3QnIHNhc2ggY29udGFpbmVyLCBjcmVhdGUgYSBjb21wb3NpdGUKKwkJaWYgKHNhc2hDb21wb3NpdGUgPT0gbnVsbCkKKwkJCXNhc2hDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKChDb21wb3NpdGUpIHBhcmVudCwgU1dULk5PTkUpOworCQlzYXNoQ29tcG9zaXRlLnNldExheW91dChuZXcgU2FzaExheW91dChzYXNoQ29tcG9zaXRlLCBlbGVtZW50KSk7CisKKwkJcmV0dXJuIHNhc2hDb21wb3NpdGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hpbGRSZW5kZXJlZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyLmNoaWxkUmVuZGVyZWQocGFyZW50RWxlbWVudCwgZWxlbWVudCk7CisKKwkJLy8gRW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQncyAnY29udGFpbmVySW5mbycgaXMgaW5pdGlhbGl6ZWQKKwkJaW50IHdlaWdodCA9IGdldFdlaWdodChlbGVtZW50KTsKKwkJaWYgKHdlaWdodCA9PSBVTkRFRklORURfV0VJR0hUKSB7CisJCQllbGVtZW50LnNldENvbnRhaW5lckRhdGEoSW50ZWdlci50b1N0cmluZyhERUZBVUxUX1dFSUdIVCkpOworCQl9CisKKwkJZm9yY2VMYXlvdXQocGFyZW50RWxlbWVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRlbnRzKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNvbnRhaW5lcikgeworCQl0cnkgeworCQkJcHJvY2Vzc2VkQ29udGVudCsrOworCQkJc3VwZXIucHJvY2Vzc0NvbnRlbnRzKGNvbnRhaW5lcik7CisJCX0gZmluYWxseSB7CisJCQlwcm9jZXNzZWRDb250ZW50LS07CisJCQlpZiAocHJvY2Vzc2VkQ29udGVudCA9PSAwKSB7CisJCQkJZm9yY2VMYXlvdXQoY29udGFpbmVyKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVDaGlsZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBjaGlsZCkgeworCQlzdXBlci5oaWRlQ2hpbGQocGFyZW50RWxlbWVudCwgY2hpbGQpOworCisJCWZvcmNlTGF5b3V0KHBhcmVudEVsZW1lbnQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VUlDb250YWluZXIoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCS8vIE9LLCBmaW5kIHRoZSAncm9vdCcgb2YgdGhlIHNhc2ggY29udGFpbmVyCisJCU1VSUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCXdoaWxlIChwYXJlbnRFbGVtZW50LmdldFJlbmRlcmVyKCkgPT0gdGhpcworCQkJCSYmICEocGFyZW50RWxlbWVudC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkpCisJCQlwYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudC5nZXRQYXJlbnQoKTsKKworCQlpZiAocGFyZW50RWxlbWVudC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKKwkJCXJldHVybiBwYXJlbnRFbGVtZW50LmdldFdpZGdldCgpOworCisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgc3RhdGljIGludCBnZXRXZWlnaHQoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCVN0cmluZyBpbmZvID0gZWxlbWVudC5nZXRDb250YWluZXJEYXRhKCk7CisJCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5sZW5ndGgoKSA9PSAwKSB7CisJCQllbGVtZW50LnNldENvbnRhaW5lckRhdGEoSW50ZWdlci50b1N0cmluZygxMDAwMCkpOworCQkJaW5mbyA9IGVsZW1lbnQuZ2V0Q29udGFpbmVyRGF0YSgpOworCQl9CisKKwkJdHJ5IHsKKwkJCWludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoaW5mbyk7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gVU5ERUZJTkVEX1dFSUdIVDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1NlcGFyYXRvclJlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TZXBhcmF0b3JSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzU0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TZXBhcmF0b3JSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhclNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworCisvKioKKyAqIENyZWF0ZSBhIGNvbnRyaWJ1dGUgcGFydC4KKyAqLworcHVibGljIGNsYXNzIFNlcGFyYXRvclJlbmRlcmVyIGV4dGVuZHMgU1dUUGFydFJlbmRlcmVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlV2lkZ2V0KGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlXaWRnZXQgbmV3U2VwID0gbnVsbDsKKwkJaWYgKCFlbGVtZW50LmlzVmlzaWJsZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpbnQgb2JqSW5kZXggPSBjYWxjSW5kZXgoZWxlbWVudCk7CisJCWludCBhZGRJbmRleCA9IGNhbGNWaXNpYmxlSW5kZXgoZWxlbWVudCk7CisJCU1VSUVsZW1lbnQgbmV4dFZpc2libGVDaGlsZCA9IGdldE5leHRWaXNpYmxlQ2hpbGQoZWxlbWVudCwgb2JqSW5kZXgpOworCQlpZiAoYWRkSW5kZXggPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKG5leHRWaXNpYmxlQ2hpbGQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKG5leHRWaXNpYmxlQ2hpbGQuaXNWaXNpYmxlKCkKKwkJCQkmJiAobmV4dFZpc2libGVDaGlsZCBpbnN0YW5jZW9mIE1Ub29sQmFyU2VwYXJhdG9yKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvcikgeworCQkJVG9vbEJhciB0YiA9IHBhcmVudCBpbnN0YW5jZW9mIFRvb2xCYXIgPyAoVG9vbEJhcikgcGFyZW50CisJCQkJCTogKFRvb2xCYXIpIGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0V2lkZ2V0KCk7CisJCQluZXdTZXAgPSBuZXcgVG9vbEl0ZW0odGIsIFNXVC5TRVBBUkFUT1IsIGFkZEluZGV4KTsKKwkJfQorCisJCXJldHVybiBuZXdTZXA7CisJfQorCisJTVVJRWxlbWVudCBnZXROZXh0VmlzaWJsZUNoaWxkKGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgaW50IG9iakluZGV4KSB7CisJCUxpc3Q8TVVJRWxlbWVudD4gY2hpbGRyZW4gPSBlbGVtZW50LmdldFBhcmVudCgpLmdldENoaWxkcmVuKCk7CisJCWZvciAoaW50IGkgPSBvYmpJbmRleCArIDE7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJTVVJRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuLmdldChpKTsKKwkJCWlmIChjaGlsZC5pc1Zpc2libGUoKSkgeworCQkJCXJldHVybiBjaGlsZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TdGFja1JlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9TdGFja1JlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwZjgyMwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1N0YWNrUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDE4NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQHZvZ2VsbGEuY29tPiAtIEJ1ZyA0Mjk3MjgsIDQzMDE2NiwgNDQxMTUwLCA0NDIyODUKKyAqICAgICBBbmRyZXkgTG9za3V0b3YgPGxvc2t1dG92QGdteC5kZT4gLSBCdWcgMzM3NTg4LCAzODg0NzYsIDQ2MTU3MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLlByZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLlVJRXZlbnRUb3BpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guT3BhcXVlRWxlbWVudFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnJlbmRlcmVycy5zd3QuQmFzaWNQYXJ0TGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC5TV1RSZW5kZXJlcnNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkFic3RyYWN0UGFydFJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQ1NTQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1EaXJ0eWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGxhY2Vob2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTUNvbXBvc2l0ZVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTYXNoQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVN0YWNrRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVByZXNlbnRhdGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLkV2ZW50VGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRVBhcnRTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JU2F2ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5MZWdhY3lBY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVEZXRlY3RFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVEZXRlY3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Nb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CisKKy8qKgorICogU1dUIGRlZmF1bHQgcmVuZGVyZXIgZm9yIGEgTVBhcnRTdGFjayBtb2RlbCBlbGVtZW50cworICoKKyAqIFN0eWxlIGJpdHMgZm9yIHRoZSB1bmRlcmx5aW5nIENUYWJGb2xkZXIgY2FuIGJlIHNldCB2aWEgdGhlCisgKiBJUHJlc2VudGF0aW9uLlNUWUxFX09WRVJSSURFX0tFWSBrZXkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFja1JlbmRlcmVyIGV4dGVuZHMgTGF6eVN0YWNrUmVuZGVyZXIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHsKKwkvKioKKwkgKgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVfUEFSVF9LRVkgPSAidGhlUGFydCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEtleSB0byBjb250cm9sIHRoZSBkZWZhdWx0IGRlZmF1bHQgdmFsdWUgb2YgdGhlICJtb3N0IHJlY2VudGx5IHVzZWQiCisJICogb3JkZXIgZW5hYmxlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1SVV9LRVlfREVGQVVMVCA9ICJlbmFibGVNUlVEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogS2V5IHRvIGNvbnRyb2wgdGhlIGFjdHVhbCBib29sZWFuIHByZWZlcmVuY2Ugb2YgdGhlICJtb3N0IHJlY2VudGx5IHVzZWQiCisJICogb3JkZXIgZW5hYmxlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1SVV9LRVkgPSAiZW5hYmxlTVJVIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogS2V5IHRvIHN3aXRjaCBpZiB0aGUgIm1vc3QgcmVjZW50bHkgdXNlZCIgYmVoYXZpb3IgY29udHJvbGxlZCB2aWEgQ1NTIG9yCisJICogcHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNUlVfQ09OVFJPTExFRF9CWV9DU1NfS0VZID0gIk1SVUNvbnRyb2xsZWRCeUNTUyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIERlZmF1bHQgZGVmYXVsdCB2YWx1ZSBmb3IgTVJVIGJlaGF2aW9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBNUlVfREVGQVVMVCA9IHRydWU7CisKKwkvKgorCSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuVmlld3NQcmVmZXJlbmNlUGFnZSBjb250cm9scyBjdXJyZW50bHkKKwkgKiB0aGUgTVJVIGJlaGF2aW9yIHZpYSBJRWNsaXBzZVByZWZlcmVuY2VzLCBzbyB0aGF0IENTUyB2YWx1ZXMgZnJvbSB0aGUKKwkgKiB0aGVtZXMgYXJlbid0IHVzZWQuCisJICoKKwkgKiBUT0RPIG9uY2Ugd2UgY2FuIHVzZSBwcmVmZXJlbmNlcyBmcm9tIENTUyAoYW5kIHVwZGF0ZSB0aGUgdmFsdWUgb24gdGhlCisJICogZmx5KSB3ZSBjYW4gc3dpdGNoIHRoaXMgZGVmYXVsdCB0byB0cnVlLCBzZWUgZGlzY3Vzc2lvbiBvbiBidWcgMzg4NDc2LgorCSAqLworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTVJVX0NPTlRST0xMRURfQllfQ1NTX0RFRkFVTFQgPSBmYWxzZTsKKworCUBJbmplY3QKKwlAUHJlZmVyZW5jZShub2RlUGF0aCA9ICJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dCIpCisJcHJpdmF0ZSBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzOworCisJQEluamVjdAorCUBOYW1lZChXb3JrYmVuY2hSZW5kZXJlckZhY3RvcnkuU0hBUkVEX0VMRU1FTlRTX1NUT1JFKQorCU1hcDxNVUlFbGVtZW50LCBTZXQ8TVBsYWNlaG9sZGVyPj4gcmVuZGVyZWRNYXA7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVklFV19NRU5VID0gIlZpZXdNZW51IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEVMTF9DTE9TRV9FRElUT1JTX01FTlUgPSAic2hlbGxfY2xvc2VfZWRpdG9yc19tZW51IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFDS19TRUxFQ1RFRF9QQVJUID0gInN0YWNrX3NlbGVjdGVkX3BhcnQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBZGQgdGhpcyB0YWcgdG8gcHJldmVudCB0aGUgbmV4dCB0YWIncyBhY3RpdmF0aW9uIGZyb20gZ3JhbnRpbmcgZm9jdXMKKwkgKiB0b2FjIHRoZSBwYXJ0LiBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0aGUgZm9jdXMgb24gdGhlIENURiB3aGVuIHRyYXZlcnNpbmcKKwkgKiB0aGUgdGFicyB1c2luZyB0aGUga2V5Ym9hcmQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSElCSVRfRk9DVVMgPSAiSW5oaWJpdEZvY3VzIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gTWluaW11bSBjaGFyYWN0ZXJzIGluIGZvciBzdGFja3Mgb3V0c2lkZSB0aGUgc2hhcmVkIGFyZWEKKwlwcml2YXRlIHN0YXRpYyBpbnQgTUlOX1ZJRVdfQ0hBUlMgPSAxOworCisJLy8gTWluaW11bSBjaGFyYWN0ZXJzIGluIGZvciBzdGFja3MgaW5zaWRlIHRoZSBzaGFyZWQgYXJlYQorCXByaXZhdGUgc3RhdGljIGludCBNSU5fRURJVE9SX0NIQVJTID0gMTU7CisKKwlwcml2YXRlIEltYWdlIHZpZXdNZW51SW1hZ2U7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRXZlbnRCcm9rZXIgZXZlbnRCcm9rZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJUHJlc2VudGF0aW9uRW5naW5lIHJlbmRlcmVyOworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgaXRlbVVwZGF0ZXI7CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBkaXJ0eVVwZGF0ZXI7CisKKwkvKioKKwkgKiBBbiBldmVudCBoYW5kbGVyIGZvciBsaXN0ZW5pbmcgdG8gY2hhbmdlcyB0byB0aGUgc3RhdGUgb2YgdmlldyBtZW51cyBhbmQKKwkgKiBpdHMgY2hpbGQgbWVudSBpdGVtcy4gRGVwZW5kaW5nIG9uIHdoYXQgc3RhdGUgdGhlc2UgaXRlbXMgYXJlIGluLCB0aGUKKwkgKiB2aWV3IG1lbnUgc2hvdWxkIG9yIHNob3VsZCBub3QgYmUgcmVuZGVyZWQgaW4gdGhlIHRhYiBmb2xkZXIuCisJICovCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgdmlld01lbnVVcGRhdGVyOworCisJLyoqCisJICogQW4gZXZlbnQgaGFuZGxlciBmb3IgbGlzdGVuaW5nIHRvIGNoYW5nZXMgdG8gdGhlIGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQKKwkgKiBjb250YWluZXIuIFRoZSB0YWIgZm9sZGVyIG1heSBuZWVkIHRvIGxheW91dCBpdHNlbGYgYWdhaW4gaWYgYSBwYXJ0J3MKKwkgKiB0b29sYmFyIGhhcyBiZWVuIGNoYW5nZWQuCisJICovCisJLy8gcHJpdmF0ZSBFdmVudEhhbmRsZXIgdGFiU3RhdGVIYW5kbGVyOworCisJLy8gTWFuYWdlcyBDU1Mgc3R5bGluZyBiYXNlZCBvbiBhY3RpdmUgcGFydCBjaGFuZ2VzCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgc3R5bGluZ0hhbmRsZXI7CisKKwlwcml2YXRlIGJvb2xlYW4gaWdub3JlVGFiU2VsQ2hhbmdlczsKKworCUxpc3Q8Q1RhYkl0ZW0+IGdldEl0ZW1zVG9TZXQoTVBhcnQgcGFydCkgeworCQlMaXN0PENUYWJJdGVtPiBpdGVtc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxDVGFiSXRlbT4oKTsKKworCQlNVUlFbGVtZW50IHBhcnRQYXJlbnQgPSBwYXJ0LmdldFBhcmVudCgpOworCQlpZiAocGFydFBhcmVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spIHsKKwkJCUNUYWJJdGVtIGl0ZW0gPSBmaW5kSXRlbUZvclBhcnQocGFydCk7CisJCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQkJaXRlbXNUb1NldC5hZGQoZmluZEl0ZW1Gb3JQYXJ0KHBhcnQpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJ0LmdldEN1clNoYXJlZFJlZigpICE9IG51bGwpIHsKKwkJCU1XaW5kb3cgdG9wV2luID0gbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKHBhcnQpOworCQkJTGlzdDxNUGxhY2Vob2xkZXI+IHBhcnRSZWZzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh0b3BXaW4sCisJCQkJCXBhcnQuZ2V0RWxlbWVudElkKCksIE1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCk7CisJCQlmb3IgKE1QbGFjZWhvbGRlciByZWYgOiBwYXJ0UmVmcykgeworCQkJCUNUYWJJdGVtIGl0ZW0gPSBmaW5kSXRlbUZvclBhcnQocmVmLCBudWxsKTsKKwkJCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQkJCWl0ZW1zVG9TZXQuYWRkKGl0ZW0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBpdGVtc1RvU2V0OworCX0KKworCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY1RyYW5zaWVudERhdGFDaGFuZ2VkKAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5BcHBsaWNhdGlvbkVsZW1lbnQuVE9QSUNfVFJBTlNJRU5UREFUQSkgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudCBldmVudCkgeworCQlPYmplY3QgY2hhbmdlZEVsZW1lbnQgPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisKKwkJaWYgKCEoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkpCisJCQlyZXR1cm47CisKKwkJU3RyaW5nIGtleTsKKwkJaWYgKFVJRXZlbnRzLmlzUkVNT1ZFKGV2ZW50KSkgeworCQkJa2V5ID0gKChFbnRyeTxTdHJpbmcsIE9iamVjdD4pIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKSkuZ2V0S2V5KCk7CisJCX0gZWxzZSB7CisJCQlrZXkgPSAoKEVudHJ5PFN0cmluZywgT2JqZWN0PikgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpKS5nZXRLZXkoKTsKKwkJfQorCisJCWlmICghSVByZXNlbnRhdGlvbkVuZ2luZS5PVkVSUklERV9JQ09OX0lNQUdFX0tFWS5lcXVhbHMoa2V5KQorCQkJCSYmICFJUHJlc2VudGF0aW9uRW5naW5lLk9WRVJSSURFX1RJVExFX1RPT0xfVElQX0tFWS5lcXVhbHMoa2V5KSkKKwkJCXJldHVybjsKKworCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBjaGFuZ2VkRWxlbWVudDsKKwkJTGlzdDxDVGFiSXRlbT4gaXRlbXNUb1NldCA9IGdldEl0ZW1zVG9TZXQocGFydCk7CisJCWZvciAoQ1RhYkl0ZW0gaXRlbSA6IGl0ZW1zVG9TZXQpIHsKKwkJCWlmIChrZXkuZXF1YWxzKElQcmVzZW50YXRpb25FbmdpbmUuT1ZFUlJJREVfSUNPTl9JTUFHRV9LRVkpKSB7CisJCQkJaXRlbS5zZXRJbWFnZShnZXRJbWFnZShwYXJ0KSk7CisJCQl9IGVsc2UgaWYgKGtleQorCQkJCQkuZXF1YWxzKElQcmVzZW50YXRpb25FbmdpbmUuT1ZFUlJJREVfVElUTEVfVE9PTF9USVBfS0VZKSkgeworCQkJCVN0cmluZyBuZXdUaXAgPSBnZXRUb29sVGlwKHBhcnQpOworCQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0VG9vbFRpcChuZXdUaXApKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgY2hhbmdlcyBpbiB0YWdzCisJICoKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKi8KKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljVGFnc0NoYW5nZWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLkFwcGxpY2F0aW9uRWxlbWVudC5UT1BJQ19UQUdTKSBFdmVudCBldmVudCkgeworCQlPYmplY3QgY2hhbmdlZE9iaiA9IGV2ZW50LmdldFByb3BlcnR5KEV2ZW50VGFncy5FTEVNRU5UKTsKKworCQlpZiAoIShjaGFuZ2VkT2JqIGluc3RhbmNlb2YgTVBhcnQpKQorCQkJcmV0dXJuOworCisJCWZpbmFsIE1QYXJ0IHBhcnQgPSAoTVBhcnQpIGNoYW5nZWRPYmo7CisJCUNUYWJJdGVtIGl0ZW0gPSBmaW5kSXRlbUZvclBhcnQocGFydCk7CisJCWlmIChpdGVtID09IG51bGwgfHwgaXRlbS5pc0Rpc3Bvc2VkKCkpCisJCQlyZXR1cm47CisKKwkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJaWYgKFVJRXZlbnRzLmNvbnRhaW5zKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFLAorCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLkFET1JOTUVOVF9QSU4pKSB7CisJCQkJaXRlbS5zZXRJbWFnZShnZXRJbWFnZShwYXJ0KSk7CisJCQl9CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQlpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5PTERfVkFMVUUsCisJCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuQURPUk5NRU5UX1BJTikpIHsKKwkJCQlpdGVtLnNldEltYWdlKGdldEltYWdlKHBhcnQpKTsKKwkJCX0KKwkJfQorCX0KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNDaGlsZHJlbkNoYW5nZWQoQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5FbGVtZW50Q29udGFpbmVyLlRPUElDX0NISUxEUkVOKSBFdmVudCBldmVudCkgeworCisJCU9iamVjdCBjaGFuZ2VkT2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkvLyBvbmx5IGludGVyZXN0ZWQgaW4gY2hhbmdlcyB0byB0b29sYmFycworCQlpZiAoIShjaGFuZ2VkT2JqIGluc3RhbmNlb2YgTVRvb2xCYXIpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNVUlFbGVtZW50IGNvbnRhaW5lciA9IG1vZGVsU2VydmljZS5nZXRDb250YWluZXIoKE1VSUVsZW1lbnQpIGNoYW5nZWRPYmopOworCQkvLyBjaGVjayBpZiB0aGlzIGlzIGEgcGFydCdzIHRvb2xiYXIKKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1QYXJ0KSB7CisJCQlNRWxlbWVudENvbnRhaW5lcjw/PiBwYXJlbnQgPSAoKE1QYXJ0KSBjb250YWluZXIpLmdldFBhcmVudCgpOworCQkJLy8gb25seSByZWxheW91dCBpZiB0aGlzIHBhcnQgaXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQgYW5kIHdlCisJCQkvLyBhY3R1YWxseSByZW5kZXJlZCB0aGlzIGVsZW1lbnQKKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrICYmIHBhcmVudC5nZXRTZWxlY3RlZEVsZW1lbnQoKSA9PSBjb250YWluZXIKKwkJCQkJJiYgcGFyZW50LmdldFJlbmRlcmVyKCkgPT0gU3RhY2tSZW5kZXJlci50aGlzKSB7CisJCQkJT2JqZWN0IHdpZGdldCA9IHBhcmVudC5nZXRXaWRnZXQoKTsKKwkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCQlhZGp1c3RUb3BSaWdodCgoQ1RhYkZvbGRlcikgd2lkZ2V0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc0ZvY3VzKE1QYXJ0IGVsZW1lbnQpIHsKKwkJTVVJRWxlbWVudCBpblN0YWNrID0gZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBudWxsID8gZWxlbWVudAorCQkJCS5nZXRDdXJTaGFyZWRSZWYoKSA6IGVsZW1lbnQ7CisJCWlmIChpblN0YWNrLmdldFBhcmVudCgpICE9IG51bGwKKwkJCQkmJiBpblN0YWNrLmdldFBhcmVudCgpLmdldFRyYW5zaWVudERhdGEoKQorCQkJCQkJLmNvbnRhaW5zS2V5KElOSElCSVRfRk9DVVMpKSB7CisJCQlpblN0YWNrLmdldFBhcmVudCgpLmdldFRyYW5zaWVudERhdGEoKS5yZW1vdmUoSU5ISUJJVF9GT0NVUyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gc3VwZXIucmVxdWlyZXNGb2N1cyhlbGVtZW50KTsKKwl9CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCXN1cGVyLmluaXQoZXZlbnRCcm9rZXIpOworCisJCXByZWZlcmVuY2VzLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwkJcHJlZmVyZW5jZUNoYW5nZShudWxsKTsKKworCQkvLyBUT0RPOiBSZWZhY3RvciB1c2luZyBmaW5kSXRlbUZvclBhcnQoTVBhcnQpIG1ldGhvZAorCQlpdGVtVXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJTVVJRWxlbWVudCBlbGVtZW50ID0gKE1VSUVsZW1lbnQpIGV2ZW50CisJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkpCisJCQkJCXJldHVybjsKKworCQkJCU1QYXJ0IHBhcnQgPSAoTVBhcnQpIGVsZW1lbnQ7CisKKwkJCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGV2ZW50CisJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkFUVE5BTUUpOworCQkJCU9iamVjdCBuZXdWYWx1ZSA9IGV2ZW50CisJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSk7CisKKwkJCQkvLyBpcyB0aGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBzdGFjaz8KKwkJCQlpZiAoZWxlbWVudC5nZXRQYXJlbnQoKSAhPSBudWxsCisJCQkJCQkmJiBlbGVtZW50LmdldFBhcmVudCgpLmdldFJlbmRlcmVyKCkgPT0gU3RhY2tSZW5kZXJlci50aGlzKSB7CisJCQkJCUNUYWJJdGVtIGN0aSA9IGZpbmRJdGVtRm9yUGFydChlbGVtZW50LCBlbGVtZW50LmdldFBhcmVudCgpKTsKKwkJCQkJaWYgKGN0aSAhPSBudWxsKSB7CisJCQkJCQl1cGRhdGVUYWIoY3RpLCBwYXJ0LCBhdHROYW1lLCBuZXdWYWx1ZSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8vIERvIHdlIGhhdmUgYW55IHN0YWNrcyB3aXRoIHBsYWNlIGhvbGRlcnMgZm9yIHRoZSBlbGVtZW50CisJCQkJLy8gdGhhdCdzIGNoYW5nZWQ/CisJCQkJTVdpbmRvdyB3aW4gPSBtb2RlbFNlcnZpY2UuZ2V0VG9wTGV2ZWxXaW5kb3dGb3IocGFydCk7CisJCQkJTGlzdDxNUGxhY2Vob2xkZXI+IHJlZnMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHdpbiwgbnVsbCwKKwkJCQkJCU1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCk7CisJCQkJaWYgKHJlZnMgIT0gbnVsbCkgeworCQkJCQlmb3IgKE1QbGFjZWhvbGRlciByZWYgOiByZWZzKSB7CisJCQkJCQlpZiAocmVmLmdldFJlZigpICE9IHBhcnQpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHJlZlBhcmVudCA9IHJlZgorCQkJCQkJCQkuZ2V0UGFyZW50KCk7CisJCQkJCQkvLyBjYW4gYmUgbnVsbCwgc2VlIGJ1ZyAzMjgyOTYKKwkJCQkJCWlmIChyZWZQYXJlbnQgIT0gbnVsbAorCQkJCQkJCQkmJiByZWZQYXJlbnQuZ2V0UmVuZGVyZXIoKSBpbnN0YW5jZW9mIFN0YWNrUmVuZGVyZXIpIHsKKwkJCQkJCQlDVGFiSXRlbSBjdGkgPSBmaW5kSXRlbUZvclBhcnQocmVmLCByZWZQYXJlbnQpOworCQkJCQkJCWlmIChjdGkgIT0gbnVsbCkgeworCQkJCQkJCQl1cGRhdGVUYWIoY3RpLCBwYXJ0LCBhdHROYW1lLCBuZXdWYWx1ZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5VSUxhYmVsLlRPUElDX0FMTCwgaXRlbVVwZGF0ZXIpOworCisJCS8vIFRPRE86IFJlZmFjdG9yIHVzaW5nIGZpbmRJdGVtRm9yUGFydChNUGFydCkgbWV0aG9kCisJCWRpcnR5VXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0IG9iakVsZW1lbnQgPSBldmVudAorCQkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKworCQkJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTU1lbnVJdGVtCisJCQkJaWYgKCEob2JqRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLy8gRXh0cmFjdCB0aGUgZGF0YSBiaXRzCisJCQkJTVBhcnQgcGFydCA9IChNUGFydCkgb2JqRWxlbWVudDsKKworCQkJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQKKwkJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuQVRUTkFNRSk7CisJCQkJT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQKKwkJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFKTsKKworCQkJCS8vIElzIHRoZSBwYXJ0IGRpcmVjdGx5IHVuZGVyIHRoZSBzdGFjaz8KKwkJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBwYXJ0LmdldFBhcmVudCgpOworCQkJCWlmIChwYXJlbnQgIT0gbnVsbAorCQkJCQkJJiYgcGFyZW50LmdldFJlbmRlcmVyKCkgPT0gU3RhY2tSZW5kZXJlci50aGlzKSB7CisJCQkJCUNUYWJJdGVtIGN0aSA9IGZpbmRJdGVtRm9yUGFydChwYXJ0LCBwYXJlbnQpOworCQkJCQlpZiAoY3RpICE9IG51bGwpIHsKKwkJCQkJCXVwZGF0ZVRhYihjdGksIHBhcnQsIGF0dE5hbWUsIG5ld1ZhbHVlKTsKKwkJCQkJfQorCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLy8gRG8gd2UgaGF2ZSBhbnkgc3RhY2tzIHdpdGggcGxhY2UgaG9sZGVycyBmb3IgdGhlIGVsZW1lbnQKKwkJCQkvLyB0aGF0J3MgY2hhbmdlZD8KKwkJCQlTZXQ8TVBsYWNlaG9sZGVyPiByZWZzID0gcmVuZGVyZWRNYXAuZ2V0KHBhcnQpOworCQkJCWlmIChyZWZzICE9IG51bGwpIHsKKwkJCQkJZm9yIChNUGxhY2Vob2xkZXIgcmVmIDogcmVmcykgeworCQkJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcmVmUGFyZW50ID0gcmVmCisJCQkJCQkJCS5nZXRQYXJlbnQoKTsKKwkJCQkJCWlmIChyZWZQYXJlbnQuZ2V0UmVuZGVyZXIoKSBpbnN0YW5jZW9mIFN0YWNrUmVuZGVyZXIpIHsKKwkJCQkJCQlDVGFiSXRlbSBjdGkgPSBmaW5kSXRlbUZvclBhcnQocmVmLCByZWZQYXJlbnQpOworCQkJCQkJCWlmIChjdGkgIT0gbnVsbCkgeworCQkJCQkJCQl1cGRhdGVUYWIoY3RpLCBwYXJ0LCBhdHROYW1lLCBuZXdWYWx1ZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5idWlsZFRvcGljKFVJRXZlbnRzLkRpcnR5YWJsZS5UT1BJQywKKwkJCQlVSUV2ZW50cy5EaXJ0eWFibGUuRElSVFkpLCBkaXJ0eVVwZGF0ZXIpOworCisJCXZpZXdNZW51VXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0IG9iakVsZW1lbnQgPSBldmVudAorCQkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKworCQkJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTU1lbnVJdGVtCisJCQkJaWYgKCEob2JqRWxlbWVudCBpbnN0YW5jZW9mIE1NZW51RWxlbWVudCkpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8vIEVuc3VyZSB0aGF0IGl0J3MgYSBWaWV3IHBhcnQncyBtZW51CisJCQkJTU1lbnVFbGVtZW50IG1lbnVNb2RlbCA9IChNTWVudUVsZW1lbnQpIG9iakVsZW1lbnQ7CisJCQkJTVVJRWxlbWVudCBtZW51UGFyZW50ID0gbW9kZWxTZXJ2aWNlLmdldENvbnRhaW5lcihtZW51TW9kZWwpOworCQkJCWlmICghKG1lbnVQYXJlbnQgaW5zdGFuY2VvZiBNUGFydCkpCisJCQkJCXJldHVybjsKKworCQkJCU1QYXJ0IGVsZW1lbnQgPSAoTVBhcnQpIG1lbnVQYXJlbnQ7CisJCQkJTVVJRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7CisJCQkJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IGVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQkJCWlmIChwbGFjZWhvbGRlciA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKworCQkJCQlwYXJlbnRFbGVtZW50ID0gcGxhY2Vob2xkZXIuZ2V0UGFyZW50KCk7CisJCQkJCWlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpIHsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKworCQkJCU9iamVjdCB3aWRnZXQgPSBwYXJlbnRFbGVtZW50LmdldFdpZGdldCgpOworCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJCWFkanVzdFRvcFJpZ2h0KChDVGFiRm9sZGVyKSB3aWRnZXQpOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJZXZlbnRCcm9rZXIKKwkJCQkuc3Vic2NyaWJlKFVJRXZlbnRzLlVJRWxlbWVudC5UT1BJQ19WSVNJQkxFLCB2aWV3TWVudVVwZGF0ZXIpOworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuVUlFbGVtZW50LlRPUElDX1RPQkVSRU5ERVJFRCwKKwkJCQl2aWV3TWVudVVwZGF0ZXIpOworCisKKwkJc3R5bGluZ0hhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCU1VSUVsZW1lbnQgY2hhbmdlZCA9IChNVUlFbGVtZW50KSBldmVudAorCQkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCQlpZiAoIShjaGFuZ2VkIGluc3RhbmNlb2YgTVBhcnQpKQorCQkJCQlyZXR1cm47CisKKwkJCQlNUGFydCBuZXdBY3RpdmVQYXJ0ID0gKE1QYXJ0KSBjaGFuZ2VkOworCQkJCU1VSUVsZW1lbnQgcGFydFBhcmVudCA9IG5ld0FjdGl2ZVBhcnQuZ2V0UGFyZW50KCk7CisJCQkJaWYgKHBhcnRQYXJlbnQgPT0gbnVsbAorCQkJCQkJJiYgbmV3QWN0aXZlUGFydC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBudWxsKQorCQkJCQlwYXJ0UGFyZW50ID0gbmV3QWN0aXZlUGFydC5nZXRDdXJTaGFyZWRSZWYoKS5nZXRQYXJlbnQoKTsKKworCQkJCS8vIFNraXAgc2FzaCBjb250YWluZXJzCisJCQkJd2hpbGUgKHBhcnRQYXJlbnQgIT0gbnVsbAorCQkJCQkJJiYgcGFydFBhcmVudCBpbnN0YW5jZW9mIE1QYXJ0U2FzaENvbnRhaW5lcikKKwkJCQkJcGFydFBhcmVudCA9IHBhcnRQYXJlbnQuZ2V0UGFyZW50KCk7CisKKwkJCQkvLyBFbnN1cmUgdGhlIHN0YWNrIG9mIGEgc3BsaXQgcGFydCBnZXRzIHVwZGF0ZWQgd2hlbiBvbmUKKwkJCQkvLyBvZiBpdHMgaW50ZXJuYWwgcGFydHMgZ2V0cyBhY3RpdmF0ZWQKKwkJCQlpZiAocGFydFBhcmVudCBpbnN0YW5jZW9mIE1Db21wb3NpdGVQYXJ0KSB7CisJCQkJCXBhcnRQYXJlbnQgPSBwYXJ0UGFyZW50LmdldFBhcmVudCgpOworCQkJCX0KKworCQkJCU1QYXJ0U3RhY2sgcFN0YWNrID0gKE1QYXJ0U3RhY2spIChwYXJ0UGFyZW50IGluc3RhbmNlb2YgTVBhcnRTdGFjayA/IHBhcnRQYXJlbnQKKwkJCQkJCTogbnVsbCk7CisKKwkJCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJCXRhZ3MuYWRkKENTU0NvbnN0YW50cy5DU1NfQUNUSVZFX0NMQVNTKTsKKwkJCQlMaXN0PE1VSUVsZW1lbnQ+IGFjdGl2ZUVsZW1lbnRzID0gbW9kZWxTZXJ2aWNlCisJCQkJCQkuZmluZEVsZW1lbnRzKG1vZGVsU2VydmljZS5nZXRUb3BMZXZlbFdpbmRvd0ZvcihuZXdBY3RpdmVQYXJ0KSwgbnVsbCwKKwkJCQkJCU1VSUVsZW1lbnQuY2xhc3MsIHRhZ3MpOworCQkJCWZvciAoTVVJRWxlbWVudCBlbGVtZW50IDogYWN0aXZlRWxlbWVudHMpIHsKKwkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrICYmIGVsZW1lbnQgIT0gcFN0YWNrKSB7CisJCQkJCQlzdHlsZUVsZW1lbnQoZWxlbWVudCwgZmFsc2UpOworCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydAorCQkJCQkJCSYmIGVsZW1lbnQgIT0gbmV3QWN0aXZlUGFydCkgeworCQkJCQkJc3R5bGVFbGVtZW50KGVsZW1lbnQsIGZhbHNlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChwU3RhY2sgIT0gbnVsbCkKKwkJCQkJc3R5bGVFbGVtZW50KHBTdGFjaywgdHJ1ZSk7CisJCQkJc3R5bGVFbGVtZW50KG5ld0FjdGl2ZVBhcnQsIHRydWUpOworCQkJfQorCQl9OworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuVUlMaWZlQ3ljbGUuQUNUSVZBVEUsIHN0eWxpbmdIYW5kbGVyKTsKKworCQkvLyB0YWJTdGF0ZUhhbmRsZXIgPSBuZXcgVGFiU3RhdGVIYW5kbGVyKCk7CisJCS8vIGV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5BcHBsaWNhdGlvbkVsZW1lbnQuVE9QSUNfVEFHUywKKwkJLy8gdGFiU3RhdGVIYW5kbGVyKTsKKwkJLy8gZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkVsZW1lbnRDb250YWluZXIuVE9QSUNfU0VMRUNURURFTEVNRU5ULAorCQkvLyB0YWJTdGF0ZUhhbmRsZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYihDVGFiSXRlbSBjdGksIE1QYXJ0IHBhcnQsIFN0cmluZyBhdHROYW1lLAorCQkJT2JqZWN0IG5ld1ZhbHVlKSB7CisJCWlmIChVSUV2ZW50cy5VSUxhYmVsLkxBQkVMLmVxdWFscyhhdHROYW1lKQorCQkJCXx8IFVJRXZlbnRzLlVJTGFiZWwuTE9DQUxJWkVEX0xBQkVMLmVxdWFscyhhdHROYW1lKSkgeworCQkJU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBuZXdWYWx1ZTsKKwkJCWN0aS5zZXRUZXh0KGdldExhYmVsKHBhcnQsIG5ld05hbWUpKTsKKwkJfSBlbHNlIGlmIChVSUV2ZW50cy5VSUxhYmVsLklDT05VUkkuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQljdGkuc2V0SW1hZ2UoZ2V0SW1hZ2UocGFydCkpOworCQl9IGVsc2UgaWYgKFVJRXZlbnRzLlVJTGFiZWwuVE9PTFRJUC5lcXVhbHMoYXR0TmFtZSkKKwkJCQl8fCBVSUV2ZW50cy5VSUxhYmVsLkxPQ0FMSVpFRF9UT09MVElQLmVxdWFscyhhdHROYW1lKSkgeworCQkJU3RyaW5nIG5ld1RUaXAgPSAoU3RyaW5nKSBuZXdWYWx1ZTsKKwkJCWN0aS5zZXRUb29sVGlwVGV4dChnZXRUb29sVGlwKG5ld1RUaXApKTsKKwkJfSBlbHNlIGlmIChVSUV2ZW50cy5EaXJ0eWFibGUuRElSVFkuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQlCb29sZWFuIGRpcnR5U3RhdGUgPSAoQm9vbGVhbikgbmV3VmFsdWU7CisJCQlTdHJpbmcgdGV4dCA9IGN0aS5nZXRUZXh0KCk7CisJCQlib29sZWFuIGhhc0FzdGVyaXNrID0gdGV4dC5sZW5ndGgoKSA+IDAgJiYgdGV4dC5jaGFyQXQoMCkgPT0gJyonOworCQkJaWYgKGRpcnR5U3RhdGUuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQlpZiAoIWhhc0FzdGVyaXNrKSB7CisJCQkJCWN0aS5zZXRUZXh0KCcqJyArIHRleHQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoaGFzQXN0ZXJpc2spIHsKKwkJCQljdGkuc2V0VGV4dCh0ZXh0LnN1YnN0cmluZygxKSk7CisJCQl9CisJCX0KKwl9CisKKwlAUHJlRGVzdHJveQorCXB1YmxpYyB2b2lkIGNvbnRleHREaXNwb3NlZCgpIHsKKwkJc3VwZXIuY29udGV4dERpc3Bvc2VkKGV2ZW50QnJva2VyKTsKKworCQlldmVudEJyb2tlci51bnN1YnNjcmliZShpdGVtVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGRpcnR5VXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHZpZXdNZW51VXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHN0eWxpbmdIYW5kbGVyKTsKKwkJLy8gZXZlbnRCcm9rZXIudW5zdWJzY3JpYmUodGFiU3RhdGVIYW5kbGVyKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRMYWJlbChNVUlMYWJlbCBpdGVtUGFydCwgU3RyaW5nIG5ld05hbWUpIHsKKwkJaWYgKG5ld05hbWUgPT0gbnVsbCkgeworCQkJbmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQluZXdOYW1lID0gTGVnYWN5QWN0aW9uVG9vbHMuZXNjYXBlTW5lbW9uaWNzKG5ld05hbWUpOworCQl9CisKKwkJaWYgKGl0ZW1QYXJ0IGluc3RhbmNlb2YgTURpcnR5YWJsZSAmJiAoKE1EaXJ0eWFibGUpIGl0ZW1QYXJ0KS5pc0RpcnR5KCkpIHsKKwkJCW5ld05hbWUgPSAnKicgKyBuZXdOYW1lOworCQl9CisJCXJldHVybiBuZXdOYW1lOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFRvb2xUaXAoU3RyaW5nIG5ld1Rvb2xUaXApIHsKKwkJcmV0dXJuIG5ld1Rvb2xUaXAgPT0gbnVsbCB8fCBuZXdUb29sVGlwLmxlbmd0aCgpID09IDAgPyBudWxsCisJCQkJOiBMZWdhY3lBY3Rpb25Ub29scy5lc2NhcGVNbmVtb25pY3MobmV3VG9vbFRpcCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkpCisJCQlyZXR1cm4gbnVsbDsKKworCQlNUGFydFN0YWNrIHBTdGFjayA9IChNUGFydFN0YWNrKSBlbGVtZW50OworCisJCUNvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBwYXJlbnQ7CisKKwkJLy8gRW5zdXJlIHRoYXQgYWxsIHJlbmRlcmVkIFBhcnRTdGFja3MgaGF2ZSBhbiBJZAorCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50SWQoKSA9PSBudWxsCisJCQkJfHwgZWxlbWVudC5nZXRFbGVtZW50SWQoKS5sZW5ndGgoKSA9PSAwKSB7CisJCQlTdHJpbmcgZ2VuZXJhdGVkSWQgPSAiUGFydFN0YWNrQCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGVsZW1lbnQuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWVsZW1lbnQuc2V0RWxlbWVudElkKGdlbmVyYXRlZElkKTsKKwkJfQorCisJCWludCBzdHlsZU92ZXJyaWRlID0gZ2V0U3R5bGVPdmVycmlkZShwU3RhY2spOworCQlpbnQgc3R5bGUgPSBzdHlsZU92ZXJyaWRlID09IC0xID8gU1dULkJPUkRFUiA6IHN0eWxlT3ZlcnJpZGU7CisJCWZpbmFsIENUYWJGb2xkZXIgY3RmID0gbmV3IENUYWJGb2xkZXIocGFyZW50Q29tcG9zaXRlLCBzdHlsZSk7CisJCWN0Zi5zZXRNUlVWaXNpYmxlKGdldE1SVVZhbHVlKGN0ZikpOworCisJCS8vIEFkanVzdCB0aGUgbWluaW11bSBjaGFycyBiYXNlZCBvbiB0aGUgbG9jYXRpb24KKwkJaW50IGxvY2F0aW9uID0gbW9kZWxTZXJ2aWNlLmdldEVsZW1lbnRMb2NhdGlvbihlbGVtZW50KTsKKwkJaWYgKChsb2NhdGlvbiAmIEVNb2RlbFNlcnZpY2UuSU5fU0hBUkVEX0FSRUEpICE9IDApIHsKKwkJCWN0Zi5zZXRNaW5pbXVtQ2hhcmFjdGVycyhNSU5fRURJVE9SX0NIQVJTKTsKKwkJCWN0Zi5zZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKHRydWUpOworCQl9IGVsc2UgeworCQkJY3RmLnNldE1pbmltdW1DaGFyYWN0ZXJzKE1JTl9WSUVXX0NIQVJTKTsKKwkJCWN0Zi5zZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKGZhbHNlKTsKKwkJfQorCisJCWJpbmRXaWRnZXQoZWxlbWVudCwgY3RmKTsgLy8gPz8gRG8gd2UgbmVlZCB0aGlzID8KKworCQkvLyBBZGQgYSBjb21wb3NpdGUgdG8gbWFuYWdlIHRoZSB2aWV3J3MgVEIgYW5kIE1lbnUKKwkJYWRkVG9wUmlnaHQoY3RmKTsKKworCQlyZXR1cm4gY3RmOworCX0KKworCS8vIHByaXZhdGUgYm9vbGVhbiBnZXRJbml0aWFsTVJVVmFsdWUoQ29udHJvbCBjb250cm9sKSB7CisJLy8gQ1NTUmVuZGVyaW5nVXRpbHMgdXRpbCA9IGNvbnRleHQuZ2V0KENTU1JlbmRlcmluZ1V0aWxzLmNsYXNzKTsKKwkvLyBpZiAodXRpbCA9PSBudWxsKSB7CisJLy8gcmV0dXJuIGdldE1SVVZhbHVlRnJvbVByZWZlcmVuY2VzKCk7CisJLy8gfQorCS8vCisJLy8gQ1NTVmFsdWUgdmFsdWUgPSB1dGlsLmdldENTU1ZhbHVlKGNvbnRyb2wsCisJLy8gIk1QYXJ0U3RhY2siLCAic3d0LW1ydS12aXNpYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8vCisJLy8gaWYgKHZhbHVlID09IG51bGwpIHsKKwkvLyB2YWx1ZSA9IHV0aWwuZ2V0Q1NTVmFsdWUoY29udHJvbCwgIk1QYXJ0U3RhY2siLCAibXJ1LXZpc2libGUiKTsKKwkvLyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvLyB9CisJLy8gaWYgKHZhbHVlID09IG51bGwpIHsKKwkvLyByZXR1cm4gZ2V0TVJVVmFsdWVGcm9tUHJlZmVyZW5jZXMoKTsKKwkvLyB9CisJLy8gcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlLmdldENzc1RleHQoKSk7CisJLy8gfQorCisJcHJpdmF0ZSBib29sZWFuIGdldE1SVVZhbHVlKENvbnRyb2wgY29udHJvbCkgeworCQkvLyBpZiAoQ1NTUHJvcGVydHlNcnVWaXNpYmxlU1dUSGFuZGxlci5pc01SVUNvbnRyb2xsZWRCeUNTUygpKSB7CisJCS8vIHJldHVybiBnZXRJbml0aWFsTVJVVmFsdWUoY29udHJvbCk7CisJCS8vIH0KKwkJcmV0dXJuIGdldE1SVVZhbHVlRnJvbVByZWZlcmVuY2VzKCk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGdldE1SVVZhbHVlRnJvbVByZWZlcmVuY2VzKCkgeworCQlib29sZWFuIGluaXRpYWxNUlVWYWx1ZSA9IHByZWZlcmVuY2VzLmdldEJvb2xlYW4oTVJVX0tFWV9ERUZBVUxULCBNUlVfREVGQVVMVCk7CisJCWJvb2xlYW4gYWN0dWFsVmFsdWUgPSBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKE1SVV9LRVksIGluaXRpYWxNUlVWYWx1ZSk7CisJCXJldHVybiBhY3R1YWxWYWx1ZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlTVJVVmFsdWUoQ1RhYkZvbGRlciBjdGYpIHsKKwkJYm9vbGVhbiBhY3R1YWxNUlVWYWx1ZSA9IGdldE1SVVZhbHVlKGN0Zik7CisJCWN0Zi5zZXRNUlVWaXNpYmxlKGFjdHVhbE1SVVZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkvLyBib29sZWFuIG1ydUNvbnRyb2xsZWRCeUNTUyA9CisJCS8vIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oTVJVX0NPTlRST0xMRURfQllfQ1NTX0tFWSwKKwkJLy8gTVJVX0NPTlRST0xMRURfQllfQ1NTX0RFRkFVTFQpOworCQkvLyBDU1NQcm9wZXJ0eU1ydVZpc2libGVTV1RIYW5kbGVyLnNldE1SVUNvbnRyb2xsZWRCeUNTUyhtcnVDb250cm9sbGVkQnlDU1MpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjdGYKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkVG9wUmlnaHQoQ1RhYkZvbGRlciBjdGYpIHsKKwkJQ29tcG9zaXRlIHRyQ29tcCA9IG5ldyBDb21wb3NpdGUoY3RmLCBTV1QuTk9ORSk7CisJCS8vIHRyQ29tcC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKAorCQkvLyBTV1QuQ09MT1JfREFSS19DWUFOKSk7CisJCVJvd0xheW91dCBybCA9IG5ldyBSb3dMYXlvdXQoKTsKKwkJdHJDb21wLnNldExheW91dChybCk7CisJCXJsLm1hcmdpbkJvdHRvbSA9IHJsLm1hcmdpblRvcCA9IHJsLm1hcmdpblJpZ2h0ID0gcmwubWFyZ2luTGVmdCA9IDA7CisJCWN0Zi5zZXRUb3BSaWdodCh0ckNvbXAsIFNXVC5SSUdIVC8qIHwgU1dULldSQVAgKi8pOworCisJCS8vIEluaXRpYWxseSBpdCdzIG5vdCB2aXNpYmxlCisJCXRyQ29tcC5zZXRWaXNpYmxlKGZhbHNlKTsKKworCQkvLyBDcmVhdGUgYSBUQiBmb3IgdGhlIHZpZXcncyBkcm9wLWRvd24gbWVudQorCQlUb29sQmFyIG1lbnVUQiA9IG5ldyBUb29sQmFyKHRyQ29tcCwgU1dULkZMQVQgfCBTV1QuUklHSFQpOworCQltZW51VEIuc2V0RGF0YShUQUdfVklFV19NRU5VKTsKKwkJUm93RGF0YSByZCA9IG5ldyBSb3dEYXRhKCk7CisJCW1lbnVUQi5zZXRMYXlvdXREYXRhKHJkKTsKKwkJVG9vbEl0ZW0gdGkgPSBuZXcgVG9vbEl0ZW0obWVudVRCLCBTV1QuUFVTSCk7CisJCXRpLnNldEltYWdlKGdldFZpZXdNZW51SW1hZ2UoKSk7CisJCXRpLnNldEhvdEltYWdlKG51bGwpOworCQl0aS5zZXRUb29sVGlwVGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy52aWV3TWVudSk7CisKKwkJLy8gSW5pdGlhbGx5IGl0J3Mgbm90IHZpc2libGUKKwkJcmQuZXhjbHVkZSA9IHRydWU7CisJCW1lbnVUQi5zZXRWaXNpYmxlKGZhbHNlKTsKKworCQl0aS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlzaG93TWVudSgoVG9vbEl0ZW0pIGUud2lkZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXNob3dNZW51KChUb29sSXRlbSkgZS53aWRnZXQpOworCQkJfQorCQl9KTsKKwkJbWVudVRCLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7CisJCQkJaWYgKGUuY2hpbGRJRCAhPSBBQ0MuQ0hJTERJRF9TRUxGKSB7CisJCQkJCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IChBY2Nlc3NpYmxlKSBlLmdldFNvdXJjZSgpOworCQkJCQlUb29sQmFyIHRvb2xCYXIgPSAoVG9vbEJhcikgYWNjZXNzaWJsZS5nZXRDb250cm9sKCk7CisJCQkJCWlmICgwIDw9IGUuY2hpbGRJRCAmJiBlLmNoaWxkSUQgPCB0b29sQmFyLmdldEl0ZW1Db3VudCgpKSB7CisJCQkJCQlUb29sSXRlbSBpdGVtID0gdG9vbEJhci5nZXRJdGVtKGUuY2hpbGRJRCk7CisJCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQkJCQkJZS5yZXN1bHQgPSBpdGVtLmdldFRvb2xUaXBUZXh0KCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0pOworCisJCS8vIFNldCBhbiBpbml0aWFsIGJvdW5kcworCQl0ckNvbXAucGFjaygpOworCX0KKworCWJvb2xlYW4gYWRqdXN0aW5nID0gZmFsc2U7CisKKwlwdWJsaWMgdm9pZCBhZGp1c3RUb3BSaWdodChmaW5hbCBDVGFiRm9sZGVyIGN0ZikgeworCQlpZiAoYWRqdXN0aW5nKQorCQkJcmV0dXJuOworCisJCWFkanVzdGluZyA9IHRydWU7CisKKwkJdHJ5IHsKKwkJCS8vIEdhdGhlciB0aGUgcGFyYW1ldGVycy4uLm9sZCBwYXJ0LCBuZXcgcGFydC4uLgorCQkJTVBhcnRTdGFjayBzdGFjayA9IChNUGFydFN0YWNrKSBjdGYuZ2V0RGF0YShPV05JTkdfTUUpOworCQkJTVVJRWxlbWVudCBlbGVtZW50ID0gc3RhY2suZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQlNUGFydCBjdXJQYXJ0ID0gKE1QYXJ0KSBjdGYuZ2V0VG9wUmlnaHQoKS5nZXREYXRhKFRIRV9QQVJUX0tFWSk7CisJCQlNUGFydCBwYXJ0ID0gbnVsbDsKKwkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKKwkJCQlwYXJ0ID0gKE1QYXJ0KSAoKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgPyBlbGVtZW50CisJCQkJCQk6ICgoTVBsYWNlaG9sZGVyKSBlbGVtZW50KS5nZXRSZWYoKSk7CisJCQl9CisKKwkJCS8vIEhpZGUgdGhlIG9sZCBUQiBpZiB3ZSdyZSBjaGFuZ2luZworCQkJaWYgKHBhcnQgIT0gY3VyUGFydCAmJiBjdXJQYXJ0ICE9IG51bGwKKyAmJiBjdXJQYXJ0LmdldFRvb2xiYXIoKSAhPSBudWxsKSB7CisJCQkJY3VyUGFydC5nZXRUb29sYmFyKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisKKwkJCUNvbXBvc2l0ZSB0ckNvbXAgPSAoQ29tcG9zaXRlKSBjdGYuZ2V0VG9wUmlnaHQoKTsKKwkJCUNvbnRyb2xbXSBraWRzID0gdHJDb21wLmdldENoaWxkcmVuKCk7CisKKwkJCWJvb2xlYW4gbmVlZHNUQiA9IHBhcnQgIT0gbnVsbCAmJiBwYXJ0LmdldFRvb2xiYXIoKSAhPSBudWxsCisgJiYgcGFydC5nZXRUb29sYmFyKCkuaXNUb0JlUmVuZGVyZWQoKTsKKworCQkJLy8gVmlldyBtZW51IChpZiBhbnkpCisJCQlNTWVudSB2aWV3TWVudSA9IGdldFZpZXdNZW51KHBhcnQpOworCQkJYm9vbGVhbiBuZWVkc01lbnUgPSB2aWV3TWVudSAhPSBudWxsCisJCQkJCSYmIGhhc1Zpc2libGVNZW51SXRlbXModmlld01lbnUsIHBhcnQpOworCisJCQkvLyBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgVEIncworCQkJVG9vbEJhciBtZW51VEIgPSAoVG9vbEJhcikga2lkc1traWRzLmxlbmd0aCAtIDFdOworCisJCQkvLyBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgJ2V4Y2x1ZGUnIGJpdCBiYXNlZCBvbiBpZiB0aGUgbWVudVRCIGlzCisJCQkvLyB2aXNpYmxlIG9yIG5vdAorCQkJUm93RGF0YSByZCA9IChSb3dEYXRhKSBtZW51VEIuZ2V0TGF5b3V0RGF0YSgpOworCQkJaWYgKG5lZWRzTWVudSkgeworCQkJCW1lbnVUQi5nZXRJdGVtKDApLnNldERhdGEoVEhFX1BBUlRfS0VZLCBwYXJ0KTsKKwkJCQltZW51VEIubW92ZUJlbG93KG51bGwpOworCQkJCW1lbnVUQi5wYWNrKCk7CisJCQkJcmQuZXhjbHVkZSA9IGZhbHNlOworCQkJCW1lbnVUQi5zZXRWaXNpYmxlKHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQltZW51VEIuZ2V0SXRlbSgwKS5zZXREYXRhKFRIRV9QQVJUX0tFWSwgbnVsbCk7CisJCQkJcmQuZXhjbHVkZSA9IHRydWU7CisJCQkJbWVudVRCLnNldFZpc2libGUoZmFsc2UpOworCQkJfQorCisJCQlUb29sQmFyIG5ld1ZpZXdUQiA9IG51bGw7CisJCQlpZiAobmVlZHNUQiAmJiBwYXJ0ICE9IG51bGwgJiYgcGFydC5nZXRPYmplY3QoKSAhPSBudWxsKSB7CisJCQkJcGFydC5nZXRUb29sYmFyKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQluZXdWaWV3VEIgPSAoVG9vbEJhcikgcmVuZGVyZXIuY3JlYXRlR3VpKHBhcnQuZ2V0VG9vbGJhcigpLAorCQkJCQkJY3RmLmdldFRvcFJpZ2h0KCksIHBhcnQuZ2V0Q29udGV4dCgpKTsKKwkJCQkvLyBXZSBjYW4gZ2V0IGNhbGxzIGR1cmluZyBzaHV0ZG93biBpbiB3aGljaCBjYXNlIHRoZQorCQkJCS8vIHJlbmRlcmluZyBlbmdpbmUgd2lsbCByZXR1cm4gJ251bGwnIGJlY2F1c2UgeW91IGNhbid0CisJCQkJLy8gcmVuZGVyIGFueXRoaW5nIHdoaWxlIGEgcmVtb3ZlR3VpIGlzIHRha2luZyBwbGFjZS4uLgorCQkJCWlmIChuZXdWaWV3VEIgPT0gbnVsbCkgeworCQkJCQlhZGp1c3RpbmcgPSBmYWxzZTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQluZXdWaWV3VEIubW92ZUFib3ZlKG51bGwpOworCQkJCW5ld1ZpZXdUQi5wYWNrKCk7CisJCQl9CisKKwkJCWlmIChuZWVkc01lbnUgfHwgbmVlZHNUQikgeworCQkJCWN0Zi5nZXRUb3BSaWdodCgpLnNldERhdGEoVEhFX1BBUlRfS0VZLCBwYXJ0KTsKKwkJCQljdGYuZ2V0VG9wUmlnaHQoKS5wYWNrKHRydWUpOworCQkJCWN0Zi5nZXRUb3BSaWdodCgpLnNldFZpc2libGUodHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCWN0Zi5nZXRUb3BSaWdodCgpLnNldERhdGEoVEhFX1BBUlRfS0VZLCBudWxsKTsKKwkJCQljdGYuZ2V0VG9wUmlnaHQoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCX0KKworCQkJLy8gUGFjayB0aGUgcmVzdWx0CisJCQl0ckNvbXAucGFjaygpOworCQl9IGZpbmFsbHkgeworCQkJYWRqdXN0aW5nID0gZmFsc2U7CisJCX0KKwkJdXBkYXRlTVJVVmFsdWUoY3RmKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWIoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gc3RhY2ssCisJCQlNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJTVBhcnQgcGFydCA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpCisJCQlwYXJ0ID0gKE1QYXJ0KSBlbGVtZW50OworCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQlwYXJ0ID0gKE1QYXJ0KSAoKE1QbGFjZWhvbGRlcikgZWxlbWVudCkuZ2V0UmVmKCk7CisJCQlpZiAocGFydCAhPSBudWxsKSB7CisJCQkJcGFydC5zZXRDdXJTaGFyZWRSZWYoKE1QbGFjZWhvbGRlcikgZWxlbWVudCk7CisJCQl9CisJCX0KKworCQlDVGFiRm9sZGVyIGN0ZiA9IChDVGFiRm9sZGVyKSBzdGFjay5nZXRXaWRnZXQoKTsKKworCQlDVGFiSXRlbSBjdGkgPSBmaW5kSXRlbUZvclBhcnQoZWxlbWVudCwgc3RhY2spOworCQlpZiAoY3RpICE9IG51bGwpIHsKKwkJCWlmIChlbGVtZW50LmdldFdpZGdldCgpICE9IG51bGwKKwkJCQkJJiYgY3RpLmdldENvbnRyb2woKSAhPSBlbGVtZW50LmdldFdpZGdldCgpKQorCQkJCWN0aS5zZXRDb250cm9sKChDb250cm9sKSBlbGVtZW50LmdldFdpZGdldCgpKTsKKwkJCXJldHVybjsKKwkJfQorCQl1cGRhdGVNUlVWYWx1ZShjdGYpOworCQlpbnQgY3JlYXRlRmxhZ3MgPSBTV1QuTk9ORTsKKwkJaWYgKHBhcnQgIT0gbnVsbCAmJiBpc0Nsb3NhYmxlKHBhcnQpKSB7CisJCQljcmVhdGVGbGFncyB8PSBTV1QuQ0xPU0U7CisJCX0KKworCQkvLyBDcmVhdGUgdGhlIHRhYjsgd2UgbWF5IGhhdmUgbW9yZSB2aXNpYmxlIHRhYnMgdGhhbiBjdXJyZW50bHkgc2hvd24KKwkJLy8gKGUuZy4sIGEgcmVzdWx0IG9mIGNhbGxpbmcgcGFydFN0YWNrLmdldENoaWxkcmVuKCkuYWRkQWxsKHBhcnRMaXN0KSkKKwkJaW50IGluZGV4ID0gTWF0aC5taW4oY2FsY0luZGV4Rm9yKHN0YWNrLCBlbGVtZW50KSwgY3RmLmdldEl0ZW1Db3VudCgpKTsKKwkJY3RpID0gbmV3IENUYWJJdGVtKGN0ZiwgY3JlYXRlRmxhZ3MsIGluZGV4KTsKKworCQljdGkuc2V0RGF0YShPV05JTkdfTUUsIGVsZW1lbnQpOworCQljdGkuc2V0VGV4dChnZXRMYWJlbChwYXJ0LCBwYXJ0LmdldExvY2FsaXplZExhYmVsKCkpKTsKKwkJY3RpLnNldEltYWdlKGdldEltYWdlKHBhcnQpKTsKKworCQlTdHJpbmcgdG9vbFRpcCA9IGdldFRvb2xUaXAocGFydCk7CisJCWlmICh0b29sVGlwID09IG51bGwpCisJCQl0b29sVGlwID0gcGFydC5nZXRMb2NhbGl6ZWRUb29sdGlwKCk7CisJCWN0aS5zZXRUb29sVGlwVGV4dChnZXRUb29sVGlwKHRvb2xUaXApKTsKKwkJaWYgKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgIT0gbnVsbCkgeworCQkJLy8gVGhlIHBhcnQgbWlnaHQgaGF2ZSBhIHdpZGdldCBidXQgbWF5IG5vdCB5ZXQgaGF2ZSBiZWVuIHBsYWNlZAorCQkJLy8gdW5kZXIgdGhpcyBzdGFjaywgY2hlY2sgdGhpcworCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIGVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCQlpZiAoY3RybC5nZXRQYXJlbnQoKSA9PSBjdGYpCisJCQkJY3RpLnNldENvbnRyb2woKENvbnRyb2wpIGVsZW1lbnQuZ2V0V2lkZ2V0KCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBpbnQgY2FsY0luZGV4Rm9yKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHN0YWNrLAorCQkJZmluYWwgTVVJRWxlbWVudCBwYXJ0KSB7CisJCWludCBpbmRleCA9IDA7CisKKwkJLy8gRmluZCB0aGUgLXZpc2libGUtIHBhcnQgYmVmb3JlIHRoaXMgZWxlbWVudAorCQlmb3IgKE1VSUVsZW1lbnQgbVBhcnQgOiBzdGFjay5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAobVBhcnQgPT0gcGFydCkKKwkJCQlyZXR1cm4gaW5kZXg7CisJCQlpZiAobVBhcnQuaXNUb0JlUmVuZGVyZWQoKSAmJiBtUGFydC5pc1Zpc2libGUoKSkKKwkJCQlpbmRleCsrOworCQl9CisJCXJldHVybiBpbmRleDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjaGlsZFJlbmRlcmVkKAorCQkJZmluYWwgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50RWxlbWVudCwKKwkJCU1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlci5jaGlsZFJlbmRlcmVkKHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpOworCisJCWlmICghKCgoTVVJRWxlbWVudCkgcGFyZW50RWxlbWVudCkgaW5zdGFuY2VvZiBNUGFydFN0YWNrKQorCQkJCXx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIE1TdGFja0VsZW1lbnQpKQorCQkJcmV0dXJuOworCisJCWNyZWF0ZVRhYihwYXJlbnRFbGVtZW50LCBlbGVtZW50KTsKKwl9CisKKwlwcml2YXRlIENUYWJJdGVtIGZpbmRJdGVtRm9yUGFydChNVUlFbGVtZW50IGVsZW1lbnQsCisJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBzdGFjaykgeworCQlpZiAoc3RhY2sgPT0gbnVsbCkKKwkJCXN0YWNrID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKCEoc3RhY2suZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSkKKwkJCXJldHVybiBudWxsOworCQlDVGFiRm9sZGVyIGN0ZiA9IChDVGFiRm9sZGVyKSBzdGFjay5nZXRXaWRnZXQoKTsKKwkJaWYgKGN0ZiA9PSBudWxsIHx8IGN0Zi5pc0Rpc3Bvc2VkKCkpCisJCQlyZXR1cm4gbnVsbDsKKworCQlDVGFiSXRlbVtdIGl0ZW1zID0gY3RmLmdldEl0ZW1zKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpdGVtc1tpXS5nZXREYXRhKE9XTklOR19NRSkgPT0gZWxlbWVudCkKKwkJCQlyZXR1cm4gaXRlbXNbaV07CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENUYWJJdGVtIGZpbmRJdGVtRm9yUGFydChNUGFydCBwYXJ0KSB7CisJCS8vIEludmlzaWJsZSBwYXJ0cyBkb24ndCBoYXZlIGl0ZW1zCisJCWlmICghcGFydC5pc1RvQmVSZW5kZXJlZCgpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gaXMgdGhpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgc3RhY2s/CisJCWlmIChwYXJ0LmdldFBhcmVudCgpICE9IG51bGwKKwkJCQkmJiBwYXJ0LmdldFBhcmVudCgpLmdldFJlbmRlcmVyKCkgPT0gU3RhY2tSZW5kZXJlci50aGlzKSB7CisJCQlDVGFiSXRlbSBjdGkgPSBmaW5kSXRlbUZvclBhcnQocGFydCwgcGFydC5nZXRQYXJlbnQoKSk7CisJCQlpZiAoY3RpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gY3RpOworCQkJfQorCQl9CisKKwkJLy8gRG8gd2UgaGF2ZSBhbnkgc3RhY2tzIHdpdGggcGxhY2UgaG9sZGVycyBmb3IgdGhlIGVsZW1lbnQKKwkJLy8gdGhhdCdzIGNoYW5nZWQ/CisJCU1XaW5kb3cgd2luID0gbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKHBhcnQpOworCisJCWlmICh3aW4gPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCUxpc3Q8TVBsYWNlaG9sZGVyPiByZWZzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW4sIG51bGwsCisJCQkJTVBsYWNlaG9sZGVyLmNsYXNzLCBudWxsKTsKKwkJaWYgKHJlZnMgIT0gbnVsbCkgeworCQkJZm9yIChNUGxhY2Vob2xkZXIgcmVmIDogcmVmcykgeworCQkJCWlmIChyZWYuZ2V0UmVmKCkgIT0gcGFydCkKKwkJCQkJY29udGludWU7CisKKwkJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiByZWZQYXJlbnQgPSByZWYuZ2V0UGFyZW50KCk7CisJCQkJLy8gY2FuIGJlIG51bGwsIHNlZSBidWcgMzI4Mjk2CisJCQkJaWYgKHJlZlBhcmVudCAhPSBudWxsCisJCQkJCQkmJiByZWZQYXJlbnQuZ2V0UmVuZGVyZXIoKSBpbnN0YW5jZW9mIFN0YWNrUmVuZGVyZXIpIHsKKwkJCQkJQ1RhYkl0ZW0gY3RpID0gZmluZEl0ZW1Gb3JQYXJ0KHJlZiwgcmVmUGFyZW50KTsKKwkJCQkJaWYgKGN0aSAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gY3RpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVDaGlsZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBjaGlsZCkgeworCQlzdXBlci5oaWRlQ2hpbGQocGFyZW50RWxlbWVudCwgY2hpbGQpOworCisJCUNUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIHBhcmVudEVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCWlmIChjdGYgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIHJlc2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNoaWxkIGZvciB0aGUgc3RhY2sKKwkJQ1RhYkl0ZW0gY3RpID0gZmluZEl0ZW1Gb3JQYXJ0KGNoaWxkLCBwYXJlbnRFbGVtZW50KTsKKwkJaWYgKGN0aSA9PSBjdGYuZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCS8vIElmIHdlJ3JlIHRoZSBvbmx5IHBhcnQgd2UgbmVlZCB0byBjbGVhciB0aGUgdG9wIHJpZ2h0Li4uCisJCQlpZiAoY3RmLmdldEl0ZW1Db3VudCgpID09IDEpIHsKKwkJCQlhZGp1c3RUb3BSaWdodChjdGYpOworCQkJfQorCQl9CisKKwkJLy8gZmluZCB0aGUgJ3N0YWxlJyB0YWIgZm9yIHRoaXMgZWxlbWVudCBhbmQgZGlzcG9zZSBpdAorCQlpZiAoY3RpICE9IG51bGwgJiYgIWN0aS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCWN0aS5zZXRDb250cm9sKG51bGwpOworCQkJY3RpLmRpc3Bvc2UoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhvb2tDb250cm9sbGVyTG9naWMoZmluYWwgTVVJRWxlbWVudCBtZSkgeworCQlzdXBlci5ob29rQ29udHJvbGxlckxvZ2ljKG1lKTsKKworCQlpZiAoIShtZSBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KSkKKwkJCXJldHVybjsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJZmluYWwgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gc3RhY2sgPSAoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4pIG1lOworCisJCS8vIE1hdGNoIHRoZSBzZWxlY3RlZCBUYWJJdGVtIHRvIGl0cyBQYXJ0CisJCWZpbmFsIENUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIG1lLmdldFdpZGdldCgpOworCisJCS8vIEhhbmRsZSB0cmF2ZXJzZSBldmVudHMgZm9yIGFjY2Vzc2liaWxpdHkKKwkJY3RmLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKKwkJCQkvLyBGSVhNRSBSQVAgdHJhdmVyc2UgQVJST1cgbm90IHN1cHBvcnRlZAorCQkJCS8vIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBlLmRldGFpbCA9PQorCQkJCS8vIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUykgeworCQkJCS8vIG1lLmdldFRyYW5zaWVudERhdGEoKS5wdXQoSU5ISUJJVF9GT0NVUywgdHJ1ZSk7CisJCQkJLy8gfSBlbHNlCisJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKKwkJCQkJbWUuZ2V0VHJhbnNpZW50RGF0YSgpLnJlbW92ZShJTkhJQklUX0ZPQ1VTKTsKKwkJCQkJQ1RhYkl0ZW0gY3RpID0gY3RmLmdldFNlbGVjdGlvbigpOworCQkJCQlpZiAoY3RpICE9IG51bGwpIHsKKwkJCQkJCU1VSUVsZW1lbnQgc3RhY2tFbGVtZW50ID0gKE1VSUVsZW1lbnQpIGN0aS5nZXREYXRhKE9XTklOR19NRSk7CisJCQkJCQlpZiAoc3RhY2tFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKQorCQkJCQkJCXN0YWNrRWxlbWVudCA9ICgoTVBsYWNlaG9sZGVyKSBzdGFja0VsZW1lbnQpLmdldFJlZigpOworCQkJCQkJaWYgKChzdGFja0VsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgJiYgKGN0Zi5pc0ZvY3VzQ29udHJvbCgpKSkgeworCQkJCQkJCU1QYXJ0IHRoZVBhcnQgPSAoTVBhcnQpIHN0YWNrRWxlbWVudDsKKwkJCQkJCQlyZW5kZXJlci5mb2N1c0d1aSh0aGVQYXJ0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJLy8gRGV0ZWN0IGFjdGl2YXRpb24uLi5waWNrcyB1cCBjYXNlcyB3aGVyZSB0aGUgdXNlciBjbGlja3Mgb24gdGhlCisJCS8vIChhbHJlYWR5IGFjdGl2ZSkgdGFiCisJCWN0Zi5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQgZXZlbnQpIHsKKwkJCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5Nb3VzZURvd24pIHsKKwkJCQkJQ1RhYkZvbGRlciBjdGYgPSAoQ1RhYkZvbGRlcikgZXZlbnQud2lkZ2V0OworCQkJCQlpZiAoY3RmLmdldFNlbGVjdGlvbigpID09IG51bGwpCisJCQkJCQlyZXR1cm47CisKKwkJCQkJLy8gZ2V0IHRoZSBpdGVtIHVuZGVyIHRoZSBjdXJzb3IKKwkJCQkJUG9pbnQgY3AgPSBldmVudC5kaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7CisJCQkJCWNwID0gZXZlbnQuZGlzcGxheS5tYXAobnVsbCwgY3RmLCBjcCk7CisJCQkJCUNUYWJJdGVtIG92ZXJJdGVtID0gY3RmLmdldEl0ZW0oY3ApOworCisJCQkJCS8vIElmIHRoZSBpdGVtIHdlJ3JlIG92ZXIgaXMgKm5vdCogdGhlIGN1cnJlbnQgb25lIGRvCisJCQkJCS8vIG5vdGhpbmcgKGl0J2xsIGdldCBhY3RpdmF0ZWQgd2hlbiB0aGUgdGFiIGNoYW5nZXMpCisJCQkJCWlmIChvdmVySXRlbSA9PSBudWxsIHx8IG92ZXJJdGVtID09IGN0Zi5nZXRTZWxlY3Rpb24oKSkgeworCQkJCQkJTVVJRWxlbWVudCB1aUVsZW1lbnQgPSAoTVVJRWxlbWVudCkgY3RmLmdldFNlbGVjdGlvbigpCisJCQkJCQkJCS5nZXREYXRhKE9XTklOR19NRSk7CisJCQkJCQlpZiAodWlFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKQorCQkJCQkJCXVpRWxlbWVudCA9ICgoTVBsYWNlaG9sZGVyKSB1aUVsZW1lbnQpLmdldFJlZigpOworCQkJCQkJaWYgKHVpRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KQorCQkJCQkJCWFjdGl2YXRlKChNUGFydCkgdWlFbGVtZW50KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJY3RmLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJLy8gcHJldmVudCByZWN1cnNpb25zCisJCQkJaWYgKGlnbm9yZVRhYlNlbENoYW5nZXMpCisJCQkJCXJldHVybjsKKworCQkJCU1VSUVsZW1lbnQgZWxlID0gKE1VSUVsZW1lbnQpIGUuaXRlbS5nZXREYXRhKE9XTklOR19NRSk7CisJCQkJZWxlLmdldFBhcmVudCgpLnNldFNlbGVjdGVkRWxlbWVudChlbGUpOworCQkJCWlmIChlbGUgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpCisJCQkJCWVsZSA9ICgoTVBsYWNlaG9sZGVyKSBlbGUpLmdldFJlZigpOworCQkJCWlmIChlbGUgaW5zdGFuY2VvZiBNUGFydCkKKwkJCQkJYWN0aXZhdGUoKE1QYXJ0KSBlbGUpOworCQkJfQorCQl9KTsKKworCQlNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgeworCisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7CisJCQkJQ1RhYkl0ZW0gaXRlbSA9IGN0Zi5nZXRTZWxlY3Rpb24oKTsKKwkJCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQkJCU1VSUVsZW1lbnQgZWxlID0gKE1VSUVsZW1lbnQpIGl0ZW0uZ2V0RGF0YShPV05JTkdfTUUpOworCQkJCQlpZiAoZWxlLmdldFBhcmVudCgpLmdldFNlbGVjdGVkRWxlbWVudCgpID09IGVsZSkgeworCQkJCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIGVsZS5nZXRXaWRnZXQoKTsKKwkJCQkJCWlmIChjdHJsICE9IG51bGwpIHsKKwkJCQkJCQljdHJsLnNldEZvY3VzKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKKwkJCQlDVGFiSXRlbSBpdGVtID0gY3RmLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7CisKKwkJCQkvLyBJZiB0aGUgdXNlciBtaWRkbGUgY2xpY2tzIG9uIGEgdGFiLCBjbG9zZSBpdAorCQkJCWlmIChpdGVtICE9IG51bGwgJiYgZS5idXR0b24gPT0gMikgeworCQkJCQljbG9zZVBhcnQoaXRlbSwgZmFsc2UpOworCQkJCX0KKworCQkJCS8vIElmIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgdGFiIG9yIGVtcHR5IHN0YWNrIHNwYWNlLCBjYWxsCisJCQkJLy8gc2V0Rm9jdXMoKQorCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7CisJCQkJCWlmIChpdGVtID09IG51bGwpIHsKKwkJCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY3RmLmdldENsaWVudEFyZWEoKTsKKwkJCQkJCWlmICghY2xpZW50QXJlYS5jb250YWlucyhlLngsIGUueSkpIHsKKwkJCQkJCQkvLyBVc2VyIGNsaWNrZWQgaW4gZW1wdHkgc3BhY2UKKwkJCQkJCQlpdGVtID0gY3RmLmdldFNlbGVjdGlvbigpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGl0ZW0gIT0gbnVsbCkgeworCQkJCQkJTVVJRWxlbWVudCBlbGUgPSAoTVVJRWxlbWVudCkgaXRlbS5nZXREYXRhKE9XTklOR19NRSk7CisJCQkJCQlpZiAoZWxlLmdldFBhcmVudCgpLmdldFNlbGVjdGVkRWxlbWVudCgpID09IGVsZSkgeworCQkJCQkJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBlbGUuZ2V0V2lkZ2V0KCk7CisJCQkJCQkJaWYgKGN0cmwgIT0gbnVsbCkgeworCQkJCQkJCQljdHJsLnNldEZvY3VzKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCQljdGYuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKKworCQlDVGFiRm9sZGVyMkFkYXB0ZXIgY2xvc2VMaXN0ZW5lciA9IG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7CisJCQkvKioKKwkJCSAqCisJCQkgKi8KKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGNsb3NlKENUYWJGb2xkZXJFdmVudCBldmVudCkgeworCQkJCWV2ZW50LmRvaXQgPSBjbG9zZVBhcnQoZXZlbnQuaXRlbSwgdHJ1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgc2hvd0xpc3QoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7CisJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOworCQkJCXNob3dBdmFpbGFibGVJdGVtcyhzdGFjaywgY3RmKTsKKwkJCX0KKwkJfTsKKwkJY3RmLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIoY2xvc2VMaXN0ZW5lcik7CisKKwkJY3RmLmFkZE1lbnVEZXRlY3RMaXN0ZW5lcihuZXcgTWVudURldGVjdExpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBtZW51RGV0ZWN0ZWQoTWVudURldGVjdEV2ZW50IGUpIHsKKwkJCQlQb2ludCBhYnNvbHV0ZVBvaW50ID0gbmV3IFBvaW50KGUueCwgZS55KTsKKwkJCQlQb2ludCByZWxhdGl2ZVBvaW50ID0gY3RmLmdldERpc3BsYXkoKS5tYXAobnVsbCwgY3RmLAorCQkJCQkJYWJzb2x1dGVQb2ludCk7CisJCQkJQ1RhYkl0ZW0gZXZlbnRUYWJJdGVtID0gY3RmLmdldEl0ZW0ocmVsYXRpdmVQb2ludCk7CisKKwkJCQkvLyBJZiBjbGljayBoYXBwZW5lZCBpbiBlbXB0eSBhcmVhLCBzdGlsbCBzaG93IHRoZSBtZW51CisJCQkJaWYgKGV2ZW50VGFiSXRlbSA9PSBudWxsKSB7CisJCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY3RmLmdldENsaWVudEFyZWEoKTsKKwkJCQkJaWYgKCFjbGllbnRBcmVhLmNvbnRhaW5zKHJlbGF0aXZlUG9pbnQpKSB7CisJCQkJCQlldmVudFRhYkl0ZW0gPSBjdGYuZ2V0U2VsZWN0aW9uKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZXZlbnRUYWJJdGVtICE9IG51bGwpIHsKKwkJCQkJTVVJRWxlbWVudCB1aUVsZW1lbnQgPSAoTVVJRWxlbWVudCkgZXZlbnRUYWJJdGVtCisJCQkJCQkJLmdldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FKTsKKwkJCQkJTVBhcnQgdGFiUGFydCA9IChNUGFydCkgKCh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgPyB1aUVsZW1lbnQKKwkJCQkJCQk6ICgoTVBsYWNlaG9sZGVyKSB1aUVsZW1lbnQpLmdldFJlZigpKTsKKwkJCQkJb3Blbk1lbnVGb3IodGFiUGFydCwgY3RmLCBhYnNvbHV0ZVBvaW50KTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCWN0Zi5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgeworCQkJCXVwZGF0ZU1SVVZhbHVlKGN0Zik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHNob3dBdmFpbGFibGVJdGVtcyhNRWxlbWVudENvbnRhaW5lcjw/PiBzdGFjaywgQ1RhYkZvbGRlciBjdGYpIHsKKwkJSUVjbGlwc2VDb250ZXh0IGN0eHQgPSBnZXRDb250ZXh0KHN0YWNrKTsKKwkJZmluYWwgQmFzaWNQYXJ0TGlzdCBlZGl0b3JMaXN0ID0gbmV3IEJhc2ljUGFydExpc3QoY3RmLmdldFNoZWxsKCksCisJCQkJU1dULk9OX1RPUCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMLAorCQkJCWN0eHQuZ2V0KEVQYXJ0U2VydmljZS5jbGFzcyksIHN0YWNrLCB0aGlzLAorIGdldE1SVVZhbHVlRnJvbVByZWZlcmVuY2VzKCkpOworCQllZGl0b3JMaXN0LnNldElucHV0KCk7CisKKwkJUG9pbnQgc2l6ZSA9IGVkaXRvckxpc3QuY29tcHV0ZVNpemVIaW50KCk7CisJCWVkaXRvckxpc3Quc2V0U2l6ZShzaXplLngsIHNpemUueSk7CisKKwkJUG9pbnQgbG9jYXRpb24gPSBjdGYudG9EaXNwbGF5KGdldENoZXZyb25Mb2NhdGlvbihjdGYpKTsKKwkJTW9uaXRvciBtb24gPSBjdGYuZ2V0TW9uaXRvcigpOworCQlSZWN0YW5nbGUgYm91bmRzID0gbW9uLmdldENsaWVudEFyZWEoKTsKKwkJaWYgKGxvY2F0aW9uLnggKyBzaXplLnggPiBib3VuZHMueCArIGJvdW5kcy53aWR0aCkgeworCQkJbG9jYXRpb24ueCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gc2l6ZS54OworCQl9CisJCWlmIChsb2NhdGlvbi55ICsgc2l6ZS55ID4gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSB7CisJCQlsb2NhdGlvbi55ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gc2l6ZS55OworCQl9CisJCWVkaXRvckxpc3Quc2V0TG9jYXRpb24obG9jYXRpb24pOworCisJCWVkaXRvckxpc3Quc2V0VmlzaWJsZSh0cnVlKTsKKwkJZWRpdG9yTGlzdC5zZXRGb2N1cygpOworCQllZGl0b3JMaXN0LmdldFNoZWxsKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQgZXZlbnQpIHsKKwkJCQllZGl0b3JMaXN0LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQllZGl0b3JMaXN0LmRpc3Bvc2UoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIFBvaW50IGdldENoZXZyb25Mb2NhdGlvbihDVGFiRm9sZGVyIHRhYkZvbGRlcikgeworCQkvLyBnZXQgdGhlIGxhc3QgdmlzaWJsZSBpdGVtCisJCWludCBudW1JdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTsKKwkJQ1RhYkl0ZW0gaXRlbSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgeworCQkJQ1RhYkl0ZW0gdGVtcEl0ZW0gPSB0YWJGb2xkZXIuZ2V0SXRlbShpKTsKKwkJCWlmICh0ZW1wSXRlbS5pc1Nob3dpbmcoKSkgeworCQkJCWl0ZW0gPSB0ZW1wSXRlbTsKKwkJCX0KKwkJfQorCisJCS8vIGlmIHdlIGhhdmUgbm8gdmlzaWJsZSB0YWJzLCBhYm9ydC4KKwkJaWYgKGl0ZW0gPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsKKwkJfQorCisJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKKwkJaW50IHggPSBpdGVtQm91bmRzLnggKyBpdGVtQm91bmRzLndpZHRoOworCQlpbnQgeSA9IGl0ZW1Cb3VuZHMueSArIGl0ZW1Cb3VuZHMuaGVpZ2h0OworCQlyZXR1cm4gbmV3IFBvaW50KHgsIHkpOworCX0KKworCS8qKgorCSAqIENsb3NlcyB0aGUgcGFydCB0aGF0J3MgYmFja2VkIGJ5IHRoZSBnaXZlbiB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gd2lkZ2V0CisJICogICAgICAgICAgICB0aGUgcGFydCB0aGF0IG93bnMgdGhpcyB3aWRnZXQKKwkgKiBAcGFyYW0gY2hlY2sKKwkgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIHBhcnQgc2hvdWxkIGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0IGhhcworCSAqICAgICAgICAgICAgYmVlbiBkZWZpbmVkIGFzIGJlaW5nIG5vdCBjbG9zZWFibGUgZm9yIHVzZXJzLCA8dHQ+ZmFsc2U8L3R0PgorCSAqICAgICAgICAgICAgaWYgdGhpcyBjaGVjayBzaG91bGQgbm90IGJlIHBlcmZvcm1lZAorCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgcGFydCB3YXMgY2xvc2VkLCA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2xvc2VQYXJ0KFdpZGdldCB3aWRnZXQsIGJvb2xlYW4gY2hlY2spIHsKKwkJTVVJRWxlbWVudCB1aUVsZW1lbnQgPSAoTVVJRWxlbWVudCkgd2lkZ2V0CisJCQkJLmdldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FKTsKKwkJTVBhcnQgcGFydCA9IChNUGFydCkgKCh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgPyB1aUVsZW1lbnQKKwkJCQk6ICgoTVBsYWNlaG9sZGVyKSB1aUVsZW1lbnQpLmdldFJlZigpKTsKKwkJaWYgKCFjaGVjayAmJiAhaXNDbG9zYWJsZShwYXJ0KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJSUVjbGlwc2VDb250ZXh0IHBhcnRDb250ZXh0ID0gcGFydC5nZXRDb250ZXh0KCk7CisJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gZ2V0Q29udGV4dEZvclBhcmVudChwYXJ0KTsKKwkJLy8gYSBwYXJ0IG1heSBub3QgaGF2ZSBhIGNvbnRleHQgaWYgaXQgaGFzbid0IGJlZW4gcmVuZGVyZWQKKwkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBwYXJ0Q29udGV4dCA9PSBudWxsID8gcGFyZW50Q29udGV4dAorCQkJCTogcGFydENvbnRleHQ7CisJCS8vIEFsbG93IGNsb3NlcyB0byBiZSAnY2FuY2VsZWQnCisJCUVQYXJ0U2VydmljZSBwYXJ0U2VydmljZSA9IChFUGFydFNlcnZpY2UpIGNvbnRleHQKKwkJCQkuZ2V0KEVQYXJ0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworCQlpZiAocGFydFNlcnZpY2Uuc2F2ZVBhcnQocGFydCwgdHJ1ZSkpIHsKKwkJCXBhcnRTZXJ2aWNlLmhpZGVQYXJ0KHBhcnQpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJLy8gdGhlIHVzZXIgaGFzIGNhbmNlbGVkIG91dCBvZiB0aGUgc2F2ZSBvcGVyYXRpb24sIHNvIGRvbid0IGNsb3NlIHRoZQorCQkvLyBwYXJ0CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFiKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlci5zaG93VGFiKGVsZW1lbnQpOworCisJCS8vIGFuIGludmlzaWJsZSBlbGVtZW50IHdvbid0IGhhdmUgdGhlIGNvcnJlY3Qgd2lkZ2V0IGhpZXJhcmNoeQorCQlpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWZpbmFsIENUYWJGb2xkZXIgY3RmID0gKENUYWJGb2xkZXIpIGdldFBhcmVudFdpZGdldChlbGVtZW50KTsKKwkJQ1RhYkl0ZW0gY3RpID0gZmluZEl0ZW1Gb3JQYXJ0KGVsZW1lbnQsIG51bGwpOworCQlpZiAoY3RpID09IG51bGwpIHsKKwkJCWNyZWF0ZVRhYihlbGVtZW50LmdldFBhcmVudCgpLCBlbGVtZW50KTsKKwkJCWN0aSA9IGZpbmRJdGVtRm9yUGFydChlbGVtZW50LCBlbGVtZW50LmdldFBhcmVudCgpKTsKKwkJfQorCQlDb250cm9sIGN0cmwgPSAoQ29udHJvbCkgZWxlbWVudC5nZXRXaWRnZXQoKTsKKwkJaWYgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmdldFBhcmVudCgpICE9IGN0ZikgeworCQkJY3RybC5zZXRQYXJlbnQoY3RmKTsKKwkJCWN0aS5zZXRDb250cm9sKGN0cmwpOworCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgPT0gbnVsbCkgeworCQkJQ29udHJvbCB0YWJDdHJsID0gKENvbnRyb2wpIHJlbmRlcmVyLmNyZWF0ZUd1aShlbGVtZW50KTsKKwkJCWN0aS5zZXRDb250cm9sKHRhYkN0cmwpOworCQl9CisKKwkJaWdub3JlVGFiU2VsQ2hhbmdlcyA9IHRydWU7CisJCS8vIEVuc3VyZSB0aGF0IHRoZSBuZXdseSBzZWxlY3RlZCBjb250cm9sIGlzIGNvcnJlY3RseSBzaXplZAorCQlpZiAoY3RpLmdldENvbnRyb2woKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJQ29tcG9zaXRlIGN0aUNvbXAgPSAoQ29tcG9zaXRlKSBjdGkuZ2V0Q29udHJvbCgpOworCQkJLy8gc2VlIGJ1ZyA0NjE1NzM6IGNhbGwgYmVsb3cgaXMgc3RpbGwgbmVlZGVkIHRvIG1ha2UgdmlldworCQkJLy8gZGVzY3JpcHRpb25zIHZpc2libGUgYWZ0ZXIgdW5oaWRpbmcgdGhlIHZpZXcgd2l0aCBjaGFuZ2VkIGJvdW5kcworCQkJY3RpQ29tcC5sYXlvdXQoZmFsc2UsIHRydWUpOworCQl9CisJCWN0Zi5zZXRTZWxlY3Rpb24oY3RpKTsKKwkJaWdub3JlVGFiU2VsQ2hhbmdlcyA9IGZhbHNlOworCisJCS8vIFNob3cgdGhlIG5ldyBzdGF0ZQorCQlhZGp1c3RUb3BSaWdodChjdGYpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpdGVtCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd01lbnUoVG9vbEl0ZW0gaXRlbSkgeworCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBpdGVtLmdldERhdGEoVEhFX1BBUlRfS0VZKTsKKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBwYXJ0LmdldFdpZGdldCgpOworCQlNTWVudSBtZW51TW9kZWwgPSBnZXRWaWV3TWVudShwYXJ0KTsKKwkJaWYgKG1lbnVNb2RlbCA9PSBudWxsIHx8ICFtZW51TW9kZWwuaXNUb0JlUmVuZGVyZWQoKSkKKwkJCXJldHVybjsKKworCQlmaW5hbCBNZW51IHN3dE1lbnUgPSAoTWVudSkgcmVuZGVyZXIuY3JlYXRlR3VpKG1lbnVNb2RlbCwKKwkJCQljdHJsLmdldFNoZWxsKCksIHBhcnQuZ2V0Q29udGV4dCgpKTsKKwkJaWYgKHN3dE1lbnUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQljdHJsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWlmICghc3d0TWVudS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJc3d0TWVudS5kaXNwb3NlKCk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQkvLyAuLi5hbmQgU2hvdyBpdC4uLgorCQlSZWN0YW5nbGUgaWIgPSBpdGVtLmdldEJvdW5kcygpOworCQlQb2ludCBkaXNwbGF5QXQgPSBpdGVtLmdldFBhcmVudCgpLnRvRGlzcGxheShpYi54LCBpYi55ICsgaWIuaGVpZ2h0KTsKKwkJc3d0TWVudS5zZXRMb2NhdGlvbihkaXNwbGF5QXQpOworCQlzd3RNZW51LnNldFZpc2libGUodHJ1ZSk7CisKKwkJRGlzcGxheSBkaXNwbGF5ID0gc3d0TWVudS5nZXREaXNwbGF5KCk7CisJCXdoaWxlICghc3d0TWVudS5pc0Rpc3Bvc2VkKCkgJiYgc3d0TWVudS5pc1Zpc2libGUoKSkgeworCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQorCQkJCWRpc3BsYXkuc2xlZXAoKTsKKwkJfQorCQlpZiAoIXN3dE1lbnUuaXNEaXNwb3NlZCgpCisJCQkJJiYgIShzd3RNZW51LmdldERhdGEoKSBpbnN0YW5jZW9mIE1lbnVNYW5hZ2VyKSkgeworCQkJc3d0TWVudS5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEltYWdlIGdldFZpZXdNZW51SW1hZ2UoKSB7CisJCS8vIEZJWE1FIFJBUCBjYW4gbm90IGRyYXcgb24gR0MKKwkJaWYgKHZpZXdNZW51SW1hZ2UgPT0gbnVsbCkgeworCQkJdmlld01lbnVJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKKwkJCQkJZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oIi9pY29ucy92aWV3TWVudS5wbmciKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gdmlld01lbnVJbWFnZTsKKworCX0KKworCXByaXZhdGUgdm9pZCBvcGVuTWVudUZvcihNUGFydCBwYXJ0LCBDVGFiRm9sZGVyIGZvbGRlciwgUG9pbnQgcG9pbnQpIHsKKwkJTWVudSB0YWJNZW51ID0gY3JlYXRlVGFiTWVudShmb2xkZXIsIHBhcnQpOworCQl0YWJNZW51LnNldERhdGEoU1RBQ0tfU0VMRUNURURfUEFSVCwgcGFydCk7CisJCXRhYk1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSk7CisJCXRhYk1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NhYmxlKE1QYXJ0IHBhcnQpIHsKKwkJLy8gaWYgaXQncyBhIHNoYXJlZCBwYXJ0IGNoZWNrIGl0cyBjdXJyZW50IHJlZgorCQlpZiAocGFydC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gIShwYXJ0LmdldEN1clNoYXJlZFJlZigpLmdldFRhZ3MoKQorCQkJCQkuY29udGFpbnMoSVByZXNlbnRhdGlvbkVuZ2luZS5OT19DTE9TRSkpOworCQl9CisKKwkJcmV0dXJuIHBhcnQuaXNDbG9zZWFibGUoKTsKKwl9CisKKwlwcml2YXRlIE1lbnUgY3JlYXRlVGFiTWVudShDVGFiRm9sZGVyIGZvbGRlciwgTVBhcnQgcGFydCkgeworCQlTaGVsbCBzaGVsbCA9IGZvbGRlci5nZXRTaGVsbCgpOworCQlNZW51IGNhY2hlZE1lbnUgPSAoTWVudSkgc2hlbGwuZ2V0RGF0YShTSEVMTF9DTE9TRV9FRElUT1JTX01FTlUpOworCQlpZiAoY2FjaGVkTWVudSA9PSBudWxsKSB7CisJCQljYWNoZWRNZW51ID0gbmV3IE1lbnUoZm9sZGVyKTsKKwkJCXNoZWxsLnNldERhdGEoU0hFTExfQ0xPU0VfRURJVE9SU19NRU5VLCBjYWNoZWRNZW51KTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoTWVudUl0ZW0gaXRlbSA6IGNhY2hlZE1lbnUuZ2V0SXRlbXMoKSkgeworCQkJCWl0ZW0uZGlzcG9zZSgpOworCQkJfQorCQl9CisKKwkJZmluYWwgTWVudSBtZW51ID0gY2FjaGVkTWVudTsKKwkJcG9wdWxhdGVUYWJNZW51KG1lbnUsIHBhcnQpOworCQlyZXR1cm4gbWVudTsKKwl9CisKKwkvKioKKwkgKiBQb3B1bGF0ZSB0aGUgdGFiJ3MgY29udGV4dCBtZW51IGZvciB0aGUgZ2l2ZW4gcGFydC4KKwkgKgorCSAqIEBwYXJhbSBtZW51CisJICogICAgICAgICAgICB0aGUgbWVudSB0byBiZSBwb3B1bGF0ZWQKKwkgKiBAcGFyYW0gcGFydAorCSAqICAgICAgICAgICAgdGhlIHJlbGV2YW50IHBhcnQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVRhYk1lbnUoZmluYWwgTWVudSBtZW51LCBNUGFydCBwYXJ0KSB7CisJCWludCBjbG9zZWFibGVFbGVtZW50cyA9IDA7CisJCWlmIChpc0Nsb3NhYmxlKHBhcnQpKSB7CisJCQlNZW51SXRlbSBtZW51SXRlbUNsb3NlID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKKwkJCW1lbnVJdGVtQ2xvc2Uuc2V0VGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy5tZW51Q2xvc2UpOworCQkJbWVudUl0ZW1DbG9zZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBtZW51LmdldERhdGEoU1RBQ0tfU0VMRUNURURfUEFSVCk7CisJCQkJCUVQYXJ0U2VydmljZSBwYXJ0U2VydmljZSA9IGdldENvbnRleHRGb3JQYXJlbnQocGFydCkuZ2V0KAorCQkJCQkJCUVQYXJ0U2VydmljZS5jbGFzcyk7CisJCQkJCWlmIChwYXJ0U2VydmljZS5zYXZlUGFydChwYXJ0LCB0cnVlKSkKKwkJCQkJCXBhcnRTZXJ2aWNlLmhpZGVQYXJ0KHBhcnQpOworCisJCQkJfQorCQkJfSk7CisJCQljbG9zZWFibGVFbGVtZW50cysrOworCQl9CisKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50ID0gZ2V0UGFyZW50KHBhcnQpOworCQlpZiAocGFyZW50ICE9IG51bGwpIHsKKwkJCWNsb3NlYWJsZUVsZW1lbnRzICs9IGdldENsb3NlYWJsZVNpYmxpbmdQYXJ0cyhwYXJ0KS5zaXplKCk7CisKKwkJCWlmIChjbG9zZWFibGVFbGVtZW50cyA+PSAyKSB7CisJCQkJTWVudUl0ZW0gbWVudUl0ZW1PdGhlcnMgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOworCQkJCW1lbnVJdGVtT3RoZXJzLnNldFRleHQoU1dUUmVuZGVyZXJzTWVzc2FnZXMubWVudUNsb3NlT3RoZXJzKTsKKwkJCQltZW51SXRlbU90aGVycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJLyoqCisJCQkJCSAqCisJCQkJCSAqLworCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJTVBhcnQgcGFydCA9IChNUGFydCkgbWVudS5nZXREYXRhKFNUQUNLX1NFTEVDVEVEX1BBUlQpOworCQkJCQkJY2xvc2VTaWJsaW5nUGFydHMocGFydCwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9KTsKKworCQkJCWludCBsZWZ0RnJvbSA9IGdldENsb3NlYWJsZVNpZGVQYXJ0cyhwYXJ0LCB0cnVlKS5zaXplKCk7CisJCQkJaWYgKGxlZnRGcm9tID4gMCkgeworCQkJCQlNZW51SXRlbSBtZW51SXRlbUxlZnQgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOworCQkJCQltZW51SXRlbUxlZnQuc2V0VGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy5tZW51Q2xvc2VMZWZ0KTsKKwkJCQkJbWVudUl0ZW1MZWZ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQkJLyoqCisJCQkJCQkgKgorCQkJCQkJICovCisJCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQkJTVBhcnQgcGFydCA9IChNUGFydCkgbWVudS5nZXREYXRhKFNUQUNLX1NFTEVDVEVEX1BBUlQpOworCQkJCQkJCWNsb3NlU2lkZVBhcnRzKHBhcnQsIHRydWUpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisKKwkJCQlpbnQgcmlnaHRGcm9tID0gZ2V0Q2xvc2VhYmxlU2lkZVBhcnRzKHBhcnQsIGZhbHNlKS5zaXplKCk7CisJCQkJaWYgKHJpZ2h0RnJvbSA+IDApIHsKKwkJCQkJTWVudUl0ZW0gbWVudUl0ZW1SaWdodCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CisJCQkJCW1lbnVJdGVtUmlnaHQuc2V0VGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy5tZW51Q2xvc2VSaWdodCk7CisJCQkJCW1lbnVJdGVtUmlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJCQkvKioKKwkJCQkJCSAqCisJCQkJCQkgKi8KKwkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBtZW51LmdldERhdGEoU1RBQ0tfU0VMRUNURURfUEFSVCk7CisJCQkJCQkJY2xvc2VTaWRlUGFydHMocGFydCwgZmFsc2UpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisKKwkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7CisKKwkJCQlNZW51SXRlbSBtZW51SXRlbUFsbCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CisJCQkJbWVudUl0ZW1BbGwuc2V0VGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy5tZW51Q2xvc2VBbGwpOworCQkJCW1lbnVJdGVtQWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQkvKioKKwkJCQkJICoKKwkJCQkJICovCisJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBtZW51LmdldERhdGEoU1RBQ0tfU0VMRUNURURfUEFSVCk7CisJCQkJCQljbG9zZVNpYmxpbmdQYXJ0cyhwYXJ0LCBmYWxzZSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gZ2V0UGFyZW50KE1QYXJ0IHBhcnQpIHsKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50ID0gcGFydC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlNUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBwYXJ0LmdldEN1clNoYXJlZFJlZigpOworCQkJcmV0dXJuIHBsYWNlaG9sZGVyID09IG51bGwgPyBudWxsIDogcGxhY2Vob2xkZXIuZ2V0UGFyZW50KCk7CisJCX0KKwkJcmV0dXJuIHBhcmVudDsKKwl9CisKKwlwcml2YXRlIExpc3Q8TVBhcnQ+IGdldENsb3NlYWJsZVNpZGVQYXJ0cyhNUGFydCBwYXJ0LCBib29sZWFuIGxlZnQpIHsKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyID0gZ2V0UGFyZW50KHBhcnQpOworCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgQXJyYXlMaXN0PE1QYXJ0PigpOworCQl9CisKKwkJaW50IHRoaXNQYXJ0SWR4ID0gZ2V0UGFydEluZGV4KHBhcnQsIGNvbnRhaW5lcik7CisJCWlmICh0aGlzUGFydElkeCA9PSAtMSkgeworCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8TVBhcnQ+KCk7CisJCX0KKwkJTGlzdDxNVUlFbGVtZW50PiBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOworCQlmaW5hbCBpbnQgc3RhcnQgPSBsZWZ0ID8gMCA6IHRoaXNQYXJ0SWR4ICsgMTsKKwkJZmluYWwgaW50IGVuZCA9IGxlZnQgPyB0aGlzUGFydElkeCA6IGNoaWxkcmVuLnNpemUoKTsKKworCQlyZXR1cm4gZ2V0Q2xvc2VhYmxlU2libGluZ1BhcnRzKHBhcnQsIGNoaWxkcmVuLCBzdGFydCwgZW5kKTsKKwl9CisKKwlwcml2YXRlIGludCBnZXRQYXJ0SW5kZXgoTVBhcnQgcGFydCwgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyKSB7CisJCUxpc3Q8TVVJRWxlbWVudD4gY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJTVVJRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuLmdldChpKTsKKwkJCU1QYXJ0IG90aGVyUGFydCA9IG51bGw7CisJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCW90aGVyUGFydCA9IChNUGFydCkgY2hpbGQ7CisJCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQkJTVVJRWxlbWVudCBvdGhlckl0ZW0gPSAoKE1QbGFjZWhvbGRlcikgY2hpbGQpLmdldFJlZigpOworCQkJCWlmIChvdGhlckl0ZW0gaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCQlvdGhlclBhcnQgPSAoTVBhcnQpIG90aGVySXRlbTsKKwkJCQl9CisJCQl9CisJCQlpZiAob3RoZXJQYXJ0ID09IHBhcnQpIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcHJpdmF0ZSBMaXN0PE1QYXJ0PiBnZXRDbG9zZWFibGVTaWJsaW5nUGFydHMoTVBhcnQgcGFydCkgeworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIgPSBnZXRQYXJlbnQocGFydCk7CisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8TVBhcnQ+KCk7CisJCX0KKworCQlMaXN0PE1VSUVsZW1lbnQ+IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7CisJCXJldHVybiBnZXRDbG9zZWFibGVTaWJsaW5nUGFydHMocGFydCwgY2hpbGRyZW4sIDAsIGNoaWxkcmVuLnNpemUoKSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PE1QYXJ0PiBnZXRDbG9zZWFibGVTaWJsaW5nUGFydHMoTVBhcnQgcGFydCwgTGlzdDxNVUlFbGVtZW50PiBjaGlsZHJlbiwgZmluYWwgaW50IHN0YXJ0LAorCQkJZmluYWwgaW50IGVuZCkgeworCQkvLyBicm9rZW4gb3V0IGZyb20gY2xvc2VTaWJsaW5nUGFydHMgc28gaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdworCQkvLyBtYW55IGNsb3NlYWJsZSBzaWJsaW5ncyBhcmUgYXZhaWxhYmxlCisJCUxpc3Q8TVBhcnQ+IGNsb3NlYWJsZVNpYmxpbmdzID0gbmV3IEFycmF5TGlzdDxNUGFydD4oKTsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKwkJCU1VSUVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQkvLyBJZiB0aGUgZWxlbWVudCBpc24ndCBzaG93aW5nIHNraXAgaXQKKwkJCWlmICghY2hpbGQuaXNUb0JlUmVuZGVyZWQoKSkKKwkJCQljb250aW51ZTsKKworCQkJTVBhcnQgb3RoZXJQYXJ0ID0gbnVsbDsKKwkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1QYXJ0KQorCQkJCW90aGVyUGFydCA9IChNUGFydCkgY2hpbGQ7CisJCQllbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJCU1VSUVsZW1lbnQgb3RoZXJJdGVtID0gKChNUGxhY2Vob2xkZXIpIGNoaWxkKS5nZXRSZWYoKTsKKwkJCQlpZiAob3RoZXJJdGVtIGluc3RhbmNlb2YgTVBhcnQpCisJCQkJCW90aGVyUGFydCA9IChNUGFydCkgb3RoZXJJdGVtOworCQkJfQorCQkJaWYgKG90aGVyUGFydCA9PSBudWxsKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocGFydC5lcXVhbHMob3RoZXJQYXJ0KSkKKwkJCQljb250aW51ZTsgLy8gc2tpcCBzZWxlY3RlZCBpdGVtCisJCQlpZiAob3RoZXJQYXJ0LmlzVG9CZVJlbmRlcmVkKCkgJiYgaXNDbG9zYWJsZShvdGhlclBhcnQpKQorCQkJCWNsb3NlYWJsZVNpYmxpbmdzLmFkZChvdGhlclBhcnQpOworCQl9CisJCXJldHVybiBjbG9zZWFibGVTaWJsaW5nczsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xvc2VTaWRlUGFydHMoTVBhcnQgcGFydCwgYm9vbGVhbiBsZWZ0KSB7CisJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNvbnRhaW5lciA9IGdldFBhcmVudChwYXJ0KTsKKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJTGlzdDxNUGFydD4gb3RoZXJzID0gZ2V0Q2xvc2VhYmxlU2lkZVBhcnRzKHBhcnQsIGxlZnQpOworCQljbG9zZVNpYmxpbmdQYXJ0cyhwYXJ0LCBvdGhlcnMsIHRydWUpOworCX0KKworCXByaXZhdGUgdm9pZCBjbG9zZVNpYmxpbmdQYXJ0cyhNUGFydCBwYXJ0LCBib29sZWFuIHNraXBUaGlzUGFydCkgeworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIgPSBnZXRQYXJlbnQocGFydCk7CisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCUxpc3Q8TVBhcnQ+IG90aGVycyA9IGdldENsb3NlYWJsZVNpYmxpbmdQYXJ0cyhwYXJ0KTsKKwkJY2xvc2VTaWJsaW5nUGFydHMocGFydCwgb3RoZXJzLCBza2lwVGhpc1BhcnQpOworCX0KKworCXByaXZhdGUgdm9pZCBjbG9zZVNpYmxpbmdQYXJ0cyhNUGFydCBwYXJ0LCBMaXN0PE1QYXJ0PiBvdGhlcnMsIGJvb2xlYW4gc2tpcFRoaXNQYXJ0KSB7CisJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNvbnRhaW5lciA9IGdldFBhcmVudChwYXJ0KTsKKworCQkvLyBhZGQgdGhlIGN1cnJlbnQgcGFydCBsYXN0IHNvIHRoYXQgd2UgdW5yZW5kZXIgb2JzY3VyZWQgaXRlbXMgZmlyc3QKKwkJaWYgKCFza2lwVGhpc1BhcnQgJiYgcGFydC5pc1RvQmVSZW5kZXJlZCgpICYmIGlzQ2xvc2FibGUocGFydCkpIHsKKwkJCW90aGVycy5hZGQocGFydCk7CisJCX0KKworCQkvLyBhZGQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgb2YgdGhlIHN0YWNrIGF0IHRoZSBlbmQsIGVsc2Ugd2UgbWF5IGVuZCB1cAorCQkvLyBzZWxlY3RpbmcgYW5vdGhlciBwYXJ0IHdoZW4gd2UgaGlkZSBpdCBzaW5jZSBpdCBpcyB0aGUgc2VsZWN0ZWQKKwkJLy8gZWxlbWVudAorCQlNVUlFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IGNvbnRhaW5lci5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJaWYgKG90aGVycy5yZW1vdmUoc2VsZWN0ZWRFbGVtZW50KSkgeworCQkJb3RoZXJzLmFkZCgoTVBhcnQpIHNlbGVjdGVkRWxlbWVudCk7CisJCX0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKE1QbGFjZWhvbGRlcikgc2VsZWN0ZWRFbGVtZW50KS5nZXRSZWYoKTsKKwkJCWlmIChvdGhlcnMucmVtb3ZlKHNlbGVjdGVkRWxlbWVudCkpIHsKKwkJCQlvdGhlcnMuYWRkKChNUGFydCkgc2VsZWN0ZWRFbGVtZW50KTsKKwkJCX0KKwkJfQorCisJCUVQYXJ0U2VydmljZSBwYXJ0U2VydmljZSA9IGdldENvbnRleHRGb3JQYXJlbnQocGFydCkuZ2V0KAorCQkJCUVQYXJ0U2VydmljZS5jbGFzcyk7CisJCS8vIHRyeSB1c2luZyB0aGUgSVNhdmVIYW5kbGVyIGZpcnN0Li4uIFRoaXMgZ2l2ZXMgYmV0dGVyIGNvbnRyb2wgb2YKKwkJLy8gZGlhbG9ncy4uLgorCQlJU2F2ZUhhbmRsZXIgc2F2ZUhhbmRsZXIgPSBnZXRDb250ZXh0Rm9yUGFyZW50KHBhcnQpLmdldCgKKwkJCQlJU2F2ZUhhbmRsZXIuY2xhc3MpOworCQlpZiAoc2F2ZUhhbmRsZXIgIT0gbnVsbCkgeworCQkJZmluYWwgTGlzdDxNUGFydD4gdG9Qcm9tcHQgPSBuZXcgQXJyYXlMaXN0PE1QYXJ0PihvdGhlcnMpOworCQkJdG9Qcm9tcHQucmV0YWluQWxsKHBhcnRTZXJ2aWNlLmdldERpcnR5UGFydHMoKSk7CisKKwkJCWJvb2xlYW4gY2FuY2VsID0gZmFsc2U7CisJCQlpZiAodG9Qcm9tcHQuc2l6ZSgpID4gMSkgeworCQkJCWNhbmNlbCA9ICFzYXZlSGFuZGxlci5zYXZlUGFydHModG9Qcm9tcHQsIHRydWUpOworCQkJfSBlbHNlIGlmICh0b1Byb21wdC5zaXplKCkgPT0gMSkgeworCQkJCWNhbmNlbCA9ICFzYXZlSGFuZGxlci5zYXZlKHRvUHJvbXB0LmdldCgwKSwgdHJ1ZSk7CisJCQl9CisJCQlpZiAoY2FuY2VsKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlmb3IgKE1QYXJ0IG90aGVyIDogb3RoZXJzKSB7CisJCQkJcGFydFNlcnZpY2UuaGlkZVBhcnQob3RoZXIpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJLy8gTm8gSVNhdmVIYW5kbGVyLCBmYWxsIGJhY2sgdG8ganVzdCB1c2luZyB0aGUgcGFydCBzZXJ2aWNlLi4uCisJCWZvciAoTVBhcnQgb3RoZXJQYXJ0IDogb3RoZXJzKSB7CisJCQlpZiAocGFydFNlcnZpY2Uuc2F2ZVBhcnQob3RoZXJQYXJ0LCB0cnVlKSkKKwkJCQlwYXJ0U2VydmljZS5oaWRlUGFydChvdGhlclBhcnQpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBNTWVudSBnZXRWaWV3TWVudShNUGFydCBwYXJ0KSB7CisJCWlmIChwYXJ0ID09IG51bGwgfHwgcGFydC5nZXRNZW51cygpID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWZvciAoTU1lbnUgbWVudSA6IHBhcnQuZ2V0TWVudXMoKSkgeworCQkJaWYgKG1lbnUuZ2V0VGFncygpLmNvbnRhaW5zKFRBR19WSUVXX01FTlUpKSB7CisJCQkJcmV0dXJuIG1lbnU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHZpZXcgbWVudSBoYXMgYW55IHZpc2libGUgbWVudSBpdGVtcy4KKwkgKgorCSAqIEBwYXJhbSB2aWV3TWVudQorCSAqICAgICAgICAgICAgdGhlIHZpZXcgbWVudSB0byBjaGVjaworCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgdmlldyBtZW51J3MgcGFyZW50IHBhcnQKKwkgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIHNwZWNpZmllZCB2aWV3IG1lbnUgaGFzIHZpc2libGUgY2hpbGRyZW4sCisJICogICAgICAgICA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFzVmlzaWJsZU1lbnVJdGVtcyhNTWVudSB2aWV3TWVudSwgTVBhcnQgcGFydCkgeworCQlpZiAoIXZpZXdNZW51LmlzVG9CZVJlbmRlcmVkKCkgfHwgIXZpZXdNZW51LmlzVmlzaWJsZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmb3IgKE1NZW51RWxlbWVudCBtZW51RWxlbWVudCA6IHZpZXdNZW51LmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChtZW51RWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpICYmIG1lbnVFbGVtZW50LmlzVmlzaWJsZSgpKSB7CisJCQkJaWYgKE9wYXF1ZUVsZW1lbnRVdGlsLmlzT3BhcXVlTWVudUl0ZW0obWVudUVsZW1lbnQpCisJCQkJCQl8fCBPcGFxdWVFbGVtZW50VXRpbC5pc09wYXF1ZU1lbnVTZXBhcmF0b3IobWVudUVsZW1lbnQpKSB7CisJCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIE9wYXF1ZUVsZW1lbnRVdGlsCisJCQkJCQkJLmdldE9wYXF1ZUl0ZW0obWVudUVsZW1lbnQpOworCQkJCQlpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uaXNWaXNpYmxlKCkpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJT2JqZWN0IG1lbnVSZW5kZXJlciA9IHZpZXdNZW51LmdldFJlbmRlcmVyKCk7CisJCWlmIChtZW51UmVuZGVyZXIgaW5zdGFuY2VvZiBNZW51TWFuYWdlclJlbmRlcmVyKSB7CisJCQlNZW51TWFuYWdlciBtYW5hZ2VyID0gKChNZW51TWFuYWdlclJlbmRlcmVyKSBtZW51UmVuZGVyZXIpCisJCQkJCS5nZXRNYW5hZ2VyKHZpZXdNZW51KTsKKwkJCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc1Zpc2libGUoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHBhcnQuZ2V0V2lkZ2V0KCk7CisJCWlmIChjb250cm9sICE9IG51bGwpIHsKKwkJCU1lbnUgbWVudSA9IChNZW51KSByZW5kZXJlci5jcmVhdGVHdWkodmlld01lbnUsIGNvbnRyb2wuZ2V0U2hlbGwoKSwKKwkJCQkJcGFydC5nZXRDb250ZXh0KCkpOworCQkJaWYgKG1lbnUgIT0gbnVsbCkgeworCQkJCW1lbnVSZW5kZXJlciA9IHZpZXdNZW51LmdldFJlbmRlcmVyKCk7CisJCQkJaWYgKG1lbnVSZW5kZXJlciBpbnN0YW5jZW9mIE1lbnVNYW5hZ2VyUmVuZGVyZXIpIHsKKwkJCQkJTWVudU1hbmFnZXJSZW5kZXJlciBtZW51TWFuYWdlclJlbmRlcmVyID0gKE1lbnVNYW5hZ2VyUmVuZGVyZXIpIG1lbnVSZW5kZXJlcjsKKwkJCQkJTWVudU1hbmFnZXIgbWFuYWdlciA9IG1lbnVNYW5hZ2VyUmVuZGVyZXIKKwkJCQkJCQkuZ2V0TWFuYWdlcih2aWV3TWVudSk7CisJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKKwkJCQkJCS8vIHJlbWFyayBvdXJzZWx2ZXMgYXMgZGlydHkgc28gdGhhdCB0aGUgbWVudSB3aWxsIGJlCisJCQkJCQkvLyByZWNvbnN0cnVjdGVkCisJCQkJCQltYW5hZ2VyLm1hcmtEaXJ0eSgpOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBtZW51LmdldEl0ZW1Db3VudCgpICE9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIEBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwkvLyBwdWJsaWMgY2xhc3MgVGFiU3RhdGVIYW5kbGVyIGltcGxlbWVudHMgRXZlbnRIYW5kbGVyIHsKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCS8vIE9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCS8vIE9iamVjdCBuZXdWYWx1ZSA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCS8vIE9iamVjdCBvbGRWYWx1ZSA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5PTERfVkFMVUUpOworCS8vCisJLy8gaWYgKCF2YWxpZGF0ZUVsZW1lbnQoZWxlbWVudCkKKwkvLyB8fCAhdmFsaWRhdGVWYWx1ZXMob2xkVmFsdWUsIG5ld1ZhbHVlKSkgeworCS8vIHJldHVybjsKKwkvLyB9CisJLy8KKwkvLyBNUGFydCBwYXJ0ID0gbmV3VmFsdWUgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIgPyAoTVBhcnQpICgoTVBsYWNlaG9sZGVyKQorCS8vIG5ld1ZhbHVlKQorCS8vIC5nZXRSZWYoKSA6IChNUGFydCkgZWxlbWVudDsKKwkvLyBDVGFiSXRlbSBjdGkgPSBmaW5kSXRlbUZvclBhcnQocGFydCk7CisJLy8KKwkvLyBpZiAoY3RpID09IG51bGwpIHsKKwkvLyByZXR1cm47CisJLy8gfQorCS8vCisJLy8gaWYgKENTU0NvbnN0YW50cy5DU1NfQ09OVEVOVF9DSEFOR0VfQ0xBU1MuZXF1YWxzKG5ld1ZhbHVlKSkgeworCS8vIHBhcnQuZ2V0VGFncygpLnJlbW92ZShDU1NDb25zdGFudHMuQ1NTX0NPTlRFTlRfQ0hBTkdFX0NMQVNTKTsKKwkvLyBpZiAoY3RpICE9IGN0aS5nZXRQYXJlbnQoKS5nZXRTZWxlY3Rpb24oKSkgeworCS8vIHBhcnQuZ2V0VGFncygpLmFkZChDU1NDb25zdGFudHMuQ1NTX0hJR0hMSUdIVEVEX0NMQVNTKTsKKwkvLyB9CisJLy8gfSBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlciAvLyBwYXJ0IGdldHMgYWN0aXZlCisJLy8gJiYgcGFydC5nZXRUYWdzKCkuY29udGFpbnMoCisJLy8gQ1NTQ29uc3RhbnRzLkNTU19ISUdITElHSFRFRF9DTEFTUykpIHsKKwkvLyBwYXJ0LmdldFRhZ3MoKS5yZW1vdmUoQ1NTQ29uc3RhbnRzLkNTU19ISUdITElHSFRFRF9DTEFTUyk7CisJLy8gfQorCS8vCisJLy8gU3RyaW5nIHByZXZDc3NDbHMgPSBXaWRnZXRFbGVtZW50LmdldENTU0NsYXNzKGN0aSk7CisJLy8gc2V0Q1NTSW5mbyhwYXJ0LCBjdGkpOworCS8vCisJLy8gaWYgKHByZXZDc3NDbHMgPT0gbnVsbCB8fAorCS8vICFwcmV2Q3NzQ2xzLmVxdWFscyhXaWRnZXRFbGVtZW50LmdldENTU0NsYXNzKGN0aSkpKSB7CisJLy8gcmVhcHBseVN0eWxlcyhjdGkuZ2V0UGFyZW50KCkpOworCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkvLyByZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrOworCS8vIH0KKwkvLworCS8vIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVzKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJLy8gcmV0dXJuIG5ld1ZhbHVlIGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyIC8vIHBhcnQgZ2V0cyBhY3RpdmUKKwkvLyB8fCBpc1RhZ0FkZGVkKENTU0NvbnN0YW50cy5DU1NfQlVTWV9DTEFTUywgb2xkVmFsdWUsCisJLy8gbmV3VmFsdWUpIC8vIHBhcnQgZ2V0cyBidXN5CisJLy8gfHwgaXNUYWdSZW1vdmVkKENTU0NvbnN0YW50cy5DU1NfQlVTWV9DTEFTUywgb2xkVmFsdWUsCisJLy8gbmV3VmFsdWUpIC8vIHBhcnQgZ2V0cyBpZGxlCisJLy8gfHwgaXNUYWdBZGRlZChDU1NDb25zdGFudHMuQ1NTX0NPTlRFTlRfQ0hBTkdFX0NMQVNTLAorCS8vIG9sZFZhbHVlLCBuZXdWYWx1ZSk7IC8vIGNvbnRlbnQgb2YgcGFydCBjaGFuZ2VkCisJLy8gfQorCS8vCisJLy8gcHJpdmF0ZSBib29sZWFuIGlzVGFnQWRkZWQoU3RyaW5nIHRhZ05hbWUsIE9iamVjdCBvbGRWYWx1ZSwKKwkvLyBPYmplY3QgbmV3VmFsdWUpIHsKKwkvLyByZXR1cm4gb2xkVmFsdWUgPT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFscyhuZXdWYWx1ZSk7CisJLy8gfQorCS8vCisJLy8gcHJpdmF0ZSBib29sZWFuIGlzVGFnUmVtb3ZlZChTdHJpbmcgdGFnTmFtZSwgT2JqZWN0IG9sZFZhbHVlLAorCS8vIE9iamVjdCBuZXdWYWx1ZSkgeworCS8vIHJldHVybiBuZXdWYWx1ZSA9PSBudWxsICYmIHRhZ05hbWUuZXF1YWxzKG9sZFZhbHVlKTsKKwkvLyB9CisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Ub29sQmFyQ29udHJpYnV0aW9uUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Ub29sQmFyQ29udHJpYnV0aW9uUmVjb3JkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiN2MzNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xCYXJDb250cmlidXRpb25SZWNvcmQuamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1heGltZSBQb3JoZWwgPG1heGltZS5wb3JoZWxAb2Jlby5mcj4gT2JlbyAtIEJ1ZyA0MTA0MjYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uSW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuRWNsaXBzZUNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db3JlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXJDb250cmlidXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhckVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhclNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWSA9ICJUb29sQmFyQ29udHJpYnV0aW9uRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKKwlzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19DT05URVhUID0gIlRvb2xCYXJDb250cmlidXRpb25GYWN0b3J5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKworCU1Ub29sQmFyIHRvb2xiYXJNb2RlbDsKKwlNVG9vbEJhckNvbnRyaWJ1dGlvbiB0b29sYmFyQ29udHJpYnV0aW9uOworCUFycmF5TGlzdDxNVG9vbEJhckVsZW1lbnQ+IGdlbmVyYXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNVG9vbEJhckVsZW1lbnQ+KCk7CisJSGFzaFNldDxNVG9vbEJhckVsZW1lbnQ+IHNoYXJlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8TVRvb2xCYXJFbGVtZW50PigpOworCVRvb2xCYXJNYW5hZ2VyUmVuZGVyZXIgcmVuZGVyZXI7CisJYm9vbGVhbiBpc1Zpc2libGUgPSB0cnVlOworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGluZm9Db250ZXh0OworCXByaXZhdGUgUnVubmFibGUgZmFjdG9yeURpc3Bvc2U7CisKKwlwdWJsaWMgVG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZChNVG9vbEJhciBtb2RlbCwKKwkJCU1Ub29sQmFyQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiwgVG9vbEJhck1hbmFnZXJSZW5kZXJlciByZW5kZXJlcikgeworCQl0aGlzLnRvb2xiYXJNb2RlbCA9IG1vZGVsOworCQl0aGlzLnRvb2xiYXJDb250cmlidXRpb24gPSBjb250cmlidXRpb247CisJCXRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKKwl9CisKKwlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0TWFuYWdlckZvck1vZGVsKCkgeworCQlyZXR1cm4gcmVuZGVyZXIuZ2V0TWFuYWdlcih0b29sYmFyTW9kZWwpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgdXBkYXRlVmlzaWJpbGl0eShJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlFeHByZXNzaW9uQ29udGV4dCBleHByQ29udGV4dCA9IG5ldyBFeHByZXNzaW9uQ29udGV4dChjb250ZXh0KTsKKwkJdXBkYXRlSXNWaXNpYmxlKGV4cHJDb250ZXh0KTsKKwkJSGFzaFNldDxUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkPiByZWNlbnRseVVwZGF0ZWQgPSBuZXcgSGFzaFNldDxUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkPigpOworCQlyZWNlbnRseVVwZGF0ZWQuYWRkKHRoaXMpOworCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKwkJZm9yIChNVG9vbEJhckVsZW1lbnQgaXRlbSA6IGdlbmVyYXRlZEVsZW1lbnRzKSB7CisJCQlib29sZWFuIGN1cnJlbnRWaXNpYmlsaXR5ID0gY29tcHV0ZVZpc2liaWxpdHkocmVjZW50bHlVcGRhdGVkLAorCQkJCQlpdGVtLCBleHByQ29udGV4dCk7CisJCQlpZiAoaXRlbS5pc1Zpc2libGUoKSAhPSBjdXJyZW50VmlzaWJpbGl0eSkgeworCQkJCWl0ZW0uc2V0VmlzaWJsZShjdXJyZW50VmlzaWJpbGl0eSk7CisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQl9CisJCX0KKwkJZm9yIChNVG9vbEJhckVsZW1lbnQgaXRlbSA6IHNoYXJlZEVsZW1lbnRzKSB7CisJCQlib29sZWFuIGN1cnJlbnRWaXNpYmlsaXR5ID0gY29tcHV0ZVZpc2liaWxpdHkocmVjZW50bHlVcGRhdGVkLAorCQkJCQlpdGVtLCBleHByQ29udGV4dCk7CisJCQlpZiAoaXRlbS5pc1Zpc2libGUoKSAhPSBjdXJyZW50VmlzaWJpbGl0eSkgeworCQkJCWl0ZW0uc2V0VmlzaWJsZShjdXJyZW50VmlzaWJpbGl0eSk7CisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQl9CisJCX0KKworCQlpZiAoY2hhbmdlZCkgeworCQkJZ2V0TWFuYWdlckZvck1vZGVsKCkubWFya0RpcnR5KCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVJc1Zpc2libGUoRXhwcmVzc2lvbkNvbnRleHQgZXhwckNvbnRleHQpIHsKKwkJaXNWaXNpYmxlID0gQ29udHJpYnV0aW9uc0FuYWx5emVyLmlzVmlzaWJsZSh0b29sYmFyQ29udHJpYnV0aW9uLAorCQkJCWV4cHJDb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb21wdXRlVmlzaWJpbGl0eSgKKwkJCUhhc2hTZXQ8VG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZD4gcmVjZW50bHlVcGRhdGVkLAorCQkJTVRvb2xCYXJFbGVtZW50IGl0ZW0sIEV4cHJlc3Npb25Db250ZXh0IGV4cHJDb250ZXh0KSB7CisJCWJvb2xlYW4gY3VycmVudFZpc2liaWxpdHkgPSBpc1Zpc2libGU7CisJCWlmIChpdGVtIGluc3RhbmNlb2YgTVRvb2xCYXJTZXBhcmF0b3IpIHsKKwkJCUFycmF5TGlzdDxUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkPiBsaXN0ID0gcmVuZGVyZXIuZ2V0TGlzdChpdGVtKTsKKwkJCWlmIChsaXN0ICE9IG51bGwpIHsKKwkJCQlJdGVyYXRvcjxUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkPiBjciA9IGxpc3QuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoIWN1cnJlbnRWaXNpYmlsaXR5ICYmIGNyLmhhc05leHQoKSkgeworCQkJCQlUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkIHJlYyA9IGNyLm5leHQoKTsKKwkJCQkJaWYgKCFyZWNlbnRseVVwZGF0ZWQuY29udGFpbnMocmVjKSkgeworCQkJCQkJcmVjLnVwZGF0ZUlzVmlzaWJsZShleHByQ29udGV4dCk7CisJCQkJCQlyZWNlbnRseVVwZGF0ZWQuYWRkKHJlYyk7CisJCQkJCX0KKwkJCQkJY3VycmVudFZpc2liaWxpdHkgfD0gcmVjLmlzVmlzaWJsZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGN1cnJlbnRWaXNpYmlsaXR5CisJCQkJJiYgaXRlbS5nZXRQZXJzaXN0ZWRTdGF0ZSgpLmdldCgKKwkJCQkJCU1lbnVNYW5hZ2VyUmVuZGVyZXIuVklTSUJJTElUWV9JREVOVElGSUVSKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgaWRlbnRpZmllciA9IGl0ZW0uZ2V0UGVyc2lzdGVkU3RhdGUoKS5nZXQoCisJCQkJCU1lbnVNYW5hZ2VyUmVuZGVyZXIuVklTSUJJTElUWV9JREVOVElGSUVSKTsKKwkJCU9iamVjdCByYyA9IGV4cHJDb250ZXh0LmVjbGlwc2VDb250ZXh0LmdldChpZGVudGlmaWVyKTsKKwkJCWlmIChyYyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkJCQljdXJyZW50VmlzaWJpbGl0eSA9ICgoQm9vbGVhbikgcmMpLmJvb2xlYW5WYWx1ZSgpOworCQkJfQorCQl9CisJCWlmIChjdXJyZW50VmlzaWJpbGl0eQorCQkJCSYmIGl0ZW0uZ2V0VmlzaWJsZVdoZW4oKSBpbnN0YW5jZW9mIE1Db3JlRXhwcmVzc2lvbikgeworCQkJYm9vbGVhbiB2YWwgPSBDb250cmlidXRpb25zQW5hbHl6ZXIuaXNWaXNpYmxlKAorCQkJCQkoTUNvcmVFeHByZXNzaW9uKSBpdGVtLmdldFZpc2libGVXaGVuKCksIGV4cHJDb250ZXh0KTsKKwkJCWN1cnJlbnRWaXNpYmlsaXR5ID0gdmFsOworCQl9CisJCXJldHVybiBjdXJyZW50VmlzaWJpbGl0eTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb2xsZWN0SW5mbyhFeHByZXNzaW9uSW5mbyBpbmZvKSB7CisJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5jb2xsZWN0SW5mbyhpbmZvLAorCQkJCXRvb2xiYXJDb250cmlidXRpb24uZ2V0VmlzaWJsZVdoZW4oKSk7CisJCWZvciAoTVRvb2xCYXJFbGVtZW50IGl0ZW0gOiBnZW5lcmF0ZWRFbGVtZW50cykgeworCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLmNvbGxlY3RJbmZvKGluZm8sIGl0ZW0uZ2V0VmlzaWJsZVdoZW4oKSk7CisJCX0KKwkJZm9yIChNVG9vbEJhckVsZW1lbnQgaXRlbSA6IHNoYXJlZEVsZW1lbnRzKSB7CisJCQlDb250cmlidXRpb25zQW5hbHl6ZXIuY29sbGVjdEluZm8oaW5mbywgaXRlbS5nZXRWaXNpYmxlV2hlbigpKTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGFueVZpc2libGVXaGVuKCkgeworCQlpZiAodG9vbGJhckNvbnRyaWJ1dGlvbi5nZXRWaXNpYmxlV2hlbigpICE9IG51bGwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJTGlzdDxNVG9vbEJhckVsZW1lbnQ+IGNoaWxkcmVuVG9JbnNwZWN0OworCQlpZiAodG9vbGJhckNvbnRyaWJ1dGlvbi5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KEZBQ1RPUlkpICE9IG51bGwpIHsKKwkJCS8vIFNlZSBtZXJnZUludG9Nb2RlbAorCQkJY2hpbGRyZW5Ub0luc3BlY3QgPSB0aGlzLmdlbmVyYXRlZEVsZW1lbnRzOworCQl9IGVsc2UgeworCQkJY2hpbGRyZW5Ub0luc3BlY3QgPSB0b29sYmFyQ29udHJpYnV0aW9uLmdldENoaWxkcmVuKCk7CisJCX0KKworCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuVG9JbnNwZWN0KSB7CisJCQlpZiAoY2hpbGQuZ2V0VmlzaWJsZVdoZW4oKSAhPSBudWxsCisJCQkJCXx8IGNoaWxkLmdldFBlcnNpc3RlZFN0YXRlKCkuZ2V0KAorCQkJCQkJCU1lbnVNYW5hZ2VyUmVuZGVyZXIuVklTSUJJTElUWV9JREVOVElGSUVSKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIG1lcmdlSW50b01vZGVsKCkgeworCQlpbnQgaWR4ID0gZ2V0SW5kZXgodG9vbGJhck1vZGVsLAorCQkJCXRvb2xiYXJDb250cmlidXRpb24uZ2V0UG9zaXRpb25JblBhcmVudCgpKTsKKwkJaWYgKGlkeCA9PSAtMSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJZmluYWwgTGlzdDxNVG9vbEJhckVsZW1lbnQ+IGNvcHlFbGVtZW50czsKKwkJaWYgKHRvb2xiYXJDb250cmlidXRpb24uZ2V0VHJhbnNpZW50RGF0YSgpLmdldChGQUNUT1JZKSAhPSBudWxsKSB7CisJCQljb3B5RWxlbWVudHMgPSBtZXJnZUZhY3RvcnlJbnRvTW9kZWwoKTsKKwkJfSBlbHNlIHsKKwkJCWNvcHlFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8TVRvb2xCYXJFbGVtZW50PigpOworCQkJZm9yIChNVG9vbEJhckVsZW1lbnQgaXRlbSA6IHRvb2xiYXJDb250cmlidXRpb24uZ2V0Q2hpbGRyZW4oKSkgeworCQkJCU1Ub29sQmFyRWxlbWVudCBjb3B5ID0gKE1Ub29sQmFyRWxlbWVudCkgRWNvcmVVdGlsCisJCQkJCQkuY29weSgoRU9iamVjdCkgaXRlbSk7CisJCQkJY29weUVsZW1lbnRzLmFkZChjb3B5KTsKKwkJCX0KKwkJfQorCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBjb3B5IDogY29weUVsZW1lbnRzKSB7CisJCQkvLyBpZiBhIHZpc2libGVXaGVuIGNsYXVzZSBpcyBkZWZpbmVkLCB0aGUgaXRlbSBzaG91bGQgbm90IGJlCisJCQkvLyB2aXNpYmxlIHVudGlsIHRoZSBjbGF1c2UgaGFzIGJlZW4gZXZhbHVhdGVkIGFuZCByZXR1cm5lZCAndHJ1ZScKKwkJCWNvcHkuc2V0VmlzaWJsZSghYW55VmlzaWJsZVdoZW4oKSk7CisJCQlpZiAoY29weSBpbnN0YW5jZW9mIE1Ub29sQmFyU2VwYXJhdG9yKSB7CisJCQkJTVRvb2xCYXJTZXBhcmF0b3Igc2hhcmVkID0gZmluZEV4aXN0aW5nU2VwYXJhdG9yKGNvcHkKKwkJCQkJCS5nZXRFbGVtZW50SWQoKSk7CisJCQkJaWYgKHNoYXJlZCA9PSBudWxsKSB7CisJCQkJCXNoYXJlZCA9IChNVG9vbEJhclNlcGFyYXRvcikgY29weTsKKwkJCQkJcmVuZGVyZXIubGlua0VsZW1lbnRUb0NvbnRyaWJ1dGlvblJlY29yZChjb3B5LCB0aGlzKTsKKwkJCQkJdG9vbGJhck1vZGVsLmdldENoaWxkcmVuKCkuYWRkKGlkeCsrLCBjb3B5KTsKKwkJCQl9IGVsc2UgeworCQkJCQljb3B5ID0gc2hhcmVkOworCQkJCX0KKwkJCQlzaGFyZWRFbGVtZW50cy5hZGQoc2hhcmVkKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2VuZXJhdGVkRWxlbWVudHMuYWRkKGNvcHkpOworCQkJCXJlbmRlcmVyLmxpbmtFbGVtZW50VG9Db250cmlidXRpb25SZWNvcmQoY29weSwgdGhpcyk7CisJCQkJdG9vbGJhck1vZGVsLmdldENoaWxkcmVuKCkuYWRkKGlkeCsrLCBjb3B5KTsKKwkJCX0KKwkJCWlmIChjb3B5IGluc3RhbmNlb2YgTVRvb2xCYXJTZXBhcmF0b3IpIHsKKwkJCQlBcnJheUxpc3Q8VG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZD4gYXJyYXkgPSByZW5kZXJlcgorCQkJCQkJLmdldExpc3QoY29weSk7CisJCQkJYXJyYXkuYWRkKHRoaXMpOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIExpc3Q8TVRvb2xCYXJFbGVtZW50PiBtZXJnZUZhY3RvcnlJbnRvTW9kZWwoKSB7CisJCU9iamVjdCBvYmogPSB0b29sYmFyQ29udHJpYnV0aW9uLmdldFRyYW5zaWVudERhdGEoKS5nZXQoRkFDVE9SWSk7CisJCWlmICghKG9iaiBpbnN0YW5jZW9mIElDb250ZXh0RnVuY3Rpb24pKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwkJfQorCQlJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCA9IGdldFN0YXRpY0NvbnRleHQoKTsKKwkJc3RhdGljQ29udGV4dC5yZW1vdmUoTGlzdC5jbGFzcyk7CisJCWZhY3RvcnlEaXNwb3NlID0gKFJ1bm5hYmxlKSAoKElDb250ZXh0RnVuY3Rpb24pIG9iaikuY29tcHV0ZSgKKwkJCQlzdGF0aWNDb250ZXh0LCBudWxsKTsKKwkJcmV0dXJuIHN0YXRpY0NvbnRleHQuZ2V0KExpc3QuY2xhc3MpOworCX0KKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGdldFN0YXRpY0NvbnRleHQoKSB7CisJCWlmIChpbmZvQ29udGV4dCA9PSBudWxsKSB7CisJCQlJRWNsaXBzZUNvbnRleHQgcGFyZW50Q29udGV4dCA9IHJlbmRlcmVyLmdldENvbnRleHQodG9vbGJhck1vZGVsKTsKKwkJCWlmIChwYXJlbnRDb250ZXh0ICE9IG51bGwpIHsKKwkJCQlpbmZvQ29udGV4dCA9IHBhcmVudENvbnRleHQuY3JlYXRlQ2hpbGQoU1RBVElDX0NPTlRFWFQpOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvQ29udGV4dCA9IEVjbGlwc2VDb250ZXh0RmFjdG9yeS5jcmVhdGUoU1RBVElDX0NPTlRFWFQpOworCQkJfQorCQkJQ29udHJpYnV0aW9uc0FuYWx5emVyLnBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKHRvb2xiYXJNb2RlbCwKKwkJCQkJaW5mb0NvbnRleHQsIHRvb2xiYXJNb2RlbC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSk7CisJCQlpbmZvQ29udGV4dC5zZXQoVG9vbEJhck1hbmFnZXJSZW5kZXJlci5jbGFzcywgcmVuZGVyZXIpOworCQl9CisJCXJldHVybiBpbmZvQ29udGV4dDsKKwl9CisKKwlNVG9vbEJhclNlcGFyYXRvciBmaW5kRXhpc3RpbmdTZXBhcmF0b3IoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBpdGVtIDogdG9vbGJhck1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChpdGVtIGluc3RhbmNlb2YgTVRvb2xCYXJTZXBhcmF0b3IKKwkJCQkJJiYgaWQuZXF1YWxzKGl0ZW0uZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJcmV0dXJuIChNVG9vbEJhclNlcGFyYXRvcikgaXRlbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBjb3B5IDogZ2VuZXJhdGVkRWxlbWVudHMpIHsKKwkJCXRvb2xiYXJNb2RlbC5nZXRDaGlsZHJlbigpLnJlbW92ZShjb3B5KTsKKwkJfQorCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBzaGFyZWQgOiBzaGFyZWRFbGVtZW50cykgeworCQkJQXJyYXlMaXN0PFRvb2xCYXJDb250cmlidXRpb25SZWNvcmQ+IGFycmF5ID0gcmVuZGVyZXIKKwkJCQkJLmdldExpc3Qoc2hhcmVkKTsKKwkJCWFycmF5LnJlbW92ZSh0aGlzKTsKKwkJCWlmIChhcnJheS5pc0VtcHR5KCkpIHsKKwkJCQl0b29sYmFyTW9kZWwuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoc2hhcmVkKTsKKwkJCX0KKwkJfQorCQlpZiAoZmFjdG9yeURpc3Bvc2UgIT0gbnVsbCkgeworCQkJZmFjdG9yeURpc3Bvc2UucnVuKCk7CisJCQlmYWN0b3J5RGlzcG9zZSA9IG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW5kZXgoTUVsZW1lbnRDb250YWluZXI8Pz4gbW9kZWwsCisJCQlTdHJpbmcgcG9zaXRpb25JblBhcmVudCkgeworCQlTdHJpbmcgaWQgPSBudWxsOworCQlTdHJpbmcgbW9kaWZpZXIgPSBudWxsOworCQlpZiAocG9zaXRpb25JblBhcmVudCAhPSBudWxsICYmIHBvc2l0aW9uSW5QYXJlbnQubGVuZ3RoKCkgPiAwKSB7CisJCQlTdHJpbmdbXSBhcnJheSA9IHBvc2l0aW9uSW5QYXJlbnQuc3BsaXQoIj0iKTsgLy8kTk9OLU5MUy0xJAorCQkJbW9kaWZpZXIgPSBhcnJheVswXTsKKwkJCWlkID0gYXJyYXlbMV07CisJCX0KKwkJaWYgKGlkID09IG51bGwpIHsKKwkJCXJldHVybiBtb2RlbC5nZXRDaGlsZHJlbigpLnNpemUoKTsKKwkJfQorCisJCWludCBpZHggPSAwOworCQlpbnQgc2l6ZSA9IG1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpOworCQl3aGlsZSAoaWR4IDwgc2l6ZSkgeworCQkJaWYgKGlkLmVxdWFscyhtb2RlbC5nZXRDaGlsZHJlbigpLmdldChpZHgpLmdldEVsZW1lbnRJZCgpKSkgeworCQkJCWlmICgiYWZ0ZXIiLmVxdWFscyhtb2RpZmllcikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZHgrKzsKKwkJCQl9IGVsc2UgaWYgKCJlbmRvZiIuZXF1YWxzKG1vZGlmaWVyKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCS8vIFNraXAgY3VycmVudCBtZW51IGl0ZW0KKwkJCQkJaWR4Kys7CisKKwkJCQkJLy8gU2tpcCBhbGwgbWVudSBpdGVtcyB1bnRpbCBuZXh0IE1lbnVTZXBhcmF0b3IgaXMgZm91bmQKKwkJCQkJd2hpbGUgKGlkeCA8IHNpemUKKwkJCQkJCQkmJiAhKG1vZGVsLmdldENoaWxkcmVuKCkuZ2V0KGlkeCkgaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvciAmJiBtb2RlbAorCQkJCQkJCQkJLmdldENoaWxkcmVuKCkuZ2V0KGlkeCkuZ2V0RWxlbWVudElkKCkgIT0gbnVsbCkpIHsKKwkJCQkJCWlkeCsrOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBpZHg7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCQlyZXR1cm4gaWQuZXF1YWxzKCJhZGRpdGlvbnMiKSA/IG1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpIDogLTE7IC8vJE5PTi1OTFMtMSQKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVG9vbEJhck1hbmFnZXJSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVG9vbEJhck1hbmFnZXJSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Ub29sQmFyTWFuYWdlclJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSw5ODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBNYXhpbWUgUG9yaGVsIDxtYXhpbWUucG9yaGVsQG9iZW8uZnI+IE9iZW8gLSBCdWcgNDEwNDI2CisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDI2NTM1LCA0MzMyMzQsIDQzMTg2OAorICogICAgIE1heGltZSBQb3JoZWwgPG1heGltZS5wb3JoZWxAb2Jlby5mcj4gT2JlbyAtIEJ1ZyA0MzE3NzgKKyAqICAgICBBbmRyZXkgTG9za3V0b3YgPGxvc2t1dG92QGdteC5kZT4gLSBCdWdzIDM4MzU2OSwgNDU3MTk4CisgKiAgICAgRGlyayBGYXV0aCA8ZGlyay5mYXV0aEBnb29nbGVtYWlsLmNvbT4gLSBCdWcgNDMxOTkwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25JbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JQ29udGV4dEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuUnVuQW5kVHJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlFdmVudFRvcGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Db250cmlidXRpb25zQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLk9wYXF1ZUVsZW1lbnRVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQWJzdHJhY3RQYXJ0UmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5DU1NSZW5kZXJpbmdVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLlNpZGVWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbUJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EaXJlY3RUb29sSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1IYW5kbGVkVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyQ29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXJFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXJTZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVNlcnZpY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlNlbGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuRXZlbnRUYWdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BYnN0cmFjdEdyb3VwTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKKworLyoqCisgKiBDcmVhdGUgYSBjb250cmlidXRlIHBhcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBUb29sQmFyTWFuYWdlclJlbmRlcmVyIGV4dGVuZHMgU1dUUGFydFJlbmRlcmVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlbGVjdG9yIEFMTF9TRUxFQ1RPUiA9IG5ldyBTZWxlY3RvcigpIHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gc2VsZWN0KE1BcHBsaWNhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9OworCisJLyoqCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RfUFJPQ0VTU0lOR19GVU5DVElPTiA9ICJUb29sQmFyTWFuYWdlclJlbmRlcmVyLnBvc3RQcm9jZXNzLmZ1bmMiOyAvLyROT04tTkxTLTEkCisJLyoqCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RfUFJPQ0VTU0lOR19ESVNQT1NFID0gIlRvb2xCYXJNYW5hZ2VyUmVuZGVyZXIucG9zdFByb2Nlc3MuZGlzcG9zZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX1ZBUlMgPSAiVG9vbEJhck1hbmFnZXJSZW5kZXJlci51cGRhdGVWYXJzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NFX0FEREVEID0gIlRvb2xCYXJNYW5hZ2VyUmVuZGVyZXIuZGlzcG9zZUFkZGVkIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBNYXA8TVRvb2xCYXIsIFRvb2xCYXJNYW5hZ2VyPiBtb2RlbFRvTWFuYWdlciA9IG5ldyBIYXNoTWFwPE1Ub29sQmFyLCBUb29sQmFyTWFuYWdlcj4oKTsKKwlwcml2YXRlIE1hcDxUb29sQmFyTWFuYWdlciwgTVRvb2xCYXI+IG1hbmFnZXJUb01vZGVsID0gbmV3IEhhc2hNYXA8VG9vbEJhck1hbmFnZXIsIE1Ub29sQmFyPigpOworCisJcHJpdmF0ZSBNYXA8TVRvb2xCYXJFbGVtZW50LCBJQ29udHJpYnV0aW9uSXRlbT4gbW9kZWxUb0NvbnRyaWJ1dGlvbiA9IG5ldyBIYXNoTWFwPE1Ub29sQmFyRWxlbWVudCwgSUNvbnRyaWJ1dGlvbkl0ZW0+KCk7CisJcHJpdmF0ZSBNYXA8SUNvbnRyaWJ1dGlvbkl0ZW0sIE1Ub29sQmFyRWxlbWVudD4gY29udHJpYnV0aW9uVG9Nb2RlbCA9IG5ldyBIYXNoTWFwPElDb250cmlidXRpb25JdGVtLCBNVG9vbEJhckVsZW1lbnQ+KCk7CisKKwlwcml2YXRlIE1hcDxNVG9vbEJhckVsZW1lbnQsIFRvb2xCYXJDb250cmlidXRpb25SZWNvcmQ+IG1vZGVsQ29udHJpYnV0aW9uVG9SZWNvcmQgPSBuZXcgSGFzaE1hcDxNVG9vbEJhckVsZW1lbnQsIFRvb2xCYXJDb250cmlidXRpb25SZWNvcmQ+KCk7CisKKwlwcml2YXRlIE1hcDxNVG9vbEJhckVsZW1lbnQsIEFycmF5TGlzdDxUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkPj4gc2hhcmVkRWxlbWVudFRvUmVjb3JkID0gbmV3IEhhc2hNYXA8TVRvb2xCYXJFbGVtZW50LCBBcnJheUxpc3Q8VG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZD4+KCk7CisKKwlwcml2YXRlIFRvb2xJdGVtVXBkYXRlciBlbmFibGVtZW50VXBkYXRlciA9IG5ldyBUb29sSXRlbVVwZGF0ZXIoKTsKKworCUBJbmplY3QKKwlwcml2YXRlIE1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKworCUBJbmplY3QKKwlFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNVcGRhdGVJdGVtcyhAVUlFdmVudFRvcGljKFVJRXZlbnRzLlVJTGFiZWwuVE9QSUNfQUxMKSBFdmVudCBldmVudCkgeworCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1Ub29sQmFyRWxlbWVudAorCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNVG9vbEJhckVsZW1lbnQpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNVG9vbEJhckVsZW1lbnQgaXRlbU1vZGVsID0gKE1Ub29sQmFyRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCUlDb250cmlidXRpb25JdGVtIGljaSA9IGdldENvbnRyaWJ1dGlvbihpdGVtTW9kZWwpOworCQlpZiAoaWNpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkFUVE5BTUUpOworCQlpZiAoVUlFdmVudHMuVUlMYWJlbC5MQUJFTC5lcXVhbHMoYXR0TmFtZSkgfHwgVUlFdmVudHMuVUlMYWJlbC5MT0NBTElaRURfTEFCRUwuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQlpY2kudXBkYXRlKCk7CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuVUlMYWJlbC5JQ09OVVJJLmVxdWFscyhhdHROYW1lKSkgeworCQkJaWNpLnVwZGF0ZSgpOworCQl9IGVsc2UgaWYgKFVJRXZlbnRzLlVJTGFiZWwuVE9PTFRJUC5lcXVhbHMoYXR0TmFtZSkgfHwgVUlFdmVudHMuVUlMYWJlbC5MT0NBTElaRURfVE9PTFRJUC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCWljaS51cGRhdGUoKTsKKwkJfQorCX0KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNVcGRhdGVUb0JlUmVuZGVyZWQoQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5VSUVsZW1lbnQuVE9QSUNfQUxMKSBFdmVudCBldmVudCkgeworCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1NZW51SXRlbQorCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNVG9vbEJhckVsZW1lbnQpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNVG9vbEJhckVsZW1lbnQgaXRlbU1vZGVsID0gKE1Ub29sQmFyRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5BVFROQU1FKTsKKwkJaWYgKFVJRXZlbnRzLlVJRWxlbWVudC5UT0JFUkVOREVSRUQuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQlPYmplY3Qgb2JqID0gaXRlbU1vZGVsLmdldFBhcmVudCgpOworCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgTVRvb2xCYXIpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJVG9vbEJhck1hbmFnZXIgcGFyZW50ID0gZ2V0TWFuYWdlcigoTVRvb2xCYXIpIG9iaik7CisJCQlpZiAoaXRlbU1vZGVsLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKKwkJCQkJbW9kZWxQcm9jZXNzU3dpdGNoKHBhcmVudCwgaXRlbU1vZGVsKTsKKwkJCQkJcGFyZW50LnVwZGF0ZSh0cnVlKTsKKwkJCQkJVG9vbEJhciB0YiA9IHBhcmVudC5nZXRDb250cm9sKCk7CisJCQkJCWlmICh0YiAhPSBudWxsICYmICF0Yi5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJCXRiLnBhY2sodHJ1ZSk7CisJCQkJCQl0Yi5nZXRTaGVsbCgpLmxheW91dChuZXcgQ29udHJvbFtdIHsgdGIgfSwgU1dULkRFRkVSKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gbW9kZWxUb0NvbnRyaWJ1dGlvbi5yZW1vdmUoaXRlbU1vZGVsKTsKKwkJCQlpZiAoaWNpICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKKwkJCQkJcGFyZW50LnJlbW92ZShpY2kpOworCQkJCX0KKwkJCQlpZiAoaWNpICE9IG51bGwpIHsKKwkJCQkJaWNpLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuVUlFbGVtZW50LlZJU0lCTEUuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJCWlmIChpY2kgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJVG9vbEJhck1hbmFnZXIgcGFyZW50ID0gbnVsbDsKKwkJCWlmIChpY2kgaW5zdGFuY2VvZiBNZW51TWFuYWdlcikgeworCQkJCXBhcmVudCA9IChUb29sQmFyTWFuYWdlcikgKChNZW51TWFuYWdlcikgaWNpKS5nZXRQYXJlbnQoKTsKKwkJCX0gZWxzZSBpZiAoaWNpIGluc3RhbmNlb2YgQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCXBhcmVudCA9IChUb29sQmFyTWFuYWdlcikgKChDb250cmlidXRpb25JdGVtKSBpY2kpLmdldFBhcmVudCgpOworCQkJfQorCisJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQlpY2kuc2V0VmlzaWJsZShpdGVtTW9kZWwuaXNWaXNpYmxlKCkpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXJPdmVycmlkZXMgb3YgPSBwYXJlbnQuZ2V0T3ZlcnJpZGVzKCk7CisJCQkvLyBwYXJ0aWFsIGZpeCBmb3IgYnVnIDM4MzU2OTogb25seSBjaGFuZ2Ugc3RhdGUgaWYgdGhlcmUgYXJlIG5vCisJCQkvLyBleHRyYSBvdmVycmlkZSBtZWNoYW5pY3MgY29udHJvbGxpbmcgZWxlbWVudCB2aXNpYmlsaXR5CisJCQlpZiAob3YgPT0gbnVsbCkgeworCQkJCWljaS5zZXRWaXNpYmxlKGl0ZW1Nb2RlbC5pc1Zpc2libGUoKSk7CisJCQl9IGVsc2UgeworCQkJCUJvb2xlYW4gdmlzaWJsZSA9IG92LmdldFZpc2libGUoaWNpKTsKKwkJCQlpZiAodmlzaWJsZSA9PSBudWxsKSB7CisJCQkJCS8vIHNhbWUgYXMgYWJvdmU6IG9ubHkgY2hhbmdlIHN0YXRlIGlmIHRoZXJlIGFyZSBubyBleHRyYQorCQkJCQkvLyBvdmVycmlkZSBtZWNoYW5pY3MgY29udHJvbGxpbmcgZWxlbWVudCB2aXNpYmlsaXR5CisJCQkJCWljaS5zZXRWaXNpYmxlKGl0ZW1Nb2RlbC5pc1Zpc2libGUoKSk7CisJCQkJfQorCQkJfQorCisJCQlwYXJlbnQubWFya0RpcnR5KCk7CisJCQlwYXJlbnQudXBkYXRlKHRydWUpOworCQkJVG9vbEJhciB0YiA9IHBhcmVudC5nZXRDb250cm9sKCk7CisJCQlpZiAodGIgIT0gbnVsbCAmJiAhdGIuaXNEaXNwb3NlZCgpKSB7CisJCQkJdGIucGFjayh0cnVlKTsKKwkJCQlpZiAodGIuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworCQkJCQl0Yi5nZXRQYXJlbnQoKS5wYWNrKHRydWUpOworCQkJCX0KKwkJCQl0Yi5nZXRTaGVsbCgpLmxheW91dChuZXcgQ29udHJvbFtdIHsgdGIgfSwgU1dULkRFRkVSKTsKKwkJCX0KKwkJfQorCX0KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNVcGRhdGVTZWxlY3Rpb24oQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5JdGVtLlRPUElDX1NFTEVDVEVEKSBFdmVudCBldmVudCkgeworCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1Ub29sQmFyRWxlbWVudAorCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNVG9vbEJhckVsZW1lbnQpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNVG9vbEJhckVsZW1lbnQgaXRlbU1vZGVsID0gKE1Ub29sQmFyRWxlbWVudCkgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJaWYgKGljaSAhPSBudWxsKSB7CisJCQlpY2kudXBkYXRlKCk7CisJCX0KKwl9CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljVXBkYXRlRW5hYmxlbWVudChAVUlFdmVudFRvcGljKFVJRXZlbnRzLkl0ZW0uVE9QSUNfRU5BQkxFRCkgRXZlbnQgZXZlbnQpIHsKKwkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNTWVudUl0ZW0KKwkJaWYgKCEoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpIGluc3RhbmNlb2YgTVRvb2xCYXJFbGVtZW50KSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJTVRvb2xCYXJFbGVtZW50IGl0ZW1Nb2RlbCA9IChNVG9vbEJhckVsZW1lbnQpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGl0ZW1Nb2RlbCk7CisJCWlmIChpY2kgIT0gbnVsbCkgeworCQkJaWNpLnVwZGF0ZSgpOworCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY0NoaWxkQWRkZWQoQFVJRXZlbnRUb3BpYyhFbGVtZW50Q29udGFpbmVyLlRPUElDX0NISUxEUkVOKSBFdmVudCBldmVudCkgeworCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1NZW51SXRlbQorCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNVG9vbEJhcikpIHsKKwkJCXJldHVybjsKKwkJfQorCQlNVG9vbEJhciB0b29sYmFyTW9kZWwgPSAoTVRvb2xCYXIpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJT2JqZWN0IG9iaiA9IHRvb2xiYXJNb2RlbDsKKwkJCXByb2Nlc3NDb250ZW50cygoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4pIG9iaik7CisJCX0KKwl9CisKKwlwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiB1cGRhdGVWYXJpYWJsZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljRGlydHlDaGFuZ2VkKEBVSUV2ZW50VG9waWMoVUlFdmVudHMuRGlydHlhYmxlLlRPUElDX0RJUlRZKSBFdmVudCBldmVudERhdGEpIHsKKwkJZ2V0VXBkYXRlcigpLnVwZGF0ZUNvbnRyaWJ1dGlvbkl0ZW1zKEFMTF9TRUxFQ1RPUik7CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY1VwZGF0ZVRvb2xiYXJFbmFibGVtZW50KAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5SRVFVRVNUX0VOQUJMRU1FTlRfVVBEQVRFX1RPUElDKSBFdmVudCBldmVudERhdGEpIHsKKwkJZmluYWwgT2JqZWN0IHYgPSBldmVudERhdGEgIT0gbnVsbCA/IGV2ZW50RGF0YS5nZXRQcm9wZXJ0eShJRXZlbnRCcm9rZXIuREFUQSkgOiBVSUV2ZW50cy5BTExfRUxFTUVOVF9JRDsKKwkJU2VsZWN0b3IgczsKKwkJaWYgKHYgaW5zdGFuY2VvZiBTZWxlY3RvcikgeworCQkJcyA9IChTZWxlY3RvcikgdjsKKwkJfSBlbHNlIHsKKwkJCWlmICh2ID09IG51bGwgfHwgVUlFdmVudHMuQUxMX0VMRU1FTlRfSUQuZXF1YWxzKHYpKSB7CisJCQkJcyA9IEFMTF9TRUxFQ1RPUjsKKwkJCX0gZWxzZSB7CisJCQkJcyA9IG5ldyBTZWxlY3RvcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChNQXBwbGljYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJCQkJCXJldHVybiB2LmVxdWFscyhlbGVtZW50LmdldEVsZW1lbnRJZCgpKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCX0KKworCQlnZXRVcGRhdGVyKCkudXBkYXRlQ29udHJpYnV0aW9uSXRlbXMocyk7CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY1RhZ3NDaGFuZ2VkKEBVSUV2ZW50VG9waWMoVUlFdmVudHMuQXBwbGljYXRpb25FbGVtZW50LlRPUElDX1RBR1MpIEV2ZW50IGV2ZW50KSB7CisKKwkJT2JqZWN0IGNoYW5nZWRPYmogPSBldmVudC5nZXRQcm9wZXJ0eShFdmVudFRhZ3MuRUxFTUVOVCk7CisKKwkJaWYgKCEoY2hhbmdlZE9iaiBpbnN0YW5jZW9mIE1Ub29sQmFyKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZmluYWwgTVVJRWxlbWVudCBjaGFuZ2VkRWxlbWVudCA9IChNVUlFbGVtZW50KSBjaGFuZ2VkT2JqOworCisJCWlmIChVSUV2ZW50cy5pc0FERChldmVudCkpIHsKKwkJCWlmIChVSUV2ZW50cy5jb250YWlucyhldmVudCwgVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSwgSVByZXNlbnRhdGlvbkVuZ2luZS5ISURERU5fRVhQTElDSVRMWSkpIHsKKwkJCQljaGFuZ2VkRWxlbWVudC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQljaGFuZ2VkRWxlbWVudC5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJfQorCQl9IGVsc2UgaWYgKFVJRXZlbnRzLmlzUkVNT1ZFKGV2ZW50KSkgeworCQkJaWYgKFVJRXZlbnRzLmNvbnRhaW5zKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFLCBJUHJlc2VudGF0aW9uRW5naW5lLkhJRERFTl9FWFBMSUNJVExZKSkgeworCQkJCWNoYW5nZWRFbGVtZW50LnNldFZpc2libGUodHJ1ZSk7CisJCQkJY2hhbmdlZEVsZW1lbnQuc2V0VG9CZVJlbmRlcmVkKHRydWUpOworCQkJfQorCQl9CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY0FwcFN0YXJ0dXAoQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5VSUxpZmVDeWNsZS5BUFBfU1RBUlRVUF9DT01QTEVURSkgRXZlbnQgZXZlbnQpIHsKKwkJTGlzdDxNVG9vbEJhcj4gdG9vbEJhcnMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKGFwcGxpY2F0aW9uLCBudWxsLCBNVG9vbEJhci5jbGFzcywgbnVsbCk7CisJCWZvciAoTVRvb2xCYXIgbVRvb2xCYXIgOiB0b29sQmFycykgeworCQkJaWYgKG1Ub29sQmFyLmdldFRhZ3MoKS5jb250YWlucyhJUHJlc2VudGF0aW9uRW5naW5lLkhJRERFTl9FWFBMSUNJVExZKSkgeworCQkJCW1Ub29sQmFyLnNldFZpc2libGUoZmFsc2UpOworCQkJCW1Ub29sQmFyLnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKgorCSAqLworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJY29udGV4dC5zZXQoVG9vbEJhck1hbmFnZXJSZW5kZXJlci5jbGFzcywgdGhpcyk7CisKKwkJU3RyaW5nW10gdmFycyA9IHsKKwkJCQkib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuc2VydmljZXMuRXZhbHVhdGlvblNlcnZpY2UuZXZhbHVhdGUiLCAvLyROT04tTkxTLTEkCisJCQkJSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX0NPTlRFWFRTLAorCQkJCUlTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9QQVJULAorCQkJCUlTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9TRUxFQ1RJT04sCisJCQkJSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NIRUxMIH07CisJCXVwZGF0ZVZhcmlhYmxlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh2YXJzKSk7CisJCWNvbnRleHQuc2V0KFVQREFURV9WQVJTLCB1cGRhdGVWYXJpYWJsZXMpOworCQlSdW5BbmRUcmFjayBlbmFibGVtZW50VXBkYXRlciA9IG5ldyBSdW5BbmRUcmFjaygpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCQkJZm9yIChTdHJpbmcgdmFyIDogdXBkYXRlVmFyaWFibGVzKSB7CisJCQkJCWNvbnRleHQuZ2V0KHZhcik7CisJCQkJfQorCQkJCWdldFVwZGF0ZXIoKS51cGRhdGVDb250cmlidXRpb25JdGVtcyhBTExfU0VMRUNUT1IpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCQljb250ZXh0LnJ1bkFuZFRyYWNrKGVuYWJsZW1lbnRVcGRhdGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1Ub29sQmFyKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJZmluYWwgTVRvb2xCYXIgdG9vbGJhck1vZGVsID0gKE1Ub29sQmFyKSBlbGVtZW50OworCQlUb29sQmFyIG5ld1RCID0gY3JlYXRlVG9vbGJhcih0b29sYmFyTW9kZWwsIChDb21wb3NpdGUpIHBhcmVudCk7CisJCWJpbmRXaWRnZXQoZWxlbWVudCwgbmV3VEIpOworCQlwcm9jZXNzQ29udHJpYnV0aW9uKHRvb2xiYXJNb2RlbCwgdG9vbGJhck1vZGVsLmdldEVsZW1lbnRJZCgpKTsKKworCQlDb250cm9sIHJlbmRlcmVkQ3RybCA9IG5ld1RCOworCQlNVUlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1UcmltQmFyKSB7CisJCQllbGVtZW50LmdldFRhZ3MoKS5hZGQoSVByZXNlbnRhdGlvbkVuZ2luZS5EUkFHR0FCTEUpOworCisJCQlzZXRDU1NJbmZvKGVsZW1lbnQsIG5ld1RCKTsKKworCQkJYm9vbGVhbiB2ZXJ0aWNhbCA9IGZhbHNlOworCQkJTVRyaW1CYXIgYmFyID0gKE1UcmltQmFyKSBwYXJlbnRFbGVtZW50OworCQkJdmVydGljYWwgPSBiYXIuZ2V0U2lkZSgpID09IFNpZGVWYWx1ZS5MRUZUIHx8IGJhci5nZXRTaWRlKCkgPT0gU2lkZVZhbHVlLlJJR0hUOworCQkJSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQgPSBnZXRDb250ZXh0Rm9yUGFyZW50KGVsZW1lbnQpOworCQkJQ1NTUmVuZGVyaW5nVXRpbHMgY3NzVXRpbHMgPSBwYXJlbnRDb250ZXh0LmdldChDU1NSZW5kZXJpbmdVdGlscy5jbGFzcyk7CisJCQlpZiAoY3NzVXRpbHMgIT0gbnVsbCkgeworCQkJCXJlbmRlcmVkQ3RybCA9IGNzc1V0aWxzLmZyYW1lTWVJZlBvc3NpYmxlKG5ld1RCLCBudWxsLCB2ZXJ0aWNhbCwgdHJ1ZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVuZGVyZWRDdHJsOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b29sYmFyTW9kZWwKKwkgKiBAcGFyYW0gZWxlbWVudElkCisJICovCisJcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRyaWJ1dGlvbihNVG9vbEJhciB0b29sYmFyTW9kZWwsIFN0cmluZyBlbGVtZW50SWQpIHsKKworCQlUb29sQmFyTWFuYWdlciBtYW5hZ2VyID0gZ2V0TWFuYWdlcih0b29sYmFyTW9kZWwpOworCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuZ2V0Q29udHJvbCgpICE9IG51bGwpIHsKKwkJCWFkZENsZWFudXBEaXNwb3NlTGlzdGVuZXIodG9vbGJhck1vZGVsLCBtYW5hZ2VyLmdldENvbnRyb2woKSk7CisJCX0KKworCQlmaW5hbCBBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSA9IG5ldyBBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+KCk7CisJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5YWFhnYXRoZXJUb29sQmFyQ29udHJpYnV0aW9ucyh0b29sYmFyTW9kZWwsCisJCQkJYXBwbGljYXRpb24uZ2V0VG9vbEJhckNvbnRyaWJ1dGlvbnMoKSwgZWxlbWVudElkLCB0b0NvbnRyaWJ1dGUpOworCQlnZW5lcmF0ZUNvbnRyaWJ1dGlvbnModG9vbGJhck1vZGVsLCB0b0NvbnRyaWJ1dGUpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRDbGVhbnVwRGlzcG9zZUxpc3RlbmVyKGZpbmFsIE1Ub29sQmFyIHRvb2xiYXJNb2RlbCwgVG9vbEJhciBjb250cm9sKSB7CisKKwkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2llbnREYXRhID0gdG9vbGJhck1vZGVsLmdldFRyYW5zaWVudERhdGEoKTsKKwkJaWYgKCF0cmFuc2llbnREYXRhLmNvbnRhaW5zS2V5KERJU1BPU0VfQURERUQpKSB7CisJCQl0cmFuc2llbnREYXRhLnB1dChESVNQT1NFX0FEREVELCBCb29sZWFuLlRSVUUpOworCQkJY29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJY2xlYW5VcCh0b29sYmFyTW9kZWwpOworCQkJCQlPYmplY3QgZGlzcG9zZSA9IHRyYW5zaWVudERhdGEuZ2V0KFBPU1RfUFJPQ0VTU0lOR19ESVNQT1NFKTsKKwkJCQkJaWYgKGRpc3Bvc2UgaW5zdGFuY2VvZiBSdW5uYWJsZSkgeworCQkJCQkJKChSdW5uYWJsZSkgZGlzcG9zZSkucnVuKCk7CisJCQkJCX0KKwkJCQkJdHJhbnNpZW50RGF0YS5yZW1vdmUoUE9TVF9QUk9DRVNTSU5HX0RJU1BPU0UpOworCQkJCQl0cmFuc2llbnREYXRhLnJlbW92ZShESVNQT1NFX0FEREVEKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29udHJpYnV0aW9ucyhNVG9vbEJhciB0b29sYmFyTW9kZWwsIExpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSkgeworCisJCVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNYW5hZ2VyKHRvb2xiYXJNb2RlbCk7CisJCWJvb2xlYW4gZG9uZSA9IHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gMDsKKwkJd2hpbGUgKCFkb25lKSB7CisJCQlBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IGN1ckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1Ub29sQmFyQ29udHJpYnV0aW9uPih0b0NvbnRyaWJ1dGUpOworCQkJaW50IHJldHJ5Q291bnQgPSB0b0NvbnRyaWJ1dGUuc2l6ZSgpOworCQkJdG9Db250cmlidXRlLmNsZWFyKCk7CisKKwkJCWZvciAoZmluYWwgTVRvb2xCYXJDb250cmlidXRpb24gY29udHJpYnV0aW9uIDogY3VyTGlzdCkgeworCQkJCWlmICghcHJvY2Vzc0FkZGl0aW9uKHRvb2xiYXJNb2RlbCwgbWFuYWdlciwgY29udHJpYnV0aW9uKSkgeworCQkJCQl0b0NvbnRyaWJ1dGUuYWRkKGNvbnRyaWJ1dGlvbik7CisJCQkJfQorCQkJfQorCQkJLy8gV2UncmUgZG9uZSBpZiB0aGUgcmV0cnlMaXN0IGlzIG5vdyBlbXB0eSAoZXZlcnl0aGluZyBkb25lKSBvcgorCQkJLy8gaWYgdGhlIGxpc3QgaGFzbid0IGNoYW5nZWQgYXQgYWxsIChubyBob3BlKQorCQkJZG9uZSA9IHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gMCB8fCB0b0NvbnRyaWJ1dGUuc2l6ZSgpID09IHJldHJ5Q291bnQ7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250cmlidXRpb24gd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0FkZGl0aW9uKGZpbmFsIE1Ub29sQmFyIHRvb2xiYXJNb2RlbCwgZmluYWwgVG9vbEJhck1hbmFnZXIgbWFuYWdlciwKKwkJCU1Ub29sQmFyQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbikgeworCQlmaW5hbCBUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkIHJlY29yZCA9IG5ldyBUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkKHRvb2xiYXJNb2RlbCwgY29udHJpYnV0aW9uLCB0aGlzKTsKKwkJaWYgKCFyZWNvcmQubWVyZ2VJbnRvTW9kZWwoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChyZWNvcmQuYW55VmlzaWJsZVdoZW4oKSkgeworCQkJRXhwcmVzc2lvbkluZm8gaW5mbyA9IG5ldyBFeHByZXNzaW9uSW5mbygpOworCQkJcmVjb3JkLmNvbGxlY3RJbmZvKGluZm8pOworCQkJdXBkYXRlVmFyaWFibGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGluZm8uZ2V0QWNjZXNzZWRWYXJpYWJsZU5hbWVzKCkpKTsKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gZ2V0Q29udGV4dCh0b29sYmFyTW9kZWwpOworCQkJcGFyZW50Q29udGV4dC5ydW5BbmRUcmFjayhuZXcgUnVuQW5kVHJhY2soKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIGJvb2xlYW4gY2hhbmdlZChJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQkJCQlpZiAoZ2V0TWFuYWdlcih0b29sYmFyTW9kZWwpID09IG51bGwpIHsKKwkJCQkJCS8vIHRvb2wgYmFyIG5vIGxvbmdlciBiZWluZyBtYW5hZ2VkLCBpZ25vcmUgaXQKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCisJCQkJCXJlY29yZC51cGRhdGVWaXNpYmlsaXR5KHBhcmVudENvbnRleHQuZ2V0QWN0aXZlTGVhZigpKTsKKwkJCQkJcnVuRXh0ZXJuYWxDb2RlKG5ldyBSdW5uYWJsZSgpIHsKKworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJbWFuYWdlci51cGRhdGUoZmFsc2UpOworCQkJCQkJCWdldFVwZGF0ZXIoKS51cGRhdGVDb250cmlidXRpb25JdGVtcyhBTExfU0VMRUNUT1IpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfSk7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIFRvb2xCYXIgY3JlYXRlVG9vbGJhcihmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaW50IG9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oZWxlbWVudCk7CisJCWludCBzdHlsZSA9IG9yaWVudGF0aW9uIHwgU1dULldSQVAgfCBTV1QuRkxBVCB8IFNXVC5SSUdIVDsKKwkJVG9vbEJhck1hbmFnZXIgbWFuYWdlciA9IGdldE1hbmFnZXIoKE1Ub29sQmFyKSBlbGVtZW50KTsKKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgeworCQkJbWFuYWdlciA9IG5ldyBUb29sQmFyTWFuYWdlcihzdHlsZSk7CisJCQlJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcyBvdmVycmlkZXMgPSBudWxsOworCQkJTUFwcGxpY2F0aW9uRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCWlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpIHsKKwkJCQlwYXJlbnRFbGVtZW50ID0gKE1BcHBsaWNhdGlvbkVsZW1lbnQpICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOworCQkJfQorCisJCQlpZiAocGFyZW50RWxlbWVudCAhPSBudWxsKSB7CisJCQkJb3ZlcnJpZGVzID0gKElDb250cmlidXRpb25NYW5hZ2VyT3ZlcnJpZGVzKSBwYXJlbnRFbGVtZW50LmdldFRyYW5zaWVudERhdGEoKQorCQkJCQkJLmdldChJQ29udHJpYnV0aW9uTWFuYWdlck92ZXJyaWRlcy5jbGFzcy5nZXROYW1lKCkpOworCQkJfQorCisJCQltYW5hZ2VyLnNldE92ZXJyaWRlcyhvdmVycmlkZXMpOworCQkJbGlua01vZGVsVG9NYW5hZ2VyKChNVG9vbEJhcikgZWxlbWVudCwgbWFuYWdlcik7CisJCX0gZWxzZSB7CisJCQlUb29sQmFyIHRvb2xCYXIgPSBtYW5hZ2VyLmdldENvbnRyb2woKTsKKwkJCWlmICh0b29sQmFyICE9IG51bGwgJiYgIXRvb2xCYXIuaXNEaXNwb3NlZCgpICYmICh0b29sQmFyLmdldFN0eWxlKCkgJiBvcmllbnRhdGlvbikgPT0gMCkgeworCQkJCXRvb2xCYXIuZGlzcG9zZSgpOworCQkJfQorCQkJLy8gRklYTUUgUkFQIFRvb2xiYXJNYW5hZ2VyLnNldFN0eWxlKCkgbm90IGF2YWlsYWJsZQorCQkJLy8gbWFuYWdlci5zZXRTdHlsZShzdHlsZSk7CisJCX0KKwkJVG9vbEJhciBiYXIgPSBtYW5hZ2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJYmFyLnNldERhdGEobWFuYWdlcik7CisJCWJhci5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgZWxlbWVudCk7CisJCWJhci5nZXRTaGVsbCgpLmxheW91dChuZXcgQ29udHJvbFtdIHsgYmFyIH0sIFNXVC5ERUZFUik7CisJCXJldHVybiBiYXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2xlYW5VcChNVG9vbEJhciB0b29sYmFyTW9kZWwpIHsKKwkJQ29sbGVjdGlvbjxUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkPiB2YWxzID0gbW9kZWxDb250cmlidXRpb25Ub1JlY29yZC52YWx1ZXMoKTsKKwkJZm9yIChUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkIHJlY29yZCA6IHZhbHMudG9BcnJheShuZXcgVG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZFt2YWxzLnNpemUoKV0pKSB7CisJCQlpZiAocmVjb3JkLnRvb2xiYXJNb2RlbCA9PSB0b29sYmFyTW9kZWwpIHsKKwkJCQlyZWNvcmQuZGlzcG9zZSgpOworCQkJCWZvciAoTVRvb2xCYXJFbGVtZW50IGNvcHkgOiByZWNvcmQuZ2VuZXJhdGVkRWxlbWVudHMpIHsKKwkJCQkJY2xlYW5VcENvcHkocmVjb3JkLCBjb3B5KTsKKwkJCQl9CisJCQkJZm9yIChNVG9vbEJhckVsZW1lbnQgY29weSA6IHJlY29yZC5zaGFyZWRFbGVtZW50cykgeworCQkJCQljbGVhblVwQ29weShyZWNvcmQsIGNvcHkpOworCQkJCX0KKwkJCQlyZWNvcmQuZ2VuZXJhdGVkRWxlbWVudHMuY2xlYXIoKTsKKwkJCQlyZWNvcmQuc2hhcmVkRWxlbWVudHMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSByZWNvcmQKKwkgKiBAcGFyYW0gY29weQorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFuVXBDb3B5KFRvb2xCYXJDb250cmlidXRpb25SZWNvcmQgcmVjb3JkLCBNVG9vbEJhckVsZW1lbnQgY29weSkgeworCQltb2RlbENvbnRyaWJ1dGlvblRvUmVjb3JkLnJlbW92ZShjb3B5KTsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGNvcHkpOworCQljbGVhck1vZGVsVG9Db250cmlidXRpb24oY29weSwgaWNpKTsKKwkJaWYgKGljaSAhPSBudWxsKSB7CisJCQlyZWNvcmQuZ2V0TWFuYWdlckZvck1vZGVsKCkucmVtb3ZlKGljaSk7CisJCX0KKwl9CisKKwlpbnQgZ2V0T3JpZW50YXRpb24oZmluYWwgTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1VSUVsZW1lbnQgdGhlUGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHRoZVBhcmVudCBpbnN0YW5jZW9mIE1UcmltQmFyKSB7CisJCQlNVHJpbUJhciB0cmltQ29udGFpbmVyID0gKE1UcmltQmFyKSB0aGVQYXJlbnQ7CisJCQlTaWRlVmFsdWUgc2lkZSA9IHRyaW1Db250YWluZXIuZ2V0U2lkZSgpOworCQkJaWYgKHNpZGUuZ2V0VmFsdWUoKSA9PSBTaWRlVmFsdWUuTEVGVF9WQUxVRSB8fCBzaWRlLmdldFZhbHVlKCkgPT0gU2lkZVZhbHVlLlJJR0hUX1ZBTFVFKSB7CisJCQkJcmV0dXJuIFNXVC5WRVJUSUNBTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gU1dULkhPUklaT05UQUw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRlbnRzKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNvbnRhaW5lcikgeworCQkvLyBJIGNhbiBlaXRoZXIgc2ltcGx5IHN0b3AgcHJvY2Vzc2luZywgb3Igd2UgY2FuIHdhbGsgdGhlIG1vZGVsCisJCS8vIG91cnNlbHZlcyBsaWtlIHRoZSAib2xkIiBkYXlzCisJCS8vIEVNRiBnaXZlcyB1cyBudWxsIGxpc3RzIGlmIGVtcHR5CisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJT2JqZWN0IG9iaiA9IGNvbnRhaW5lcjsKKwkJVG9vbEJhck1hbmFnZXIgcGFyZW50TWFuYWdlciA9IGdldE1hbmFnZXIoKE1Ub29sQmFyKSBvYmopOworCQlpZiAocGFyZW50TWFuYWdlciA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gUHJvY2VzcyBhbnkgY29udGVudHMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgTUUKKwkJTGlzdDxNVUlFbGVtZW50PiBwYXJ0cyA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOworCQlpZiAocGFydHMgIT0gbnVsbCkgeworCQkJTVVJRWxlbWVudFtdIHBsaXN0ID0gcGFydHMudG9BcnJheShuZXcgTVVJRWxlbWVudFtwYXJ0cy5zaXplKCldKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGxpc3QubGVuZ3RoOyBpKyspIHsKKwkJCQlNVUlFbGVtZW50IGNoaWxkTUUgPSBwbGlzdFtpXTsKKwkJCQltb2RlbFByb2Nlc3NTd2l0Y2gocGFyZW50TWFuYWdlciwgKE1Ub29sQmFyRWxlbWVudCkgY2hpbGRNRSk7CisJCQl9CisJCX0KKwkJcGFyZW50TWFuYWdlci51cGRhdGUodHJ1ZSk7CisKKwkJVG9vbEJhciB0YiA9IGdldFRvb2xiYXJGcm9tKGNvbnRhaW5lci5nZXRXaWRnZXQoKSk7CisJCWlmICh0YiAhPSBudWxsKSB7CisJCQl0Yi5wYWNrKHRydWUpOworCQkJdGIuZ2V0U2hlbGwoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IHRiIH0sIFNXVC5ERUZFUik7CisJCX0KKwl9CisKKwlwcml2YXRlIFRvb2xCYXIgZ2V0VG9vbGJhckZyb20oT2JqZWN0IHdpZGdldCkgeworCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVG9vbEJhcikgeworCQkJcmV0dXJuIChUb29sQmFyKSB3aWRnZXQ7CisJCX0KKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJQ29tcG9zaXRlIGludGVybWVkaWF0ZSA9IChDb21wb3NpdGUpIHdpZGdldDsKKwkJCWlmICghaW50ZXJtZWRpYXRlLmlzRGlzcG9zZWQoKSkgeworCQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGludGVybWVkaWF0ZS5nZXRDaGlsZHJlbigpOworCQkJCWZvciAoQ29udHJvbCBjb250cm9sIDogY2hpbGRyZW4pIHsKKwkJCQkJaWYgKGNvbnRyb2wuZ2V0RGF0YSgpIGluc3RhbmNlb2YgVG9vbEJhck1hbmFnZXIpIHsKKwkJCQkJCXJldHVybiAoVG9vbEJhcikgY29udHJvbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlib29sZWFuIGhhc09ubHlTZXBhcmF0b3JzKFRvb2xCYXIgdG9vbGJhcikgeworCQlUb29sSXRlbVtdIGNoaWxkcmVuID0gdG9vbGJhci5nZXRJdGVtcygpOworCQlmb3IgKFRvb2xJdGVtIHRvb2xJdGVtIDogY2hpbGRyZW4pIHsKKwkJCWlmICgodG9vbEl0ZW0uZ2V0U3R5bGUoKSAmIFNXVC5TRVBBUkFUT1IpID09IDApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKHRvb2xJdGVtLmdldENvbnRyb2woKSAhPSBudWxsCisJCQkJCSYmIHRvb2xJdGVtLmdldENvbnRyb2woKS5nZXREYXRhKE9XTklOR19NRSkgaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGlkZUNoaWxkKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudEVsZW1lbnQsIE1VSUVsZW1lbnQgY2hpbGQpIHsKKwkJc3VwZXIuaGlkZUNoaWxkKHBhcmVudEVsZW1lbnQsIGNoaWxkKTsKKwkJLy8gb25seSBoYW5kbGUgdGhlIGRpc3Bvc2FsIG9mIHRoaXMgZWxlbWVudCBpZiBpdCB3YXMgYWN0dWFsbHkgcmVuZGVyZWQKKwkJLy8gYnkgdGhlIGVuZ2luZQorCQlpZiAoY2hpbGQuZ2V0UmVuZGVyZXIoKSAhPSBudWxsKSB7CisJCQkvLyBTaW5jZSB0aGVyZSdzIG5vIHBsYWNlIHRvICdzdG9yZScgYSBjaGlsZCB0aGF0J3Mgbm90IGluIGEgbWVudQorCQkJLy8gd2UnbGwgYmxvdyBpdCBhd2F5IGFuZCByZS1jcmVhdGUgb24gYW4gYWRkCisJCQlXaWRnZXQgd2lkZ2V0ID0gKFdpZGdldCkgY2hpbGQuZ2V0V2lkZ2V0KCk7CisJCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQl3aWRnZXQuZGlzcG9zZSgpOworCQkJfQorCQkJVG9vbEJhciB0b29sYmFyID0gKFRvb2xCYXIpIGdldFVJQ29udGFpbmVyKGNoaWxkKTsKKwkJCWlmICh0b29sYmFyICE9IG51bGwgJiYgIXRvb2xiYXIuaXNEaXNwb3NlZCgpKSB7CisJCQkJdG9vbGJhci5wYWNrKHRydWUpOworCQkJCXRvb2xiYXIuZ2V0U2hlbGwoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IHRvb2xiYXIgfSwgU1dULkRFRkVSKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoaWxkUmVuZGVyZWQoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50RWxlbWVudCwgTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyLmNoaWxkUmVuZGVyZWQocGFyZW50RWxlbWVudCwgZWxlbWVudCk7CisJCXByb2Nlc3NDb250ZW50cyhwYXJlbnRFbGVtZW50KTsKKwkJVG9vbEJhciB0b29sYmFyID0gKFRvb2xCYXIpIGdldFVJQ29udGFpbmVyKGVsZW1lbnQpOworCQlpZiAodG9vbGJhciAhPSBudWxsICYmICF0b29sYmFyLmlzRGlzcG9zZWQoKSkgeworCQkJdG9vbGJhci5wYWNrKHRydWUpOworCQkJdG9vbGJhci5nZXRTaGVsbCgpLmxheW91dChuZXcgQ29udHJvbFtdIHsgdG9vbGJhciB9LCBTV1QuREVGRVIpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVSUNvbnRhaW5lcihNVUlFbGVtZW50IGNoaWxkRWxlbWVudCkgeworCQlDb21wb3NpdGUgaW50ZXJtZWRpYXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuZ2V0VUlDb250YWluZXIoY2hpbGRFbGVtZW50KTsKKwkJaWYgKGludGVybWVkaWF0ZSA9PSBudWxsIHx8IGludGVybWVkaWF0ZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChpbnRlcm1lZGlhdGUgaW5zdGFuY2VvZiBUb29sQmFyKSB7CisJCQlyZXR1cm4gaW50ZXJtZWRpYXRlOworCQl9CisJCVRvb2xCYXIgdG9vbGJhciA9IGZpbmRUb29sYmFyKGludGVybWVkaWF0ZSk7CisJCWlmICh0b29sYmFyID09IG51bGwpIHsKKwkJCXRvb2xiYXIgPSBjcmVhdGVUb29sYmFyKGNoaWxkRWxlbWVudC5nZXRQYXJlbnQoKSwgaW50ZXJtZWRpYXRlKTsKKwkJfQorCQlyZXR1cm4gdG9vbGJhcjsKKwl9CisKKwlwcml2YXRlIFRvb2xCYXIgZmluZFRvb2xiYXIoQ29tcG9zaXRlIGludGVybWVkaWF0ZSkgeworCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBpbnRlcm1lZGlhdGUuZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKGNoaWxkLmdldERhdGEoKSBpbnN0YW5jZW9mIFRvb2xCYXJNYW5hZ2VyKSB7CisJCQkJcmV0dXJuIChUb29sQmFyKSBjaGlsZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgbW9kZWxQcm9jZXNzU3dpdGNoKFRvb2xCYXJNYW5hZ2VyIHBhcmVudE1hbmFnZXIsCisJCQlNVG9vbEJhckVsZW1lbnQgY2hpbGRNRSkgeworCQlpZiAoT3BhcXVlRWxlbWVudFV0aWwuaXNPcGFxdWVUb29sSXRlbShjaGlsZE1FKSkgeworCQkJTVRvb2xJdGVtIGl0ZW1Nb2RlbCA9IChNVG9vbEl0ZW0pIGNoaWxkTUU7CisJCQlwcm9jZXNzT3BhcXVlSXRlbShwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwpOworCQl9IGVsc2UgaWYgKGNoaWxkTUUgaW5zdGFuY2VvZiBNSGFuZGxlZFRvb2xJdGVtKSB7CisJCQlNSGFuZGxlZFRvb2xJdGVtIGl0ZW1Nb2RlbCA9IChNSGFuZGxlZFRvb2xJdGVtKSBjaGlsZE1FOworCQkJcHJvY2Vzc0hhbmRsZWRJdGVtKHBhcmVudE1hbmFnZXIsIGl0ZW1Nb2RlbCk7CisJCX0gZWxzZSBpZiAoY2hpbGRNRSBpbnN0YW5jZW9mIE1EaXJlY3RUb29sSXRlbSkgeworCQkJTURpcmVjdFRvb2xJdGVtIGl0ZW1Nb2RlbCA9IChNRGlyZWN0VG9vbEl0ZW0pIGNoaWxkTUU7CisJCQlwcm9jZXNzRGlyZWN0SXRlbShwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwpOworCQl9IGVsc2UgaWYgKGNoaWxkTUUgaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvcikgeworCQkJTVRvb2xCYXJTZXBhcmF0b3IgaXRlbU1vZGVsID0gKE1Ub29sQmFyU2VwYXJhdG9yKSBjaGlsZE1FOworCQkJcHJvY2Vzc1NlcGFyYXRvcihwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwpOworCQl9IGVsc2UgaWYgKGNoaWxkTUUgaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpIHsKKwkJCU1Ub29sQ29udHJvbCBpdGVtTW9kZWwgPSAoTVRvb2xDb250cm9sKSBjaGlsZE1FOworCQkJcHJvY2Vzc1Rvb2xDb250cm9sKHBhcmVudE1hbmFnZXIsIGl0ZW1Nb2RlbCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1NlcGFyYXRvcihUb29sQmFyTWFuYWdlciBwYXJlbnRNYW5hZ2VyLCBNVG9vbEJhclNlcGFyYXRvciBpdGVtTW9kZWwpIHsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGl0ZW1Nb2RlbCk7CisJCWlmIChpY2kgIT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWl0ZW1Nb2RlbC5zZXRSZW5kZXJlcih0aGlzKTsKKwkJQWJzdHJhY3RHcm91cE1hcmtlciBtYXJrZXIgPSBudWxsOworCQlpZiAoaXRlbU1vZGVsLmlzVmlzaWJsZSgpICYmICFpdGVtTW9kZWwuZ2V0VGFncygpLmNvbnRhaW5zKE1lbnVNYW5hZ2VyUmVuZGVyZXIuR1JPVVBfTUFSS0VSKSkgeworCQkJbWFya2VyID0gbmV3IFNlcGFyYXRvcigpOworCQkJbWFya2VyLnNldElkKGl0ZW1Nb2RlbC5nZXRFbGVtZW50SWQoKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoaXRlbU1vZGVsLmdldEVsZW1lbnRJZCgpICE9IG51bGwpIHsKKwkJCQltYXJrZXIgPSBuZXcgR3JvdXBNYXJrZXIoaXRlbU1vZGVsLmdldEVsZW1lbnRJZCgpKTsKKwkJCX0KKwkJfQorCQlpZiAobWFya2VyICE9IG51bGwpIHsKKwkJCWFkZFRvTWFuYWdlcihwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwsIG1hcmtlcik7CisJCQlsaW5rTW9kZWxUb0NvbnRyaWJ1dGlvbihpdGVtTW9kZWwsIG1hcmtlcik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1Rvb2xDb250cm9sKFRvb2xCYXJNYW5hZ2VyIHBhcmVudE1hbmFnZXIsIE1Ub29sQ29udHJvbCBpdGVtTW9kZWwpIHsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaWNpID0gZ2V0Q29udHJpYnV0aW9uKGl0ZW1Nb2RlbCk7CisJCWlmIChpY2kgIT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWl0ZW1Nb2RlbC5zZXRSZW5kZXJlcih0aGlzKTsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBnZXRDb250ZXh0KGl0ZW1Nb2RlbCk7CisJCVRvb2xDb250cm9sQ29udHJpYnV0aW9uIGNpID0gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShUb29sQ29udHJvbENvbnRyaWJ1dGlvbi5jbGFzcywgbGNsQ29udGV4dCk7CisJCWNpLnNldE1vZGVsKGl0ZW1Nb2RlbCk7CisJCWNpLnNldFZpc2libGUoaXRlbU1vZGVsLmlzVmlzaWJsZSgpKTsKKwkJYWRkVG9NYW5hZ2VyKHBhcmVudE1hbmFnZXIsIGl0ZW1Nb2RlbCwgY2kpOworCQlsaW5rTW9kZWxUb0NvbnRyaWJ1dGlvbihpdGVtTW9kZWwsIGNpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcmVjdEl0ZW0oVG9vbEJhck1hbmFnZXIgcGFyZW50TWFuYWdlciwgTURpcmVjdFRvb2xJdGVtIGl0ZW1Nb2RlbCkgeworCQlJQ29udHJpYnV0aW9uSXRlbSBpY2kgPSBnZXRDb250cmlidXRpb24oaXRlbU1vZGVsKTsKKwkJaWYgKGljaSAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaXRlbU1vZGVsLnNldFJlbmRlcmVyKHRoaXMpOworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgbGNsQ29udGV4dCA9IGdldENvbnRleHQoaXRlbU1vZGVsKTsKKwkJRGlyZWN0Q29udHJpYnV0aW9uSXRlbSBjaSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoRGlyZWN0Q29udHJpYnV0aW9uSXRlbS5jbGFzcywgbGNsQ29udGV4dCk7CisJCWNpLnNldE1vZGVsKGl0ZW1Nb2RlbCk7CisJCWNpLnNldFZpc2libGUoaXRlbU1vZGVsLmlzVmlzaWJsZSgpKTsKKwkJYWRkVG9NYW5hZ2VyKHBhcmVudE1hbmFnZXIsIGl0ZW1Nb2RlbCwgY2kpOworCQlsaW5rTW9kZWxUb0NvbnRyaWJ1dGlvbihpdGVtTW9kZWwsIGNpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0hhbmRsZWRJdGVtKFRvb2xCYXJNYW5hZ2VyIHBhcmVudE1hbmFnZXIsIE1IYW5kbGVkVG9vbEl0ZW0gaXRlbU1vZGVsKSB7CisJCUlDb250cmlidXRpb25JdGVtIGljaSA9IGdldENvbnRyaWJ1dGlvbihpdGVtTW9kZWwpOworCQlpZiAoaWNpICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpdGVtTW9kZWwuc2V0UmVuZGVyZXIodGhpcyk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChpdGVtTW9kZWwpOworCQlIYW5kbGVkQ29udHJpYnV0aW9uSXRlbSBjaSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoSGFuZGxlZENvbnRyaWJ1dGlvbkl0ZW0uY2xhc3MsIGxjbENvbnRleHQpOworCQljaS5zZXRNb2RlbChpdGVtTW9kZWwpOworCQljaS5zZXRWaXNpYmxlKGl0ZW1Nb2RlbC5pc1Zpc2libGUoKSk7CisJCWFkZFRvTWFuYWdlcihwYXJlbnRNYW5hZ2VyLCBpdGVtTW9kZWwsIGNpKTsKKwkJbGlua01vZGVsVG9Db250cmlidXRpb24oaXRlbU1vZGVsLCBjaSk7CisJfQorCisJdm9pZCBwcm9jZXNzT3BhcXVlSXRlbShUb29sQmFyTWFuYWdlciBwYXJlbnRNYW5hZ2VyLCBNVG9vbEl0ZW0gaXRlbU1vZGVsKSB7CisJCUlDb250cmlidXRpb25JdGVtIGljaSA9IGdldENvbnRyaWJ1dGlvbihpdGVtTW9kZWwpOworCQlpZiAoaWNpICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWl0ZW1Nb2RlbC5zZXRSZW5kZXJlcih0aGlzKTsKKwkJT2JqZWN0IG9iaiA9IE9wYXF1ZUVsZW1lbnRVdGlsLmdldE9wYXF1ZUl0ZW0oaXRlbU1vZGVsKTsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb250cmlidXRpb25JdGVtKSB7CisJCQlpY2kgPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIG9iajsKKwkJfSBlbHNlIHsKKwkJCXJldHVybjsKKwkJfQorCQlpY2kuc2V0VmlzaWJsZShpdGVtTW9kZWwuaXNWaXNpYmxlKCkpOworCQlhZGRUb01hbmFnZXIocGFyZW50TWFuYWdlciwgaXRlbU1vZGVsLCBpY2kpOworCQlsaW5rTW9kZWxUb0NvbnRyaWJ1dGlvbihpdGVtTW9kZWwsIGljaSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFRvTWFuYWdlcihUb29sQmFyTWFuYWdlciBwYXJlbnRNYW5hZ2VyLAorCQkJTVRvb2xCYXJFbGVtZW50IG1vZGVsLCBJQ29udHJpYnV0aW9uSXRlbSBjaSkgeworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoKTsKKwkJLy8gdGVjaG5pY2FsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJcGFyZW50TWFuYWdlci5hZGQoY2kpOworCQl9IGVsc2UgeworCQkJaW50IGluZGV4ID0gcGFyZW50LmdldENoaWxkcmVuKCkuaW5kZXhPZihtb2RlbCk7CisJCQkvLyBzaG91bGRuJ3QgYmUgLTEsIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5CisJCQlpZiAoaW5kZXggPiBwYXJlbnRNYW5hZ2VyLmdldFNpemUoKSB8fCBpbmRleCA9PSAtMSkgeworCQkJCXBhcmVudE1hbmFnZXIuYWRkKGNpKTsKKwkJCX0gZWxzZSB7CisJCQkJcGFyZW50TWFuYWdlci5pbnNlcnQoaW5kZXgsIGNpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBtb2RlbAorCSAqIEByZXR1cm4gbWFwcGVkIG1hbmFnZXIsIGlmIGFueQorCSAqLworCXB1YmxpYyBUb29sQmFyTWFuYWdlciBnZXRNYW5hZ2VyKE1Ub29sQmFyIG1vZGVsKSB7CisJCXJldHVybiBtb2RlbFRvTWFuYWdlci5nZXQobW9kZWwpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtYW5hZ2VyCisJICogQHJldHVybiBtYXBwZWQgbW9kZWwsIGlmIGFueQorCSAqLworCXB1YmxpYyBNVG9vbEJhciBnZXRUb29sQmFyTW9kZWwoVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgeworCQlyZXR1cm4gbWFuYWdlclRvTW9kZWwuZ2V0KG1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtb2RlbAorCSAqIEBwYXJhbSBtYW5hZ2VyCisJICovCisJcHVibGljIHZvaWQgbGlua01vZGVsVG9NYW5hZ2VyKE1Ub29sQmFyIG1vZGVsLCBUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7CisJCW1vZGVsVG9NYW5hZ2VyLnB1dChtb2RlbCwgbWFuYWdlcik7CisJCW1hbmFnZXJUb01vZGVsLnB1dChtYW5hZ2VyLCBtb2RlbCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1vZGVsCisJICogQHBhcmFtIG1hbmFnZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhck1vZGVsVG9NYW5hZ2VyKE1Ub29sQmFyIG1vZGVsLCBUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7CisJCW1vZGVsVG9NYW5hZ2VyLnJlbW92ZShtb2RlbCk7CisJCW1hbmFnZXJUb01vZGVsLnJlbW92ZShtYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqIEByZXR1cm4gbWFwcGVkIGNvbnRyaWJ1dGlvbiwgaWYgYW55CisJICovCisJcHVibGljIElDb250cmlidXRpb25JdGVtIGdldENvbnRyaWJ1dGlvbihNVG9vbEJhckVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gbW9kZWxUb0NvbnRyaWJ1dGlvbi5nZXQoZWxlbWVudCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGl0ZW0KKwkgKiBAcmV0dXJuIG1hcHBlZCB0b29sYmFyIGVsZW1lbnQsIGlmIGFueQorCSAqLworCXB1YmxpYyBNVG9vbEJhckVsZW1lbnQgZ2V0VG9vbEVsZW1lbnQoSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgeworCQlyZXR1cm4gY29udHJpYnV0aW9uVG9Nb2RlbC5nZXQoaXRlbSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1vZGVsCisJICogQHBhcmFtIGl0ZW0KKwkgKi8KKwlwdWJsaWMgdm9pZCBsaW5rTW9kZWxUb0NvbnRyaWJ1dGlvbihNVG9vbEJhckVsZW1lbnQgbW9kZWwsIElDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKKwkJbW9kZWxUb0NvbnRyaWJ1dGlvbi5wdXQobW9kZWwsIGl0ZW0pOworCQljb250cmlidXRpb25Ub01vZGVsLnB1dChpdGVtLCBtb2RlbCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1vZGVsCisJICogQHBhcmFtIGl0ZW0KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhck1vZGVsVG9Db250cmlidXRpb24oTVRvb2xCYXJFbGVtZW50IG1vZGVsLCBJQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7CisJCW1vZGVsVG9Db250cmlidXRpb24ucmVtb3ZlKG1vZGVsKTsKKwkJY29udHJpYnV0aW9uVG9Nb2RlbC5yZW1vdmUoaXRlbSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGl0ZW0KKwkgKiBAcmV0dXJuIG5vbiBudWxsIHJlY29yZHMgbGlzdAorCSAqLworCXB1YmxpYyBBcnJheUxpc3Q8VG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZD4gZ2V0TGlzdChNVG9vbEJhckVsZW1lbnQgaXRlbSkgeworCQlBcnJheUxpc3Q8VG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZD4gdG1wID0gc2hhcmVkRWxlbWVudFRvUmVjb3JkLmdldChpdGVtKTsKKwkJaWYgKHRtcCA9PSBudWxsKSB7CisJCQl0bXAgPSBuZXcgQXJyYXlMaXN0PFRvb2xCYXJDb250cmlidXRpb25SZWNvcmQ+KCk7CisJCQlzaGFyZWRFbGVtZW50VG9SZWNvcmQucHV0KGl0ZW0sIHRtcCk7CisJCX0KKwkJcmV0dXJuIHRtcDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqIEBwYXJhbSByZWNvcmQKKwkgKi8KKwlwdWJsaWMgdm9pZCBsaW5rRWxlbWVudFRvQ29udHJpYnV0aW9uUmVjb3JkKE1Ub29sQmFyRWxlbWVudCBlbGVtZW50LCBUb29sQmFyQ29udHJpYnV0aW9uUmVjb3JkIHJlY29yZCkgeworCQltb2RlbENvbnRyaWJ1dGlvblRvUmVjb3JkLnB1dChlbGVtZW50LCByZWNvcmQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogQHJldHVybiBtYXBwZWQgcmVjb3JkLCBpZiBhbnkKKwkgKi8KKwlwdWJsaWMgVG9vbEJhckNvbnRyaWJ1dGlvblJlY29yZCBnZXRDb250cmlidXRpb25SZWNvcmQoTVRvb2xCYXJFbGVtZW50IGVsZW1lbnQpIHsKKwkJcmV0dXJuIG1vZGVsQ29udHJpYnV0aW9uVG9SZWNvcmQuZ2V0KGVsZW1lbnQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtZW51TWFuYWdlcgorCSAqIEBwYXJhbSB0b29sQmFyCisJICovCisJcHVibGljIHZvaWQgcmVjb25jaWxlTWFuYWdlclRvTW9kZWwoSVRvb2xCYXJNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBNVG9vbEJhciB0b29sQmFyKSB7CisJCUxpc3Q8TVRvb2xCYXJFbGVtZW50PiBtb2RlbENoaWxkcmVuID0gdG9vbEJhci5nZXRDaGlsZHJlbigpOworCQlIYXNoU2V0PE1Ub29sSXRlbT4gb2xkTW9kZWxJdGVtcyA9IG5ldyBIYXNoU2V0PE1Ub29sSXRlbT4oKTsKKwkJZm9yIChNVG9vbEJhckVsZW1lbnQgaXRlbU1vZGVsIDogbW9kZWxDaGlsZHJlbikgeworCQkJaWYgKE9wYXF1ZUVsZW1lbnRVdGlsLmlzT3BhcXVlVG9vbEl0ZW0oaXRlbU1vZGVsKSkgeworCQkJCW9sZE1vZGVsSXRlbXMuYWRkKChNVG9vbEl0ZW0pIGl0ZW1Nb2RlbCk7CisJCQl9CisJCX0KKworCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWVudU1hbmFnZXIuZ2V0SXRlbXMoKTsKKwkJZm9yIChpbnQgc3JjID0gMCwgZGVzdCA9IDA7IHNyYyA8IGl0ZW1zLmxlbmd0aDsgc3JjKyssIGRlc3QrKykgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGl0ZW1zW3NyY107CisJCQlNVG9vbEJhckVsZW1lbnQgZWxlbWVudCA9IGdldFRvb2xFbGVtZW50KGl0ZW0pOworCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJCU1Ub29sSXRlbSBsZWdhY3lJdGVtID0gT3BhcXVlRWxlbWVudFV0aWwuY3JlYXRlT3BhcXVlVG9vbEl0ZW0oKTsKKwkJCQlsZWdhY3lJdGVtLnNldEVsZW1lbnRJZChpdGVtLmdldElkKCkpOworCQkJCWxlZ2FjeUl0ZW0uc2V0VmlzaWJsZShpdGVtLmlzVmlzaWJsZSgpKTsKKwkJCQlPcGFxdWVFbGVtZW50VXRpbC5zZXRPcGFxdWVJdGVtKGxlZ2FjeUl0ZW0sIGl0ZW0pOworCQkJCWxpbmtNb2RlbFRvQ29udHJpYnV0aW9uKGxlZ2FjeUl0ZW0sIGl0ZW0pOworCQkJCW1vZGVsQ2hpbGRyZW4uYWRkKGRlc3QsIGxlZ2FjeUl0ZW0pOworCQkJfSBlbHNlIGlmIChPcGFxdWVFbGVtZW50VXRpbC5pc09wYXF1ZVRvb2xJdGVtKGVsZW1lbnQpKSB7CisJCQkJTVRvb2xJdGVtIGxlZ2FjeUl0ZW0gPSAoTVRvb2xJdGVtKSBlbGVtZW50OworCQkJCW9sZE1vZGVsSXRlbXMucmVtb3ZlKGxlZ2FjeUl0ZW0pOworCQkJCWlmIChtb2RlbENoaWxkcmVuLnNpemUoKSA+IGRlc3QpIHsKKwkJCQkJaWYgKG1vZGVsQ2hpbGRyZW4uZ2V0KGRlc3QpICE9IGxlZ2FjeUl0ZW0pIHsKKwkJCQkJCW1vZGVsQ2hpbGRyZW4ucmVtb3ZlKGxlZ2FjeUl0ZW0pOworCQkJCQkJbW9kZWxDaGlsZHJlbi5hZGQoZGVzdCwgbGVnYWN5SXRlbSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQltb2RlbENoaWxkcmVuLmFkZChsZWdhY3lJdGVtKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIW9sZE1vZGVsSXRlbXMuaXNFbXB0eSgpKSB7CisJCQltb2RlbENoaWxkcmVuLnJlbW92ZUFsbChvbGRNb2RlbEl0ZW1zKTsKKwkJCWZvciAoTVRvb2xJdGVtIG1vZGVsIDogb2xkTW9kZWxJdGVtcykgeworCQkJCU9iamVjdCBvYmogPSBPcGFxdWVFbGVtZW50VXRpbC5nZXRPcGFxdWVJdGVtKG1vZGVsKTsKKwkJCQljbGVhck1vZGVsVG9Db250cmlidXRpb24obW9kZWwsIChJQ29udHJpYnV0aW9uSXRlbSkgb2JqKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RQcm9jZXNzKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1Ub29sQmFyKSB7CisJCQlNVG9vbEJhciB0b29sYmFyTW9kZWwgPSAoTVRvb2xCYXIpIGVsZW1lbnQ7CisJCQlpZiAodG9vbGJhck1vZGVsLmdldFRyYW5zaWVudERhdGEoKS5jb250YWluc0tleShQT1NUX1BST0NFU1NJTkdfRlVOQ1RJT04pKSB7CisJCQkJT2JqZWN0IG9iaiA9IHRvb2xiYXJNb2RlbC5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KFBPU1RfUFJPQ0VTU0lOR19GVU5DVElPTik7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb250ZXh0RnVuY3Rpb24pIHsKKwkJCQkJSUNvbnRleHRGdW5jdGlvbiBmdW5jID0gKElDb250ZXh0RnVuY3Rpb24pIG9iajsKKwkJCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGN0eCA9IGdldENvbnRleHQodG9vbGJhck1vZGVsKTsKKwkJCQkJdG9vbGJhck1vZGVsLmdldFRyYW5zaWVudERhdGEoKS5wdXQoUE9TVF9QUk9DRVNTSU5HX0RJU1BPU0UsIGZ1bmMuY29tcHV0ZShjdHgsIG51bGwpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUVjbGlwc2VDb250ZXh0IGdldENvbnRleHQoTVVJRWxlbWVudCBlbCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dChlbCk7CisJfQorCisJVG9vbEl0ZW1VcGRhdGVyIGdldFVwZGF0ZXIoKSB7CisJCXJldHVybiBlbmFibGVtZW50VXBkYXRlcjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xCYXJSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVG9vbEJhclJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjYjhhNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xCYXJSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRXhwcmVzc2lvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5SdW5BbmRUcmFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQ29udHJpYnV0aW9uc0FuYWx5emVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLlNpZGVWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbUJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXJDb250cmlidXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhckVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhclNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuUm93TGF5b3V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworCisvKioKKyAqIENyZWF0ZSBhIHRvb2xiYXIKKyAqLworcHVibGljIGNsYXNzIFRvb2xCYXJSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwlwcml2YXRlIEhhc2hNYXA8TVRvb2xCYXIsIEFycmF5TGlzdDxBcnJheUxpc3Q8TVRvb2xCYXJFbGVtZW50Pj4+IHBlbmRpbmdDbGVhbnVwID0gbmV3IEhhc2hNYXA8TVRvb2xCYXIsIEFycmF5TGlzdDxBcnJheUxpc3Q8TVRvb2xCYXJFbGVtZW50Pj4+KCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCXN1cGVyLmluaXQoY29udGV4dCk7CisJCWFwcGxpY2F0aW9uID0gY29udGV4dC5nZXQoTUFwcGxpY2F0aW9uLmNsYXNzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1Ub29sQmFyKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkpCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyBIQUNLISEgVGhpcyBzaG91bGQgYmUgZG9uZSB1c2luZyBhIHNlcGFyYXRlIHJlbmRlcmVyCisJCUNvbXBvc2l0ZSBpbnRlcm1lZGlhdGUgPSBuZXcgQ29tcG9zaXRlKChDb21wb3NpdGUpIHBhcmVudCwgU1dULk5PTkUpOworCQljcmVhdGVUb29sYmFyKGVsZW1lbnQsIGludGVybWVkaWF0ZSk7CisJCWludGVybWVkaWF0ZS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICoKKwkJCSAqLworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQljbGVhblVwKChNVG9vbEJhcikgZWxlbWVudCk7CisJCQl9CisJCX0pOworCisJCXJldHVybiBpbnRlcm1lZGlhdGU7CisJfQorCisJVG9vbEJhciBjcmVhdGVUb29sYmFyKGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgQ29tcG9zaXRlIGludGVybWVkaWF0ZSkgeworCQlpbnQgb3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbihlbGVtZW50KTsKKwkJUm93TGF5b3V0IGxheW91dCA9IFJvd0xheW91dEZhY3RvcnkuZmlsbERlZmF1bHRzKCkud3JhcChmYWxzZSkKKwkJCQkuc3BhY2luZygwKS50eXBlKG9yaWVudGF0aW9uKS5jcmVhdGUoKTsKKwkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAzOworCQlsYXlvdXQuY2VudGVyID0gdHJ1ZTsKKwkJaW50ZXJtZWRpYXRlLnNldExheW91dChsYXlvdXQpOworCQlUb29sQmFyIHNlcGFyYXRvclRvb2xCYXIgPSBuZXcgVG9vbEJhcihpbnRlcm1lZGlhdGUsIG9yaWVudGF0aW9uCisJCQkJfCBTV1QuV1JBUCB8IFNXVC5GTEFUIHwgU1dULlJJR0hUKTsKKwkJbmV3IFRvb2xJdGVtKHNlcGFyYXRvclRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOworCQlyZXR1cm4gbmV3IFRvb2xCYXIoaW50ZXJtZWRpYXRlLCBvcmllbnRhdGlvbiB8IFNXVC5XUkFQIHwgU1dULkZMQVQKKwkJCQl8IFNXVC5SSUdIVCk7CisJfQorCisJaW50IGdldE9yaWVudGF0aW9uKGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlNVUlFbGVtZW50IHRoZVBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCWlmICh0aGVQYXJlbnQgaW5zdGFuY2VvZiBNVHJpbUJhcikgeworCQkJTVRyaW1CYXIgdHJpbUNvbnRhaW5lciA9IChNVHJpbUJhcikgdGhlUGFyZW50OworCQkJU2lkZVZhbHVlIHNpZGUgPSB0cmltQ29udGFpbmVyLmdldFNpZGUoKTsKKwkJCWlmIChzaWRlLmdldFZhbHVlKCkgPT0gU2lkZVZhbHVlLkxFRlRfVkFMVUUKKwkJCQkJfHwgc2lkZS5nZXRWYWx1ZSgpID09IFNpZGVWYWx1ZS5SSUdIVF9WQUxVRSkKKwkJCQlyZXR1cm4gU1dULlZFUlRJQ0FMOworCQl9CisJCXJldHVybiBTV1QuSE9SSVpPTlRBTDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVJQ29udGFpbmVyKE1VSUVsZW1lbnQgY2hpbGRFbGVtZW50KSB7CisJCUNvbXBvc2l0ZSBpbnRlcm1lZGlhdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5nZXRVSUNvbnRhaW5lcihjaGlsZEVsZW1lbnQpOworCQlpZiAoaW50ZXJtZWRpYXRlID09IG51bGwgfHwgaW50ZXJtZWRpYXRlLmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJVG9vbEJhciB0b29sYmFyID0gZmluZFRvb2xiYXIoaW50ZXJtZWRpYXRlKTsKKwkJaWYgKHRvb2xiYXIgPT0gbnVsbCkgeworCQkJdG9vbGJhciA9IGNyZWF0ZVRvb2xiYXIoY2hpbGRFbGVtZW50LmdldFBhcmVudCgpLCBpbnRlcm1lZGlhdGUpOworCQl9CisJCXJldHVybiB0b29sYmFyOworCX0KKworCVRvb2xCYXIgZmluZFRvb2xiYXIoQ29tcG9zaXRlIGludGVybWVkaWF0ZSkgeworCQlpZiAoIWludGVybWVkaWF0ZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGludGVybWVkaWF0ZS5nZXRDaGlsZHJlbigpOworCQkJaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPiAwICYmIGNoaWxkcmVuW2xlbmd0aCAtIDFdIGluc3RhbmNlb2YgVG9vbEJhcikgeworCQkJCXJldHVybiAoVG9vbEJhcikgY2hpbGRyZW5bbGVuZ3RoIC0gMV07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGlkZUNoaWxkKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudEVsZW1lbnQsCisJCQlNVUlFbGVtZW50IGNoaWxkKSB7CisJCXN1cGVyLmhpZGVDaGlsZChwYXJlbnRFbGVtZW50LCBjaGlsZCk7CisKKwkJLy8gU2luY2UgdGhlcmUncyBubyBwbGFjZSB0byAnc3RvcmUnIGEgY2hpbGQgdGhhdCdzIG5vdCBpbiBhIG1lbnUKKwkJLy8gd2UnbGwgYmxvdyBpdCBhd2F5IGFuZCByZS1jcmVhdGUgb24gYW4gYWRkCisJCVdpZGdldCB3aWRnZXQgPSAoV2lkZ2V0KSBjaGlsZC5nZXRXaWRnZXQoKTsKKwkJaWYgKHdpZGdldCAhPSBudWxsICYmICF3aWRnZXQuaXNEaXNwb3NlZCgpKSB7CisJCQl3aWRnZXQuZGlzcG9zZSgpOworCQl9CisJCVRvb2xCYXIgdG9vbGJhciA9IChUb29sQmFyKSBnZXRVSUNvbnRhaW5lcihjaGlsZCk7CisJCWlmICh0b29sYmFyICE9IG51bGwgJiYgIXRvb2xiYXIuaXNEaXNwb3NlZCgpKSB7CisJCQl0b29sYmFyLmdldFNoZWxsKCkubGF5b3V0KG5ldyBDb250cm9sW10geyB0b29sYmFyIH0sIFNXVC5ERUZFUik7CisJCX0KKwkJZGlzcG9zZVRvb2xiYXJJZk5lY2Vzc2FyeShwYXJlbnRFbGVtZW50KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGlzcG9zZVRvb2xiYXJJZk5lY2Vzc2FyeShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCVRvb2xCYXIgdG9vbGJhciA9IGZpbmRUb29sYmFyKGNvbXBvc2l0ZSk7CisJCWlmICh0b29sYmFyICE9IG51bGwgJiYgaGFzT25seVNlcGFyYXRvcnModG9vbGJhcikpIHsKKwkJCXRvb2xiYXIuZGlzcG9zZSgpOworCQkJaWYgKGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKKwkJCQljb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXS5kaXNwb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwlib29sZWFuIGhhc09ubHlTZXBhcmF0b3JzKFRvb2xCYXIgdG9vbGJhcikgeworCQlUb29sSXRlbVtdIGNoaWxkcmVuID0gdG9vbGJhci5nZXRJdGVtcygpOworCQlmb3IgKFRvb2xJdGVtIHRvb2xJdGVtIDogY2hpbGRyZW4pIHsKKwkJCWlmICgodG9vbEl0ZW0uZ2V0U3R5bGUoKSAmIFNXVC5TRVBBUkFUT1IpID09IDApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKHRvb2xJdGVtLmdldENvbnRyb2woKSAhPSBudWxsCisJCQkJCSYmIHRvb2xJdGVtLmdldENvbnRyb2woKS5nZXREYXRhKE9XTklOR19NRSkgaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hpbGRSZW5kZXJlZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyLmNoaWxkUmVuZGVyZWQocGFyZW50RWxlbWVudCwgZWxlbWVudCk7CisJCVRvb2xCYXIgdG9vbGJhciA9IChUb29sQmFyKSBnZXRVSUNvbnRhaW5lcihlbGVtZW50KTsKKwkJaWYgKHRvb2xiYXIgIT0gbnVsbCAmJiAhdG9vbGJhci5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRvb2xiYXIuZ2V0U2hlbGwoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IHRvb2xiYXIgfSwgU1dULkRFRkVSKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZW50cyhNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIpIHsKKwkJc3VwZXIucHJvY2Vzc0NvbnRlbnRzKGNvbnRhaW5lcik7CisJCUlFY2xpcHNlQ29udGV4dCBjdHggPSBnZXRDb250ZXh0KGNvbnRhaW5lcik7CisJCUV4cHJlc3Npb25Db250ZXh0IGVDb250ZXh0ID0gbmV3IEV4cHJlc3Npb25Db250ZXh0KGN0eCk7CisJCUFycmF5TGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4gdG9Db250cmlidXRlID0gbmV3IEFycmF5TGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4oKTsKKwkJTUVsZW1lbnRDb250YWluZXI8Pz4gdG9vbGJhck9iaiA9IGNvbnRhaW5lcjsKKwkJTVRvb2xCYXIgdG9vbGJhck1vZGVsID0gKE1Ub29sQmFyKSB0b29sYmFyT2JqOworCQlDb250cmlidXRpb25zQW5hbHl6ZXIuZ2F0aGVyVG9vbEJhckNvbnRyaWJ1dGlvbnModG9vbGJhck1vZGVsLAorCQkJCWFwcGxpY2F0aW9uLmdldFRvb2xCYXJDb250cmlidXRpb25zKCksCisJCQkJdG9vbGJhck1vZGVsLmdldEVsZW1lbnRJZCgpLCB0b0NvbnRyaWJ1dGUsIGVDb250ZXh0KTsKKwkJYWRkVG9vbEJhckNvbnRyaWJ1dGlvbnModG9vbGJhck1vZGVsLCB0b0NvbnRyaWJ1dGUsIGN0eCwgZUNvbnRleHQsCisJCQkJcGVuZGluZ0NsZWFudXApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RQcm9jZXNzKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlci5wb3N0UHJvY2VzcyhlbGVtZW50KTsKKwkJZGlzcG9zZVRvb2xiYXJJZk5lY2Vzc2FyeShlbGVtZW50KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9vbEJhckNvbnRyaWJ1dGlvbnMoCisJCQlmaW5hbCBNVG9vbEJhciB0b29sYmFyTW9kZWwsCisJCQlBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSwKKwkJCUlFY2xpcHNlQ29udGV4dCBjdHgsCisJCQlmaW5hbCBFeHByZXNzaW9uQ29udGV4dCBlQ29udGV4dCwKKwkJCUhhc2hNYXA8TVRvb2xCYXIsIEFycmF5TGlzdDxBcnJheUxpc3Q8TVRvb2xCYXJFbGVtZW50Pj4+IHBlbmRpbmdDbGVhbnVwKSB7CisJCUhhc2hTZXQ8U3RyaW5nPiBleGlzdGluZ1NlcGFyYXRvck5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBjaGlsZCA6IHRvb2xiYXJNb2RlbC5nZXRDaGlsZHJlbigpKSB7CisJCQlTdHJpbmcgZWxlbWVudElkID0gY2hpbGQuZ2V0RWxlbWVudElkKCk7CisJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvciAmJiBlbGVtZW50SWQgIT0gbnVsbCkgeworCQkJCWV4aXN0aW5nU2VwYXJhdG9yTmFtZXMuYWRkKGVsZW1lbnRJZCk7CisJCQl9CisJCX0KKwkJYm9vbGVhbiBkb25lID0gdG9Db250cmlidXRlLnNpemUoKSA9PSAwOworCQl3aGlsZSAoIWRvbmUpIHsKKwkJCUFycmF5TGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4gY3VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+KAorCQkJCQl0b0NvbnRyaWJ1dGUpOworCQkJaW50IHJldHJ5Q291bnQgPSB0b0NvbnRyaWJ1dGUuc2l6ZSgpOworCQkJdG9Db250cmlidXRlLmNsZWFyKCk7CisKKwkJCWZvciAoZmluYWwgTVRvb2xCYXJDb250cmlidXRpb24gY29udHJpYnV0aW9uIDogY3VyTGlzdCkgeworCQkJCWZpbmFsIEFycmF5TGlzdDxNVG9vbEJhckVsZW1lbnQ+IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxNVG9vbEJhckVsZW1lbnQ+KCk7CisJCQkJaWYgKCFDb250cmlidXRpb25zQW5hbHl6ZXIucHJvY2Vzc0FkZGl0aW9uKHRvb2xiYXJNb2RlbCwKKwkJCQkJCWNvbnRyaWJ1dGlvbiwgdG9SZW1vdmUsIGV4aXN0aW5nU2VwYXJhdG9yTmFtZXMpKSB7CisJCQkJCXRvQ29udHJpYnV0ZS5hZGQoY29udHJpYnV0aW9uKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCkgIT0gbnVsbCkgeworCQkJCQkJY3R4LnJ1bkFuZFRyYWNrKG5ldyBSdW5BbmRUcmFjaygpIHsKKwkJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCQkJCQkJCWlmICghdG9vbGJhck1vZGVsLmlzVG9CZVJlbmRlcmVkKCkKKwkJCQkJCQkJCQl8fCAhdG9vbGJhck1vZGVsLmlzVmlzaWJsZSgpCisJCQkJCQkJCQkJfHwgdG9vbGJhck1vZGVsLmdldFdpZGdldCgpID09IG51bGwpIHsKKwkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlib29sZWFuIHJjID0gQ29udHJpYnV0aW9uc0FuYWx5emVyLmlzVmlzaWJsZSgKKwkJCQkJCQkJCQljb250cmlidXRpb24sIGVDb250ZXh0KTsKKwkJCQkJCQkJZm9yIChNVG9vbEJhckVsZW1lbnQgY2hpbGQgOiB0b1JlbW92ZSkgeworCQkJCQkJCQkJY2hpbGQuc2V0VG9CZVJlbmRlcmVkKHJjKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJfQorCQkJCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE1Ub29sQmFyRWxlbWVudD4+IGxpc3RzID0gcGVuZGluZ0NsZWFudXAKKwkJCQkJCQkuZ2V0KHRvb2xiYXJNb2RlbCk7CisJCQkJCWlmIChsaXN0cyA9PSBudWxsKSB7CisJCQkJCQlsaXN0cyA9IG5ldyBBcnJheUxpc3Q8QXJyYXlMaXN0PE1Ub29sQmFyRWxlbWVudD4+KCk7CisJCQkJCQlwZW5kaW5nQ2xlYW51cC5wdXQodG9vbGJhck1vZGVsLCBsaXN0cyk7CisJCQkJCX0KKwkJCQkJbGlzdHMuYWRkKHRvUmVtb3ZlKTsKKwkJCQl9CisJCQl9CisJCQkvLyBXZSdyZSBkb25lIGlmIHRoZSByZXRyeUxpc3QgaXMgbm93IGVtcHR5IChldmVyeXRoaW5nIGRvbmUpIG9yCisJCQkvLyBpZiB0aGUgbGlzdCBoYXNuJ3QgY2hhbmdlZCBhdCBhbGwgKG5vIGhvcGUpCisJCQlkb25lID0gKHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gMCkKKwkJCQkJfHwgKHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gcmV0cnlDb3VudCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKE1Ub29sQmFyIGVsZW1lbnQpIHsKKwkJQXJyYXlMaXN0PEFycmF5TGlzdDxNVG9vbEJhckVsZW1lbnQ+PiBsaXN0cyA9IHBlbmRpbmdDbGVhbnVwCisJCQkJLnJlbW92ZShlbGVtZW50KTsKKwkJaWYgKGxpc3RzID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKEFycmF5TGlzdDxNVG9vbEJhckVsZW1lbnQ+IGxpc3QgOiBsaXN0cykgeworCQkJZm9yIChNVG9vbEJhckVsZW1lbnQgY2hpbGQgOiBsaXN0KSB7CisJCQkJZWxlbWVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShjaGlsZCk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xDb250cm9sQ29udHJpYnV0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Ub29sQ29udHJvbENvbnRyaWJ1dGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzIzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9Ub29sQ29udHJvbENvbnRyaWJ1dGlvbi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5FY2xpcHNlQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5jb250cmlidXRpb25zLklDb250cmlidXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQWJzdHJhY3RQYXJ0UmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CisKK3B1YmxpYyBjbGFzcyBUb29sQ29udHJvbENvbnRyaWJ1dGlvbiBleHRlbmRzIENvbnRyb2xDb250cmlidXRpb24geworCisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXByaXZhdGUgTVRvb2xDb250cm9sIG1vZGVsOworCisJQEluamVjdAorCXByaXZhdGUgSUNvbnRyaWJ1dGlvbkZhY3RvcnkgY29udHJpYkZhY3Rvcnk7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCS8vIHByaXZhdGUgSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQ7CisKKwlwdWJsaWMgVG9vbENvbnRyb2xDb250cmlidXRpb24oKSB7CisJCXN1cGVyKG51bGwpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlJRWNsaXBzZUNvbnRleHQgbG9jYWxDb250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5LmNyZWF0ZSgpOworCisJCWZpbmFsIENvbXBvc2l0ZSBuZXdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQluZXdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOworCQlsb2NhbENvbnRleHQuc2V0KENvbXBvc2l0ZS5jbGFzcy5nZXROYW1lKCksIG5ld0NvbXBvc2l0ZSk7CisJCWxvY2FsQ29udGV4dC5zZXQoTVRvb2xDb250cm9sLmNsYXNzLmdldE5hbWUoKSwgbW9kZWwpOworCisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gbW9kZWxTZXJ2aWNlCisJCQkJLmdldENvbnRhaW5pbmdDb250ZXh0KG1vZGVsKTsKKwkJaWYgKG1vZGVsLmdldE9iamVjdCgpID09IG51bGwpIHsKKwkJCWZpbmFsIE9iamVjdCB0Y0ltcGwgPSBjb250cmliRmFjdG9yeS5jcmVhdGUoCisJCQkJCW1vZGVsLmdldENvbnRyaWJ1dGlvblVSSSgpLCBwYXJlbnRDb250ZXh0LCBsb2NhbENvbnRleHQpOworCQkJbW9kZWwuc2V0T2JqZWN0KHRjSW1wbCk7CisJCQluZXdDb21wb3NpdGUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkudW5pbmplY3QodGNJbXBsLCBwYXJlbnRDb250ZXh0KTsKKwkJCQkJbW9kZWwuc2V0T2JqZWN0KG51bGwpOworCQkJCX0KKwkJCX0pOworCQl9CisKKwkJbW9kZWwuc2V0V2lkZ2V0KG5ld0NvbXBvc2l0ZSk7CisJCW5ld0NvbXBvc2l0ZS5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbW9kZWwpOworCQluZXdDb21wb3NpdGUuc2V0RGF0YSh0aGlzKTsKKworCQlyZXR1cm4gbmV3Q29tcG9zaXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGVsKE1Ub29sQ29udHJvbCBjKSB7CisJCW1vZGVsID0gYzsKKwkJc2V0SWQobW9kZWwuZ2V0RWxlbWVudElkKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xDb250cm9sUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xDb250cm9sUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVmMTVjCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVG9vbENvbnRyb2xSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU29wb3QgQ2VsYSA8c29wb3RjZWxhQGdtYWlsLmNvbT4gLSBCdWcgNDMxODY4CisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDMxODY4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuRWNsaXBzZUNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5jb250cmlidXRpb25zLklDb250cmlidXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLlVJRXZlbnRUb3BpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkFic3RyYWN0UGFydFJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQ1NTUmVuZGVyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuU2lkZVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5FdmVudFRhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5mYWN0b3JpZXMuSVJlbmRlcmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKKworLyoqCisgKiBDcmVhdGUgYSBjb250cmlidXRlIHBhcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBUb29sQ29udHJvbFJlbmRlcmVyIGV4dGVuZHMgU1dUUGFydFJlbmRlcmVyIHsKKworCS8qKgorCSAqIFdpbGwgYmUgcHVibGlzaGVkIG9yIHJlbW92ZWQgaW4gNC41LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBISURFQUJMRSA9ICJISURFQUJMRSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBXaWxsIGJlIHB1Ymxpc2hlZCBvciByZW1vdmVkIGluIDQuNS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19SRVNUT1JFX01FTlUgPSAiU0hPV19SRVNUT1JFX01FTlUiOyAvLyROT04tTkxTLTEkCisKKwlASW5qZWN0CisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisJLyoqCisJICogVGhlIGNvbnRleHQgbWVudSBmb3IgdGhpcyB0cmltIHN0YWNrJ3MgaXRlbXMuCisJICovCisJcHJpdmF0ZSBNZW51IHRvb2xDb250cm9sTWVudTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlV2lkZ2V0KGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVRvb2xDb250cm9sKQorCQkJCXx8ICEocGFyZW50IGluc3RhbmNlb2YgVG9vbEJhciB8fCBwYXJlbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpKQorCQkJcmV0dXJuIG51bGw7CisJCUNvbXBvc2l0ZSBwYXJlbnRDb21wID0gKENvbXBvc2l0ZSkgcGFyZW50OworCQlNVG9vbENvbnRyb2wgdG9vbENvbnRyb2wgPSAoTVRvb2xDb250cm9sKSBlbGVtZW50OworCisJCWlmICgoKE1VSUVsZW1lbnQpIHRvb2xDb250cm9sLmdldFBhcmVudCgpKSBpbnN0YW5jZW9mIE1Ub29sQmFyKSB7CisJCQlJUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkgPSBjb250ZXh0LmdldChJUmVuZGVyZXJGYWN0b3J5LmNsYXNzKTsKKwkJCUFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyID0gZmFjdG9yeS5nZXRSZW5kZXJlcigKKwkJCQkJdG9vbENvbnRyb2wuZ2V0UGFyZW50KCksIHBhcmVudCk7CisJCQlpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBUb29sQmFyTWFuYWdlclJlbmRlcmVyKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKworCQlXaWRnZXQgcGFyZW50V2lkZ2V0ID0gKFdpZGdldCkgcGFyZW50OworCQlJRWNsaXBzZUNvbnRleHQgcGFyZW50Q29udGV4dCA9IGdldENvbnRleHRGb3JQYXJlbnQoZWxlbWVudCk7CisKKwkJVG9vbEl0ZW0gc2VwID0gbnVsbDsKKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRvb2xCYXIpIHsKKwkJCXNlcCA9IG5ldyBUb29sSXRlbSgoVG9vbEJhcikgcGFyZW50V2lkZ2V0LCBTV1QuU0VQQVJBVE9SKTsKKwkJfQorCisJCS8vIGZpbmFsIENvbXBvc2l0ZSBuZXdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKChDb21wb3NpdGUpCisJCS8vIHBhcmVudFdpZGdldCwKKwkJLy8gU1dULk5PTkUpOworCQkvLyBuZXdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOworCQkvLyBiaW5kV2lkZ2V0KGVsZW1lbnQsIG5ld0NvbXBvc2l0ZSk7CisKKwkJLy8gQ3JlYXRlIGEgY29udGV4dCBqdXN0IHRvIGNvbnRhaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGluamVjdGlvbgorCQlJQ29udHJpYnV0aW9uRmFjdG9yeSBjb250cmlidXRpb25GYWN0b3J5ID0gcGFyZW50Q29udGV4dAorCQkJCS5nZXQoSUNvbnRyaWJ1dGlvbkZhY3RvcnkuY2xhc3MpOworCisJCUlFY2xpcHNlQ29udGV4dCBsb2NhbENvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkuY3JlYXRlKCk7CisKKwkJbG9jYWxDb250ZXh0LnNldChDb21wb3NpdGUuY2xhc3MuZ2V0TmFtZSgpLCBwYXJlbnRDb21wKTsKKwkJbG9jYWxDb250ZXh0LnNldChNVG9vbENvbnRyb2wuY2xhc3MuZ2V0TmFtZSgpLCB0b29sQ29udHJvbCk7CisKKwkJT2JqZWN0IHRjSW1wbCA9IGNvbnRyaWJ1dGlvbkZhY3RvcnkuY3JlYXRlKAorCQkJCXRvb2xDb250cm9sLmdldENvbnRyaWJ1dGlvblVSSSgpLCBwYXJlbnRDb250ZXh0LCBsb2NhbENvbnRleHQpOworCQl0b29sQ29udHJvbC5zZXRPYmplY3QodGNJbXBsKTsKKwkJQ29udHJvbFtdIGtpZHMgPSBwYXJlbnRDb21wLmdldENoaWxkcmVuKCk7CisKKwkJLy8gTm8ga2lkcyBtZWFucyB0aGF0IHRoZSB0cmltIGZhaWxlZCBjdXJpbmcgY3JlYXRpb24KKwkJaWYgKGtpZHMubGVuZ3RoID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyBUaGUgbmV3IGNvbnRyb2wgaXMgYXNzdW1lZCB0byBiZSB0aGUgbGFzdCBjaGlsZCBjcmVhdGVkCisJCS8vIFdlIGNvdWxkIHNhZmUgdGhpcyB1cCBldmVuIG1vcmUgYnkgYXNzZXJ0aW5nIHRoYXQgdGhlCisJCS8vIG51bWJlciBvZiBjaGlsZHJlbiBzaG91bGQgZ28gdXAgYnkgKm9uZSogZHVyaW5nIGluamVjdGlvbgorCQlDb250cm9sIG5ld0N0cmwgPSBraWRzW2tpZHMubGVuZ3RoIC0gMV07CisKKwkJaWYgKHNlcCAhPSBudWxsICYmIG5ld0N0cmwgIT0gbnVsbCkgeworCQkJc2VwLnNldENvbnRyb2wobmV3Q3RybCk7CisJCQluZXdDdHJsLnBhY2soKTsKKwkJCXNlcC5zZXRXaWR0aChuZXdDdHJsLmdldFNpemUoKS54KTsKKwkJfQorCisJCXNldENTU0luZm8odG9vbENvbnRyb2wsIG5ld0N0cmwpOworCisJCWJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKKwkJTVVJRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNVHJpbUJhcikgeworCQkJTVRyaW1CYXIgYmFyID0gKE1UcmltQmFyKSBwYXJlbnRFbGVtZW50OworCQkJdmVydGljYWwgPSBiYXIuZ2V0U2lkZSgpID09IFNpZGVWYWx1ZS5MRUZUCisJCQkJCXx8IGJhci5nZXRTaWRlKCkgPT0gU2lkZVZhbHVlLlJJR0hUOworCQl9CisJCUNTU1JlbmRlcmluZ1V0aWxzIGNzc1V0aWxzID0gcGFyZW50Q29udGV4dC5nZXQoQ1NTUmVuZGVyaW5nVXRpbHMuY2xhc3MpOworCQluZXdDdHJsID0gY3NzVXRpbHMuZnJhbWVNZUlmUG9zc2libGUobmV3Q3RybCwgbnVsbCwgdmVydGljYWwsIHRydWUpOworCisJCWJvb2xlYW4gaGlkZWFibGUgPSBpc0hpZGVhYmxlKHRvb2xDb250cm9sKTsKKwkJYm9vbGVhbiBzaG93UmVzdG9yZU1lbnUgPSBpc1Jlc3RvcmVNZW51U2hvd2FibGUodG9vbENvbnRyb2wpOworCQlpZiAoc2hvd1Jlc3RvcmVNZW51IHx8IGhpZGVhYmxlKSB7CisJCQljcmVhdGVUb29sQ29udHJvbE1lbnUodG9vbENvbnRyb2wsIG5ld0N0cmwsIGhpZGVhYmxlKTsKKwkJfQorCisJCXJldHVybiBuZXdDdHJsOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1Jlc3RvcmVNZW51U2hvd2FibGUoTVRvb2xDb250cm9sIHRvb2xDb250cm9sKSB7CisJCXJldHVybiB0b29sQ29udHJvbC5nZXRUYWdzKCkuY29udGFpbnMoU0hPV19SRVNUT1JFX01FTlUpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0hpZGVhYmxlKE1Ub29sQ29udHJvbCB0b29sQ29udHJvbCkgeworCQlyZXR1cm4gdG9vbENvbnRyb2wuZ2V0VGFncygpLmNvbnRhaW5zKEhJREVBQkxFKTsKKwl9CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljVGFnc0NoYW5nZWQoCisJCQlAVUlFdmVudFRvcGljKFVJRXZlbnRzLkFwcGxpY2F0aW9uRWxlbWVudC5UT1BJQ19UQUdTKSBFdmVudCBldmVudCkgeworCisJCU9iamVjdCBjaGFuZ2VkT2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoRXZlbnRUYWdzLkVMRU1FTlQpOworCisJCWlmICghKGNoYW5nZWRPYmogaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpKQorCQkJcmV0dXJuOworCisJCWZpbmFsIE1Ub29sQ29udHJvbCBjaGFuZ2VkRWxlbWVudCA9IChNVG9vbENvbnRyb2wpIGNoYW5nZWRPYmo7CisKKwkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJaWYgKFVJRXZlbnRzLmNvbnRhaW5zKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFLAorCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLkhJRERFTl9FWFBMSUNJVExZKSkgeworCQkJCWNoYW5nZWRFbGVtZW50LnNldFZpc2libGUoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlib29sZWFuIGhpZGVhYmxlID0gVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUsIEhJREVBQkxFKTsKKwkJCQlpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUsIFNIT1dfUkVTVE9SRV9NRU5VKSB8fCBoaWRlYWJsZSkgeworCQkJCQlPYmplY3Qgb2JqID0gY2hhbmdlZEVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250cm9sKSB7CisJCQkJCQlpZiAoKChDb250cm9sKSBvYmopLmdldE1lbnUoKSA9PSBudWxsKSB7CisJCQkJCQkJY3JlYXRlVG9vbENvbnRyb2xNZW51KGNoYW5nZWRFbGVtZW50LCAoQ29udHJvbCkgb2JqLCBoaWRlYWJsZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQlpZiAoVUlFdmVudHMuY29udGFpbnMoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5PTERfVkFMVUUsCisJCQkJCUlQcmVzZW50YXRpb25FbmdpbmUuSElEREVOX0VYUExJQ0lUTFkpKSB7CisJCQkJY2hhbmdlZEVsZW1lbnQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCX0KKwkJfQorCX0KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNBcHBTdGFydHVwKAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5VSUxpZmVDeWNsZS5BUFBfU1RBUlRVUF9DT01QTEVURSkgRXZlbnQgZXZlbnQpIHsKKwkJTGlzdDxNVG9vbENvbnRyb2w+IHRvb2xDb250cm9scyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoCisJCQkJYXBwbGljYXRpb24sIG51bGwsIE1Ub29sQ29udHJvbC5jbGFzcywgbnVsbCk7CisJCWZvciAoTVRvb2xDb250cm9sIHRvb2xDb250cm9sIDogdG9vbENvbnRyb2xzKSB7CisJCQlpZiAodG9vbENvbnRyb2wuZ2V0VGFncygpLmNvbnRhaW5zKAorCQkJCQlJUHJlc2VudGF0aW9uRW5naW5lLkhJRERFTl9FWFBMSUNJVExZKSkgeworCQkJCXRvb2xDb250cm9sLnNldFZpc2libGUoZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xDb250cm9sTWVudShmaW5hbCBNVG9vbENvbnRyb2wgdG9vbENvbnRyb2wsCisgQ29udHJvbCByZW5kZXJlZEN0cmwsIGJvb2xlYW4gaGlkZWFibGUpIHsKKwkJdG9vbENvbnRyb2xNZW51ID0gbmV3IE1lbnUocmVuZGVyZWRDdHJsKTsKKworCQlpZiAoaGlkZWFibGUpIHsKKwkJCU1lbnVJdGVtIGhpZGVJdGVtID0gbmV3IE1lbnVJdGVtKHRvb2xDb250cm9sTWVudSwgU1dULk5PTkUpOworCQkJaGlkZUl0ZW0uc2V0VGV4dChNZXNzYWdlcy5Ub29sQmFyTWFuYWdlclJlbmRlcmVyX01lbnVDbG9zZVRleHQpOworCQkJaGlkZUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJCS8qKgorCQkJCSAqCisJCQkJICovCisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgeworCQkJCQl0b29sQ29udHJvbC5nZXRUYWdzKCkuYWRkKElQcmVzZW50YXRpb25FbmdpbmUuSElEREVOX0VYUExJQ0lUTFkpOworCQkJCX0KKwkJCX0pOworCisJCQluZXcgTWVudUl0ZW0odG9vbENvbnRyb2xNZW51LCBTV1QuU0VQQVJBVE9SKTsKKwkJfQorCisJCU1lbnVJdGVtIHJlc3RvcmVIaWRkZW5JdGVtcyA9IG5ldyBNZW51SXRlbSh0b29sQ29udHJvbE1lbnUsIFNXVC5OT05FKTsKKwkJcmVzdG9yZUhpZGRlbkl0ZW1zCisJCQkJLnNldFRleHQoTWVzc2FnZXMuVG9vbEJhck1hbmFnZXJSZW5kZXJlcl9NZW51UmVzdG9yZVRleHQpOworCQlyZXN0b3JlSGlkZGVuSXRlbXMuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgeworCQkJCXJlbW92ZUhpZGRlblRhZ3ModG9vbENvbnRyb2wpOworCQkJfQorCQl9KTsKKwkJcmVuZGVyZWRDdHJsLnNldE1lbnUodG9vbENvbnRyb2xNZW51KTsKKworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIElQcmVzZW50YXRpb25FbmdpbmUuSElEREVOX0VYUExJQ0lUTFkgZnJvbSB0aGUgdHJpbWJhcgorCSAqIGVudHJpZXMuIEhhdmluZyBhIHNlcGFyYXRlIGxvZ2ljIGZvciB0b29sYmFycyBhbmQgdG9vbGNvbnRyb2xzIHdvdWxkIGJlCisJICogY29uZnVzaW5nIGZvciB0aGUgdXNlciwgaGVuY2Ugd2UgcmVtb3ZlIHRoaXMgdGFnIGZvciBib3RoIHRoZXNlIHR5cGVzCisJICoKKwkgKiBAcGFyYW0gdG9vbGJhck1vZGVsCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUhpZGRlblRhZ3MoTVRvb2xDb250cm9sIHRvb2xDb250cm9sKSB7CisJCU1XaW5kb3cgbVdpbmRvdyA9IG1vZGVsU2VydmljZS5nZXRUb3BMZXZlbFdpbmRvd0Zvcih0b29sQ29udHJvbCk7CisJCUxpc3Q8TVRyaW1FbGVtZW50PiB0cmltRWxlbWVudHMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKG1XaW5kb3csCisJCQkJbnVsbCwgTVRyaW1FbGVtZW50LmNsYXNzLCBudWxsKTsKKwkJZm9yIChNVHJpbUVsZW1lbnQgdHJpbUVsZW1lbnQgOiB0cmltRWxlbWVudHMpIHsKKwkJCXRyaW1FbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoSVByZXNlbnRhdGlvbkVuZ2luZS5ISURERU5fRVhQTElDSVRMWSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xJdGVtUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xJdGVtUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJlY2ExCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVG9vbEl0ZW1SZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FQ29tbWFuZFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FSGFuZGxlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkVjbGlwc2VDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5FeGVjdXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5sb2cuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLkVCaW5kaW5nU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Db250cmlidXRpb25zQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLlBvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUmVuZGVyZWRFbGVtZW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkFic3RyYWN0UGFydFJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1Db250cmlidXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuSXRlbVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NSGFuZGxlZEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CisKKy8qKgorICogQ3JlYXRlIGEgY29udHJpYnV0ZSBwYXJ0LgorICovCitwdWJsaWMgY2xhc3MgVG9vbEl0ZW1SZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElSX1NUQVRJQ19DT05URVhUID0gIkhDSS1zdGF0aWNDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJQEluamVjdAorCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKKwlASW5qZWN0CisJcHJpdmF0ZSBJRXZlbnRCcm9rZXIgZXZlbnRCcm9rZXI7CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBpdGVtVXBkYXRlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJLy8gRW5zdXJlIHRoYXQgdGhpcyBldmVudCBpcyBmb3IgYSBNVG9vbEl0ZW0KKwkJCWlmICghKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1Ub29sSXRlbSkpCisJCQkJcmV0dXJuOworCisJCQlNVG9vbEl0ZW0gaXRlbU1vZGVsID0gKE1Ub29sSXRlbSkgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCVRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBpdGVtTW9kZWwuZ2V0V2lkZ2V0KCk7CisKKwkJCS8vIE5vIHdpZGdldCA9PSBub3RoaW5nIHRvIHVwZGF0ZQorCQkJaWYgKHRvb2xJdGVtID09IG51bGwpCisJCQkJcmV0dXJuOworCisJCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuQVRUTkFNRSk7CisJCQlpZiAoVUlFdmVudHMuVUlMYWJlbC5MQUJFTC5lcXVhbHMoYXR0TmFtZSkKKwkJCQkJfHwgVUlFdmVudHMuVUlMYWJlbC5MT0NBTElaRURfTEFCRUwuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQkJc2V0SXRlbVRleHQoaXRlbU1vZGVsLCB0b29sSXRlbSk7CisJCQl9IGVsc2UgaWYgKFVJRXZlbnRzLlVJTGFiZWwuSUNPTlVSSS5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCQl0b29sSXRlbS5zZXRJbWFnZShnZXRJbWFnZShpdGVtTW9kZWwpKTsKKwkJCX0gZWxzZSBpZiAoVUlFdmVudHMuVUlMYWJlbC5UT09MVElQLmVxdWFscyhhdHROYW1lKQorCQkJCQl8fCBVSUV2ZW50cy5VSUxhYmVsLkxPQ0FMSVpFRF9UT09MVElQLmVxdWFscyhhdHROYW1lKSkgeworCQkJCXRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KGdldFRvb2xUaXBUZXh0KGl0ZW1Nb2RlbCkpOworCQkJCXRvb2xJdGVtLnNldEltYWdlKGdldEltYWdlKGl0ZW1Nb2RlbCkpOworCQkJfQorCQl9CisJfTsKKworCXByaXZhdGUgRXZlbnRIYW5kbGVyIHNlbGVjdGlvblVwZGF0ZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTVRvb2xJdGVtCisJCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNVG9vbEl0ZW0pKQorCQkJCXJldHVybjsKKworCQkJTVRvb2xJdGVtIGl0ZW1Nb2RlbCA9IChNVG9vbEl0ZW0pIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisJCQlUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgaXRlbU1vZGVsLmdldFdpZGdldCgpOworCQkJaWYgKHRvb2xJdGVtICE9IG51bGwpIHsKKwkJCQl0b29sSXRlbS5zZXRTZWxlY3Rpb24oaXRlbU1vZGVsLmlzU2VsZWN0ZWQoKSk7CisJCQl9CisJCX0KKwl9OworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgZW5hYmxlZFVwZGF0ZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTVRvb2xJdGVtCisJCQlpZiAoIShldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCkgaW5zdGFuY2VvZiBNVG9vbEl0ZW0pKQorCQkJCXJldHVybjsKKworCQkJTVRvb2xJdGVtIGl0ZW1Nb2RlbCA9IChNVG9vbEl0ZW0pIGV2ZW50CisJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisJCQlUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgaXRlbU1vZGVsLmdldFdpZGdldCgpOworCQkJaWYgKHRvb2xJdGVtICE9IG51bGwpIHsKKwkJCQl0b29sSXRlbS5zZXRFbmFibGVkKGl0ZW1Nb2RlbC5pc0VuYWJsZWQoKSk7CisJCQl9CisJCX0KKwl9OworCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuVUlMYWJlbC5UT1BJQ19BTEwsIGl0ZW1VcGRhdGVyKTsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkl0ZW0uVE9QSUNfU0VMRUNURUQsIHNlbGVjdGlvblVwZGF0ZXIpOworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuSXRlbS5UT1BJQ19FTkFCTEVELCBlbmFibGVkVXBkYXRlcik7CisJfQorCisJQFByZURlc3Ryb3kKKwlwdWJsaWMgdm9pZCBjb250ZXh0RGlzcG9zZWQoKSB7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGl0ZW1VcGRhdGVyKTsKKwkJZXZlbnRCcm9rZXIudW5zdWJzY3JpYmUoc2VsZWN0aW9uVXBkYXRlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGVuYWJsZWRVcGRhdGVyKTsKKwl9CisKKwlwcml2YXRlIFBhcmFtZXRlcml6ZWRDb21tYW5kIGdlbmVyYXRlUGFyYW1ldGVyaXplZENvbW1hbmQoCisJCQlmaW5hbCBNSGFuZGxlZEl0ZW0gaXRlbSwgZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQpIHsKKwkJRUNvbW1hbmRTZXJ2aWNlIGNtZFNlcnZpY2UgPSAoRUNvbW1hbmRTZXJ2aWNlKSBsY2xDb250ZXh0CisJCQkJLmdldChFQ29tbWFuZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzID0gbnVsbDsKKwkJTGlzdDxNUGFyYW1ldGVyPiBtb2RlbFBhcm1zID0gaXRlbS5nZXRQYXJhbWV0ZXJzKCk7CisJCWlmIChtb2RlbFBhcm1zICE9IG51bGwgJiYgIW1vZGVsUGFybXMuaXNFbXB0eSgpKSB7CisJCQlwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlmb3IgKE1QYXJhbWV0ZXIgbVBhcm0gOiBtb2RlbFBhcm1zKSB7CisJCQkJcGFyYW1ldGVycy5wdXQobVBhcm0uZ2V0TmFtZSgpLCBtUGFybS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjbWQgPSBjbWRTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoaXRlbS5nZXRDb21tYW5kKCkKKwkJCQkuZ2V0RWxlbWVudElkKCksIHBhcmFtZXRlcnMpOworCQlpdGVtLnNldFdiQ29tbWFuZChjbWQpOworCQlyZXR1cm4gY21kOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRJdGVtVGV4dChNVG9vbEl0ZW0gbW9kZWwsIFRvb2xJdGVtIGl0ZW0pIHsKKwkJU3RyaW5nIHRleHQgPSBtb2RlbC5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQlpZiAodGV4dCA9PSBudWxsKSB7CisJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpdGVtLnNldFRleHQodGV4dCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoTUl0ZW0gaXRlbSkgeworCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0TG9jYWxpemVkVG9vbHRpcCgpOworCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1IYW5kbGVkSXRlbSkgeworCQkJTUhhbmRsZWRJdGVtIGhhbmRsZWRJdGVtID0gKE1IYW5kbGVkSXRlbSkgaXRlbTsKKwkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChpdGVtKTsKKwkJCUVCaW5kaW5nU2VydmljZSBicyA9IChFQmluZGluZ1NlcnZpY2UpIGNvbnRleHQKKwkJCQkJLmdldChFQmluZGluZ1NlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCA9IGhhbmRsZWRJdGVtLmdldFdiQ29tbWFuZCgpOworCQkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQkJY21kID0gZ2VuZXJhdGVQYXJhbWV0ZXJpemVkQ29tbWFuZChoYW5kbGVkSXRlbSwgY29udGV4dCk7CisJCQl9CisJCQlUcmlnZ2VyU2VxdWVuY2Ugc2VxdWVuY2UgPSBicy5nZXRCZXN0U2VxdWVuY2VGb3IoaGFuZGxlZEl0ZW0KKwkJCQkJLmdldFdiQ29tbWFuZCgpKTsKKwkJCWlmIChzZXF1ZW5jZSAhPSBudWxsKSB7CisJCQkJaWYgKHRleHQgPT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJdGV4dCA9IGNtZC5nZXROYW1lKCk7CisJCQkJCX0gY2F0Y2ggKE5vdERlZmluZWRFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQkJdGV4dCA9IHRleHQgKyAiICgiICsgc2VxdWVuY2UuZm9ybWF0KCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiB0ZXh0OworCQl9CisJCXJldHVybiB0ZXh0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlV2lkZ2V0KGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVRvb2xJdGVtKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIFRvb2xCYXIpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJTVRvb2xJdGVtIGl0ZW1Nb2RlbCA9IChNVG9vbEl0ZW0pIGVsZW1lbnQ7CisKKwkJLy8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCB3ZSBzaG91bGQgY3JlYXRlIHRoZSBuZXcgaXRlbQorCQlpbnQgYWRkSW5kZXggPSBjYWxjVmlzaWJsZUluZGV4KGVsZW1lbnQpOworCisJCS8vIE9LLCBpdCdzIGEgcmVhbCBtZW51IGl0ZW0sIHdoYXQga2luZD8KKwkJTU1lbnUgbWVudSA9IGl0ZW1Nb2RlbC5nZXRNZW51KCk7CisJCWludCBmbGFncyA9IDA7CisJCWlmIChtZW51ICE9IG51bGwpIHsKKwkJCWZsYWdzIHw9IFNXVC5EUk9QX0RPV047CisJCX0gZWxzZSBpZiAoaXRlbU1vZGVsLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5QVVNIKQorCQkJZmxhZ3MgfD0gU1dULlBVU0g7CisJCWVsc2UgaWYgKGl0ZW1Nb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuQ0hFQ0spCisJCQlmbGFncyB8PSBTV1QuQ0hFQ0s7CisJCWVsc2UgaWYgKGl0ZW1Nb2RlbC5nZXRUeXBlKCkgPT0gSXRlbVR5cGUuUkFESU8pCisJCQlmbGFncyB8PSBTV1QuUkFESU87CisKKwkJVG9vbEl0ZW0gbmV3SXRlbSA9IG5ldyBUb29sSXRlbSgoVG9vbEJhcikgcGFyZW50LCBmbGFncywgYWRkSW5kZXgpOworCQlpZiAoaXRlbU1vZGVsLmdldExhYmVsKCkgIT0gbnVsbCkKKwkJCW5ld0l0ZW0uc2V0VGV4dChpdGVtTW9kZWwuZ2V0TG9jYWxpemVkTGFiZWwoKSk7CisKKwkJbmV3SXRlbS5zZXRUb29sVGlwVGV4dChnZXRUb29sVGlwVGV4dChpdGVtTW9kZWwpKTsKKworCQluZXdJdGVtLnNldEltYWdlKGdldEltYWdlKChNVUlMYWJlbCkgZWxlbWVudCkpOworCisJCW5ld0l0ZW0uc2V0RW5hYmxlZChpdGVtTW9kZWwuaXNFbmFibGVkKCkpOworCisJCW5ld0l0ZW0uc2V0U2VsZWN0aW9uKGl0ZW1Nb2RlbC5pc1NlbGVjdGVkKCkpOworCisJCXJldHVybiBuZXdJdGVtOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVDaGlsZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBjaGlsZCkgeworCQlzdXBlci5oaWRlQ2hpbGQocGFyZW50RWxlbWVudCwgY2hpbGQpOworCisJCS8vIFNpbmNlIHRoZXJlJ3Mgbm8gcGxhY2UgdG8gJ3N0b3JlJyBhIGNoaWxkIHRoYXQncyBub3QgaW4gYSBtZW51CisJCS8vIHdlJ2xsIGJsb3cgaXQgYXdheSBhbmQgcmUtY3JlYXRlIG9uIGFuIGFkZAorCQlXaWRnZXQgd2lkZ2V0ID0gKFdpZGdldCkgY2hpbGQuZ2V0V2lkZ2V0KCk7CisJCWlmICh3aWRnZXQgIT0gbnVsbCAmJiAhd2lkZ2V0LmlzRGlzcG9zZWQoKSkKKwkJCXdpZGdldC5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaG9va0NvbnRyb2xsZXJMb2dpYyhNVUlFbGVtZW50IG1lKSB7CisJCS8vIElmIHRoZSBpdGVtIGlzIGEgQ0hFQ0sgb3IgUkFESU8gdXBkYXRlIHRoZSBtb2RlbCdzIHN0YXRlIHRvIG1hdGNoCisJCWlmIChtZSBpbnN0YW5jZW9mIE1JdGVtKSB7CisJCQlmaW5hbCBNSXRlbSBpdGVtID0gKE1JdGVtKSBtZTsKKwkJCWlmIChpdGVtLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5DSEVDSworCQkJCQl8fCBpdGVtLmdldFR5cGUoKSA9PSBJdGVtVHlwZS5SQURJTykgeworCQkJCVRvb2xJdGVtIHRpID0gKFRvb2xJdGVtKSBtZS5nZXRXaWRnZXQoKTsKKwkJCQl0aS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJCS8qKgorCQkJCQkgKgorCQkJCQkgKi8KKwkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCWl0ZW0uc2V0U2VsZWN0ZWQoKChUb29sSXRlbSkgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJaXRlbS5zZXRTZWxlY3RlZCgoKFRvb2xJdGVtKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQl9CisJCQkJfSk7CisJCQl9IGVsc2UgaWYgKG1lIGluc3RhbmNlb2YgTVRvb2xJdGVtKSB7CisJCQkJZmluYWwgTU1lbnUgbW1lbnUgPSAoKE1Ub29sSXRlbSkgbWUpLmdldE1lbnUoKTsKKwkJCQlpZiAobW1lbnUgIT0gbnVsbCkgeworCQkJCQlmaW5hbCBUb29sSXRlbSB0aSA9IChUb29sSXRlbSkgbWUuZ2V0V2lkZ2V0KCk7CisJCQkJCXRpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQkJLyoqCisJCQkJCQkgKgorCQkJCQkJICovCisJCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5BUlJPVykgeworCQkJCQkJCQlNZW51IG1lbnUgPSBnZXRNZW51KG1tZW51LCB0aSk7CisKKwkJCQkJCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSB0aS5nZXRCb3VuZHMoKTsKKwkJCQkJCQkJUG9pbnQgZGlzcGxheUF0ID0gdGkuZ2V0UGFyZW50KCkudG9EaXNwbGF5KAorCQkJCQkJCQkJCWl0ZW1Cb3VuZHMueCwKKwkJCQkJCQkJCQlpdGVtQm91bmRzLnkgKyBpdGVtQm91bmRzLmhlaWdodCk7CisJCQkJCQkJCW1lbnUuc2V0TG9jYXRpb24oZGlzcGxheUF0KTsKKwkJCQkJCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOworCisJCQkJCQkJCURpc3BsYXkgZGlzcGxheSA9IG1lbnUuZ2V0RGlzcGxheSgpOworCQkJCQkJCQl3aGlsZSAobWVudS5pc1Zpc2libGUoKSkgeworCQkJCQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7CisJCQkJCQkJCQkJZGlzcGxheS5zbGVlcCgpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyAnRXhlY3V0ZScgdGhlIG9wZXJhdGlvbiBpZiBwb3NzaWJsZQorCQlpZiAobWUgaW5zdGFuY2VvZiBNQ29udHJpYnV0aW9uCisJCQkJJiYgKChNQ29udHJpYnV0aW9uKSBtZSkuZ2V0Q29udHJpYnV0aW9uVVJJKCkgIT0gbnVsbCkgeworCQkJZmluYWwgTVRvb2xJdGVtIGl0ZW0gPSAoTVRvb2xJdGVtKSBtZTsKKwkJCWZpbmFsIE1Db250cmlidXRpb24gY29udHJpYiA9IChNQ29udHJpYnV0aW9uKSBtZTsKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtZSk7CisJCQlUb29sSXRlbSB0aSA9IChUb29sSXRlbSkgbWUuZ2V0V2lkZ2V0KCk7CisJCQl0aS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJaWYgKGNvbnRyaWIuZ2V0T2JqZWN0KCkgPT0gbnVsbCkgeworCQkJCQkJSUNvbnRyaWJ1dGlvbkZhY3RvcnkgY2YgPSAoSUNvbnRyaWJ1dGlvbkZhY3RvcnkpIGxjbENvbnRleHQKKwkJCQkJCQkJLmdldChJQ29udHJpYnV0aW9uRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCQkJCQkJY29udHJpYi5zZXRPYmplY3QoY2YuY3JlYXRlKAorCQkJCQkJCQljb250cmliLmdldENvbnRyaWJ1dGlvblVSSSgpLCBsY2xDb250ZXh0KSk7CisJCQkJCX0KKwkJCQkJbGNsQ29udGV4dC5zZXQoTUl0ZW0uY2xhc3MuZ2V0TmFtZSgpLCBpdGVtKTsKKwkJCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkuaW52b2tlKGNvbnRyaWIuZ2V0T2JqZWN0KCksCisJCQkJCQkJRXhlY3V0ZS5jbGFzcywgbGNsQ29udGV4dCk7CisJCQkJCWxjbENvbnRleHQucmVtb3ZlKE1JdGVtLmNsYXNzLmdldE5hbWUoKSk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl9CisJCQl9KTsKKwkJfSBlbHNlIGlmIChtZSBpbnN0YW5jZW9mIE1IYW5kbGVkSXRlbSkgeworCQkJZmluYWwgTUhhbmRsZWRJdGVtIGl0ZW0gPSAoTUhhbmRsZWRJdGVtKSBtZTsKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtZSk7CisJCQlmaW5hbCBUb29sSXRlbSB0aSA9IChUb29sSXRlbSkgbWUuZ2V0V2lkZ2V0KCk7CisJCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSB0aS5nZXREaXNwbGF5KCk7CisJCQlkaXNwbGF5LnRpbWVyRXhlYyg1MDAsIG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlib29sZWFuIGxvZ2dlZCA9IGZhbHNlOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlpZiAodGkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQkJCUVIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbGNsQ29udGV4dAorCQkJCQkJCQkJLmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MpOworCQkJCQkJCWlmIChzZXJ2aWNlID09IG51bGwpIHsKKwkJCQkJCQkJLy8gbm8gbG9jYWxpemVkIGhhbmRsZXIgc2VydmljZQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCQkJCQkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNtZCA9IGl0ZW0uZ2V0V2JDb21tYW5kKCk7CisJCQkJCQkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQkJCQkJCWNtZCA9IGdlbmVyYXRlUGFyYW1ldGVyaXplZENvbW1hbmQoaXRlbSwKKwkJCQkJCQkJCQlsY2xDb250ZXh0KTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGNtZCA9PSBudWxsKSB7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisJCQkJCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkKKwkJCQkJCQkJCS5jcmVhdGUoVElSX1NUQVRJQ19DT05URVhUKTsKKwkJCQkJCQlDb250cmlidXRpb25zQW5hbHl6ZXIucG9wdWxhdGVNb2RlbEludGVyZmFjZXMoaXRlbSwKKwkJCQkJCQkJCXN0YXRpY0NvbnRleHQsIGl0ZW0uZ2V0Q2xhc3MoKQorCQkJCQkJCQkJCQkuZ2V0SW50ZXJmYWNlcygpKTsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlpdGVtLnNldEVuYWJsZWQoc2VydmljZS5jYW5FeGVjdXRlKGNtZCwKKwkJCQkJCQkJCQlzdGF0aWNDb250ZXh0KSk7CisJCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQkJc3RhdGljQ29udGV4dC5kaXNwb3NlKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQkJCQkJaWYgKCFsb2dnZWQpIHsKKwkJCQkJCQkJbG9nZ2VkID0gdHJ1ZTsKKwkJCQkJCQkJbG9nZ2VyLmVycm9yKAorCQkJCQkJCQkJCWV4Y2VwdGlvbiwKKwkJCQkJCQkJCQkiSW50ZXJuYWwgZXJyb3IgZHVyaW5nIHRvb2wgaXRlbSBlbmFibGVtZW50IHVwZGF0aW5nLCB0aGlzIGlzIG9ubHkgbG9nZ2VkIG9uY2UgcGVyIHRvb2wgaXRlbS4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJCS8vIHJlcGVhdCB1bnRpbCBkaXNwb3NlZAorCQkJCQlkaXNwbGF5LnRpbWVyRXhlYyg1MDAsIHRoaXMpOworCQkJCX0KKwkJCX0pOworCQkJdGkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCS8qKgorCQkJCSAqCisJCQkJICovCisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWlmIChlLmRldGFpbCAhPSBTV1QuQVJST1cpIHsKKwkJCQkJCUVIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gKEVIYW5kbGVyU2VydmljZSkgbGNsQ29udGV4dAorCQkJCQkJCQkuZ2V0KEVIYW5kbGVyU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworCQkJCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgY21kID0gaXRlbS5nZXRXYkNvbW1hbmQoKTsKKwkJCQkJCWlmIChjbWQgPT0gbnVsbCkgeworCQkJCQkJCWNtZCA9IGdlbmVyYXRlUGFyYW1ldGVyaXplZENvbW1hbmQoaXRlbSwgbGNsQ29udGV4dCk7CisJCQkJCQl9CisJCQkJCQlpZiAoY21kID09IG51bGwpIHsKKwkJCQkJCQlBY3RpdmF0b3IudHJhY2UoUG9saWN5LkRFQlVHX01FTlVTLAorCQkJCQkJCQkJIkZhaWxlZCB0byBleGVjdXRlOiAiICsgaXRlbS5nZXRDb21tYW5kKCksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCW51bGwpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0ID0gRWNsaXBzZUNvbnRleHRGYWN0b3J5CisJCQkJCQkJCS5jcmVhdGUoVElSX1NUQVRJQ19DT05URVhUKTsKKwkJCQkJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5wb3B1bGF0ZU1vZGVsSW50ZXJmYWNlcyhpdGVtLAorCQkJCQkJCQlzdGF0aWNDb250ZXh0LCBpdGVtLmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKTsKKwkJCQkJCXNlcnZpY2UuZXhlY3V0ZUhhbmRsZXIoY21kLCBzdGF0aWNDb250ZXh0KTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbW1lbnUKKwkgKiBAcGFyYW0gc2hlbGwKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIE1lbnUgZ2V0TWVudShmaW5hbCBNTWVudSBtbWVudSwgVG9vbEl0ZW0gdG9vbEl0ZW0pIHsKKwkJT2JqZWN0IG9iaiA9IG1tZW51LmdldFdpZGdldCgpOworCQlpZiAob2JqIGluc3RhbmNlb2YgTWVudSkgeworCQkJcmV0dXJuIChNZW51KSBvYmo7CisJCX0KKwkJLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSBwYXNzdGhyb3VnaCBvZiB0aGUgSU1lbnVDcmVhdG9yCisJCWlmIChSZW5kZXJlZEVsZW1lbnRVdGlsLmlzUmVuZGVyZWRNZW51KG1tZW51KSkgeworCQkJb2JqID0gUmVuZGVyZWRFbGVtZW50VXRpbC5nZXRDb250cmlidXRpb25NYW5hZ2VyKG1tZW51KTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29udGV4dEZ1bmN0aW9uKSB7CisJCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBnZXRDb250ZXh0KG1tZW51KTsKKwkJCQlvYmogPSAoKElDb250ZXh0RnVuY3Rpb24pIG9iaikuY29tcHV0ZShsY2xDb250ZXh0LCBudWxsKTsKKwkJCQlSZW5kZXJlZEVsZW1lbnRVdGlsLnNldENvbnRyaWJ1dGlvbk1hbmFnZXIobW1lbnUsIG9iaik7CisJCQl9CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSU1lbnVDcmVhdG9yKSB7CisJCQkJZmluYWwgSU1lbnVDcmVhdG9yIGNyZWF0b3IgPSAoSU1lbnVDcmVhdG9yKSBvYmo7CisJCQkJZmluYWwgTWVudSBtZW51ID0gY3JlYXRvci5nZXRNZW51KHRvb2xJdGVtLmdldFBhcmVudCgpCisJCQkJCQkuZ2V0U2hlbGwoKSk7CisJCQkJaWYgKG1lbnUgIT0gbnVsbCkgeworCQkJCQl0b29sSXRlbS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkJCS8qKgorCQkJCQkJICoKKwkJCQkJCSAqLworCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJCQlpZiAobWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQljcmVhdG9yLmRpc3Bvc2UoKTsKKwkJCQkJCQkJbW1lbnUuc2V0V2lkZ2V0KG51bGwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJCW1tZW51LnNldFdpZGdldChtZW51KTsKKwkJCQkJbWVudS5zZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSwgbWVudSk7CisJCQkJCXJldHVybiBtZW51OworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gZ2V0Q29udGV4dChtbWVudSk7CisJCQlJUHJlc2VudGF0aW9uRW5naW5lIGVuZ2luZSA9IGxjbENvbnRleHQKKwkJCQkJLmdldChJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzKTsKKwkJCW9iaiA9IGVuZ2luZS5jcmVhdGVHdWkobW1lbnUsIHRvb2xJdGVtLmdldFBhcmVudCgpLCBsY2xDb250ZXh0KTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBNZW51KSB7CisJCQkJcmV0dXJuIChNZW51KSBvYmo7CisJCQl9CisJCQlsb2dnZXIuZGVidWcoIlJlbmRlcmluZyByZXR1cm5lZCAiICsgb2JqKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xJdGVtVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVG9vbEl0ZW1VcGRhdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiZWI2MgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1Rvb2xJdGVtVXBkYXRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5TZWxlY3RvcjsKKworcHVibGljIGNsYXNzIFRvb2xJdGVtVXBkYXRlciB7CisKKwlwcml2YXRlIExpc3Q8SGFuZGxlZENvbnRyaWJ1dGlvbkl0ZW0+IGl0ZW1zVG9DaGVjayA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlZENvbnRyaWJ1dGlvbkl0ZW0+KCk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PEhhbmRsZWRDb250cmlidXRpb25JdGVtPiBvcnBoYW5lZFRvb2xJdGVtcyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlZENvbnRyaWJ1dGlvbkl0ZW0+KCk7CisKKwl2b2lkIHJlZ2lzdGVySXRlbShIYW5kbGVkQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7CisJCWlmICghaXRlbXNUb0NoZWNrLmNvbnRhaW5zKGl0ZW0pKSB7CisJCQlpdGVtc1RvQ2hlY2suYWRkKGl0ZW0pOworCQl9CisJfQorCisJdm9pZCByZW1vdmVJdGVtKEhhbmRsZWRDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKKwkJaXRlbXNUb0NoZWNrLnJlbW92ZShpdGVtKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVDb250cmlidXRpb25JdGVtcyhTZWxlY3RvciBzZWxlY3RvcikgeworCQlmb3IgKGZpbmFsIEhhbmRsZWRDb250cmlidXRpb25JdGVtIGhjaSA6IGl0ZW1zVG9DaGVjaykgeworCQkJaWYgKGhjaS5nZXRNb2RlbCgpICE9IG51bGwgJiYgaGNpLmdldE1vZGVsKCkuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBzZWxlY3Rvci5zZWxlY3QoaGNpLmdldE1vZGVsKCkpKSB7CisJCQkJaGNpLnVwZGF0ZUl0ZW1FbmFibGVtZW50KCk7CisJCQl9IGVsc2UgeworCQkJCW9ycGhhbmVkVG9vbEl0ZW1zLmFkZChoY2kpOworCQkJfQorCQl9CisJCWlmICghb3JwaGFuZWRUb29sSXRlbXMuaXNFbXB0eSgpKSB7CisJCQlpdGVtc1RvQ2hlY2sucmVtb3ZlQWxsKG9ycGhhbmVkVG9vbEl0ZW1zKTsKKwkJCW9ycGhhbmVkVG9vbEl0ZW1zLmNsZWFyKCk7CisJCX0KKworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1RyaW1CYXJMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1RyaW1CYXJMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U1MDMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVHJpbUJhckxheW91dC5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgQ2hyaXN0aWFuIFdhbHRoZXIgKEluZGVsIEFHKSAtIEJ1ZyAzOTk0NTg6IEZpeCBsYXlvdXQgb3ZlcmxhcCBpbiBsaW5lLXdyYXBwZWQgdHJpbSBiYXIKKyAqICAgICBDaHJpc3RpYW4gV2FsdGhlciAoSW5kZWwgQUcpIC0gQnVnIDM4OTAxMjogRml4IGRpdmlzaW9uIGJ5IHplcm8gaW4gVHJpbUJhckxheW91dAorICogICAgIE1hcmMtQW5kcmUgTGFwZXJsZSAoRXJpY3Nzb24pIC0gQnVnIDQ2NjIzMzogVG9vbGJhciBpdGVtcyBhcmUgd3JvbmdseSByZW5kZXJlZCBpbnRvIGEgImRyb3AtZG93biIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkFic3RyYWN0UGFydFJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1CYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKKworcHVibGljIGNsYXNzIFRyaW1CYXJMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworCS8qKgorCSAqCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwljbGFzcyBUcmltTGluZSB7CisJCU1hcDxDb250cm9sLCBQb2ludD4gc2l6ZU1hcCA9IG5ldyBIYXNoTWFwPENvbnRyb2wsIFBvaW50PigpOworCQlMaXN0PENvbnRyb2w+IGN0cmxzID0gbmV3IEFycmF5TGlzdDxDb250cm9sPigpOworCQlpbnQgc3BhY2VyQ291bnQgPSAwOworCQlpbnQgZXh0cmFTcGFjZSA9IDA7CisJCWludCBtYWpvciA9IDA7CisJCWludCBtaW5vciA9IDA7CisKKwkJcHVibGljIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGN0cmwpIHsKKwkJCVBvaW50IGN0cmxTaXplID0gY29tcHV0ZVNpemUoY3RybCk7CisJCQlpbnQgY3RybE1ham9yID0gaG9yaXpvbnRhbCA/IGN0cmxTaXplLnggOiBjdHJsU2l6ZS55OworCQkJaW50IGN0cmxNaW5vciA9IGhvcml6b250YWwgPyBjdHJsU2l6ZS55IDogY3RybFNpemUueDsKKworCQkJbWFqb3IgKz0gY3RybE1ham9yOworCQkJaWYgKGN0cmxNaW5vciA+IG1pbm9yKQorCQkJCW1pbm9yID0gY3RybE1pbm9yOworCisJCQlzaXplTWFwLnB1dChjdHJsLCBjdHJsU2l6ZSk7CisJCQljdHJscy5hZGQoY3RybCk7CisKKwkJCWlmIChpc1NwYWNlcihjdHJsKSkKKwkJCQlzcGFjZXJDb3VudCsrOworCQl9CisKKwkJcHVibGljIHZvaWQgbWVyZ2VTZWdtZW50KFRyaW1MaW5lIHNlZ21lbnQpIHsKKwkJCXNpemVNYXAucHV0QWxsKHNlZ21lbnQuc2l6ZU1hcCk7CisJCQljdHJscy5hZGRBbGwoc2VnbWVudC5jdHJscyk7CisKKwkJCW1ham9yICs9IHNlZ21lbnQubWFqb3I7CisJCQlpZiAoc2VnbWVudC5taW5vciA+IG1pbm9yKQorCQkJCW1pbm9yID0gc2VnbWVudC5taW5vcjsKKworCQkJc3BhY2VyQ291bnQgKz0gc2VnbWVudC5zcGFjZXJDb3VudDsKKwkJfQorCX0KKworCXByaXZhdGUgTGlzdDxUcmltTGluZT4gbGluZXMgPSBuZXcgQXJyYXlMaXN0PFRyaW1MaW5lPigpOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU1BBQ0VSID0gInN0cmV0Y2giOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBTdHJpbmcgR0xVRSA9ICJnbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBib29sZWFuIGhvcml6b250YWw7CisKKwlwdWJsaWMgaW50IG1hcmdpbkxlZnQgPSAwOworCXB1YmxpYyBpbnQgbWFyZ2luUmlnaHQgPSAwOworCXB1YmxpYyBpbnQgbWFyZ2luVG9wID0gMDsKKwlwdWJsaWMgaW50IG1hcmdpbkJvdHRvbSA9IDA7CisJcHVibGljIGludCB3cmFwU3BhY2luZyA9IDA7CisKKwlwdWJsaWMgVHJpbUJhckxheW91dChib29sZWFuIGhvcml6b250YWwpIHsKKwkJdGhpcy5ob3Jpem9udGFsID0gaG9yaXpvbnRhbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsCisJCQlib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJaWYgKGZsdXNoQ2FjaGUpIHsKKwkJCS8vIENsZWFyIHRoZSBjdXJyZW50IGNhY2hlCisJCQlsaW5lcy5jbGVhcigpOworCQl9CisKKwkJLy8gRmlyc3QsIGhpZGUgYW55IGVtcHR5IHRvb2xiYXJzCisJCU1UcmltQmFyIGJhciA9IChNVHJpbUJhcikgY29tcG9zaXRlCisJCQkJLmdldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FKTsKKwkJZm9yIChNVHJpbUVsZW1lbnQgdGUgOiBiYXIuZ2V0Q2hpbGRyZW4oKSkgeworCQkJaGlkZU1hbmFnZWRUQih0ZSk7CisJCX0KKworCQlpbnQgdG90YWxNYWpvciA9IGhvcml6b250YWwgPyB3SGludCAtIChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQpCisJCQkJOiBoSGludCAtIChtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b20pOworCQlpbnQgdG90YWxNaW5vciA9IDA7CisJCWludCBzcGFjZUxlZnQgPSB0b3RhbE1ham9yOworCisJCVRyaW1MaW5lIGN1ckxpbmUgPSBuZXcgVHJpbUxpbmUoKTsKKwkJQ29udHJvbFtdIGtpZHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CisJCQlDb250cm9sIGN0cmwgPSBraWRzW2ldOworCisJCQkvLyBHTFVFIEhhbmRsaW5nOyBnYXRoZXIgYW55IGdsdWVkIGNvbnRyb2xzIHVwIGludG8gYSAnc2VnbWVudCcKKwkJCVRyaW1MaW5lIHNlZ21lbnQgPSBuZXcgVHJpbUxpbmUoKTsKKwkJCXNlZ21lbnQuYWRkQ29udHJvbChjdHJsKTsKKwkJCXdoaWxlIChpIDwgKGtpZHMubGVuZ3RoIC0gMikgJiYgaXNHbHVlKGtpZHNbaSArIDFdKSkgeworCQkJCXNlZ21lbnQuYWRkQ29udHJvbChraWRzW2kgKyAxXSk7CisJCQkJc2VnbWVudC5hZGRDb250cm9sKGtpZHNbaSArIDJdKTsKKwkJCQlpICs9IDI7CisJCQl9CisKKwkJCS8vIERvIHdlIGhhdmUgZW5vdWdoIHNwYWNlID8KKwkJCWlmIChzZWdtZW50Lm1ham9yIDw9IHNwYWNlTGVmdCkgeworCQkJCS8vIFllcywgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBjdXJyZW50IGxpbmUKKwkJCQljdXJMaW5lLm1lcmdlU2VnbWVudChzZWdtZW50KTsKKwkJCQlzcGFjZUxlZnQgLT0gc2VnbWVudC5tYWpvcjsKKwkJCX0gZWxzZSB7CisJCQkJLy8gTm8sIGNhY2hlIHRoZSBjdXJyZW50IGxpbmUgYW5kIHN0YXJ0IGEgbmV3IG9uZQorCQkJCWN1ckxpbmUuZXh0cmFTcGFjZSA9IHNwYWNlTGVmdDsKKwkJCQlsaW5lcy5hZGQoY3VyTGluZSk7CisJCQkJdG90YWxNaW5vciArPSBjdXJMaW5lLm1pbm9yOworCisJCQkJY3VyTGluZSA9IHNlZ21lbnQ7CisJCQkJc3BhY2VMZWZ0ID0gdG90YWxNYWpvciAtIHNlZ21lbnQubWFqb3I7CisJCQl9CisJCX0KKworCQlpZiAoY3VyTGluZS5jdHJscy5zaXplKCkgPiAwKSB7CisJCQljdXJMaW5lLmV4dHJhU3BhY2UgPSBzcGFjZUxlZnQ7CisJCQlsaW5lcy5hZGQoY3VyTGluZSk7CisJCQl0b3RhbE1pbm9yICs9IGN1ckxpbmUubWlub3I7CisJCX0KKworCQkvLyBBZGp1c3QgdGhlICd0b3RhbE1pbm9yJyB0byBhY2NvdW50IGZvciB0aGUgbWFyZ2lucworCQlpbnQgdG90YWxXcmFwU3BhY2luZyA9IChsaW5lcy5zaXplKCkgLSAxKSAqIHdyYXBTcGFjaW5nOworCQl0b3RhbE1pbm9yICs9IGhvcml6b250YWwgPyAobWFyZ2luVG9wICsgbWFyZ2luQm90dG9tKQorCQkJCSsgdG90YWxXcmFwU3BhY2luZyA6IChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQpCisJCQkJKyB0b3RhbFdyYXBTcGFjaW5nOworCQlQb2ludCBjYWxjU2l6ZSA9IGhvcml6b250YWwgPyBuZXcgUG9pbnQod0hpbnQsIHRvdGFsTWlub3IpIDogbmV3IFBvaW50KAorCQkJCXRvdGFsTWlub3IsIGhIaW50KTsKKwkJcmV0dXJuIGNhbGNTaXplOworCX0KKworCXByaXZhdGUgUG9pbnQgY29tcHV0ZVNpemUoQ29udHJvbCBjdHJsKSB7CisJCVBvaW50IGN0cmxTaXplID0gY3RybC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCisJCS8vIEhhY2shIHRoZSBTdGF0dXNMaW5lIGRvZXNuJ3QgY29tcHV0ZSBhIHVzZWFibGUgc2l6ZQorCQlpZiAoaXNTdGF0dXNMaW5lKGN0cmwpKSB7CisJCQljdHJsU2l6ZS54ID0gMzc1OworCQkJY3RybFNpemUueSA9IDI2OworCQl9CisKKwkJcmV0dXJuIGN0cmxTaXplOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgYSBIQUNLICEgRHVlIHRvIGNvbXBhdGliaWxpdHkgcmVzdHJpY3Rpb25zIHdlIGhhdmUgdGhlIGNhc2Ugd2hlcmUKKwkgKiB3ZSA8Yj5tdXN0PC9iPiBsZWF2ZSAnZW1wdHknIHRvb2xiYXJzIGluIHRoZSB0cmltLiBUaGlzIGNvZGUgZGV0ZWN0cyB0aGlzCisJICogcGFydGljdWxhciBzY2VuYXJpbyBhbmQgaGlkZXMgYW55IFRCJ3Mgb2YgdGhpcyB0eXBlLi4uCisJICoKKwkgKiBAcGFyYW0gdGUKKwkgKiAgICAgICAgICAgIFRoZSBwcm9wb3NlZCB0cmltIGVsZW1lbnQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBlbXB0eSBtYW5hZ2VkCisJICogICAgICAgICBUQi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGlkZU1hbmFnZWRUQihNVHJpbUVsZW1lbnQgdGUpIHsKKwkJaWYgKCEodGUgaW5zdGFuY2VvZiBNVG9vbEJhcikKKwkJCQl8fCAhKHRlLmdldFJlbmRlcmVyKCkgaW5zdGFuY2VvZiBUb29sQmFyTWFuYWdlclJlbmRlcmVyKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoISh0ZS5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJQ29tcG9zaXRlIHRlQ29tcCA9IChDb21wb3NpdGUpIHRlLmdldFdpZGdldCgpOworCQlDb250cm9sW10ga2lkcyA9IHRlQ29tcC5nZXRDaGlsZHJlbigpOworCQlpZiAoa2lkcy5sZW5ndGggIT0gMSB8fCAhKGtpZHNbMF0gaW5zdGFuY2VvZiBUb29sQmFyKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlib29sZWFuIGJhclZpc2libGUgPSAoKFRvb2xCYXIpIGtpZHNbMF0pLmdldEl0ZW1Db3VudCgpID4gMDsKKworCQkvLyBIQUNLISBUaGUgdHJpbSBkcmFnZ2luZyBjb2RlIHVzZXMgdGhlIHZpc2libGUgYXR0cmlidXRlIGFzIHdlbGwKKwkJLy8gdGhpcyBpcyBhIGxvY2FsICdsb2NrJyB0byBwcmV2ZW50IHRoZSBsYXlvdXQgZnJvbSBtZXNzaW5nIHdpdGggaXQKKwkJaWYgKCF0ZS5nZXRUYWdzKCkuY29udGFpbnMoIkxvY2tWaXNpYmlsaXR5IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGUuc2V0VmlzaWJsZShiYXJWaXNpYmxlKTsKKwkJfQorCisJCXJldHVybiAhYmFyVmlzaWJsZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCWlmIChmbHVzaENhY2hlKSB7CisJCQkvLyBDbGVhciB0aGUgY3VycmVudCBjYWNoZQorCQkJbGluZXMuY2xlYXIoKTsKKwkJfQorCQlSZWN0YW5nbGUgYm91bmRzID0gY29tcG9zaXRlLmdldEJvdW5kcygpOworCisJCS8vIG9mZnNldCB0aGUgcmVjdGFuZ2xlIHRvIGFsbG93IGZvciB0aGUgbWFyZ2lucworCQlib3VuZHMueCA9IG1hcmdpbkxlZnQ7CisJCWJvdW5kcy55ID0gbWFyZ2luVG9wOworCQlib3VuZHMud2lkdGggLT0gKG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCk7CisJCWJvdW5kcy5oZWlnaHQgLT0gKG1hcmdpblRvcCArIG1hcmdpbkJvdHRvbSk7CisKKwkJLy8gSWYgd2Ugd2VyZSBjYWxsZWQgZGlyZWN0bHkgd2UgbmVlZCB0byBmaWxsIHRoZSBjYWNoZXMKKwkJaWYgKGxpbmVzLnNpemUoKSA9PSAwKSB7CisJCQlpZiAoaG9yaXpvbnRhbCkKKwkJCQljb21wdXRlU2l6ZShjb21wb3NpdGUsIGJvdW5kcy53aWR0aCwgU1dULkRFRkFVTFQsIHRydWUpOworCQkJZWxzZQorCQkJCWNvbXB1dGVTaXplKGNvbXBvc2l0ZSwgU1dULkRFRkFVTFQsIGJvdW5kcy5oZWlnaHQsIHRydWUpOworCQl9CisJCWlmIChsaW5lcy5zaXplKCkgPT0gMCkKKwkJCXJldHVybjsKKworCQlmb3IgKFRyaW1MaW5lIGN1ckxpbmUgOiBsaW5lcykgeworCQkJdGlsZUxpbmUoY3VyTGluZSwgYm91bmRzKTsKKwkJCWlmIChob3Jpem9udGFsKQorCQkJCWJvdW5kcy55ICs9IGN1ckxpbmUubWlub3IgKyB3cmFwU3BhY2luZzsKKwkJCWVsc2UKKwkJCQlib3VuZHMueCArPSBjdXJMaW5lLm1pbm9yICsgd3JhcFNwYWNpbmc7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY3VyTGluZQorCSAqIEBwYXJhbSBib3VuZHMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdGlsZUxpbmUoVHJpbUxpbmUgY3VyTGluZSwgUmVjdGFuZ2xlIGJvdW5kcykgeworCQlpbnQgY3VyWCA9IGJvdW5kcy54OworCQlpbnQgY3VyWSA9IGJvdW5kcy55OworCQlpbnQgcmVtYWluaW5nRXh0cmFTcGFjZSA9IGN1ckxpbmUuZXh0cmFTcGFjZTsKKwkJaW50IHJlbWFpbmluZ1NwYWNlckNvdW50ID0gY3VyTGluZS5zcGFjZXJDb3VudDsKKwkJZm9yIChDb250cm9sIGN0cmwgOiBjdXJMaW5lLmN0cmxzKSB7CisJCQlpZiAoY3RybC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVBvaW50IGN0cmxTaXplID0gY3VyTGluZS5zaXplTWFwLmdldChjdHJsKTsKKwkJCWludCBjdHJsV2lkdGggPSBjdHJsU2l6ZS54OworCQkJaW50IGN0cmxIZWlnaHQgPSBjdHJsU2l6ZS55OworCQkJYm9vbGVhbiB6ZXJvU2l6ZSA9IGN0cmxXaWR0aCA9PSAwICYmIGN0cmxIZWlnaHQgPT0gMDsKKworCQkJLy8gSWYgaXRzIGEgJ3NwYWNlcicgdGhlbiBhZGQgYW55IGF2YWlsYWJsZSAnZXh0cmEnIHNwYWNlIHRvIGl0CisJCQlpZiAoaXNTcGFjZXIoY3RybCkpIHsKKwkJCQlpbnQgZXh0cmEgPSByZW1haW5pbmdFeHRyYVNwYWNlIC8gcmVtYWluaW5nU3BhY2VyQ291bnQ7CisJCQkJaWYgKGhvcml6b250YWwpIHsKKwkJCQkJY3RybFdpZHRoICs9IGV4dHJhOworCQkJCQkvLyBsZWF2ZSBvdXQgNCBwaXhlbHMgYXQgdGhlIGJvdHRvbSB0byBhdm9pZCBvdmVybGFwcGluZyB0aGUKKwkJCQkJLy8gMXB4IGJvdHRvbSBib3JkZXIgb2YgdGhlIHRvb2xiYXIgKGJ1ZyAzODk5NDEpCisJCQkJCWN0cmwuc2V0Qm91bmRzKGN1clgsIGN1clksIGN0cmxXaWR0aCwgY3VyTGluZS5taW5vciAtIDQpOworCQkJCX0gZWxzZSB7CisJCQkJCWN0cmxIZWlnaHQgKz0gZXh0cmE7CisJCQkJCWN0cmwuc2V0Qm91bmRzKGN1clgsIGN1clksIGN1ckxpbmUubWlub3IsIGN0cmxIZWlnaHQpOworCQkJCX0KKwkJCQl6ZXJvU2l6ZSA9IGZhbHNlOworCQkJCXJlbWFpbmluZ0V4dHJhU3BhY2UgLT0gZXh0cmE7CisJCQkJcmVtYWluaW5nU3BhY2VyQ291bnQtLTsKKwkJCX0KKworCQkJaWYgKGhvcml6b250YWwpIHsKKwkJCQlpbnQgb2Zmc2V0ID0gKGN1ckxpbmUubWlub3IgLSBjdHJsSGVpZ2h0KSAvIDI7CisJCQkJaWYgKCFpc1NwYWNlcihjdHJsKSkgeworCQkJCQlpZiAoIXplcm9TaXplKQorCQkJCQkJY3RybC5zZXRCb3VuZHMoY3VyWCwgY3VyWSArIG9mZnNldCwgY3RybFdpZHRoLAorCQkJCQkJCQljdHJsSGVpZ2h0KTsKKwkJCQkJZWxzZQorCQkJCQkJY3RybC5zZXRCb3VuZHMoY3VyWCwgY3VyWSwgMCwgMCk7CisJCQkJfQorCQkJCWN1clggKz0gY3RybFdpZHRoOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgb2Zmc2V0ID0gKGN1ckxpbmUubWlub3IgLSBjdHJsV2lkdGgpIC8gMjsKKwkJCQljdHJsLnNldEJvdW5kcyhjdXJYICsgb2Zmc2V0LCBjdXJZLCBjdHJsV2lkdGgsIGN0cmxIZWlnaHQpOworCQkJCWN1clkgKz0gY3RybEhlaWdodDsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1NwYWNlcihDb250cm9sIGN0cmwpIHsKKwkJTVVJRWxlbWVudCBlbGVtZW50ID0gKE1VSUVsZW1lbnQpIGN0cmwKKwkJCQkuZ2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUpOworCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKFNQQUNFUikpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzR2x1ZShDb250cm9sIGN0cmwpIHsKKwkJTVVJRWxlbWVudCBlbGVtZW50ID0gKE1VSUVsZW1lbnQpIGN0cmwKKwkJCQkuZ2V0RGF0YShBYnN0cmFjdFBhcnRSZW5kZXJlci5PV05JTkdfTUUpOworCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKEdMVUUpKQorCQkJcmV0dXJuIHRydWU7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1N0YXR1c0xpbmUoQ29udHJvbCBjdHJsKSB7CisJCU1VSUVsZW1lbnQgZWxlbWVudCA9IChNVUlFbGVtZW50KSBjdHJsCisJCQkJLmdldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FKTsKKwkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEVsZW1lbnRJZCgpICE9IG51bGwKKwkJCQkmJiBlbGVtZW50LmdldEVsZW1lbnRJZCgpLmVxdWFscygib3JnLmVjbGlwc2UudWkuU3RhdHVzTGluZSIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHBhcmFtIHRyaW1Qb3MKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIENvbnRyb2wgY3RybEZyb21Qb2ludChDb21wb3NpdGUgdHJpbUNvbXAsIFBvaW50IHRyaW1Qb3MpIHsKKwkJaWYgKHRyaW1Db21wID09IG51bGwgfHwgdHJpbUNvbXAuaXNEaXNwb3NlZCgpIHx8IGxpbmVzID09IG51bGwKKwkJCQl8fCBsaW5lcy5zaXplKCkgPT0gMCkKKwkJCXJldHVybiBudWxsOworCisJCUNvbnRyb2xbXSBraWRzID0gdHJpbUNvbXAuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoa2lkc1tpXS5pc0Rpc3Bvc2VkKCkpCisJCQkJY29udGludWU7CisJCQlpZiAoa2lkc1tpXS5nZXRCb3VuZHMoKS5jb250YWlucyh0cmltUG9zKSkKKwkJCQlyZXR1cm4ga2lkc1tpXTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1RyaW1CYXJSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVHJpbUJhclJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhMTFiMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1RyaW1CYXJSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgVHJpc3RhbiBIdW1lIC0gPHRyaXNodW1lQGdtYWlsLmNvbT4gLQorICogICAgIAkJRml4IGZvciBCdWcgMjM2OSBbV29ya2JlbmNoXSBXb3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gc2F2ZSB3b3Jrc3BhY2Ugd2l0aG91dCBleGl0aW5nCisgKiAgICAgCQlJbXBsZW1lbnRlZCB3b3JrYmVuY2ggYXV0by1zYXZlIHRvIGNvcnJlY3RseSByZXN0b3JlIHN0YXRlIGluIGNhc2Ugb2YgY3Jhc2guCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuUnVuQW5kVHJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkNvbnRyaWJ1dGlvbnNBbmFseXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5TaWRlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1CYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltbWVkV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRyaW1Db250cmlidXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIFRyaW1CYXJSZW5kZXJlciBleHRlbmRzIFNXVFBhcnRSZW5kZXJlciB7CisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwlwcml2YXRlIGNsYXNzIExheW91dEpvYiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKwkJcHVibGljIExpc3Q8TVRyaW1CYXI+IGJhcnNUb0xheW91dCA9IG5ldyBBcnJheUxpc3Q8TVRyaW1CYXI+KCk7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWxheW91dEpvYiA9IG51bGw7CisJCQlpZiAoYmFyc1RvTGF5b3V0LnNpemUoKSA9PSAwKQorCQkJCXJldHVybjsKKwkJCWZvciAoTVRyaW1CYXIgYmFyIDogYmFyc1RvTGF5b3V0KSB7CisJCQkJQ29tcG9zaXRlIHRyaW1DdHJsID0gKENvbXBvc2l0ZSkgYmFyLmdldFdpZGdldCgpOworCQkJCWlmICh0cmltQ3RybCAhPSBudWxsICYmICF0cmltQ3RybC5pc0Rpc3Bvc2VkKCkpCisJCQkJCXRyaW1DdHJsLmxheW91dCgpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBMYXlvdXRKb2IgbGF5b3V0Sm9iID0gbnVsbDsKKworCXN5bmNocm9uaXplZCBwcml2YXRlIHZvaWQgbGF5b3V0VHJpbShNVHJpbUJhciB0cmltQmFyKSB7CisJCUNvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgdHJpbUJhci5nZXRXaWRnZXQoKTsKKwkJaWYgKGNvbXAgPT0gbnVsbCB8fCBjb21wLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybjsKKworCQlpZiAobGF5b3V0Sm9iID09IG51bGwpIHsKKwkJCWxheW91dEpvYiA9IG5ldyBMYXlvdXRKb2IoKTsKKwkJCWxheW91dEpvYi5iYXJzVG9MYXlvdXQuYWRkKHRyaW1CYXIpOworCQkJY29tcC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKGxheW91dEpvYik7CisJCX0gZWxzZSBpZiAoIWxheW91dEpvYi5iYXJzVG9MYXlvdXQuY29udGFpbnModHJpbUJhcikpIHsKKwkJCWxheW91dEpvYi5iYXJzVG9MYXlvdXQuYWRkKHRyaW1CYXIpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlzdXBlci5pbml0KGNvbnRleHQpOworCQlhcHBsaWNhdGlvbiA9IGNvbnRleHQuZ2V0KE1BcHBsaWNhdGlvbi5jbGFzcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNVHJpbUJhcikgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJQ29tcG9zaXRlIHBhcmVudENvbXAgPSAoQ29tcG9zaXRlKSBwYXJlbnQ7CisKKwkJQ29tcG9zaXRlIHRyaW1Db21wb3NpdGUgPSBudWxsOworCQlmaW5hbCBNVHJpbUJhciB0cmltTW9kZWwgPSAoTVRyaW1CYXIpIGVsZW1lbnQ7CisJCWlmIChwYXJlbnRDb21wLmdldExheW91dCgpIGluc3RhbmNlb2YgVHJpbW1lZFBhcnRMYXlvdXQpIHsKKwkJCVRyaW1tZWRQYXJ0TGF5b3V0IHRwbCA9IChUcmltbWVkUGFydExheW91dCkgcGFyZW50Q29tcC5nZXRMYXlvdXQoKTsKKworCQkJc3dpdGNoICh0cmltTW9kZWwuZ2V0U2lkZSgpLmdldFZhbHVlKCkpIHsKKwkJCWNhc2UgU2lkZVZhbHVlLlRPUF9WQUxVRToKKwkJCQl0cmltQ29tcG9zaXRlID0gdHBsLmdldFRyaW1Db21wb3NpdGUocGFyZW50Q29tcCwgU1dULlRPUCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZGVWYWx1ZS5CT1RUT01fVkFMVUU6CisJCQkJdHJpbUNvbXBvc2l0ZSA9IHRwbC5nZXRUcmltQ29tcG9zaXRlKHBhcmVudENvbXAsIFNXVC5CT1RUT00pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWRlVmFsdWUuTEVGVF9WQUxVRToKKwkJCQl0cmltQ29tcG9zaXRlID0gdHBsLmdldFRyaW1Db21wb3NpdGUocGFyZW50Q29tcCwgU1dULkxFRlQpOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWRlVmFsdWUuUklHSFRfVkFMVUU6CisJCQkJdHJpbUNvbXBvc2l0ZSA9IHRwbC5nZXRUcmltQ29tcG9zaXRlKHBhcmVudENvbXAsIFNXVC5SSUdIVCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJdHJpbUNvbXBvc2l0ZS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJY2xlYW5VcCh0cmltTW9kZWwpOworCQkJCX0KKwkJCX0pOworCQl9IGVsc2UgeworCQkJdHJpbUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50Q29tcCwgU1dULk5PTkUpOworCQkJdHJpbUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRyaW1CYXJMYXlvdXQodHJ1ZSkpOworCQl9CisJCXJldHVybiB0cmltQ29tcG9zaXRlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVDaGlsZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBjaGlsZCkgeworCQlzdXBlci5oaWRlQ2hpbGQocGFyZW50RWxlbWVudCwgY2hpbGQpOworCisJCU9iamVjdCBkb3duQ2FzdCA9IHBhcmVudEVsZW1lbnQ7CisJCWxheW91dFRyaW0oKE1UcmltQmFyKSBkb3duQ2FzdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRlbnRzKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IG1lKSB7CisJCWlmICghKCgoTVVJRWxlbWVudCkgbWUpIGluc3RhbmNlb2YgTVRyaW1CYXIpKQorCQkJcmV0dXJuOworCQlzdXBlci5wcm9jZXNzQ29udGVudHMobWUpOworCQlJRWNsaXBzZUNvbnRleHQgY3R4ID0gZ2V0Q29udGV4dChtZSk7CisJCUV4cHJlc3Npb25Db250ZXh0IGVDb250ZXh0ID0gbmV3IEV4cHJlc3Npb25Db250ZXh0KGN0eCk7CisJCU1FbGVtZW50Q29udGFpbmVyPD8+IHRyaW1PYmogPSBtZTsKKwkJTVRyaW1CYXIgdHJpbU1vZGVsID0gKE1UcmltQmFyKSB0cmltT2JqOworCQlBcnJheUxpc3Q8TVRyaW1Db250cmlidXRpb24+IHRvQ29udHJpYnV0ZSA9IG5ldyBBcnJheUxpc3Q8TVRyaW1Db250cmlidXRpb24+KCk7CisJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5nYXRoZXJUcmltQ29udHJpYnV0aW9ucyh0cmltTW9kZWwsCisJCQkJYXBwbGljYXRpb24uZ2V0VHJpbUNvbnRyaWJ1dGlvbnMoKSwgdHJpbU1vZGVsLmdldEVsZW1lbnRJZCgpLAorCQkJCXRvQ29udHJpYnV0ZSwgZUNvbnRleHQpOworCQlhZGRUcmltQ29udHJpYnV0aW9ucyh0cmltTW9kZWwsIHRvQ29udHJpYnV0ZSwgY3R4LCBlQ29udGV4dCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFRyaW1Db250cmlidXRpb25zKGZpbmFsIE1UcmltQmFyIHRyaW1Nb2RlbCwKKwkJCUFycmF5TGlzdDxNVHJpbUNvbnRyaWJ1dGlvbj4gdG9Db250cmlidXRlLCBJRWNsaXBzZUNvbnRleHQgY3R4LAorCQkJZmluYWwgRXhwcmVzc2lvbkNvbnRleHQgZUNvbnRleHQpIHsKKwkJSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nVG9vbGJhcklkcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCQlNVHJpbW1lZFdpbmRvdyB0b3BXaW4gPSAoTVRyaW1tZWRXaW5kb3cpIG1vZGVsU2VydmljZQorCQkJCS5nZXRUb3BMZXZlbFdpbmRvd0Zvcih0cmltTW9kZWwpOworCQlmb3IgKE1UcmltQmFyIGJhciA6IHRvcFdpbi5nZXRUcmltQmFycygpKSB7CisJCQlmb3IgKE1UcmltRWxlbWVudCBpdGVtIDogYmFyLmdldENoaWxkcmVuKCkpIHsKKwkJCQlTdHJpbmcgaWQgPSBpdGVtLmdldEVsZW1lbnRJZCgpOworCQkJCWlmIChpZCAhPSBudWxsKSB7CisJCQkJCWV4aXN0aW5nVG9vbGJhcklkcy5hZGQoaWQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWJvb2xlYW4gZG9uZSA9IHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gMDsKKwkJd2hpbGUgKCFkb25lKSB7CisJCQlBcnJheUxpc3Q8TVRyaW1Db250cmlidXRpb24+IGN1ckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1UcmltQ29udHJpYnV0aW9uPigKKwkJCQkJdG9Db250cmlidXRlKTsKKwkJCWludCByZXRyeUNvdW50ID0gdG9Db250cmlidXRlLnNpemUoKTsKKwkJCXRvQ29udHJpYnV0ZS5jbGVhcigpOworCisJCQlmb3IgKGZpbmFsIE1UcmltQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiA6IGN1ckxpc3QpIHsKKwkJCQlmaW5hbCBBcnJheUxpc3Q8TVRyaW1FbGVtZW50PiB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8TVRyaW1FbGVtZW50PigpOworCQkJCWlmICghQ29udHJpYnV0aW9uc0FuYWx5emVyLnByb2Nlc3NBZGRpdGlvbih0cmltTW9kZWwsCisJCQkJCQljb250cmlidXRpb24sIHRvUmVtb3ZlLCBleGlzdGluZ1Rvb2xiYXJJZHMpKSB7CisJCQkJCXRvQ29udHJpYnV0ZS5hZGQoY29udHJpYnV0aW9uKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCkgIT0gbnVsbCkgeworCQkJCQkJY3R4LnJ1bkFuZFRyYWNrKG5ldyBSdW5BbmRUcmFjaygpIHsKKwkJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCQkJCQkJCWlmICghdHJpbU1vZGVsLmlzVG9CZVJlbmRlcmVkKCkKKwkJCQkJCQkJCQl8fCAhdHJpbU1vZGVsLmlzVmlzaWJsZSgpCisJCQkJCQkJCQkJfHwgdHJpbU1vZGVsLmdldFdpZGdldCgpID09IG51bGwpIHsKKwkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlib29sZWFuIHJjID0gQ29udHJpYnV0aW9uc0FuYWx5emVyLmlzVmlzaWJsZSgKKwkJCQkJCQkJCQljb250cmlidXRpb24sIGVDb250ZXh0KTsKKwkJCQkJCQkJZm9yIChNVHJpbUVsZW1lbnQgY2hpbGQgOiB0b1JlbW92ZSkgeworCQkJCQkJCQkJY2hpbGQuc2V0VG9CZVJlbmRlcmVkKHJjKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJfQorCQkJCQl0cmltTW9kZWwuZ2V0UGVuZGluZ0NsZWFudXAoKS5hZGRBbGwodG9SZW1vdmUpOworCQkJCX0KKwkJCX0KKwkJCS8vIFdlJ3JlIGRvbmUgaWYgdGhlIHJldHJ5TGlzdCBpcyBub3cgZW1wdHkgKGV2ZXJ5dGhpbmcgZG9uZSkgb3IKKwkJCS8vIGlmIHRoZSBsaXN0IGhhc24ndCBjaGFuZ2VkIGF0IGFsbCAobm8gaG9wZSkKKwkJCWRvbmUgPSAodG9Db250cmlidXRlLnNpemUoKSA9PSAwKQorCQkJCQl8fCAodG9Db250cmlidXRlLnNpemUoKSA9PSByZXRyeUNvdW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICB0aGUgdHJpbUJhciB0byBiZSBjbGVhbmVkIHVwCisJICovCisJcHJvdGVjdGVkIHZvaWQgY2xlYW5VcChNVHJpbUJhciBlbGVtZW50KSB7CisJCWZvciAoTVRyaW1FbGVtZW50IGNoaWxkIDogZWxlbWVudC5nZXRQZW5kaW5nQ2xlYW51cCgpKSB7CisJCQllbGVtZW50LmdldENoaWxkcmVuKCkucmVtb3ZlKGNoaWxkKTsKKwkJfQorCQllbGVtZW50LmdldFBlbmRpbmdDbGVhbnVwKCkuY2xlYXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9UcmltVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVHJpbVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTNmM2YxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVHJpbVV0aWwuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlJvd0xheW91dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUcmltVXRpbCB7CisJcHVibGljIHN0YXRpYyBDb21wb3NpdGUgd3JhcFRyaW0oQ29udHJvbCB0cmltKSB7CisJCWludCBvcmllbnRhdGlvbiA9IFNXVC5IT1JJWk9OVEFMOworCQlpZiAodHJpbSBpbnN0YW5jZW9mIFRvb2xCYXIpCisJCQlvcmllbnRhdGlvbiA9ICgoKFRvb2xCYXIpIHRyaW0pLmdldFN0eWxlKCkgJiBTV1QuVkVSVElDQUwpID09IDAgPyBTV1QuSE9SSVpPTlRBTAorCQkJCQk6IFNXVC5WRVJUSUNBTDsKKworCQlDb21wb3NpdGUgcGFyZW50Q29tcCA9IHRyaW0uZ2V0UGFyZW50KCk7CisJCUNvbXBvc2l0ZSB3cmFwcGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnRDb21wLCBTV1QuTk9ORSk7CisJCVJvd0xheW91dCBsYXlvdXQgPSBSb3dMYXlvdXRGYWN0b3J5LmZpbGxEZWZhdWx0cygpLndyYXAoZmFsc2UpCisJCQkJLnNwYWNpbmcoMCkudHlwZShvcmllbnRhdGlvbikuY3JlYXRlKCk7CisJCWxheW91dC5tYXJnaW5MZWZ0ID0gMzsKKwkJbGF5b3V0LmNlbnRlciA9IHRydWU7CisJCXdyYXBwZXIuc2V0TGF5b3V0KGxheW91dCk7CisKKwkJLy8gU2VwYXJhdG9yIChha2EgJ2RyYWcgaGFuZGxlJykKKwkJVG9vbEJhciBzZXBhcmF0b3JUb29sQmFyID0gbmV3IFRvb2xCYXIod3JhcHBlciwgb3JpZW50YXRpb24gfCBTV1QuV1JBUAorCQkJCXwgU1dULkZMQVQgfCBTV1QuUklHSFQpOworCQluZXcgVG9vbEl0ZW0oc2VwYXJhdG9yVG9vbEJhciwgU1dULlNFUEFSQVRPUik7CisKKwkJLy8gUHV0IHRoZSB0cmltIHVuZGVyIHRoZSB3cmFwcGVyIGFuZCBlbnN1cmUgaXQncyBsYXN0CisJCXRyaW0uc2V0UGFyZW50KHdyYXBwZXIpOworCQl0cmltLm1vdmVCZWxvdyhudWxsKTsKKworCQlyZXR1cm4gd3JhcHBlcjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbnRyb2wgZ2V0UmVhbENvbnRyb2woQ29tcG9zaXRlIHdyYXBwZXIpIHsKKwkJQ29udHJvbFtdIGtpZHMgPSB3cmFwcGVyLmdldENoaWxkcmVuKCk7CisJCWlmIChraWRzLmxlbmd0aCA9PSAyKQorCQkJcmV0dXJuIGtpZHNbMV07CisKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvVHJpbW1lZFBhcnRMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1RyaW1tZWRQYXJ0TGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1RyaW1tZWRQYXJ0TGF5b3V0LmphdmEKQEAgLTAsMCArMSwzMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKKworLyoqCisgKiBUaGlzIGFycmFuZ2VzIGl0cyBjb250cm9scyBpbnRvIDUgJ3Nsb3RzJyBkZWZpbmVkIGJ5IGl0cyBjb21wb3NpdGUgY2hpbGRyZW4KKyAqIDxvbD4KKyAqIDxsaT5Ub3A6IHNwYW5zIHRoZSBlbnRpcmUgd2lkdGggYW5kIGFidXRzIHRoZSB0b3Agb2YgdGhlIGNvbnRhaW5lcjwvbGk+CisgKiA8bGk+Qm90dG9tOiBzcGFucyB0aGUgZW50aXJlIHdpZHRoIGFuZCBhYnV0cyB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXI8L2xpPgorICogPGxpPkxlZnQ6IHNwYW5zIHRoZSBzcGFjZSBiZXR3ZWVuICd0b3AnIGFuZCAnYm90dG9tJyBhbmQgYWJ1dHMgdGhlIGxlZnQgb2YKKyAqIHRoZSBjb250YWluZXI8L2xpPgorICogPGxpPlJpZ2h0OiBzcGFucyB0aGUgc3BhY2UgYmV0d2VlbiAndG9wJyBhbmQgJ2JvdHRvbScgYW5kIGFidXRzIHRoZSByaWdodCBvZgorICogdGhlIGNvbnRhaW5lcjwvbGk+CisgKiA8bGk+Q2VudGVyOiBmaWxscyB0aGUgYXJlYSByZW1haW5pbmcgb25jZSB0aGUgb3RoZXIgY29udHJvbHMgaGF2ZSBiZWVuCisgKiBwb3NpdGlvbmVkPC9saT4KKyAqIDwvb2w+CisgKgorICogPHN0cm9uZz5OT1RFOjwvc3Ryb25nPiA8aT5BbGw8L2k+IHRoZSBjaGlsZCBjb250cm9scyBtdXN0IGV4aXN0LiBBbHNvLAorICogY29tcHV0ZVNpemUgaXMgbm90IGltcGxlbWVudGVkIGJlY2F1c2Ugd2UgZXhwZWN0IHRoaXMgdG8gYmUgdXNlZCBpbgorICogc2l0dWF0aW9ucyAoaS5lLiBzaGVsbHMpIHdoZXJlIHRoZSBvdXRlciBib3VuZHMgYXJlIGFsd2F5cyAnc2V0Jywgbm90CisgKiBjb21wdXRlZC4gQWxzbywgdGhlIGludGVyaW9yIHN0cnVjdHVyZSBvZiB0aGUgY2VudGVyIG1heSBjb250YWluIG92ZXJsYXBwaW5nCisgKiBjb250cm9scyBzbyBpdCBtYXkgbm90IGJlIGNhcGFibGUgb2YgcGVyZm9ybWluZyB0aGUgY2FsY3VsYXRpb24uCisgKgorICogQGF1dGhvciBlbW9mZmF0dAorICoKKyAqLworcHVibGljIGNsYXNzIFRyaW1tZWRQYXJ0TGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKKworCS8qKgorCSAqCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkvKioKKwkgKiBndXR0ZXJCb3R0b20gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9mIHZlcnRpY2FsIG1hcmdpbiB0aGF0IHdpbGwKKwkgKiBiZSBwbGFjZWQgYmV0d2VlbiB0aGUgYm90dG9tIHRyaW0gY29tcG9uZW50IGFuZCB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlCisJICogY2xpZW50IGFyZWEuIElmIHRoZXJlIGlzIG5vIGJvdHRvbSB0cmltIGNvbXBvbmVudCwgdGhlIGd1dHRlciBzZXJ2ZXMgYXMgYQorCSAqIG1hcmdpbi4KKwkgKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisJICovCisJcHVibGljIGludCBndXR0ZXJCb3R0b20gPSAwOworCisJLyoqCisJICogZ3V0dGVyTGVmdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgb2YgaG9yaXpvbnRhbCBtYXJnaW4gdGhhdCB3aWxsCisJICogYmUgcGxhY2VkIGJldHdlZW4gdGhlIGxlZnQgdHJpbSBjb21wb25lbnQgYW5kIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNsaWVudAorCSAqIGFyZWEuIElmIHRoZXJlIGlzIG5vIGxlZnQgdHJpbSBjb21wb25lbnQsIHRoZSBndXR0ZXIgc2VydmVzIGFzIGEgbWFyZ2luLgorCSAqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKwkgKi8KKwlwdWJsaWMgaW50IGd1dHRlckxlZnQgPSAwOworCisJLyoqCisJICogZ3V0dGVyVG9wIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBvZiB2ZXJ0aWNhbCBtYXJnaW4gdGhhdCB3aWxsIGJlCisJICogcGxhY2VkIGJldHdlZW4gdGhlIHRvcCB0cmltIGNvbXBvbmVudCBhbmQgdGhlIHRvcCBlZGdlIG9mIHRoZSBjbGllbnQKKwkgKiBhcmVhLiBJZiB0aGVyZSBpcyBubyB0b3AgdHJpbSBjb21wb25lbnQsIHRoZSBndXR0ZXIgc2VydmVzIGFzIGEgbWFyZ2luLgorCSAqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKwkgKi8KKwlwdWJsaWMgaW50IGd1dHRlclRvcCA9IDA7CisKKwkvKioKKwkgKiBndXR0ZXJSaWdodCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgb2YgaG9yaXpvbnRhbCBtYXJnaW4gdGhhdCB3aWxsCisJICogYmUgcGxhY2VkIGJldHdlZW4gdGhlIHJpZ2h0IHRyaW0gY29tcG9uZW50IGFuZCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUKKwkgKiBjbGllbnQgYXJlYS4gSWYgdGhlcmUgaXMgbm8gcmlnaHQgdHJpbSBjb21wb25lbnQsIHRoZSBndXR0ZXIgc2VydmVzIGFzIGEKKwkgKiBtYXJnaW4uCisJICoKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorCSAqLworCXB1YmxpYyBpbnQgZ3V0dGVyUmlnaHQgPSAwOworCisJcHVibGljIENvbXBvc2l0ZSB0b3A7CisJcHVibGljIENvbXBvc2l0ZSBib3R0b207CisJcHVibGljIENvbXBvc2l0ZSBsZWZ0OworCXB1YmxpYyBDb21wb3NpdGUgcmlnaHQ7CisJcHVibGljIENvbXBvc2l0ZSBjbGllbnRBcmVhOworCisJLyoqCisJICogVGhpcyBsYXlvdXQgaXMgdXNlZCB0byBzdXBwb3J0IHBhcnRzIHRoYXQgd2FudCB0cmltIGZvciB0aGVpciBjb250YWluaW5nCisJICogY29tcG9zaXRlcy4KKwkgKgorCSAqIEBwYXJhbSB0cmltT3duZXIKKwkgKi8KKwlwdWJsaWMgVHJpbW1lZFBhcnRMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgeworCQljbGllbnRBcmVhID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJY2xpZW50QXJlYS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LAorCQkJYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCS8vIFdlIGNhbid0IGFjdHVhbGx5IGNvbXB1dGUgYSBzaXplIHNvIHJldHVybiBhIGRlZmF1bHQKKwkJcmV0dXJuIG5ldyBQb2ludChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJUmVjdGFuZ2xlIGNhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKKwkJUmVjdGFuZ2xlIGNhUmVjdCA9IG5ldyBSZWN0YW5nbGUoY2EueCwgY2EueSwgY2Eud2lkdGgsIGNhLmhlaWdodCk7CisKKwkJLy8gJ1RvcCcgc3BhbnMgdGhlIGVudGlyZSBhcmVhCisJCWlmICh0b3AgIT0gbnVsbCAmJiB0b3AuaXNWaXNpYmxlKCkpIHsKKwkJCVBvaW50IHRvcFNpemUgPSB0b3AuY29tcHV0ZVNpemUoY2FSZWN0LndpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7CisJCQljYVJlY3QueSArPSB0b3BTaXplLnk7CisJCQljYVJlY3QuaGVpZ2h0IC09IHRvcFNpemUueTsKKworCQkJLy8gRG9uJ3QgbGF5b3V0IHVubGVzcyB3ZSd2ZSBjaGFuZ2VkCisJCQlSZWN0YW5nbGUgbmV3Qm91bmRzID0gbmV3IFJlY3RhbmdsZShjYS54LCBjYS55LCBjYVJlY3Qud2lkdGgsCisJCQkJCXRvcFNpemUueSk7CisJCQlpZiAoIW5ld0JvdW5kcy5lcXVhbHModG9wLmdldEJvdW5kcygpKSkgeworCQkJCXRvcC5zZXRCb3VuZHMobmV3Qm91bmRzKTsKKwkJCX0KKwkJfQorCQkvLyBJbmNsdWRlIHRoZSBndXR0ZXIgd2hldGhlciB0aGVyZSBpcyBhIHRvcCBhcmVhIG9yIG5vdC4KKwkJY2FSZWN0LnkgKz0gZ3V0dGVyVG9wOworCQljYVJlY3QuaGVpZ2h0IC09IGd1dHRlclRvcDsKKworCQkvLyAnQm90dG9tJyBzcGFucyB0aGUgZW50aXJlIGFyZWEKKwkJaWYgKGJvdHRvbSAhPSBudWxsICYmIGJvdHRvbS5pc1Zpc2libGUoKSkgeworCQkJUG9pbnQgYm90dG9tU2l6ZSA9IGJvdHRvbS5jb21wdXRlU2l6ZShjYVJlY3Qud2lkdGgsIFNXVC5ERUZBVUxULAorCQkJCQl0cnVlKTsKKwkJCWNhUmVjdC5oZWlnaHQgLT0gYm90dG9tU2l6ZS55OworCisJCQkvLyBEb24ndCBsYXlvdXQgdW5sZXNzIHdlJ3ZlIGNoYW5nZWQKKwkJCVJlY3RhbmdsZSBuZXdCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKGNhUmVjdC54LCBjYVJlY3QueQorCQkJCQkrIGNhUmVjdC5oZWlnaHQsIGNhUmVjdC53aWR0aCwgYm90dG9tU2l6ZS55KTsKKwkJCWlmICghbmV3Qm91bmRzLmVxdWFscyhib3R0b20uZ2V0Qm91bmRzKCkpKSB7CisJCQkJYm90dG9tLnNldEJvdW5kcyhuZXdCb3VuZHMpOworCQkJfQorCQl9CisJCWNhUmVjdC5oZWlnaHQgLT0gZ3V0dGVyQm90dG9tOworCisJCS8vICdMZWZ0JyBzcGFucyBiZXR3ZWVuICd0b3AnIGFuZCAnYm90dG9tJworCQlpZiAobGVmdCAhPSBudWxsICYmIGxlZnQuaXNWaXNpYmxlKCkpIHsKKwkJCVBvaW50IGxlZnRTaXplID0gbGVmdC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgY2FSZWN0LmhlaWdodCwgdHJ1ZSk7CisJCQljYVJlY3QueCArPSBsZWZ0U2l6ZS54OworCQkJY2FSZWN0LndpZHRoIC09IGxlZnRTaXplLng7CisKKwkJCS8vIERvbid0IGxheW91dCB1bmxlc3Mgd2UndmUgY2hhbmdlZAorCQkJUmVjdGFuZ2xlIG5ld0JvdW5kcyA9IG5ldyBSZWN0YW5nbGUoY2FSZWN0LnggLSBsZWZ0U2l6ZS54LAorCQkJCQljYVJlY3QueSwgbGVmdFNpemUueCwgY2FSZWN0LmhlaWdodCk7CisJCQlpZiAoIW5ld0JvdW5kcy5lcXVhbHMobGVmdC5nZXRCb3VuZHMoKSkpIHsKKwkJCQlsZWZ0LnNldEJvdW5kcyhuZXdCb3VuZHMpOworCQkJfQorCQl9CisJCWNhUmVjdC54ICs9IGd1dHRlckxlZnQ7CisJCWNhUmVjdC53aWR0aCAtPSBndXR0ZXJMZWZ0OworCisJCS8vICdSaWdodCcgc3BhbnMgYmV0d2VlbiAndG9wJyBhbmQgJ2JvdHRvbScKKwkJaWYgKHJpZ2h0ICE9IG51bGwgJiYgcmlnaHQuaXNWaXNpYmxlKCkpIHsKKwkJCVBvaW50IHJpZ2h0U2l6ZSA9IHJpZ2h0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBjYVJlY3QuaGVpZ2h0LAorCQkJCQl0cnVlKTsKKwkJCWNhUmVjdC53aWR0aCAtPSByaWdodFNpemUueDsKKworCQkJLy8gRG9uJ3QgbGF5b3V0IHVubGVzcyB3ZSd2ZSBjaGFuZ2VkCisJCQlSZWN0YW5nbGUgbmV3Qm91bmRzID0gbmV3IFJlY3RhbmdsZShjYVJlY3QueCArIGNhUmVjdC53aWR0aCwKKwkJCQkJY2FSZWN0LnksIHJpZ2h0U2l6ZS54LCBjYVJlY3QuaGVpZ2h0KTsKKwkJCWlmICghbmV3Qm91bmRzLmVxdWFscyhyaWdodC5nZXRCb3VuZHMoKSkpIHsKKwkJCQlyaWdodC5zZXRCb3VuZHMobmV3Qm91bmRzKTsKKwkJCX0KKwkJfQorCQljYVJlY3Qud2lkdGggLT0gZ3V0dGVyUmlnaHQ7CisKKwkJLy8gRG9uJ3QgbGF5b3V0IHVubGVzcyB3ZSd2ZSBjaGFuZ2VkCisJCWlmICghY2FSZWN0LmVxdWFscyhjbGllbnRBcmVhLmdldEJvdW5kcygpKSkgeworCQkJY2xpZW50QXJlYS5zZXRCb3VuZHMoY2FSZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b3AyCisJICogQHBhcmFtIGIKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIENvbXBvc2l0ZSBnZXRUcmltQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzaWRlKSB7CisJCWlmIChzaWRlID09IFNXVC5UT1ApIHsKKwkJCWlmICh0b3AgPT0gbnVsbCkgeworCQkJCXRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCQkJdG9wLnNldExheW91dChuZXcgVHJpbUJhckxheW91dCh0cnVlKSk7CisJCQkJdG9wLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJCQkvKioKKwkJCQkJICoKKwkJCQkJICovCisJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCQkJdG9wID0gbnVsbDsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQkJcmV0dXJuIHRvcDsKKwkJfSBlbHNlIGlmIChzaWRlID09IFNXVC5CT1RUT00pIHsKKwkJCWlmIChib3R0b20gPT0gbnVsbCkgeworCQkJCWJvdHRvbSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCQkJYm90dG9tLnNldExheW91dChuZXcgVHJpbUJhckxheW91dCh0cnVlKSk7CisJCQkJYm90dG9tLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJCQkvKioKKwkJCQkJICoKKwkJCQkJICovCisJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCQkJYm90dG9tID0gbnVsbDsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQkJcmV0dXJuIGJvdHRvbTsKKwkJfSBlbHNlIGlmIChzaWRlID09IFNXVC5MRUZUKSB7CisJCQlpZiAobGVmdCA9PSBudWxsKSB7CisJCQkJbGVmdCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCQkJbGVmdC5zZXRMYXlvdXQobmV3IFRyaW1CYXJMYXlvdXQoZmFsc2UpKTsKKwkJCQlsZWZ0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJCQkvKioKKwkJCQkJICoKKwkJCQkJICovCisJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCQkJbGVmdCA9IG51bGw7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJCXJldHVybiBsZWZ0OworCQl9IGVsc2UgaWYgKHNpZGUgPT0gU1dULlJJR0hUKSB7CisJCQlpZiAocmlnaHQgPT0gbnVsbCkgeworCQkJCXJpZ2h0ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCQlyaWdodC5zZXRMYXlvdXQobmV3IFRyaW1CYXJMYXlvdXQoZmFsc2UpKTsKKwkJCQlyaWdodC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkJLyoqCisJCQkJCSAqCisJCQkJCSAqLworCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJCXJpZ2h0ID0gbnVsbDsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQkJcmV0dXJuIHJpZ2h0OworCQl9CisKKwkJLy8gVW5rbm93biBsb2NhdGlvbgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgUmVjdGFuZ2xlIGdldFRyaW1SZWN0KGludCBzaWRlKSB7CisJCVJlY3RhbmdsZSBjYUJvdW5kcyA9IGNsaWVudEFyZWEuZ2V0Qm91bmRzKCk7CisJCWNhQm91bmRzID0gRGlzcGxheS5nZXRDdXJyZW50KCkubWFwKGNsaWVudEFyZWEuZ2V0UGFyZW50KCksIG51bGwsCisJCQkJY2FCb3VuZHMpOworCisJCWlmIChzaWRlID09IFNXVC5UT1ApIHsKKwkJCWlmICh0b3AgIT0gbnVsbCkgeworCQkJCVJlY3RhbmdsZSBiID0gdG9wLmdldEJvdW5kcygpOworCQkJCWIgPSB0b3AuZ2V0RGlzcGxheSgpLm1hcCh0b3AuZ2V0UGFyZW50KCksIG51bGwsIGIpOworCQkJCXJldHVybiBiOworCQkJfQorCisJCQkvLyBGYWtlIG9uZQorCQkJY2FCb3VuZHMuaGVpZ2h0ID0gMjU7CisJCQlyZXR1cm4gY2FCb3VuZHM7CisJCX0KKwkJaWYgKHNpZGUgPT0gU1dULkJPVFRPTSkgeworCQkJaWYgKGJvdHRvbSAhPSBudWxsKSB7CisJCQkJUmVjdGFuZ2xlIGIgPSBib3R0b20uZ2V0Qm91bmRzKCk7CisJCQkJYiA9IGJvdHRvbS5nZXREaXNwbGF5KCkubWFwKGJvdHRvbS5nZXRQYXJlbnQoKSwgbnVsbCwgYik7CisJCQkJcmV0dXJuIGI7CisJCQl9CisKKwkJCS8vIEZha2Ugb25lCisJCQljYUJvdW5kcy55ID0gKGNhQm91bmRzLnkgKyBjYUJvdW5kcy5oZWlnaHQpIC0gMjU7CisJCQljYUJvdW5kcy5oZWlnaHQgPSAyNTsKKwkJCXJldHVybiBjYUJvdW5kczsKKwkJfQorCQlpZiAoc2lkZSA9PSBTV1QuTEVGVCkgeworCQkJaWYgKGxlZnQgIT0gbnVsbCAmJiBsZWZ0LmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgeworCQkJCVJlY3RhbmdsZSBiID0gbGVmdC5nZXRCb3VuZHMoKTsKKwkJCQliID0gbGVmdC5nZXREaXNwbGF5KCkubWFwKGxlZnQuZ2V0UGFyZW50KCksIG51bGwsIGIpOworCQkJCXJldHVybiBiOworCQkJfQorCisJCQkvLyBGYWtlIG9uZQorCQkJY2FCb3VuZHMud2lkdGggPSAyNTsKKwkJCXJldHVybiBjYUJvdW5kczsKKwkJfQorCQlpZiAoc2lkZSA9PSBTV1QuUklHSFQpIHsKKwkJCWlmIChyaWdodCAhPSBudWxsICYmIHJpZ2h0LmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgeworCQkJCVJlY3RhbmdsZSBiID0gcmlnaHQuZ2V0Qm91bmRzKCk7CisJCQkJYiA9IHJpZ2h0LmdldERpc3BsYXkoKS5tYXAocmlnaHQuZ2V0UGFyZW50KCksIG51bGwsIGIpOworCQkJCXJldHVybiBiOworCQkJfQorCisJCQkvLyBGYWtlIG9uZQorCQkJY2FCb3VuZHMueCA9IChjYUJvdW5kcy54ICsgY2FCb3VuZHMud2lkdGgpIC0gMjU7CisJCQljYUJvdW5kcy53aWR0aCA9IDI1OworCQkJcmV0dXJuIGNhQm91bmRzOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1dCV1JlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9XQldSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODBhODgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9XQldSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsODk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDI5NzI4LCA0NDExNTAsIDQ0NDQxMAorICogICAgIFNpbW9uIFNjaG9seiA8TGFycy5Wb2dlbEB2b2dlbGxhLmNvbT4gLSBCdWcgNDI5NzI5CisgKiAgICAgTWlrZSBMZW5ld2VpdCA8bWlrZS1sZUB3ZWIuZGU+IC0gQnVnIDQ0NDQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5VSUV2ZW50VG9waWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkU0V29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5QYXJ0U2VydmljZVNhdmVIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LlNXVFJlbmRlcmVyc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQ1NTQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltbWVkV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVNlcnZpY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVN0eWxpbmdFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklTYXZlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSVdpbmRvd0Nsb3NlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuSVNoZWxsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CisKKy8qKgorICogRGVmYXVsdCBTV1QgcmVuZGVyZXIgcmVzcG9uc2libGUgZm9yIGFuIGluc3RhbmNlIG9mIE1XaW5kb3cuIFNlZQorICoge0BsaW5rIFdvcmtiZW5jaFJlbmRlcmVyRmFjdG9yeX0KKyAqLworcHVibGljIGNsYXNzIFdCV1JlbmRlcmVyIGV4dGVuZHMgU1dUUGFydFJlbmRlcmVyIHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBTaGVsbE1pbmltaXplZFRhZyA9ICJzaGVsbE1pbmltaXplZCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU2hlbGxNYXhpbWl6ZWRUYWcgPSAic2hlbGxNYXhpbWl6ZWQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIGNsYXNzIFdpbmRvd1NpemVVcGRhdGVKb2IgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCXB1YmxpYyBMaXN0PE1XaW5kb3c+IHdpbmRvd3NUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8TVdpbmRvdz4oKTsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJYm91bmRzSm9iID0gbnVsbDsKKwkJCXdoaWxlICghd2luZG93c1RvVXBkYXRlLmlzRW1wdHkoKSkgeworCQkJCU1XaW5kb3cgd2luZG93ID0gd2luZG93c1RvVXBkYXRlLnJlbW92ZSgwKTsKKwkJCQlTaGVsbCBzaGVsbCA9IChTaGVsbCkgd2luZG93LmdldFdpZGdldCgpOworCQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkKKwkJCQkJY29udGludWU7CisJCQkJc2hlbGwuc2V0Qm91bmRzKHdpbmRvdy5nZXRYKCksIHdpbmRvdy5nZXRZKCksCisJCQkJCQl3aW5kb3cuZ2V0V2lkdGgoKSwgd2luZG93LmdldEhlaWdodCgpKTsKKwkJCX0KKwkJfQorCX0KKworCVdpbmRvd1NpemVVcGRhdGVKb2IgYm91bmRzSm9iOworCisJYm9vbGVhbiBpZ25vcmVTaXplQ2hhbmdlcyA9IGZhbHNlOworCisJQEluamVjdAorCUxvZ2dlciBsb2dnZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCUBJbmplY3QKKwlwcml2YXRlIElQcmVzZW50YXRpb25FbmdpbmUgZW5naW5lOworCisJLy8gcHJpdmF0ZSBUaGVtZURlZmluaXRpb25DaGFuZ2VkSGFuZGxlciB0aGVtZURlZmluaXRpb25DaGFuZ2VkOworCisJQEluamVjdAorCXByaXZhdGUgRU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2U7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljU2VsZWN0ZWRFbGVtZW50Q2hhbmdlZCgKKwkJCUBVSUV2ZW50VG9waWMoVUlFdmVudHMuRWxlbWVudENvbnRhaW5lci5UT1BJQ19TRUxFQ1RFREVMRU1FTlQpIEV2ZW50IGV2ZW50KSB7CisJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTUFwcGxpY2F0aW9uCisJCWlmICghKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbikpCisJCQlyZXR1cm47CisJCU1XaW5kb3cgd2luID0gKE1XaW5kb3cpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQlpZiAoKHdpbiA9PSBudWxsKSB8fCAhd2luLmdldFRhZ3MoKS5jb250YWlucygidG9wTGV2ZWwiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl3aW4uc2V0VG9CZVJlbmRlcmVkKHRydWUpOworCQlpZiAoISh3aW4uZ2V0UmVuZGVyZXIoKSA9PSBXQldSZW5kZXJlci50aGlzKSkKKwkJCXJldHVybjsKKwkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIHdpbi5nZXRXaWRnZXQoKTsKKwkJaWYgKHNoZWxsLmdldE1pbmltaXplZCgpKSB7CisJCQlzaGVsbC5zZXRNaW5pbWl6ZWQoZmFsc2UpOworCQl9CisJCXNoZWxsLnNldEFjdGl2ZSgpOworCQlzaGVsbC5tb3ZlQWJvdmUobnVsbCk7CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY0xhYmVsQ2hhbmdlZChAVUlFdmVudFRvcGljKFVJRXZlbnRzLlVJTGFiZWwuVE9QSUNfQUxMKSBFdmVudCBldmVudCkgeworCQlPYmplY3Qgb2JqRWxlbWVudCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJaWYgKCEoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpIGluc3RhbmNlb2YgTVdpbmRvdykpCisJCQlyZXR1cm47CisKKwkJLy8gSXMgdGhpcyBsaXN0ZW5lciBpbnRlcmVzdGVkID8KKwkJTVdpbmRvdyB3aW5kb3dNb2RlbCA9IChNV2luZG93KSBvYmpFbGVtZW50OworCQlpZiAod2luZG93TW9kZWwuZ2V0UmVuZGVyZXIoKSAhPSBXQldSZW5kZXJlci50aGlzKQorCQkJcmV0dXJuOworCisJCS8vIE5vIHdpZGdldCA9PSBub3RoaW5nIHRvIHVwZGF0ZQorCQlTaGVsbCB0aGVTaGVsbCA9IChTaGVsbCkgd2luZG93TW9kZWwuZ2V0V2lkZ2V0KCk7CisJCWlmICh0aGVTaGVsbCA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkFUVE5BTUUpOworCisJCWlmIChVSUV2ZW50cy5VSUxhYmVsLkxBQkVMLmVxdWFscyhhdHROYW1lKSB8fCBVSUV2ZW50cy5VSUxhYmVsLkxPQ0FMSVpFRF9MQUJFTC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCVN0cmluZyBuZXdUaXRsZSA9IChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQkJdGhlU2hlbGwuc2V0VGV4dChuZXdUaXRsZSk7CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuVUlMYWJlbC5JQ09OVVJJLmVxdWFscyhhdHROYW1lKSkgeworCQkJdGhlU2hlbGwuc2V0SW1hZ2UoZ2V0SW1hZ2Uod2luZG93TW9kZWwpKTsKKwkJfSBlbHNlIGlmIChVSUV2ZW50cy5VSUxhYmVsLlRPT0xUSVAuZXF1YWxzKGF0dE5hbWUpIHx8IFVJRXZlbnRzLlVJTGFiZWwuTE9DQUxJWkVEX1RPT0xUSVAuZXF1YWxzKGF0dE5hbWUpKSB7CisJCQlTdHJpbmcgbmV3VFRpcCA9IChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQkJdGhlU2hlbGwuc2V0VG9vbFRpcFRleHQobmV3VFRpcCk7CisJCX0KKwl9CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVRvcGljV2luZG93Q2hhbmdlZChAVUlFdmVudFRvcGljKFVJRXZlbnRzLldpbmRvdy5UT1BJQ19BTEwpIEV2ZW50IGV2ZW50KSB7CisJCWlmIChpZ25vcmVTaXplQ2hhbmdlcykKKwkJCXJldHVybjsKKworCQkvLyBFbnN1cmUgdGhhdCB0aGlzIGV2ZW50IGlzIGZvciBhIE1NZW51SXRlbQorCQlPYmplY3Qgb2JqRWxlbWVudCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJaWYgKCEob2JqRWxlbWVudCBpbnN0YW5jZW9mIE1XaW5kb3cpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBJcyB0aGlzIGxpc3RlbmVyIGludGVyZXN0ZWQgPworCQlNV2luZG93IHdpbmRvd01vZGVsID0gKE1XaW5kb3cpIG9iakVsZW1lbnQ7CisJCWlmICh3aW5kb3dNb2RlbC5nZXRSZW5kZXJlcigpICE9IFdCV1JlbmRlcmVyLnRoaXMpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIE5vIHdpZGdldCA9PSBub3RoaW5nIHRvIHVwZGF0ZQorCQlTaGVsbCB0aGVTaGVsbCA9IChTaGVsbCkgd2luZG93TW9kZWwuZ2V0V2lkZ2V0KCk7CisJCWlmICh0aGVTaGVsbCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5BVFROQU1FKTsKKworCQlpZiAoVUlFdmVudHMuV2luZG93LlguZXF1YWxzKGF0dE5hbWUpIHx8IFVJRXZlbnRzLldpbmRvdy5ZLmVxdWFscyhhdHROYW1lKQorCQkJCXx8IFVJRXZlbnRzLldpbmRvdy5XSURUSC5lcXVhbHMoYXR0TmFtZSkgfHwgVUlFdmVudHMuV2luZG93LkhFSUdIVC5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCWlmIChib3VuZHNKb2IgPT0gbnVsbCkgeworCQkJCWJvdW5kc0pvYiA9IG5ldyBXaW5kb3dTaXplVXBkYXRlSm9iKCk7CisJCQkJYm91bmRzSm9iLndpbmRvd3NUb1VwZGF0ZS5hZGQod2luZG93TW9kZWwpOworCQkJCXRoZVNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoYm91bmRzSm9iKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFib3VuZHNKb2Iud2luZG93c1RvVXBkYXRlLmNvbnRhaW5zKHdpbmRvd01vZGVsKSkKKwkJCQkJYm91bmRzSm9iLndpbmRvd3NUb1VwZGF0ZS5hZGQod2luZG93TW9kZWwpOworCQkJfQorCQl9CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUb3BpY1Zpc2libGVDaGFuZ2VkKEBVSUV2ZW50VG9waWMoVUlFdmVudHMuVUlFbGVtZW50LlRPUElDX1ZJU0lCTEUpIEV2ZW50IGV2ZW50KSB7CisJCS8vIEVuc3VyZSB0aGF0IHRoaXMgZXZlbnQgaXMgZm9yIGEgTU1lbnVJdGVtCisJCU9iamVjdCBvYmpFbGVtZW50ID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAoIShvYmpFbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvdykpCisJCQlyZXR1cm47CisKKwkJLy8gSXMgdGhpcyBsaXN0ZW5lciBpbnRlcmVzdGVkID8KKwkJTVdpbmRvdyB3aW5kb3dNb2RlbCA9IChNV2luZG93KSBvYmpFbGVtZW50OworCQlpZiAod2luZG93TW9kZWwuZ2V0UmVuZGVyZXIoKSAhPSBXQldSZW5kZXJlci50aGlzKQorCQkJcmV0dXJuOworCisJCS8vIE5vIHdpZGdldCA9PSBub3RoaW5nIHRvIHVwZGF0ZQorCQlTaGVsbCB0aGVTaGVsbCA9IChTaGVsbCkgd2luZG93TW9kZWwuZ2V0V2lkZ2V0KCk7CisJCWlmICh0aGVTaGVsbCA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkFUVE5BTUUpOworCisJCWlmIChVSUV2ZW50cy5VSUVsZW1lbnQuVklTSUJMRS5lcXVhbHMoYXR0TmFtZSkpIHsKKwkJCWJvb2xlYW4gaXNWaXNpYmxlID0gKEJvb2xlYW4pIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQkJdGhlU2hlbGwuc2V0VmlzaWJsZShpc1Zpc2libGUpOworCQl9CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUaGVtZURlZmluaXRpb25DaGFuZ2VkKAorCQkJQFVJRXZlbnRUb3BpYyhVSUV2ZW50cy5VSUxpZmVDeWNsZS5USEVNRV9ERUZJTklUSU9OX0NIQU5HRUQpIEV2ZW50IGV2ZW50KSB7CisJCS8vIHRoZW1lRGVmaW5pdGlvbkNoYW5nZWQuaGFuZGxlRXZlbnQoZXZlbnQpOworCX0KKworCS8qKgorCSAqIENsb3NlcyB0aGUgcHJvdmlkZWQgZGV0YWNoZWQgd2luZG93LgorCSAqCisJICogQHBhcmFtIHdpbmRvdworCSAqICAgICAgICAgICAgdGhlIGRldGFjaGVkIHdpbmRvdyB0byBjbG9zZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHdpbmRvdyBzaG91bGQgYmUgY2xvc2VkLAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBjbG9zZURldGFjaGVkV2luZG93KE1XaW5kb3cgd2luZG93KSB7CisJCUVQYXJ0U2VydmljZSBwYXJ0U2VydmljZSA9IHdpbmRvdy5nZXRDb250ZXh0KCkuZ2V0KEVQYXJ0U2VydmljZS5jbGFzcyk7CisJCUxpc3Q8TVBhcnQ+IHBhcnRzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW5kb3csIG51bGwsCisJCQkJTVBhcnQuY2xhc3MsIG51bGwpOworCQkvLyB0aGlzIHNhdmVzIG9uZSBwYXJ0IGF0IGEgdGltZSwgbm90IGlkZWFsIGJ1dCBiZXR0ZXIgdGhhbiBub3Qgc2F2aW5nCisJCS8vIGF0IGFsbAorCQlmb3IgKE1QYXJ0IHBhcnQgOiBwYXJ0cykgeworCQkJaWYgKCFwYXJ0U2VydmljZS5zYXZlUGFydChwYXJ0LCB0cnVlKSkgeworCQkJCS8vIHVzZXIgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24sIHJldHVybiBmYWxzZQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCS8vIGhpZGUgZXZlcnkgcGFydCBpbmRpdmlkdWFsbHksIGZvbGxvd2luZyAzLnggYmVoYXZpb3VyCisJCWZvciAoTVBhcnQgcGFydCA6IHBhcnRzKSB7CisJCQlwYXJ0U2VydmljZS5oaWRlUGFydChwYXJ0KTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAUG9zdENvbnN0cnVjdAorCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7CisJCS8vIHRoZW1lRGVmaW5pdGlvbkNoYW5nZWQgPSBuZXcgVGhlbWVEZWZpbml0aW9uQ2hhbmdlZEhhbmRsZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZVdpZGdldChNVUlFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJZmluYWwgV2lkZ2V0IG5ld1dpZGdldDsKKworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvdykKKwkJCQl8fCAocGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBDb250cm9sKSkpCisJCQlyZXR1cm4gbnVsbDsKKworCQlNV2luZG93IHdid01vZGVsID0gKE1XaW5kb3cpIGVsZW1lbnQ7CisKKwkJLy8gTUFwcGxpY2F0aW9uIGFwcE1vZGVsID0KKwkJLy8gd2J3TW9kZWwuZ2V0Q29udGV4dCgpLmdldChNQXBwbGljYXRpb24uY2xhc3MpOworCQkvLyBCb29sZWFuIHJ0bE1vZGUgPSAoQm9vbGVhbikKKwkJLy8gYXBwTW9kZWwuZ2V0VHJhbnNpZW50RGF0YSgpLmdldChFNFdvcmtiZW5jaC5SVExfTU9ERSk7CisJCS8vIEZJWE1FIFJBUAorCQkvLyBpbnQgcnRsU3R5bGUgPSAocnRsTW9kZSAhPSBudWxsICYmIHJ0bE1vZGUuYm9vbGVhblZhbHVlKCkpID8KKwkJLy8gU1dULlJJR0hUX1RPX0xFRlQgOiAwOworCQlpbnQgcnRsU3R5bGUgPSAwOworCisJCVNoZWxsIHBhcmVudFNoZWxsID0gcGFyZW50ID09IG51bGwgPyBudWxsIDogKChDb250cm9sKSBwYXJlbnQpCisJCQkJLmdldFNoZWxsKCk7CisKKwkJZmluYWwgU2hlbGwgd2J3U2hlbGw7CisKKwkJaW50IHN0eWxlT3ZlcnJpZGUgPSBnZXRTdHlsZU92ZXJyaWRlKHdid01vZGVsKSB8IHJ0bFN0eWxlOworCQlpZiAocGFyZW50U2hlbGwgPT0gbnVsbCkgeworCQkJaW50IHN0eWxlID0gc3R5bGVPdmVycmlkZSA9PSAtMSA/IFNXVC5TSEVMTF9UUklNIHwgcnRsU3R5bGUKKwkJCQkJOiBzdHlsZU92ZXJyaWRlOworCQkJd2J3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgc3R5bGUpOworCQkJd2J3TW9kZWwuZ2V0VGFncygpLmFkZCgidG9wTGV2ZWwiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJaW50IHN0eWxlID0gU1dULlRJVExFIHwgU1dULlJFU0laRSB8IFNXVC5NQVggfCBTV1QuQ0xPU0UgfCBydGxTdHlsZTsKKwkJCXN0eWxlID0gc3R5bGVPdmVycmlkZSA9PSAtMSA/IHN0eWxlIDogc3R5bGVPdmVycmlkZTsKKwkJCWlmICh3YndNb2RlbC5nZXRUYWdzKCkuY29udGFpbnMoSVByZXNlbnRhdGlvbkVuZ2luZS5XSU5ET1dfVE9QX0xFVkVMKSkKKwkJCQl3YndTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBzdHlsZSk7CisJCQllbHNlCisJCQkJd2J3U2hlbGwgPSBuZXcgU2hlbGwocGFyZW50U2hlbGwsIHN0eWxlKTsKKworCQkJLy8gUHJldmVudCBFU0MgZnJvbSBjbG9zaW5nIHRoZSBEVworCQkJd2J3U2hlbGwuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgeworCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgeworCQkJCQkJZS5kb2l0ID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJfQorCisJCS8vIFJBUDogU2luY2UgdGhlIGU0IHRoZW1pbmcgaXMgbm90IHN1cHBvcnRlZCB5ZXQgYnkgUkFQLCBiYWNrZ3JvdW5kIGNvbG9ycyBhcmVuJ3Qgc2V0CisJCS8vICAgICAgZXhwbGljdGx5LiBHbG9iYWwgdHJhbnNwYXJlbmN5IHdpbGwgbGVhZCB0byB0cmFuc3BhcmVudCBmYXN0IHZpZXdzLgorCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ3MjMwMQorCQkvLyB3YndTaGVsbC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9ERUZBVUxUKTsKKworCQlSZWN0YW5nbGUgbW9kZWxCb3VuZHMgPSB3YndTaGVsbC5nZXRCb3VuZHMoKTsKKwkJaWYgKHdid01vZGVsIGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJRU9iamVjdCB3YncgPSAoRU9iamVjdCkgd2J3TW9kZWw7CisJCQlFQ2xhc3Mgd2J3Y2xhc3MgPSB3YncuZUNsYXNzKCk7CisJCQkvLyB1c2UgZUlzU2V0IHJhdGhlciB0aGFuIGVtYmVkIHNlbnRpbmVsIHZhbHVlcworCQkJaWYgKHdidy5lSXNTZXQod2J3Y2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJ4IikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlbEJvdW5kcy54ID0gd2J3TW9kZWwuZ2V0WCgpOworCQkJfQorCQkJaWYgKHdidy5lSXNTZXQod2J3Y2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJ5IikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlbEJvdW5kcy55ID0gd2J3TW9kZWwuZ2V0WSgpOworCQkJfQorCQkJaWYgKHdidy5lSXNTZXQod2J3Y2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJoZWlnaHQiKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW1vZGVsQm91bmRzLmhlaWdodCA9IHdid01vZGVsLmdldEhlaWdodCgpOworCQkJfQorCQkJaWYgKHdidy5lSXNTZXQod2J3Y2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJ3aWR0aCIpKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbW9kZWxCb3VuZHMud2lkdGggPSB3YndNb2RlbC5nZXRXaWR0aCgpOworCQkJfQorCQl9CisJCS8vIEZvcmNlIHRoZSBzaGVsbCBvbnRvIHRoZSBkaXNwbGF5IGlmIGl0IHdvdWxkIGJlIGludmlzaWJsZSBvdGhlcndpc2UKKwkJUmVjdGFuZ2xlIGRpc3BsYXlCb3VuZHMgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKTsKKwkJaWYgKCFtb2RlbEJvdW5kcy5pbnRlcnNlY3RzKGRpc3BsYXlCb3VuZHMpKSB7CisJCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldENsaWVudEFyZWEoKTsKKwkJCW1vZGVsQm91bmRzLnggPSBjbGllbnRBcmVhLng7CisJCQltb2RlbEJvdW5kcy55ID0gY2xpZW50QXJlYS55OworCQl9CisJCXdid1NoZWxsLnNldEJvdW5kcyhtb2RlbEJvdW5kcyk7CisKKwkJc2V0Q1NTSW5mbyh3YndNb2RlbCwgd2J3U2hlbGwpOworCisJCS8vIHNldCB1cCBjb250ZXh0CisJCUlFY2xpcHNlQ29udGV4dCBsb2NhbENvbnRleHQgPSBnZXRDb250ZXh0KHdid01vZGVsKTsKKworCQkvLyBXZSBuZWVkIHRvIHJldHJpZXZlIHNwZWNpZmljIENTUyBwcm9wZXJ0aWVzIGZvciBvdXIgbGF5b3V0LgorCQlDU1NFbmdpbmVIZWxwZXIgaGVscGVyID0gbmV3IENTU0VuZ2luZUhlbHBlcihsb2NhbENvbnRleHQsIHdid1NoZWxsKTsKKwkJVHJpbW1lZFBhcnRMYXlvdXQgdGwgPSBuZXcgVHJpbW1lZFBhcnRMYXlvdXQod2J3U2hlbGwpOworCQl0bC5ndXR0ZXJUb3AgPSBoZWxwZXIuZ2V0TWFyZ2luVG9wKDApOworCQl0bC5ndXR0ZXJCb3R0b20gPSBoZWxwZXIuZ2V0TWFyZ2luQm90dG9tKDApOworCQl0bC5ndXR0ZXJMZWZ0ID0gaGVscGVyLmdldE1hcmdpbkxlZnQoMCk7CisJCXRsLmd1dHRlclJpZ2h0ID0gaGVscGVyLmdldE1hcmdpblJpZ2h0KDApOworCisJCXdid1NoZWxsLnNldExheW91dCh0bCk7CisJCW5ld1dpZGdldCA9IHdid1NoZWxsOworCQliaW5kV2lkZ2V0KGVsZW1lbnQsIG5ld1dpZGdldCk7CisKKwkJLy8gQWRkIHRoZSBzaGVsbCBpbnRvIHRoZSBXQlcncyBjb250ZXh0CisJCWxvY2FsQ29udGV4dC5zZXQoU2hlbGwuY2xhc3MsIHdid1NoZWxsKTsKKwkJbG9jYWxDb250ZXh0LnNldChFNFdvcmtiZW5jaC5MT0NBTF9BQ1RJVkVfU0hFTEwsIHdid1NoZWxsKTsKKwkJc2V0Q2xvc2VIYW5kbGVyKHdid01vZGVsKTsKKwkJbG9jYWxDb250ZXh0LnNldChJU2hlbGxQcm92aWRlci5jbGFzcywgbmV3IElTaGVsbFByb3ZpZGVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7CisJCQkJcmV0dXJuIHdid1NoZWxsOworCQkJfQorCQl9KTsKKwkJZmluYWwgUGFydFNlcnZpY2VTYXZlSGFuZGxlciBzYXZlSGFuZGxlciA9IG5ldyBQYXJ0U2VydmljZVNhdmVIYW5kbGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU2F2ZSBwcm9tcHRUb1NhdmUoTVBhcnQgZGlydHlQYXJ0KSB7CisJCQkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIGNvbnRleHQKKwkJCQkJCS5nZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NIRUxMKTsKKwkJCQlPYmplY3RbXSBlbGVtZW50cyA9IHByb21wdEZvclNhdmUoc2hlbGwsCisJCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oZGlydHlQYXJ0KSk7CisJCQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIFNhdmUuQ0FOQ0VMOworCQkJCX0KKwkJCQlyZXR1cm4gZWxlbWVudHMubGVuZ3RoID09IDAgPyBTYXZlLk5PIDogU2F2ZS5ZRVM7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFNhdmVbXSBwcm9tcHRUb1NhdmUoQ29sbGVjdGlvbjxNUGFydD4gZGlydHlQYXJ0cykgeworCQkJCUxpc3Q8TVBhcnQ+IHBhcnRzID0gbmV3IEFycmF5TGlzdDxNUGFydD4oZGlydHlQYXJ0cyk7CisJCQkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIGNvbnRleHQKKwkJCQkJCS5nZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NIRUxMKTsKKwkJCQlTYXZlW10gcmVzcG9uc2UgPSBuZXcgU2F2ZVtkaXJ0eVBhcnRzLnNpemUoKV07CisJCQkJT2JqZWN0W10gZWxlbWVudHMgPSBwcm9tcHRGb3JTYXZlKHNoZWxsLCBwYXJ0cyk7CisJCQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKKwkJCQkJQXJyYXlzLmZpbGwocmVzcG9uc2UsIFNhdmUuQ0FOQ0VMKTsKKwkJCQl9IGVsc2UgeworCQkJCQlBcnJheXMuZmlsbChyZXNwb25zZSwgU2F2ZS5OTyk7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCXJlc3BvbnNlW3BhcnRzLmluZGV4T2YoZWxlbWVudHNbaV0pXSA9IFNhdmUuWUVTOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJfTsKKwkJc2F2ZUhhbmRsZXIubG9nZ2VyID0gbG9nZ2VyOworCQlsb2NhbENvbnRleHQuc2V0KElTYXZlSGFuZGxlci5jbGFzcywgc2F2ZUhhbmRsZXIpOworCisJCWlmICh3YndNb2RlbC5nZXRMYWJlbCgpICE9IG51bGwpCisJCQl3YndTaGVsbC5zZXRUZXh0KHdid01vZGVsLmdldExvY2FsaXplZExhYmVsKCkpOworCisJCWlmICh3YndNb2RlbC5nZXRJY29uVVJJKCkgIT0gbnVsbCAmJiB3YndNb2RlbC5nZXRJY29uVVJJKCkubGVuZ3RoKCkgPiAwKSB7CisJCQl3YndTaGVsbC5zZXRJbWFnZShnZXRJbWFnZSh3YndNb2RlbCkpOworCQl9IGVsc2UgeworCQkJLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLCBzZWUgYnVnIDMwODQ5NAorCQkJLy8gaXQgYWxsb3dzIGZvciBhIHJhbmdlIG9mIGljb24gc2l6ZXMgdGhhdCB0aGUgcGxhdGZvcm0gZ2V0cyB0bworCQkJLy8gY2hvb3NlIGZyb20KKwkJCXdid1NoZWxsLnNldEltYWdlcyhXaW5kb3cuZ2V0RGVmYXVsdEltYWdlcygpKTsKKwkJfQorCisJCXJldHVybiBuZXdXaWRnZXQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldENsb3NlSGFuZGxlcihNV2luZG93IHdpbmRvdykgeworCQlJRWNsaXBzZUNvbnRleHQgY29udGV4dCA9IHdpbmRvdy5nZXRDb250ZXh0KCk7CisJCS8vIG5vIGRpcmVjdCBtb2RlbCBwYXJlbnQsIG11c3QgYmUgYSBkZXRhY2hlZCB3aW5kb3cKKwkJaWYgKHdpbmRvdy5nZXRQYXJlbnQoKSA9PSBudWxsKSB7CisJCQljb250ZXh0LnNldChJV2luZG93Q2xvc2VIYW5kbGVyLmNsYXNzLAorCQkJCQluZXcgSVdpbmRvd0Nsb3NlSGFuZGxlcigpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIGJvb2xlYW4gY2xvc2UoTVdpbmRvdyB3aW5kb3cpIHsKKwkJCQkJCQlyZXR1cm4gY2xvc2VEZXRhY2hlZFdpbmRvdyh3aW5kb3cpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJfSBlbHNlIHsKKwkJCWNvbnRleHQuc2V0KElXaW5kb3dDbG9zZUhhbmRsZXIuY2xhc3MsCisJCQkJCW5ldyBJV2luZG93Q2xvc2VIYW5kbGVyKCkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgYm9vbGVhbiBjbG9zZShNV2luZG93IHdpbmRvdykgeworCQkJCQlFUGFydFNlcnZpY2UgcGFydFNlcnZpY2UgPSB3aW5kb3cuZ2V0Q29udGV4dCgpLmdldChFUGFydFNlcnZpY2UuY2xhc3MpOworCQkJCQkJCXJldHVybiBwYXJ0U2VydmljZS5zYXZlQWxsKHRydWUpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhvb2tDb250cm9sbGVyTG9naWMoTVVJRWxlbWVudCBtZSkgeworCQlzdXBlci5ob29rQ29udHJvbGxlckxvZ2ljKG1lKTsKKworCQlXaWRnZXQgd2lkZ2V0ID0gKFdpZGdldCkgbWUuZ2V0V2lkZ2V0KCk7CisKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFNoZWxsICYmIG1lIGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJZmluYWwgU2hlbGwgc2hlbGwgPSAoU2hlbGwpIHdpZGdldDsKKwkJCWZpbmFsIE1XaW5kb3cgdyA9IChNV2luZG93KSBtZTsKKwkJCXNoZWxsLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgeworCQkJCS8qKgorCQkJCSAqCisJCQkJICovCisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgeworCQkJCQkvLyBEb24ndCBzdG9yZSB0aGUgbWF4aW1pemVkIHNpemUgaW4gdGhlIG1vZGVsCisJCQkJCWlmIChzaGVsbC5nZXRNYXhpbWl6ZWQoKSkKKwkJCQkJCXJldHVybjsKKworCQkJCQl0cnkgeworCQkJCQkJaWdub3JlU2l6ZUNoYW5nZXMgPSB0cnVlOworCQkJCQkJdy5zZXRXaWR0aChzaGVsbC5nZXRTaXplKCkueCk7CisJCQkJCQl3LnNldEhlaWdodChzaGVsbC5nZXRTaXplKCkueSk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlpZ25vcmVTaXplQ2hhbmdlcyA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7CisJCQkJCS8vIERvbid0IHN0b3JlIHRoZSBtYXhpbWl6ZWQgc2l6ZSBpbiB0aGUgbW9kZWwKKwkJCQkJaWYgKHNoZWxsLmdldE1heGltaXplZCgpKQorCQkJCQkJcmV0dXJuOworCisJCQkJCXRyeSB7CisJCQkJCQlpZ25vcmVTaXplQ2hhbmdlcyA9IHRydWU7CisJCQkJCQl3LnNldFgoc2hlbGwuZ2V0TG9jYXRpb24oKS54KTsKKwkJCQkJCXcuc2V0WShzaGVsbC5nZXRMb2NhdGlvbigpLnkpOworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJaWdub3JlU2l6ZUNoYW5nZXMgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCisJCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgeworCQkJCQkvLyBvdmVycmlkZSB0aGUgc2hlbGwgY2xvc2UgZXZlbnQKKwkJCQkJZS5kb2l0ID0gZmFsc2U7CisJCQkJCU1XaW5kb3cgd2luZG93ID0gKE1XaW5kb3cpIGUud2lkZ2V0LmdldERhdGEoT1dOSU5HX01FKTsKKwkJCQkJSVdpbmRvd0Nsb3NlSGFuZGxlciBjbG9zZUhhbmRsZXIgPSB3aW5kb3cuZ2V0Q29udGV4dCgpLmdldChJV2luZG93Q2xvc2VIYW5kbGVyLmNsYXNzKTsKKwkJCQkJLy8gaWYgdGhlcmUncyBubyBoYW5kbGVyIG9yIHRoZSBoYW5kbGVyIHBlcm1pdHMgdGhlIGNsb3NlCisJCQkJCS8vIHJlcXVlc3QsIGNsZWFuLXVwIGFzIG5lY2Vzc2FyeQorCQkJCQlpZiAoY2xvc2VIYW5kbGVyID09IG51bGwgfHwgY2xvc2VIYW5kbGVyLmNsb3NlKHdpbmRvdykpIHsKKwkJCQkJCWNsZWFuVXAod2luZG93KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7CisJCQkJLyoqCisJCQkJICoKKwkJCQkgKi8KKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50IGV2ZW50KSB7CisJCQkJCU1VSUVsZW1lbnQgcGFyZW50TUUgPSB3LmdldFBhcmVudCgpOworCQkJCQlpZiAocGFyZW50TUUgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCQkJCU1BcHBsaWNhdGlvbiBhcHAgPSAoTUFwcGxpY2F0aW9uKSBwYXJlbnRNRTsKKwkJCQkJCWFwcC5zZXRTZWxlY3RlZEVsZW1lbnQodyk7CisJCQkJCQl3LmdldENvbnRleHQoKS5hY3RpdmF0ZSgpOworCQkJCQl9IGVsc2UgaWYgKHBhcmVudE1FID09IG51bGwpIHsKKwkJCQkJCXBhcmVudE1FID0gKE1VSUVsZW1lbnQpICgoRU9iamVjdCkgdykuZUNvbnRhaW5lcigpOworCQkJCQkJaWYgKHBhcmVudE1FIGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCQkJCQl3LmdldENvbnRleHQoKS5hY3RpdmF0ZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXVwZGF0ZU5vbkZvY3VzU3RhdGUoU1dULkFjdGl2YXRlLCB3KTsKKwkJCQl9CisJCQl9KTsKKworCQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQgZXZlbnQpIHsKKwkJCQkJdXBkYXRlTm9uRm9jdXNTdGF0ZShTV1QuRGVhY3RpdmF0ZSwgdyk7CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlTm9uRm9jdXNTdGF0ZShpbnQgZXZlbnQsIE1XaW5kb3cgd2luKSB7CisJCU1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSA9IG1vZGVsU2VydmljZS5nZXRBY3RpdmVQZXJzcGVjdGl2ZSh3aW4pOworCQlpZiAocGVyc3BlY3RpdmUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJTGlzdDxNUGFydFN0YWNrPiBzdGFja3MgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHBlcnNwZWN0aXZlLCBudWxsLAorCQkJCU1QYXJ0U3RhY2suY2xhc3MsIEFycmF5cy5hc0xpc3QoQ1NTQ29uc3RhbnRzLkNTU19BQ1RJVkVfQ0xBU1MpKTsKKwkJaWYgKHN0YWNrcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCU1QYXJ0U3RhY2sgc3RhY2sgPSBzdGFja3MuZ2V0KDApOworCQlpbnQgdGFnc0NvdW50ID0gc3RhY2suZ2V0VGFncygpLnNpemUoKTsKKwkJYm9vbGVhbiBoYXNOb25Gb2N1c1RhZyA9IHN0YWNrLmdldFRhZ3MoKS5jb250YWlucygKKwkJCQlDU1NDb25zdGFudHMuQ1NTX05PX0ZPQ1VTX0NMQVNTKTsKKworCQlpZiAoZXZlbnQgPT0gU1dULkFjdGl2YXRlICYmIGhhc05vbkZvY3VzVGFnKSB7CisJCQlzdGFjay5nZXRUYWdzKCkucmVtb3ZlKENTU0NvbnN0YW50cy5DU1NfTk9fRk9DVVNfQ0xBU1MpOworCQl9IGVsc2UgaWYgKGV2ZW50ID09IFNXVC5EZWFjdGl2YXRlICYmICFoYXNOb25Gb2N1c1RhZykgeworCQkJc3RhY2suZ2V0VGFncygpLmFkZChDU1NDb25zdGFudHMuQ1NTX05PX0ZPQ1VTX0NMQVNTKTsKKwkJfQorCQlpZiAodGFnc0NvdW50ICE9IHN0YWNrLmdldFRhZ3MoKS5zaXplKCkpIHsKKwkJCXNldENTU0luZm8oc3RhY2ssIHN0YWNrLmdldFdpZGdldCgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjbGVhblVwKE1XaW5kb3cgd2luZG93KSB7CisJCU9iamVjdCBwYXJlbnQgPSAoKEVPYmplY3QpIHdpbmRvdykuZUNvbnRhaW5lcigpOworCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uKSB7CisJCQlNQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoTUFwcGxpY2F0aW9uKSBwYXJlbnQ7CisJCQlMaXN0PE1XaW5kb3c+IGNoaWxkcmVuID0gYXBwbGljYXRpb24uZ2V0Q2hpbGRyZW4oKTsKKwkJCWlmIChjaGlsZHJlbi5zaXplKCkgPiAxKSB7CisJCQkJLy8gbm90IHRoZSBsYXN0IHdpbmRvdywgZGVzdHJveSBhbmQgcmVtb3ZlCisJCQkJd2luZG93LnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCQkJY2hpbGRyZW4ucmVtb3ZlKHdpbmRvdyk7CisJCQl9IGVsc2UgeworCQkJCS8vIGxhc3Qgd2luZG93LCBqdXN0IGRlc3Ryb3kgd2l0aG91dCBjaGFuZ2luZyB0aGUgbW9kZWwKKwkJCQllbmdpbmUucmVtb3ZlR3VpKHdpbmRvdyk7CisJCQl9CisJCX0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsKKwkJCXdpbmRvdy5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJLy8gdGhpcyBpcyBhIGRldGFjaGVkIHdpbmRvdywgY2hlY2sgZm9yIHBhcnRzCisJCQlpZiAobW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW5kb3csIG51bGwsIE1QYXJ0LmNsYXNzLCBudWxsKQorCQkJCQkuaXNFbXB0eSgpKSB7CisJCQkJLy8gaWYgbm8gcGFydHMsIHJlbW92ZSBpdAorCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNV2luZG93KSB7CisJCQkJCSgoTVdpbmRvdykgcGFyZW50KS5nZXRXaW5kb3dzKCkucmVtb3ZlKHdpbmRvdyk7CisJCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmUpIHsKKwkJCQkJKChNUGVyc3BlY3RpdmUpIHBhcmVudCkuZ2V0V2luZG93cygpLnJlbW92ZSh3aW5kb3cpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogUHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYSBXb3JrYmVuY2ggd2luZG93IGhhcyB0byB0YWtlIGludG8gYWNjb3VudAorCSAqIHRoYXQgdGhlcmUgbWF5IGJlIHRyaW0gZWxlbWVudHMgY29udGFpbmVkIGluIGl0cyBjaGlsZCBsaXN0LiBTaW5jZSB0aGUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGVudHMoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gbWUpIHsKKwkJaWYgKCEoKChNVUlFbGVtZW50KSBtZSkgaW5zdGFuY2VvZiBNV2luZG93KSkKKwkJCXJldHVybjsKKwkJTVdpbmRvdyB3YndNb2RlbCA9IChNV2luZG93KSAoKE1VSUVsZW1lbnQpIG1lKTsKKwkJc3VwZXIucHJvY2Vzc0NvbnRlbnRzKG1lKTsKKworCQkvLyBQb3B1bGF0ZSB0aGUgbWFpbiBtZW51CisJCUlQcmVzZW50YXRpb25FbmdpbmUgcmVuZGVyZXIgPSBjb250ZXh0LmdldChJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzKTsKKwkJaWYgKHdid01vZGVsLmdldE1haW5NZW51KCkgIT0gbnVsbCkgeworCQkJcmVuZGVyZXIuY3JlYXRlR3VpKHdid01vZGVsLmdldE1haW5NZW51KCksIG1lLmdldFdpZGdldCgpLCBudWxsKTsKKwkJCVNoZWxsIHNoZWxsID0gKFNoZWxsKSBtZS5nZXRXaWRnZXQoKTsKKwkJCXNoZWxsLnNldE1lbnVCYXIoKE1lbnUpIHdid01vZGVsLmdldE1haW5NZW51KCkuZ2V0V2lkZ2V0KCkpOworCQl9CisKKwkJLy8gY3JlYXRlIERldGFjaGVkIFdpbmRvd3MKKwkJZm9yIChNV2luZG93IGR3IDogd2J3TW9kZWwuZ2V0V2luZG93cygpKSB7CisJCQlyZW5kZXJlci5jcmVhdGVHdWkoZHcsIG1lLmdldFdpZGdldCgpLCB3YndNb2RlbC5nZXRDb250ZXh0KCkpOworCQl9CisKKwkJLy8gUG9wdWxhdGUgdGhlIHRyaW0gKGlmIGFueSkKKwkJaWYgKHdid01vZGVsIGluc3RhbmNlb2YgTVRyaW1tZWRXaW5kb3cpIHsKKwkJCVNoZWxsIHNoZWxsID0gKFNoZWxsKSB3YndNb2RlbC5nZXRXaWRnZXQoKTsKKwkJCU1UcmltbWVkV2luZG93IHRXaW5kb3cgPSAoTVRyaW1tZWRXaW5kb3cpIHdid01vZGVsOworCQkJTGlzdDxNVHJpbUJhcj4gdHJpbUJhcnMgPSBuZXcgQXJyYXlMaXN0PE1UcmltQmFyPigKKwkJCQkJdFdpbmRvdy5nZXRUcmltQmFycygpKTsKKwkJCWZvciAoTVRyaW1CYXIgdHJpbUJhciA6IHRyaW1CYXJzKSB7CisJCQkJcmVuZGVyZXIuY3JlYXRlR3VpKHRyaW1CYXIsIHNoZWxsLCB3YndNb2RlbC5nZXRDb250ZXh0KCkpOworCQkJCS8vIGJ1ZyAzODcxNjE6IGhhY2sgYXJvdW5kIHRoYXQgY3JlYXRlR3VpKGUsIHBhcmVudCwgY29udGV4dCkKKwkJCQkvLyBkb2VzIG5vdCByZXBhcmVudCB0aGUgZWxlbWVudCB3aWRnZXQgdG8gdGhlCisJCQkJLy8gbGltYm8gc2hlbGwgd2hlYiB2aXNpYmxlPWZhbHNlCisJCQkJaWYgKCF0cmltQmFyLmlzVmlzaWJsZSgpKSB7CisJCQkJCXRyaW1CYXIuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJdHJpbUJhci5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVJQ29udGFpbmVyKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlNVUlFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJLy8gbWlnaHQgYmUgYSBkZXRhY2hlZCB3aW5kb3cKKwkJCXBhcmVudCA9IChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJCXJldHVybiBwYXJlbnQgPT0gbnVsbCA/IG51bGwgOiBwYXJlbnQuZ2V0V2lkZ2V0KCk7CisJCX0KKworCQlDb21wb3NpdGUgc2hlbGxDb21wID0gKENvbXBvc2l0ZSkgZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRXaWRnZXQoKTsKKwkJVHJpbW1lZFBhcnRMYXlvdXQgdHBsID0gKFRyaW1tZWRQYXJ0TGF5b3V0KSBzaGVsbENvbXAuZ2V0TGF5b3V0KCk7CisJCXJldHVybiB0cGwuY2xpZW50QXJlYTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0UHJvY2VzcyhNVUlFbGVtZW50IHNoZWxsTUUpIHsKKwkJc3VwZXIucG9zdFByb2Nlc3Moc2hlbGxNRSk7CisKKwkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIHNoZWxsTUUuZ2V0V2lkZ2V0KCk7CisKKwkJLy8gQ2FwdHVyZSB0aGUgbWF4L21pbiBzdGF0ZQorCQlmaW5hbCBNVUlFbGVtZW50IGRpc3Bvc2VNRSA9IHNoZWxsTUU7CisJCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKgorCQkJICovCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCVNoZWxsIHNoZWxsID0gKFNoZWxsKSBlLndpZGdldDsKKwkJCQlpZiAoZGlzcG9zZU1FICE9IG51bGwpIHsKKwkJCQkJZGlzcG9zZU1FLmdldFRhZ3MoKS5yZW1vdmUoU2hlbGxNaW5pbWl6ZWRUYWcpOworCQkJCQlkaXNwb3NlTUUuZ2V0VGFncygpLnJlbW92ZShTaGVsbE1heGltaXplZFRhZyk7CisJCQkJCWlmIChzaGVsbC5nZXRNaW5pbWl6ZWQoKSkKKwkJCQkJCWRpc3Bvc2VNRS5nZXRUYWdzKCkuYWRkKFNoZWxsTWluaW1pemVkVGFnKTsKKwkJCQkJaWYgKHNoZWxsLmdldE1heGltaXplZCgpKQorCQkJCQkJZGlzcG9zZU1FLmdldFRhZ3MoKS5hZGQoU2hlbGxNYXhpbWl6ZWRUYWcpOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJLy8gQXBwbHkgdGhlIGNvcnJlY3Qgc2hlbGwgc3RhdGUKKwkJaWYgKHNoZWxsTUUuZ2V0VGFncygpLmNvbnRhaW5zKFNoZWxsTWF4aW1pemVkVGFnKSkKKwkJCXNoZWxsLnNldE1heGltaXplZCh0cnVlKTsKKwkJZWxzZSBpZiAoc2hlbGxNRS5nZXRUYWdzKCkuY29udGFpbnMoU2hlbGxNaW5pbWl6ZWRUYWcpKQorCQkJc2hlbGwuc2V0TWluaW1pemVkKHRydWUpOworCisJCXNoZWxsLmxheW91dCh0cnVlKTsKKwkJZm9yY2VMYXlvdXQoc2hlbGwpOworCQlpZiAoc2hlbGxNRS5pc1Zpc2libGUoKSkgeworCQkJc2hlbGwub3BlbigpOworCQl9IGVsc2UgeworCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIE9iamVjdFtdIHByb21wdEZvclNhdmUoU2hlbGwgcGFyZW50U2hlbGwsCisJCQlDb2xsZWN0aW9uPE1QYXJ0PiBzYXZlYWJsZVBhcnRzKSB7CisJCVNhdmVhYmxlUGFydFByb21wdERpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZWFibGVQYXJ0UHJvbXB0RGlhbG9nKAorCQkJCXBhcmVudFNoZWxsLCBzYXZlYWJsZVBhcnRzKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gZGlhbG9nLmdldENoZWNrZWRFbGVtZW50cygpOworCX0KKworCXByaXZhdGUgdm9pZCBhcHBseURpYWxvZ1N0eWxlcyhDb250cm9sIGNvbnRyb2wpIHsKKwkJSVN0eWxpbmdFbmdpbmUgZW5naW5lID0gKElTdHlsaW5nRW5naW5lKSBjb250ZXh0CisJCQkJLmdldChJU3R5bGluZ0VuZ2luZS5TRVJWSUNFX05BTUUpOworCQlpZiAoZW5naW5lICE9IG51bGwpIHsKKwkJCVNoZWxsIHNoZWxsID0gY29udHJvbC5nZXRTaGVsbCgpOworCQkJaWYgKHNoZWxsLmdldEJhY2tncm91bmRNb2RlKCkgPT0gU1dULklOSEVSSVRfTk9ORSkgeworCQkJCXNoZWxsLnNldEJhY2tncm91bmRNb2RlKFNXVC5JTkhFUklUX0RFRkFVTFQpOworCQkJfQorCisJCQllbmdpbmUuc3R5bGUoc2hlbGwpOworCQl9CisJfQorCisJY2xhc3MgU2F2ZWFibGVQYXJ0UHJvbXB0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKworCQkvKioKKwkJICoKKwkJICovCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCXByaXZhdGUgQ29sbGVjdGlvbjxNUGFydD4gY29sbGVjdGlvbjsKKworCQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CisKKwkJcHJpdmF0ZSBPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSBuZXcgT2JqZWN0WzBdOworCisJCVNhdmVhYmxlUGFydFByb21wdERpYWxvZyhTaGVsbCBzaGVsbCwgQ29sbGVjdGlvbjxNUGFydD4gY29sbGVjdGlvbikgeworCQkJc3VwZXIoc2hlbGwpOworCQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOworCQkJbmV3U2hlbGwuc2V0VGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy5jaG9vc2VQYXJ0c1RvU2F2ZVRpdGxlKTsKKwkJfQorCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUFEKTsKKwkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOworCQkJbGFiZWwuc2V0VGV4dChTV1RSZW5kZXJlcnNNZXNzYWdlcy5jaG9vc2VQYXJ0c1RvU2F2ZSk7CisKKwkJCXRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QocGFyZW50LCBTV1QuU0lOR0xFCisJCQkJCXwgU1dULkJPUkRFUik7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7CisJCQlkYXRhLmhlaWdodEhpbnQgPSAyNTA7CisJCQlkYXRhLndpZHRoSGludCA9IDMwMDsKKwkJCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKKwkJCQkvKioKKwkJCQkgKgorCQkJCSAqLworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQkJCXJldHVybiAoKE1QYXJ0KSBlbGVtZW50KS5nZXRMb2NhbGl6ZWRMYWJlbCgpOworCQkJCX0KKwkJCX0pOworCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKEFycmF5Q29udGVudFByb3ZpZGVyLmdldEluc3RhbmNlKCkpOworCQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoY29sbGVjdGlvbik7CisJCQl0YWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOworCisJCQlyZXR1cm4gcGFyZW50OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKKwkJCXN1cGVyLmNyZWF0ZSgpOworCQkJYXBwbHlEaWFsb2dTdHlsZXMoZ2V0U2hlbGwoKSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQkJY2hlY2tlZEVsZW1lbnRzID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CisJCQlzdXBlci5va1ByZXNzZWQoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGVja2VkRWxlbWVudHMoKSB7CisJCQlyZXR1cm4gY2hlY2tlZEVsZW1lbnRzOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIGlzUmVzaXphYmxlKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCX0KKworCS8vIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGhlbWVEZWZpbml0aW9uQ2hhbmdlZEhhbmRsZXIgeworCS8vIHByb3RlY3RlZCBTZXQ8UmVzb3VyY2U+IHVudXNlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOworCS8vCisJLy8gcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkvLyBPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldFByb3BlcnR5KElFdmVudEJyb2tlci5EQVRBKTsKKwkvLworCS8vIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pKSB7CisJLy8gcmV0dXJuOworCS8vIH0KKwkvLworCS8vIFNldDxDU1NFbmdpbmU+IGVuZ2luZXMgPSBuZXcgSGFzaFNldDxDU1NFbmdpbmU+KCk7CisJLy8KKwkvLyAvLyBJbiB0aGVvcnkgd2UgY2FuIGhhdmUgbXVsdGlwbGUgZW5naW5lcyBzaW5jZSBBUEkgYWxsb3dzIGl0LgorCS8vIC8vIEl0IGRvZXNuJ3QgaHVydCB0byBiZSBwcmVwYXJlZCBmb3Igc3VjaCBjYXNlCisJLy8gZm9yIChNV2luZG93IHdpbmRvdyA6ICgoTUFwcGxpY2F0aW9uKSBlbGVtZW50KS5nZXRDaGlsZHJlbigpKSB7CisJLy8gQ1NTRW5naW5lIGVuZ2luZSA9IGdldEVuZ2luZSh3aW5kb3cpOworCS8vIGlmIChlbmdpbmUgIT0gbnVsbCkgeworCS8vIGVuZ2luZXMuYWRkKGVuZ2luZSk7CisJLy8gfQorCS8vIH0KKwkvLworCS8vIGZvciAoQ1NTRW5naW5lIGVuZ2luZSA6IGVuZ2luZXMpIHsKKwkvLyBmb3IgKE9iamVjdCByZXNvdXJjZSA6IHJlbW92ZVJlc291cmNlcyhlbmdpbmUuZ2V0UmVzb3VyY2VzUmVnaXN0cnkoKSkpIHsKKwkvLyBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBSZXNvdXJjZSAmJiAhKChSZXNvdXJjZSkgcmVzb3VyY2UpLmlzRGlzcG9zZWQoKSkKKwkvLyB7CisJLy8gdW51c2VkUmVzb3VyY2VzLmFkZCgoUmVzb3VyY2UpIHJlc291cmNlKTsKKwkvLyB9CisJLy8gfQorCS8vIGVuZ2luZS5yZWFwcGx5KCk7CisJLy8gfQorCS8vIH0KKwkvLworCS8vIHByb3RlY3RlZCBDU1NFbmdpbmUgZ2V0RW5naW5lKE1XaW5kb3cgd2luZG93KSB7CisJLy8gcmV0dXJuIFdpZGdldEVsZW1lbnQuZ2V0RW5naW5lKChXaWRnZXQpIHdpbmRvdy5nZXRXaWRnZXQoKSk7CisJLy8gfQorCS8vCisJLy8gcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiByZW1vdmVSZXNvdXJjZXMoSVJlc291cmNlc1JlZ2lzdHJ5IHJlZ2lzdHJ5KSB7CisJLy8gaWYgKHJlZ2lzdHJ5IGluc3RhbmNlb2YgU1dUUmVzb3VyY2VzUmVnaXN0cnkpIHsKKwkvLyByZXR1cm4gKChTV1RSZXNvdXJjZXNSZWdpc3RyeSkKKwkvLyByZWdpc3RyeSkucmVtb3ZlUmVzb3VyY2VzQnlLZXlUeXBlQW5kVHlwZShSZXNvdXJjZUJ5RGVmaW5pdGlvbktleS5jbGFzcywKKwkvLyBGb250LmNsYXNzLCBDb2xvci5jbGFzcyk7CisJLy8gfQorCS8vIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkvLyB9CisJLy8KKwkvLyBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCS8vIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1bnVzZWRSZXNvdXJjZXMpIHsKKwkvLyBpZiAoIXJlc291cmNlLmlzRGlzcG9zZWQoKSkgeworCS8vIHJlc291cmNlLmRpc3Bvc2UoKTsKKwkvLyB9CisJLy8gfQorCS8vIHVudXNlZFJlc291cmNlcy5jbGVhcigpOworCS8vIH0KKwkvLyB9CisKKwlwcml2YXRlIHZvaWQgZm9yY2VMYXlvdXQoU2hlbGwgc2hlbGwpIHsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoc2hlbGwuaXNMYXlvdXREZWZlcnJlZCgpKSB7CisJCQlzaGVsbC5zZXRMYXlvdXREZWZlcnJlZChmYWxzZSk7CisJCQlpKys7CisJCX0KKwkJd2hpbGUgKGkgPiAwKSB7CisJCQlzaGVsbC5zZXRMYXlvdXREZWZlcnJlZCh0cnVlKTsKKwkJCWktLTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1dvcmtiZW5jaFJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3JlbmRlcmVycy9zd3QvV29ya2JlbmNoUmVuZGVyZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3YmVlZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L1dvcmtiZW5jaFJlbmRlcmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuQWJzdHJhY3RQYXJ0UmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NQXJlYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U2FzaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51U2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhclNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmZhY3Rvcmllcy5JUmVuZGVyZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVuZGVyZXJGYWN0b3J5IGltcGxlbWVudHMgSVJlbmRlcmVyRmFjdG9yeSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0VMRU1FTlRTX1NUT1JFID0gIm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LlNIQVJFRF9FTEVNRU5UU19TVE9SRSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIEFyZWFSZW5kZXJlciBhcmVhUmVuZGVyZXI7CisJcHJpdmF0ZSBNZW51TWFuYWdlclJlbmRlcmVyIG1lbnVSZW5kZXJlcjsKKwlwcml2YXRlIFRvb2xCYXJNYW5hZ2VyUmVuZGVyZXIgdG9vbGJhclJlbmRlcmVyOworCS8vIHByaXZhdGUgVG9vbEl0ZW1SZW5kZXJlciB0b29sSXRlbVJlbmRlcmVyOworCXByaXZhdGUgU2VwYXJhdG9yUmVuZGVyZXIgc2VwYXJhdG9yUmVuZGVyZXI7CisJcHJpdmF0ZSBDb250cmlidXRlZFBhcnRSZW5kZXJlciBjb250cmlidXRlZFBhcnRSZW5kZXJlcjsKKwlwcml2YXRlIEVsZW1lbnRSZWZlcmVuY2VSZW5kZXJlciBlbGVtZW50UmVmUmVuZGVyZXI7CisJcHJpdmF0ZSBQZXJzcGVjdGl2ZVN0YWNrUmVuZGVyZXIgcGVyc3BTdGFja1JlbmRlcmVyOworCXByaXZhdGUgUGVyc3BlY3RpdmVSZW5kZXJlciBwZXJzcFJlbmRlcmVyOworCXByaXZhdGUgU2FzaFJlbmRlcmVyIHBhcnRTYXNoUmVuZGVyZXI7CisJcHJpdmF0ZSBMYXp5U3RhY2tSZW5kZXJlciBzdGFja1JlbmRlcmVyOworCXByaXZhdGUgVHJpbUJhclJlbmRlcmVyIHRyaW1CYXJSZW5kZXJlcjsKKwlwcml2YXRlIFRvb2xDb250cm9sUmVuZGVyZXIgdG9vbENvbnRyb2xSZW5kZXJlcjsKKwlwcml2YXRlIFdCV1JlbmRlcmVyIHdid1JlbmRlcmVyOworCisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCS8vIHByaXZhdGUgUmVuZGVyZWRUb29sQmFyUmVuZGVyZXIgcmVuZGVyZWRUb29sYmFyUmVuZGVyZXI7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWJzdHJhY3RQYXJ0UmVuZGVyZXIgZ2V0UmVuZGVyZXIoTVVJRWxlbWVudCB1aUVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJaWYgKHVpRWxlbWVudCBpbnN0YW5jZW9mIE1BcmVhKSB7CisJCQlpZiAoYXJlYVJlbmRlcmVyID09IG51bGwpIHsKKwkJCQlhcmVhUmVuZGVyZXIgPSBuZXcgQXJlYVJlbmRlcmVyKCk7CisJCQkJaW5pdFJlbmRlcmVyKGFyZWFSZW5kZXJlcik7CisJCQl9CisJCQlyZXR1cm4gYXJlYVJlbmRlcmVyOworCQl9IGVsc2UgaWYgKHVpRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSB7CisJCQlpZiAoY29udHJpYnV0ZWRQYXJ0UmVuZGVyZXIgPT0gbnVsbCkgeworCQkJCWNvbnRyaWJ1dGVkUGFydFJlbmRlcmVyID0gbmV3IENvbnRyaWJ1dGVkUGFydFJlbmRlcmVyKCk7CisJCQkJaW5pdFJlbmRlcmVyKGNvbnRyaWJ1dGVkUGFydFJlbmRlcmVyKTsKKwkJCX0KKwkJCXJldHVybiBjb250cmlidXRlZFBhcnRSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNTWVudSkgeworCQkJaWYgKG1lbnVSZW5kZXJlciA9PSBudWxsKSB7CisJCQkJbWVudVJlbmRlcmVyID0gbmV3IE1lbnVNYW5hZ2VyUmVuZGVyZXIoKTsKKwkJCQlpbml0UmVuZGVyZXIobWVudVJlbmRlcmVyKTsKKwkJCX0KKwkJCXJldHVybiBtZW51UmVuZGVyZXI7CisJCX0gZWxzZSBpZiAodWlFbGVtZW50IGluc3RhbmNlb2YgTVRvb2xCYXIpIHsKKwkJCWlmICh0b29sYmFyUmVuZGVyZXIgPT0gbnVsbCkgeworCQkJCXRvb2xiYXJSZW5kZXJlciA9IG5ldyBUb29sQmFyTWFuYWdlclJlbmRlcmVyKCk7CisJCQkJaW5pdFJlbmRlcmVyKHRvb2xiYXJSZW5kZXJlcik7CisJCQl9CisJCQlyZXR1cm4gdG9vbGJhclJlbmRlcmVyOworCQl9IGVsc2UgaWYgKHVpRWxlbWVudCBpbnN0YW5jZW9mIE1NZW51U2VwYXJhdG9yCisJCQkJfHwgdWlFbGVtZW50IGluc3RhbmNlb2YgTVRvb2xCYXJTZXBhcmF0b3IpIHsKKwkJCWlmIChzZXBhcmF0b3JSZW5kZXJlciA9PSBudWxsKSB7CisJCQkJc2VwYXJhdG9yUmVuZGVyZXIgPSBuZXcgU2VwYXJhdG9yUmVuZGVyZXIoKTsKKwkJCQlpbml0UmVuZGVyZXIoc2VwYXJhdG9yUmVuZGVyZXIpOworCQkJfQorCQkJcmV0dXJuIHNlcGFyYXRvclJlbmRlcmVyOworCQl9IGVsc2UgaWYgKHVpRWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJaWYgKGVsZW1lbnRSZWZSZW5kZXJlciA9PSBudWxsKSB7CisJCQkJZWxlbWVudFJlZlJlbmRlcmVyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VSZW5kZXJlcigpOworCQkJCWluaXRSZW5kZXJlcihlbGVtZW50UmVmUmVuZGVyZXIpOworCQkJfQorCQkJcmV0dXJuIGVsZW1lbnRSZWZSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmUpIHsKKwkJCWlmIChwZXJzcFJlbmRlcmVyID09IG51bGwpIHsKKwkJCQlwZXJzcFJlbmRlcmVyID0gbmV3IFBlcnNwZWN0aXZlUmVuZGVyZXIoKTsKKwkJCQlpbml0UmVuZGVyZXIocGVyc3BSZW5kZXJlcik7CisJCQl9CisJCQlyZXR1cm4gcGVyc3BSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykgeworCQkJaWYgKHBlcnNwU3RhY2tSZW5kZXJlciA9PSBudWxsKSB7CisJCQkJcGVyc3BTdGFja1JlbmRlcmVyID0gbmV3IFBlcnNwZWN0aXZlU3RhY2tSZW5kZXJlcigpOworCQkJCWluaXRSZW5kZXJlcihwZXJzcFN0YWNrUmVuZGVyZXIpOworCQkJfQorCQkJcmV0dXJuIHBlcnNwU3RhY2tSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFNhc2hDb250YWluZXIpIHsKKwkJCWlmIChwYXJ0U2FzaFJlbmRlcmVyID09IG51bGwpIHsKKwkJCQlwYXJ0U2FzaFJlbmRlcmVyID0gbmV3IFNhc2hSZW5kZXJlcigpOworCQkJCWluaXRSZW5kZXJlcihwYXJ0U2FzaFJlbmRlcmVyKTsKKwkJCX0KKwkJCXJldHVybiBwYXJ0U2FzaFJlbmRlcmVyOworCQl9IGVsc2UgaWYgKHVpRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spIHsKKwkJCWlmIChzdGFja1JlbmRlcmVyID09IG51bGwpIHsKKwkJCQlzdGFja1JlbmRlcmVyID0gbmV3IFN0YWNrUmVuZGVyZXIoKTsKKwkJCQlpbml0UmVuZGVyZXIoc3RhY2tSZW5kZXJlcik7CisJCQl9CisJCQlyZXR1cm4gc3RhY2tSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNVHJpbUJhcikgeworCQkJaWYgKHRyaW1CYXJSZW5kZXJlciA9PSBudWxsKSB7CisJCQkJdHJpbUJhclJlbmRlcmVyID0gbmV3IFRyaW1CYXJSZW5kZXJlcigpOworCQkJCWluaXRSZW5kZXJlcih0cmltQmFyUmVuZGVyZXIpOworCQkJfQorCQkJcmV0dXJuIHRyaW1CYXJSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpIHsKKwkJCWlmICh0b29sQ29udHJvbFJlbmRlcmVyID09IG51bGwpIHsKKwkJCQl0b29sQ29udHJvbFJlbmRlcmVyID0gbmV3IFRvb2xDb250cm9sUmVuZGVyZXIoKTsKKwkJCQlpbml0UmVuZGVyZXIodG9vbENvbnRyb2xSZW5kZXJlcik7CisJCQl9CisJCQlyZXR1cm4gdG9vbENvbnRyb2xSZW5kZXJlcjsKKwkJfSBlbHNlIGlmICh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNV2luZG93KSB7CisJCQlpZiAod2J3UmVuZGVyZXIgPT0gbnVsbCkgeworCQkJCXdid1JlbmRlcmVyID0gbmV3IFdCV1JlbmRlcmVyKCk7CisJCQkJaW5pdFJlbmRlcmVyKHdid1JlbmRlcmVyKTsKKwkJCX0KKwkJCXJldHVybiB3YndSZW5kZXJlcjsKKwkJfQorCisJCS8vIFdlIGNvdWxkIHJldHVybiBhbiAnbm8gcmVuZGVyZXInIHJlbmRlcmVyIGhlcmUgPz8KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdFJlbmRlcmVyKEFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyKSB7CisJCXJlbmRlcmVyLmluaXQoY29udGV4dCk7CisJCUNvbnRleHRJbmplY3Rpb25GYWN0b3J5LmluamVjdChyZW5kZXJlciwgY29udGV4dCk7CisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMuY29udGV4dC5zZXQoU0hBUkVEX0VMRU1FTlRTX1NUT1JFLAorCQkJCW5ldyBIYXNoTWFwPE1VSUVsZW1lbnQsIFNldDxNUGxhY2Vob2xkZXI+PigpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9yZW5kZXJlcnMvc3d0L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjMzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcmVuZGVyZXJzL3N3dC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxNCB2b2dlbGxhIEdtYkggIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAZ21haWwuY29tPiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVG9vbEJhck1hbmFnZXJSZW5kZXJlcl9NZW51Q2xvc2VUZXh0ID0gJkhpZGUKK1Rvb2xCYXJNYW5hZ2VyUmVuZGVyZXJfTWVudVJlc3RvcmVUZXh0ID0gJlJlc3RvcmUgSGlkZGVuIFRvb2xiYXIgRW50cmllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGVhOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0phdmFTRS0xLjciLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjllOTkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLm9wdGlvbnMKQEAgLTAsMCArMSw3IEBACitvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L2RlYnVnID0gZmFsc2UKK29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvdHJhY2UvY29tbWFuZHMgPSBmYWxzZQorb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC90cmFjZS9tZW51cyA9IGZhbHNlCitvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3RyYWNlL2VjbGlwc2UuY29udGV4dCA9IGZhbHNlCitvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3RyYWNlL2VjbGlwc2UuY29udGV4dC52ZXJib3NlID0gZmFsc2UKK29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvdHJhY2Uvd29ya2JlbmNoID0gZmFsc2UKK29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvdHJhY2UvcmVuZGVyZXIgPSBmYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjkwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLnByb2plY3QKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dDwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmRzLmNvcmUuYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNGZhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxjb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QiIHZlcnNpb249IjIiPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L0ZpbHRlcmVkVHJlZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHkuRmlsdGVyZWRUcmVlJE5vdGlmeWluZ1RyZWVWaWV3ZXIiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9Iktub3duIGV4dGVuc2lvbiIgaWQ9IjU3MTQ3MzkyOSI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRyZWVWaWV3ZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTm90aWZ5aW5nVHJlZVZpZXdlciIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyZTFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKQEAgLTAsMCArMSwyIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK2xpbmUuc2VwYXJhdG9yPVxuDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNzU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwzODYgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLmluaGVyaXROdWxsQW5ub3RhdGlvbnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubWlzc2luZ05vbk51bGxCeURlZmF1bHRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYW5ub3RhdGlvbi5ub25udWxsPW9yZy5lY2xpcHNlLmpkdC5hbm5vdGF0aW9uLk5vbk51bGwKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmFubm90YXRpb24ubm9ubnVsbGJ5ZGVmYXVsdD1vcmcuZWNsaXBzZS5qZHQuYW5ub3RhdGlvbi5Ob25OdWxsQnlEZWZhdWx0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm51bGxhYmxlPW9yZy5lY2xpcHNlLmpkdC5hbm5vdGF0aW9uLk51bGxhYmxlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5hbm5vdGF0aW9uLm51bGxhbmFseXNpcz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLm1ldGhvZFBhcmFtZXRlcnM9ZG8gbm90IGdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmV4cGxpY2l0bHlDbG9zZWRBdXRvQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZWZhdWx0Q2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRW51bUNhc2VEZXNwaXRlRGVmYXVsdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb249ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25udWxsUGFyYW1ldGVyQW5ub3RhdGlvbkRyb3BwZWQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsQW5ub3RhdGlvbkluZmVyZW5jZUNvbmZsaWN0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsU3BlY1Zpb2xhdGlvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsVW5jaGVja2VkQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxseVVuY2xvc2VkQ2xvc2VhYmxlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NPcHRpb25hbEVycm9ycz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGFjdGljTnVsbEFuYWx5c2lzRm9yRmllbGRzPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuYXZvaWRhYmxlR2VuZXJpY1R5cGVQcm9ibGVtcz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jbG9zZWRDbG9zZWFibGU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRXhjZXB0aW9uUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkT2JqZWN0QWxsb2NhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRUeXBlUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5PTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2xhbWJkYV9ib2R5PWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmI0YjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSw2NiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQorZm9ybWF0dGVyX3Byb2ZpbGU9b3JnLmVjbGlwc2UuamR0LnVpLmRlZmF1bHQuZWNsaXBzZV9wcm9maWxlCitmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgorb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07CitvcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9OTkKK29yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQorc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitzcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz1mYWxzZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9dHJ1ZQorc3BfY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitzcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitzcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz10cnVlCitzcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorc3BfY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitzcF9jbGVhbnVwLnVzZV9sYW1iZGE9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDllYzljCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLnByZWZzCkBAIC0wLDAgKzEsOTcgQEAKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRF9XSVRIT1VUX0RFRkFVTFRfVkFMVUU9RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9BUElfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9SRUVYUE9SVEVEX0FQSV9UWVBFPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1JFRVhQT1JURURfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFPUVycm9yCitBUElfVVNFX1NDQU5fRklFTERfU0VWRVJJVFk9RXJyb3IKK0FQSV9VU0VfU0NBTl9NRVRIT0RfU0VWRVJJVFk9RXJyb3IKK0FQSV9VU0VfU0NBTl9UWVBFX1NFVkVSSVRZPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfTUVUSE9EPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfUkVTVFJJQ1RJT05TPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9DT05TVFJVQ1RPUj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfU1VQRVJDTEFTUz1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX0NIQU5HRURfQ09OVFJBQ1RFRF9TVVBFUklOVEVSRkFDRVNfU0VUPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9FTlVNX0NPTlNUQU5UPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0FEREVEX1ZBTFVFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0ZJTkFMX1RPX05PTl9GSU5BTF9TVEFUSUNfQ09OU1RBTlQ9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX1NUQVRJQ19UT19TVEFUSUM9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQUxVRT1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9BUkdVTUVOVD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVkFMVUU9RXJyb3IKK0lMTEVHQUxfRVhURU5EPVdhcm5pbmcKK0lMTEVHQUxfSU1QTEVNRU5UPVdhcm5pbmcKK0lMTEVHQUxfSU5TVEFOVElBVEU9V2FybmluZworSUxMRUdBTF9PVkVSUklERT1XYXJuaW5nCitJTExFR0FMX1JFRkVSRU5DRT1XYXJuaW5nCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfU1VQRVJfSU5URVJGQUNFX1dJVEhfTUVUSE9EUz1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5WQUxJRF9KQVZBRE9DX1RBRz1XYXJuaW5nCitJTlZBTElEX1JFRkVSRU5DRV9JTl9TWVNURU1fTElCUkFSSUVTPUVycm9yCitMRUFLX0VYVEVORD1XYXJuaW5nCitMRUFLX0ZJRUxEX0RFQ0w9V2FybmluZworTEVBS19JTVBMRU1FTlQ9V2FybmluZworTEVBS19NRVRIT0RfUEFSQU09V2FybmluZworTEVBS19NRVRIT0RfUkVUVVJOX1RZUEU9V2FybmluZworTUVUSE9EX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fRklOQUxfVE9fRklOQUw9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fU1RBVElDX1RPX1NUQVRJQz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0FOTk9UQVRJT05fREVGQVVMVF9WQUxVRT1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitNSVNTSU5HX0VFX0RFU0NSSVBUSU9OUz1XYXJuaW5nCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQURERURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9BRERFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1VOVVNFRF9QUk9CTEVNX0ZJTFRFUlM9V2FybmluZworYXV0b21hdGljYWxseV9yZW1vdmVkX3VudXNlZF9wcm9ibGVtX2ZpbHRlcnM9ZmFsc2UKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uPUVycm9yCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uX2luY2x1ZGVfbWFqb3Jfd2l0aG91dF9icmVha2luZ19jaGFuZ2U9RGlzYWJsZWQKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb25faW5jbHVkZV9taW5vcl93aXRob3V0X2FwaV9jaGFuZ2U9RGlzYWJsZWQKK2ludmFsaWRfc2luY2VfdGFnX3ZlcnNpb249RXJyb3IKK21hbGZvcm1lZF9zaW5jZV90YWc9RXJyb3IKK21pc3Npbmdfc2luY2VfdGFnPUVycm9yCityZXBvcnRfYXBpX2JyZWFrYWdlX3doZW5fbWFqb3JfdmVyc2lvbl9pbmNyZW1lbnRlZD1EaXNhYmxlZAorcmVwb3J0X3Jlc29sdXRpb25fZXJyb3JzX2FwaV9jb21wb25lbnQ9V2FybmluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U1MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKQEAgLTAsMCArMSwzMiBAQAorY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCitjb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCitjb21waWxlcnMucC5idWlsZD0xCitjb21waWxlcnMucC5idWlsZC5iaW4uaW5jbHVkZXM9MQorY29tcGlsZXJzLnAuYnVpbGQuZW5jb2RpbmdzPTIKK2NvbXBpbGVycy5wLmJ1aWxkLmphdmEuY29tcGlsZXI9MgorY29tcGlsZXJzLnAuYnVpbGQuamF2YS5jb21wbGlhbmNlPTEKK2NvbXBpbGVycy5wLmJ1aWxkLm1pc3Npbmcub3V0cHV0PTEKK2NvbXBpbGVycy5wLmJ1aWxkLm91dHB1dC5saWJyYXJ5PTEKK2NvbXBpbGVycy5wLmJ1aWxkLnNvdXJjZS5saWJyYXJ5PTEKK2NvbXBpbGVycy5wLmJ1aWxkLnNyYy5pbmNsdWRlcz0xCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKK2NvbXBpbGVycy5wLmludGVybmFsPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTIKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0xCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tcmVxdWlyZS1idW5kbGU9MQorY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKK2NvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKK2NvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKK2NvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQorY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKK2NvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCitjb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYworY29tcGlsZXJzLnMub3Blbi10YWdzPTEKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5YzkwZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDUxIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Q7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMC4xMy4wLnF1YWxpZmllcgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuV29ya2JlbmNoU1dUQWN0aXZhdG9yCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHA7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iMC4xMC4wIiwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCisgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IjAuMS4wIiwKKyBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncztidW5kbGUtdmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHM7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKKyBvcmcuZWNsaXBzZS5jb3JlLmpvYnM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGk7YnVuZGxlLXZlcnNpb249IjEuMS4wIiwKKyBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjIwMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLm9zZ2k7YnVuZGxlLXZlcnNpb249IlszLjYuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMTEuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5lNC51aS5kaTtidW5kbGUtdmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLmVxdWlub3guZHMsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5ldmVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSIyLjcuMCIsCisgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCisgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcywKKyBvcmcuZWNsaXBzZS5yYXAuamZhY2UsCisgb3JnLmVjbGlwc2UucmFwLmpmYWNlLmRhdGFiaW5kaW5nLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucworUmVxdWlyZS1DYXBhYmlsaXR5OiBvcmcuZWNsaXBzZS5yYXAKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qsb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qsb3JnLmVjbGlwc2UudWkud29ya2JlbmNoIiwKKyBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LmhhbmRsZXJzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5mYWN0b3JpZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qsb3JnLmVjbGlwc2UudWkud29ya2JlbmNoIiwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QiLAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dCxvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giCitJbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjIuMSIsCisgamF2YXguYW5ub3RhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCisgamF2YXguaW5qZWN0O3ZlcnNpb249IjEuMC4wIiwKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249IjEuMi4wIiwKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWc7dmVyc2lvbj0iMS4xLjAiLAorIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjUuMCIsCisgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj0iMS4yLjAiLAorIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjQuMCIsCisgb3JnLnczYy5kb20uY3NzO3ZlcnNpb249IjIuMC4wIgorU2VydmljZS1Db21wb25lbnQ6IE9TR0ktSU5GL3Rlc3RhYmxlb2JqZWN0LnhtbCwgT1NHSS1JTkYvc3RhdHVzcmVwb3J0ZXIueG1sLAorIE9TR0ktSU5GL21lbnVzZXJ2aWNlLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L01FVEEtSU5GL3AyLmluZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9NRVRBLUlORi9wMi5pbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9NRVRBLUlORi9wMi5pbmYKQEAgLTAsMCArMSwxMyBAQAorIyBFbnN1cmUgdGhhdCBtb2RpZmllZCBSQVAgZTQgcGxhdGZvcm0gYnVuZGxlcyBhcmUgb25seSBpbnN0YWxsZWQgaW4gUkFQIGVudmlyb25tZW50CisjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTExNzcKKyMgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MDkyMgorCisjIE1ha2Ugc3VyZSB0aGF0IGEgUkFQIFJXVCBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUKK3JlcXVpcmVzLjAubmFtZXNwYWNlID0gb3JnLmVjbGlwc2UucmFwCityZXF1aXJlcy4wLm5hbWUgPSBvcmcuZWNsaXBzZS5yYXAucnd0CisKKyMgRG8gbm90IGFsbG93IHRvIGluc3RhbGwgdGhpcyBJVSBpbiBjYXNlIHRoZSBTV1QgYnVuZGxlIGlzIGF2YWlsYWJsZQorcmVxdWlyZXMuMS5uYW1lc3BhY2UgPSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1CityZXF1aXJlcy4xLm5hbWUgPSBvcmcuZWNsaXBzZS5zd3QKK3JlcXVpcmVzLjEubWluID0gMAorcmVxdWlyZXMuMS5tYXggPSAwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvT1NHSS1JTkYvbWVudXNlcnZpY2UueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L09TR0ktSU5GL21lbnVzZXJ2aWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZjZmIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L09TR0ktSU5GL21lbnVzZXJ2aWNlLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2NyOmNvbXBvbmVudCB4bWxuczpzY3I9Imh0dHA6Ly93d3cub3NnaS5vcmcveG1sbnMvc2NyL3YxLjEuMCIgbmFtZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5tZW51U2VydmljZSI+CisgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuTWVudVNlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uIi8+CisgICA8c2VydmljZT4KKyAgICAgIDxwcm92aWRlIGludGVyZmFjZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JQ29udGV4dEZ1bmN0aW9uIi8+CisgICA8L3NlcnZpY2U+CisgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5jb250ZXh0LmtleSIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuRU1lbnVTZXJ2aWNlIi8+Cis8L3Njcjpjb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvT1NHSS1JTkYvc3RhdHVzcmVwb3J0ZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L09TR0ktSU5GL3N0YXR1c3JlcG9ydGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBlNmExCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L09TR0ktSU5GL3N0YXR1c3JlcG9ydGVyLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2NyOmNvbXBvbmVudCB4bWxuczpzY3I9Imh0dHA6Ly93d3cub3NnaS5vcmcveG1sbnMvc2NyL3YxLjEuMCIgbmFtZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5zdGF0dXNSZXBvcnRlciI+CisgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuU3RhdHVzUmVwb3J0ZXJDcmVhdGlvbkZ1bmN0aW9uIi8+CisgICA8c2VydmljZT4KKyAgICAgIDxwcm92aWRlIGludGVyZmFjZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JQ29udGV4dEZ1bmN0aW9uIi8+CisgICA8L3NlcnZpY2U+CisgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5jb250ZXh0LmtleSIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5zdGF0dXNyZXBvcnRlci5TdGF0dXNSZXBvcnRlciIvPgorPC9zY3I6Y29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L09TR0ktSU5GL3Rlc3RhYmxlb2JqZWN0LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9PU0dJLUlORi90ZXN0YWJsZW9iamVjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliYjcwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9PU0dJLUlORi90ZXN0YWJsZW9iamVjdC54bWwKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIG5hbWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RpbmcuVGVzdGFibGVPYmplY3QiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkU0VGVzdGFibGUiLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS51aS50ZXN0aW5nLlRlc3RhYmxlT2JqZWN0Ii8+CisgICA8L3NlcnZpY2U+Cis8L3Njcjpjb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+Tm92ZW1iZXIgMjAsIDIwMDg8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmJiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgLm9wdGlvbnMsXAorICAgICAgICAgICAgICAgT1NHSS1JTkYvLFwKKyAgICAgICAgICAgICAgIGljb25zLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitzb3VyY2UuLiA9IHNyYy8KK3NyYy5pbmNsdWRlcyA9IGljb25zLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sCitqcmUuY29tcGlsYXRpb24ucHJvZmlsZSA9IEphdmFTRS0xLjcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9mb3JjZVF1YWxpZmllclVwZGF0ZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvZm9yY2VRdWFsaWZpZXJVcGRhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDg4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvZm9yY2VRdWFsaWZpZXJVcGRhdGUudHh0CkBAIC0wLDAgKzEsNiBAQAorIyBUbyBmb3JjZSBhIHZlcnNpb24gcXVhbGlmaWVyIHVwZGF0ZSBhZGQgdGhlIGJ1ZyBoZXJlCitCdWcgNDAzMzUyIC0gVXBkYXRlIGFsbCBwYXJlbnQgdmVyc2lvbnMgdG8gbWF0Y2ggb3VyIGJ1aWxkIHN0cmVhbQorQnVnIDQwNzk2MSAtIENvbXBhcmF0b3IgbG9nIHNob3dzIHNwZWNpYWwgcHJvYmxlbSB0aGF0IHdpbGwgcmVxdWlyZSAidG91Y2hlcyIKK0J1ZyA0MTY4OTggLSBTb21lIFBsYXRmb3JtIFVJIGJ1bmRsZXMgbmVlZCB0byBiZSB0b3VjaGVkIHRvIGdldCBBUEkgZGVzY3JpcHRpb25zIGJhY2sKK0J1ZyA0MjkxODQgLSBbTWV0YWRhdGFdIGNvbXBhcmF0b3IgZXJyb3JzIGluIG1vc3QgcmVjZW50IEktYnVpbGRzCisKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9pY29ucy9mdWxsL2R0b29sMTYvY2xlYXJfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L2ljb25zL2Z1bGwvZHRvb2wxNi9jbGVhcl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzMjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9pY29ucy9mdWxsL2R0b29sMTYvY2xlYXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9pY29ucy9mdWxsL2V0b29sMTYvY2xlYXJfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L2ljb25zL2Z1bGwvZXRvb2wxNi9jbGVhcl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzOTM1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9pY29ucy9mdWxsL2V0b29sMTYvY2xlYXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9pY29ucy9mdWxsL29iajE2L2ZsZHJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9pY29ucy9mdWxsL29iajE2L2ZsZHJfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU3MDNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE3YmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbHVnaW5OYW1lID0gRWNsaXBzZSBlNCBXb3JrYmVuY2ggU1dUCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCitleHRlbnNpb24uZTRhcHBsaWNhdGlvbi5uYW1lID0gRTQgQXBwbGljYXRpb24KK2V4dGVuc2lvbi5nZW5lcmF0ZXRvcGljLm5hbWUgPSBJbnRlcm5hbCBNb2RlbCBUb3BpYyBHZW5lcmF0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzllNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvcGx1Z2luLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgorPCEtLQorICAgICBDb3B5cmlnaHQgKGMpIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIC0tPgorPHBsdWdpbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIGlkPSJFNEFwcGxpY2F0aW9uIgorICAgICAgICAgbmFtZT0iJWV4dGVuc2lvbi5lNGFwcGxpY2F0aW9uLm5hbWUiCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+CisgICAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGNhcmRpbmFsaXR5PSJzaW5nbGV0b24tZ2xvYmFsIgorICAgICAgICAgICAgdGhyZWFkPSJtYWluIgorICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+CisgICAgICAgICA8cnVuCisgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5FNEFwcGxpY2F0aW9uIj4KKyAgICAgICAgIDwvcnVuPgorICAgICAgPC9hcHBsaWNhdGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgaWQ9IkdlblRvcGljIgorICAgICAgICAgbmFtZT0iJWV4dGVuc2lvbi5nZW5lcmF0ZXRvcGljLm5hbWUiCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+CisgICAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGNhcmRpbmFsaXR5PSJzaW5nbGV0b24tZ2xvYmFsIgorICAgICAgICAgICAgdGhyZWFkPSJtYWluIgorICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+CisgICAgICAgICA8cnVuCisgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5HZW5Ub3BpYyI+CisgICAgICAgICA8L3J1bj4KKyAgICAgIDwvYXBwbGljYXRpb24+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuU2VsZWN0aW9uQWRhcHRlckZhY3RvcnkiPgorICAgICAgICAgPGFkYXB0ZXIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUl0ZXJhYmxlIj4KKyAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgICAgIDxhZGFwdGVyCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklDb3VudGFibGUiPgorICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgPC9mYWN0b3J5PgorICAgPC9leHRlbnNpb24+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9wb20ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9wb20ueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5yYXAuZTQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Q8L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjAuMTMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UucmFwLmU0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQtcmVsZW5nPC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcmVsZW5nL3JlbGVuZy10YXJnZXQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDwhLS0gdG8gZW5zdXJlIHRoYXQgdGhlIGZlYXR1cmUgbG9va3VwIG9mIHRoZSB1aSB0ZXN0IHdvcmtzIC0tPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GLzwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHljaG8tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0Fic3RyYWN0UGFydFJlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvQWJzdHJhY3RQYXJ0UmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjVhMjYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0Fic3RyYWN0UGFydFJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQGdtYWlsLmNvbT4gLSBCdWcgNDI5NzI4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFydFJlbmRlcmVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05JTkdfTUUgPSAibW9kZWxFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAorCisJcHJvdGVjdGVkIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCXByb3RlY3RlZCBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCXB1YmxpYyB2b2lkIGluaXQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwkJbW9kZWxTZXJ2aWNlID0gY29udGV4dC5nZXQoRU1vZGVsU2VydmljZS5jbGFzcyk7CisJfQorCisJcHVibGljIGFic3RyYWN0IE9iamVjdCBjcmVhdGVXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50KTsKKworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NDb250ZW50cyhNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIpOworCisJcHVibGljIHZvaWQgcG9zdFByb2Nlc3MoTVVJRWxlbWVudCBjaGlsZEVsZW1lbnQpIHsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiaW5kV2lkZ2V0KE1VSUVsZW1lbnQgbWUsIE9iamVjdCB3aWRnZXQpOworCisJcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRQYXJlbnRXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50KTsKKworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2VXaWRnZXQoTVVJRWxlbWVudCBwYXJ0KTsKKworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGhvb2tDb250cm9sbGVyTG9naWMoZmluYWwgTVVJRWxlbWVudCBtZSk7CisKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGlsZFJlbmRlcmVkKAorCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50RWxlbWVudCwgTVVJRWxlbWVudCBlbGVtZW50KTsKKworCXB1YmxpYyB2b2lkIGhpZGVDaGlsZChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50LAorCQkJTVVJRWxlbWVudCBjaGlsZCkgeworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0SW1hZ2UoTVVJTGFiZWwgZWxlbWVudCk7CisKKwkvLworCS8vIHB1YmxpYyBPYmplY3QgY3JlYXRlTWVudShPYmplY3Qgd2lkZ2V0T2JqZWN0LCBNTWVudSBtZW51KSB7CisJLy8gcmV0dXJuIG51bGw7CisJLy8gfQorCS8vCisJLy8gcHVibGljIE9iamVjdCBjcmVhdGVUb29sQmFyKE9iamVjdCB3aWRnZXRPYmplY3QsIE1Ub29sQmFyIHRvb2xCYXIpIHsKKwkvLyByZXR1cm4gbnVsbDsKKwkvLyB9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBwYXJlbnQgY29udGV4dCBmb3IgdGhpcyBwYXJ0LgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tCisJICogQHJldHVybiB0aGUgcGFyZW50J3MgY2xvc2VzdCBjb250ZXh0LCBvciBnbG9iYWwgY29udGV4dCBpZiBub25lIGluIHRoZQorCSAqICAgICAgICAgaGllcmFyY2h5CisJICovCisJcHJvdGVjdGVkIElFY2xpcHNlQ29udGV4dCBnZXRDb250ZXh0Rm9yUGFyZW50KE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gbW9kZWxTZXJ2aWNlLmdldENvbnRhaW5pbmdDb250ZXh0KGVsZW1lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIGNvbnRleHQgZm9yIHRoaXMgcGFydC4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbQorCSAqIEByZXR1cm4gdGhlIGNsb3Nlc3QgY29udGV4dCwgb3IgZ2xvYmFsIGNvbnRleHQgaWYgbm9uZSBpbiB0aGUgaGllcmFyY2h5CisJICovCisJcHJvdGVjdGVkIElFY2xpcHNlQ29udGV4dCBnZXRDb250ZXh0KE1VSUVsZW1lbnQgcGFydCkgeworCQlpZiAocGFydCBpbnN0YW5jZW9mIE1Db250ZXh0KSB7CisJCQlyZXR1cm4gKChNQ29udGV4dCkgcGFydCkuZ2V0Q29udGV4dCgpOworCQl9CisJCXJldHVybiBnZXRDb250ZXh0Rm9yUGFyZW50KHBhcnQpOworCX0KKworCS8qKgorCSAqIEFjdGl2YXRlIHRoZSBwYXJ0IGluIHRoZSBoaWVyYXJjaHkuIFRoaXMgc2hvdWxkIGVpdGhlciBzdGlsbCBiZSBpbnRlcm5hbAorCSAqIG9yIGJlIGEgcHVibGljIG1ldGhvZCBzb21ld2hlcmUgZWxzZS4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICovCisJcHVibGljIHZvaWQgYWN0aXZhdGUoTVBhcnQgZWxlbWVudCkgeworCQlJRWNsaXBzZUNvbnRleHQgY3VyQ29udGV4dCA9IGdldENvbnRleHQoZWxlbWVudCk7CisJCWlmIChjdXJDb250ZXh0ICE9IG51bGwpIHsKKwkJCUVQYXJ0U2VydmljZSBwcyA9IChFUGFydFNlcnZpY2UpIGN1ckNvbnRleHQuZ2V0KEVQYXJ0U2VydmljZS5jbGFzcworCQkJCQkuZ2V0TmFtZSgpKTsKKwkJCWlmIChwcyAhPSBudWxsKQorCQkJCXBzLmFjdGl2YXRlKGVsZW1lbnQsIHJlcXVpcmVzRm9jdXMoZWxlbWVudCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgaWYgYWN0aXZhdGluZyB7QGNvZGUgZWxlbWVudH0gcmVxdWlyZXMgdGhhdCB0aGUgcGFydCBzZXQgdGhlIGZvY3VzLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcnQgcmVxdWlyZXMgZm9jdXMKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZXF1aXJlc0ZvY3VzKE1QYXJ0IGVsZW1lbnQpOworCisJcHVibGljIHZvaWQgcmVtb3ZlR3VpKE1VSUVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHdpZGdldCkgeworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0VUlDb250YWluZXIoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50LmdldFBhcmVudCgpICE9IG51bGwpCisJCQlyZXR1cm4gZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRXaWRnZXQoKTsKKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBGb3JjZSB0aGUgVUkgZm9jdXMgaW50byB0aGUgZWxlbWVudCBpZiBwb3NzaWJsZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdAorCSAqIGJlIGNhbGxlZCBkaXJlY3RseSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIElQcmVzZW50YXRpb25FbmdpbmUjZm9jdXNHdWkKKwkgKiBtZXRob2QgaWYgdGhlIG5vcm1hbCBwcm9jZXNzIHVzZWQgdG8gc2V0IHRoZSBmb2N1cyBjYW5ub3QgYmUgcGVyZm9ybWVkLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmb3JjZUZvY3VzKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQkvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbUVsZW1lbnQKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0eWxlIG92ZXJyaWRlIGJpdHMgb3IgLTEgaWYgdGhlcmUgaXMgbm8gb3ZlcnJpZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0eWxlT3ZlcnJpZGUoTVVJRWxlbWVudCBtRWxlbWVudCkgeworCQlTdHJpbmcgb3ZlcnJpZGVTdHIgPSBtRWxlbWVudC5nZXRQZXJzaXN0ZWRTdGF0ZSgpLmdldCgKKwkJCQlJUHJlc2VudGF0aW9uRW5naW5lLlNUWUxFX09WRVJSSURFX0tFWSk7CisJCWlmIChvdmVycmlkZVN0ciA9PSBudWxsIHx8IG92ZXJyaWRlU3RyLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gLTE7CisKKwkJaW50IHZhbCA9IC0xOworCQl2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KG92ZXJyaWRlU3RyKTsKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvQW5pbWF0aW9uRW5naW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvQW5pbWF0aW9uRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkY2U1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9BbmltYXRpb25FbmdpbmUuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogVGhpcyBqb2IgY3JlYXRlcyBhbiBBbmltYXRpb24gRW5naW5lIHRoYXQgdXNlcyBhbiBBbmltYXRpb24gRmVlZGJhY2sgdG8KKyAqIHJlbmRlciB0aGUgYW5pbWF0aW9uLiBUbyBiZWdpbiB0aGUgYW5pbWF0aW9uLCBpbnN0YW50aWF0ZSB0aGlzIG9iamVjdCB0aGVuCisgKiBjYWxsIHNjaGVkdWxlKCkuCisgKgorICogQHNpbmNlIDMuMworICoKKyAqLworcHVibGljIGNsYXNzIEFuaW1hdGlvbkVuZ2luZSBleHRlbmRzIEpvYiB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElDS19USU1FUiA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfQ09VTlQgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVubGltaXRlZER1cmF0aW9uID0gLTE7CisKKwlwcml2YXRlIGJvb2xlYW4gZW5hYmxlQW5pbWF0aW9uczsKKwlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOworCXByaXZhdGUgbG9uZyBjdXJUaW1lOworCXByaXZhdGUgbG9uZyBwcmV2VGltZTsKKwlwcml2YXRlIGludCB0aW1pbmdTdHlsZSA9IFRJQ0tfVElNRVI7CisJcHJpdmF0ZSBsb25nIGZyYW1lQ291bnQ7CisJcHJpdmF0ZSBib29sZWFuIGFuaW1hdGlvbkNhbmNlbGVkID0gZmFsc2U7CisJcHJpdmF0ZSBsb25nIHNsZWVwQW1vdW50OworCisJcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7CisJcHJpdmF0ZSBBbmltYXRpb25GZWVkYmFja0Jhc2UgZmVlZGJhY2tSZW5kZXJlcjsKKwlwcml2YXRlIGludCBkdXJhdGlvbjsKKworCXB1YmxpYyBBbmltYXRpb25FbmdpbmUoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsCisJCQlBbmltYXRpb25GZWVkYmFja0Jhc2UgYW5pbWF0aW9uRmVlZGJhY2ssIGludCBkdXJhdGlvbkluKSB7CisJCXRoaXMoY29udGV4dCwgYW5pbWF0aW9uRmVlZGJhY2ssIGR1cmF0aW9uSW4sIDApOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gQW5pbWF0aW9uIHRoYXQgd2lsbCBydW4gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgorCSAqCisJICogQHBhcmFtIGFuaW1hdGlvbkZlZWRiYWNrCisJICogICAgICAgICAgICBwcm92aWRlcyByZW5kZXJTdGVwKCksIGluaXRpYWxpemUoKSBhbmQgam9iSW5pdCgpIG1ldGhvZHMKKwkgKiBAcGFyYW0gZHVyYXRpb25JbgorCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvdmVyIHdoaWNoIHRoZSBhbmltYXRpb24gd2lsbCBydW4KKwkgKiBAcGFyYW0gc2xlZXBBbW91bnRJbgorCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbG93L2RlbGF5IHRoZSBhbmltYXRpb24KKwkgKi8KKwlwdWJsaWMgQW5pbWF0aW9uRW5naW5lKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LAorCQkJQW5pbWF0aW9uRmVlZGJhY2tCYXNlIGFuaW1hdGlvbkZlZWRiYWNrLCBpbnQgZHVyYXRpb25JbiwKKwkJCWxvbmcgc2xlZXBBbW91bnRJbikgeworCQlzdXBlcigiRTQgQW5pbWF0aW9uIik7CisJCXNsZWVwQW1vdW50ID0gc2xlZXBBbW91bnRJbjsKKwkJZmVlZGJhY2tSZW5kZXJlciA9IGFuaW1hdGlvbkZlZWRiYWNrOworCQlkdXJhdGlvbiA9IGR1cmF0aW9uSW47CisKKwkJLy8gaWYgYW5pbWF0aW9ucyBhcmVuJ3Qgb24gdGhpcyBpcyBhIE5PLU9QCisJCWVuYWJsZUFuaW1hdGlvbnMgPSBmYWxzZTsKKwkJaWYgKGNvbnRleHQuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuQU5JTUFUSU9OU19FTkFCTEVEKSAhPSBudWxsKQorCQkJZW5hYmxlQW5pbWF0aW9ucyA9IChCb29sZWFuKSBjb250ZXh0CisJCQkJCS5nZXQoSVByZXNlbnRhdGlvbkVuZ2luZS5BTklNQVRJT05TX0VOQUJMRUQpOworCQlpZiAoIWVuYWJsZUFuaW1hdGlvbnMpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWFuaW1hdGlvbkNhbmNlbGVkID0gZmFsc2U7CisKKwkJLy8gQ2FwdHVyZSBwYXJhbWV0ZXJzCisJCWRpc3BsYXkgPSBmZWVkYmFja1JlbmRlcmVyLmdldEFuaW1hdGlvblNoZWxsKCkuZ2V0RGlzcGxheSgpOworCisJCWFuaW1hdGlvbkZlZWRiYWNrLmdldEFuaW1hdGlvblNoZWxsKCkuYWRkRGlzcG9zZUxpc3RlbmVyKAorCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCQkJY2FuY2VsQW5pbWF0aW9uKCk7CisJCQkJCX0KKwkJCQl9KTsKKworCQkvLyBEb24ndCBzaG93IHRoZSBqb2IgaW4gbW9uaXRvcnMKKwkJc2V0U3lzdGVtKHRydWUpOworCisJCS8vIFNldCBpdCB1cAorCQlmZWVkYmFja1JlbmRlcmVyLmluaXRpYWxpemUodGhpcyk7CisKKwkJLy8gU2V0IHRoZSBhbmltYXRpb24ncyBpbml0aWFsIHN0YXRlCisJCWN1clRpbWUgPSBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCX0KKworCS8qKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcmVuZGVyZXIKKwkgKi8KKwlwdWJsaWMgQW5pbWF0aW9uRmVlZGJhY2tCYXNlIGdldEZlZWRiYWNrKCkgeworCQlyZXR1cm4gZmVlZGJhY2tSZW5kZXJlcjsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGFuaW1hdGlvblN0ZXAgPSBuZXcgUnVubmFibGUoKSB7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWlmIChhbmltYXRpb25DYW5jZWxlZCkKKwkJCQlyZXR1cm47CisKKwkJCS8vIENhcHR1cmUgdGltZQorCQkJcHJldlRpbWUgPSBjdXJUaW1lOworCQkJY3VyVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCQlpZiAoaXNVcGRhdGVTdGVwKCkpIHsKKwkJCQl1cGRhdGVEaXNwbGF5KCk7CisJCQkJZnJhbWVDb3VudCsrOworCQkJfQorCQl9CisKKwl9OworCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlzcGxheSgpIHsKKwkJaWYgKGFuaW1hdGlvbkNhbmNlbGVkKQorCQkJcmV0dXJuOworCisJCWZlZWRiYWNrUmVuZGVyZXIucmVuZGVyU3RlcCh0aGlzKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0ZVN0ZXAoKSB7CisJCWlmIChkdXJhdGlvbiA9PSB1bmxpbWl0ZWREdXJhdGlvbiB8fCB0aW1pbmdTdHlsZSA9PSBGUkFNRV9DT1VOVCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvLyBEZWZhdWx0IHRvICdUSUNLX1RJTUVSJywgdXBkYXRlIHdoZW4gdGhlIHN5c3RlbSB0aW1lciBjaGFuZ2VzCisJCXJldHVybiBwcmV2VGltZSAhPSBjdXJUaW1lOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBkb25lKCkgeworCQlyZXR1cm4gYW5pbWF0aW9uQ2FuY2VsZWQgfHwgYW1vdW50KCkgPj0gMS4wOworCX0KKworCXB1YmxpYyBkb3VibGUgYW1vdW50KCkgeworCQlpZiAoZHVyYXRpb24gPT0gdW5saW1pdGVkRHVyYXRpb24pIHsKKwkJCXJldHVybiAwOworCQl9CisJCWRvdWJsZSBhbW91bnQgPSAwLjA7CisJCXN3aXRjaCAodGltaW5nU3R5bGUpIHsKKwkJY2FzZSBUSUNLX1RJTUVSOgorCQkJYW1vdW50ID0gKGRvdWJsZSkgKGN1clRpbWUgLSBzdGFydFRpbWUpIC8gKGRvdWJsZSkgZHVyYXRpb247CisJCQlicmVhazsKKworCQkvLyBGb3IgdGVzdGluZyBwdXJwb3NlcworCQljYXNlIEZSQU1FX0NPVU5UOgorCQkJYW1vdW50ID0gKGRvdWJsZSkgZnJhbWVDb3VudCAvIChkb3VibGUpIGR1cmF0aW9uOworCQl9CisKKwkJaWYgKGFtb3VudCA+IDEuMCkKKwkJCWFtb3VudCA9IDEuMDsKKworCQlyZXR1cm4gYW1vdW50OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJLy8gV2UgdXNlIHByZWZlcmVuY2UgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZQorCQkvLyBza2lwcGVkIG9uIHRoaXMgcGxhdGZvcm0uCisJCWlmICghZW5hYmxlQW5pbWF0aW9ucykgeworCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCX0KKworCQkvLyBXZSdyZSBzdGFydGluZywgaW5pdGlhbGl6ZQorCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCS8vICdqb2JJbml0JyByZXR1cm5zICdmYWxzZScgaWYgaXQgZG9lc24ndCB3YW50IHRvIHJ1bi4uLgorCQkJCWlmICghYW5pbWF0aW9uQ2FuY2VsZWQpCisJCQkJCWFuaW1hdGlvbkNhbmNlbGVkID0gIWZlZWRiYWNrUmVuZGVyZXIKKwkJCQkJCQkuam9iSW5pdChBbmltYXRpb25FbmdpbmUudGhpcyk7CisJCQl9CisJCX0pOworCisJCWlmIChhbmltYXRpb25DYW5jZWxlZCkKKwkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKworCQkvLyBPbmx5IHN0YXJ0IHRoZSBhbmltYXRpb24gdGltZXIgLWFmdGVyLSB3ZSd2ZSBpbml0aWFsaXplZAorCQljdXJUaW1lID0gc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJd2hpbGUgKCFkb25lKCkgJiYgIWFuaW1hdGlvbkNhbmNlbGVkKSB7CisJCQlkaXNwbGF5LnN5bmNFeGVjKGFuaW1hdGlvblN0ZXApOworCisJCQkvLyBEb24ndCBwaW4gdGhlIENQVQorCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoc2xlZXBBbW91bnQpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisKKwkJaWYgKGFuaW1hdGlvbkNhbmNlbGVkKQorCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCisJCS8vIFdlJ3JlIGRvbmUsIGNsZWFuIHVwCisJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZmVlZGJhY2tSZW5kZXJlci5kaXNwb3NlKCk7CisJCQl9CisJCX0pOworCisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCXB1YmxpYyB2b2lkIGNhbmNlbEFuaW1hdGlvbigpIHsKKwkJYW5pbWF0aW9uQ2FuY2VsZWQgPSB0cnVlOworCQlmZWVkYmFja1JlbmRlcmVyLmRpc3Bvc2UoKTsKKwkJY2FuY2VsKCk7CisJfQorCisJcHVibGljIGxvbmcgZ2V0RnJhbWVDb3VudCgpIHsKKwkJcmV0dXJuIGZyYW1lQ291bnQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0FuaW1hdGlvbkZlZWRiYWNrQmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0FuaW1hdGlvbkZlZWRiYWNrQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYmE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvQW5pbWF0aW9uRmVlZGJhY2tCYXNlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCisvKioKKyAqIEFuaW1hdGlvbkZlZWRCYWNrQmFzZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyByZW5kZXJTdGVwKCksCisgKiBqb2JJbml0KCkgYW5kIGluaXRpYWxpemUoKSBtZXRob2RzIGZvciBBbmltYXRpb25FbmdpbmUuIEl0cyB0aGUgYmFzZSBjbGFzcworICogZm9yIGFsbCB0aGUgYW5pbWF0aW9uRmVlZGJhY2tzCisgKgorICogQHNpbmNlIDMuMworICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hdGlvbkZlZWRiYWNrQmFzZSB7CisJcHJpdmF0ZSBBbmltYXRpb25FbmdpbmUgZW5naW5lOworCXByaXZhdGUgU2hlbGwgYmFzZVNoZWxsOworCXByaXZhdGUgU2hlbGwgYW5pbWF0aW9uU2hlbGwgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBBbmltYXRpb25GZWVkYmFjaworCSAqCisJICogQHBhcmFtIHBhcmVudFNoZWxsCisJICogICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGNvbXBvc2l0ZSB3aGVyZSB0aGUgYW5pbWF0aW9uIHdpbGwgYmUgZHJhd24KKwkgKi8KKwlwdWJsaWMgQW5pbWF0aW9uRmVlZGJhY2tCYXNlKFNoZWxsIHBhcmVudFNoZWxsKSB7CisJCWJhc2VTaGVsbCA9IHBhcmVudFNoZWxsOworCisJCWJhc2VTaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQlpZiAoZW5naW5lICE9IG51bGwpCisJCQkJCWVuZ2luZS5jYW5jZWxBbmltYXRpb24oKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogUGVyZm9ybSBhbnkgaW5pdGlhbGl6YXRpb24geW91IHdhbnQgdG8gZG8gLXByaW9yLSB0byB0aGUgSm9iIGFjdHVhbGx5CisJICogZ2V0cyBzY2hlZHVsZWQuCisJICoKKwkgKiBAcGFyYW0gYW5pbWF0aW9uRW5naW5lCisJICogICAgICAgICAgICBUaGUgZW5naW5lIHdlJ3JlIGhvc3RlZCBpbi4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplKEFuaW1hdGlvbkVuZ2luZSBhbmltYXRpb25FbmdpbmUpOworCisJLyoqCisJICogSXRzIGEgZHJhdyBtZXRob2QuIEFsbCB0aGUgY29kZSB0byByZW5kZXIgYW4gYW5pbWF0aW9uIGdvZXMgaW4gdGhpcworCSAqIG1ldGhvZC4KKwkgKgorCSAqIEBwYXJhbSBlbmdpbmUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW5kZXJTdGVwKEFuaW1hdGlvbkVuZ2luZSBlbmdpbmUpOworCisJLyoqCisJICogUGVyZm9ybSBhbnkgaW5pdGlhbGl6YXRpb24geW91IHdhbnQgdG8gaGF2ZSBoYXBwZW4gLWJlZm9yZS0gdGhlIGFuaW1hdGlvbgorCSAqIHN0YXJ0cy4gU3ViY2xhc3NlcyBtYXkgc3ViY2xhc3MgYnV0IG5vdCBvdmVycmlkZSAoaS5lLiB5b3UgaGF2ZSB0byBjYWxsCisJICogc3VwZXIpLgorCSAqCisJICogQHBhcmFtIGVuZ2luZQorCSAqICAgICAgICAgICAgVGhlIEFuaW1hdGlvbkVuZ2luZSBob3N0aW5nIHRoZSBmZWVkYmFjaworCSAqIEByZXR1cm4gJ3RydWUnIGlmZiB0aGUgYW5pbWF0aW9uIGlzIGNhcGFibGUgb2YgcnVubmluZworCSAqLworCXB1YmxpYyBib29sZWFuIGpvYkluaXQoQW5pbWF0aW9uRW5naW5lIGVuZ2luZSkgeworCQl0aGlzLmVuZ2luZSA9IGVuZ2luZTsKKwkJcmV0dXJuIGVuZ2luZSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIERpc3Bvc2UgYW55IGxvY2FsbHkgY3JlYXRlZCByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAoYW5pbWF0aW9uU2hlbGwgIT0gbnVsbCAmJiAhYW5pbWF0aW9uU2hlbGwuaXNEaXNwb3NlZCgpKQorCQkJYW5pbWF0aW9uU2hlbGwuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gVGhlIHNoZWxsIHRoaXMgYW5pbWF0aW9uIGlzIGJlaW5nIHJlbmRlcmVkICdvbicKKwkgKi8KKwlwdWJsaWMgU2hlbGwgZ2V0QmFzZVNoZWxsKCkgeworCQlyZXR1cm4gYmFzZVNoZWxsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gQSBzaGVsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbmRlciB0aGUgYW5pbWF0aW9uIG9uCisJICovCisJcHVibGljIFNoZWxsIGdldEFuaW1hdGlvblNoZWxsKCkgeworCQlpZiAoYW5pbWF0aW9uU2hlbGwgPT0gbnVsbCkgeworCQkJYW5pbWF0aW9uU2hlbGwgPSBuZXcgU2hlbGwoZ2V0QmFzZVNoZWxsKCksIFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7CisKKwkJCWFuaW1hdGlvblNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7CisJCQkJCWlmIChlbmdpbmUgIT0gbnVsbCkKKwkJCQkJCWVuZ2luZS5jYW5jZWxBbmltYXRpb24oKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCisJCXJldHVybiBhbmltYXRpb25TaGVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9DU1NDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9DU1NDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVjNDgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0NTU0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworCitwdWJsaWMgY2xhc3MgQ1NTQ29uc3RhbnRzIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQlVTWV9DTEFTUyA9ICJidXN5IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19BQ1RJVkVfQ0xBU1MgPSBJUHJlc2VudGF0aW9uRW5naW5lLkFDVElWRTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19OT19GT0NVU19DTEFTUyA9ICJub0ZvY3VzIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ISUdITElHSFRFRF9DTEFTUyA9ICJoaWdobGlnaHRlZCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ09OVEVOVF9DSEFOR0VfQ0xBU1MgPSAiY29udGVudENoYW5nZSI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0NTU1JlbmRlcmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvQ1NTUmVuZGVyaW5nVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg3YjFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0NTU1JlbmRlcmluZ1V0aWxzLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKKworcHVibGljIGNsYXNzIENTU1JlbmRlcmluZ1V0aWxzIHsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVfSU1BR0VfUFJPUCA9ICJmcmFtZS1pbWFnZSI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEFORExFX0lNQUdFX1BST1AgPSAiaGFuZGxlLWltYWdlIjsKKworCS8vIE5PVEU6IFRoZSBDU1MgZW5naW5lICdvd25zJyB0aGUgaW1hZ2UgaXQgcmV0dXJucyAoaXQgY2FjaGVzIGl0KQorCS8vIHNvIHdlIGhhdmUgdG8gY2FjaGUgYW55IHJvdGF0ZWQgdmVyc2lvbnMgdG8gbWF0Y2gKKwlwcml2YXRlIE1hcDxJbWFnZSwgSW1hZ2U+IHJvdGF0ZWRJbWFnZU1hcCA9IG5ldyBIYXNoTWFwPEltYWdlLCBJbWFnZT4oKTsKKworCXB1YmxpYyBDb250cm9sIGZyYW1lTWVJZlBvc3NpYmxlKENvbnRyb2wgdG9GcmFtZSwgU3RyaW5nIGNsYXNzSWQsCisJCQlib29sZWFuIHZlcnRpY2FsLCBib29sZWFuIGRyYWdnYWJsZSkgeworCQlJbnRlZ2VyW10gZnJhbWVJbnRzID0gbmV3IEludGVnZXJbNF07CisJCS8vIEZJWE1FIFJBUCB1bnN1cHBvcnRlZAorCQkvLyBJbWFnZSBmcmFtZUltYWdlID0gY3JlYXRlSW1hZ2UodG9GcmFtZSwgY2xhc3NJZCwgRlJBTUVfSU1BR0VfUFJPUCwKKwkJLy8gZnJhbWVJbnRzKTsKKwkJLy8gaWYgKHZlcnRpY2FsICYmIGZyYW1lSW1hZ2UgIT0gbnVsbCkKKwkJLy8gZnJhbWVJbWFnZSA9IHJvdGF0ZUltYWdlKHRvRnJhbWUuZ2V0RGlzcGxheSgpLCBmcmFtZUltYWdlLAorCQkvLyBmcmFtZUludHMpOworCQkvLworCQkvLyBJbWFnZSBoYW5kbGVJbWFnZSA9IGNyZWF0ZUltYWdlKHRvRnJhbWUsIGNsYXNzSWQsIEhBTkRMRV9JTUFHRV9QUk9QLAorCQkvLyBudWxsKTsKKwkJLy8gaWYgKHZlcnRpY2FsICYmIGhhbmRsZUltYWdlICE9IG51bGwpCisJCS8vIGhhbmRsZUltYWdlID0gcm90YXRlSW1hZ2UodG9GcmFtZS5nZXREaXNwbGF5KCksIGhhbmRsZUltYWdlLCBudWxsKTsKKwkJLy8KKwkJLy8gaWYgKGZyYW1lSW1hZ2UgIT0gbnVsbCkgeworCQkvLyBJbWFnZUJhc2VkRnJhbWUgZnJhbWUgPSBuZXcgSW1hZ2VCYXNlZEZyYW1lKHRvRnJhbWUuZ2V0UGFyZW50KCksCisJCS8vIHRvRnJhbWUsIHZlcnRpY2FsLCBkcmFnZ2FibGUpOworCQkvLyBmcmFtZS5zZXRJbWFnZXMoZnJhbWVJbWFnZSwgZnJhbWVJbnRzLCBoYW5kbGVJbWFnZSk7CisJCS8vIGFkZEZyYW1lSW1hZ2VEaXNwb3NlZExpc3RlbmVyKGZyYW1lLCB0b0ZyYW1lLCBjbGFzc0lkLCB2ZXJ0aWNhbCk7CisJCS8vIHJldHVybiBmcmFtZTsKKwkJLy8gfSBlbHNlIGlmIChoYW5kbGVJbWFnZSAhPSBudWxsKSB7CisJCS8vIEltYWdlQmFzZWRGcmFtZSBmcmFtZSA9IG5ldyBJbWFnZUJhc2VkRnJhbWUodG9GcmFtZS5nZXRQYXJlbnQoKSwKKwkJLy8gdG9GcmFtZSwgdmVydGljYWwsIGRyYWdnYWJsZSk7CisJCS8vIGZyYW1lLnNldEltYWdlcyhudWxsLCBudWxsLCBoYW5kbGVJbWFnZSk7CisJCS8vIGFkZEhhbmRsZUltYWdlRGlzcG9zZWRMaXN0ZW5lcihmcmFtZSwgdG9GcmFtZSwgY2xhc3NJZCwgdmVydGljYWwpOworCQkvLyByZXR1cm4gZnJhbWU7CisJCS8vIH0KKworCQlyZXR1cm4gdG9GcmFtZTsKKwl9CisKKwlwcml2YXRlIEltYWdlIHJvdGF0ZUltYWdlKERpc3BsYXkgZGlzcGxheSwgSW1hZ2UgaW1hZ2UsIEludGVnZXJbXSBmcmFtZUludHMpIHsKKwkJLy8gRklYTUUgUkFQIHVuc3VwcG9ydGVkCisJCS8vIC8vIFN3YXAgdGhlIHdpZHRocyAvIGhlaWdodHMgb2YgdGhlICdjdXRzJworCQkvLyBpZiAoZnJhbWVJbnRzICE9IG51bGwpIHsKKwkJLy8gaW50IHRtcDsKKwkJLy8gdG1wID0gZnJhbWVJbnRzWzBdOworCQkvLyBmcmFtZUludHNbMF0gPSBmcmFtZUludHNbMl07CisJCS8vIGZyYW1lSW50c1syXSA9IHRtcDsKKwkJLy8gdG1wID0gZnJhbWVJbnRzWzFdOworCQkvLyBmcmFtZUludHNbMV0gPSBmcmFtZUludHNbM107CisJCS8vIGZyYW1lSW50c1szXSA9IHRtcDsKKwkJLy8gfQorCQkvLworCQkvLyBpZiAocm90YXRlZEltYWdlTWFwLmdldChpbWFnZSkgIT0gbnVsbCkKKwkJLy8gcmV0dXJuIHJvdGF0ZWRJbWFnZU1hcC5nZXQoaW1hZ2UpOworCQkvLworCQkvLyAvLyByb3RhdGUgOTAgZGVncmVlcywsLAorCQkvLyBSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7CisJCS8vIEltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGJvdW5kcy5oZWlnaHQsIGJvdW5kcy53aWR0aCwgMzIsCisJCS8vIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHgwMEZGMDAsIDB4MDAwMEZGKSk7CisJCS8vIEltYWdlIHJvdGF0ZWRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOworCQkvLyBHQyBnYyA9IG5ldyBHQyhyb3RhdGVkSW1hZ2UpOworCQkvLyBSR0IgcmdiID0gbmV3IFJHQigweDdkLCAwLCAwKTsKKwkJLy8gQ29sb3Igb2ZmUmVkID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7CisJCS8vIGdjLnNldEJhY2tncm91bmQob2ZmUmVkKTsKKwkJLy8gZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMuaGVpZ2h0LCBib3VuZHMud2lkdGgpOworCQkvLyBUcmFuc2Zvcm0gdCA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7CisJCS8vIGludCB3ID0gaW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OworCQkvLyBpbnQgb2Zmc2V0ID0gMDsgLy8gKHcrMSkgJSAyOworCQkvLyB0LnRyYW5zbGF0ZSh3IC0gb2Zmc2V0LCAwKTsKKwkJLy8gdC5yb3RhdGUoOTApOworCQkvLyBnYy5zZXRUcmFuc2Zvcm0odCk7CisJCS8vIGdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7CisJCS8vIGdjLmRpc3Bvc2UoKTsKKwkJLy8gdC5kaXNwb3NlKCk7CisJCS8vIG9mZlJlZC5kaXNwb3NlKCk7CisJCS8vIEltYWdlRGF0YSBhbHBoYURhdGEgPSByb3RhdGVkSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7CisJCS8vIHJvdGF0ZWRJbWFnZS5kaXNwb3NlKCk7CisJCS8vIGludCB0cmFuc3BhcmVudFBpeCA9IGFscGhhRGF0YS5wYWxldHRlLmdldFBpeGVsKHJnYik7CisJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFEYXRhLndpZHRoOyBpKyspIHsKKwkJLy8gZm9yIChpbnQgaiA9IDA7IGogPCBhbHBoYURhdGEuaGVpZ2h0OyBqKyspIHsKKwkJLy8gaWYgKGFscGhhRGF0YS5nZXRQaXhlbChpLCBqKSAhPSB0cmFuc3BhcmVudFBpeCkgeworCQkvLyBhbHBoYURhdGEuc2V0QWxwaGEoaSwgaiwgMjU1KTsKKwkJLy8gfQorCQkvLyB9CisJCS8vIH0KKwkJLy8gcm90YXRlZEltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGFscGhhRGF0YSk7CisJCS8vIC8vIC4uLmFuZCBjYWNoZSBpdAorCQkvLyByb3RhdGVkSW1hZ2VNYXAucHV0KGltYWdlLCByb3RhdGVkSW1hZ2UpOworCQkvLworCQkvLyAvLyBSZXR1cm4gdGhlIG5ldyBvbmUKKwkJLy8gcmV0dXJuIHJvdGF0ZWRJbWFnZTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENTU1ZhbHVlIGdldENTU1ZhbHVlKENvbnRyb2wgc3R5bGVDb250cm9sLCBTdHJpbmcgY2xhc3NOYW1lLAorCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJLy8gRklYTUUgUkFQIHVuc3VwcG9ydGVkCisJCS8vIENTU0VuZ2luZSBjc3NlbmcgPSBXaWRnZXRFbGVtZW50LmdldEVuZ2luZShzdHlsZUNvbnRyb2wpOworCQkvLyBpZiAoY3NzZW5nID09IG51bGwpIHsKKwkJLy8gcmV0dXJuIG51bGw7CisJCS8vIH0KKwkJLy8gQ29udHJvbEVsZW1lbnQgdGVtcEVtZW50ID0gKENvbnRyb2xFbGVtZW50KSBjc3NlbmcKKwkJLy8gLmdldEVsZW1lbnQoc3R5bGVDb250cm9sKTsKKwkJLy8gaWYgKHRlbXBFbWVudCA9PSBudWxsKSB7CisJCS8vIHJldHVybiBudWxsOworCQkvLyB9CisJCS8vCisJCS8vIC8vIHN1cGVyIGhhY2sKKwkJLy8gaWYgKGNsYXNzTmFtZSAhPSBudWxsKQorCQkvLyBXaWRnZXRFbGVtZW50LnNldENTU0NsYXNzKHN0eWxlQ29udHJvbCwgY2xhc3NOYW1lKTsKKwkJLy8KKwkJLy8gQ1NTU3R5bGVEZWNsYXJhdGlvbiBzdHlsZURlY2xhcmF0aW9ucyA9IGNzc2VuZy5nZXRWaWV3Q1NTKCkKKwkJLy8JCQkJLmdldENvbXB1dGVkU3R5bGUodGVtcEVtZW50LCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8KKwkJLy8gaWYgKHN0eWxlRGVjbGFyYXRpb25zID09IG51bGwpCisJCS8vIHJldHVybiBudWxsOworCQkvLworCQkvLyByZXR1cm4gc3R5bGVEZWNsYXJhdGlvbnMuZ2V0UHJvcGVydHlDU1NWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHBhcmFtIHN0cmluZworCSAqIEBwYXJhbSBzdHJpbmcyCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZShDb250cm9sIHN0eWxlQ29udHJvbCwgU3RyaW5nIGNsYXNzSWQsCisJCQlTdHJpbmcgYXR0TmFtZSwgSW50ZWdlcltdIGZyYW1lSW50cykgeworCQlJbWFnZSBpbWFnZSA9IG51bGw7CisJCS8vIEZJWE1FIFJBUCB1bnN1cHBvcnRlZAorCQkvLyBDU1NFbmdpbmUgY3NzZW5nID0gV2lkZ2V0RWxlbWVudC5nZXRFbmdpbmUoc3R5bGVDb250cm9sKTsKKwkJLy8gaWYgKGNzc2VuZyA9PSBudWxsKSB7CisJCS8vIHJldHVybiBudWxsOworCQkvLyB9CisJCS8vIENvbnRyb2xFbGVtZW50IHRlbXBFbWVudCA9IChDb250cm9sRWxlbWVudCkgY3NzZW5nCisJCS8vIC5nZXRFbGVtZW50KHN0eWxlQ29udHJvbCk7CisJCS8vIGlmICh0ZW1wRW1lbnQgPT0gbnVsbCkgeworCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8gfQorCQkvLyBpZiAoY2xhc3NJZCAhPSBudWxsKQorCQkvLwkJCUNvbnRyb2xFbGVtZW50LnNldENTU0NsYXNzKHN0eWxlQ29udHJvbCwgY2xhc3NJZCk7IC8vJE5PTi1OTFMtMSQKKwkJLy8KKwkJLy8gQ1NTU3R5bGVEZWNsYXJhdGlvbiBzdHlsZURlY2xhcmF0aW9ucyA9IGNzc2VuZy5nZXRWaWV3Q1NTKCkKKwkJLy8gLmdldENvbXB1dGVkU3R5bGUodGVtcEVtZW50LCAiIik7CisJCS8vIGlmIChzdHlsZURlY2xhcmF0aW9ucyA9PSBudWxsKQorCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8KKwkJLy8JCUNTU1ZhbHVlIGltYWdlUGF0aCA9IHN0eWxlRGVjbGFyYXRpb25zLmdldFByb3BlcnR5Q1NTVmFsdWUoYXR0TmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gaWYgKGltYWdlUGF0aCA9PSBudWxsKQorCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8KKwkJLy8gaWYgKGltYWdlUGF0aCAhPSBudWxsCisJCS8vICYmIGltYWdlUGF0aC5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7CisJCS8vIC8vIFN0cmluZyBpbWFnZVN0cmluZyA9ICgoQ1NTUHJpbWl0aXZlVmFsdWUpIGltYWdlUGF0aCkKKwkJLy8gLy8gLmdldFN0cmluZ1ZhbHVlKCk7CisJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVyZSIgKyBpbWFnZVN0cmluZyk7CisJCS8vIHRyeSB7CisJCS8vIGltYWdlID0gKEltYWdlKSBjc3NlbmcuY29udmVydChpbWFnZVBhdGgsIEltYWdlLmNsYXNzLAorCQkvLyBzdHlsZUNvbnRyb2wuZ2V0RGlzcGxheSgpKTsKKwkJLy8gaWYgKGltYWdlICE9IG51bGwgJiYgZnJhbWVJbnRzICE9IG51bGwpIHsKKwkJLy8gQ1NTVmFsdWUgdmFsdWUgPSBzdHlsZURlY2xhcmF0aW9ucworCQkvLwkJCQkJCQkuZ2V0UHJvcGVydHlDU1NWYWx1ZSgiZnJhbWUtY3V0cyIpOyAvLyROT04tTkxTLTEkCisJCS8vIGlmICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfVkFMVUVfTElTVCkgeworCQkvLyBDU1NWYWx1ZUxpc3QgdmFsdWVMaXN0ID0gKENTU1ZhbHVlTGlzdCkgdmFsdWU7CisJCS8vIGlmICh2YWx1ZUxpc3QuZ2V0TGVuZ3RoKCkgIT0gNCkKKwkJLy8gcmV0dXJuIG51bGw7CisJCS8vCisJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJLy8gQ1NTVmFsdWUgdmFsID0gdmFsdWVMaXN0Lml0ZW0oaSk7CisJCS8vIGlmICgodmFsLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpCisJCS8vICYmICgoQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbCkKKwkJLy8gLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFgpIHsKKwkJLy8gZnJhbWVJbnRzW2ldID0gKGludCkgKChDU1NQcmltaXRpdmVWYWx1ZSkgdmFsKQorCQkvLyAuZ2V0RmxvYXRWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFgpOworCQkvLyB9IGVsc2UgeworCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8gfQorCQkvLyB9CisJCS8vCisJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyAiICsgZnJhbWVJbnRzKTsKKwkJLy8gfQorCQkvLyB9CisJCS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgeworCQkvLyB9CisJCS8vIH0KKwkJcmV0dXJuIGltYWdlOworCX0KKwkvLyBGSVhNRSBSQVAgdW5zdXBwb3J0ZWQKKwkvLyBwcml2YXRlIHZvaWQgYWRkSGFuZGxlSW1hZ2VEaXNwb3NlZExpc3RlbmVyKAorCS8vIEltYWdlQmFzZWRGcmFtZSBpbWFnZUJhc2VkRnJhbWUsIGZpbmFsIENvbnRyb2wgdG9GcmFtZSwKKwkvLyBmaW5hbCBTdHJpbmcgY2xhc3NJZCwgZmluYWwgYm9vbGVhbiB2ZXJ0aWNhbCkgeworCS8vIGZpbmFsIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgeworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJLy8gaWYgKCEoZXZlbnQud2lkZ2V0IGluc3RhbmNlb2YgSW1hZ2VCYXNlZEZyYW1lKSkgeworCS8vIHJldHVybjsKKwkvLyB9CisJLy8KKwkvLyBJbWFnZUJhc2VkRnJhbWUgZnJhbWUgPSAoSW1hZ2VCYXNlZEZyYW1lKSBldmVudC53aWRnZXQ7CisJLy8gaWYgKCFpc0ltYWdlc1JlZnJlc2hSZXF1aXJlZChmcmFtZSkpIHsKKwkvLyByZXR1cm47CisJLy8gfQorCS8vCisJLy8gSW1hZ2UgaGFuZGxlSW1hZ2UgPSBjcmVhdGVJbWFnZSh0b0ZyYW1lLCBjbGFzc0lkLAorCS8vIEhBTkRMRV9JTUFHRV9QUk9QLCBudWxsKTsKKwkvLyBpZiAodmVydGljYWwgJiYgaGFuZGxlSW1hZ2UgIT0gbnVsbCkgeworCS8vIGhhbmRsZUltYWdlID0gcm90YXRlSW1hZ2UodG9GcmFtZS5nZXREaXNwbGF5KCksCisJLy8gaGFuZGxlSW1hZ2UsIG51bGwpOworCS8vIH0KKwkvLyBpZiAoaGFuZGxlSW1hZ2UgIT0gbnVsbCkgeworCS8vIGZyYW1lLnNldEltYWdlcyhudWxsLCBudWxsLCBoYW5kbGVJbWFnZSk7CisJLy8gfQorCS8vIH0KKwkvLyB9OworCS8vCisJLy8gdG9GcmFtZS5nZXREaXNwbGF5KCkuYWRkTGlzdGVuZXIoU1dULlNraW4sIGxpc3RlbmVyKTsKKwkvLworCS8vIGltYWdlQmFzZWRGcmFtZS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCS8vIGUud2lkZ2V0LmdldERpc3BsYXkoKS5yZW1vdmVMaXN0ZW5lcihTV1QuU2tpbiwgbGlzdGVuZXIpOworCS8vIH0KKwkvLyB9KTsKKwkvLyB9CisJLy8KKwkvLyBwcml2YXRlIHZvaWQgYWRkRnJhbWVJbWFnZURpc3Bvc2VkTGlzdGVuZXIoSW1hZ2VCYXNlZEZyYW1lCisJLy8gaW1hZ2VCYXNlZEZyYW1lLAorCS8vIGZpbmFsIENvbnRyb2wgdG9GcmFtZSwgZmluYWwgU3RyaW5nIGNsYXNzSWQsIGZpbmFsIGJvb2xlYW4gdmVydGljYWwpIHsKKwkvLyBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCS8vIGlmICghKGV2ZW50LndpZGdldCBpbnN0YW5jZW9mIEltYWdlQmFzZWRGcmFtZSkpIHsKKwkvLyByZXR1cm47CisJLy8gfQorCS8vCisJLy8gSW1hZ2VCYXNlZEZyYW1lIGZyYW1lID0gKEltYWdlQmFzZWRGcmFtZSkgZXZlbnQud2lkZ2V0OworCS8vIGlmICghaXNJbWFnZXNSZWZyZXNoUmVxdWlyZWQoZnJhbWUpKSB7CisJLy8gcmV0dXJuOworCS8vIH0KKwkvLworCS8vIEludGVnZXJbXSBmcmFtZUludHMgPSBuZXcgSW50ZWdlcls0XTsKKwkvLyBJbWFnZSBmcmFtZUltYWdlID0gY3JlYXRlSW1hZ2UodG9GcmFtZSwgY2xhc3NJZCwKKwkvLyBGUkFNRV9JTUFHRV9QUk9QLCBmcmFtZUludHMpOworCS8vIGlmICh2ZXJ0aWNhbCAmJiBmcmFtZUltYWdlICE9IG51bGwpIHsKKwkvLyBmcmFtZUltYWdlID0gcm90YXRlSW1hZ2UodG9GcmFtZS5nZXREaXNwbGF5KCksIGZyYW1lSW1hZ2UsCisJLy8gZnJhbWVJbnRzKTsKKwkvLyB9CisJLy8KKwkvLyBJbWFnZSBoYW5kbGVJbWFnZSA9IGNyZWF0ZUltYWdlKHRvRnJhbWUsIGNsYXNzSWQsCisJLy8gSEFORExFX0lNQUdFX1BST1AsIG51bGwpOworCS8vIGlmICh2ZXJ0aWNhbCAmJiBoYW5kbGVJbWFnZSAhPSBudWxsKSB7CisJLy8gaGFuZGxlSW1hZ2UgPSByb3RhdGVJbWFnZSh0b0ZyYW1lLmdldERpc3BsYXkoKSwKKwkvLyBoYW5kbGVJbWFnZSwgbnVsbCk7CisJLy8gfQorCS8vIGlmIChmcmFtZUltYWdlICE9IG51bGwpIHsKKwkvLyBmcmFtZS5zZXRJbWFnZXMoZnJhbWVJbWFnZSwgZnJhbWVJbnRzLCBoYW5kbGVJbWFnZSk7CisJLy8gfQorCS8vIH0KKwkvLyB9OworCS8vCisJLy8gdG9GcmFtZS5nZXREaXNwbGF5KCkuYWRkTGlzdGVuZXIoU1dULlNraW4sIGxpc3RlbmVyKTsKKwkvLworCS8vIGltYWdlQmFzZWRGcmFtZS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCS8vIGUud2lkZ2V0LmdldERpc3BsYXkoKS5yZW1vdmVMaXN0ZW5lcihTV1QuU2tpbiwgbGlzdGVuZXIpOworCS8vIH0KKwkvLyB9KTsKKwkvLyB9CisJLy8KKwkvLyBwcml2YXRlIGJvb2xlYW4gaXNJbWFnZXNSZWZyZXNoUmVxdWlyZWQoSW1hZ2VCYXNlZEZyYW1lIGZyYW1lKSB7CisJLy8gT2JqZWN0IGhhbmRsZUltYWdlID0gZnJhbWUuZ2V0RGF0YSgiaGFuZGxlSW1hZ2UiKTsKKwkvLyBpZiAoaGFuZGxlSW1hZ2UgaW5zdGFuY2VvZiBJbWFnZSAmJiAoKEltYWdlKSBoYW5kbGVJbWFnZSkuaXNEaXNwb3NlZCgpKSB7CisJLy8gcmV0dXJuIHRydWU7CisJLy8gfQorCS8vCisJLy8gT2JqZWN0IGZyYW1lSW1hZ2UgPSBmcmFtZS5nZXREYXRhKCJmcmFtZUltYWdlIik7CisJLy8gaWYgKGZyYW1lSW1hZ2UgaW5zdGFuY2VvZiBJbWFnZSAmJiAoKEltYWdlKSBmcmFtZUltYWdlKS5pc0Rpc3Bvc2VkKCkpIHsKKwkvLyByZXR1cm4gdHJ1ZTsKKwkvLyB9CisJLy8KKwkvLyByZXR1cm4gZmFsc2U7CisJLy8gfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0U0QXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9FNEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhYzA2YQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9FNEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw5NDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBUcmlzdGFuIEh1bWUgLSA8dHJpc2h1bWVAZ21haWwuY29tPiAtCisgKiAgICAgCQlGaXggZm9yIEJ1ZyAyMzY5IFtXb3JrYmVuY2hdIFdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBzYXZlIHdvcmtzcGFjZSB3aXRob3V0IGV4aXRpbmcKKyAqICAgICAJCUltcGxlbWVudGVkIHdvcmtiZW5jaCBhdXRvLXNhdmUgdG8gY29ycmVjdGx5IHJlc3RvcmUgc3RhdGUgaW4gY2FzZSBvZiBjcmFzaC4KKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQHZvZ2VsbGEuY29tPiAtIEJ1ZyAzNjYzNjQsIDQ0NTcyNCwgNDQ2MDg4CisgKiAgICAgVGVycnkgUGFya2VyIDx0cGFya2VyQGdvb2dsZS5jb20+IC0gQnVnIDQxNjY3MworICogICAgIENocmlzdGlhbiBHZW9yZ2kgKFNBUCkgICAgICAgICAgICAtIEJ1ZyA0MzI0ODAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLlJlYWxtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUmVnaXN0cnlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5FY2xpcHNlQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5SdW5BbmRUcmFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmludGVybmFsLnNlcnZpY2VzLkVjbGlwc2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuYWRhcHRlci5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5JTG9nZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5sb2cuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMudHJhbnNsYXRpb24uVHJhbnNsYXRpb25Qcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy50cmFuc2xhdGlvbi5UcmFuc2xhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlTeW5jaHJvbml6ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQWN0aXZlQ2hpbGRMb29rdXBGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guQWN0aXZlUGFydExvb2t1cEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5EZWZhdWx0TG9nZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkU0V29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5FeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Nb2RlbFNlcnZpY2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5QbGFjZWhvbGRlclJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5SZWZsZWN0aW9uQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5TZWxlY3Rpb25BZ2dyZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5TZWxlY3Rpb25TZXJ2aWNlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guVVJJSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Xb3JrYmVuY2hMb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFkZG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLmltcGwuQmFzaWNQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5pbXBsLlVpUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVNlcnZpY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVN0eWxpbmdFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JTW9kZWxSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmxpZmVjeWNsZS5Qb3N0Q29udGV4dENyZWF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubGlmZWN5Y2xlLlByZVNhdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmxpZmVjeWNsZS5Qcm9jZXNzQWRkaXRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5saWZlY3ljbGUuUHJvY2Vzc1JlbW92YWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGxhY2Vob2xkZXJSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRVNlbGVjdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5pbnRlcm5hbC5jb3B5LldvcmtiZW5jaFNXVE1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dC5TV1RPYnNlcnZhYmxlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3QuUldUOworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3Quc2VydmljZS5TZXR0aW5nU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgRTRBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QiOyAvLyROT04tTkxTLTEkCisKKwkvLyBDb3BpZWQgZnJvbSBJREVBcHBsaWNhdGlvbgorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0ZPTERFUiA9ICIubWV0YWRhdGEiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRklMRU5BTUUgPSAidmVyc2lvbi5pbmkiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9WRVJTSU9OX0tFWSA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9WRVJTSU9OX1ZBTFVFID0gIjIiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX01PREVMX1BBVEhfREVGQVVMVCA9ICJBcHBsaWNhdGlvbi5lNHhtaSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0FSR19OQU1FID0gInBlcnNwZWN0aXZlIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV0xPQ0FUSU9OX0FSR19OQU1FID0gInNob3dMb2NhdGlvbiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEhFTUVfSUQgPSAib3JnLmVjbGlwc2UuZTQudWkuY3NzLnRoZW1lLmU0X2RlZmF1bHQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJR0hfQ09OVFJBU1RfVEhFTUVfSUQgPSAib3JnLmVjbGlwc2UuZTQudWkuY3NzLnRoZW1lLmhpZ2gtY29udHJhc3QiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFOQ0VJRCA9ICJFNEFwcGxpY2F0aW9uLmluc3RhbmNlSWQiOworCisJcHJpdmF0ZSBTdHJpbmdbXSBhcmdzOworCisJcHJpdmF0ZSBJTW9kZWxSZXNvdXJjZUhhbmRsZXIgaGFuZGxlcjsKKwlwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IG51bGw7CisJcHJpdmF0ZSBFNFdvcmtiZW5jaCB3b3JrYmVuY2ggPSBudWxsOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhFTUVfSUQgPSAiY3NzVGhlbWUiOworCisJLy8gVE9ETyBSQVAgbW9kaWZpZWQKKwlwdWJsaWMgT2JqZWN0IGxjTWFuYWdlcjsKKworCXB1YmxpYyBEaXNwbGF5IGdldEFwcGxpY2F0aW9uRGlzcGxheSgpIHsKKwkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgeworCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQl9CisJCXJldHVybiBkaXNwbGF5OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBzZXQgdGhlIGRpc3BsYXkgbmFtZSBiZWZvcmUgdGhlIERpc3BsYXkgaXMKKwkJLy8gY3JlYXRlZCB0byBlbnN1cmUgdGhlIGFwcCBuYW1lIGlzIHVzZWQgaW4gYW55CisJCS8vIHBsYXRmb3JtIG1lbnVzLCBldGMuIFNlZQorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NDU2I2MxNAorCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOworCQlpZiAocHJvZHVjdCAhPSBudWxsICYmIHByb2R1Y3QuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCURpc3BsYXkuc2V0QXBwTmFtZShwcm9kdWN0LmdldE5hbWUoKSk7CisJCX0KKwkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0QXBwbGljYXRpb25EaXNwbGF5KCk7CisJCUxvY2F0aW9uIGluc3RhbmNlTG9jYXRpb24gPSBudWxsOworCQl0cnkgeworCQkJRTRXb3JrYmVuY2ggd29ya2JlbmNoID0gY3JlYXRlRTRXb3JrYmVuY2goYXBwbGljYXRpb25Db250ZXh0LCBkaXNwbGF5KTsKKwkJCWlmICh3b3JrYmVuY2ggPT0gbnVsbCkgeworCQkJCWRpc3BsYXkuZGlzcG9zZSgpOworCQkJCXJldHVybiBFWElUX09LOworCQkJfQorCisJCQlpbnN0YW5jZUxvY2F0aW9uID0gKExvY2F0aW9uKSB3b3JrYmVuY2guZ2V0Q29udGV4dCgpLmdldChFNFdvcmtiZW5jaC5JTlNUQU5DRV9MT0NBVElPTik7CisJCQlTaGVsbCBzaGVsbCA9IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJCWlmIChzaGVsbCA9PSBudWxsKSB7CisJCQkJc2hlbGwgPSBuZXcgU2hlbGwoKTsKKwkJCQkvLyBwbGFjZSBpdCBvZmYgc28gaXQncyBub3QgdmlzaWJsZQorCQkJCXNoZWxsLnNldExvY2F0aW9uKDAsIDEwMDAwKTsKKwkJCX0KKwkJCWlmICghY2hlY2tJbnN0YW5jZUxvY2F0aW9uKGluc3RhbmNlTG9jYXRpb24sIHNoZWxsLAorCQkJCQl3b3JrYmVuY2guZ2V0Q29udGV4dCgpKSkKKwkJCQlyZXR1cm4gRVhJVF9PSzsKKworCQkJLy8gQ3JlYXRlIGFuZCBydW4gdGhlIFVJIChpZiBhbnkpCisJCQl3b3JrYmVuY2guY3JlYXRlQW5kUnVuVUkod29ya2JlbmNoLmdldEFwcGxpY2F0aW9uKCkpOworCisJCQlzYXZlTW9kZWwoKTsKKwkJCXdvcmtiZW5jaC5jbG9zZSgpOworCisJCQlpZiAod29ya2JlbmNoLmlzUmVzdGFydCgpKSB7CisJCQkJcmV0dXJuIEVYSVRfUkVTVEFSVDsKKwkJCX0KKworCQkJcmV0dXJuIEVYSVRfT0s7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZGlzcGxheSAhPSBudWxsKQorCQkJCWRpc3BsYXkuZGlzcG9zZSgpOworCQkJaWYgKGluc3RhbmNlTG9jYXRpb24gIT0gbnVsbCkKKwkJCQlpbnN0YW5jZUxvY2F0aW9uLnJlbGVhc2UoKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNhdmVNb2RlbCgpIHsKKwkJLy8gU2F2ZSB0aGUgbW9kZWwgaW50byB0aGUgdGFyZ2V0VVJJCisJCWlmIChsY01hbmFnZXIgIT0gbnVsbCAmJiB3b3JrYmVuY2ggIT0gbnVsbCkgeworCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkuaW52b2tlKGxjTWFuYWdlciwgUHJlU2F2ZS5jbGFzcywgd29ya2JlbmNoLmdldENvbnRleHQoKSwgbnVsbCk7CisJCX0KKworCQl0cnkgeworCQkJaWYgKCEoaGFuZGxlciBpbnN0YW5jZW9mIFJlc291cmNlSGFuZGxlcikgfHwgKChSZXNvdXJjZUhhbmRsZXIpIGhhbmRsZXIpLmhhc1RvcExldmVsV2luZG93cygpKSB7CisJCQkJaGFuZGxlci5zYXZlKCk7CisJCQl9IGVsc2UgeworCQkJCUxvZ2dlciBsb2dnZXIgPSBuZXcgV29ya2JlbmNoTG9nZ2VyKFBMVUdJTl9JRCk7CisJCQkJbG9nZ2VyLmVycm9yKG5ldyBFeGNlcHRpb24oKSwgLy8gbG9nIGEgc3RhY2sgdHJhY2UgZm9yIGRlYnVnZ2luZworCQkJCQkJIkF0dGVtcHRlZCB0byBzYXZlIGEgd29ya2JlbmNoIG1vZGVsIHRoYXQgaGFkIG5vIHRvcC1sZXZlbCB3aW5kb3dzISAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyAiU2tpcHBlZCBzYXZpbmcgdGhlIG1vZGVsIHRvIGF2b2lkIGNvcnJ1cHRpb24uIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlMb2dnZXIgbG9nZ2VyID0gbmV3IFdvcmtiZW5jaExvZ2dlcihQTFVHSU5fSUQpOworCQkJbG9nZ2VyLmVycm9yKGUsICJFcnJvciBzYXZpbmcgdGhlIHdvcmtiZW5jaCBtb2RlbCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwdWJsaWMgRTRXb3JrYmVuY2ggY3JlYXRlRTRXb3JrYmVuY2goCisJCQlJQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB7CisJCWFyZ3MgPSAoU3RyaW5nW10pIGFwcGxpY2F0aW9uQ29udGV4dC5nZXRBcmd1bWVudHMoKS5nZXQoSUFwcGxpY2F0aW9uQ29udGV4dC5BUFBMSUNBVElPTl9BUkdTKTsKKworCQlmaW5hbCBJRWNsaXBzZUNvbnRleHQgYXBwQ29udGV4dCA9IGNyZWF0ZURlZmF1bHRDb250ZXh0KCk7CisJCWFwcENvbnRleHQuc2V0KERpc3BsYXkuY2xhc3MsIGRpc3BsYXkpOworCQkvLyBGSVhNRSBSQVAgRGlzcGxheVJlYWxtIG5vdCBwdWJsaWMhISEKKwkJYXBwQ29udGV4dC5zZXQoUmVhbG0uY2xhc3MsIFNXVE9ic2VydmFibGVzLmdldFJlYWxtKGRpc3BsYXkpKTsKKwkJYXBwQ29udGV4dC5zZXQoVUlTeW5jaHJvbml6ZS5jbGFzcywgbmV3IFVJU3luY2hyb25pemUoKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKKwkJCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgeworCQkJCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCWFwcENvbnRleHQuc2V0KElBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3MsIGFwcGxpY2F0aW9uQ29udGV4dCk7CisKKwkJLy8gVGhpcyBjb250ZXh0IHdpbGwgYmUgdXNlZCBieSB0aGUgaW5qZWN0b3IgZm9yIGl0cworCQkvLyBleHRlbmRlZCBkYXRhIHN1cHBsaWVycworCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5zZXREZWZhdWx0KGFwcENvbnRleHQpOworCisJCS8vIEdldCB0aGUgZmFjdG9yeSB0byBjcmVhdGUgREkgaW5zdGFuY2VzIHdpdGgKKwkJSUNvbnRyaWJ1dGlvbkZhY3RvcnkgZmFjdG9yeSA9IGFwcENvbnRleHQuZ2V0KElDb250cmlidXRpb25GYWN0b3J5LmNsYXNzKTsKKworCQkvLyBJbnN0YWxsIHRoZSBsaWZlLWN5Y2xlIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbiBpZiB0aGVyZSdzIG9uZQorCQkvLyBkZWZpbmVkCisJCVN0cmluZyBsaWZlQ3ljbGVVUkkgPSBnZXRBcmdWYWx1ZShJV29ya2JlbmNoLkxJRkVfQ1lDTEVfVVJJX0FSRywgYXBwbGljYXRpb25Db250ZXh0LCBmYWxzZSk7CisJCWlmIChsaWZlQ3ljbGVVUkkgIT0gbnVsbCkgeworCQkJbGNNYW5hZ2VyID0gZmFjdG9yeS5jcmVhdGUobGlmZUN5Y2xlVVJJLCBhcHBDb250ZXh0KTsKKwkJCWlmIChsY01hbmFnZXIgIT0gbnVsbCkgeworCQkJCS8vIExldCB0aGUgbWFuYWdlciBtYW5pcHVsYXRlIHRoZSBhcHBDb250ZXh0IGlmIGRlc2lyZWQKKwkJCQlPYmplY3Qgc3RhdGUgPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UobGNNYW5hZ2VyLAorCQkJCQkJUG9zdENvbnRleHRDcmVhdGUuY2xhc3MsIGFwcENvbnRleHQsIEJvb2xlYW4uVFJVRSk7CisJCQkJaWYgKHN0YXRlICE9IG51bGwgJiYgc3RhdGUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisJCQkJCWlmICghKChCb29sZWFuKSBzdGF0ZSkuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJU3RyaW5nIGZvcmNlZFBlcnNwZWN0aXZlSWQgPSBnZXRBcmdWYWx1ZShQRVJTUEVDVElWRV9BUkdfTkFNRSwgYXBwbGljYXRpb25Db250ZXh0LCBmYWxzZSk7CisJCWlmIChmb3JjZWRQZXJzcGVjdGl2ZUlkICE9IG51bGwpIHsKKwkJCWFwcENvbnRleHQuc2V0KEU0V29ya2JlbmNoLkZPUkNFRF9QRVJTUEVDVElWRV9JRCwgZm9yY2VkUGVyc3BlY3RpdmVJZCk7CisJCX0KKworCQlTdHJpbmcgc2hvd0xvY2F0aW9uID0gZ2V0TG9jYXRpb25Gcm9tQ29tbWFuZExpbmUoKTsKKwkJaWYgKHNob3dMb2NhdGlvbiAhPSBudWxsKSB7CisJCQlhcHBDb250ZXh0LnNldChFNFdvcmtiZW5jaC5GT1JDRURfU0hPV19MT0NBVElPTiwgc2hvd0xvY2F0aW9uKTsKKwkJfQorCisJCS8vIENyZWF0ZSB0aGUgYXBwIG1vZGVsIGFuZCBpdHMgY29udGV4dAorCQlNQXBwbGljYXRpb24gYXBwTW9kZWwgPSBsb2FkQXBwbGljYXRpb25Nb2RlbChhcHBsaWNhdGlvbkNvbnRleHQsIGFwcENvbnRleHQpOworCQlhcHBNb2RlbC5zZXRDb250ZXh0KGFwcENvbnRleHQpOworCisJCS8vIFRPRE8gUkFQIFVuc3VwcG9ydGVkCisJCS8vIGJvb2xlYW4gaXNSdGwgPSAoKFdpbmRvdy5nZXREZWZhdWx0T3JpZW50YXRpb24oKSAmIFNXVC5SSUdIVF9UT19MRUZUKQorCQkvLyAhPSAwKTsKKwkJYm9vbGVhbiBpc1J0bCA9IGZhbHNlOworCQlhcHBNb2RlbC5nZXRUcmFuc2llbnREYXRhKCkucHV0KEU0V29ya2JlbmNoLlJUTF9NT0RFLCBpc1J0bCk7CisKKwkJLy8gZm9yIGNvbXBhdGliaWxpdHkgbGF5ZXI6IHNldCB0aGUgYXBwbGljYXRpb24gaW4gdGhlIE9TR2kgc2VydmljZQorCQkvLyBjb250ZXh0IChzZWUgV29ya2JlbmNoI2dldEluc3RhbmNlKCkpCisJCS8vIFRPRE86IFJlbW92ZSBpbiBSQVAgd2UgaGF2ZSBubyBjb21wYXQgbGF5ZXIKKwkJLy8gaWYgKCFFNFdvcmtiZW5jaC5nZXRTZXJ2aWNlQ29udGV4dCgpLmNvbnRhaW5zS2V5KE1BcHBsaWNhdGlvbi5jbGFzcykpCisJCS8vIHsKKwkJLy8gLy8gZmlyc3Qgb25lIHdpbnMuCisJCS8vIEU0V29ya2JlbmNoLmdldFNlcnZpY2VDb250ZXh0KCkuc2V0KE1BcHBsaWNhdGlvbi5jbGFzcywgYXBwTW9kZWwpOworCQkvLyB9CisKKwkJLy8gU2V0IHRoZSBhcHAncyBjb250ZXh0IGFmdGVyIGFkZGluZyBpdHNlbGYKKwkJYXBwQ29udGV4dC5zZXQoTUFwcGxpY2F0aW9uLmNsYXNzLCBhcHBNb2RlbCk7CisKKwkJLy8gYWRkcyBiYXNpYyBzZXJ2aWNlcyB0byB0aGUgY29udGV4dHMKKwkJaW5pdGlhbGl6ZVNlcnZpY2VzKGFwcE1vZGVsKTsKKworCQkvLyBsZXQgdGhlIGxpZmUgY3ljbGUgbWFuYWdlciBhZGQgdG8gdGhlIG1vZGVsCisJCWlmIChsY01hbmFnZXIgIT0gbnVsbCkgeworCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkuaW52b2tlKGxjTWFuYWdlciwgUHJvY2Vzc0FkZGl0aW9ucy5jbGFzcywgYXBwQ29udGV4dCwgbnVsbCk7CisJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UobGNNYW5hZ2VyLCBQcm9jZXNzUmVtb3ZhbHMuY2xhc3MsIGFwcENvbnRleHQsIG51bGwpOworCQl9CisKKwkJLy8gQ3JlYXRlIHRoZSBhZGRvbnMKKwkJSUVjbGlwc2VDb250ZXh0IGFkZG9uU3RhdGljQ29udGV4dCA9IEVjbGlwc2VDb250ZXh0RmFjdG9yeS5jcmVhdGUoKTsKKwkJZm9yIChNQWRkb24gYWRkb24gOiBhcHBNb2RlbC5nZXRBZGRvbnMoKSkgeworCQkJYWRkb25TdGF0aWNDb250ZXh0LnNldChNQWRkb24uY2xhc3MsIGFkZG9uKTsKKwkJCU9iamVjdCBvYmogPSBmYWN0b3J5LmNyZWF0ZShhZGRvbi5nZXRDb250cmlidXRpb25VUkkoKSwgYXBwQ29udGV4dCwKKwkJCQkJYWRkb25TdGF0aWNDb250ZXh0KTsKKwkJCWFkZG9uLnNldE9iamVjdChvYmopOworCQl9CisKKwkJLy8gUGFyc2Ugb3V0IHBhcmFtZXRlcnMgZnJvbSBib3RoIHRoZSBjb21tYW5kIGxpbmUgYW5kL29yIHRoZSBwcm9kdWN0CisJCS8vIGRlZmluaXRpb24gKGlmIGFueSkgYW5kIHB1dCB0aGVtIGluIHRoZSBjb250ZXh0CisJCVN0cmluZyB4bWlVUkkgPSBnZXRBcmdWYWx1ZShJV29ya2JlbmNoLlhNSV9VUklfQVJHLCBhcHBsaWNhdGlvbkNvbnRleHQsIGZhbHNlKTsKKwkJYXBwQ29udGV4dC5zZXQoSVdvcmtiZW5jaC5YTUlfVVJJX0FSRywgeG1pVVJJKTsKKworCQlTdHJpbmcgY3NzVVJJID0gZ2V0QXJnVmFsdWUoSVdvcmtiZW5jaC5DU1NfVVJJX0FSRywgYXBwbGljYXRpb25Db250ZXh0LAorCQkJCWZhbHNlKTsKKwkJaWYgKGNzc1VSSSAhPSBudWxsKSB7CisJCQlhcHBDb250ZXh0LnNldChJV29ya2JlbmNoLkNTU19VUklfQVJHLCBjc3NVUkkpOworCQl9CisJCXNldENTU0NvbnRleHRWYXJpYWJsZXMoYXBwbGljYXRpb25Db250ZXh0LCBhcHBDb250ZXh0KTsKKworCQlTdHJpbmcgcmVuZGVyZXJGYWN0b3J5VVJJID0gZ2V0QXJnVmFsdWUoRTRXb3JrYmVuY2guUkVOREVSRVJfRkFDVE9SWV9VUkksIGFwcGxpY2F0aW9uQ29udGV4dCwgZmFsc2UpOworCQlhcHBDb250ZXh0LnNldChFNFdvcmtiZW5jaC5SRU5ERVJFUl9GQUNUT1JZX1VSSSwgcmVuZGVyZXJGYWN0b3J5VVJJKTsKKworCQkvLyBUaGlzIGlzIGEgZGVmYXVsdCBhcmcsIGlmIG1pc3Npbmcgd2UgdXNlIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBlbmdpbmUKKwkJU3RyaW5nIHByZXNlbnRhdGlvblVSSSA9IGdldEFyZ1ZhbHVlKElXb3JrYmVuY2guUFJFU0VOVEFUSU9OX1VSSV9BUkcsIGFwcGxpY2F0aW9uQ29udGV4dCwgZmFsc2UpOworCQlpZiAocHJlc2VudGF0aW9uVVJJID09IG51bGwpIHsKKwkJCXByZXNlbnRhdGlvblVSSSA9IFBhcnRSZW5kZXJpbmdFbmdpbmUuZW5naW5lVVJJOworCQl9CisJCWFwcENvbnRleHQuc2V0KElXb3JrYmVuY2guUFJFU0VOVEFUSU9OX1VSSV9BUkcsIHByZXNlbnRhdGlvblVSSSk7CisKKwkJLy8gSW5zdGFudGlhdGUgdGhlIFdvcmtiZW5jaCAod2hpY2ggaXMgcmVzcG9uc2libGUgZm9yCisJCS8vICdydW5uaW5nJyB0aGUgVUkgKGlmIGFueSkuLi4KKwkJcmV0dXJuIHdvcmtiZW5jaCA9IG5ldyBFNFdvcmtiZW5jaChhcHBNb2RlbCwgYXBwQ29udGV4dCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUlkKCkgeworCQkJCXJldHVybiAoU3RyaW5nKSBhcHBDb250ZXh0LmdldChJTlNUQU5DRUlEKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q1NTQ29udGV4dFZhcmlhYmxlcyhJQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCwKKwkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCWJvb2xlYW4gaGlnaENvbnRyYXN0TW9kZSA9IGdldEFwcGxpY2F0aW9uRGlzcGxheSgpLmdldEhpZ2hDb250cmFzdCgpOworCisJCVN0cmluZyBjc3NVUkkgPSBoaWdoQ29udHJhc3RNb2RlID8gbnVsbCA6IGdldEFyZ1ZhbHVlKAorCQkJCUlXb3JrYmVuY2guQ1NTX1VSSV9BUkcsIGFwcGxpY2F0aW9uQ29udGV4dCwgZmFsc2UpOworCisJCWlmIChjc3NVUkkgIT0gbnVsbCkgeworCQkJY29udGV4dC5zZXQoSVdvcmtiZW5jaC5DU1NfVVJJX0FSRywgY3NzVVJJKTsKKwkJfQorCisJCVN0cmluZyB0aGVtZUlkID0gaGlnaENvbnRyYXN0TW9kZSA/IEhJR0hfQ09OVFJBU1RfVEhFTUVfSUQKKwkJCQk6IGdldEFyZ1ZhbHVlKEU0QXBwbGljYXRpb24uVEhFTUVfSUQsIGFwcGxpY2F0aW9uQ29udGV4dCwgZmFsc2UpOworCisJCWlmICh0aGVtZUlkID09IG51bGwgJiYgY3NzVVJJID09IG51bGwpIHsKKwkJCXRoZW1lSWQgPSBERUZBVUxUX1RIRU1FX0lEOworCQl9CisKKwkJY29udGV4dC5zZXQoRTRBcHBsaWNhdGlvbi5USEVNRV9JRCwgdGhlbWVJZCk7CisKKwkJLy8gdmFsaWRhdGUgc3RhdGljIENTUyBVUkkKKwkJaWYgKGNzc1VSSSAhPSBudWxsICYmICFjc3NVUkkuc3RhcnRzV2l0aCgicGxhdGZvcm06L3BsdWdpbi8iKSkgeworCQkJU3lzdGVtLmVycgorCQkJCQkucHJpbnRsbigiV2FybmluZy4gVXNlIHRoZSBcInBsYXRmb3JtOi9wbHVnaW4vQnVuZGxlLVN5bWJvbGljTmFtZS9wYXRoL2ZpbGVuYW1lLmV4dGVuc2lvblwiIFVSSSBmb3IgdGhlICBwYXJhbWV0ZXI6ICAgIgorCQkJCQkJCSsgSVdvcmtiZW5jaC5DU1NfVVJJX0FSRyk7IC8vJE5PTi1OTFMtMSQKKwkJCWNvbnRleHQuc2V0KEU0QXBwbGljYXRpb24uVEhFTUVfSUQsIGNzc1VSSSk7CisJCX0KKworCQlTdHJpbmcgY3NzUmVzb3VyY2VzVVJJID0gZ2V0QXJnVmFsdWUoSVdvcmtiZW5jaC5DU1NfUkVTT1VSQ0VfVVJJX0FSRywgYXBwbGljYXRpb25Db250ZXh0LCBmYWxzZSk7CisJCWNvbnRleHQuc2V0KElXb3JrYmVuY2guQ1NTX1JFU09VUkNFX1VSSV9BUkcsIGNzc1Jlc291cmNlc1VSSSk7CisJfQorCisJcHJpdmF0ZSBNQXBwbGljYXRpb24gbG9hZEFwcGxpY2F0aW9uTW9kZWwoSUFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0LAorCQkJSUVjbGlwc2VDb250ZXh0IGVjbGlwc2VDb250ZXh0KSB7CisJCU1BcHBsaWNhdGlvbiB0aGVBcHAgPSBudWxsOworCisJCUxvY2F0aW9uIGluc3RhbmNlTG9jYXRpb24gPSBXb3JrYmVuY2hTV1RBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldEluc3RhbmNlTG9jYXRpb24oKTsKKworCQlVUkkgYXBwbGljYXRpb25Nb2RlbFVSSSA9IGRldGVybWluZUFwcGxpY2F0aW9uTW9kZWxVUkkoYXBwQ29udGV4dCk7CisJCWVjbGlwc2VDb250ZXh0LnNldChFNFdvcmtiZW5jaC5JTklUSUFMX1dPUktCRU5DSF9NT0RFTF9VUkksIGFwcGxpY2F0aW9uTW9kZWxVUkkpOworCisJCS8vIFNhdmUgYW5kIHJlc3RvcmUKKwkJYm9vbGVhbiBzYXZlQW5kUmVzdG9yZTsKKwkJU3RyaW5nIHZhbHVlID0gZ2V0QXJnVmFsdWUoSVdvcmtiZW5jaC5QRVJTSVNUX1NUQVRFLCBhcHBDb250ZXh0LCBmYWxzZSk7CisKKwkJc2F2ZUFuZFJlc3RvcmUgPSB2YWx1ZSA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKKworCQllY2xpcHNlQ29udGV4dC5zZXQoSVdvcmtiZW5jaC5QRVJTSVNUX1NUQVRFLAorCQkJCUJvb2xlYW4udmFsdWVPZihzYXZlQW5kUmVzdG9yZSkpOworCisJCS8vIHdoZW4gLWRhdGEgQG5vbmUgb3IgLWRhdGEgQG5vRGVmYXVsdCBvcHRpb25zCisJCWlmIChpbnN0YW5jZUxvY2F0aW9uICE9IG51bGwgJiYgaW5zdGFuY2VMb2NhdGlvbi5nZXRVUkwoKSAhPSBudWxsKSB7CisJCQllY2xpcHNlQ29udGV4dC5zZXQoRTRXb3JrYmVuY2guSU5TVEFOQ0VfTE9DQVRJT04sIGluc3RhbmNlTG9jYXRpb24pOworCQl9IGVsc2UgeworCQkJZWNsaXBzZUNvbnRleHQuc2V0KElXb3JrYmVuY2guUEVSU0lTVF9TVEFURSwgZmFsc2UpOworCQl9CisKKwkJLy8gUGVyc2lzdGVkIHN0YXRlCisJCWJvb2xlYW4gY2xlYXJQZXJzaXN0ZWRTdGF0ZTsKKwkJdmFsdWUgPSBnZXRBcmdWYWx1ZShJV29ya2JlbmNoLkNMRUFSX1BFUlNJU1RFRF9TVEFURSwgYXBwQ29udGV4dCwgdHJ1ZSk7CisJCWNsZWFyUGVyc2lzdGVkU3RhdGUgPSB2YWx1ZSAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKKwkJZWNsaXBzZUNvbnRleHQuc2V0KElXb3JrYmVuY2guQ0xFQVJfUEVSU0lTVEVEX1NUQVRFLAorCQkJCUJvb2xlYW4udmFsdWVPZihjbGVhclBlcnNpc3RlZFN0YXRlKSk7CisKKwkJLy8gRGVsdGEgc2F2ZSBhbmQgcmVzdG9yZQorCQlib29sZWFuIGRlbHRhUmVzdG9yZTsKKwkJdmFsdWUgPSBnZXRBcmdWYWx1ZShFNFdvcmtiZW5jaC5ERUxUQV9SRVNUT1JFLCBhcHBDb250ZXh0LCBmYWxzZSk7CisJCWRlbHRhUmVzdG9yZSA9IHZhbHVlID09IG51bGwgfHwgQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOworCQllY2xpcHNlQ29udGV4dC5zZXQoRTRXb3JrYmVuY2guREVMVEFfUkVTVE9SRSwKKwkJCQlCb29sZWFuLnZhbHVlT2YoZGVsdGFSZXN0b3JlKSk7CisKKwkJU3RyaW5nIHJlc291cmNlSGFuZGxlciA9IGdldEFyZ1ZhbHVlKElXb3JrYmVuY2guTU9ERUxfUkVTT1VSQ0VfSEFORExFUiwgYXBwQ29udGV4dCwgZmFsc2UpOworCisJCWlmIChyZXNvdXJjZUhhbmRsZXIgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VIYW5kbGVyID0gImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLyIKKwkJCQkJKyBSZXNvdXJjZUhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpOworCQl9CisKKwkJSUNvbnRyaWJ1dGlvbkZhY3RvcnkgZmFjdG9yeSA9IGVjbGlwc2VDb250ZXh0CisJCQkJLmdldChJQ29udHJpYnV0aW9uRmFjdG9yeS5jbGFzcyk7CisKKwkJaGFuZGxlciA9IChJTW9kZWxSZXNvdXJjZUhhbmRsZXIpIGZhY3RvcnkuY3JlYXRlKHJlc291cmNlSGFuZGxlciwKKwkJCQllY2xpcHNlQ29udGV4dCk7CisJCWVjbGlwc2VDb250ZXh0LnNldChJTW9kZWxSZXNvdXJjZUhhbmRsZXIuY2xhc3MsIGhhbmRsZXIpOworCisJCVJlc291cmNlIHJlc291cmNlID0gaGFuZGxlci5sb2FkTW9zdFJlY2VudE1vZGVsKCk7CisJCXRoZUFwcCA9IChNQXBwbGljYXRpb24pIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOworCisJCXJldHVybiB0aGVBcHA7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFwcENvbnRleHQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBVUkkgZGV0ZXJtaW5lQXBwbGljYXRpb25Nb2RlbFVSSShJQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQpIHsKKwkJU3RyaW5nIGFwcE1vZGVsUGF0aCA9IGdldEFyZ1ZhbHVlKElXb3JrYmVuY2guWE1JX1VSSV9BUkcsIGFwcENvbnRleHQsIGZhbHNlKTsKKwkJaWYgKGFwcE1vZGVsUGF0aCA9PSBudWxsIHx8IGFwcE1vZGVsUGF0aC5sZW5ndGgoKSA9PSAwKSB7CisJCQlCdW5kbGUgYnJhbmRpbmdCdW5kbGUgPSBhcHBDb250ZXh0LmdldEJyYW5kaW5nQnVuZGxlKCk7CisJCQlpZiAoYnJhbmRpbmdCdW5kbGUgIT0gbnVsbCkKKwkJCQlhcHBNb2RlbFBhdGggPSBicmFuZGluZ0J1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSArICIvIiArIEU0QXBwbGljYXRpb24uQVBQTElDQVRJT05fTU9ERUxfUEFUSF9ERUZBVUxUOworCQkJZWxzZSB7CisJCQkJTG9nZ2VyIGxvZ2dlciA9IG5ldyBXb3JrYmVuY2hMb2dnZXIoUExVR0lOX0lEKTsKKwkJCQlsb2dnZXIuZXJyb3IobmV3IEV4Y2VwdGlvbigpLCAvLyBsb2cgYSBzdGFjayB0cmFjZSBmb3IgZGVidWdnaW5nCisJCQkJCQkiYXBwbGljYXRpb25YTUkgcGFyYW1ldGVyIG5vdCBzZXQgYW5kIG5vIGJyYW5kaW5nIHBsdWdpbiBkZWZpbmVkLiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwkJVVJJIGFwcGxpY2F0aW9uTW9kZWxVUkkgPSBudWxsOworCisJCS8vIGNoZWNrIGlmIHRoZSBhcHBNb2RlbFBhdGggaXMgYWxyZWFkeSBhIHBsYXRmb3JtLVVSSSBhbmQgaWYgc28gdXNlIGl0CisJCWlmIChVUklIZWxwZXIuaXNQbGF0Zm9ybVVSSShhcHBNb2RlbFBhdGgpKSB7CisJCQlhcHBsaWNhdGlvbk1vZGVsVVJJID0gVVJJLmNyZWF0ZVVSSShhcHBNb2RlbFBhdGgsIHRydWUpOworCQl9IGVsc2UgeworCQkJYXBwbGljYXRpb25Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVBsdWdpblVSSShhcHBNb2RlbFBhdGgsIHRydWUpOworCQl9CisJCXJldHVybiBhcHBsaWNhdGlvbk1vZGVsVVJJOworCisJfQorCisJLyoqCisJICogRmluZHMgYW4gYXJndW1lbnQncyB2YWx1ZSBpbiB0aGUgYXBwJ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgYnJhbmRpbmcsCisJICogYW5kIHN5c3RlbSBwcm9wZXJ0aWVzCisJICoKKwkgKiBAcGFyYW0gYXJnTmFtZQorCSAqICAgICAgICAgICAgdGhlIGFyZ3VtZW50IG5hbWUKKwkgKiBAcGFyYW0gYXBwQ29udGV4dAorCSAqICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQKKwkgKiBAcGFyYW0gc2luZ2xlZENtZEFyZ1ZhbHVlCisJICogICAgICAgICAgICB3aGV0aGVyIGl0J3MgYSBzaW5nbGUtdmFsdWVkIGFyZ3VtZW50CisJICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QXJnVmFsdWUoU3RyaW5nIGFyZ05hbWUsIElBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCwgYm9vbGVhbiBzaW5nbGVkQ21kQXJnVmFsdWUpIHsKKwkJLy8gSXMgaXQgaW4gdGhlIGFyZyBsaXN0ID8KKwkJaWYgKGFyZ05hbWUgPT0gbnVsbCB8fCBhcmdOYW1lLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQlpZiAoc2luZ2xlZENtZEFyZ1ZhbHVlKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoKCItIiArIGFyZ05hbWUpLmVxdWFscyhhcmdzW2ldKSkKKwkJCQkJcmV0dXJuICJ0cnVlIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJCWlmICgoIi0iICsgYXJnTmFtZSkuZXF1YWxzKGFyZ3NbaV0pICYmIGkgKyAxIDwgYXJncy5sZW5ndGgpCisJCQkJCXJldHVybiBhcmdzW2kgKyAxXTsKKwkJCX0KKwkJfQorCisJCWZpbmFsIFN0cmluZyBicmFuZGluZ1Byb3BlcnR5ID0gYXBwQ29udGV4dC5nZXRCcmFuZGluZ1Byb3BlcnR5KGFyZ05hbWUpOworCQlyZXR1cm4gYnJhbmRpbmdQcm9wZXJ0eSA9PSBudWxsID8gU3lzdGVtLmdldFByb3BlcnR5KGFyZ05hbWUpCisJCQkJOiBicmFuZGluZ1Byb3BlcnR5OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgRTRBcHBsaWNhdGlvbiNTSE9XTE9DQVRJT05fQVJHX05BTUUKKwkgKiAgICAgICAgIHNob3dsb2NhdGlvbn0gY29tbWFuZCBsaW5lIGFyZ3VtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdAorCSAqICAgICAgICAgaXMgbm90IHNldAorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uRnJvbUNvbW1hbmRMaW5lKCkgeworCQlmaW5hbCBTdHJpbmcgZnVsbEFyZ05hbWUgPSAiLSIgKyBTSE9XTE9DQVRJT05fQVJHX05BTUU7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJLy8gaWdub3JlIGNhc2UgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucworCQkJaWYgKGZ1bGxBcmdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoYXJnc1tpXSkpIHsgLy8gJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgbmFtZSA9IG51bGw7CisJCQkJaWYgKGFyZ3MubGVuZ3RoID4gaSArIDEpIHsKKwkJCQkJbmFtZSA9IGFyZ3NbaSArIDFdOworCQkJCX0KKwkJCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuaW5kZXhPZigiLSIpID09IC0xKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIG5hbWU7CisJCQkJfQorCQkJCXJldHVybiBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKKwkJCXdvcmtiZW5jaC5jbG9zZSgpOworCQl9CisJfQorCisJLy8gVE9ETyBUaGlzIHNob3VsZCBnbyBpbnRvIGEgZGlmZmVyZW50IGJ1bmRsZQorCXB1YmxpYyBzdGF0aWMgSUVjbGlwc2VDb250ZXh0IGNyZWF0ZURlZmF1bHRIZWFkbGVzc0NvbnRleHQoKSB7CisJCUlFY2xpcHNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IEVjbGlwc2VDb250ZXh0RmFjdG9yeQorCQkJCS5jcmVhdGVTZXJ2aWNlQ29udGV4dChXb3JrYmVuY2hTV1RBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSk7CisKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCk7CisJCUV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlciA9IG5ldyBFeGNlcHRpb25IYW5kbGVyKCk7CisJCVJlZmxlY3Rpb25Db250cmlidXRpb25GYWN0b3J5IGNvbnRyaWJ1dGlvbkZhY3RvcnkgPSBuZXcgUmVmbGVjdGlvbkNvbnRyaWJ1dGlvbkZhY3RvcnkoCisJCQkJcmVnaXN0cnkpOworCQlzZXJ2aWNlQ29udGV4dC5zZXQoSUNvbnRyaWJ1dGlvbkZhY3RvcnkuY2xhc3MsIGNvbnRyaWJ1dGlvbkZhY3RvcnkpOworCQlzZXJ2aWNlQ29udGV4dC5zZXQoSUV4Y2VwdGlvbkhhbmRsZXIuY2xhc3MsIGV4Y2VwdGlvbkhhbmRsZXIpOworCQlzZXJ2aWNlQ29udGV4dC5zZXQoSUV4dGVuc2lvblJlZ2lzdHJ5LmNsYXNzLCByZWdpc3RyeSk7CisKKwkJc2VydmljZUNvbnRleHQuc2V0KEFkYXB0ZXIuY2xhc3MsIENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoCisJCQkJRWNsaXBzZUFkYXB0ZXIuY2xhc3MsIHNlcnZpY2VDb250ZXh0KSk7CisKKwkJLy8gTm8gZGVmYXVsdCBsb2cgcHJvdmlkZXIgYXZhaWxhYmxlCisJCWlmIChzZXJ2aWNlQ29udGV4dC5nZXQoSUxvZ2dlclByb3ZpZGVyLmNsYXNzKSA9PSBudWxsKSB7CisJCQlzZXJ2aWNlQ29udGV4dC5zZXQoSUxvZ2dlclByb3ZpZGVyLmNsYXNzLCBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeQorCQkJCQkubWFrZShEZWZhdWx0TG9nZ2VyUHJvdmlkZXIuY2xhc3MsIHNlcnZpY2VDb250ZXh0KSk7CisJCX0KKworCQlyZXR1cm4gc2VydmljZUNvbnRleHQ7CisJfQorCisJLy8gVE9ETyBUaGlzIHNob3VsZCBnbyBpbnRvIGEgZGlmZmVyZW50IGJ1bmRsZQorCXB1YmxpYyBzdGF0aWMgSUVjbGlwc2VDb250ZXh0IGNyZWF0ZURlZmF1bHRDb250ZXh0KCkgeworCQlJRWNsaXBzZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBjcmVhdGVEZWZhdWx0SGVhZGxlc3NDb250ZXh0KCk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBhcHBDb250ZXh0ID0gc2VydmljZUNvbnRleHQKKwkJCQkuY3JlYXRlQ2hpbGQoIldvcmtiZW5jaENvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAorCQlhcHBDb250ZXh0LnNldChJTlNUQU5DRUlELCBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsKKwkJYXBwQ29udGV4dAorCQkJCS5zZXQoTG9nZ2VyLmNsYXNzLCBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKAorCQkJCQkJV29ya2JlbmNoTG9nZ2VyLmNsYXNzLCBhcHBDb250ZXh0KSk7CisKKwkJYXBwQ29udGV4dC5zZXQoRU1vZGVsU2VydmljZS5jbGFzcywgbmV3IE1vZGVsU2VydmljZUltcGwoYXBwQ29udGV4dCkpOworCisJCWFwcENvbnRleHQuc2V0KEVQbGFjZWhvbGRlclJlc29sdmVyLmNsYXNzLCBuZXcgUGxhY2Vob2xkZXJSZXNvbHZlcigpKTsKKworCQkvLyBzZXR1cCBmb3IgY29tbWFuZHMgYW5kIGhhbmRsZXJzCisJCWFwcENvbnRleHQuc2V0KElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9QQVJULAorCQkJCW5ldyBBY3RpdmVQYXJ0TG9va3VwRnVuY3Rpb24oKSk7CisKKwkJYXBwQ29udGV4dC5zZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NIRUxMLAorCQkJCW5ldyBBY3RpdmVDaGlsZExvb2t1cEZ1bmN0aW9uKElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9TSEVMTCwKKwkJCQkJCUU0V29ya2JlbmNoLkxPQ0FMX0FDVElWRV9TSEVMTCkpOworCisJCWFwcENvbnRleHQuc2V0KElTdHlsaW5nRW5naW5lLmNsYXNzLCBuZXcgSVN0eWxpbmdFbmdpbmUoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShPYmplY3Qgd2lkZ2V0LCBTdHJpbmcgY2xhc3NuYW1lKSB7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgc2V0SWQoT2JqZWN0IHdpZGdldCwgU3RyaW5nIGlkKSB7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgc3R5bGUoT2JqZWN0IHdpZGdldCkgeworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKE9iamVjdCB3aWRnZXQpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWVBbmRJZChPYmplY3Qgd2lkZ2V0LCBTdHJpbmcgY2xhc3NuYW1lLAorCQkJCQlTdHJpbmcgaWQpIHsKKwkJCX0KKwkJfSk7CisKKwkJLy8gdHJhbnNsYXRpb24KKwkJaW5pdGlhbGl6ZUxvY2FsaXphdGlvbihhcHBDb250ZXh0KTsKKworCQkvLyBUT0RPIFJBUCBzcGVjaWZpYyBzdHVmZgorCQlhcHBDb250ZXh0LnNldChTZXR0aW5nU3RvcmUuY2xhc3MsIFJXVC5nZXRTZXR0aW5nU3RvcmUoKSk7CisKKwkJcmV0dXJuIGFwcENvbnRleHQ7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIGNvbnRleHQgd2l0aCB0aGUgbG9jYWxlIGFuZCB0aGUgVHJhbnNsYXRpb25TZXJ2aWNlCisJICogdG8gdXNlLgorCSAqCisJICogQHBhcmFtIGFwcENvbnRleHQKKwkgKiAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IHRvIHdoaWNoIHRoZSBsb2NhbGUgYW5kIHRoZQorCSAqICAgICAgICAgICAgVHJhbnNsYXRpb25TZXJ2aWNlIHNob3VsZCBiZSBzZXQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplTG9jYWxpemF0aW9uKElFY2xpcHNlQ29udGV4dCBhcHBDb250ZXh0KSB7CisJCVN0cmluZyBsb2NhbGUgPSBSV1QuZ2V0TG9jYWxlKCkudG9TdHJpbmcoKTsKKwkJYXBwQ29udGV4dC5zZXQoVHJhbnNsYXRpb25TZXJ2aWNlLkxPQ0FMRSwgbmV3IExvY2FsZShsb2NhbGUpKTsKKwkJYXBwQ29udGV4dC5zZXQoVHJhbnNsYXRpb25TZXJ2aWNlLmNsYXNzLCBUcmFuc2xhdGlvblByb3ZpZGVyRmFjdG9yeS5idW5kbGVUcmFuc2xhdGlvblNlcnZpY2UoYXBwQ29udGV4dCkpOworCX0KKworCS8qKgorCSAqIFNpbXBsaWZpZWQgY29weSBvZiBJREVBcGxpY2F0aW9uIHByb2Nlc3NpbmcgdGhhdCBkb2VzIG5vdCBvZmZlciB0byBjaG9vc2UKKwkgKiBhIHdvcmtzcGFjZSBsb2NhdGlvbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tJbnN0YW5jZUxvY2F0aW9uKExvY2F0aW9uIGluc3RhbmNlTG9jYXRpb24sCisJCQlTaGVsbCBzaGVsbCwgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKworCQkvLyBFY2xpcHNlIGhhcyBiZWVuIHJ1biB3aXRoIC1kYXRhIEBub25lIG9yIC1kYXRhIEBub0RlZmF1bHQgb3B0aW9ucyBzbworCQkvLyB3ZSBkb24ndCBuZWVkIHRvIHZhbGlkYXRlIHRoZSBsb2NhdGlvbgorCQlpZiAoaW5zdGFuY2VMb2NhdGlvbiA9PSBudWxsCisJCQkJJiYgQm9vbGVhbi5GQUxTRS5lcXVhbHMoY29udGV4dC5nZXQoSVdvcmtiZW5jaC5QRVJTSVNUX1NUQVRFKSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYgKGluc3RhbmNlTG9jYXRpb24gPT0gbnVsbCkgeworCQkJTWVzc2FnZURpYWxvZworCQkJCQkub3BlbkVycm9yKAorCQkJCQkJCXNoZWxsLAorCQkJCQkJCVdvcmtiZW5jaFNXVE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZU1hbmRhdG9yeVRpdGxlLAorCQkJCQkJCVdvcmtiZW5jaFNXVE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZU1hbmRhdG9yeU1lc3NhZ2UpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gLWRhdGEgIi92YWxpZC9wYXRoIiwgd29ya3NwYWNlIGFscmVhZHkgc2V0CisJCWlmIChpbnN0YW5jZUxvY2F0aW9uLmlzU2V0KCkpIHsKKwkJCS8vIG1ha2Ugc3VyZSB0aGUgbWV0YSBkYXRhIHZlcnNpb24gaXMgY29tcGF0aWJsZSAob3IgdGhlIHVzZXIKKwkJCS8vIGhhcworCQkJLy8gY2hvc2VuIHRvIG92ZXJ3cml0ZSBpdCkuCisJCQlpZiAoIWNoZWNrVmFsaWRXb3Jrc3BhY2Uoc2hlbGwsIGluc3RhbmNlTG9jYXRpb24uZ2V0VVJMKCkpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvLyBhdCB0aGlzIHBvaW50IGl0cyB2YWxpZCwgc28gdHJ5IHRvIGxvY2sgaXQgYW5kIHVwZGF0ZSB0aGUKKwkJCS8vIG1ldGFkYXRhIHZlcnNpb24gaW5mb3JtYXRpb24gaWYgc3VjY2Vzc2Z1bAorCQkJdHJ5IHsKKwkJCQlpZiAoaW5zdGFuY2VMb2NhdGlvbi5sb2NrKCkpIHsKKwkJCQkJd3JpdGVXb3Jrc3BhY2VWZXJzaW9uKCk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCS8vIHdlIGZhaWxlZCB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeS4KKwkJCQkvLyBUd28gcG9zc2liaWxpdGllczoKKwkJCQkvLyAxLiBkaXJlY3RvcnkgaXMgYWxyZWFkeSBpbiB1c2UKKwkJCQkvLyAyLiBkaXJlY3RvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQKKwkJCQlGaWxlIHdvcmtzcGFjZURpcmVjdG9yeSA9IG5ldyBGaWxlKGluc3RhbmNlTG9jYXRpb24uZ2V0VVJMKCkKKwkJCQkJCS5nZXRGaWxlKCkpOworCQkJCWlmICh3b3Jrc3BhY2VEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKwkJCQkJTWVzc2FnZURpYWxvZworCQkJCQkJCS5vcGVuRXJyb3IoCisJCQkJCQkJCQlzaGVsbCwKKwkJCQkJCQkJCVdvcmtiZW5jaFNXVE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdExvY2tUaXRsZSwKKwkJCQkJCQkJCVdvcmtiZW5jaFNXVE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlNZXNzYWdlRGlhbG9nCisJCQkJCQkJLm9wZW5FcnJvcigKKwkJCQkJCQkJCXNoZWxsLAorCQkJCQkJCQkJV29ya2JlbmNoU1dUTWVzc2FnZXMuSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90QmVTZXRUaXRsZSwKKwkJCQkJCQkJCVdvcmtiZW5jaFNXVE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdEJlU2V0TWVzc2FnZSk7CisJCQkJfQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCUxvZ2dlciBsb2dnZXIgPSBuZXcgV29ya2JlbmNoTG9nZ2VyKFBMVUdJTl9JRCk7CisJCQkJbG9nZ2VyLmVycm9yKGUpOworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLAorCQkJCQkJV29ya2JlbmNoU1dUTWVzc2FnZXMuSW50ZXJuYWxFcnJvciwgZS5nZXRNZXNzYWdlKCkpOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCS8qCisJCSAqIC8vIC1kYXRhIEBub0RlZmF1bHQgb3IgLWRhdGEgbm90IHNwZWNpZmllZCwgcHJvbXB0IGFuZCBzZXQKKwkJICogQ2hvb3NlV29ya3NwYWNlRGF0YSBsYXVuY2hEYXRhID0gbmV3IENob29zZVdvcmtzcGFjZURhdGEoaW5zdGFuY2VMb2MKKwkJICogLmdldERlZmF1bHQoKSk7CisJCSAqCisJCSAqIGJvb2xlYW4gZm9yY2UgPSBmYWxzZTsgd2hpbGUgKHRydWUpIHsgVVJMIHdvcmtzcGFjZVVybCA9CisJCSAqIHByb21wdEZvcldvcmtzcGFjZShzaGVsbCwgbGF1bmNoRGF0YSwgZm9yY2UpOyBpZiAod29ya3NwYWNlVXJsID09CisJCSAqIG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9CisJCSAqCisJCSAqIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIGZpcnN0IHNlbGVjdGlvbiwgdGhlbiBmb3JjZSB0aGUgLy8KKwkJICogZGlhbG9nIHRvIG9wZW4gdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBjb3JyZWN0IGZvcmNlID0gdHJ1ZTsKKwkJICoKKwkJICogdHJ5IHsgLy8gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIHVybCBpcyBub3QgYSB2YWxpZCAvLworCQkgKiBpbnN0YW5jZSBkYXRhIGFyZWEsIHNvIG90aGVyIGNoZWNraW5nIGlzIHVubmVlZGVkIGlmCisJCSAqIChpbnN0YW5jZUxvY2F0aW9uLnNldFVSTCh3b3Jrc3BhY2VVcmwsIHRydWUpKSB7CisJCSAqIGxhdW5jaERhdGEud3JpdGVQZXJzaXN0ZWREYXRhKCk7IHdyaXRlV29ya3NwYWNlVmVyc2lvbigpOyByZXR1cm4KKwkJICogdHJ1ZTsgfSB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeyBNZXNzYWdlRGlhbG9nIC5vcGVuRXJyb3IoCisJCSAqIHNoZWxsLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RCZVNldFRpdGxlLAorCQkgKiBJREVXb3JrYmVuY2hNZXNzYWdlcy5JREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RCZVNldE1lc3NhZ2UpOworCQkgKiByZXR1cm4gZmFsc2U7IH0KKwkJICoKKwkJICogLy8gYnkgdGhpcyBwb2ludCBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkIHRoYXQgdGhlIHdvcmtzcGFjZSBpcyAvLworCQkgKiBhbHJlYWR5IGluIHVzZSAtLSBmb3JjZSB0aGUgdXNlciB0byBjaG9vc2UgYWdhaW4KKwkJICogTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsCisJCSAqIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUluVXNlVGl0bGUsCisJCSAqIElERVdvcmtiZW5jaE1lc3NhZ2VzLklERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUluVXNlTWVzc2FnZSk7IH0KKwkJICovCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgZGlyZWN0b3J5IGlzIG9rIHRvIHVzZSBhcyBhIHdvcmtzcGFjZSBhbmQKKwkgKiBmYWxzZSBvdGhlcndpc2UuIEEgdmVyc2lvbiBjaGVjayB3aWxsIGJlIHBlcmZvcm1lZCwgYW5kIGEgY29uZmlybWF0aW9uCisJICogYm94IG1heSBiZSBkaXNwbGF5ZWQgb24gdGhlIGFyZ3VtZW50IHNoZWxsIGlmIGFuIG9sZGVyIHZlcnNpb24gaXMKKwkgKiBkZXRlY3RlZC4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgVVJMIGlzIG9rIHRvIHVzZSBhcyBhIHdvcmtzcGFjZSBhbmQgZmFsc2UKKwkgKiAgICAgICAgIG90aGVyd2lzZS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tWYWxpZFdvcmtzcGFjZShTaGVsbCBzaGVsbCwgVVJMIHVybCkgeworCQkvLyBhIG51bGwgdXJsIGlzIG5vdCBhIHZhbGlkIHdvcmtzcGFjZQorCQlpZiAodXJsID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCVN0cmluZyB2ZXJzaW9uID0gcmVhZFdvcmtzcGFjZVZlcnNpb24odXJsKTsKKworCQkvLyBpZiB0aGUgdmVyc2lvbiBjb3VsZCBub3QgYmUgcmVhZCwgdGhlbiB0aGVyZSBpcyBub3QgYW55IGV4aXN0aW5nCisJCS8vIHdvcmtzcGFjZSBkYXRhIHRvIHRyYW1wbGUsIGUuZy4sIHBlcmhhcHMgaXRzIGEgbmV3IGRpcmVjdG9yeSB0aGF0CisJCS8vIGlzIGp1c3Qgc3RhcnRpbmcgdG8gYmUgdXNlZCBhcyBhIHdvcmtzcGFjZQorCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWZpbmFsIGludCBpZGVfdmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQoV09SS1NQQUNFX1ZFUlNJT05fVkFMVUUpOworCQlpbnQgd29ya3NwYWNlX3ZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb24pOworCisJCS8vIGVxdWFsaXR5IHRlc3QgaXMgcmVxdWlyZWQgc2luY2UgYW55IHZlcnNpb24gZGlmZmVyZW5jZSAobmV3ZXIKKwkJLy8gb3Igb2xkZXIpIG1heSByZXN1bHQgaW4gZGF0YSBiZWluZyB0cmFtcGxlZAorCQlpZiAod29ya3NwYWNlX3ZlcnNpb24gPT0gaWRlX3ZlcnNpb24pIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJLy8gQXQgdGhpcyBwb2ludCB3b3Jrc3BhY2UgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gYmUgZnJvbSBhIHZlcnNpb24KKwkJLy8gb3RoZXIgdGhhbiB0aGUgY3VycmVudCBpZGUgdmVyc2lvbiAtLSBmaW5kIG91dCBpZiB0aGUgdXNlciB3YW50cworCQkvLyB0byB1c2UgaXQgYW55aG93LgorCQlTdHJpbmcgdGl0bGUgPSBXb3JrYmVuY2hTV1RNZXNzYWdlcy5JREVBcHBsaWNhdGlvbl92ZXJzaW9uVGl0bGU7CisJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCisJCQkJV29ya2JlbmNoU1dUTWVzc2FnZXMuSURFQXBwbGljYXRpb25fdmVyc2lvbk1lc3NhZ2UsCisJCQkJdXJsLmdldEZpbGUoKSk7CisKKwkJTWVzc2FnZUJveCBtYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5DQU5DRUwKKwkJCQl8IFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQltYm94LnNldFRleHQodGl0bGUpOworCQltYm94LnNldE1lc3NhZ2UobWVzc2FnZSk7CisJCXJldHVybiBtYm94Lm9wZW4oKSA9PSBTV1QuT0s7CisJfQorCisJLyoqCisJICogTG9vayBhdCB0aGUgYXJndW1lbnQgVVJMIGZvciB0aGUgd29ya3NwYWNlJ3MgdmVyc2lvbiBpbmZvcm1hdGlvbi4gUmV0dXJuCisJICogdGhhdCB2ZXJzaW9uIGlmIGZvdW5kIGFuZCBudWxsIG90aGVyd2lzZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFdvcmtzcGFjZVZlcnNpb24oVVJMIHdvcmtzcGFjZSkgeworCQlGaWxlIHZlcnNpb25GaWxlID0gZ2V0VmVyc2lvbkZpbGUod29ya3NwYWNlLCBmYWxzZSk7CisJCWlmICh2ZXJzaW9uRmlsZSA9PSBudWxsIHx8ICF2ZXJzaW9uRmlsZS5leGlzdHMoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQl0cnkgeworCQkJLy8gQWx0aG91Z2ggdGhlIHZlcnNpb24gZmlsZSBpcyBub3Qgc3BlYydlZCB0byBiZSBhIEphdmEgcHJvcGVydGllcworCQkJLy8gZmlsZSwgaXQgaGFwcGVucyB0byBmb2xsb3cgdGhlIHNhbWUgZm9ybWF0IGN1cnJlbnRseSwgc28gdXNpbmcKKwkJCS8vIFByb3BlcnRpZXMgdG8gcmVhZCBpdCBpcyBjb252ZW5pZW50LgorCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCQlGaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHZlcnNpb25GaWxlKTsKKwkJCXRyeSB7CisJCQkJcHJvcHMubG9hZChpcyk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlzLmNsb3NlKCk7CisJCQl9CisKKwkJCXJldHVybiBwcm9wcy5nZXRQcm9wZXJ0eShXT1JLU1BBQ0VfVkVSU0lPTl9LRVkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlMb2dnZXIgbG9nZ2VyID0gbmV3IFdvcmtiZW5jaExvZ2dlcihQTFVHSU5fSUQpOworCQkJbG9nZ2VyLmVycm9yKGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBXcml0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgbWV0YWRhdGEgaW50byBhIGtub3duIGZpbGUgb3ZlcndyaXRpbmcgYW55CisJICogZXhpc3RpbmcgZmlsZSBjb250ZW50cy4gV3JpdGluZyB0aGUgdmVyc2lvbiBmaWxlIGlzbid0IHJlYWxseSBjcnVjaWFsLCBzbworCSAqIHRoZSBmdW5jdGlvbiBpcyBzaWxlbnQgYWJvdXQgZmFpbHVyZQorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVXb3Jrc3BhY2VWZXJzaW9uKCkgeworCQlMb2NhdGlvbiBpbnN0YW5jZUxvYyA9IFBsYXRmb3JtLmdldEluc3RhbmNlTG9jYXRpb24oKTsKKwkJaWYgKGluc3RhbmNlTG9jID09IG51bGwgfHwgaW5zdGFuY2VMb2MuaXNSZWFkT25seSgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlGaWxlIHZlcnNpb25GaWxlID0gZ2V0VmVyc2lvbkZpbGUoaW5zdGFuY2VMb2MuZ2V0VVJMKCksIHRydWUpOworCQlpZiAodmVyc2lvbkZpbGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgdmVyc2lvbkxpbmUgPSBXT1JLU1BBQ0VfVkVSU0lPTl9LRVkgKyAnPScKKwkJCQkJKyBXT1JLU1BBQ0VfVkVSU0lPTl9WQUxVRTsKKworCQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odmVyc2lvbkZpbGUpOworCQkJb3V0cHV0LndyaXRlKHZlcnNpb25MaW5lLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlMb2dnZXIgbG9nZ2VyID0gbmV3IFdvcmtiZW5jaExvZ2dlcihQTFVHSU5fSUQpOworCQkJbG9nZ2VyLmVycm9yKGUpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKKwkJCQkJb3V0cHV0LmNsb3NlKCk7CisJCQkJfQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSB2ZXJzaW9uIGZpbGUgaXMgc3RvcmVkIGluIHRoZSBtZXRhZGF0YSBhcmVhIG9mIHRoZSB3b3Jrc3BhY2UuIFRoaXMKKwkgKiBtZXRob2QgcmV0dXJucyBhbiBVUkwgdG8gdGhlIGZpbGUgb3IgbnVsbCBpZiB0aGUgZGlyZWN0b3J5IG9yIGZpbGUgZG9lcworCSAqIG5vdCBleGlzdCAoYW5kIHRoZSBjcmVhdGUgcGFyYW1ldGVyIGlzIGZhbHNlKS4KKwkgKgorCSAqIEBwYXJhbSBjcmVhdGUKKwkgKiAgICAgICAgICAgIElmIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGUgZG9lcyBub3QgZXhpc3QgdGhpcyBwYXJhbWV0ZXIKKwkgKiAgICAgICAgICAgIGNvbnRyb2xzIHdoZXRoZXIgaXQgd2lsbCBiZSBjcmVhdGVkLgorCSAqIEByZXR1cm4gQW4gdXJsIHRvIHRoZSBmaWxlIG9yIG51bGwgaWYgdGhlIHZlcnNpb24gZmlsZSBkb2VzIG5vdCBleGlzdCBvcgorCSAqICAgICAgICAgY291bGQgbm90IGJlIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRWZXJzaW9uRmlsZShVUkwgd29ya3NwYWNlVXJsLCBib29sZWFuIGNyZWF0ZSkgeworCQlpZiAod29ya3NwYWNlVXJsID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJdHJ5IHsKKwkJCS8vIG1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cworCQkJRmlsZSBtZXRhRGlyID0gbmV3IEZpbGUod29ya3NwYWNlVXJsLmdldFBhdGgoKSwgTUVUQURBVEFfRk9MREVSKTsKKwkJCWlmICghbWV0YURpci5leGlzdHMoKSAmJiAoIWNyZWF0ZSB8fCAhbWV0YURpci5ta2RpcigpKSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgZXhpc3RzCisJCQlGaWxlIHZlcnNpb25GaWxlID0gbmV3IEZpbGUobWV0YURpciwgVkVSU0lPTl9GSUxFTkFNRSk7CisJCQlpZiAoIXZlcnNpb25GaWxlLmV4aXN0cygpCisJCQkJCSYmICghY3JlYXRlIHx8ICF2ZXJzaW9uRmlsZS5jcmVhdGVOZXdGaWxlKCkpKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCXJldHVybiB2ZXJzaW9uRmlsZTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gY2Fubm90IGxvZyBiZWNhdXNlIGluc3RhbmNlIGFyZWEgaGFzIG5vdCBiZWVuIHNldAorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgQ09OVEVYVF9JTklUSUFMSVpFRCA9ICJvcmcuZWNsaXBzZS51aS5jb250ZXh0SW5pdGlhbGl6ZWQiOworCisJc3RhdGljIHB1YmxpYyB2b2lkIGluaXRpYWxpemVTZXJ2aWNlcyhNQXBwbGljYXRpb24gYXBwTW9kZWwpIHsKKwkJSUVjbGlwc2VDb250ZXh0IGFwcENvbnRleHQgPSBhcHBNb2RlbC5nZXRDb250ZXh0KCk7CisJCS8vIG1ha2Ugc3VyZSB3ZSBvbmx5IGFkZCB0cmFja2VycyBvbmNlCisJCWlmIChhcHBDb250ZXh0LmNvbnRhaW5zS2V5KENPTlRFWFRfSU5JVElBTElaRUQpKQorCQkJcmV0dXJuOworCQlhcHBDb250ZXh0LnNldChDT05URVhUX0lOSVRJQUxJWkVELCAidHJ1ZSIpOworCQlpbml0aWFsaXplQXBwbGljYXRpb25TZXJ2aWNlcyhhcHBDb250ZXh0KTsKKwkJTGlzdDxNV2luZG93PiB3aW5kb3dzID0gYXBwTW9kZWwuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChNV2luZG93IGNoaWxkV2luZG93IDogd2luZG93cykgeworCQkJaW5pdGlhbGl6ZVdpbmRvd1NlcnZpY2VzKGNoaWxkV2luZG93KTsKKwkJfQorCQkoKEVPYmplY3QpIGFwcE1vZGVsKS5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNQXBwbGljYXRpb24uY2xhc3MpICE9IFVpUGFja2FnZUltcGwuRUxFTUVOVF9DT05UQUlORVJfX0NISUxEUkVOKQorCQkJCQlyZXR1cm47CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uQUREKQorCQkJCQlyZXR1cm47CisJCQkJTVdpbmRvdyBjaGlsZFdpbmRvdyA9IChNV2luZG93KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKKwkJCQlpbml0aWFsaXplV2luZG93U2VydmljZXMoY2hpbGRXaW5kb3cpOworCQkJfQorCQl9KTsKKwl9CisKKwlzdGF0aWMgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFwcGxpY2F0aW9uU2VydmljZXMoSUVjbGlwc2VDb250ZXh0IGFwcENvbnRleHQpIHsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHRoZUNvbnRleHQgPSBhcHBDb250ZXh0OworCQkvLyB3ZSBhZGQgYSBzcGVjaWFsIHRyYWNrZXIgdG8gYnJpbmcgdXAgY3VycmVudCBzZWxlY3Rpb24gZnJvbQorCQkvLyB0aGUgYWN0aXZlIHdpbmRvdyB0byB0aGUgYXBwbGljYXRpb24gbGV2ZWwKKwkJYXBwQ29udGV4dC5ydW5BbmRUcmFjayhuZXcgUnVuQW5kVHJhY2soKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCQkJSUVjbGlwc2VDb250ZXh0IGFjdGl2ZUNoaWxkQ29udGV4dCA9IGNvbnRleHQuZ2V0QWN0aXZlQ2hpbGQoKTsKKwkJCQlpZiAoYWN0aXZlQ2hpbGRDb250ZXh0ICE9IG51bGwpIHsKKwkJCQkJT2JqZWN0IHNlbGVjdGlvbiA9IGFjdGl2ZUNoaWxkQ29udGV4dAorCQkJCQkJCS5nZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTik7CisJCQkJCXRoZUNvbnRleHQuc2V0KElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9TRUxFQ1RJT04sCisJCQkJCQkJc2VsZWN0aW9uKTsKKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0pOworCisJCS8vIHdlIGNyZWF0ZSBhIHNlbGVjdGlvbiBzZXJ2aWNlIGhhbmRsZSBvbiBldmVyeSBub2RlIHRoYXQgd2UgYXJlIGFza2VkCisJCS8vIGFib3V0IGFzIGhhbmRsZSBuZWVkcyB0byBrbm93IGl0cyBjb250ZXh0CisJCWFwcENvbnRleHQuc2V0KEVTZWxlY3Rpb25TZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwKKwkJCQluZXcgQ29udGV4dEZ1bmN0aW9uKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE9iamVjdCBjb21wdXRlKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LAorCQkJCQkJCVN0cmluZyBjb250ZXh0S2V5KSB7CisJCQkJCQlyZXR1cm4gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZSgKKwkJCQkJCQkJU2VsZWN0aW9uU2VydmljZUltcGwuY2xhc3MsIGNvbnRleHQpOworCQkJCQl9CisJCQkJfSk7CisJfQorCisJc3RhdGljIHB1YmxpYyB2b2lkIGluaXRpYWxpemVXaW5kb3dTZXJ2aWNlcyhNV2luZG93IGNoaWxkV2luZG93KSB7CisJCUlFY2xpcHNlQ29udGV4dCB3aW5kb3dDb250ZXh0ID0gY2hpbGRXaW5kb3cuZ2V0Q29udGV4dCgpOworCQlpbml0V2luZG93Q29udGV4dCh3aW5kb3dDb250ZXh0KTsKKwkJLy8gTW9zdGx5IE1XaW5kb3cgY29udGV4dHMgYXJlIGxhemlseSBjcmVhdGVkIGJ5IHJlbmRlcmVycyBhbmQgaXMgbm90CisJCS8vIHNldCBhdCB0aGlzIHBvaW50LgorCQkoKEVPYmplY3QpIGNoaWxkV2luZG93KS5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNV2luZG93LmNsYXNzKSAhPSBCYXNpY1BhY2thZ2VJbXBsLldJTkRPV19fQ09OVEVYVCkKKwkJCQkJcmV0dXJuOworCQkJCUlFY2xpcHNlQ29udGV4dCB3aW5kb3dDb250ZXh0ID0gKElFY2xpcHNlQ29udGV4dCkgbm90aWZpY2F0aW9uCisJCQkJCQkuZ2V0TmV3VmFsdWUoKTsKKwkJCQlpbml0V2luZG93Q29udGV4dCh3aW5kb3dDb250ZXh0KTsKKwkJCX0KKwkJfSk7CisJfQorCisJc3RhdGljIHByaXZhdGUgdm9pZCBpbml0V2luZG93Q29udGV4dChJRWNsaXBzZUNvbnRleHQgd2luZG93Q29udGV4dCkgeworCQlpZiAod2luZG93Q29udGV4dCA9PSBudWxsKQorCQkJcmV0dXJuOworCQlTZWxlY3Rpb25BZ2dyZWdhdG9yIHNlbGVjdGlvbkFnZ3JlZ2F0b3IgPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKAorCQkJCVNlbGVjdGlvbkFnZ3JlZ2F0b3IuY2xhc3MsIHdpbmRvd0NvbnRleHQpOworCQl3aW5kb3dDb250ZXh0LnNldChTZWxlY3Rpb25BZ2dyZWdhdG9yLmNsYXNzLCBzZWxlY3Rpb25BZ2dyZWdhdG9yKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvRTRUZXN0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0U0VGVzdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2YwNTllCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0U0VGVzdGFibGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKKworLyoqCisgKiBUaGUgV29ya2JlbmNoJ3MgdGVzdGFibGUgb2JqZWN0IGZhY2FkZSB0byBhIHRlc3QgaGFybmVzcy4KKyAqIAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgY2xhc3MgRTRUZXN0YWJsZSB7Cit9CisvLyBleHRlbmRzIFRlc3RhYmxlT2JqZWN0IHsKKy8vCisvLyBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKKy8vCisvLyBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOworLy8KKy8vIHByaXZhdGUgYm9vbGVhbiBvbGRBdXRvbWF0ZWRNb2RlOworLy8KKy8vIHByaXZhdGUgYm9vbGVhbiBvbGRJZ25vcmVFcnJvcnM7CisvLworLy8gLyoqCisvLyAqIENvbnN0cnVjdHMgYSBuZXcgd29ya2JlbmNoIHRlc3RhYmxlIG9iamVjdC4KKy8vICovCisvLyBwdWJsaWMgRTRUZXN0YWJsZSgpIHsKKy8vIC8vIGRvIG5vdGhpbmcKKy8vIH0KKy8vCisvLyAvKioKKy8vICogSW5pdGlhbGl6ZXMgdGhlIHdvcmtiZW5jaCB0ZXN0YWJsZSB3aXRoIHRoZSBkaXNwbGF5IGFuZCB3b3JrYmVuY2gsIGFuZAorLy8gKiBub3RpZmllcyBhbGwgbGlzdGVuZXJzIHRoYXQgdGhlIHRlc3RzIGNhbiBiZSBydW4uCisvLyAqCisvLyAqIEBwYXJhbSBkaXNwbGF5CisvLyAqIHRoZSBkaXNwbGF5CisvLyAqIEBwYXJhbSB3b3JrYmVuY2gKKy8vICogdGhlIHdvcmtiZW5jaAorLy8gKi8KKy8vIHB1YmxpYyB2b2lkIGluaXQoRGlzcGxheSBkaXNwbGF5LCBJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworLy8gQXNzZXJ0LmlzTm90TnVsbChkaXNwbGF5KTsKKy8vIEFzc2VydC5pc05vdE51bGwod29ya2JlbmNoKTsKKy8vIHRoaXMuZGlzcGxheSA9IGRpc3BsYXk7CisvLyB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKKy8vIGlmIChnZXRUZXN0SGFybmVzcygpICE9IG51bGwpIHsKKy8vIC8vIGRvbid0IHVzZSBhIGpvYiwgc2luY2UgdGVzdHMgb2Z0ZW4gd2FpdCBmb3IgYWxsIGpvYnMgdG8gY29tcGxldGUKKy8vIC8vIGJlZm9yZSBwcm9jZWVkaW5nCisvLyBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKy8vIEBPdmVycmlkZQorLy8gcHVibGljIHZvaWQgcnVuKCkgeworLy8gLy8gU29tZSB0ZXN0cyAobm90YWJseSB0aGUgc3RhcnR1cCBwZXJmb3JtYW5jZSB0ZXN0cykgZG8gbm90CisvLyAvLyB3YW50IHRvIHdhaXQgZm9yIGVhcmx5IHN0YXJ0dXAuCisvLyAvLyBBbGxvdyB0aGlzIHRvIGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcgdGhlIHN5c3RlbQorLy8gLy8gcHJvcGVydHk6IG9yZy5lY2xpcHNlLnVpLnRlc3RzV2FpdEZvckVhcmx5U3RhcnR1cD1mYWxzZQorLy8gLy8gRm9yIGRldGFpbHMsIHNlZSBidWcgOTQxMjkgW1dvcmtiZW5jaF0gUGVyZm9ybWFuY2UgdGVzdAorLy8gLy8gcmVncmVzc2lvbiBjYXVzZWQgYnkgd29ya2JlbmNoIGhhcm5lc3MgY2hhbmdlCisvLwkJCQkJaWYgKCEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS51aS50ZXN0c1dhaXRGb3JFYXJseVN0YXJ0dXAiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisvLyB3YWl0Rm9yRWFybHlTdGFydHVwKCk7CisvLyB9CisvLyBnZXRUZXN0SGFybmVzcygpLnJ1blRlc3RzKCk7CisvLyB9CisvLyB9OworLy8JCQluZXcgVGhyZWFkKHJ1bm5hYmxlLCAiV29ya2JlbmNoVGVzdGFibGUiKS5zdGFydCgpOyAvLyROT04tTkxTLTEkCisvLyB9CisvLyB9CisvLworLy8gLyoqCisvLyAqIFdhaXRzIGZvciB0aGUgZWFybHkgc3RhcnR1cCBqb2IgdG8gY29tcGxldGUuCisvLyAqLworLy8gcHJpdmF0ZSB2b2lkIHdhaXRGb3JFYXJseVN0YXJ0dXAoKSB7CisvLyB0cnkgeworLy8gSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKCJlYXJseVN0YXJ0dXAiLCBudWxsKTsKKy8vIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKy8vIC8vIGlnbm9yZQorLy8gfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworLy8gLy8gaWdub3JlCisvLyB9CisvLyB9CisvLworLy8gLyoqCisvLyAqIFRoZSA8Y29kZT5Xb3JrYmVuY2hUZXN0YWJsZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcworLy8gKiA8Y29kZT5UZXN0YWJsZU9iamVjdDwvY29kZT4gbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgd29ya2JlbmNoIGhhcyBiZWVuCisvLyAqIHNldC4KKy8vICovCisvLyBAT3ZlcnJpZGUKKy8vIHB1YmxpYyB2b2lkIHRlc3RpbmdTdGFydGluZygpIHsKKy8vIEFzc2VydC5pc05vdE51bGwod29ya2JlbmNoKTsKKy8vIG9sZEF1dG9tYXRlZE1vZGUgPSBFcnJvckRpYWxvZy5BVVRPTUFURURfTU9ERTsKKy8vIEVycm9yRGlhbG9nLkFVVE9NQVRFRF9NT0RFID0gdHJ1ZTsKKy8vIG9sZElnbm9yZUVycm9ycyA9IFNhZmVSdW5uYWJsZS5nZXRJZ25vcmVFcnJvcnMoKTsKKy8vIFNhZmVSdW5uYWJsZS5zZXRJZ25vcmVFcnJvcnModHJ1ZSk7CisvLyB9CisvLworLy8gLyoqCisvLyAqIFRoZSA8Y29kZT5Xb3JrYmVuY2hUZXN0YWJsZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcworLy8gKiA8Y29kZT5UZXN0YWJsZU9iamVjdDwvY29kZT4gbWV0aG9kIGZsdXNoZXMgdGhlIGV2ZW50IHF1ZXVlLCBydW5zIHRoZSB0ZXN0CisvLyAqIGluIGEgPGNvZGU+c3luY0V4ZWM8L2NvZGU+LCB0aGVuIGZsdXNoZXMgdGhlIGV2ZW50IHF1ZXVlIGFnYWluLgorLy8gKi8KKy8vIEBPdmVycmlkZQorLy8gcHVibGljIHZvaWQgcnVuVGVzdChSdW5uYWJsZSB0ZXN0UnVubmFibGUpIHsKKy8vIEFzc2VydC5pc05vdE51bGwod29ya2JlbmNoKTsKKy8vIGRpc3BsYXkuc3luY0V4ZWModGVzdFJ1bm5hYmxlKTsKKy8vIH0KKy8vCisvLyAvKioKKy8vICogVGhlIDxjb2RlPldvcmtiZW5jaFRlc3RhYmxlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCisvLyAqIDxjb2RlPlRlc3RhYmxlT2JqZWN0PC9jb2RlPiBtZXRob2QgZmx1c2hlcyB0aGUgZXZlbnQgcXVldWUsIHRoZW4gY2xvc2VzCisvLyAqIHRoZSB3b3JrYmVuY2guCisvLyAqLworLy8gQE92ZXJyaWRlCisvLyBwdWJsaWMgdm9pZCB0ZXN0aW5nRmluaXNoZWQoKSB7CisvLyAvLyBmb3JjZSBldmVudHMgdG8gYmUgcHJvY2Vzc2VkLCBhbmQgZW5zdXJlIHRoZSBjbG9zZSBpcyBkb25lIGluIHRoZSBVSQorLy8gLy8gdGhyZWFkCisvLyBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKy8vIEBPdmVycmlkZQorLy8gcHVibGljIHZvaWQgcnVuKCkgeworLy8gQXNzZXJ0LmlzVHJ1ZSh3b3JrYmVuY2guY2xvc2UoKSk7CisvLyB9CisvLyB9KTsKKy8vIEVycm9yRGlhbG9nLkFVVE9NQVRFRF9NT0RFID0gb2xkQXV0b21hdGVkTW9kZTsKKy8vIFNhZmVSdW5uYWJsZS5zZXRJZ25vcmVFcnJvcnMob2xkSWdub3JlRXJyb3JzKTsKKy8vIH0KKy8vIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9GYWRlckFuaW1hdGlvbkZlZWRiYWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvRmFkZXJBbmltYXRpb25GZWVkYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTJmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvRmFkZXJBbmltYXRpb25GZWVkYmFjay5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCisvKioKKyAqIENyZWF0ZXMgYW4gYW5pbWF0aW9uIGVmZmVjdCB3aGVyZSB0aGUgU2hlbGwncyBpbWFnZSBpcyBjYXB0dXJlZCBhbmQKKyAqIG92ZXItbGFpbiAoaW4gaXRzIG93biBzaGVsbCkgb24gdG9wIG9mIHRoZSByZWFsIG9uZS4gVGhpcyBpbWFnZQorICogbWFza3MgdGhlIGNoYW5nZXMgdG8gdGhlICdyZWFsJyBzaGVsbCBhbmQgdGhlbiB0aGUgY292ZXJpbmcgaW1hZ2UKKyAqIGZhZGVzIHRvIHRyYW5zcGFyZW50LCByZXZlYWxpbmcgdGhlIG5ldyBzdGF0ZS4KKyAqIAorICogVGhpcyBwcm92aWRlcyBhIG5pY2UgY3Jvc3MtZmFkZSBlZmZlY3QgZm9yIG9wZXJhdGlvbnMgbGlrZSBhCisgKiBwZXJzcGVjdGl2ZSBjaGFuZ2UgKHdoZXJlIHRoZSBvdmVyYWxsIGVmZmVjdCBvbiB0aGUgc2hlbGwgaXMgbGFyZ2UuCisgKiAKKyAqIEBzaW5jZSAzLjMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGYWRlckFuaW1hdGlvbkZlZWRiYWNrIGV4dGVuZHMJQW5pbWF0aW9uRmVlZGJhY2tCYXNlIHsKKwlwcml2YXRlIEltYWdlIGJhY2tpbmdTdG9yZTsKKworCXB1YmxpYyBGYWRlckFuaW1hdGlvbkZlZWRiYWNrKFNoZWxsIHBhcmVudFNoZWxsKSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisKKwkJaWYgKCFiYWNraW5nU3RvcmUuaXNEaXNwb3NlZCgpKQorCQkJYmFja2luZ1N0b3JlLmRpc3Bvc2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEFuaW1hdGlvbkVuZ2luZSBlbmdpbmUpIHsKKwkJLy8gUmVjdGFuZ2xlIHBzUmVjdCA9IGdldEJhc2VTaGVsbCgpLmdldEJvdW5kcygpOworCQkvLyBnZXRBbmltYXRpb25TaGVsbCgpLnNldEJvdW5kcyhwc1JlY3QpOworCQkvLworCQkvLyAvLyBDYXB0dXJlIHRoZSBiYWNrZ3JvdW5kIGltYWdlCisJCS8vIERpc3BsYXkgZGlzcGxheSA9IGdldEJhc2VTaGVsbCgpLmdldERpc3BsYXkoKTsKKwkJLy8gYmFja2luZ1N0b3JlID0gbmV3IEltYWdlKGRpc3BsYXksIHBzUmVjdCk7CisJCS8vIEdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOworCQkvLyAvLyBnYy5jb3B5QXJlYShiYWNraW5nU3RvcmUsIHBzUmVjdC54LCBwc1JlY3QueSk7CisJCS8vIGdjLmNvcHlBcmVhKGJhY2tpbmdTdG9yZSwgcHNSZWN0LngsIHBzUmVjdC55KTsKKwkJLy8gZ2MuZGlzcG9zZSgpOworCQkvLworCQkvLyBnZXRBbmltYXRpb25TaGVsbCgpLnNldEFscGhhKDI1NCk7CisJCS8vIGdldEFuaW1hdGlvblNoZWxsKCkuc2V0QmFja2dyb3VuZEltYWdlKGJhY2tpbmdTdG9yZSk7CisJCS8vIGdldEFuaW1hdGlvblNoZWxsKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW5kZXJTdGVwKEFuaW1hdGlvbkVuZ2luZSBlbmdpbmUpIHsKKwkJZ2V0QW5pbWF0aW9uU2hlbGwoKS5zZXRBbHBoYSgoaW50KSAoMjU1IC0gKGVuZ2luZS5hbW91bnQoKSoyNTUpKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0dlblRvcGljLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvR2VuVG9waWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTZlNTUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L0dlblRvcGljLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuaW1wbC5Db21tYW5kc1BhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmRlc2NyaXB0b3IuYmFzaWMuaW1wbC5CYXNpY1BhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5pbXBsLkFkdmFuY2VkUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuaW1wbC5VaVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuaW1wbC5NZW51UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKKworcHVibGljIGNsYXNzIEdlblRvcGljIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXByb2Nlc3NMaXRlcmFscyhDb21tYW5kc1BhY2thZ2VJbXBsLkxpdGVyYWxzLmNsYXNzKTsKKwkJCXByb2Nlc3NMaXRlcmFscyhCYXNpY1BhY2thZ2VJbXBsLkxpdGVyYWxzLmNsYXNzKTsKKwkJCXByb2Nlc3NMaXRlcmFscyhBcHBsaWNhdGlvblBhY2thZ2VJbXBsLkxpdGVyYWxzLmNsYXNzKTsKKwkJCXByb2Nlc3NMaXRlcmFscyhBZHZhbmNlZFBhY2thZ2VJbXBsLkxpdGVyYWxzLmNsYXNzKTsKKwkJCXByb2Nlc3NMaXRlcmFscyhvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5pbXBsLkJhc2ljUGFja2FnZUltcGwuTGl0ZXJhbHMuY2xhc3MpOworCQkJcHJvY2Vzc0xpdGVyYWxzKFVpUGFja2FnZUltcGwuTGl0ZXJhbHMuY2xhc3MpOworCQkJcHJvY2Vzc0xpdGVyYWxzKE1lbnVQYWNrYWdlSW1wbC5MaXRlcmFscy5jbGFzcyk7CisKKwkJCS8vIEFkZCBhIG5ld2xpbmUgdG8gdGhlIGxhc3QgZ2VuZXJhdGVkIGxpbmUKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NMaXRlcmFscyhDbGFzczw/PiBsaXRlcmFscykKKwkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworCQlGaWVsZFtdIGZpZWxkcyA9IGxpdGVyYWxzLmdldEZpZWxkcygpOworCQlNYXA8U3RyaW5nLCBFQ2xhc3M+IGNsYXNzZXMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEVDbGFzcz4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKwkJCU9iamVjdCB2YWx1ZSA9IGZpZWxkc1tpXS5nZXQobnVsbCk7CisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCQljbGFzc2VzLnB1dCgoKEVDbGFzcykgdmFsdWUpLmdldE5hbWUoKSwgKEVDbGFzcykgdmFsdWUpOworCQkJfQorCQl9CisJCWZvciAoRUNsYXNzIGVjIDogY2xhc3Nlcy52YWx1ZXMoKSkgeworCQkJcHJvY2Vzc0VDbGFzcyhlYyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSAiXG5cdHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlICVzIHsiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZXByZWNhdGVkVG9waWNEZWNsYXJhdGlvbiA9ICJcblxuXHRARGVwcmVjYXRlZFxuXHRwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9IFwib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvJXMvJXNcIjsgLy8kTk9OLU5MUy0xJFxuIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9waWNBbGxEZWNsYXJhdGlvbiA9ICJcblx0cHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gXCJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC8lcy8lcy8qXCI7IC8vJE5PTi1OTFMtMSQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0b3BpY0F0dHJpYnV0ZURlY2xhcmF0aW9uID0gIlxuXHRwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ18lUyA9IFwib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvJXMvJXMvJXMvKlwiOyAvLyROT04tTkxTLTEkIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgYXR0cmlidXRlRGVjbGFyYXRpb24gPSAiXG5cdHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nICVTID0gXCIlc1wiOyAvLyROT04tTkxTLTEkIjsKKworCXByaXZhdGUgdm9pZCBwcm9jZXNzRUNsYXNzKEVDbGFzcyBlQ2xhc3MpIHsKKwkJRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IGVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7CisJCWlmIChmZWF0dXJlcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgcGtnTmFtZSA9IGVDbGFzcy5nZXRFUGFja2FnZSgpLmdldE5hbWUoKTsKKwkJU3RyaW5nIGNsYXNzTmFtZSA9IGVDbGFzcy5nZXROYW1lKCk7CisJCVN5c3RlbS5vdXQucHJpbnQoIlxyXHJcdEBTdXBwcmVzc1dhcm5pbmdzKFwiamF2YWRvY1wiKSIpOworCQlTeXN0ZW0ub3V0LnByaW50KFN0cmluZy5mb3JtYXQoaW50ZXJmYWNlRGVjbGFyYXRpb24sIGNsYXNzTmFtZSkpOworCQlTeXN0ZW0ub3V0LnByaW50KCJcblxuXHQvL1RvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvIik7CisJCVN5c3RlbS5vdXQucHJpbnQoU3RyaW5nLmZvcm1hdChkZXByZWNhdGVkVG9waWNEZWNsYXJhdGlvbiwgcGtnTmFtZSwKKwkJCQljbGFzc05hbWUpKTsKKwkJU3lzdGVtLm91dAorCQkJCS5wcmludChTdHJpbmcuZm9ybWF0KHRvcGljQWxsRGVjbGFyYXRpb24sIHBrZ05hbWUsIGNsYXNzTmFtZSkpOworCisJCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworCQlmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlIDogZmVhdHVyZXMpIHsKKwkJCW5hbWVzLmFkZChmZWF0dXJlLmdldE5hbWUoKSk7CisJCX0KKworCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnQoU3RyaW5nLmZvcm1hdCh0b3BpY0F0dHJpYnV0ZURlY2xhcmF0aW9uLCBuYW1lLAorCQkJCQlwa2dOYW1lLCBjbGFzc05hbWUsIG5hbWUpKTsKKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dAorCQkJCS5wcmludCgiXG5cdC8vQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMiKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50KFN0cmluZy5mb3JtYXQoYXR0cmlidXRlRGVjbGFyYXRpb24sIG5hbWUsIG5hbWUpKTsKKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnQoIlxuXHR9Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQkvLyBub3RoaW5nIHRvIGRvCisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvSUV2ZW50TG9vcEFkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9JRXZlbnRMb29wQWR2aXNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxODIzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvSUV2ZW50TG9vcEFkdmlzb3IuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogQWxsb3cgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBpbnRlcmFjdCB3aXRoIHRoZSBldmVudCBsb29wLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElFdmVudExvb3BBZHZpc29yIHsKKwkvKioKKwkgKiBQZXJmb3JtcyBhcmJpdHJhcnkgd29yayBvciB5aWVsZHMgd2hlbiB0aGVyZSBhcmUgbm8gZXZlbnRzIHRvIGJlCisJICogcHJvY2Vzc2VkLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gbW9yZSBldmVudHMgb24gdGhlCisJICogcXVldWUgdG8gYmUgcHJvY2Vzc2VkIGF0IHRoZSBtb21lbnQuCisJICogPC9wPgorCSAqIDxwPgorCSAqIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSAoYWx0aG91Z2ggc3VwZXIgY2FsbHMgYXJlCisJICogb2theSkuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHlpZWxkcyB1bnRpbCBuZXcgZXZlbnRzIGVudGVyIHRoZQorCSAqIHF1ZXVlLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBvciBleHRlbmQgdGhpcyBtZXRob2QuIEl0IGlzIGdlbmVyYWxseSBhCisJICogYmFkIGlkZWEgdG8gb3ZlcnJpZGUgd2l0aCBhbiBlbXB0eSBtZXRob2QuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGRpc3BsYXkKKwkgKiAgICAgICAgICAgIHRoZSBtYWluIGRpc3BsYXkgb2YgdGhlIHJlbmRlcmluZyBVSQorCSAqLworCXB1YmxpYyB2b2lkIGV2ZW50TG9vcElkbGUoRGlzcGxheSBkaXNwbGF5KTsKKworCS8qKgorCSAqIFBlcmZvcm1zIGFyYml0cmFyeSBhY3Rpb25zIHdoZW4gdGhlIGV2ZW50IGxvb3AgY3Jhc2hlcyAodGhlIGNvZGUgdGhhdAorCSAqIGhhbmRsZXMgYSBVSSBldmVudCB0aHJvd3MgYW4gZXhjZXB0aW9uIHRoYXQgaXMgbm90IGNhdWdodCkuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGNvZGUgaGFuZGxpbmcgYSBVSSBldmVudCB0aHJvd3MgYW4KKwkgKiBleGNlcHRpb24uIEluIGEgcGVyZmVjdGx5IGZ1bmN0aW9uaW5nIGFwcGxpY2F0aW9uLCB0aGlzIG1ldGhvZCB3b3VsZAorCSAqIG5ldmVyIGJlIGNhbGxlZC4gSW4gcHJhY3RpY2UsIGl0IGNvbWVzIGludG8gcGxheSB3aGVuIHRoZXJlIGFyZSBidWdzIGluCisJICogdGhlIGNvZGUgdGhhdCB0cmlnZ2VyIHVuY2hlY2tlZCBydW50aW1lIGV4Y2VwdGlvbnMuIEl0IGlzIGFsc28gYWN0aXZhdGVkCisJICogd2hlbiB0aGUgc3lzdGVtIHJ1bnMgc2hvcnQgb2YgbWVtb3J5LCBldGMuIEZhdGFsIGVycm9ycyAoVGhyZWFkRGVhdGgpIGFyZQorCSAqIG5vdCBwYXNzZWQgb24gdG8gdGhpcyBtZXRob2QsIGFzIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBjb3VsZCBiZSBkb25lLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBDbGllbnRzIG11c3Qgbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkgKGFsdGhvdWdoIHN1cGVyIGNhbGxzIGFyZQorCSAqIG9rYXkpLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBsb2dzIHRoZSBwcm9ibGVtIHNvIHRoYXQgaXQgZG9lcyBub3QgZ28KKwkgKiB1bm5vdGljZWQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIG9yIGV4dGVuZCB0aGlzIG1ldGhvZC4gSXQgaXMgZ2VuZXJhbGx5CisJICogYSBiYWQgaWRlYSB0byBvdmVycmlkZSB3aXRoIGFuIGVtcHR5IG1ldGhvZCwgYW5kIHlvdSBzaG91bGQgYmUgZXNwZWNpYWxseQorCSAqIGNhcmVmdWwgd2hlbiBoYW5kbGluZyBFcnJvcnMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24gaW5zaWRlIHRoZSBVSSBldmVudAorCSAqICAgICAgICAgICAgbG9vcAorCSAqLworCXB1YmxpYyB2b2lkIGV2ZW50TG9vcEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9NZW51U2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L01lbnVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxYjU3MQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9NZW51U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NUG9wdXBNZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLkVNZW51U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmZhY3Rvcmllcy5JUmVuZGVyZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKKworcHVibGljIGNsYXNzIE1lbnVTZXJ2aWNlIGltcGxlbWVudHMgRU1lbnVTZXJ2aWNlIHsKKwlASW5qZWN0CisJcHJpdmF0ZSBNUGFydCBteVBhcnQ7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiByZWdpc3RlckNvbnRleHRNZW51KE9iamVjdCBwYXJlbnQsIFN0cmluZyBtZW51SWQpIHsKKwkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgQ29udHJvbCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb250cm9sIHBhcmVudENvbnRyb2wgPSAoQ29udHJvbCkgcGFyZW50OworCQlmb3IgKE1NZW51IG1tZW51IDogbXlQYXJ0LmdldE1lbnVzKCkpIHsKKwkJCWlmIChtZW51SWQuZXF1YWxzKG1tZW51LmdldEVsZW1lbnRJZCgpKQorCQkJCQkmJiBtbWVudSBpbnN0YW5jZW9mIE1Qb3B1cE1lbnUpIHsKKwkJCQlNZW51IG1lbnUgPSByZWdpc3Rlck1lbnUocGFyZW50Q29udHJvbCwgKE1Qb3B1cE1lbnUpIG1tZW51LAorCQkJCQkJbXlQYXJ0LmdldENvbnRleHQoKSk7CisJCQkJaWYgKG1lbnUgIT0gbnVsbCkgeworCQkJCQlwYXJlbnRDb250cm9sLnNldE1lbnUobWVudSk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgTWVudSByZWdpc3Rlck1lbnUoZmluYWwgQ29udHJvbCBwYXJlbnRDb250cm9sLCBmaW5hbCBNUG9wdXBNZW51IG1tZW51LCBJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlpZiAobW1lbnUuZ2V0V2lkZ2V0KCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIChNZW51KSBtbWVudS5nZXRXaWRnZXQoKTsKKwkJfQorCQkvLyB3ZSBuZWVkIHRvIGRlbGVnYXRlIHRvIHRoZSByZW5kZXJlciBzbyB0aGF0IGl0ICJwcm9jZXNzZXMiIHRoZQorCQkvLyBNZW51TWFuYWdlciBjb3JyZWN0bHkKKwkJSVJlbmRlcmVyRmFjdG9yeSByZW5kZXJlckZhY3RvcnkgPSBjb250ZXh0LmdldChJUmVuZGVyZXJGYWN0b3J5LmNsYXNzKTsKKwkJQWJzdHJhY3RQYXJ0UmVuZGVyZXIgcmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuZ2V0UmVuZGVyZXIobW1lbnUsIHBhcmVudENvbnRyb2wpOworCisJCUlFY2xpcHNlQ29udGV4dCBwb3B1cENvbnRleHQgPSBjb250ZXh0LmNyZWF0ZUNoaWxkKCJwb3B1cDoiICsgbW1lbnUuZ2V0RWxlbWVudElkKCkpOworCQltbWVudS5zZXRDb250ZXh0KHBvcHVwQ29udGV4dCk7CisJCU9iamVjdCB3aWRnZXQgPSByZW5kZXJlci5jcmVhdGVXaWRnZXQobW1lbnUsIHBhcmVudENvbnRyb2wpOworCQlpZiAoISh3aWRnZXQgaW5zdGFuY2VvZiBNZW51KSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmVuZGVyZXIuYmluZFdpZGdldChtbWVudSwgd2lkZ2V0KTsKKwkJcmVuZGVyZXIuaG9va0NvbnRyb2xsZXJMb2dpYyhtbWVudSk7CisKKwkJLy8gUHJvY2VzcyBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIHRocm91Z2ggdGhlIHJlbmRlcmVyIHRoYXQgY3JlYXRlZAorCQkvLyBpdAorCQlPYmplY3QgY2FzdE9iamVjdCA9IG1tZW51OworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSBjYXN0T2JqZWN0OworCQlyZW5kZXJlci5wcm9jZXNzQ29udGVudHMoY29udGFpbmVyKTsKKworCQkvLyBBbGxvdyBhIGZpbmFsIGNoYW5jZSB0byBzZXQgdXAKKwkJcmVuZGVyZXIucG9zdFByb2Nlc3MobW1lbnUpOworCisJCS8vIE5vdyB0aGF0IHdlIGhhdmUgYSB3aWRnZXQgbGV0IHRoZSBwYXJlbnQgKGlmIGFueSkga25vdworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnRFbGVtZW50ID0gbW1lbnUuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJCUFic3RyYWN0UGFydFJlbmRlcmVyIHBhcmVudFJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmdldFJlbmRlcmVyKHBhcmVudEVsZW1lbnQsIG51bGwpOworCQkJaWYgKHBhcmVudFJlbmRlcmVyICE9IG51bGwpIHsKKwkJCQlwYXJlbnRSZW5kZXJlci5jaGlsZFJlbmRlcmVkKHBhcmVudEVsZW1lbnQsIG1tZW51KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAoTWVudSkgd2lkZ2V0OworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9NZW51U2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9NZW51U2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE3OGUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L01lbnVTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLkluamVjdGlvbkV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE1lbnVTZXJ2aWNlQ3JlYXRpb25GdW5jdGlvbiBleHRlbmRzIENvbnRleHRGdW5jdGlvbiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbXB1dGUoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBjb250ZXh0S2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShNZW51U2VydmljZS5jbGFzcywgY29udGV4dCk7CisJCX0gY2F0Y2ggKEluamVjdGlvbkV4Y2VwdGlvbiBpZSkgeworCQkJLy8gd2Ugd29uJ3QgcmVwb3J0IHRoaXMgYXQgdGhlIG1vbWVudC4KKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTWVudVNlcnZpY2U6ICIgKyBjb250ZXh0ICsgIjogIiArIGllKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9QYXJ0UmVuZGVyaW5nRW5naW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvUGFydFJlbmRlcmluZ0VuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzBlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvUGFydFJlbmRlcmluZ0VuZ2luZS5qYXZhCkBAIC0wLDAgKzEsMTQ5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLm9ic2VydmFibGUuUmVhbG07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLkluamVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucy5FdmVudFRvcGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5sb2cuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuc3RhdHVzcmVwb3J0ZXIuU3RhdHVzUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Mua2V5cy5LZXlCaW5kaW5nRGlzcGF0Y2hlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmNzcy5jb3JlLnV0aWwuaW1wbC5yZXNvdXJjZXMuT1NHaVJlc291cmNlTG9jYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmNzcy5zd3QuZG9tLldpZGdldEVsZW1lbnQ7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5jc3Muc3d0LmVuZ2luZS5DU1NTV1RFbmdpbmVJbXBsOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmNzcy5zd3QuaGVscGVycy5FY2xpcHNlUHJlZmVyZW5jZXNIZWxwZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5jc3Muc3d0LnRoZW1lLklUaGVtZUVuZ2luZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmNzcy5zd3QudGhlbWUuSVRoZW1lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5Gb2N1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5QZXJzaXN0U3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guRTRXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLlBvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQ29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1HZW5lcmljU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVRyaW1tZWRXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5mYWN0b3JpZXMuSVJlbmRlcmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlNXVEtleVN1cHBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5mb3JtYXR0aW5nLktleUZvcm1hdHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcuc3d0LlNXVE9ic2VydmFibGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRlc3RpbmcuVGVzdGFibGVPYmplY3Q7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKKworcHVibGljIGNsYXNzIFBhcnRSZW5kZXJpbmdFbmdpbmUgaW1wbGVtZW50cyBJUHJlc2VudGF0aW9uRW5naW5lIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJMWV9TVEFSVFVQX0hPT0sgPSAicnVuRWFybHlTdGFydHVwIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVuZ2luZVVSSSA9ICJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QvIgorCQkJKyAib3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5QYXJ0UmVuZGVyaW5nRW5naW5lIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0RmFjdG9yeVVybCA9ICJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LyIKKwkJCSsgIm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LldvcmtiZW5jaFJlbmRlcmVyRmFjdG9yeSI7CisJcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeVVybDsKKworCUlSZW5kZXJlckZhY3RvcnkgY3VyRmFjdG9yeSA9IG51bGw7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEFic3RyYWN0UGFydFJlbmRlcmVyPiBjdXN0b21SZW5kZXJlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQWJzdHJhY3RQYXJ0UmVuZGVyZXI+KCk7CisKKwlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciBrZXlMaXN0ZW5lcjsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlVG9waWNUb0JlUmVuZGVyZWQoQEV2ZW50VG9waWMoVUlFdmVudHMuVUlFbGVtZW50LlRPUElDX1RPQkVSRU5ERVJFRCkgRXZlbnQgZXZlbnQpIHsKKworCQlNVUlFbGVtZW50IGNoYW5nZWRFbGVtZW50ID0gKE1VSUVsZW1lbnQpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJTUVsZW1lbnRDb250YWluZXI8Pz4gcGFyZW50ID0gY2hhbmdlZEVsZW1lbnQuZ2V0UGFyZW50KCk7CisKKwkJLy8gSGFuZGxlIERldGFjaGVkIFdpbmRvd3MKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlwYXJlbnQgPSAoTUVsZW1lbnRDb250YWluZXI8Pz4pICgoRU9iamVjdCkgY2hhbmdlZEVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJfQorCisJCS8vIG1lbnVzIGFyZSBub3QgaGFuZGxlZCBoZXJlLi4uID8/CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNTWVudSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gSWYgdGhlIHBhcmVudCBpc24ndCB2aXNpYmxlIHdlIGRvbid0IGNhcmUgKFRoZSBhcHBsaWNhdGlvbiBpcworCQkvLyBuZXZlciByZW5kZXJlZCkKKwkJYm9vbGVhbiBva1RvUmVuZGVyID0gcGFyZW50IGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uIHx8IHBhcmVudC5nZXRXaWRnZXQoKSAhPSBudWxsOworCisJCWlmIChjaGFuZ2VkRWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpICYmIG9rVG9SZW5kZXIpIHsKKwkJCUFjdGl2YXRvci50cmFjZShQb2xpY3kuREVCVUdfUkVOREVSRVIsICJ2aXNpYmxlIC0+IHRydWUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCisJCQkvLyBOb3RlIHRoYXQgdGhlICdjcmVhdGVHdWknIHByb3RvY29sIGNhbGxzICdjaGlsZEFkZGVkJworCQkJT2JqZWN0IHcgPSBjcmVhdGVHdWkoY2hhbmdlZEVsZW1lbnQpOworCQkJaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sICYmICEodyBpbnN0YW5jZW9mIFNoZWxsKSkgeworCQkJCWZpeFpPcmRlcihjaGFuZ2VkRWxlbWVudCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlBY3RpdmF0b3IudHJhY2UoUG9saWN5LkRFQlVHX1JFTkRFUkVSLCAidmlzaWJsZSAtPiBmYWxzZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIEVuc3VyZSB0aGF0IHRoZSBlbGVtZW50IGFib3V0IHRvIGJlIHJlbW92ZWQgaXMgbm90IHRoZQorCQkJLy8gc2VsZWN0ZWQgZWxlbWVudAorCQkJaWYgKHBhcmVudC5nZXRTZWxlY3RlZEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKKwkJCQlwYXJlbnQuc2V0U2VsZWN0ZWRFbGVtZW50KG51bGwpOworCisJCQlpZiAob2tUb1JlbmRlcikgeworCQkJCS8vIFVuLW1heGltaXplIHRoZSBlbGVtZW50IGJlZm9yZSB0ZWFyaW5nIGl0IGRvd24KKwkJCQlpZiAoY2hhbmdlZEVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKE1BWElNSVpFRCkpIHsKKwkJCQkJY2hhbmdlZEVsZW1lbnQuZ2V0VGFncygpLnJlbW92ZShNQVhJTUlaRUQpOworCQkJCX0KKworCQkJCS8vIE5vdGUgdGhhdCB0aGUgJ3JlbW92ZUd1aScgcHJvdG9jb2wgY2FsbHMgJ2NoaWxkUmVtb3ZlZCcKKwkJCQlyZW1vdmVHdWkoY2hhbmdlZEVsZW1lbnQpOworCQkJfQorCQl9CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVWaXNpYmlsaXR5SGFuZGxlcihARXZlbnRUb3BpYyhVSUV2ZW50cy5VSUVsZW1lbnQuVE9QSUNfVklTSUJMRSkgRXZlbnQgZXZlbnQpIHsKKworCQlNVUlFbGVtZW50IGNoYW5nZWRFbGVtZW50ID0gKE1VSUVsZW1lbnQpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJTVVJRWxlbWVudCBwYXJlbnQgPSBjaGFuZ2VkRWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlwYXJlbnQgPSAoTVVJRWxlbWVudCkgKChFT2JqZWN0KSBjaGFuZ2VkRWxlbWVudCkuZUNvbnRhaW5lcigpOworCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJQWJzdHJhY3RQYXJ0UmVuZGVyZXIgcmVuZGVyZXIgPSAoQWJzdHJhY3RQYXJ0UmVuZGVyZXIpIHBhcmVudC5nZXRSZW5kZXJlcigpOworCQlpZiAocmVuZGVyZXIgPT0gbnVsbCB8fCBwYXJlbnQgaW5zdGFuY2VvZiBNVG9vbEJhcikgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gUmUtcGFyZW50IHRoZSBjb250cm9sIGJhc2VkIG9uIHRoZSB2aXNpYmxlIHN0YXRlCisJCWlmIChjaGFuZ2VkRWxlbWVudC5pc1Zpc2libGUoKSkgeworCQkJaWYgKGNoYW5nZWRFbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQlpZiAoY2hhbmdlZEVsZW1lbnQuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sKSB7CisJCQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBjb250cm9sIGlzIHVuZGVyIGl0cyAncmVhbCcgcGFyZW50IGlmCisJCQkJCS8vIGl0J3MgdmlzaWJsZQorCQkJCQlDb21wb3NpdGUgcmVhbENvbXAgPSAoQ29tcG9zaXRlKSByZW5kZXJlci5nZXRVSUNvbnRhaW5lcihjaGFuZ2VkRWxlbWVudCk7CisJCQkJCUNvbnRyb2wgY3RybCA9IChDb250cm9sKSBjaGFuZ2VkRWxlbWVudC5nZXRXaWRnZXQoKTsKKwkJCQkJY3RybC5zZXRQYXJlbnQocmVhbENvbXApOworCQkJCQlmaXhaT3JkZXIoY2hhbmdlZEVsZW1lbnQpOworCQkJCX0KKworCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSBwYXJlbnQ7CisJCQkJCXJlbmRlcmVyLmNoaWxkUmVuZGVyZWQoY29udGFpbmVyLCBjaGFuZ2VkRWxlbWVudCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gUHV0IHRoZSBjb250cm9sIHVuZGVyIHRoZSAnbGltYm8nIHNoZWxsCisJCQlpZiAoY2hhbmdlZEVsZW1lbnQuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sKSB7CisJCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIGNoYW5nZWRFbGVtZW50LmdldFdpZGdldCgpOworCisJCQkJaWYgKCEoY3RybCBpbnN0YW5jZW9mIFNoZWxsKSkgeworCQkJCQljdHJsLmdldFNoZWxsKCkubGF5b3V0KG5ldyBDb250cm9sW10geyBjdHJsIH0sIFNXVC5ERUZFUik7CisJCQkJfQorCisJCQkJY3RybC5zZXRQYXJlbnQoZ2V0TGltYm9TaGVsbCgpKTsKKwkJCX0KKworCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KSB7CisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSBwYXJlbnQ7CisJCQkJcmVuZGVyZXIuaGlkZUNoaWxkKGNvbnRhaW5lciwgY2hhbmdlZEVsZW1lbnQpOworCQkJfQorCQl9CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVUcmltSGFuZGxlcihARXZlbnRUb3BpYyhVSUV2ZW50cy5UcmltbWVkV2luZG93LlRPUElDX1RSSU1CQVJTKSBFdmVudCBldmVudCkgeworCisJCU9iamVjdCBjaGFuZ2VkT2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAoIShjaGFuZ2VkT2JqIGluc3RhbmNlb2YgTVRyaW1tZWRXaW5kb3cpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNVHJpbW1lZFdpbmRvdyB3aW5kb3cgPSAoTVRyaW1tZWRXaW5kb3cpIGNoYW5nZWRPYmo7CisJCWlmICh3aW5kb3cuZ2V0V2lkZ2V0KCkgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJZm9yIChPYmplY3QgbyA6IFVJRXZlbnRzLmFzSXRlcmFibGUoZXZlbnQsIFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpKSB7CisJCQkJTVVJRWxlbWVudCBhZGRlZCA9IChNVUlFbGVtZW50KSBvOworCQkJCWlmIChhZGRlZC5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJCWNyZWF0ZUd1aShhZGRlZCwgd2luZG93LmdldFdpZGdldCgpLCB3aW5kb3cuZ2V0Q29udGV4dCgpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQlmb3IgKE9iamVjdCBvIDogVUlFdmVudHMuYXNJdGVyYWJsZShldmVudCwgVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSkpIHsKKwkJCQlNVUlFbGVtZW50IHJlbW92ZWQgPSAoTVVJRWxlbWVudCkgbzsKKwkJCQlpZiAocmVtb3ZlZC5nZXRSZW5kZXJlcigpICE9IG51bGwpIHsKKwkJCQkJcmVtb3ZlR3VpKHJlbW92ZWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIHZvaWQgc3Vic2NyaWJlQ2hpbGRyZW5IYW5kbGVyKEBFdmVudFRvcGljKFVJRXZlbnRzLkVsZW1lbnRDb250YWluZXIuVE9QSUNfQ0hJTERSRU4pIEV2ZW50IGV2ZW50KSB7CisKKwkJT2JqZWN0IGNoYW5nZWRPYmogPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisJCWlmICghKGNoYW5nZWRPYmogaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjaGFuZ2VkRWxlbWVudCA9IChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PikgY2hhbmdlZE9iajsKKwkJYm9vbGVhbiBpc0FwcGxpY2F0aW9uID0gY2hhbmdlZE9iaiBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbjsKKworCQlib29sZWFuIG1lbnVDaGlsZCA9IGNoYW5nZWRPYmogaW5zdGFuY2VvZiBNTWVudTsKKwkJLy8gSWYgdGhlIHBhcmVudCBpc24ndCBpbiB0aGUgVUkgdGhlbiB3aG8gY2FyZXM/CisJCUFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0UmVuZGVyZXJGb3IoY2hhbmdlZEVsZW1lbnQpOworCQlpZiAoKCFpc0FwcGxpY2F0aW9uICYmIHJlbmRlcmVyID09IG51bGwpIHx8IG1lbnVDaGlsZCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5ERUJVR19SRU5ERVJFUiwgIkNoaWxkIEFkZGVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoT2JqZWN0IG8gOiBVSUV2ZW50cy5hc0l0ZXJhYmxlKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFKSkgeworCQkJCU1VSUVsZW1lbnQgYWRkZWQgPSAoTVVJRWxlbWVudCkgbzsKKworCQkJCS8vIE9LLCB3ZSBoYXZlIGEgbmV3IC12aXNpYmxlLSBwYXJ0IHdlIGVpdGhlciBoYXZlIHRvIGNyZWF0ZQorCQkJCS8vIGl0IG9yIGhvc3QgaXQgdW5kZXIgdGhlIGNvcnJlY3QgcGFyZW50LiBOb3RlIHRoYXQgd2UKKwkJCQkvLyBleHBsaWNpdGx5IGRvICpub3QqIHJlbmRlciBub24tc2VsZWN0ZWQgZWxlbWVudHMgaW4KKwkJCQkvLyBzdGFja3MgKHRvIHN1cHBvcnQgbGF6eSBsb2FkaW5nKS4KKwkJCQlib29sZWFuIGlzU3RhY2sgPSBjaGFuZ2VkT2JqIGluc3RhbmNlb2YgTUdlbmVyaWNTdGFjazw/PjsKKwkJCQlib29sZWFuIGhhc1dpZGdldCA9IGFkZGVkLmdldFdpZGdldCgpICE9IG51bGw7CisJCQkJYm9vbGVhbiBpc1NlbGVjdGVkID0gYWRkZWQgPT0gY2hhbmdlZEVsZW1lbnQuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJYm9vbGVhbiByZW5kZXJJdCA9ICFpc1N0YWNrIHx8IGhhc1dpZGdldCB8fCBpc1NlbGVjdGVkOworCQkJCWlmIChyZW5kZXJJdCkgeworCQkJCQkvLyBOT1RFOiBjcmVhdGVHdWkgd2lsbCBjYWxsICdjaGlsZEFkZGVkJyBpZiBzdWNjZXNzZnVsCisJCQkJCU9iamVjdCB3ID0gY3JlYXRlR3VpKGFkZGVkKTsKKwkJCQkJaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sICYmICEodyBpbnN0YW5jZW9mIFNoZWxsKSkgeworCQkJCQkJZmluYWwgQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIHc7CisJCQkJCQlmaXhaT3JkZXIoYWRkZWQpOworCQkJCQkJaWYgKCFjdHJsLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCWN0cmwuZ2V0U2hlbGwoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IGN0cmwgfSwgU1dULkRFRkVSKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyZW5kZXJlciAhPSBudWxsICYmIGFkZGVkLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQkJCXJlbmRlcmVyLmNoaWxkUmVuZGVyZWQoY2hhbmdlZEVsZW1lbnQsIGFkZGVkKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIElmIHRoZSBlbGVtZW50IGJlaW5nIGFkZGVkIGlzIGEgcGxhY2Vob2xkZXIsIGNoZWNrIHRvIHNlZQorCQkJCS8vIGlmCisJCQkJLy8gaXQncyAnZ2xvYmFsbHkgdmlzaWJsZScgYW5kLCBpZiBzbywgcmVtb3ZlIGFsbCBvdGhlcgorCQkJCS8vICdsb2NhbCcgcGxhY2Vob2xkZXJzIHJlZmVyZW5jaW5nIHRoZSBzYW1lIGVsZW1lbnQuCisJCQkJaW50IG5ld0xvY2F0aW9uID0gbW9kZWxTZXJ2aWNlLmdldEVsZW1lbnRMb2NhdGlvbihhZGRlZCk7CisJCQkJaWYgKG5ld0xvY2F0aW9uID09IEVNb2RlbFNlcnZpY2UuSU5fU0hBUkVEX0FSRUEgfHwgbmV3TG9jYXRpb24gPT0gRU1vZGVsU2VydmljZS5PVVRTSURFX1BFUlNQRUNUSVZFKSB7CisJCQkJCU1XaW5kb3cgdG9wV2luID0gbW9kZWxTZXJ2aWNlLmdldFRvcExldmVsV2luZG93Rm9yKGFkZGVkKTsKKwkJCQkJbW9kZWxTZXJ2aWNlLmhpZGVMb2NhbFBsYWNlaG9sZGVycyh0b3BXaW4sIG51bGwpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChVSUV2ZW50cy5pc1JFTU9WRShldmVudCkpIHsKKwkJCUFjdGl2YXRvci50cmFjZShQb2xpY3kuREVCVUdfUkVOREVSRVIsICJDaGlsZCBSZW1vdmVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoT2JqZWN0IG8gOiBVSUV2ZW50cy5hc0l0ZXJhYmxlKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKSkgeworCQkJCU1VSUVsZW1lbnQgcmVtb3ZlZCA9IChNVUlFbGVtZW50KSBvOworCQkJCS8vIFJlbW92aW5nIGludmlzaWJsZSBlbGVtZW50cyBpcyBhIE5PLU9QIGFzIGZhciBhcyB0aGUKKwkJCQkvLyByZW5kZXJlciBpcyBjb25jZXJuZWQKKwkJCQlpZiAoIXJlbW92ZWQuaXNUb0JlUmVuZGVyZWQoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAocmVtb3ZlZC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbnRyb2wpIHsKKwkJCQkJQ29udHJvbCBjdHJsID0gKENvbnRyb2wpIHJlbW92ZWQuZ2V0V2lkZ2V0KCk7CisJCQkJCWN0cmwuc2V0TGF5b3V0RGF0YShudWxsKTsKKwkJCQkJY3RybC5nZXRQYXJlbnQoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IGN0cmwgfSwgU1dULkNIQU5HRUQgfCBTV1QuREVGRVIpOworCQkJCX0KKworCQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBlbGVtZW50IGFib3V0IHRvIGJlIHJlbW92ZWQgaXMgbm90IHRoZQorCQkJCS8vIHNlbGVjdGVkIGVsZW1lbnQKKwkJCQlpZiAoY2hhbmdlZEVsZW1lbnQuZ2V0U2VsZWN0ZWRFbGVtZW50KCkgPT0gcmVtb3ZlZCkgeworCQkJCQljaGFuZ2VkRWxlbWVudC5zZXRTZWxlY3RlZEVsZW1lbnQobnVsbCk7CisJCQkJfQorCisJCQkJaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKKwkJCQkJcmVuZGVyZXIuaGlkZUNoaWxkKGNoYW5nZWRFbGVtZW50LCByZW1vdmVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJpdmF0ZSB2b2lkIHN1YnNjcmliZVdpbmRvd3NIYW5kbGVyKEBFdmVudFRvcGljKFVJRXZlbnRzLldpbmRvdy5UT1BJQ19XSU5ET1dTKSBFdmVudCBldmVudCkgeworCisJCXN1YnNjcmliZUNoaWxkcmVuSGFuZGxlcihldmVudCk7CisJfQorCisJQEluamVjdAorCUBPcHRpb25hbAorCXByaXZhdGUgdm9pZCBzdWJzY3JpYmVQZXJzcGVjdGl2ZVdpbmRvd3NIYW5kbGVyKEBFdmVudFRvcGljKFVJRXZlbnRzLlBlcnNwZWN0aXZlLlRPUElDX1dJTkRPV1MpIEV2ZW50IGV2ZW50KSB7CisJCXN1YnNjcmliZUNoaWxkcmVuSGFuZGxlcihldmVudCk7CisJfQorCisJLy8gRklYTUUgUkFQIHVuc3VwcG9ydGVkCisJLy8gQEluamVjdAorCS8vIEBPcHRpb25hbAorCS8vIHByaXZhdGUgdm9pZAorCS8vIHN1YnNjcmliZUNzc1RoZW1lQ2hhbmdlZChARXZlbnRUb3BpYyhJVGhlbWVFbmdpbmUuRXZlbnRzLlRIRU1FX0NIQU5HRUQpCisJLy8gRXZlbnQgZXZlbnQpIHsKKwkvLyBjc3NUaGVtZUNoYW5nZWRIYW5kbGVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKKwkvLyB9CisKKwkvLyBwcml2YXRlIFN0eWxpbmdQcmVmZXJlbmNlc0hhbmRsZXIgY3NzVGhlbWVDaGFuZ2VkSGFuZGxlcjsKKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGFwcENvbnRleHQ7CisKKwlwcm90ZWN0ZWQgU2hlbGwgdGVzdFNoZWxsOworCisJcHJvdGVjdGVkIE1BcHBsaWNhdGlvbiB0aGVBcHA7CisKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJcHJvdGVjdGVkIElFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKworCUBJbmplY3QKKwlFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBJbmplY3QKKwlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKKworCXByaXZhdGUgU2hlbGwgbGltYm87CisKKwlwcml2YXRlIE1VSUVsZW1lbnQgcmVtb3ZlUm9vdCA9IG51bGw7CisKKwlASW5qZWN0CisJcHVibGljIFBhcnRSZW5kZXJpbmdFbmdpbmUoCisJCQlATmFtZWQoRTRXb3JrYmVuY2guUkVOREVSRVJfRkFDVE9SWV9VUkkpIEBPcHRpb25hbCBTdHJpbmcgZmFjdG9yeVVybCkgeworCQlpZiAoZmFjdG9yeVVybCA9PSBudWxsKSB7CisJCQlmYWN0b3J5VXJsID0gZGVmYXVsdEZhY3RvcnlVcmw7CisJCX0KKwkJdGhpcy5mYWN0b3J5VXJsID0gZmFjdG9yeVVybDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaXhaT3JkZXIoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJT2JqZWN0IGVjb250YWluZXIgPSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJCWlmIChlY29udGFpbmVyIGluc3RhbmNlb2YgTUVsZW1lbnRDb250YWluZXI8Pz4pIHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4pIGVjb250YWluZXI7CisJCQkJcGFyZW50ID0gY29udGFpbmVyOworCQkJfQorCQl9CisJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCAhKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJQ29udHJvbCBlbGVtZW50Q3RybCA9IChDb250cm9sKSBlbGVtZW50LmdldFdpZGdldCgpOworCQlDb250cm9sIHByZXZDdHJsID0gbnVsbDsKKwkJZm9yIChNVUlFbGVtZW50IGtpZCA6IHBhcmVudC5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoa2lkID09IGVsZW1lbnQpIHsKKwkJCQlpZiAocHJldkN0cmwgIT0gbnVsbCkgeworCQkJCQllbGVtZW50Q3RybC5tb3ZlQmVsb3cocHJldkN0cmwpOworCQkJCX0gZWxzZSB7CisJCQkJCWVsZW1lbnRDdHJsLm1vdmVBYm92ZShudWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGtpZC5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIENvbnRyb2wgJiYga2lkLmlzVmlzaWJsZSgpKSB7CisJCQkJcHJldkN0cmwgPSAoQ29udHJvbCkga2lkLmdldFdpZGdldCgpOworCQkJfQorCQl9CisKKwkJT2JqZWN0IHdpZGdldCA9IHBhcmVudC5nZXRXaWRnZXQoKTsKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHdpZGdldDsKKwkJCWlmIChjb21wb3NpdGUuZ2V0U2hlbGwoKSA9PSBlbGVtZW50Q3RybC5nZXRTaGVsbCgpKSB7CisJCQkJQ29tcG9zaXRlIHRlbXAgPSBlbGVtZW50Q3RybC5nZXRQYXJlbnQoKTsKKwkJCQl3aGlsZSAodGVtcCAhPSBjb21wb3NpdGUpIHsKKwkJCQkJaWYgKHRlbXAgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudCgpOworCQkJCX0KKworCQkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplIGEgcGFydCByZW5kZXJlciBmcm9tIHRoZSBleHRlbnNpb24gcG9pbnQuCisJICoKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgZm9yIHRoZSBwYXJ0IGZhY3RvcmllcworCSAqLworCUBQb3N0Q29uc3RydWN0CisJdm9pZCBpbml0aWFsaXplKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuYXBwQ29udGV4dCA9IGNvbnRleHQ7CisKKwkJLy8gaW5pdGlhbGl6ZSB0aGUgY29ycmVjdCBrZXktYmluZGluZyBkaXNwbGF5IGZvcm1hdHRlcgorCQlLZXlGb3JtYXR0ZXJGYWN0b3J5LnNldERlZmF1bHQoU1dUS2V5U3VwcG9ydAorCQkJCS5nZXRLZXlGb3JtYXR0ZXJGb3JQbGF0Zm9ybSgpKTsKKworCQkvLyBBZGQgdGhlIHJlbmRlcmVyIHRvIHRoZSBjb250ZXh0CisJCWNvbnRleHQuc2V0KElQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MuZ2V0TmFtZSgpLCB0aGlzKTsKKworCQlJUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCQlJQ29udHJpYnV0aW9uRmFjdG9yeSBjb250cmliRmFjdG9yeSA9IGNvbnRleHQKKwkJCQkuZ2V0KElDb250cmlidXRpb25GYWN0b3J5LmNsYXNzKTsKKwkJdHJ5IHsKKwkJCWZhY3RvcnkgPSAoSVJlbmRlcmVyRmFjdG9yeSkgY29udHJpYkZhY3RvcnkuY3JlYXRlKGZhY3RvcnlVcmwsCisJCQkJCWNvbnRleHQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLndhcm4oZSwgIkNvdWxkIG5vdCBjcmVhdGUgcmVuZGVyaW5nIGZhY3RvcnkiKTsKKwkJfQorCisJCS8vIFRyeSB0byBsb2FkIHRoZSBkZWZhdWx0IG9uZQorCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCWZhY3RvcnkgPSAoSVJlbmRlcmVyRmFjdG9yeSkgY29udHJpYkZhY3RvcnkuY3JlYXRlKAorCQkJCQkJZGVmYXVsdEZhY3RvcnlVcmwsIGNvbnRleHQpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dnZXIuZXJyb3IoZSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVmYXVsdCByZW5kZXJpbmcgZmFjdG9yeSIpOworCQkJfQorCQl9CisKKwkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKwkJCQkJIkNvdWxkIG5vdCBjcmVhdGUgYW55IHJlbmRlcmluZyBmYWN0b3J5LiBBYm9ydGluZyAuLi4iKTsKKwkJfQorCisJCWN1ckZhY3RvcnkgPSBmYWN0b3J5OworCQljb250ZXh0LnNldChJUmVuZGVyZXJGYWN0b3J5LmNsYXNzLCBjdXJGYWN0b3J5KTsKKworCQkvLyBjc3NUaGVtZUNoYW5nZWRIYW5kbGVyID0gbmV3CisJCS8vIFN0eWxpbmdQcmVmZXJlbmNlc0hhbmRsZXIoY29udGV4dC5nZXQoRGlzcGxheS5jbGFzcykpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVNb2RlbEludGVyZmFjZXMoTUNvbnRleHQgY29udGV4dE1vZGVsLAorCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsIENsYXNzPD8+W10gaW50ZXJmYWNlcykgeworCQlmb3IgKENsYXNzPD8+IGludGYgOiBpbnRlcmZhY2VzKSB7CisJCQlBY3RpdmF0b3IudHJhY2UoUG9saWN5LkRFQlVHX0NPTlRFWFRTLAorCQkJCQkiQWRkaW5nICIgKyBpbnRmLmdldE5hbWUoKSArICIgZm9yICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJKyBjb250ZXh0TW9kZWwuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bGwpOworCQkJY29udGV4dC5zZXQoaW50Zi5nZXROYW1lKCksIGNvbnRleHRNb2RlbCk7CisKKwkJCXBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKGNvbnRleHRNb2RlbCwgY29udGV4dCwgaW50Zi5nZXRJbnRlcmZhY2VzKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGVsZW1lbnQuZ2V0Q2xhc3MoKQorCQkJCS5nZXRTaW1wbGVOYW1lKCkpOworCQlTdHJpbmcgZWxlbWVudElkID0gZWxlbWVudC5nZXRFbGVtZW50SWQoKTsKKwkJaWYgKGVsZW1lbnRJZCAhPSBudWxsICYmIGVsZW1lbnRJZC5sZW5ndGgoKSAhPSAwKSB7CisJCQlidWlsZGVyLmFwcGVuZCgiICgiKS5hcHBlbmQoZWxlbWVudElkKS5hcHBlbmQoIikgIik7CisJCX0KKwkJYnVpbGRlci5hcHBlbmQoIkNvbnRleHQiKTsKKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUd1aShmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQsCisJCQlmaW5hbCBPYmplY3QgcGFyZW50V2lkZ2V0LCBmaW5hbCBJRWNsaXBzZUNvbnRleHQgcGFyZW50Q29udGV4dCkgeworCQlmaW5hbCBPYmplY3RbXSBndWkgPSB7IG51bGwgfTsKKwkJLy8gd3JhcCB0aGUgaGFuZGxpbmcgaW4gYSBTYWZlUnVubmVyIHNvIHRoYXQgZXhjZXB0aW9ucyBkbyBub3QgcHJldmVudAorCQkvLyB0aGUgcmVuZGVyZXIgZnJvbSBwcm9jZXNzaW5nIG90aGVyIGVsZW1lbnRzCisJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKKwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7CisJCQkJCS8vIGVycm9ycyBhcmUgZGVhZGx5LCB3ZSBzaG91bGRuJ3QgaWdub3JlIHRoZXNlCisJCQkJCXRocm93IChFcnJvcikgZTsKKwkJCQl9CisKKwkJCQkvLyBsb2cgZXhjZXB0aW9ucyBvdGhlcndpc2UKKwkJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlbmRlcmluZzogezB9IjsgLy8kTk9OLU5MUy0xJAorCQkJCQlsb2dnZXIuZXJyb3IoZSwgTkxTLmJpbmQobWVzc2FnZSwgZWxlbWVudCkpOworCQkJCX0KKwkJCX0KKworCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJZ3VpWzBdID0gc2FmZUNyZWF0ZUd1aShlbGVtZW50LCBwYXJlbnRXaWRnZXQsIHBhcmVudENvbnRleHQpOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIGd1aVswXTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHNhZmVDcmVhdGVHdWkoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50V2lkZ2V0LAorCQkJSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQpIHsKKwkJaWYgKCFlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyBubyBjcmVhdGVzIHdoaWxlIHByb2Nlc3NpbmcgYSByZW1vdmUKKwkJaWYgKHJlbW92ZVJvb3QgIT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlPYmplY3QgY3VycmVudFdpZGdldCA9IGVsZW1lbnQuZ2V0V2lkZ2V0KCk7CisJCWlmIChjdXJyZW50V2lkZ2V0ICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkgeworCQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBjdXJyZW50V2lkZ2V0OworCQkJCS8vIG1ha2Ugc3VyZSB0aGUgY29udHJvbCBpcyB2aXNpYmxlCisJCQkJTVVJRWxlbWVudCBlbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKQorCQkJCQkJfHwgIShlbGVtZW50UGFyZW50IGluc3RhbmNlb2YgTVBhcnRTdGFjaykpCisJCQkJCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKKworCQkJCWlmIChwYXJlbnRXaWRnZXQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKKwkJCQkJQ29tcG9zaXRlIGN1cnJlbnRQYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOworCQkJCQlpZiAoY3VycmVudFBhcmVudCAhPSBwYXJlbnRXaWRnZXQpIHsKKwkJCQkJCS8vIGNoZWNrIGlmIHRoZSBvcmlnaW5hbCBwYXJlbnQgd2FzIGEgdGFiIGZvbGRlcgorCQkJCQkJaWYgKGN1cnJlbnRQYXJlbnQgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJCQkJQ1RhYkZvbGRlciBmb2xkZXIgPSAoQ1RhYkZvbGRlcikgY3VycmVudFBhcmVudDsKKwkJCQkJCQkvLyBpZiB3ZSB1c2VkIHRvIGJlIHRoZSB0YWIgZm9sZGVyJ3MgdG9wIHJpZ2h0CisJCQkJCQkJLy8gY29udHJvbCwgdW5zZXQgaXQKKwkJCQkJCQlpZiAoZm9sZGVyLmdldFRvcFJpZ2h0KCkgPT0gY29udHJvbCkgeworCQkJCQkJCQlmb2xkZXIuc2V0VG9wUmlnaHQobnVsbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyB0aGUgcGFyZW50cyBhcmUgZGlmZmVyZW50IHNvIHdlIHNob3VsZCByZXBhcmVudCBpdAorCQkJCQkJY29udHJvbC5zZXRQYXJlbnQoKENvbXBvc2l0ZSkgcGFyZW50V2lkZ2V0KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gUmVwYXJlbnQgdGhlIGNvbnRleHQgKG9yIHRoZSBraWQncyBjb250ZXh0KQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQ29udGV4dCkgeworCQkJCUlFY2xpcHNlQ29udGV4dCBjdHh0ID0gKChNQ29udGV4dCkgZWxlbWVudCkuZ2V0Q29udGV4dCgpOworCQkJCWlmIChjdHh0ICE9IG51bGwpCisJCQkJCWN0eHQuc2V0UGFyZW50KHBhcmVudENvbnRleHQpOworCQkJfSBlbHNlIHsKKwkJCQlMaXN0PE1Db250ZXh0PiBjaGlsZENvbnRleHRzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cygKKwkJCQkJCWVsZW1lbnQsIG51bGwsIE1Db250ZXh0LmNsYXNzLCBudWxsKTsKKwkJCQlmb3IgKE1Db250ZXh0IGMgOiBjaGlsZENvbnRleHRzKSB7CisJCQkJCS8vIEVuc3VyZSB0aGF0IHdlIG9ubHkgcmVzZXQgdGhlIGNvbnRleHQgb2Ygb3VyIGRpcmVjdAorCQkJCQkvLyBjaGlsZHJlbgorCQkJCQlNVUlFbGVtZW50IGtpZCA9IChNVUlFbGVtZW50KSBjOworCQkJCQlNVUlFbGVtZW50IHBhcmVudCA9IGtpZC5nZXRQYXJlbnQoKTsKKwkJCQkJaWYgKHBhcmVudCA9PSBudWxsICYmIGtpZC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBudWxsKQorCQkJCQkJcGFyZW50ID0ga2lkLmdldEN1clNoYXJlZFJlZigpLmdldFBhcmVudCgpOworCQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSAmJiBwYXJlbnQgIT0gZWxlbWVudCkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWlmIChjLmdldENvbnRleHQoKSAhPSBudWxsCisJCQkJCQkJJiYgYy5nZXRDb250ZXh0KCkuZ2V0UGFyZW50KCkgIT0gcGFyZW50Q29udGV4dCkgeworCQkJCQkJYy5nZXRDb250ZXh0KCkuc2V0UGFyZW50KHBhcmVudENvbnRleHQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgd2lkZ2V0IGxldCB0aGUgcGFyZW50IChpZiBhbnkpIGtub3cKKwkJCWlmIChlbGVtZW50LmdldFBhcmVudCgpIGluc3RhbmNlb2YgTVVJRWxlbWVudCkgeworCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50CisJCQkJCQkuZ2V0UGFyZW50KCk7CisJCQkJQWJzdHJhY3RQYXJ0UmVuZGVyZXIgcGFyZW50UmVuZGVyZXIgPSBnZXRSZW5kZXJlckZvcihwYXJlbnRFbGVtZW50KTsKKwkJCQlpZiAocGFyZW50UmVuZGVyZXIgIT0gbnVsbCkKKwkJCQkJcGFyZW50UmVuZGVyZXIuY2hpbGRSZW5kZXJlZChwYXJlbnRFbGVtZW50LCBlbGVtZW50KTsKKwkJCX0KKwkJCXJldHVybiBlbGVtZW50LmdldFdpZGdldCgpOworCQl9CisKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQ29udGV4dCkgeworCQkJTUNvbnRleHQgY3R4dCA9IChNQ29udGV4dCkgZWxlbWVudDsKKwkJCS8vIEFzc2VydC5pc1RydWUoY3R4dC5nZXRDb250ZXh0KCkgPT0gbnVsbCwKKwkJCS8vICJCZWZvcmUgcmVuZGVyaW5nIENvbnRleHQgc2hvdWxkIGJlIG51bGwiKTsKKwkJCWlmIChjdHh0LmdldENvbnRleHQoKSA9PSBudWxsKSB7CisJCQkJSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBwYXJlbnRDb250ZXh0CisJCQkJCQkuY3JlYXRlQ2hpbGQoZ2V0Q29udGV4dE5hbWUoZWxlbWVudCkpOworCQkJCXBvcHVsYXRlTW9kZWxJbnRlcmZhY2VzKGN0eHQsIGxjbENvbnRleHQsIGVsZW1lbnQuZ2V0Q2xhc3MoKQorCQkJCQkJLmdldEludGVyZmFjZXMoKSk7CisJCQkJY3R4dC5zZXRDb250ZXh0KGxjbENvbnRleHQpOworCisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOZXcgQ29udGV4dDogIiArIGxjbENvbnRleHQudG9TdHJpbmcoKQorCQkJCS8vICsgIiBwYXJlbnQ6ICIgKyBwYXJlbnRDb250ZXh0LnRvU3RyaW5nKCkpOworCisJCQkJLy8gbWFrZSBzdXJlIHRoZSBjb250ZXh0IGtub3dzIGFib3V0IHRoZXNlIHZhcmlhYmxlcyB0aGF0IGhhdmUKKwkJCQkvLyBiZWVuIGRlZmluZWQgaW4gdGhlIG1vZGVsCisJCQkJZm9yIChTdHJpbmcgdmFyaWFibGUgOiBjdHh0LmdldFZhcmlhYmxlcygpKSB7CisJCQkJCWxjbENvbnRleHQuZGVjbGFyZU1vZGlmaWFibGUodmFyaWFibGUpOworCQkJCX0KKworCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBjdHh0LmdldFByb3BlcnRpZXMoKTsKKwkJCQlmb3IgKFN0cmluZyBrZXkgOiBwcm9wcy5rZXlTZXQoKSkgeworCQkJCQlsY2xDb250ZXh0LnNldChrZXksIHByb3BzLmdldChrZXkpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBXZSBjaGVjayB0aGUgd2lkZ2V0IGFnYWluIHNpbmNlIGl0IGNvdWxkIGJlIGNyZWF0ZWQgYnkgc29tZSBVSSBldmVudC4KKwkJLy8gU2VlIEJ1ZyA0MTczOTkKKwkJaWYgKGVsZW1lbnQuZ2V0V2lkZ2V0KCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHNhZmVDcmVhdGVHdWkoZWxlbWVudCwgcGFyZW50V2lkZ2V0LCBwYXJlbnRDb250ZXh0KTsKKwkJfQorCisJCS8vIENyZWF0ZSBhIGNvbnRyb2wgYXBwcm9wcmlhdGUgdG8gdGhlIHBhcnQKKwkJT2JqZWN0IG5ld1dpZGdldCA9IGNyZWF0ZVdpZGdldChlbGVtZW50LCBwYXJlbnRXaWRnZXQpOworCisJCS8vIFJlbWVtYmVyIHRoYXQgd2UndmUgY3JlYXRlZCB0aGUgY29udHJvbAorCQlpZiAobmV3V2lkZ2V0ICE9IG51bGwpIHsKKwkJCUFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0UmVuZGVyZXJGb3IoZWxlbWVudCk7CisKKwkJCS8vIEhhdmUgdGhlIHJlbmRlcmVyIGhvb2sgdXAgYW55IHdpZGdldCBzcGVjaWZpYyBsaXN0ZW5lcnMKKwkJCXJlbmRlcmVyLmhvb2tDb250cm9sbGVyTG9naWMoZWxlbWVudCk7CisKKwkJCS8vIFByb2Nlc3MgaXRzIGludGVybmFsIHN0cnVjdHVyZSB0aHJvdWdoIHRoZSByZW5kZXJlciB0aGF0IGNyZWF0ZWQKKwkJCS8vIGl0CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyKSB7CisJCQkJcmVuZGVyZXIucHJvY2Vzc0NvbnRlbnRzKChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PikgZWxlbWVudCk7CisJCQl9CisKKwkJCS8vIEFsbG93IGEgZmluYWwgY2hhbmNlIHRvIHNldCB1cAorCQkJcmVuZGVyZXIucG9zdFByb2Nlc3MoZWxlbWVudCk7CisKKwkJCS8vIE5vdyB0aGF0IHdlIGhhdmUgYSB3aWRnZXQgbGV0IHRoZSBwYXJlbnQgKGlmIGFueSkga25vdworCQkJaWYgKGVsZW1lbnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBNVUlFbGVtZW50KSB7CisJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50RWxlbWVudCA9IGVsZW1lbnQKKwkJCQkJCS5nZXRQYXJlbnQoKTsKKwkJCQlBYnN0cmFjdFBhcnRSZW5kZXJlciBwYXJlbnRSZW5kZXJlciA9IGdldFJlbmRlcmVyRm9yKHBhcmVudEVsZW1lbnQpOworCQkJCWlmIChwYXJlbnRSZW5kZXJlciAhPSBudWxsKQorCQkJCQlwYXJlbnRSZW5kZXJlci5jaGlsZFJlbmRlcmVkKHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gZmFpbGVkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0LCBkaXNwb3NlIGl0cyBjb250ZXh0IGlmIG5lY2Vzc2FyeQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQ29udGV4dCkgeworCQkJCU1Db250ZXh0IGN0eHQgPSAoTUNvbnRleHQpIGVsZW1lbnQ7CisJCQkJSUVjbGlwc2VDb250ZXh0IGxjbENvbnRleHQgPSBjdHh0LmdldENvbnRleHQoKTsKKwkJCQlpZiAobGNsQ29udGV4dCAhPSBudWxsKSB7CisJCQkJCWxjbENvbnRleHQuZGlzcG9zZSgpOworCQkJCQljdHh0LnNldENvbnRleHQobnVsbCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIG5ld1dpZGdldDsKKwl9CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBnZXRDb250ZXh0KE1VSUVsZW1lbnQgcGFyZW50KSB7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNQ29udGV4dCkgeworCQkJcmV0dXJuICgoTUNvbnRleHQpIHBhcmVudCkuZ2V0Q29udGV4dCgpOworCQl9CisJCXJldHVybiBtb2RlbFNlcnZpY2UuZ2V0Q29udGFpbmluZ0NvbnRleHQocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUd1aShmaW5hbCBNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJZmluYWwgT2JqZWN0W10gZ3VpID0geyBudWxsIH07CisJCS8vIHdyYXAgdGhlIGhhbmRsaW5nIGluIGEgU2FmZVJ1bm5lciBzbyB0aGF0IGV4Y2VwdGlvbnMgZG8gbm90IHByZXZlbnQKKwkJLy8gdGhlIHJlbmRlcmVyIGZyb20gcHJvY2Vzc2luZyBvdGhlciBlbGVtZW50cworCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgeworCQkJCWlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHsKKwkJCQkJLy8gZXJyb3JzIGFyZSBkZWFkbHksIHdlIHNob3VsZG4ndCBpZ25vcmUgdGhlc2UKKwkJCQkJdGhyb3cgKEVycm9yKSBlOworCQkJCX0KKworCQkJCS8vIGxvZyBleGNlcHRpb25zIG90aGVyd2lzZQorCQkJCWlmIChsb2dnZXIgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVuZGVyaW5nOiB7MH0iOyAvLyROT04tTkxTLTEkCisJCQkJCWxvZ2dlci5lcnJvcihlLCBOTFMuYmluZChtZXNzYWdlLCBlbGVtZW50KSk7CisJCQkJfQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQlndWlbMF0gPSBzYWZlQ3JlYXRlR3VpKGVsZW1lbnQpOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIGd1aVswXTsKKwl9CisKKwlwcml2YXRlIE9iamVjdCBzYWZlQ3JlYXRlR3VpKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQkvLyBPYnRhaW4gdGhlIG5lY2Vzc2FyeSBwYXJlbnQgd2lkZ2V0CisJCU9iamVjdCBwYXJlbnQgPSBudWxsOworCQlNVUlFbGVtZW50IHBhcmVudE1FID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudE1FID09IG51bGwpCisJCQlwYXJlbnRNRSA9IChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJaWYgKHBhcmVudE1FICE9IG51bGwpIHsKKwkJCUFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0UmVuZGVyZXJGb3IocGFyZW50TUUpOworCQkJaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKKwkJCQlpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKCkpIHsKKwkJCQkJcGFyZW50ID0gZ2V0TGltYm9TaGVsbCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXBhcmVudCA9IHJlbmRlcmVyLmdldFVJQ29udGFpbmVyKGVsZW1lbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIE9idGFpbiB0aGUgbmVjZXNzYXJ5IHBhcmVudCBjb250ZXh0CisJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCkgIT0gbnVsbCkgeworCQkJTVBsYWNlaG9sZGVyIHBoID0gZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJCXBhcmVudENvbnRleHQgPSBnZXRDb250ZXh0KHBoLmdldFBhcmVudCgpKTsKKwkJfSBlbHNlIGlmIChwYXJlbnRDb250ZXh0ID09IG51bGwgJiYgZWxlbWVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisJCQlwYXJlbnRDb250ZXh0ID0gZ2V0Q29udGV4dChlbGVtZW50LmdldFBhcmVudCgpKTsKKwkJfSBlbHNlIGlmIChwYXJlbnRDb250ZXh0ID09IG51bGwgJiYgZWxlbWVudC5nZXRQYXJlbnQoKSA9PSBudWxsKSB7CisJCQlwYXJlbnRDb250ZXh0ID0gZ2V0Q29udGV4dCgoTVVJRWxlbWVudCkgKChFT2JqZWN0KSBlbGVtZW50KQorCQkJCQkuZUNvbnRhaW5lcigpKTsKKwkJfQorCisJCXJldHVybiBzYWZlQ3JlYXRlR3VpKGVsZW1lbnQsIHBhcmVudCwgcGFyZW50Q29udGV4dCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICoKKwkgKiBAc2VlCisJICogb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmUjZm9jdXNHdWkob3JnLmVjbGlwc2UuCisJICogZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmb2N1c0d1aShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJQWJzdHJhY3RQYXJ0UmVuZGVyZXIgcmVuZGVyZXIgPSAoQWJzdHJhY3RQYXJ0UmVuZGVyZXIpIGVsZW1lbnQKKwkJCQkuZ2V0UmVuZGVyZXIoKTsKKwkJaWYgKHJlbmRlcmVyID09IG51bGwgfHwgZWxlbWVudC5nZXRXaWRnZXQoKSA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCU9iamVjdCBpbXBsZW1lbnRhdGlvbiA9IGVsZW1lbnQgaW5zdGFuY2VvZiBNQ29udHJpYnV0aW9uID8gKChNQ29udHJpYnV0aW9uKSBlbGVtZW50KQorCQkJCS5nZXRPYmplY3QoKSA6IG51bGw7CisKKwkJLy8gSWYgdGhlcmUgaXMgbm8gY2xhc3MgdG8gY2FsbCBARm9jdXMgb24gdGhlbiByZXZlcnQgdG8gdGhlIGRlZmF1bHQKKwkJaWYgKGltcGxlbWVudGF0aW9uID09IG51bGwpIHsKKwkJCXJlbmRlcmVyLmZvcmNlRm9jdXMoZWxlbWVudCk7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGVsZW1lbnQpOworCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG5ldyBPYmplY3QoKTsKKwkJCU9iamVjdCByZXR1cm5WYWx1ZSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShpbXBsZW1lbnRhdGlvbiwKKwkJCQkJRm9jdXMuY2xhc3MsIGNvbnRleHQsIGRlZmF1bHRWYWx1ZSk7CisJCQlpZiAocmV0dXJuVmFsdWUgPT0gZGVmYXVsdFZhbHVlKSB7CisJCQkJLy8gTm8gQEZvY3VzIG1ldGhvZCwgZm9yY2UgdGhlIGZvY3VzCisJCQkJcmVuZGVyZXIuZm9yY2VGb2N1cyhlbGVtZW50KTsKKwkJCX0KKwkJfSBjYXRjaCAoSW5qZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCWxvZygiRmFpbGVkIHRvIGdyYW50IGZvY3VzIHRvIGVsZW1lbnQiLCAiRmFpbGVkIHRvIGdyYW50IGZvY3VzIHRvIGVsZW1lbnQgKHswfSkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJZWxlbWVudC5nZXRFbGVtZW50SWQoKSwgZSk7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJbG9nKCJGYWlsZWQgdG8gZ3JhbnQgZm9jdXMgdG8gZWxlbWVudCB2aWEgREkiLCAvLyROT04tTkxTLTEkCisJCQkJCSJGYWlsZWQgdG8gZ3JhbnQgZm9jdXMgdmlhIERJIHRvIGVsZW1lbnQgKHswfSkiLCBlbGVtZW50LmdldEVsZW1lbnRJZCgpLCBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgdW5pZGVudGlmaWVkTWVzc2FnZSwgU3RyaW5nIGlkZW50aWZpZWRNZXNzYWdlLAorCQkJU3RyaW5nIGlkLCBFeGNlcHRpb24gZSkgeworCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7CisJCQlsb2dnZXIuZXJyb3IoZSwgdW5pZGVudGlmaWVkTWVzc2FnZSk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZXJyb3IoZSwgTkxTLmJpbmQoaWRlbnRpZmllZE1lc3NhZ2UsIGlkKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFNoZWxsIGdldExpbWJvU2hlbGwoKSB7CisJCWlmIChsaW1ibyA9PSBudWxsKSB7CisJCQlsaW1ibyA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSwgU1dULk5PTkUpOworCQkJbGltYm8uc2V0VGV4dCgiUGFydFJlbmRlcmluZ0VuZ2luZSdzIGxpbWJvIik7IC8vJE5PTi1OTFMtMSQgLy8ganVzdCBmb3IgZGVidWdnaW5nLCBub3Qgc2hvd24gYW55d2hlcmUKKworCQkJLy8gUGxhY2UgdGhlIGxpbWJvIHNoZWxsICdvZmYgc2NyZWVuJworCQkJbGltYm8uc2V0TG9jYXRpb24oMCwgMTAwMDApOworCisJCQlsaW1iby5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9ERUZBVUxUKTsKKwkJCWxpbWJvLnNldERhdGEoU2hlbGxBY3RpdmF0aW9uTGlzdGVuZXIuRElBTE9HX0lHTk9SRV9LRVksCisJCQkJCUJvb2xlYW4uVFJVRSk7CisJCX0KKwkJcmV0dXJuIGxpbWJvOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVtb3ZlR3VpKGZpbmFsIE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQkvLyB3cmFwIHRoZSBoYW5kbGluZyBpbiBhIFNhZmVSdW5uZXIgc28gdGhhdCBleGNlcHRpb25zIGRvIG5vdCBwcmV2ZW50CisJCS8vIHRoZSBtZW51IGZyb20gYmVpbmcgc2hvd24KKwkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKKwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7CisJCQkJCS8vIGVycm9ycyBhcmUgZGVhZGx5LCB3ZSBzaG91bGRuJ3QgaWdub3JlIHRoZXNlCisJCQkJCXRocm93IChFcnJvcikgZTsKKwkJCQl9CisKKwkJCQkvLyBsb2cgZXhjZXB0aW9ucyBvdGhlcndpc2UKKwkJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHVucmVuZGVyaW5nOiB7MH0iOyAvLyROT04tTkxTLTEkCisJCQkJCWxvZ2dlci5lcnJvcihlLCBOTFMuYmluZChtZXNzYWdlLCBlbGVtZW50KSk7CisJCQkJfQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQlzYWZlUmVtb3ZlR3VpKGVsZW1lbnQpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2FmZVJlbW92ZUd1aShNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKHJlbW92ZVJvb3QgPT0gbnVsbCkKKwkJCXJlbW92ZVJvb3QgPSBlbGVtZW50OworCisJCS8vIFdlIGNhbGwgJ2hpZGVDaGlsZCcgKmJlZm9yZSogY2hlY2tpbmcgaWYgdGhlIGFjdHVhbCBlbGVtZW50CisJCS8vIGhhcyBiZWVuIHJlbmRlcmVkIGluIG9yZGVyIHRvIHBpY2sgdXAgY2FzZXMgb2YgJ2xhenkgbG9hZGluZycKKwkJTVVJRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCQlBYnN0cmFjdFBhcnRSZW5kZXJlciBwYXJlbnRSZW5kZXJlciA9IHBhcmVudCAhPSBudWxsID8gZ2V0UmVuZGVyZXJGb3IocGFyZW50KQorCQkJCTogbnVsbDsKKwkJaWYgKHBhcmVudFJlbmRlcmVyICE9IG51bGwpIHsKKwkJCXBhcmVudFJlbmRlcmVyLmhpZGVDaGlsZChlbGVtZW50LmdldFBhcmVudCgpLCBlbGVtZW50KTsKKwkJfQorCisJCUFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0UmVuZGVyZXJGb3IoZWxlbWVudCk7CisKKwkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzbid0IGJlZW4gcmVuZGVyZWQgdGhlbiB0aGlzIGlzIGEgTk8tT1AKKwkJaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKKworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNvbnRhaW5lciA9IChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PikgZWxlbWVudDsKKwkJCQlNVUlFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IGNvbnRhaW5lci5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQlMaXN0PE1VSUVsZW1lbnQ+IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7CisJCQkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogY2hpbGRyZW4pIHsKKwkJCQkJLy8gcmVtb3ZlIHN0dWZmIGluIHRoZSAiYmFjayIgZmlyc3QKKwkJCQkJaWYgKGNoaWxkICE9IHNlbGVjdGVkRWxlbWVudCkgeworCQkJCQkJcmVtb3ZlR3VpKGNoaWxkKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgIT0gbnVsbAorCQkJCQkJJiYgY2hpbGRyZW4uY29udGFpbnMoc2VsZWN0ZWRFbGVtZW50KSkgeworCQkJCQkvLyBub3cgcmVtb3ZlIHRoZSBzZWxlY3RlZCBlbGVtZW50CisJCQkJCXJlbW92ZUd1aShzZWxlY3RlZEVsZW1lbnQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmUpIHsKKwkJCQlNUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUgPSAoTVBlcnNwZWN0aXZlKSBlbGVtZW50OworCQkJCWZvciAoTVdpbmRvdyBzdWJXaW5kb3cgOiBwZXJzcGVjdGl2ZS5nZXRXaW5kb3dzKCkpIHsKKwkJCQkJcmVtb3ZlR3VpKHN1YldpbmRvdyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJCU1XaW5kb3cgd2luZG93ID0gKE1XaW5kb3cpIGVsZW1lbnQ7CisJCQkJZm9yIChNV2luZG93IHN1YldpbmRvdyA6IHdpbmRvdy5nZXRXaW5kb3dzKCkpIHsKKwkJCQkJcmVtb3ZlR3VpKHN1YldpbmRvdyk7CisJCQkJfQorCisJCQkJaWYgKHdpbmRvdyBpbnN0YW5jZW9mIE1UcmltbWVkV2luZG93KSB7CisJCQkJCU1UcmltbWVkV2luZG93IHRyaW1tZWRXaW5kb3cgPSAoTVRyaW1tZWRXaW5kb3cpIHdpbmRvdzsKKwkJCQkJZm9yIChNVUlFbGVtZW50IHRyaW1CYXIgOiB0cmltbWVkV2luZG93LmdldFRyaW1CYXJzKCkpIHsKKwkJCQkJCXJlbW92ZUd1aSh0cmltQmFyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQ29udHJpYnV0aW9uKSB7CisJCQkJTUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSAoTUNvbnRyaWJ1dGlvbikgZWxlbWVudDsKKwkJCQlPYmplY3QgY2xpZW50ID0gY29udHJpYnV0aW9uLmdldE9iamVjdCgpOworCQkJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gcmVuZGVyZXIuZ2V0Q29udGV4dChlbGVtZW50KTsKKwkJCQlpZiAocGFyZW50Q29udGV4dCAhPSBudWxsICYmIGNsaWVudCAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoY2xpZW50LAorCQkJCQkJCQlQZXJzaXN0U3RhdGUuY2xhc3MsIHBhcmVudENvbnRleHQsIG51bGwpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7CisJCQkJCQkJbG9nZ2VyLmVycm9yKGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZW5kZXJlci5kaXNwb3NlV2lkZ2V0KGVsZW1lbnQpOworCisJCQkvLyB1bnNldCB0aGUgY2xpZW50IG9iamVjdAorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQ29udHJpYnV0aW9uKSB7CisJCQkJTUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSAoTUNvbnRyaWJ1dGlvbikgZWxlbWVudDsKKwkJCQlPYmplY3QgY2xpZW50ID0gY29udHJpYnV0aW9uLmdldE9iamVjdCgpOworCQkJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gcmVuZGVyZXIuZ2V0Q29udGV4dChlbGVtZW50KTsKKwkJCQlpZiAocGFyZW50Q29udGV4dCAhPSBudWxsICYmIGNsaWVudCAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS51bmluamVjdChjbGllbnQsIHBhcmVudENvbnRleHQpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7CisJCQkJCQkJbG9nZ2VyLmVycm9yKGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNvbnRyaWJ1dGlvbi5zZXRPYmplY3QobnVsbCk7CisJCQl9CisKKwkJCS8vIGRpc3Bvc2UgdGhlIGNvbnRleHQKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCQljbGVhckNvbnRleHQoKE1Db250ZXh0KSBlbGVtZW50KTsKKwkJCX0KKwkJfQorCisJCWlmIChyZW1vdmVSb290ID09IGVsZW1lbnQpCisJCQlyZW1vdmVSb290ID0gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xlYXJDb250ZXh0KE1Db250ZXh0IGNvbnRleHRNRSkgeworCQlNQ29udGV4dCBjdHh0ID0gKE1Db250ZXh0KSBjb250ZXh0TUU7CisJCUlFY2xpcHNlQ29udGV4dCBsY2xDb250ZXh0ID0gY3R4dC5nZXRDb250ZXh0KCk7CisJCWlmIChsY2xDb250ZXh0ICE9IG51bGwpIHsKKwkJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gbGNsQ29udGV4dC5nZXRQYXJlbnQoKTsKKwkJCUlFY2xpcHNlQ29udGV4dCBjaGlsZCA9IHBhcmVudENvbnRleHQgIT0gbnVsbCA/IHBhcmVudENvbnRleHQKKwkJCQkJLmdldEFjdGl2ZUNoaWxkKCkgOiBudWxsOworCQkJaWYgKGNoaWxkID09IGxjbENvbnRleHQpIHsKKwkJCQljaGlsZC5kZWFjdGl2YXRlKCk7CisJCQl9CisKKwkJCWN0eHQuc2V0Q29udGV4dChudWxsKTsKKwkJCWxjbENvbnRleHQuZGlzcG9zZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXaWRnZXQoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50KSB7CisJCUFic3RyYWN0UGFydFJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0UmVuZGVyZXIoZWxlbWVudCwgcGFyZW50KTsKKwkJaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKKwkJCS8vIFJlbWVtYmVyIHdoaWNoIHJlbmRlcmVyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHdpZGdldAorCQkJZWxlbWVudC5zZXRSZW5kZXJlcihyZW5kZXJlcik7CisJCQlPYmplY3QgbmV3V2lkZ2V0ID0gcmVuZGVyZXIuY3JlYXRlV2lkZ2V0KGVsZW1lbnQsIHBhcmVudCk7CisJCQlpZiAobmV3V2lkZ2V0ICE9IG51bGwpIHsKKwkJCQlyZW5kZXJlci5iaW5kV2lkZ2V0KGVsZW1lbnQsIG5ld1dpZGdldCk7CisJCQkJcmV0dXJuIG5ld1dpZGdldDsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgQWJzdHJhY3RQYXJ0UmVuZGVyZXIgZ2V0UmVuZGVyZXIoTVVJRWxlbWVudCB1aUVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKKwkJLy8gSXMgdGhlcmUgYSBjdXN0b20gcmVuZGVyZXIgZGVmaW5lZCA/CisJCVN0cmluZyBjdXN0b21VUkkgPSB1aUVsZW1lbnQuZ2V0UGVyc2lzdGVkU3RhdGUoKS5nZXQoCisJCQkJSVByZXNlbnRhdGlvbkVuZ2luZS5DVVNUT01fUkVOREVSRVJfS0VZKTsKKwkJaWYgKGN1c3RvbVVSSSAhPSBudWxsKSB7CisJCQlpZiAoY3VzdG9tUmVuZGVyZXJNYXAuZ2V0KGN1c3RvbVVSSSkgaW5zdGFuY2VvZiBBYnN0cmFjdFBhcnRSZW5kZXJlcikKKwkJCQlyZXR1cm4gY3VzdG9tUmVuZGVyZXJNYXAuZ2V0KGN1c3RvbVVSSSk7CisKKwkJCUlFY2xpcHNlQ29udGV4dCBvd25pbmdDb250ZXh0ID0gbW9kZWxTZXJ2aWNlCisJCQkJCS5nZXRDb250YWluaW5nQ29udGV4dCh1aUVsZW1lbnQpOworCQkJSUNvbnRyaWJ1dGlvbkZhY3RvcnkgY29udHJpYnV0aW9uRmFjdG9yeSA9IChJQ29udHJpYnV0aW9uRmFjdG9yeSkgb3duaW5nQ29udGV4dAorCQkJCQkuZ2V0KElDb250cmlidXRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisJCQlPYmplY3QgY3VzdG9tUmVuZGVyZXIgPSBjb250cmlidXRpb25GYWN0b3J5LmNyZWF0ZShjdXN0b21VUkksCisJCQkJCW93bmluZ0NvbnRleHQpOworCQkJaWYgKGN1c3RvbVJlbmRlcmVyIGluc3RhbmNlb2YgQWJzdHJhY3RQYXJ0UmVuZGVyZXIpIHsKKwkJCQljdXN0b21SZW5kZXJlck1hcC5wdXQoY3VzdG9tVVJJLAorCQkJCQkJKEFic3RyYWN0UGFydFJlbmRlcmVyKSBjdXN0b21SZW5kZXJlcik7CisJCQkJcmV0dXJuIChBYnN0cmFjdFBhcnRSZW5kZXJlcikgY3VzdG9tUmVuZGVyZXI7CisJCQl9CisJCX0KKworCQkvLyBJZiBub3QgdGhlbiB1c2UgdGhlIGRlZmF1bHQgcmVuZGVyZXIKKwkJcmV0dXJuIGN1ckZhY3RvcnkuZ2V0UmVuZGVyZXIodWlFbGVtZW50LCBwYXJlbnQpOworCX0KKworCXByb3RlY3RlZCBBYnN0cmFjdFBhcnRSZW5kZXJlciBnZXRSZW5kZXJlckZvcihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJcmV0dXJuIChBYnN0cmFjdFBhcnRSZW5kZXJlcikgZWxlbWVudC5nZXRSZW5kZXJlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgcnVuKGZpbmFsIE1BcHBsaWNhdGlvbkVsZW1lbnQgdWlSb290LAorCQkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHJ1bkNvbnRleHQpIHsKKwkJZmluYWwgRGlzcGxheSBkaXNwbGF5OworCQlpZiAocnVuQ29udGV4dC5nZXQoRGlzcGxheS5jbGFzcykgIT0gbnVsbCkgeworCQkJZGlzcGxheSA9IHJ1bkNvbnRleHQuZ2V0KERpc3BsYXkuY2xhc3MpOworCQl9IGVsc2UgeworCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQkJcnVuQ29udGV4dC5zZXQoRGlzcGxheS5jbGFzcywgZGlzcGxheSk7CisJCX0KKwkJUmVhbG0ucnVuV2l0aERlZmF1bHQoU1dUT2JzZXJ2YWJsZXMuZ2V0UmVhbG0oZGlzcGxheSksIG5ldyBSdW5uYWJsZSgpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaW5pdGlhbGl6ZVN0eWxpbmcoZGlzcGxheSwgcnVuQ29udGV4dCk7CisKKwkJCQkvLyBSZWdpc3RlciBhbiBTV1QgcmVzb3VyY2UgaGFuZGxlcgorCQkJCXJ1bkNvbnRleHQuc2V0KElSZXNvdXJjZVV0aWxpdGllcy5jbGFzcy5nZXROYW1lKCksCisJCQkJCQluZXcgUmVzb3VyY2VVdGlsaXR5KCkpOworCisJCQkJLy8gc2V0IHVwIHRoZSBrZXliaW5kaW5nIG1hbmFnZXIKKwkJCQlLZXlCaW5kaW5nRGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gKEtleUJpbmRpbmdEaXNwYXRjaGVyKSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeQorCQkJCQkJLm1ha2UoS2V5QmluZGluZ0Rpc3BhdGNoZXIuY2xhc3MsIHJ1bkNvbnRleHQpOworCQkJCXJ1bkNvbnRleHQuc2V0KEtleUJpbmRpbmdEaXNwYXRjaGVyLmNsYXNzLmdldE5hbWUoKSwgZGlzcGF0Y2hlcik7CisJCQkJa2V5TGlzdGVuZXIgPSBkaXNwYXRjaGVyLmdldEtleURvd25GaWx0ZXIoKTsKKwkJCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuS2V5RG93biwga2V5TGlzdGVuZXIpOworCQkJCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5UcmF2ZXJzZSwga2V5TGlzdGVuZXIpOworCisJCQkJLy8gU2hvdyB0aGUgaW5pdGlhbCBVSQorCisJCQkJLy8gQ3JlYXRlIGEgJ2xpbWJvJyBzaGVsbCAodXNlZCB0byBob3N0IGNvbnRyb2xzIHRoYXQgc2hvdWxkbid0CisJCQkJLy8gYmUgaW4gdGhlIGN1cnJlbnQgbGF5b3V0KQorCQkJCVNoZWxsIGxpbWJvID0gZ2V0TGltYm9TaGVsbCgpOworCQkJCXJ1bkNvbnRleHQuc2V0KCJsaW1ibyIsIGxpbWJvKTsKKworCQkJCS8vIEhBQ0shISB3ZSBzaG91bGQgbG9vcCB1bnRpbCB0aGUgZGlzcGxheSBnZXRzIGRpc3Bvc2VkLi4uCisJCQkJLy8gLi4udGhlbiB3ZSBsaXN0ZW4gZm9yIHRoZSBsYXN0ICdtYWluJyB3aW5kb3cgdG8gZ2V0IGRpc3Bvc2VkCisJCQkJLy8gYW5kIGRpc3Bvc2UgdGhlIERpc3BsYXkKKwkJCQl0ZXN0U2hlbGwgPSBudWxsOworCQkJCXRoZUFwcCA9IG51bGw7CisJCQkJYm9vbGVhbiBzcGluT25jZSA9IHRydWU7CisJCQkJaWYgKHVpUm9vdCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbikgeworCQkJCQlTaGVsbEFjdGl2YXRpb25MaXN0ZW5lciBzaGVsbERpYWxvZ0xpc3RlbmVyID0gbmV3IFNoZWxsQWN0aXZhdGlvbkxpc3RlbmVyKAorCQkJCQkJCShNQXBwbGljYXRpb24pIHVpUm9vdCk7CisJCQkJCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5BY3RpdmF0ZSwgc2hlbGxEaWFsb2dMaXN0ZW5lcik7CisJCQkJCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5EZWFjdGl2YXRlLCBzaGVsbERpYWxvZ0xpc3RlbmVyKTsKKwkJCQkJc3Bpbk9uY2UgPSBmYWxzZTsgLy8gbG9vcCB1bnRpbCB0aGUgYXBwIGNsb3NlcworCQkJCQl0aGVBcHAgPSAoTUFwcGxpY2F0aW9uKSB1aVJvb3Q7CisJCQkJCS8vIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJCU1XaW5kb3cgc2VsZWN0ZWQgPSB0aGVBcHAuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJCWlmIChzZWxlY3RlZCA9PSBudWxsKSB7CisJCQkJCQlmb3IgKE1XaW5kb3cgd2luZG93IDogdGhlQXBwLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJCQljcmVhdGVHdWkod2luZG93KTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHJlbmRlciB0aGUgc2VsZWN0ZWQgb25lIGZpcnN0CisJCQkJCQljcmVhdGVHdWkoc2VsZWN0ZWQpOworCQkJCQkJZm9yIChNV2luZG93IHdpbmRvdyA6IHRoZUFwcC5nZXRDaGlsZHJlbigpKSB7CisJCQkJCQkJaWYgKHNlbGVjdGVkICE9IHdpbmRvdykgeworCQkJCQkJCQljcmVhdGVHdWkod2luZG93KTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVuZGVyOiAiICsgKGVuZFRpbWUgLSBzdGFydFRpbWUpKTsKKwkJCQkJLy8gdGVsbCB0aGUgYXBwIGNvbnRleHQgd2UgYXJlIHN0YXJ0aW5nIHNvIHRoZSBzcGxhc2ggaXMKKwkJCQkJLy8gdG9ybiBkb3duCisJCQkJCUlBcHBsaWNhdGlvbkNvbnRleHQgYWMgPSBhcHBDb250ZXh0CisJCQkJCQkJLmdldChJQXBwbGljYXRpb25Db250ZXh0LmNsYXNzKTsKKwkJCQkJaWYgKGFjICE9IG51bGwpIHsKKwkJCQkJCWFjLmFwcGxpY2F0aW9uUnVubmluZygpOworCQkJCQkJaWYgKGV2ZW50QnJva2VyICE9IG51bGwpCisJCQkJCQkJZXZlbnRCcm9rZXIucG9zdCgKKwkJCQkJCQkJCVVJRXZlbnRzLlVJTGlmZUN5Y2xlLkFQUF9TVEFSVFVQX0NPTVBMRVRFLAorCQkJCQkJCQkJdGhlQXBwKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAodWlSb290IGluc3RhbmNlb2YgTVVJRWxlbWVudCkgeworCQkJCQlpZiAodWlSb290IGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJCQkJdGVzdFNoZWxsID0gKFNoZWxsKSBjcmVhdGVHdWkoKE1VSUVsZW1lbnQpIHVpUm9vdCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBwYXJ0aWFsIG1vZGVscyAoZm9yIHRlc3RpbmcuLi4pCisJCQkJCQl0ZXN0U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0pOworCQkJCQkJY3JlYXRlR3VpKChNVUlFbGVtZW50KSB1aVJvb3QsIHRlc3RTaGVsbCwgbnVsbCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBhbGxvdyBhbnkgZWFybHkgc3RhcnR1cCBleHRlbnNpb25zIHRvIHJ1bgorCQkJCVJ1bm5hYmxlIGVhcmx5U3RhcnR1cCA9IChSdW5uYWJsZSkgcnVuQ29udGV4dAorCQkJCQkJLmdldChFQVJMWV9TVEFSVFVQX0hPT0spOworCQkJCWlmIChlYXJseVN0YXJ0dXAgIT0gbnVsbCkgeworCQkJCQllYXJseVN0YXJ0dXAucnVuKCk7CisJCQkJfQorCQkJCS8vIFRPRE8gUkFQIHVuc3VwcG9ydGVkCisJCQkJLy8gVGVzdGFibGVPYmplY3QgdGVzdGFibGVPYmplY3QgPSAoVGVzdGFibGVPYmplY3QpIHJ1bkNvbnRleHQKKwkJCQkvLyAuZ2V0KFRlc3RhYmxlT2JqZWN0LmNsYXNzLmdldE5hbWUoKSk7CisJCQkJLy8gaWYgKHRlc3RhYmxlT2JqZWN0IGluc3RhbmNlb2YgRTRUZXN0YWJsZSkgeworCQkJCS8vICgoRTRUZXN0YWJsZSkgdGVzdGFibGVPYmplY3QpLmluaXQoZGlzcGxheSwKKwkJCQkvLyAoSVdvcmtiZW5jaCkgcnVuQ29udGV4dC5nZXQoSVdvcmtiZW5jaC5jbGFzcworCQkJCS8vIC5nZXROYW1lKCkpKTsKKwkJCQkvLyB9CisKKwkJCQlJRXZlbnRMb29wQWR2aXNvciBhZHZpc29yID0gcnVuQ29udGV4dC5nZXRBY3RpdmVMZWFmKCkuZ2V0KAorCQkJCQkJSUV2ZW50TG9vcEFkdmlzb3IuY2xhc3MpOworCQkJCWlmIChhZHZpc29yID09IG51bGwpIHsKKwkJCQkJYWR2aXNvciA9IG5ldyBJRXZlbnRMb29wQWR2aXNvcigpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgZXZlbnRMb29wSWRsZShEaXNwbGF5IGRpc3BsYXkpIHsKKwkJCQkJCQlkaXNwbGF5LnNsZWVwKCk7CisJCQkJCQl9CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgZXZlbnRMb29wRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJCQkJCQlTdGF0dXNSZXBvcnRlciBzdGF0dXNSZXBvcnRlciA9IChTdGF0dXNSZXBvcnRlcikgYXBwQ29udGV4dAorCQkJCQkJCQkJLmdldChTdGF0dXNSZXBvcnRlci5jbGFzcy5nZXROYW1lKCkpOworCQkJCQkJCWlmIChzdGF0dXNSZXBvcnRlciAhPSBudWxsKSB7CisJCQkJCQkJCXN0YXR1c1JlcG9ydGVyLnNob3coU3RhdHVzUmVwb3J0ZXIuRVJST1IsCisJCQkJCQkJCQkJIkludGVybmFsIEVycm9yIiwgZXhjZXB0aW9uKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKKwkJCQkJCQkJCWxvZ2dlci5lcnJvcihleGNlcHRpb24pOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9OworCQkJCX0KKwkJCQkvLyBTcGluIHRoZSBldmVudCBsb29wIHVudGlsIHNvbWVvbmUgZGlzcG9zZXMgdGhlIGRpc3BsYXkKKwkJCQl3aGlsZSAoKCh0ZXN0U2hlbGwgIT0gbnVsbCAmJiAhdGVzdFNoZWxsLmlzRGlzcG9zZWQoKSkgfHwgKHRoZUFwcCAhPSBudWxsICYmIHNvbWVBcmVWaXNpYmxlKHRoZUFwcAorCQkJCQkJLmdldENoaWxkcmVuKCkpKSkgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCXRyeSB7CisJCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKKwkJCQkJCQlydW5Db250ZXh0LnByb2Nlc3NXYWl0aW5nKCk7CisJCQkJCQkJaWYgKHNwaW5PbmNlKQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJYWR2aXNvci5ldmVudExvb3BJZGxlKGRpc3BsYXkpOworCQkJCQkJfQorCQkJCQl9IGNhdGNoIChUaHJlYWREZWF0aCB0aCkgeworCQkJCQkJdGhyb3cgdGg7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJaGFuZGxlKGV4LCBhZHZpc29yKTsKKwkJCQkJfSBjYXRjaCAoRXJyb3IgZXJyKSB7CisJCQkJCQloYW5kbGUoZXJyLCBhZHZpc29yKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIXNwaW5PbmNlKSB7CisJCQkJCWNsZWFuVXAoKTsKKwkJCQl9CisJCQl9CisKKwkJCXByaXZhdGUgdm9pZCBoYW5kbGUoVGhyb3dhYmxlIGV4LCBJRXZlbnRMb29wQWR2aXNvciBhZHZpc29yKSB7CisJCQkJdHJ5IHsKKwkJCQkJYWR2aXNvci5ldmVudExvb3BFeGNlcHRpb24oZXgpOworCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJCWlmICh0IGluc3RhbmNlb2YgVGhyZWFkRGVhdGgpIHsKKwkJCQkJCXRocm93IChUaHJlYWREZWF0aCkgdDsKKwkJCQkJfQorCisJCQkJCS8vIGNvdWxkbid0IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBwcmludCB0byBjb25zb2xlCisJCQkJCXQucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gc29tZUFyZVZpc2libGUoTGlzdDxNV2luZG93PiB3aW5kb3dzKSB7CisJCS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBldmVudCBkaXNwYXRjaCBsb29wLCBzbyB0aGUKKwkJLy8gZm9sbG93aW5nIG9wdGltaXphdGlvbiBpcyBpbiBvcmRlci4uLgorCisJCS8vIElkZWFsbHksIHdlJ2QganVzdCBkbzoKKwkJLy8gZm9yIChNV2luZG93IHdpbiA6IHRoZUFwcC5nZXRDaGlsZHJlbigpKSB7CisJCS8vIEJ1dCB0aGlzIGNyZWF0ZXMgYW4gaXRlcmF0b3IgKHdoaWNoIG11c3QgYmUgR0MnZCkKKwkJLy8gYXQgZXZlcnkgY2FsbC4gVGhlIGNvZGUgYmVsb3cgY3JlYXRlcyBubyBvYmplY3RzLgorCQlmaW5hbCBpbnQgbGltaXQgPSB3aW5kb3dzLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7CisJCQlmaW5hbCBNV2luZG93IHdpbiA9IHdpbmRvd3MuZ2V0KGkpOworCQkJLy8gTm90ZTogUmVtb3ZlZCBpc1Zpc2libGUgdGVzdCwgYXMgdGhpcyBzaG91bGQgaGF2ZQorCQkJLy8gbm8gaW1wYWN0IG9uIHRoZSB3aGV0aGVyIHRoZSBldmVudCBsb29wCisJCQkvLyB0ZXJtaW5hdGVzIC0gbm9uLXZpc2libGUgd2luZG93cyBzdGlsbCBleGlzdHMKKwkJCS8vIGFuZCBjYW4gcmVjZWl2ZSBldmVudHMuCisJCQkvLyBOb3RlOiBpc1RvQmVSZW5kZXJlZCgpID09IHRydWUgPT4gd2luLmdldFdpZGdldCgpICE9IG51bGwKKwkJCS8vIGJ1dCBJJ20gbm90IHN1cmUgd2hldGhlciB0aGVyZSBpcyBsYXRlbmN5IGJldHdlZW4gc2V0dGluZworCQkJLy8gdG9CZVJlbmRlcmVkIGFuZCB0aGUgY3JlYXRpb24gb2YgdGhlIHdpZGdldC4gU28sIGtlZXBpbmcKKwkJCS8vIGJvdGggdGVzdHMgc2VlbXMgcHJ1ZGVudC4KKwkJCWlmICh3aW4uaXNUb0JlUmVuZGVyZWQoKSAmJiB3aW4uZ2V0V2lkZ2V0KCkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQkvLyBGSVhNRSBXaXRob3V0IHRoaXMgY2FsbCB0aGUgdGVzdC1zdWl0ZSBmYWlscworCQljbGVhblVwKCk7CisJCWlmICh0aGVBcHAgIT0gbnVsbCkgeworCQkJZm9yIChNV2luZG93IHdpbmRvdyA6IHRoZUFwcC5nZXRDaGlsZHJlbigpKSB7CisJCQkJaWYgKHdpbmRvdy5nZXRXaWRnZXQoKSAhPSBudWxsKSB7CisJCQkJCXJlbW92ZUd1aSh3aW5kb3cpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICh0ZXN0U2hlbGwgIT0gbnVsbCAmJiAhdGVzdFNoZWxsLmlzRGlzcG9zZWQoKSkgeworCQkJT2JqZWN0IG1vZGVsID0gdGVzdFNoZWxsLmdldERhdGEoQWJzdHJhY3RQYXJ0UmVuZGVyZXIuT1dOSU5HX01FKTsKKwkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE1VSUVsZW1lbnQpIHsKKwkJCQlyZW1vdmVHdWkoKE1VSUVsZW1lbnQpIG1vZGVsKTsKKwkJCX0gZWxzZSB7CisJCQkJdGVzdFNoZWxsLmNsb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoaXMgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHVudGlsIHdlIGtub3cKKwkgKiB3aHkgdGhpcyBpcyBuZWVkZWQgd2Ugc2hvdWxkIG1ha2UgdGhpcyBzYWZlIGZvciBtdWx0aXBsZSBjYWxscworCSAqLworCXByaXZhdGUgdm9pZCBjbGVhblVwKCkgeworCQlpZiAoa2V5TGlzdGVuZXIgIT0gbnVsbCkgeworCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIoU1dULktleURvd24sIGtleUxpc3RlbmVyKTsKKwkJCQlkaXNwbGF5LnJlbW92ZUZpbHRlcihTV1QuVHJhdmVyc2UsIGtleUxpc3RlbmVyKTsKKwkJCQlrZXlMaXN0ZW5lciA9IG51bGw7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVN0eWxpbmcoRGlzcGxheSBkaXNwbGF5LAorCQkJSUVjbGlwc2VDb250ZXh0IGFwcENvbnRleHQpIHsKKwkJQ1NTUmVuZGVyaW5nVXRpbHMgY3NzVXRpbHMgPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKAorCQkJCUNTU1JlbmRlcmluZ1V0aWxzLmNsYXNzLCBhcHBDb250ZXh0KTsKKwkJYXBwQ29udGV4dC5zZXQoQ1NTUmVuZGVyaW5nVXRpbHMuY2xhc3MsIGNzc1V0aWxzKTsKKwl9CisKKwkvLyBGSVhNRSBSQVAgdW5zdXBwb3J0ZWQKKwkvLyBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVN0eWxpbmcoRGlzcGxheSBkaXNwbGF5LAorCS8vIElFY2xpcHNlQ29udGV4dCBhcHBDb250ZXh0KSB7CisJLy8gU3RyaW5nIGNzc1RoZW1lID0gKFN0cmluZykgYXBwQ29udGV4dC5nZXQoRTRBcHBsaWNhdGlvbi5USEVNRV9JRCk7CisJLy8gU3RyaW5nIGNzc1VSSSA9IChTdHJpbmcpIGFwcENvbnRleHQuZ2V0KElXb3JrYmVuY2guQ1NTX1VSSV9BUkcpOworCS8vIGlmICgibm9uZSIuZXF1YWxzKGNzc1RoZW1lKSkgeworCS8vIGFwcENvbnRleHQuc2V0KElTdHlsaW5nRW5naW5lLlNFUlZJQ0VfTkFNRSwgbmV3IElTdHlsaW5nRW5naW5lKCkgeworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShPYmplY3Qgd2lkZ2V0LCBTdHJpbmcgY2xhc3NuYW1lKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRDU1NDbGFzcygoV2lkZ2V0KSB3aWRnZXQsIGNsYXNzbmFtZSk7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIHZvaWQgc2V0SWQoT2JqZWN0IHdpZGdldCwgU3RyaW5nIGlkKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRJRCgoV2lkZ2V0KSB3aWRnZXQsIGlkKTsKKwkvLyB9CisJLy8KKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCBzdHlsZShPYmplY3Qgd2lkZ2V0KSB7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoT2JqZWN0IHdpZGdldCkgeworCS8vIHJldHVybiBudWxsOworCS8vIH0KKwkvLworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZUFuZElkKE9iamVjdCB3aWRnZXQsIFN0cmluZyBjbGFzc25hbWUsCisJLy8gU3RyaW5nIGlkKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRDU1NDbGFzcygoV2lkZ2V0KSB3aWRnZXQsIGNsYXNzbmFtZSk7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRJRCgoV2lkZ2V0KSB3aWRnZXQsIGlkKTsKKwkvLyB9CisJLy8gfSk7CisJLy8gfSBlbHNlIGlmIChjc3NUaGVtZSAhPSBudWxsKSB7CisJLy8gZmluYWwgSVRoZW1lRW5naW5lIHRoZW1lRW5naW5lID0gY3JlYXRlVGhlbWVFbmdpbmUoZGlzcGxheSwKKwkvLyBhcHBDb250ZXh0KTsKKwkvLyBTdHJpbmcgY3NzUmVzb3VyY2VzVVJJID0gKFN0cmluZykgYXBwQ29udGV4dAorCS8vIC5nZXQoSVdvcmtiZW5jaC5DU1NfUkVTT1VSQ0VfVVJJX0FSRyk7CisJLy8KKwkvLyAvLyBDcmVhdGUgdGhlIE9TR2kgcmVzb3VyY2UgbG9jYXRvcgorCS8vIGlmIChjc3NSZXNvdXJjZXNVUkkgIT0gbnVsbCkgeworCS8vIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIHNldCB0aHJvdWdoIGFuIGV4dGVuc2lvbiBhcyB3ZWxsPworCS8vIHRoZW1lRW5naW5lLnJlZ2lzdGVyUmVzb3VyY2VMb2NhdG9yKG5ldyBPU0dpUmVzb3VyY2VMb2NhdG9yKAorCS8vIGNzc1Jlc291cmNlc1VSSSkpOworCS8vIH0KKwkvLworCS8vIGFwcENvbnRleHQuc2V0KElTdHlsaW5nRW5naW5lLlNFUlZJQ0VfTkFNRSwgbmV3IElTdHlsaW5nRW5naW5lKCkgeworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShPYmplY3Qgd2lkZ2V0LCBTdHJpbmcgY2xhc3NuYW1lKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRDU1NDbGFzcygoV2lkZ2V0KSB3aWRnZXQsIGNsYXNzbmFtZSk7CisJLy8gdGhlbWVFbmdpbmUuYXBwbHlTdHlsZXMod2lkZ2V0LCB0cnVlKTsKKwkvLyB9CisJLy8KKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCBzZXRJZChPYmplY3Qgd2lkZ2V0LCBTdHJpbmcgaWQpIHsKKwkvLyBXaWRnZXRFbGVtZW50LnNldElEKChXaWRnZXQpIHdpZGdldCwgaWQpOworCS8vIHRoZW1lRW5naW5lLmFwcGx5U3R5bGVzKHdpZGdldCwgdHJ1ZSk7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIHZvaWQgc3R5bGUoT2JqZWN0IHdpZGdldCkgeworCS8vIHRoZW1lRW5naW5lLmFwcGx5U3R5bGVzKHdpZGdldCwgdHJ1ZSk7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoT2JqZWN0IHdpZGdldCkgeworCS8vIHJldHVybiB0aGVtZUVuZ2luZS5nZXRTdHlsZSh3aWRnZXQpOworCS8vIH0KKwkvLworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZUFuZElkKE9iamVjdCB3aWRnZXQsIFN0cmluZyBjbGFzc25hbWUsCisJLy8gU3RyaW5nIGlkKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRDU1NDbGFzcygoV2lkZ2V0KSB3aWRnZXQsIGNsYXNzbmFtZSk7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRJRCgoV2lkZ2V0KSB3aWRnZXQsIGlkKTsKKwkvLyB0aGVtZUVuZ2luZS5hcHBseVN0eWxlcyh3aWRnZXQsIHRydWUpOworCS8vIH0KKwkvLyB9KTsKKwkvLworCS8vIHNldENTU1RoZW1lKGRpc3BsYXksIHRoZW1lRW5naW5lLCBjc3NUaGVtZSk7CisJLy8KKwkvLyB9IGVsc2UgaWYgKGNzc1VSSSAhPSBudWxsKSB7CisJLy8gU3RyaW5nIGNzc1Jlc291cmNlc1VSSSA9IChTdHJpbmcpIGFwcENvbnRleHQKKwkvLyAuZ2V0KElXb3JrYmVuY2guQ1NTX1JFU09VUkNFX1VSSV9BUkcpOworCS8vIGZpbmFsIENTU1NXVEVuZ2luZUltcGwgY3NzRW5naW5lID0gbmV3IENTU1NXVEVuZ2luZUltcGwoZGlzcGxheSwKKwkvLyB0cnVlKTsKKwkvLyBXaWRnZXRFbGVtZW50LnNldEVuZ2luZShkaXNwbGF5LCBjc3NFbmdpbmUpOworCS8vIGlmIChjc3NSZXNvdXJjZXNVUkkgIT0gbnVsbCkgeworCS8vIGNzc0VuZ2luZS5nZXRSZXNvdXJjZXNMb2NhdG9yTWFuYWdlcigpLnJlZ2lzdGVyUmVzb3VyY2VMb2NhdG9yKAorCS8vIG5ldyBPU0dpUmVzb3VyY2VMb2NhdG9yKGNzc1Jlc291cmNlc1VSSS50b1N0cmluZygpKSk7CisJLy8gfQorCS8vIC8vIEZJWE1FOiBpcyB0aGlzIG5lZWRlZD8KKwkvLwkJCWRpc3BsYXkuc2V0RGF0YSgib3JnLmVjbGlwc2UuZTQudWkuY3NzLmNvbnRleHQiLCBhcHBDb250ZXh0KTsgLy8kTk9OLU5MUy0xJAorCS8vIGFwcENvbnRleHQuc2V0KElTdHlsaW5nRW5naW5lLlNFUlZJQ0VfTkFNRSwgbmV3IElTdHlsaW5nRW5naW5lKCkgeworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShPYmplY3Qgd2lkZ2V0LCBTdHJpbmcgY2xhc3NuYW1lKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRDU1NDbGFzcygoV2lkZ2V0KSB3aWRnZXQsIGNsYXNzbmFtZSk7CisJLy8gY3NzRW5naW5lLmFwcGx5U3R5bGVzKHdpZGdldCwgdHJ1ZSk7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIHZvaWQgc2V0SWQoT2JqZWN0IHdpZGdldCwgU3RyaW5nIGlkKSB7CisJLy8gV2lkZ2V0RWxlbWVudC5zZXRJRCgoV2lkZ2V0KSB3aWRnZXQsIGlkKTsKKwkvLyBjc3NFbmdpbmUuYXBwbHlTdHlsZXMod2lkZ2V0LCB0cnVlKTsKKwkvLyB9CisJLy8KKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCBzdHlsZShPYmplY3Qgd2lkZ2V0KSB7CisJLy8gY3NzRW5naW5lLmFwcGx5U3R5bGVzKHdpZGdldCwgdHJ1ZSk7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoT2JqZWN0IHdpZGdldCkgeworCS8vIEVsZW1lbnQgZSA9IGNzc0VuZ2luZS5nZXRDU1NFbGVtZW50Q29udGV4dCh3aWRnZXQpCisJLy8gLmdldEVsZW1lbnQoKTsKKwkvLyBpZiAoZSA9PSBudWxsKSB7CisJLy8gcmV0dXJuIG51bGw7CisJLy8gfQorCS8vIHJldHVybiBjc3NFbmdpbmUuZ2V0Vmlld0NTUygpLmdldENvbXB1dGVkU3R5bGUoZSwgbnVsbCk7CisJLy8gfQorCS8vCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lQW5kSWQoT2JqZWN0IHdpZGdldCwgU3RyaW5nIGNsYXNzbmFtZSwKKwkvLyBTdHJpbmcgaWQpIHsKKwkvLyBXaWRnZXRFbGVtZW50LnNldENTU0NsYXNzKChXaWRnZXQpIHdpZGdldCwgY2xhc3NuYW1lKTsKKwkvLyBXaWRnZXRFbGVtZW50LnNldElEKChXaWRnZXQpIHdpZGdldCwgaWQpOworCS8vIGNzc0VuZ2luZS5hcHBseVN0eWxlcyh3aWRnZXQsIHRydWUpOworCS8vIH0KKwkvLyB9KTsKKwkvLworCS8vIFVSTCB1cmw7CisJLy8gSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKwkvLyB0cnkgeworCS8vIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTChjc3NVUkkpKTsKKwkvLyBzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOworCS8vIGNzc0VuZ2luZS5wYXJzZVN0eWxlU2hlZXQoc3RyZWFtKTsKKwkvLyB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCS8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKwkvLyB9IGZpbmFsbHkgeworCS8vIGlmIChzdHJlYW0gIT0gbnVsbCkgeworCS8vIHRyeSB7CisJLy8gc3RyZWFtLmNsb3NlKCk7CisJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCS8vIH0KKwkvLyB9CisJLy8gfQorCS8vCisJLy8gU2hlbGxbXSBzaGVsbHMgPSBkaXNwbGF5LmdldFNoZWxscygpOworCS8vIGZvciAoU2hlbGwgcyA6IHNoZWxscykgeworCS8vIHRyeSB7CisJLy8gcy5zZXRSZWRyYXcoZmFsc2UpOworCS8vIHMucmVza2luKFNXVC5BTEwpOworCS8vIGNzc0VuZ2luZS5hcHBseVN0eWxlcyhzLCB0cnVlKTsKKwkvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCS8vIH0gZmluYWxseSB7CisJLy8gcy5zZXRSZWRyYXcodHJ1ZSk7CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBDU1NSZW5kZXJpbmdVdGlscyBjc3NVdGlscyA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoCisJLy8gQ1NTUmVuZGVyaW5nVXRpbHMuY2xhc3MsIGFwcENvbnRleHQpOworCS8vIGFwcENvbnRleHQuc2V0KENTU1JlbmRlcmluZ1V0aWxzLmNsYXNzLCBjc3NVdGlscyk7CisJLy8gfQorCS8vCisJLy8gcHJpdmF0ZSBzdGF0aWMgSVRoZW1lRW5naW5lIGNyZWF0ZVRoZW1lRW5naW5lKERpc3BsYXkgZGlzcGxheSwKKwkvLyBJRWNsaXBzZUNvbnRleHQgYXBwQ29udGV4dCkgeworCS8vIC8vIFN0b3JlIHRoZSBhcHAgY29udGV4dAorCS8vIElDb250cmlidXRpb25GYWN0b3J5IGNvbnRyaWJ1dGlvbiA9IChJQ29udHJpYnV0aW9uRmFjdG9yeSkgYXBwQ29udGV4dAorCS8vIC5nZXQoSUNvbnRyaWJ1dGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKwkvLyBJRWNsaXBzZUNvbnRleHQgY3NzQ29udGV4dCA9IEVjbGlwc2VDb250ZXh0RmFjdG9yeS5jcmVhdGUoKTsKKwkvLyBjc3NDb250ZXh0LnNldChJQ29udHJpYnV0aW9uRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksIGNvbnRyaWJ1dGlvbik7CisJLy8JCWRpc3BsYXkuc2V0RGF0YSgib3JnLmVjbGlwc2UuZTQudWkuY3NzLmNvbnRleHQiLCBjc3NDb250ZXh0KTsgLy8kTk9OLU5MUy0xJAorCS8vCisJLy8gSVRoZW1lTWFuYWdlciBtZ3IgPSBhcHBDb250ZXh0LmdldChJVGhlbWVNYW5hZ2VyLmNsYXNzKTsKKwkvLyBJVGhlbWVFbmdpbmUgdGhlbWVFbmdpbmUgPSBtZ3IuZ2V0RW5naW5lRm9yRGlzcGxheShkaXNwbGF5KTsKKwkvLworCS8vIGFwcENvbnRleHQuc2V0KElUaGVtZUVuZ2luZS5jbGFzcy5nZXROYW1lKCksIHRoZW1lRW5naW5lKTsKKwkvLyByZXR1cm4gdGhlbWVFbmdpbmU7CisJLy8gfQorCS8vCisJLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDU1NUaGVtZShEaXNwbGF5IGRpc3BsYXksIElUaGVtZUVuZ2luZQorCS8vIHRoZW1lRW5naW5lLAorCS8vIFN0cmluZyBjc3NUaGVtZSkgeworCS8vIGlmIChkaXNwbGF5LmdldEhpZ2hDb250cmFzdCgpKSB7CisJLy8gdGhlbWVFbmdpbmUuc2V0VGhlbWUoY3NzVGhlbWUsIGZhbHNlKTsKKwkvLyB9IGVsc2UgeworCS8vIHRoZW1lRW5naW5lLnJlc3RvcmUoY3NzVGhlbWUpOworCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBwdWJsaWMgc3RhdGljIGNsYXNzIFN0eWxpbmdQcmVmZXJlbmNlc0hhbmRsZXIgaW1wbGVtZW50cyBFdmVudEhhbmRsZXIgeworCS8vIHByaXZhdGUgSGFzaFNldDxJRWNsaXBzZVByZWZlcmVuY2VzPiBwcmVmcyA9IG51bGw7CisJLy8KKwkvLyBwdWJsaWMgU3R5bGluZ1ByZWZlcmVuY2VzSGFuZGxlcihEaXNwbGF5IGRpc3BsYXkpIHsKKwkvLyBpZiAoZGlzcGxheSAhPSBudWxsKSB7CisJLy8gZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwKKwkvLyBjcmVhdGVPbkRpc3BsYXlEaXNwb3NlZExpc3RlbmVyKCkpOworCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBwcm90ZWN0ZWQgTGlzdGVuZXIgY3JlYXRlT25EaXNwbGF5RGlzcG9zZWRMaXN0ZW5lcigpIHsKKwkvLyByZXR1cm4gbmV3IExpc3RlbmVyKCkgeworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50IGV2ZW50KSB7CisJLy8gcmVzZXRPdmVycmlkZGVuUHJlZmVyZW5jZXMoKTsKKwkvLyB9CisJLy8gfTsKKwkvLyB9CisJLy8KKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCS8vIHJlc2V0T3ZlcnJpZGRlblByZWZlcmVuY2VzKCk7CisJLy8gb3ZlcnJpZGVQcmVmZXJlbmNlcyhnZXRUaGVtZUVuZ2luZShldmVudCkpOworCS8vIH0KKwkvLworCS8vIHByb3RlY3RlZCB2b2lkIHJlc2V0T3ZlcnJpZGRlblByZWZlcmVuY2VzKCkgeworCS8vIGZvciAoSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA6IGdldFByZWZlcmVuY2VzKCkpIHsKKwkvLyByZXNldE92ZXJyaWRkZW5QcmVmZXJlbmNlcyhwcmVmZXJlbmNlcyk7CisJLy8gfQorCS8vIH0KKwkvLworCS8vIHByb3RlY3RlZCB2b2lkIHJlc2V0T3ZlcnJpZGRlblByZWZlcmVuY2VzKAorCS8vIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKKwkvLyBmb3IgKFN0cmluZyBuYW1lIDogZ2V0T3ZlcnJpZGRlblByb3BlcnR5TmFtZXMocHJlZmVyZW5jZXMpKSB7CisJLy8gcHJlZmVyZW5jZXMucmVtb3ZlKG5hbWUpOworCS8vIH0KKwkvLyByZW1vdmVPdmVycmlkZGVuUHJvcGVydHlOYW1lcyhwcmVmZXJlbmNlcyk7CisJLy8gfQorCS8vCisJLy8gcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT3ZlcnJpZGRlblByb3BlcnR5TmFtZXMoCisJLy8gSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgeworCS8vIEVjbGlwc2VQcmVmZXJlbmNlc0hlbHBlci5yZW1vdmVPdmVycmlkZGVuUHJvcGVydHlOYW1lcyhwcmVmZXJlbmNlcyk7CisJLy8gfQorCS8vCisJLy8gcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRPdmVycmlkZGVuUHJvcGVydHlOYW1lcygKKwkvLyBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7CisJLy8gcmV0dXJuIEVjbGlwc2VQcmVmZXJlbmNlc0hlbHBlcgorCS8vIC5nZXRPdmVycmlkZGVuUHJvcGVydHlOYW1lcyhwcmVmZXJlbmNlcyk7CisJLy8gfQorCS8vCisJLy8gcHJvdGVjdGVkIFNldDxJRWNsaXBzZVByZWZlcmVuY2VzPiBnZXRQcmVmZXJlbmNlcygpIHsKKwkvLyBpZiAocHJlZnMgPT0gbnVsbCkgeworCS8vIHByZWZzID0gbmV3IEhhc2hTZXQ8SUVjbGlwc2VQcmVmZXJlbmNlcz4oKTsKKwkvLyBQbGF0Zm9ybUFkbWluIGFkbWluID0gV29ya2JlbmNoU1dUQWN0aXZhdG9yLmdldERlZmF1bHQoKQorCS8vIC5nZXRQbGF0Zm9ybUFkbWluKCk7CisJLy8KKwkvLyBTdGF0ZSBzdGF0ZSA9IGFkbWluLmdldFN0YXRlKGZhbHNlKTsKKwkvLyBCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7CisJLy8KKwkvLyBmb3IgKEJ1bmRsZURlc2NyaXB0aW9uIGRlc2MgOiBidW5kbGVzKSB7CisJLy8gaWYgKGRlc2MuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkvLyBwcmVmcy5hZGQoSW5zdGFuY2VTY29wZS5JTlNUQU5DRS5nZXROb2RlKGRlc2MuZ2V0TmFtZSgpKSk7CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8gcmV0dXJuIHByZWZzOworCS8vIH0KKwkvLworCS8vIHByaXZhdGUgdm9pZCBvdmVycmlkZVByZWZlcmVuY2VzKElUaGVtZUVuZ2luZSB0aGVtZUVuZ2luZSkgeworCS8vIGlmICh0aGVtZUVuZ2luZSAhPSBudWxsKSB7CisJLy8gZm9yIChJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzIDogZ2V0UHJlZmVyZW5jZXMoKSkgeworCS8vIHRoZW1lRW5naW5lLmFwcGx5U3R5bGVzKHByZWZlcmVuY2VzLCBmYWxzZSk7CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBwcml2YXRlIElUaGVtZUVuZ2luZSBnZXRUaGVtZUVuZ2luZShFdmVudCBldmVudCkgeworCS8vIHJldHVybiAoSVRoZW1lRW5naW5lKSBldmVudAorCS8vIC5nZXRQcm9wZXJ0eShJVGhlbWVFbmdpbmUuRXZlbnRzLlRIRU1FX0VOR0lORSk7CisJLy8gfQorCS8vIH0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9Qb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9Qb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzdiZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1BvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0OworCitwdWJsaWMgY2xhc3MgUG9saWN5IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19SRU5ERVJFUiA9ICIvdHJhY2UvcmVuZGVyZXIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVVMgPSAiL3RyYWNlL21lbnVzIjsgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1Jlc291cmNlVXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1Jlc291cmNlVXRpbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZThlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvUmVzb3VyY2VVdGlsaXR5LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBCZXN0U29sdXRpb24uYXQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFRvbSBTY2hpbmRsIDx0b20uc2NoaW5kbEBiZXN0c29sdXRpb24uYXQ+IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgQm9yaXMgQm9rb3dza2ksIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC51dGlsLklTV1RSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWxpdHkgaW1wbGVtZW50cyBJU1dUUmVzb3VyY2VVdGlsaXRpZXMgeworCisJcHVibGljIFJlc291cmNlVXRpbGl0eSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvckZyb21VUkkoVVJJIGljb25QYXRoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChpY29uUGF0aC50b1N0cmluZygpKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oImljb25VUkkgXCIiICsgaWNvblBhdGgudG9TdHJpbmcoKQorCQkJCQkrICJcIiBpcyBpbnZhbGlkLCBubyBpbWFnZSB3aWxsIGJlIHNob3duIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBhZG9ybkltYWdlKEltYWdlIHRvQWRvcm4sIEltYWdlIGFkb3JubWVudCkgeworCQkvLyBpZiAodG9BZG9ybiA9PSBudWxsKQorCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8gaWYgKGFkb3JubWVudCA9PSBudWxsKQorCQkvLyByZXR1cm4gdG9BZG9ybjsKKwkJLy8gUmVjdGFuZ2xlIGFkb3JubWVudFNpemUgPSBhZG9ybm1lbnQuZ2V0Qm91bmRzKCk7CisJCS8vCisJCS8vIEltYWdlIGFkb3JuZWRJbWFnZSA9IG5ldyBJbWFnZSh0b0Fkb3JuLmdldERldmljZSgpLCAxNiwgMTYpOworCQkvLyBHQyBnYyA9IG5ldyBHQyhhZG9ybmVkSW1hZ2UpOworCQkvLyBnYy5kcmF3SW1hZ2UodG9BZG9ybiwgMCwgMCk7CisJCS8vIC8vIEZvciBub3cgYXNzdW1lIHRvcC1yaWdodAorCQkvLyBnYy5kcmF3SW1hZ2UoYWRvcm5tZW50LCAxNiAtIGFkb3JubWVudFNpemUud2lkdGgsIDApOworCQkvLyBnYy5kaXNwb3NlKCk7CisJCS8vCisJCS8vIHJldHVybiBhZG9ybmVkSW1hZ2U7CisJCXJldHVybiB0b0Fkb3JuOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9TZWxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1NlbGVjdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwNWYyMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9TZWxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU2ltb24gU2Nob2x6IDxzaW1vbi5zY2hvbHpAdm9nZWxsYS5jb20+IC0gQnVnIDQ2MDQwNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JQ291bnRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CisKKy8qKgorICogQWRhcHRzIElTZWxlY3Rpb24gaW5zdGFuY2VzIHRvIGVpdGhlciBJSXRlcmFibGUgb3IgSUNvdW50YWJsZS4gRm9yIHVzZSB3aXRoCisgKiBjb3JlIGV4cHJlc3Npb25zLgorICoKKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIGNsYXNzIFNlbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIElDb3VudGFibGUgSUNPVU5UXzAgPSBuZXcgSUNvdW50YWJsZSgpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgY291bnQoKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ291bnRhYmxlIElDT1VOVF8xID0gbmV3IElDb3VudGFibGUoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGNvdW50KCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUl0ZXJhYmxlPD8+IElURVJBVEVfRU1QVFkgPSBuZXcgSUl0ZXJhYmxlPE9iamVjdD4oKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcigpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKS5pdGVyYXRvcigpOworCQl9CisJfTsKKworCS8qKgorCSAqIFRoZSBjbGFzc2VzIHdlIGNhbiBhZGFwdCB0by4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIENMQVNTRVMgPSBuZXcgQ2xhc3NbXSB7IElJdGVyYWJsZS5jbGFzcywgSUNvdW50YWJsZS5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBUIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3M8VD4gYWRhcHRlclR5cGUpIHsKKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElTZWxlY3Rpb24pIHsKKwkJCWlmIChhZGFwdGVyVHlwZSA9PSBJSXRlcmFibGUuY2xhc3MpIHsKKwkJCQlyZXR1cm4gYWRhcHRlclR5cGUuY2FzdChpdGVyYWJsZSgoSVNlbGVjdGlvbikgYWRhcHRhYmxlT2JqZWN0KSk7CisJCQl9IGVsc2UgaWYgKGFkYXB0ZXJUeXBlID09IElDb3VudGFibGUuY2xhc3MpIHsKKwkJCQlyZXR1cm4gYWRhcHRlclR5cGUuY2FzdChjb3VudGFibGUoKElTZWxlY3Rpb24pIGFkYXB0YWJsZU9iamVjdCkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSUl0ZXJhYmxlPD8+IGl0ZXJhYmxlKGZpbmFsIElTZWxlY3Rpb24gc2VsKSB7CisJCWlmIChzZWwuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gSVRFUkFURV9FTVBUWTsKKwkJfQorCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCXJldHVybiBuZXcgSUl0ZXJhYmxlPE9iamVjdD4oKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIEl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IoKSB7CisJCQkJCXJldHVybiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwpLml0ZXJhdG9yKCk7CisJCQkJfQorCQkJfTsKKwkJfQorCQlmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgc2VsIH0pOworCQlyZXR1cm4gbmV3IElJdGVyYWJsZTxPYmplY3Q+KCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yKCkgeworCQkJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBJQ291bnRhYmxlIGNvdW50YWJsZShmaW5hbCBJU2VsZWN0aW9uIHNlbCkgeworCQlpZiAoc2VsLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIElDT1VOVF8wOworCQl9CisJCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKKwkJCXJldHVybiBuZXcgSUNvdW50YWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgaW50IGNvdW50KCkgeworCQkJCQlyZXR1cm4gc3Muc2l6ZSgpOworCQkJCX0KKwkJCX07CisJCX0KKwkJcmV0dXJuIElDT1VOVF8xOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gQ0xBU1NFUzsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvU2hlbGxBY3RpdmF0aW9uTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9TaGVsbEFjdGl2YXRpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODIwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvU2hlbGxBY3RpdmF0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5FQmluZGluZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkU0V29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLkVDb250ZXh0U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCisvKioKKyAqIEFuIFNXVCBsaXN0ZW5lciBmb3IgbGlzdGVuaW5nIGZvciBhY3RpdmF0aW9uIGV2ZW50cyBvZiBzaGVsbHMgdGhhdCBhcmVuJ3QKKyAqIGFzc29jaWF0ZWQgd2l0aCBhbiBNV2luZG93LgorICovCitwdWJsaWMgY2xhc3MgU2hlbGxBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7CisKKwkvKioKKwkgKiBBIHN0cmluZyBrZXkgZm9yIHVzZSB3aXRoIGEgc2hlbGwncyBrZXllZCBkYXRhIHRvIGRldGVybWluZSB3aGV0aGVyCisJICogYWN0aXZhdGlvbiBldmVudHMgb2YgdGhhdCBzaGVsbCBzaG91bGQgYmUgaWdub3JlZCBieSB0aGlzIGxpc3RlbmVyLiBUaGUKKwkgKiByZXRyaWV2ZWQgZGF0YSBvZiB0aGlzIHN0cmluZyBrZXkgbXVzdCBlaXRoZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgYmUKKwkgKiBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19JR05PUkVfS0VZID0gIm9yZy5lY2xpcHNlLmU0LnVpLmlnbm9yZURpYWxvZyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEEgc3RyaW5nIGtleSBmb3IgdXNlIHdpdGggYSBzaGVsbCdzIGtleWVkIGRhdGEgdG8gcmV0cmlldmUgdGhlIHRvcCBsZXZlbAorCSAqIGVjbGlwc2UgY29udGV4dCB0aGF0IHRoZSBzaGVsbCBpcyBzdXBwb3NlZCB0byByZXByZXNlbnQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VfQ09OVEVYVF9TSEVMTF9DT05URVhUID0gIm9yZy5lY2xpcHNlLmU0LnVpLnNoZWxsQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgTUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworCisJU2hlbGxBY3RpdmF0aW9uTGlzdGVuZXIoTUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisJCXRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQlpZiAoIShldmVudC53aWRnZXQgaW5zdGFuY2VvZiBTaGVsbCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCVNoZWxsIHNoZWxsID0gKFNoZWxsKSBldmVudC53aWRnZXQ7CisJCU9iamVjdCBvYmogPSBzaGVsbC5nZXREYXRhKEFic3RyYWN0UGFydFJlbmRlcmVyLk9XTklOR19NRSk7CisJCWlmIChvYmogaW5zdGFuY2VvZiBNV2luZG93KSB7CisJCQlwcm9jZXNzV2luZG93KGV2ZW50LCBzaGVsbCwgKE1XaW5kb3cpIG9iaik7CisJCQlyZXR1cm47CisJCX0KKworCQlvYmogPSBzaGVsbC5nZXREYXRhKERJQUxPR19JR05PUkVfS0VZKTsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4gJiYgKChCb29sZWFuKSBvYmopLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwkJY2FzZSBTV1QuQWN0aXZhdGU6CisJCQlhY3RpdmF0ZShzaGVsbCk7CisJCQlicmVhazsKKwkJY2FzZSBTV1QuRGVhY3RpdmF0ZToKKwkJCWRlYWN0aXZhdGUoc2hlbGwpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1dpbmRvdyhFdmVudCBldmVudCwgU2hlbGwgc2hlbGwsIE1XaW5kb3cgd2luZG93KSB7CisJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCQljYXNlIFNXVC5BY3RpdmF0ZToKKwkJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBsb2NhbCA9IHdpbmRvdy5nZXRDb250ZXh0KCk7CisJCQlXb3JrYmVuY2hTV1RBY3RpdmF0b3IudHJhY2UoIi90cmFjZS93b3JrYmVuY2giLAorCQkJCQkic2V0dGluZyBtd2luZG93IGNvbnRleHQgIiArIGxvY2FsLCBudWxsKTsKKwkJCS8vIHJlY29yZCB0aGlzIHNoZWxsJ3MgY29udGV4dAorCQkJc2hlbGwuc2V0RGF0YShFQ0xJUFNFX0NPTlRFWFRfU0hFTExfQ09OVEVYVCwgbG9jYWwpOworCisJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJLy8gcmVjb25zdHJ1Y3QgdGhlIGFjdGl2ZSBjaGFpbiBmb3IgdGhpcyBtd2luZG93CisJCQkJCWxvY2FsLmFjdGl2YXRlQnJhbmNoKCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJCQkJV29ya2JlbmNoU1dUQWN0aXZhdG9yLnRyYWNlKCIvdHJhY2Uvd29ya2JlbmNoIiwKKwkJCQkJCQkiZmFpbGVkIGNvcnJlY3RpbmcgY29udGV4dCBjaGFpbiIsIGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfSk7CisJCQlicmVhazsKKwkJY2FzZSBTV1QuRGVhY3RpdmF0ZToKKwkJCU9iamVjdCBjb250ZXh0ID0gd2luZG93LmdldENvbnRleHQoKTsKKwkJCVdvcmtiZW5jaFNXVEFjdGl2YXRvci50cmFjZSgiL3RyYWNlL3dvcmtiZW5jaCIsCisJCQkJCSJzZXR0aW5nIG13aW5kb3cgY29udGV4dCAiICsgY29udGV4dCwgbnVsbCk7CisJCQkvLyByZWNvcmQgdGhpcyBzaGVsbCdzIGNvbnRleHQKKwkJCXNoZWxsLnNldERhdGEoRUNMSVBTRV9DT05URVhUX1NIRUxMX0NPTlRFWFQsIGNvbnRleHQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWN0aXZhdGUoU2hlbGwgc2hlbGwpIHsKKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQgPSBhcHBsaWNhdGlvbi5nZXRDb250ZXh0KCk7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBzaGVsbENvbnRleHQgPSBnZXRTaGVsbENvbnRleHQoc2hlbGwsCisJCQkJcGFyZW50Q29udGV4dCk7CisKKwkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCS8vIGFjdGl2YXRlIHRoaXMgc2hlbGwKKwkJCQlzaGVsbENvbnRleHQuYWN0aXZhdGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCVdvcmtiZW5jaFNXVEFjdGl2YXRvci50cmFjZSgiL3RyYWNlL3dvcmtiZW5jaCIsCisJCQkJCQkiZmFpbGVkIHNldHRpbmcgZGlhbG9nIGNoaWxkIiwgZXhjZXB0aW9uKTsKKwkJCX0KKwkJfSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZShTaGVsbCBzaGVsbCkgeworCQkvLyBidWcgNDEyMDAxLiBDYW5ub3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IGEgbm9uLW1vZGVsbGVkIFNoZWxsJ3MKKwkJLy8gZGVhY3RpdmF0aW9uLiBJdCBjb3VsZCBiZToKKwkJLy8gKiBzb21lIG90aGVyIGFwcGxpY2F0aW9uIGdvdCBhY3RpdmF0ZWQKKwkJLy8gKiBzb21lIGRpYWxvZyB3ZSBjYW5ub3Qgc2VlIChJRSdzIEZpbmQgZGlhbG9nIGluIDQxMjAwMSkgZ2V0J3MKKwkJLy8gYWN0aXZhdGVkCisJCS8vICogYW5vdGhlciB1bm1vZGVsbGVkIHNoZWxsIGlzIGFib3V0IHRvIGJlIGFjdGl2YXRlZAorCQkvLyAqIGEgbW9kZWxsZWQgc2hlbGwgaXMgYWJvdXQgdG8gYmUgYWN0aXZhdGVkLgorCQkvLyBObyBtYXR0ZXIgd2hhdCwgdGhlIHRpbWUgdG8gZG8gdGhpbmdzIGlzIG9uIGFjdGl2YXRpb24KKworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgZWNsaXBzZSBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHNoZWxsLiBJZiBvbmUgY2Fubm90IGJlCisJICogZm91bmQsIGEgY2hpbGQgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgb2ZmIG9mIHRoZSBwcm92aWRlZCBwYXJlbnQKKwkgKiBjb250ZXh0LgorCSAqCisJICogQHBhcmFtIHNoZWxsCisJICogICAgICAgICAgICB0aGUgc2hlbGwgb2YgaW50ZXJlc3QsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudENvbnRleHQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udGV4dCB0aGF0IHRoZSBzaGVsbCdzIGNvbnRleHQgc2hvdWxkIGJlIGNyZWF0ZWQKKwkgKiAgICAgICAgICAgIG9mZiBvZiBpZiBpdCBkb2Vzbid0IGhhdmUgb25lLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gdGhlIHNoZWxsJ3MgZWNsaXBzZSBjb250ZXh0CisJICovCisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgZ2V0U2hlbGxDb250ZXh0KGZpbmFsIFNoZWxsIHNoZWxsLAorCQkJSUVjbGlwc2VDb250ZXh0IHBhcmVudENvbnRleHQpIHsKKwkJSUVjbGlwc2VDb250ZXh0IHNoZWxsQ29udGV4dCA9IChJRWNsaXBzZUNvbnRleHQpIHNoZWxsCisJCQkJLmdldERhdGEoRUNMSVBTRV9DT05URVhUX1NIRUxMX0NPTlRFWFQpOworCQlpZiAoc2hlbGxDb250ZXh0ICE9IG51bGwpIHsKKwkJCXJldHVybiBzaGVsbENvbnRleHQ7CisJCX0KKwkJZmluYWwgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBwYXJlbnRDb250ZXh0CisJCQkJLmNyZWF0ZUNoaWxkKEVCaW5kaW5nU2VydmljZS5ESUFMT0dfQ09OVEVYVF9JRCk7CisKKwkJY29udGV4dC5zZXQoRTRXb3JrYmVuY2guTE9DQUxfQUNUSVZFX1NIRUxMLCBzaGVsbCk7CisKKwkJLy8gc2V0IHRoZSBjb250ZXh0IGludG8gdGhlIHdpZGdldCBmb3IgZnV0dXJlIHJldHJpZXZhbAorCQlzaGVsbC5zZXREYXRhKEVDTElQU0VfQ09OVEVYVF9TSEVMTF9DT05URVhULCBjb250ZXh0KTsKKworCQlFQ29udGV4dFNlcnZpY2UgY29udGV4dFNlcnZpY2UgPSBjb250ZXh0LmdldChFQ29udGV4dFNlcnZpY2UuY2xhc3MpOworCQljb250ZXh0U2VydmljZS5hY3RpdmF0ZUNvbnRleHQoRUJpbmRpbmdTZXJ2aWNlLkRJQUxPR19DT05URVhUX0lEKTsKKworCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQlkZWFjdGl2YXRlKHNoZWxsKTsKKwkJCQljb250ZXh0LmRpc3Bvc2UoKTsKKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIGNvbnRleHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1N0YXR1c1JlcG9ydGVyQ3JlYXRpb25GdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1N0YXR1c1JlcG9ydGVyQ3JlYXRpb25GdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmJhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvU3RhdHVzUmVwb3J0ZXJDcmVhdGlvbkZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIFN0YXR1c1JlcG9ydGVyQ3JlYXRpb25GdW5jdGlvbiBleHRlbmRzIENvbnRleHRGdW5jdGlvbiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbXB1dGUoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBjb250ZXh0S2V5KSB7CisJCXJldHVybiBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKFdvcmtiZW5jaFN0YXR1c1JlcG9ydGVyLmNsYXNzLAorCQkJCWNvbnRleHQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1dvcmtiZW5jaFNXVEFjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1dvcmtiZW5jaFNXVEFjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTk5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvV29ya2JlbmNoU1dUQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5JbnRlcm5hbFBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnVHJhY2U7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5GaWx0ZXI7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkludmFsaWRTeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOworaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqLworcHVibGljIGNsYXNzIFdvcmtiZW5jaFNXVEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7IC8vIGV4dGVuZHMKKwkJCQkJCQkJCQkJCQkJCQkvLyBQbHVnaW4geworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1JFTkRFUkVSUyA9ICJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0IjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlcjw/LCBQYWNrYWdlQWRtaW4+IHBrZ0FkbWluVHJhY2tlcjsKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyPD8sIExvY2F0aW9uPiBsb2NhdGlvblRyYWNrZXI7CisJcHJpdmF0ZSBzdGF0aWMgV29ya2JlbmNoU1dUQWN0aXZhdG9yIGFjdGl2YXRvcjsKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyPD8sIERlYnVnT3B0aW9ucz4gZGVidWdUcmFja2VyOworCXByaXZhdGUgRGVidWdUcmFjZSB0cmFjZTsKKworCisJLyoqCisJICogR2V0IHRoZSBkZWZhdWx0IGFjdGl2YXRvci4KKwkgKgorCSAqIEByZXR1cm4gYSBCdW5kbGVBY3RpdmF0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdvcmtiZW5jaFNXVEFjdGl2YXRvciBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gYWN0aXZhdG9yOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhpcyBidW5kbGVzIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgeworCQlyZXR1cm4gY29udGV4dDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlhY3RpdmF0b3IgPSB0aGlzOworCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2F2ZURpYWxvZ1NldHRpbmdzKCk7CisJCWlmIChwa2dBZG1pblRyYWNrZXIgIT0gbnVsbCkgeworCQkJcGtnQWRtaW5UcmFja2VyLmNsb3NlKCk7CisJCQlwa2dBZG1pblRyYWNrZXIgPSBudWxsOworCQl9CisJfQorCisJcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisJCWlmIChjb250ZXh0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBjb250ZXh0LmdldEJ1bmRsZSgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIFBhY2thZ2VBZG1pbiBzZXJ2aWNlIGZyb20gdGhpcyBidW5kbGUKKwkgKi8KKwlwdWJsaWMgUGFja2FnZUFkbWluIGdldEJ1bmRsZUFkbWluKCkgeworCQlpZiAocGtnQWRtaW5UcmFja2VyID09IG51bGwpIHsKKwkJCWlmIChjb250ZXh0ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXBrZ0FkbWluVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcjw+KGNvbnRleHQsIFBhY2thZ2VBZG1pbi5jbGFzcywgbnVsbCk7CisJCQlwa2dBZG1pblRyYWNrZXIub3BlbigpOworCQl9CisJCXJldHVybiBwa2dBZG1pblRyYWNrZXIuZ2V0U2VydmljZSgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIExvY2F0aW9uIHNlcnZpY2UKKwkgKi8KKwlwdWJsaWMgTG9jYXRpb24gZ2V0SW5zdGFuY2VMb2NhdGlvbigpIHsKKwkJaWYgKGxvY2F0aW9uVHJhY2tlciA9PSBudWxsKSB7CisJCQlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJZmlsdGVyID0gY29udGV4dC5jcmVhdGVGaWx0ZXIoTG9jYXRpb24uSU5TVEFOQ0VfRklMVEVSKTsKKwkJCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZSB0aGlzLiBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHdlIGhhdmUgdGVzdGVkIHRoZQorCQkJCS8vIGFib3ZlIGZvcm1hdC4KKwkJCX0KKwkJCWxvY2F0aW9uVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcjw+KGNvbnRleHQsIGZpbHRlciwgbnVsbCk7CisJCQlsb2NhdGlvblRyYWNrZXIub3BlbigpOworCQl9CisJCXJldHVybiBsb2NhdGlvblRyYWNrZXIuZ2V0U2VydmljZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBidW5kbGVOYW1lCisJICogICAgICAgICAgICB0aGUgYnVuZGxlIGlkCisJICogQHJldHVybiBBIGJ1bmRsZSBpZiBmb3VuZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZUZvck5hbWUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKwkJQnVuZGxlW10gYnVuZGxlcyA9IGdldEJ1bmRsZUFkbWluKCkuZ2V0QnVuZGxlcyhidW5kbGVOYW1lLCBudWxsKTsKKwkJaWYgKGJ1bmRsZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJLy8gUmV0dXJuIHRoZSBmaXJzdCBidW5kbGUgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9yIHVuaW5zdGFsbGVkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKChidW5kbGVzW2ldLmdldFN0YXRlKCkgJiAoQnVuZGxlLklOU1RBTExFRCB8IEJ1bmRsZS5VTklOU1RBTExFRCkpID09IDApIHsKKwkJCQlyZXR1cm4gYnVuZGxlc1tpXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIG9wdGlvbiwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGVycm9yKSB7CisJCWZpbmFsIERlYnVnT3B0aW9ucyBkZWJ1Z09wdGlvbnMgPSBhY3RpdmF0b3IuZ2V0RGVidWdPcHRpb25zKCk7CisJCWlmIChkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKQorCQkJCSYmIGRlYnVnT3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFBJX1JFTkRFUkVSUyArIG9wdGlvbiwgZmFsc2UpKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKwkJCWlmIChlcnJvciAhPSBudWxsKSB7CisJCQkJZXJyb3IucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCQkJfQorCQl9CisJCWFjdGl2YXRvci5nZXRUcmFjZSgpLnRyYWNlKG9wdGlvbiwgbXNnLCBlcnJvcik7CisJfQorCisJcHVibGljIERlYnVnT3B0aW9ucyBnZXREZWJ1Z09wdGlvbnMoKSB7CisJCWlmIChkZWJ1Z1RyYWNrZXIgPT0gbnVsbCkgeworCQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJZGVidWdUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyPD4oY29udGV4dCwgRGVidWdPcHRpb25zLmNsYXNzLCBudWxsKTsKKwkJCWRlYnVnVHJhY2tlci5vcGVuKCk7CisJCX0KKwkJcmV0dXJuIGRlYnVnVHJhY2tlci5nZXRTZXJ2aWNlKCk7CisJfQorCisJcHVibGljIERlYnVnVHJhY2UgZ2V0VHJhY2UoKSB7CisJCWlmICh0cmFjZSA9PSBudWxsKSB7CisJCQl0cmFjZSA9IGdldERlYnVnT3B0aW9ucygpLm5ld0RlYnVnVHJhY2UoUElfUkVOREVSRVJTKTsKKwkJfQorCQlyZXR1cm4gdHJhY2U7CisJfQorCisJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29waWVkIGZyb20gQWJzdHJhY3RVSVBsdWdpbiBjbGFzcy4KKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBkaWFsb2cgc2V0dGluZ3MgZmlsZSAodmFsdWUKKwkgKiA8Y29kZT4iZGlhbG9nX3NldHRpbmdzLnhtbCI8L2NvZGU+KS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk5fRElBTE9HX1NFVFRJTkdTID0gImRpYWxvZ19zZXR0aW5ncy54bWwiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogU3RvcmFnZSBmb3IgZGlhbG9nIGFuZCB3aXphcmQgZGF0YTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHlldAorCSAqIGluaXRpYWxpemVkLgorCSAqLworCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gbnVsbDsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRpYWxvZyBzZXR0aW5ncyBmb3IgdGhpcyBVSSBwbHVnLWluLiBUaGUgZGlhbG9nIHNldHRpbmdzIGlzCisJICogdXNlZCB0byBob2xkIHBlcnNpc3RlbnQgc3RhdGUgZGF0YSBmb3IgdGhlIHZhcmlvdXMgd2l6YXJkcyBhbmQgZGlhbG9ncyBvZgorCSAqIHRoaXMgcGx1Zy1pbiBpbiB0aGUgY29udGV4dCBvZiBhIHdvcmtiZW5jaC4KKwkgKiA8cD4KKwkgKiBJZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyB0aGUgZGlhbG9nIHN0b3JlLCBhbiBlbXB0eSBvbmUgaXMgcXVpZXRseQorCSAqIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBidXQgYXJlIG5vdCBleHBlY3RlZCB0by4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgc2V0dGluZ3MKKwkgKi8KKwlwdWJsaWMgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgeworCQlpZiAoZGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkgeworCQkJbG9hZERpYWxvZ1NldHRpbmdzKCk7CisJCX0KKwkJcmV0dXJuIGRpYWxvZ1NldHRpbmdzOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBkaWFsb2cgc2V0dGluZ3MgZm9yIHRoaXMgcGx1Zy1pbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKwkgKiBmaXJzdCBsb29rcyBmb3IgYSBzdGFuZGFyZCBuYW1lZCBmaWxlIGluIHRoZSBwbHVnLWluJ3MgcmVhZC93cml0ZSBzdGF0ZQorCSAqIGFyZWE7IGlmIG5vIHN1Y2ggZmlsZSBleGlzdHMsIHRoZSBwbHVnLWluJ3MgaW5zdGFsbCBkaXJlY3RvcnkgaXMgY2hlY2tlZAorCSAqIHRvIHNlZSBpZiBvbmUgd2FzIGluc3RhbGxlZCB3aXRoIHNvbWUgZGVmYXVsdCBzZXR0aW5nczsgaWYgbm8gZmlsZSBpcworCSAqIGZvdW5kIGluIGVpdGhlciBwbGFjZSwgYSBuZXcgZW1wdHkgZGlhbG9nIHNldHRpbmdzIGlzIGNyZWF0ZWQuIElmIGEKKwkgKiBwcm9ibGVtIG9jY3VycywgYW4gZW1wdHkgc2V0dGluZ3MgaXMgc2lsZW50bHkgdXNlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIGZyYW1ld29yayBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4sIGFsdGhvdWdoIHRoaXMgaXMgdHlwaWNhbGx5CisJICogdW5uZWNlc3NhcnkuCisJICogPC9wPgorCSAqLworCXByb3RlY3RlZCB2b2lkIGxvYWREaWFsb2dTZXR0aW5ncygpIHsKKwkJZGlhbG9nU2V0dGluZ3MgPSBuZXcgRGlhbG9nU2V0dGluZ3MoIldvcmtiZW5jaCIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gYnVnIDY5Mzg3OiBUaGUgaW5zdGFuY2UgYXJlYSBzaG91bGQgbm90IGJlIGNyZWF0ZWQgKGluIHRoZSBjYWxsIHRvCisJCS8vICNnZXRTdGF0ZUxvY2F0aW9uKSBpZiAtZGF0YSBAbm9uZSBvciAtZGF0YSBAbm9EZWZhdWx0IHdhcyB1c2VkCisJCUlQYXRoIGRhdGFMb2NhdGlvbiA9IGdldFN0YXRlTG9jYXRpb25Pck51bGwoKTsKKwkJaWYgKGRhdGFMb2NhdGlvbiAhPSBudWxsKSB7CisJCQkvLyB0cnkgci93IHN0YXRlIGFyZWEgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCisJCQlTdHJpbmcgcmVhZFdyaXRlUGF0aCA9IGRhdGFMb2NhdGlvbi5hcHBlbmQoRk5fRElBTE9HX1NFVFRJTkdTKS50b09TU3RyaW5nKCk7CisJCQlGaWxlIHNldHRpbmdzRmlsZSA9IG5ldyBGaWxlKHJlYWRXcml0ZVBhdGgpOworCQkJaWYgKHNldHRpbmdzRmlsZS5leGlzdHMoKSkgeworCQkJCXRyeSB7CisJCQkJCWRpYWxvZ1NldHRpbmdzLmxvYWQocmVhZFdyaXRlUGF0aCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBsb2FkIGZhaWxlZCBzbyBlbnN1cmUgd2UgaGF2ZSBhbiBlbXB0eSBzZXR0aW5ncworCQkJCQlkaWFsb2dTZXR0aW5ncyA9IG5ldyBEaWFsb2dTZXR0aW5ncygiV29ya2JlbmNoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvLyBvdGhlcndpc2UgbG9vayBmb3IgYnVuZGxlIHNwZWNpZmljIGRpYWxvZyBzZXR0aW5ncworCQlCdW5kbGUgYnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUoKTsKKwkJVVJMIGRzVVJMID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIG5ldyBQYXRoKEZOX0RJQUxPR19TRVRUSU5HUyksIG51bGwpOworCQlpZiAoZHNVUkwgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOworCQl0cnkgeworCQkJaXMgPSBkc1VSTC5vcGVuU3RyZWFtKCk7CisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAidXRmLTgiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWRpYWxvZ1NldHRpbmdzLmxvYWQocmVhZGVyKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gbG9hZCBmYWlsZWQgc28gZW5zdXJlIHdlIGhhdmUgYW4gZW1wdHkgc2V0dGluZ3MKKwkJCWRpYWxvZ1NldHRpbmdzID0gbmV3IERpYWxvZ1NldHRpbmdzKCJXb3JrYmVuY2giKTsgLy8kTk9OLU5MUy0xJAorCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpZiAoaXMgIT0gbnVsbCkgeworCQkJCQlpcy5jbG9zZSgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBkbyBub3RoaW5nCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTYXZlcyB0aGlzIHBsdWctaW4ncyBkaWFsb2cgc2V0dGluZ3MuIEFueSBwcm9ibGVtcyB3aGljaCBhcmlzZSBhcmUKKwkgKiBzaWxlbnRseSBpZ25vcmVkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNhdmVEaWFsb2dTZXR0aW5ncygpIHsKKwkJaWYgKGRpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlJUGF0aCBwYXRoID0gZ2V0U3RhdGVMb2NhdGlvbk9yTnVsbCgpOworCQkJaWYgKHBhdGggPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCVN0cmluZyByZWFkV3JpdGVQYXRoID0gcGF0aC5hcHBlbmQoRk5fRElBTE9HX1NFVFRJTkdTKS50b09TU3RyaW5nKCk7CisJCQlkaWFsb2dTZXR0aW5ncy5zYXZlKHJlYWRXcml0ZVBhdGgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBzcGVjJ2VkIHRvIGlnbm9yZSBwcm9ibGVtcworCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworCQkJLy8gc3BlYydlZCB0byBpZ25vcmUgcHJvYmxlbXMKKwkJfQorCX0KKworCS8qKgorCSAqIEZPUiBJTlRFUk5BTCBXT1JLQkVOQ0ggVVNFIE9OTFkuCisJICoKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIGEgbG9jYXRpb24gaW4gdGhlIGZpbGUgc3lzdGVtIHRoYXQgY2FuIGJlIHVzZWQgdG8KKwkgKiBwZXJzaXN0L3Jlc3RvcmUgc3RhdGUgYmV0d2VlbiB3b3JrYmVuY2ggaW52b2NhdGlvbnMuIElmIHRoZSBsb2NhdGlvbiBkaWQKKwkgKiBub3QgZXhpc3QgcHJpb3IgdG8gdGhpcyBjYWxsIGl0IHdpbGwgYmUgY3JlYXRlZC4gUmV0dXJucworCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggbG9jYXRpb24gaXMgYXZhaWxhYmxlLgorCSAqCisJICogQHJldHVybiBwYXRoIHRvIGEgbG9jYXRpb24gaW4gdGhlIGZpbGUgc3lzdGVtIHdoZXJlIHRoaXMgcGx1Zy1pbiBjYW4KKwkgKiAgICAgICAgIHBlcnNpc3QgZGF0YSBiZXR3ZWVuIHNlc3Npb25zLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCisJICogICAgICAgICBsb2NhdGlvbiBpcyBhdmFpbGFibGUuCisJICogQHNpbmNlIDMuMQorCSAqLworCXByaXZhdGUgSVBhdGggZ2V0U3RhdGVMb2NhdGlvbk9yTnVsbCgpIHsKKwkJLy8gVEJEIHRoZSBzdGF0ZSBsb2NhdGlvbiBpcyBvbmx5IGFjY2Vzc2libGUgZnJvbSBQbHVnaW4gY2xhc3MKKwkJLy8gSG93ZXZlciwgdXNpbmcgaXQgY2F1c2VzIHByb2JsZW1zIGluIHRoZSBhY3RpdmF0aW9uIG9yZGVyCisJCS8vIFNvLCBmb3Igbm93LCB3ZSBnZXQgaXQgZGlyZWN0bHkuCisJCXRyeSB7CisJCQlyZXR1cm4gSW50ZXJuYWxQbGF0Zm9ybS5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbihjb250ZXh0LmdldEJ1bmRsZSgpLCB0cnVlKTsKKwkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRoaXMgb2NjdXJzIGlmIC1kYXRhPUBub25lIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBzbyBpZ25vcmUKKwkJCS8vIHRoaXMgc2lsZW50bHkuCisJCQkvLyBJcyB0aGlzIE9LPyBTZWUgYnVnIDg1MDcxLgorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9Xb3JrYmVuY2hTdGF0dXNSZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L1dvcmtiZW5jaFN0YXR1c1JlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhZGQwOAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9Xb3JrYmVuY2hTdGF0dXNSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU29wb3QgQ2VsYSAoc29wb3RjZWxhQGdtYWlsLmNvbSkgQnVnIDM4NjAyMiAtIFRpdGxlIG9mIEVycm9yRGlhbG9nIGluIFdvcmtiZW5jaFN0YXR1c1JlcG9ydGVyIHNob3VsZCBiZSBleHRlcm5hbGl6ZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLnN0YXR1c3JlcG9ydGVyLlN0YXR1c1JlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weS5Xb3JrYmVuY2hTV1RNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5JU2hlbGxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrYmVuY2hTdGF0dXNSZXBvcnRlciBleHRlbmRzIFN0YXR1c1JlcG9ydGVyIHsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlJU2hlbGxQcm92aWRlciBzaGVsbFByb3ZpZGVyOworCUBJbmplY3QKKwlMb2dnZXIgbG9nZ2VyOworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7CisJRXJyb3JEaWFsb2cgZGlhbG9nOworCisJQEluamVjdAorCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXBvcnQoSVN0YXR1cyBzdGF0dXMsIGludCBzdHlsZSwgT2JqZWN0Li4uIGluZm9ybWF0aW9uKSB7CisJCWludCBhY3Rpb24gPSBzdHlsZSAmIChJR05PUkUgfCBMT0cgfCBTSE9XIHwgQkxPQ0spOworCQlpZiAoYWN0aW9uID09IDApIHsKKwkJCWlmIChzdGF0dXMubWF0Y2hlcyhFUlJPUikpIHsKKwkJCQlhY3Rpb24gPSBTSE9XOworCQkJfSBlbHNlIHsKKwkJCQlhY3Rpb24gPSBMT0c7CisJCQl9CisJCX0KKwkJaWYgKHN0eWxlICE9IElHTk9SRSkgeworCQkJLy8gbG9nIGV2ZW4gaWYgc2hvd2luZyBhIGRpYWxvZworCQkJbG9nKHN0YXR1cyk7CisJCQlpZiAoKGFjdGlvbiAmIChTSE9XIHwgQkxPQ0spKSAhPSAwKSB7CisJCQkJYm9vbGVhbiBzaG91bGRCbG9jayA9IChhY3Rpb24gJiBCTE9DSykgIT0gMDsKKwkJCQlvcGVuRGlhbG9nKHN0YXR1cywgc2hvdWxkQmxvY2ssIGluZm9ybWF0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cy5tYXRjaGVzKEVSUk9SKSkgeworCQkJbG9nZ2VyLmVycm9yKHN0YXR1cy5nZXRFeGNlcHRpb24oKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzLm1hdGNoZXMoV0FSTklORykpIHsKKwkJCWxvZ2dlci53YXJuKHN0YXR1cy5nZXRFeGNlcHRpb24oKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzLm1hdGNoZXMoSU5GTykpIHsKKwkJCWxvZ2dlci5pbmZvKHN0YXR1cy5nZXRFeGNlcHRpb24oKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgb3BlbkRpYWxvZyhmaW5hbCBJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG91bGRCbG9jaywKKwkJCU9iamVjdC4uLiBpbmZvcm1hdGlvbikgeworCQlTdHJpbmdbXSBpbmZvcm1hdGlvblN0cmluZ3MgPSBuZXcgU3RyaW5nW2luZm9ybWF0aW9uLmxlbmd0aF07CisJCWlmIChkaWFsb2cgIT0gbnVsbCAmJiBkaWFsb2cuZ2V0U2hlbGwoKSAhPSBudWxsCisJCQkJJiYgIWRpYWxvZy5nZXRTaGVsbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJLy8gYW5vdGhlciBkaWFsb2cgaXMgc3RpbGwgb3BlbiwgaWRlYWxseSB3ZSdkIGFkZCB0aGUgY3VycmVudCBzdGF0dXMKKwkJCS8vIHRvIHRoYXQgZGlhbG9nLgorCQkJLy8gZm9yIG5vdywganVzdCBsb2cgdGhlIG5ldyBwcm9ibGVtCisJCQlsb2coc3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBTdGF0dXMgZXhjZXB0aW9uU3RhdHVzID0gbmV3IFN0YXR1cyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwKKwkJCQlzdGF0dXMuZ2V0UGx1Z2luKCksCisJCQkJc3RhdHVzLmdldEV4Y2VwdGlvbigpID09IG51bGwgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogc3RhdHVzCisJCQkJCQkuZ2V0RXhjZXB0aW9uKCkudG9TdHJpbmcoKSwgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKKworCQkvLyBUQkQgdGhpcyBjb2RlIHNob3VsZCByZWFsbHkgYmUgaW4gSVNoZWxsUHJvdmlkZXIgd2hpY2ggc2hvdWxkIGJlCisJCS8vIGF2YWlsYWJsZSBhdCB0aGUgYXBwbGljYXRpb24gY29udGV4dCBsZXZlbC4KKwkJU2hlbGwgbXlTaGVsbCA9IG51bGw7CisJCWlmIChzaGVsbFByb3ZpZGVyICE9IG51bGwpCisJCQlteVNoZWxsID0gc2hlbGxQcm92aWRlci5nZXRTaGVsbCgpOworCQllbHNlIHsKKwkJCUlFY2xpcHNlQ29udGV4dCBhY3RpdmVMZWFmID0gY29udGV4dC5nZXRBY3RpdmVMZWFmKCk7CisJCQlpZiAoYWN0aXZlTGVhZiAhPSBudWxsKSB7CisJCQkJSVNoZWxsUHJvdmlkZXIgcHJvdmlkZXIgPSBhY3RpdmVMZWFmLmdldChJU2hlbGxQcm92aWRlci5jbGFzcyk7CisJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCisJCQkJCW15U2hlbGwgPSBwcm92aWRlci5nZXRTaGVsbCgpOworCQkJfQorCQl9CisJCWlmIChteVNoZWxsID09IG51bGwpIHsKKwkJCW15U2hlbGwgPSBuZXcgU2hlbGwoKTsKKwkJfQorCisJCWRpYWxvZyA9IG5ldyBFcnJvckRpYWxvZyhteVNoZWxsLCBXb3JrYmVuY2hTV1RNZXNzYWdlcy5JbnRlcm5hbEVycm9yLAorCQkJCXN0YXR1cy5nZXRNZXNzYWdlKCksCisJCQkJc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwgPyBleGNlcHRpb25TdGF0dXMgOiBzdGF0dXMsIEVSUk9SCisJCQkJCQl8IFdBUk5JTkcgfCBJTkZPKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisJCQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQkJCXNoZWxsLnNldEJhY2tncm91bmRNb2RlKFNXVC5JTkhFUklUX0RFRkFVTFQpOworCQkJfQorCQl9OworCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9ybWF0aW9uLmxlbmd0aDsgaSsrKSB7CisJCQlpbmZvcm1hdGlvblN0cmluZ3NbaV0gPSBpbmZvcm1hdGlvbltpXSA9PSBudWxsID8gIm51bGwiIDogaW5mb3JtYXRpb25baV0udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWRpYWxvZy5zZXRCbG9ja09uT3BlbihzaG91bGRCbG9jayk7CisJCWRpYWxvZy5vcGVuKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgbmV3U3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIGdldFBsdWdpbklkKCksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKKwkJcmV0dXJuIGJ1bmRsZUNvbnRleHQgPT0gbnVsbCA/ICJ1bmtub3duIiA6IGJ1bmRsZUNvbnRleHQuZ2V0QnVuZGxlKCkKKwkJCQkuZ2V0U3ltYm9saWNOYW1lKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvaGFuZGxlcnMvU2hvd1ZpZXdIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvaGFuZGxlcnMvU2hvd1ZpZXdIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhZGQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL3N3dC9oYW5kbGVycy9TaG93Vmlld0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5oYW5kbGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5NUGFydERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVNlcnZpY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5pbnRlcm5hbC5jb3B5LlNob3dWaWV3RGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZS5QYXJ0U3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworcHVibGljIGNsYXNzIFNob3dWaWV3SGFuZGxlciB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXU19TSE9XX1ZJRVdfUEFSTV9JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQiOyAvLyROT04tTkxTLTEkCisKKwlARXhlY3V0ZQorCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQE5hbWVkKElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9TSEVMTCkgU2hlbGwgc2hlbGwsCisJCQlNQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEVQYXJ0U2VydmljZSBwYXJ0U2VydmljZSwKKwkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0LAorCQkJQE9wdGlvbmFsIEBOYW1lZChWSUVXU19TSE9XX1ZJRVdfUEFSTV9JRCkgU3RyaW5nIHZpZXdJZCkgeworCQlpZiAodmlld0lkICE9IG51bGwpIHsKKwkJCXBhcnRTZXJ2aWNlLnNob3dQYXJ0KHZpZXdJZCwgUGFydFN0YXRlLkFDVElWQVRFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZpbmFsIFNob3dWaWV3RGlhbG9nIGRpYWxvZyA9IG5ldyBTaG93Vmlld0RpYWxvZyhzaGVsbCwgYXBwbGljYXRpb24sCisJCQkJY29udGV4dCk7CisJCWRpYWxvZy5vcGVuKCk7CisJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpICE9IFdpbmRvdy5PSykKKwkJCXJldHVybjsKKworCQlmb3IgKE1QYXJ0RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZGlhbG9nLmdldFNlbGVjdGlvbigpKSB7CisJCQlwYXJ0U2VydmljZS5zaG93UGFydChkZXNjcmlwdG9yLmdldEVsZW1lbnRJZCgpLCBQYXJ0U3RhdGUuQUNUSVZBVEUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L2hhbmRsZXJzL1RoZW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvc3d0L2hhbmRsZXJzL1RoZW1lVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9zd3QvaGFuZGxlcnMvVGhlbWVVdGlsLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBTaWVtZW5zIEFHIGFuZCBvdGhlcnMuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIEthaSBUw7ZkdGVyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LmhhbmRsZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuSVN0eWxpbmdFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCitwdWJsaWMgY2xhc3MgVGhlbWVVdGlsIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseURpYWxvZ1N0eWxlcyhJU3R5bGluZ0VuZ2luZSBlbmdpbmUsIENvbnRyb2wgY29udHJvbCkgeworCQlpZiAoZW5naW5lICE9IG51bGwpIHsKKwkJCVNoZWxsIHNoZWxsID0gY29udHJvbC5nZXRTaGVsbCgpOworCQkJaWYgKHNoZWxsLmdldEJhY2tncm91bmRNb2RlKCkgPT0gU1dULklOSEVSSVRfTk9ORSkgeworCQkJCXNoZWxsLnNldEJhY2tncm91bmRNb2RlKFNXVC5JTkhFUklUX0RFRkFVTFQpOworCQkJfQorCisJCQllbmdpbmUuc3R5bGUoc2hlbGwpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ZhY3Rvcmllcy9JUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvZmFjdG9yaWVzL0lSZW5kZXJlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDliM2FhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ZhY3Rvcmllcy9JUmVuZGVyZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuZmFjdG9yaWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5BYnN0cmFjdFBhcnRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworCitwdWJsaWMgaW50ZXJmYWNlIElSZW5kZXJlckZhY3RvcnkgeworCXB1YmxpYyBBYnN0cmFjdFBhcnRSZW5kZXJlciBnZXRSZW5kZXJlcihNVUlFbGVtZW50IHVpRWxlbWVudCwgT2JqZWN0IHBhcmVudCk7CisKKwkvLyBwdWJsaWMgdm9pZCBpbml0KElFY2xpcHNlQ29udGV4dCBjb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L0Jhc2ljVUlKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L0Jhc2ljVUlKb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGIyNjZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvQmFzaWNVSUpvYi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworCisvKioKKyAqIE1lcmdlIG9mIFVJSm9iIGFuZCBXb2tiZW5jaEpvYiBtaW51cyB0cmFja2luZyB3aGV0aGVyIHRoZSB3b3JrYmVuY2ggaXMKKyAqIHJ1bm5pbmcgLSBkbyBub3QgdXNlIGZvciBsb25nIHJ1bm5pbmcgam9icyEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljVUlKb2IgZXh0ZW5kcyBKb2IgeworCisJcHJpdmF0ZSBEaXNwbGF5IGNhY2hlZERpc3BsYXk7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuIFRoZSBkaXNwbGF5CisJICogdXNlZCB3aWxsIGJlIHRoZSBvbmUgZnJvbSB0aGUgd29ya2JlbmNoIGlmIHRoaXMgaXMgYXZhaWxhYmxlLiBVSUpvYnMgd2l0aAorCSAqIHRoaXMgY29uc3RydWN0b3Igd2lsbCBkZXRlcm1pbmUgdGhlaXIgZGlzcGxheSBhdCBydW50aW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBqb2IgbmFtZQorCSAqCisJICovCisJcHVibGljIEJhc2ljVUlKb2IoU3RyaW5nIG5hbWUsIERpc3BsYXkgZGlzcGxheSkgeworCQlzdXBlcihuYW1lKTsKKwkJdGhpcy5jYWNoZWREaXNwbGF5ID0gZGlzcGxheTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisJICogICAgICBOb3RlOiB0aGlzIG1lc3NhZ2UgaXMgbWFya2VkIGZpbmFsLiBJbXBsZW1lbnRvcnMgc2hvdWxkIHVzZQorCSAqICAgICAgcnVuSW5VSVRocmVhZCgpIGluc3RlYWQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJfQorCQlEaXNwbGF5IGFzeW5jRGlzcGxheSA9IChjYWNoZWREaXNwbGF5ID09IG51bGwpID8gZ2V0RGlzcGxheSgpCisJCQkJOiBjYWNoZWREaXNwbGF5OworCQlpZiAoYXN5bmNEaXNwbGF5ID09IG51bGwgfHwgYXN5bmNEaXNwbGF5LmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQl9CisJCWFzeW5jRGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJSVN0YXR1cyByZXN1bHQgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCS8vIEFzIHdlIGFyZSBpbiB0aGUgVUkgVGhyZWFkIHdlIGNhbgorCQkJCQkvLyBhbHdheXMga25vdyB3aGF0IHRvIHRlbGwgdGhlIGpvYi4KKwkJCQkJc2V0VGhyZWFkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJCXJlc3VsdCA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVzdWx0ID0gcnVuSW5VSVRocmVhZChtb25pdG9yKTsKKwkJCQkJfQorCQkJCX0gZmluYWxseSB7CisJCQkJCWRvbmUocmVzdWx0KTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlyZXR1cm4gSm9iLkFTWU5DX0ZJTklTSDsKKwl9CisKKwkvKioKKwkgKiBSdW4gdGhlIGpvYiBpbiB0aGUgVUkgVGhyZWFkLgorCSAqCisJICogQHBhcmFtIG1vbml0b3IKKwkgKiBAcmV0dXJuIElTdGF0dXMKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IGZvciB1c2UgYnkgdGhlIHJlY2VpdmVyIHdoZW4gcnVubmluZyBpbiBhbiBhc3luY0V4ZWMuCisJICogSWYgaXQgaXMgbm90IHNldCB0aGVuIHRoZSBkaXNwbGF5IHNldCBpbiB0aGUgd29ya2JlbmNoIGlzIHVzZWQuIElmIHRoZQorCSAqIGRpc3BsYXkgaXMgbnVsbCB0aGUgam9iIHdpbGwgbm90IGJlIHJ1bi4KKwkgKgorCSAqIEByZXR1cm4gRGlzcGxheSBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgeworCQlyZXR1cm4gKGNhY2hlZERpc3BsYXkgIT0gbnVsbCkgPyBjYWNoZWREaXNwbGF5IDogRGlzcGxheS5nZXRDdXJyZW50KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvRmlsdGVyZWRUcmVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9GaWx0ZXJlZFRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQ5OGFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvRmlsdGVyZWRUcmVlLmphdmEKQEAgLTAsMCArMSwxMTkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSmFjZWsgUG9zcHljaGFsYSAtIGJ1ZyAxODc3NjIKKyAqICAgICBNb2hhbWVkIFRhcmllZiAtIHRhcmllZkBlZy5pYm0uY29tIC0gSUJNIC0gQnVnIDE3NDQ4MQorICogICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAZ21haWwuY29tPiAtIEJ1ZyA0NDAzODEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworCisvKioKKyAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRUcmVlLgorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyZWRUcmVlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCS8qKgorCSAqIFRoZSBmaWx0ZXIgdGV4dCB3aWRnZXQgdG8gYmUgdXNlZCBieSB0aGlzIHRyZWUuIFRoaXMgdmFsdWUgbWF5IGJlCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZmlsdGVyIHdpZGdldCwgb3IgaWYgdGhlIGNvbnRyb2xzIGhhdmUKKwkgKiBub3QgeWV0IGJlZW4gY3JlYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBmaWx0ZXJUZXh0OworCisJLyoqCisJICogVGhlIGNvbnRyb2wgcmVwcmVzZW50aW5nIHRoZSBjbGVhciBidXR0b24gZm9yIHRoZSBmaWx0ZXIgdGV4dCBlbnRyeS4gVGhpcworCSAqIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGJ1dHRvbiBleGlzdHMsIG9yIGlmIHRoZQorCSAqIGNvbnRyb2xzIGhhdmUgbm90IHlldCBiZWVuIGNyZWF0ZWQuCisJICogPHA+CisJICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBcyBvZiAzLjUsIHRoaXMgaXMgbm90IHVzZWQgaWYgdGhlIG5ldyBsb29rIGlzCisJICogY2hvc2VuLgorCSAqIDwvcD4KKwkgKi8KKwlwcm90ZWN0ZWQgVG9vbEJhck1hbmFnZXIgZmlsdGVyVG9vbEJhcjsKKworCS8qKgorCSAqIFRoZSBjb250cm9sIHJlcHJlc2VudGluZyB0aGUgY2xlYXIgYnV0dG9uIGZvciB0aGUgZmlsdGVyIHRleHQgZW50cnkuIFRoaXMKKwkgKiB2YWx1ZSBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBidXR0b24gZXhpc3RzLCBvciBpZiB0aGUKKwkgKiBjb250cm9scyBoYXZlIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgorCSAqIDxwPgorCSAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIG5ldyBsb29rIGlzIGNob3Nlbi4KKwkgKiA8L3A+CisJICoKKwkgKiBAc2luY2UgMy41CisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY2xlYXJCdXR0b25Db250cm9sOworCisJLyoqCisJICogVGhlIHZpZXdlciBmb3IgdGhlIGZpbHRlcmVkIHRyZWUuIFRoaXMgdmFsdWUgc2hvdWxkIG5ldmVyIGJlCisJICogPGNvZGU+bnVsbDwvY29kZT4gYWZ0ZXIgdGhlIHdpZGdldCBjcmVhdGlvbiBtZXRob2RzIGFyZSBjb21wbGV0ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOworCisJLyoqCisJICogVGhlIENvbXBvc2l0ZSBvbiB3aGljaCB0aGUgZmlsdGVyIGNvbnRyb2xzIGFyZSBjcmVhdGVkLiBUaGlzIGlzIHVzZWQgdG8KKwkgKiBzZXQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGZpbHRlciBjb250cm9scyB0byBtYXRjaCB0aGUgc3Vycm91bmRpbmcKKwkgKiBjb250cm9scy4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZpbHRlckNvbXBvc2l0ZTsKKworCS8qKgorCSAqIFRoZSBwYXR0ZXJuIGZpbHRlciBmb3IgdGhlIHRyZWUuIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAuCisJICovCisJcHJpdmF0ZSBQYXR0ZXJuRmlsdGVyIHBhdHRlcm5GaWx0ZXI7CisKKwkvKioKKwkgKiBUaGUgdGV4dCB0byBpbml0aWFsbHkgc2hvdyBpbiB0aGUgZmlsdGVyIHRleHQgY29udHJvbC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBqb2IgdXNlZCB0byByZWZyZXNoIHRoZSB0cmVlLgorCSAqLworCXByaXZhdGUgSm9iIHJlZnJlc2hKb2I7CisKKwkvKioKKwkgKiBUaGUgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgZmlsdGVyZWQgdHJlZS4KKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKKworCS8qKgorCSAqIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIGZpbHRlciBjb250cm9scyAodGV4dCBhbmQgY2xlYXIgYnV0dG9uKS4gVGhlCisJICogZGVmYXVsdCBpcyB0byBzaG93IHRoZXNlIGNvbnRyb2xzLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhCisJICogc2V0dGluZyBpbiB0aGUgcHJvZHVjdCBjb25maWd1cmF0aW9uIGZpbGUuIFRoZSBzZXR0aW5nIHRvIGFkZCB0byBub3Qgc2hvdworCSAqIHRoZXNlIGNvbnRyb2xzIGlzOgorCSAqCisJICogb3JnLmVjbGlwc2UudWkvU0hPV19GSUxURVJFRF9URVhUUz1mYWxzZQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dGaWx0ZXJDb250cm9sczsKKworCS8qKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRyZWVDb21wb3NpdGU7CisKKwkvKioKKwkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciBlbmFibGVkIGNsZWFyIGJ1dHRvbi4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfSUNPTiA9ICJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkNMRUFSX0lDT04iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciBkaXNhYmxlZCBjbGVhciBidXR0b24uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0NMRUFSX0lDT04gPSAib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5EQ0xFQVJfSUNPTiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIE1heGltdW0gdGltZSBzcGVudCBleHBhbmRpbmcgdGhlIHRyZWUgYWZ0ZXIgdGhlIGZpbHRlciB0ZXh0IGhhcyBiZWVuCisJICogdXBkYXRlZCAodGhpcyBpcyBvbmx5IHVzZWQgaWYgd2Ugd2VyZSBhYmxlIHRvIGF0IGxlYXN0IGV4cGFuZCB0aGUgdmlzaWJsZQorCSAqIG5vZGVzKQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU09GVF9NQVhfRVhQQU5EX1RJTUUgPSAyMDA7CisKKwkvKioKKwkgKiBHZXQgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIHRoZSBjbGVhciBidXR0b24uCisJICovCisJc3RhdGljIHsKKwkJQnVuZGxlIGJ1bmRsZSA9IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuV29ya2JlbmNoU1dUQWN0aXZhdG9yCisJCQkJLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKKwkJSVBhdGggZW5hYmxlZFBhdGggPSBuZXcgUGF0aCgiJG5sJC9pY29ucy9mdWxsL2V0b29sMTYvY2xlYXJfY28uZ2lmIik7CisJCVVSTCBlbmFibGVkVVJMID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIGVuYWJsZWRQYXRoLCBudWxsKTsKKwkJSW1hZ2VEZXNjcmlwdG9yIGVuYWJsZWREZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZW5hYmxlZFVSTCk7CisJCWlmIChlbmFibGVkRGVzYyAhPSBudWxsKQorCQkJSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChDTEVBUl9JQ09OLCBlbmFibGVkRGVzYyk7CisKKwkJSVBhdGggZGlzYWJsZWRQYXRoID0gbmV3IFBhdGgoIiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L2NsZWFyX2NvLmdpZiIpOworCQlVUkwgZGlzYWJsZWRVUkwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgZGlzYWJsZWRQYXRoLCBudWxsKTsKKwkJSW1hZ2VEZXNjcmlwdG9yIGRpc2FibGVkRGVzYyA9IEltYWdlRGVzY3JpcHRvcgorCQkJCS5jcmVhdGVGcm9tVVJMKGRpc2FibGVkVVJMKTsKKwkJaWYgKGRpc2FibGVkRGVzYyAhPSBudWxsKQorCQkJSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChESVNBQkxFRF9DTEVBUl9JQ09OLAorCQkJCQlkaXNhYmxlZERlc2MpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KKwkgKiBAcGFyYW0gdHJlZVN0eWxlCisJICogICAgICAgICAgICB0aGUgc3R5bGUgYml0cyBmb3IgdGhlIDxjb2RlPlRyZWU8L2NvZGU+CisJICogQHBhcmFtIGZpbHRlcgorCSAqICAgICAgICAgICAgdGhlIGZpbHRlciB0byBiZSB1c2VkCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBGaWx0ZXJlZFRyZWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHRyZWVTdHlsZSwgUGF0dGVybkZpbHRlciBmaWx0ZXIpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCXRoaXMucGFyZW50ID0gcGFyZW50OworCQlpbml0KHRyZWVTdHlsZSwgZmlsdGVyKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+CisJICogQHBhcmFtIHRyZWVTdHlsZQorCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGJpdHMgZm9yIHRoZSA8Y29kZT5UcmVlPC9jb2RlPgorCSAqIEBwYXJhbSBmaWx0ZXIKKwkgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIgdG8gYmUgdXNlZAorCSAqIEBwYXJhbSB1c2VOZXdMb29rCisJICogICAgICAgICAgICBpZ25vcmVkLCBsb29rIGludHJvZHVjZWQgaW4gMy41IGlzIGFsd2F5cyB1c2VkCisJICogQHNpbmNlIDMuNQorCSAqCisJICogQGRlcHJlY2F0ZWQgdXNlIEZpbHRlcmVkVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdHJlZVN0eWxlLAorCSAqICAgICAgICAgICAgIFBhdHRlcm5GaWx0ZXIgZmlsdGVyKQorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIEZpbHRlcmVkVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdHJlZVN0eWxlLCBQYXR0ZXJuRmlsdGVyIGZpbHRlciwKKwkJCWJvb2xlYW4gdXNlTmV3TG9vaykgeworCQl0aGlzKHBhcmVudCwgdHJlZVN0eWxlLCBmaWx0ZXIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuIFN1YmNsYXNzZXMgdGhhdCB3aXNoIHRvIG92ZXJyaWRlCisJICogdGhlIGRlZmF1bHQgY3JlYXRpb24gYmVoYXZpb3IgbWF5IHVzZSB0aGlzIGNvbnN0cnVjdG9yLCBidXQgbXVzdCBlbnN1cmUKKwkgKiB0aGF0IHRoZSA8Y29kZT5pbml0KGNvbXBvc2l0ZSwgaW50LCBQYXR0ZXJuRmlsdGVyKTwvY29kZT4gbWV0aG9kIGlzCisJICogY2FsbGVkIGluIHRoZSBvdmVycmlkaW5nIGNvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+CisJICogQHNlZSAjaW5pdChpbnQsIFBhdHRlcm5GaWx0ZXIpCisJICoKKwkgKiBAc2luY2UgMy41CisJICovCisJcHJvdGVjdGVkIEZpbHRlcmVkVHJlZShDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLiBTdWJjbGFzc2VzIHRoYXQgd2lzaCB0byBvdmVycmlkZQorCSAqIHRoZSBkZWZhdWx0IGNyZWF0aW9uIGJlaGF2aW9yIG1heSB1c2UgdGhpcyBjb25zdHJ1Y3RvciwgYnV0IG11c3QgZW5zdXJlCisJICogdGhhdCB0aGUgPGNvZGU+aW5pdChjb21wb3NpdGUsIGludCwgUGF0dGVybkZpbHRlcik8L2NvZGU+IG1ldGhvZCBpcworCSAqIGNhbGxlZCBpbiB0aGUgb3ZlcnJpZGluZyBjb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgorCSAqIEBwYXJhbSB1c2VOZXdMb29rCisJICogICAgICAgICAgICBpZ25vcmVkLCBsb29rIGludHJvZHVjZWQgaW4gMy41IGlzIGFsd2F5cyB1c2VkCisJICogQHNlZSAjaW5pdChpbnQsIFBhdHRlcm5GaWx0ZXIpCisJICoKKwkgKiBAc2luY2UgMy41CisJICoKKwkgKiBAZGVwcmVjYXRlZCB1c2UgRmlsdGVyZWRUcmVlKENvbXBvc2l0ZSBwYXJlbnQpIGluc3RlYWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXByb3RlY3RlZCBGaWx0ZXJlZFRyZWUoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB1c2VOZXdMb29rKSB7CisJCXRoaXMocGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGZpbHRlcmVkIHRyZWUuCisJICoKKwkgKiBAcGFyYW0gdHJlZVN0eWxlCisJICogICAgICAgICAgICB0aGUgc3R5bGUgYml0cyBmb3IgdGhlIDxjb2RlPlRyZWU8L2NvZGU+CisJICogQHBhcmFtIGZpbHRlcgorCSAqICAgICAgICAgICAgdGhlIGZpbHRlciB0byBiZSB1c2VkCisJICoKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdChpbnQgdHJlZVN0eWxlLCBQYXR0ZXJuRmlsdGVyIGZpbHRlcikgeworCQlwYXR0ZXJuRmlsdGVyID0gZmlsdGVyOworCQlzaG93RmlsdGVyQ29udHJvbHMgPSB0cnVlOyAvLyBQbGF0Zm9ybVVJLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCisJCS8vIElXb3JrYmVuY2hQcmVmZXJlbmNlQ29uc3RhbnRzLlNIT1dfRklMVEVSRURfVEVYVFMpOworCQljcmVhdGVDb250cm9sKHBhcmVudCwgdHJlZVN0eWxlKTsKKwkJY3JlYXRlUmVmcmVzaEpvYigpOworCQlzZXRJbml0aWFsVGV4dChXb3JrYmVuY2hTV1RNZXNzYWdlcy5GaWx0ZXJlZFRyZWVfRmlsdGVyTWVzc2FnZSk7CisJCXNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHRoZSBmaWx0ZXJlZCB0cmVlJ3MgY29udHJvbHMuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSB0cmVlU3R5bGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCB0cmVlU3R5bGUpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJc2V0TGF5b3V0KGxheW91dCk7CisJCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOworCisJCWlmIChzaG93RmlsdGVyQ29udHJvbHMpIHsKKwkJCWlmICh1c2VOYXRpdmVTZWFyY2hGaWVsZChwYXJlbnQpKSB7CisJCQkJZmlsdGVyQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7CisJCQl9IGVsc2UgeworCQkJCWZpbHRlckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULkJPUkRFUik7CisJCQkJZmlsdGVyQ29tcG9zaXRlLnNldEJhY2tncm91bmQoZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAorCQkJCQkJU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOworCQkJfQorCQkJR3JpZExheW91dCBmaWx0ZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7CisJCQlmaWx0ZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCWZpbHRlckxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCQlmaWx0ZXJDb21wb3NpdGUuc2V0TGF5b3V0KGZpbHRlckxheW91dCk7CisJCQlmaWx0ZXJDb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKworCQkJY3JlYXRlRmlsdGVyQ29udHJvbHMoZmlsdGVyQ29tcG9zaXRlKTsKKwkJCWZpbHRlckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywKKwkJCQkJdHJ1ZSwgZmFsc2UpKTsKKwkJfQorCisJCXRyZWVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCB0cmVlQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJdHJlZUNvbXBvc2l0ZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQl0cmVlQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJdHJlZUNvbXBvc2l0ZS5zZXRMYXlvdXQodHJlZUNvbXBvc2l0ZUxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKKwkJdHJlZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQljcmVhdGVUcmVlQ29udHJvbCh0cmVlQ29tcG9zaXRlLCB0cmVlU3R5bGUpOworCX0KKworCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXNlTmF0aXZlU2VhcmNoRmllbGQ7CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZU5hdGl2ZVNlYXJjaEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJaWYgKHVzZU5hdGl2ZVNlYXJjaEZpZWxkID09IG51bGwpIHsKKwkJCXVzZU5hdGl2ZVNlYXJjaEZpZWxkID0gQm9vbGVhbi5GQUxTRTsKKwkJCVRleHQgdGVzdFRleHQgPSBudWxsOworCQkJdHJ5IHsKKwkJCQl0ZXN0VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNFQVJDSCB8IFNXVC5JQ09OX0NBTkNFTCk7CisJCQkJdXNlTmF0aXZlU2VhcmNoRmllbGQgPSBuZXcgQm9vbGVhbigKKwkJCQkJCSh0ZXN0VGV4dC5nZXRTdHlsZSgpICYgU1dULklDT05fQ0FOQ0VMKSAhPSAwKTsKKwkJCX0gZmluYWxseSB7CisJCQkJaWYgKHRlc3RUZXh0ICE9IG51bGwpIHsKKwkJCQkJdGVzdFRleHQuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKworCQl9CisJCXJldHVybiB1c2VOYXRpdmVTZWFyY2hGaWVsZC5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGZpbHRlciBjb250cm9scy4gQnkgZGVmYXVsdCwgYSB0ZXh0IGFuZCBjb3JyZXNwb25kaW5nIHRvb2wgYmFyCisJICogYnV0dG9uIHRoYXQgY2xlYXJzIHRoZSBjb250ZW50cyBvZiB0aGUgdGV4dCBpcyBjcmVhdGVkLiBTdWJjbGFzc2VzIG1heQorCSAqIG92ZXJyaWRlLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2YgdGhlIGZpbHRlciBjb250cm9scworCSAqIEByZXR1cm4gdGhlIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBjb250YWlucyB0aGUgZmlsdGVyIGNvbnRyb2xzCisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVGaWx0ZXJDb250cm9scyhDb21wb3NpdGUgcGFyZW50KSB7CisJCWNyZWF0ZUZpbHRlclRleHQocGFyZW50KTsKKwkJY3JlYXRlQ2xlYXJUZXh0KHBhcmVudCk7CisJCWlmIChjbGVhckJ1dHRvbkNvbnRyb2wgIT0gbnVsbCkgeworCQkJLy8gaW5pdGlhbGx5IHRoZXJlIGlzIG5vIHRleHQgdG8gY2xlYXIKKwkJCWNsZWFyQnV0dG9uQ29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJfQorCQlpZiAoZmlsdGVyVG9vbEJhciAhPSBudWxsKSB7CisJCQlmaWx0ZXJUb29sQmFyLnVwZGF0ZShmYWxzZSk7CisJCQkvLyBpbml0aWFsbHkgdGhlcmUgaXMgbm8gdGV4dCB0byBjbGVhcgorCQkJZmlsdGVyVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCX0KKwkJcmV0dXJuIHBhcmVudDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCBzZXQgdXAgdGhlIHRyZWUgYW5kIHRyZWUgdmlld2VyLiBUaGlzIG1ldGhvZCBjYWxscworCSAqIHtAbGluayAjZG9DcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSwgaW50KX0gdG8gY3JlYXRlIHRoZSB0cmVlIHZpZXdlci4KKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB7QGxpbmsgI2RvQ3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUsIGludCl9CisJICogaW5zdGVhZCBvZiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiAgICAgICAgICAgIFNXVCBzdHlsZSBiaXRzIHVzZWQgdG8gY3JlYXRlIHRoZSB0cmVlCisJICogQHJldHVybiB0aGUgdHJlZQorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZVRyZWVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQl0cmVlVmlld2VyID0gZG9DcmVhdGVUcmVlVmlld2VyKHBhcmVudCwgc3R5bGUpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7CisJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7CisJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCXJlZnJlc2hKb2IuY2FuY2VsKCk7CisJCQl9CisJCX0pOworCQlpZiAodHJlZVZpZXdlciBpbnN0YW5jZW9mIE5vdGlmeWluZ1RyZWVWaWV3ZXIpIHsKKwkJCXBhdHRlcm5GaWx0ZXIuc2V0VXNlQ2FjaGUodHJ1ZSk7CisJCX0KKwkJdHJlZVZpZXdlci5hZGRGaWx0ZXIocGF0dGVybkZpbHRlcik7CisJCXJldHVybiB0cmVlVmlld2VyLmdldENvbnRyb2woKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSB0cmVlIHZpZXdlci4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQorCSAqIEBwYXJhbSBzdHlsZQorCSAqICAgICAgICAgICAgU1dUIHN0eWxlIGJpdHMgdXNlZCB0byBjcmVhdGUgdGhlIHRyZWUgdmlld2VyCisJICogQHJldHVybiB0aGUgdHJlZSB2aWV3ZXIKKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBkb0NyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7CisJCXJldHVybiBuZXcgTm90aWZ5aW5nVHJlZVZpZXdlcihwYXJlbnQsIHN0eWxlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRyZWUgdGhhdCBtYXRjaGVzIHRoZSBmaWx0ZXIgcGF0dGVybi4KKwkgKgorCSAqIEBwYXJhbSBpdGVtcworCSAqIEByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIFRyZWVJdGVtCisJICovCisJcHJpdmF0ZSBUcmVlSXRlbSBnZXRGaXJzdE1hdGNoaW5nSXRlbShUcmVlSXRlbVtdIGl0ZW1zKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChwYXR0ZXJuRmlsdGVyLmlzTGVhZk1hdGNoKHRyZWVWaWV3ZXIsIGl0ZW1zW2ldLmdldERhdGEoKSkKKwkJCQkJJiYgcGF0dGVybkZpbHRlci5pc0VsZW1lbnRTZWxlY3RhYmxlKGl0ZW1zW2ldLmdldERhdGEoKSkpIHsKKwkJCQlyZXR1cm4gaXRlbXNbaV07CisJCQl9CisJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IGdldEZpcnN0TWF0Y2hpbmdJdGVtKGl0ZW1zW2ldLmdldEl0ZW1zKCkpOworCQkJaWYgKHRyZWVJdGVtICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdHJlZUl0ZW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHRoZSByZWZyZXNoIGpvYiBmb3IgdGhlIHJlY2VpdmVyLgorCSAqCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZnJlc2hKb2IoKSB7CisJCXJlZnJlc2hKb2IgPSBkb0NyZWF0ZVJlZnJlc2hKb2IoKTsKKwkJcmVmcmVzaEpvYi5zZXRTeXN0ZW0odHJ1ZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIHdvcmtiZW5jaCBqb2IgdGhhdCB3aWxsIHJlZnJlc2ggdGhlIHRyZWUgYmFzZWQgb24gdGhlIGN1cnJlbnQKKwkgKiBmaWx0ZXIgdGV4dC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCisJICoKKwkgKiBAcmV0dXJuIGEgd29ya2JlbmNoIGpvYiB0aGF0IGNhbiBiZSBzY2hlZHVsZWQgdG8gcmVmcmVzaCB0aGUgdHJlZQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXByb3RlY3RlZCBCYXNpY1VJSm9iIGRvQ3JlYXRlUmVmcmVzaEpvYigpIHsKKwkJcmV0dXJuIG5ldyBCYXNpY1VJSm9iKCJSZWZyZXNoIEZpbHRlciIsIHBhcmVudC5nZXREaXNwbGF5KCkpIHsvLyROT04tTkxTLTEkCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJaWYgKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkJfQorCisJCQkJU3RyaW5nIHRleHQgPSBnZXRGaWx0ZXJTdHJpbmcoKTsKKwkJCQlpZiAodGV4dCA9PSBudWxsKSB7CisJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCX0KKworCQkJCWJvb2xlYW4gaW5pdGlhbCA9IGluaXRpYWxUZXh0ICE9IG51bGwKKwkJCQkJCSYmIGluaXRpYWxUZXh0LmVxdWFscyh0ZXh0KTsKKwkJCQlpZiAoaW5pdGlhbCkgeworCQkJCQlwYXR0ZXJuRmlsdGVyLnNldFBhdHRlcm4obnVsbCk7CisJCQkJfSBlbHNlIGlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkJcGF0dGVybkZpbHRlci5zZXRQYXR0ZXJuKHRleHQpOworCQkJCX0KKworCQkJCUNvbnRyb2wgcmVkcmF3RmFsc2VDb250cm9sID0gdHJlZUNvbXBvc2l0ZSAhPSBudWxsID8gdHJlZUNvbXBvc2l0ZQorCQkJCQkJOiB0cmVlVmlld2VyLmdldENvbnRyb2woKTsKKwkJCQl0cnkgeworCQkJCQkvLyBkb24ndCB3YW50IHRoZSB1c2VyIHRvIHNlZSB1cGRhdGVzIHRoYXQgd2lsbCBiZSBtYWRlIHRvCisJCQkJCS8vIHRoZSB0cmVlCisJCQkJCS8vIHdlIGFyZSBzZXR0aW5nIHJlZHJhdyhmYWxzZSkgb24gdGhlIGNvbXBvc2l0ZSB0byBhdm9pZAorCQkJCQkvLyBkYW5jaW5nIHNjcm9sbGJhcgorCQkJCQlyZWRyYXdGYWxzZUNvbnRyb2wuc2V0UmVkcmF3KGZhbHNlKTsKKwkJCQkJaWYgKCFuYXJyb3dpbmdEb3duKSB7CisJCQkJCQkvLyBjb2xsYXBzZSBhbGwKKwkJCQkJCVRyZWVJdGVtW10gaXMgPSB0cmVlVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykgeworCQkJCQkJCVRyZWVJdGVtIGl0ZW0gPSBpc1tpXTsKKwkJCQkJCQlpZiAoaXRlbS5nZXRFeHBhbmRlZCgpKSB7CisJCQkJCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShpdGVtLmdldERhdGEoKSwKKwkJCQkJCQkJCQlmYWxzZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKworCQkJCQlpZiAodGV4dC5sZW5ndGgoKSA+IDAgJiYgIWluaXRpYWwpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBFeHBhbmQgZWxlbWVudHMgb25lIGF0IGEgdGltZS4gQWZ0ZXIgZWFjaCBpcworCQkJCQkJICogZXhwYW5kZWQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgZmlsdGVyIHRleHQgaGFzIGJlZW4KKwkJCQkJCSAqIG1vZGlmaWVkLiBJZiBpdCBoYXMsIHRoZW4gY2FuY2VsIHRoZSByZWZyZXNoIGpvYiBzbworCQkJCQkJICogdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRvIGVuZHVyZSBleHBhbnNpb24gb2YgYWxsIHRoZQorCQkJCQkJICogbm9kZXMuCisJCQkJCQkgKi8KKwkJCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBnZXRWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKKwkJCQkJCWludCB0cmVlSGVpZ2h0ID0gZ2V0Vmlld2VyKCkuZ2V0VHJlZSgpLmdldEJvdW5kcygpLmhlaWdodDsKKwkJCQkJCWludCBudW1WaXNpYmxlSXRlbXMgPSB0cmVlSGVpZ2h0CisJCQkJCQkJCS8gZ2V0Vmlld2VyKCkuZ2V0VHJlZSgpLmdldEl0ZW1IZWlnaHQoKTsKKwkJCQkJCWxvbmcgc3RvcFRpbWUgPSBTT0ZUX01BWF9FWFBBTkRfVElNRQorCQkJCQkJCQkrIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCQkJYm9vbGVhbiBjYW5jZWwgPSBmYWxzZTsKKwkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAwCisJCQkJCQkJCSYmIHJlY3Vyc2l2ZUV4cGFuZChpdGVtcywgbW9uaXRvciwgc3RvcFRpbWUsCisJCQkJCQkJCQkJbmV3IGludFtdIHsgbnVtVmlzaWJsZUl0ZW1zIH0pKSB7CisJCQkJCQkJY2FuY2VsID0gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZW5hYmxlZCB0b29sYmFyIC0gdGhlcmUgaXMgdGV4dCB0byBjbGVhcgorCQkJCQkJLy8gYW5kIHRoZSBsaXN0IGlzIGN1cnJlbnRseSBiZWluZyBmaWx0ZXJlZAorCQkJCQkJdXBkYXRlVG9vbGJhcih0cnVlKTsKKworCQkJCQkJaWYgKGNhbmNlbCkgeworCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGRpc2FibGVkIHRvb2xiYXIgLSB0aGVyZSBpcyBubyB0ZXh0IHRvIGNsZWFyCisJCQkJCQkvLyBhbmQgdGhlIGxpc3QgaXMgY3VycmVudGx5IG5vdCBmaWx0ZXJlZAorCQkJCQkJdXBkYXRlVG9vbGJhcihmYWxzZSk7CisJCQkJCX0KKwkJCQl9IGZpbmFsbHkgeworCQkJCQkvLyBkb25lIHVwZGF0aW5nIHRoZSB0cmVlIC0gc2V0IHJlZHJhdyBiYWNrIHRvIHRydWUKKwkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGdldFZpZXdlcigpLmdldFRyZWUoKS5nZXRJdGVtcygpOworCQkJCQlpZiAoaXRlbXMubGVuZ3RoID4gMAorCQkJCQkJCSYmIGdldFZpZXdlcigpLmdldFRyZWUoKS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApIHsKKwkJCQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFRvcEl0ZW0oaXRlbXNbMF0pOworCQkJCQl9CisJCQkJCXJlZHJhd0ZhbHNlQ29udHJvbC5zZXRSZWRyYXcodHJ1ZSk7CisJCQkJfQorCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJfQorCisJCQkvKioKKwkJCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgam9iIHNob3VsZCBiZSBjYW5jZWxlZCAoYmVjYXVzZSBvZiB0aW1lb3V0IG9yCisJCQkgKiBhY3R1YWwgY2FuY2VsbGF0aW9uKS4KKwkJCSAqCisJCQkgKiBAcGFyYW0gaXRlbXMKKwkJCSAqIEBwYXJhbSBtb25pdG9yCisJCQkgKiBAcGFyYW0gY2FuY2VsVGltZQorCQkJICogQHBhcmFtIG51bUl0ZW1zTGVmdAorCQkJICogQHJldHVybiB0cnVlIGlmIGNhbmNlbGVkCisJCQkgKi8KKwkJCXByaXZhdGUgYm9vbGVhbiByZWN1cnNpdmVFeHBhbmQoVHJlZUl0ZW1bXSBpdGVtcywKKwkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBsb25nIGNhbmNlbFRpbWUsCisJCQkJCWludFtdIG51bUl0ZW1zTGVmdCkgeworCQkJCWJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKKwkJCQlmb3IgKGludCBpID0gMDsgIWNhbmNlbGVkICYmIGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07CisJCQkJCWJvb2xlYW4gdmlzaWJsZSA9IG51bUl0ZW1zTGVmdFswXS0tID49IDA7CisJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKQorCQkJCQkJCXx8ICghdmlzaWJsZSAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IGNhbmNlbFRpbWUpKSB7CisJCQkJCQljYW5jZWxlZCA9IHRydWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlPYmplY3QgaXRlbURhdGEgPSBpdGVtLmdldERhdGEoKTsKKwkJCQkJCWlmIChpdGVtRGF0YSAhPSBudWxsKSB7CisJCQkJCQkJaWYgKCFpdGVtLmdldEV4cGFuZGVkKCkpIHsKKwkJCQkJCQkJLy8gZG8gdGhlIGV4cGFuc2lvbiB0aHJvdWdoIHRoZSB2aWV3ZXIgc28gdGhhdAorCQkJCQkJCQkvLyBpdCBjYW4gcmVmcmVzaCBjaGlsZHJlbiBhcHByb3ByaWF0ZWx5LgorCQkJCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoaXRlbURhdGEsIHRydWUpOworCQkJCQkJCX0KKwkJCQkJCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gaXRlbS5nZXRJdGVtcygpOworCQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAwKSB7CisJCQkJCQkJCWNhbmNlbGVkID0gcmVjdXJzaXZlRXhwYW5kKGNoaWxkcmVuLCBtb25pdG9yLAorCQkJCQkJCQkJCWNhbmNlbFRpbWUsIG51bUl0ZW1zTGVmdCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBjYW5jZWxlZDsKKwkJCX0KKworCQl9OworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRvb2xiYXIoYm9vbGVhbiB2aXNpYmxlKSB7CisJCWlmIChjbGVhckJ1dHRvbkNvbnRyb2wgIT0gbnVsbCkgeworCQkJY2xlYXJCdXR0b25Db250cm9sLnNldFZpc2libGUodmlzaWJsZSk7CisJCX0KKwkJaWYgKGZpbHRlclRvb2xCYXIgIT0gbnVsbCkgeworCQkJZmlsdGVyVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpbHRlciB0ZXh0IGFuZCBhZGRzIGxpc3RlbmVycy4gVGhpcyBtZXRob2QgY2FsbHMKKwkgKiB7QGxpbmsgI2RvQ3JlYXRlRmlsdGVyVGV4dChDb21wb3NpdGUpfSB0byBjcmVhdGUgdGhlIHRleHQgY29udHJvbC4KKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB7QGxpbmsgI2RvQ3JlYXRlRmlsdGVyVGV4dChDb21wb3NpdGUpfSBpbnN0ZWFkCisJICogb2Ygb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2YgdGhlIGZpbHRlciB0ZXh0CisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsdGVyVGV4dChDb21wb3NpdGUgcGFyZW50KSB7CisJCWZpbHRlclRleHQgPSBkb0NyZWF0ZUZpbHRlclRleHQocGFyZW50KTsKKwkJZmlsdGVyVGV4dC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAorCQkJCW5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKKwkJCQkJCVN0cmluZyBmaWx0ZXJUZXh0U3RyaW5nID0gZmlsdGVyVGV4dC5nZXRUZXh0KCk7CisJCQkJCQlpZiAoZmlsdGVyVGV4dFN0cmluZy5sZW5ndGgoKSA9PSAwCisJCQkJCQkJCXx8IGZpbHRlclRleHRTdHJpbmcuZXF1YWxzKGluaXRpYWxUZXh0KSkgeworCQkJCQkJCWUucmVzdWx0ID0gaW5pdGlhbFRleHQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWUucmVzdWx0ID0gTkxTCisJCQkJCQkJCQkuYmluZCgKKwkJCQkJCQkJCQkJV29ya2JlbmNoU1dUTWVzc2FnZXMuRmlsdGVyZWRUcmVlX0FjY2Vzc2libGVMaXN0ZW5lckZpbHRlcmVkLAorCQkJCQkJCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJCQkJCQkJCWZpbHRlclRleHRTdHJpbmcsCisJCQkJCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoZ2V0RmlsdGVyZWRJdGVtc0NvdW50KCkpIH0pOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLyoqCisJCQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWx0ZXJlZCBpdGVtcworCQkJICoKKwkJCSAqIEByZXR1cm4gaW50CisJCQkgKi8KKwkJCQkJcHJpdmF0ZSBpbnQgZ2V0RmlsdGVyZWRJdGVtc0NvdW50KCkgeworCQkJCQkJaW50IHRvdGFsID0gMDsKKwkJCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBnZXRWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQl0b3RhbCArPSBpdGVtQ291bnQoaXRlbXNbaV0pOworCisJCQkJCQl9CisJCQkJCQlyZXR1cm4gdG90YWw7CisJCQkJCX0KKworCQkJCQkvKioKKwkJCSAqIFJldHVybiB0aGUgY291bnQgb2YgdHJlZUl0ZW0gYW5kIGl0J3MgY2hpbGRyZW4gdG8gaW5maW5pdGUgZGVwdGguCisJCQkgKgorCQkJICogQHBhcmFtIHRyZWVJdGVtCisJCQkgKiBAcmV0dXJuIGludAorCQkJICovCisJCQkJCXByaXZhdGUgaW50IGl0ZW1Db3VudChUcmVlSXRlbSB0cmVlSXRlbSkgeworCQkJCQkJaW50IGNvdW50ID0gMTsKKwkJCQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCQkJCWNvdW50ICs9IGl0ZW1Db3VudChjaGlsZHJlbltpXSk7CisKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBjb3VudDsKKwkJCQkJfQorCQkJCX0pOworCisJCWZpbHRlclRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKKwkJCQlpZiAoZmlsdGVyVGV4dC5nZXRUZXh0KCkuZXF1YWxzKGluaXRpYWxUZXh0KSkgeworCQkJCQlzZXRGaWx0ZXJUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl0ZXh0Q2hhbmdlZCgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJZmlsdGVyVGV4dC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKKwkJCQlpZiAoZmlsdGVyVGV4dC5nZXRUZXh0KCkuZXF1YWxzKGluaXRpYWxUZXh0KSkgeworCQkJCQkvLyBYWFg6IFdlIGNhbm5vdCBjYWxsIGNsZWFyVGV4dCgpIGR1ZSB0bworCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNjY0CisJCQkJCXNldEZpbHRlclRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJCXRleHRDaGFuZ2VkKCk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlmaWx0ZXJUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKKwkJCQkvLyBvbiBhIENSIHdlIHdhbnQgdG8gdHJhbnNmZXIgZm9jdXMgdG8gdGhlIGxpc3QKKwkJCQlib29sZWFuIGhhc0l0ZW1zID0gZ2V0Vmlld2VyKCkuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpID4gMDsKKwkJCQlpZiAoaGFzSXRlbXMgJiYgZS5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7CisJCQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvY3VzKCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCS8vIGVudGVyIGtleSBzZXQgZm9jdXMgdG8gdHJlZQorCQlmaWx0ZXJUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKKwkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgeworCQkJCQllLmRvaXQgPSBmYWxzZTsKKwkJCQkJaWYgKGdldFZpZXdlcigpLmdldFRyZWUoKS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7CisJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5iZWVwKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBpZiB0aGUgaW5pdGlhbCBmaWx0ZXIgdGV4dCBoYXNuJ3QgY2hhbmdlZCwgZG8gbm90IHRyeQorCQkJCQkJLy8gdG8gbWF0Y2gKKwkJCQkJCWJvb2xlYW4gaGFzRm9jdXMgPSBnZXRWaWV3ZXIoKS5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKKwkJCQkJCWJvb2xlYW4gdGV4dENoYW5nZWQgPSAhZ2V0SW5pdGlhbFRleHQoKS5lcXVhbHMoCisJCQkJCQkJCWZpbHRlclRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCQkJCQlpZiAoaGFzRm9jdXMgJiYgdGV4dENoYW5nZWQKKwkJCQkJCQkJJiYgZmlsdGVyVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgeworCQkJCQkJCVRyZWUgdHJlZSA9IGdldFZpZXdlcigpLmdldFRyZWUoKTsKKwkJCQkJCQlUcmVlSXRlbSBpdGVtOworCQkJCQkJCWlmICh0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKQorCQkJCQkJCQlpdGVtID0gZ2V0Rmlyc3RNYXRjaGluZ0l0ZW0odHJlZS5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlpdGVtID0gZ2V0Rmlyc3RNYXRjaGluZ0l0ZW0odHJlZS5nZXRJdGVtcygpKTsKKwkJCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQkJCQkJCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgaXRlbSB9KTsKKwkJCQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJCQkJCQkJZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlmaWx0ZXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJdGV4dENoYW5nZWQoKTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gaWYgd2UncmUgdXNpbmcgYSBmaWVsZCB3aXRoIGJ1aWx0IGluIGNhbmNlbCB3ZSBuZWVkIHRvIGxpc3RlbiBmb3IKKwkJLy8gZGVmYXVsdCBzZWxlY3Rpb24gY2hhbmdlcyAod2hpY2ggdGVsbCB1cyB0aGUgY2FuY2VsIGJ1dHRvbiBoYXMgYmVlbgorCQkvLyBwcmVzc2VkKQorCQlpZiAoKGZpbHRlclRleHQuZ2V0U3R5bGUoKSAmIFNXVC5JQ09OX0NBTkNFTCkgIT0gMCkgeworCQkJZmlsdGVyVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULklDT05fQ0FOQ0VMKQorCQkJCQkJY2xlYXJUZXh0KCk7CisJCQkJfQorCQkJfSk7CisJCX0KKworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQkvLyBpZiB0aGUgdGV4dCB3aWRnZXQgc3VwcG9ydGVkIGNhbmNlbCB0aGVuIGl0IHdpbGwgaGF2ZSBpdCdzIG93bgorCQkvLyBpbnRlZ3JhdGVkIGJ1dHRvbi4gV2UgY2FuIHRha2UgYWxsIG9mIHRoZSBzcGFjZS4KKwkJaWYgKChmaWx0ZXJUZXh0LmdldFN0eWxlKCkgJiBTV1QuSUNPTl9DQU5DRUwpICE9IDApCisJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWZpbHRlclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgdGV4dCBjb250cm9sIGZvciBlbnRlcmluZyB0aGUgZmlsdGVyIHRleHQuIFN1YmNsYXNzZXMgbWF5CisJICogb3ZlcnJpZGUuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQorCSAqIEByZXR1cm4gdGhlIHRleHQgd2lkZ2V0CisJICoKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHJvdGVjdGVkIFRleHQgZG9DcmVhdGVGaWx0ZXJUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaWYgKHVzZU5hdGl2ZVNlYXJjaEZpZWxkKHBhcmVudCkpIHsKKwkJCXJldHVybiBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlNFQVJDSAorCQkJCQl8IFNXVC5JQ09OX0NBTkNFTCk7CisJCX0KKwkJcmV0dXJuIG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcHJldmlvdXNGaWx0ZXJUZXh0OworCisJcHJpdmF0ZSBib29sZWFuIG5hcnJvd2luZ0Rvd247CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHJlY2VpdmVyIGFmdGVyIHRoZSB0ZXh0IGhhcyBjaGFuZ2VkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHRleHRDaGFuZ2VkKCkgeworCQluYXJyb3dpbmdEb3duID0gcHJldmlvdXNGaWx0ZXJUZXh0ID09IG51bGwKKwkJCQl8fCBwcmV2aW91c0ZpbHRlclRleHQKKwkJCQkJCS5lcXVhbHMoV29ya2JlbmNoU1dUTWVzc2FnZXMuRmlsdGVyZWRUcmVlX0ZpbHRlck1lc3NhZ2UpCisJCQkJfHwgZ2V0RmlsdGVyU3RyaW5nKCkuc3RhcnRzV2l0aChwcmV2aW91c0ZpbHRlclRleHQpOworCQlwcmV2aW91c0ZpbHRlclRleHQgPSBnZXRGaWx0ZXJTdHJpbmcoKTsKKwkJLy8gY2FuY2VsIGN1cnJlbnRseSBydW5uaW5nIGpvYiBmaXJzdCwgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWRyYXcKKwkJcmVmcmVzaEpvYi5jYW5jZWwoKTsKKwkJcmVmcmVzaEpvYi5zY2hlZHVsZShnZXRSZWZyZXNoSm9iRGVsYXkoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB0aW1lIGRlbGF5IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBzY2hlZHVsaW5nIHRoZSBmaWx0ZXIKKwkgKiByZWZyZXNoIGpvYi4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCisJICoKKwkgKiBAcmV0dXJuIGEgdGltZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBqb2Igc2hvdWxkIHJ1bgorCSAqCisJICogQHNpbmNlIDMuNQorCSAqLworCXByb3RlY3RlZCBsb25nIGdldFJlZnJlc2hKb2JEZWxheSgpIHsKKwkJcmV0dXJuIDIwMDsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGJhY2tncm91bmQgZm9yIHRoZSB3aWRnZXRzIHRoYXQgc3VwcG9ydCB0aGUgZmlsdGVyIHRleHQgYXJlYS4KKwkgKgorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kCisJICogICAgICAgICAgICBiYWNrZ3JvdW5kIDxjb2RlPkNvbG9yPC9jb2RlPiB0byBzZXQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGJhY2tncm91bmQpIHsKKwkJc3VwZXIuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKwkJaWYgKGZpbHRlckNvbXBvc2l0ZSAhPSBudWxsICYmICh1c2VOYXRpdmVTZWFyY2hGaWVsZChmaWx0ZXJDb21wb3NpdGUpKSkgeworCQkJZmlsdGVyQ29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7CisJCX0KKwkJaWYgKGZpbHRlclRvb2xCYXIgIT0gbnVsbCAmJiBmaWx0ZXJUb29sQmFyLmdldENvbnRyb2woKSAhPSBudWxsKSB7CisJCQlmaWx0ZXJUb29sQmFyLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0aGF0IGNsZWFycyB0aGUgdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9mIHRvb2xiYXIgYnV0dG9uCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsZWFyVGV4dChDb21wb3NpdGUgcGFyZW50KSB7CisJCS8vIG9ubHkgY3JlYXRlIHRoZSBidXR0b24gaWYgdGhlIHRleHQgd2lkZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBvbmUKKwkJLy8gbmF0aXZlbHkKKwkJaWYgKChmaWx0ZXJUZXh0LmdldFN0eWxlKCkgJiBTV1QuSUNPTl9DQU5DRUwpID09IDApIHsKKwkJCWZpbmFsIEltYWdlIGluYWN0aXZlSW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkKKwkJCQkJLmdldERlc2NyaXB0b3IoRElTQUJMRURfQ0xFQVJfSUNPTikuY3JlYXRlSW1hZ2UoKTsKKwkJCWZpbmFsIEltYWdlIGFjdGl2ZUltYWdlID0gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpCisJCQkJCS5nZXREZXNjcmlwdG9yKENMRUFSX0lDT04pLmNyZWF0ZUltYWdlKCk7CisJCQlmaW5hbCBJbWFnZSBwcmVzc2VkSW1hZ2UgPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCBhY3RpdmVJbWFnZSwKKyBTV1QuSU1BR0VfR1JBWSk7CisKKwkJCWZpbmFsIExhYmVsIGNsZWFyQnV0dG9uID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQkJY2xlYXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwKKwkJCQkJZmFsc2UsIGZhbHNlKSk7CisJCQljbGVhckJ1dHRvbi5zZXRJbWFnZShpbmFjdGl2ZUltYWdlKTsKKwkJCWNsZWFyQnV0dG9uLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKKwkJCQkJU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOworCQkJY2xlYXJCdXR0b24KKwkJCQkJLnNldFRvb2xUaXBUZXh0KFdvcmtiZW5jaFNXVE1lc3NhZ2VzLkZpbHRlcmVkVHJlZV9DbGVhclRvb2xUaXApOworCQkJY2xlYXJCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworCQkJCXByaXZhdGUgTW91c2VNb3ZlTGlzdGVuZXIgZk1vdmVMaXN0ZW5lcjsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKKwkJCQkJY2xlYXJCdXR0b24uc2V0SW1hZ2UocHJlc3NlZEltYWdlKTsKKwkJCQkJZk1vdmVMaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKKwkJCQkJCXByaXZhdGUgYm9vbGVhbiBmTW91c2VJbkJ1dHRvbiA9IHRydWU7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgeworCQkJCQkJCWJvb2xlYW4gbW91c2VJbkJ1dHRvbiA9IGlzTW91c2VJbkJ1dHRvbihlKTsKKwkJCQkJCQlpZiAobW91c2VJbkJ1dHRvbiAhPSBmTW91c2VJbkJ1dHRvbikgeworCQkJCQkJCQlmTW91c2VJbkJ1dHRvbiA9IG1vdXNlSW5CdXR0b247CisJCQkJCQkJCWNsZWFyQnV0dG9uCisJCQkJCQkJCQkJLnNldEltYWdlKG1vdXNlSW5CdXR0b24gPyBwcmVzc2VkSW1hZ2UKKwkJCQkJCQkJCQkJCTogaW5hY3RpdmVJbWFnZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9OworCQkJCQkvLyBGSVhNRSBSQVAKKwkJCQkJLy8gY2xlYXJCdXR0b24uYWRkTW91c2VNb3ZlTGlzdGVuZXIoZk1vdmVMaXN0ZW5lcik7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKKwkJCQkJaWYgKGZNb3ZlTGlzdGVuZXIgIT0gbnVsbCkgeworCQkJCQkJLy8gRklYTUUgUkFQCisJCQkJCQkvLyBjbGVhckJ1dHRvbi5yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lcihmTW92ZUxpc3RlbmVyKTsKKwkJCQkJCWZNb3ZlTGlzdGVuZXIgPSBudWxsOworCQkJCQkJYm9vbGVhbiBtb3VzZUluQnV0dG9uID0gaXNNb3VzZUluQnV0dG9uKGUpOworCQkJCQkJY2xlYXJCdXR0b24uc2V0SW1hZ2UobW91c2VJbkJ1dHRvbiA/IGFjdGl2ZUltYWdlCisJCQkJCQkJCTogaW5hY3RpdmVJbWFnZSk7CisJCQkJCQlpZiAobW91c2VJbkJ1dHRvbikgeworCQkJCQkJCWNsZWFyVGV4dCgpOworCQkJCQkJCWZpbHRlclRleHQuc2V0Rm9jdXMoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCXByaXZhdGUgYm9vbGVhbiBpc01vdXNlSW5CdXR0b24oTW91c2VFdmVudCBlKSB7CisJCQkJCVBvaW50IGJ1dHRvblNpemUgPSBjbGVhckJ1dHRvbi5nZXRTaXplKCk7CisJCQkJCXJldHVybiAwIDw9IGUueCAmJiBlLnggPCBidXR0b25TaXplLnggJiYgMCA8PSBlLnkKKwkJCQkJCQkmJiBlLnkgPCBidXR0b25TaXplLnk7CisJCQkJfQorCQkJfSk7CisJCQkvLyBGSVhNRSBSQVAKKwkJCS8vIGNsZWFyQnV0dG9uLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0xpc3RlbmVyKCkgeworCQkJLy8gQE92ZXJyaWRlCisJCQkvLyBwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgeworCQkJLy8gY2xlYXJCdXR0b24uc2V0SW1hZ2UoYWN0aXZlSW1hZ2UpOworCQkJLy8gfQorCQkJLy8KKwkJCS8vIEBPdmVycmlkZQorCQkJLy8gcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgeworCQkJLy8gY2xlYXJCdXR0b24uc2V0SW1hZ2UoaW5hY3RpdmVJbWFnZSk7CisJCQkvLyB9CisJCQkvLworCQkJLy8gQE92ZXJyaWRlCisJCQkvLyBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgeworCQkJLy8gfQorCQkJLy8gfSk7CisJCQljbGVhckJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCQlpbmFjdGl2ZUltYWdlLmRpc3Bvc2UoKTsKKwkJCQkJYWN0aXZlSW1hZ2UuZGlzcG9zZSgpOworCQkJCQlwcmVzc2VkSW1hZ2UuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0pOworCQkJY2xlYXJCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcigKKwkJCQkJbmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7CisJCQkJCQkJZS5yZXN1bHQgPSBXb3JrYmVuY2hTV1RNZXNzYWdlcy5GaWx0ZXJlZFRyZWVfQWNjZXNzaWJsZUxpc3RlbmVyQ2xlYXJCdXR0b247CisJCQkJCQl9CisJCQkJCX0pOworCQkJY2xlYXJCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoCisJCQkJCW5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7CisJCQkJCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9QVVNIQlVUVE9OOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCXRoaXMuY2xlYXJCdXR0b25Db250cm9sID0gY2xlYXJCdXR0b247CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbGVhcnMgdGhlIHRleHQgaW4gdGhlIGZpbHRlciB0ZXh0IHdpZGdldC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjbGVhclRleHQoKSB7CisJCXNldEZpbHRlclRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCXRleHRDaGFuZ2VkKCk7CisJfQorCisJLyoqCisJICogU2V0IHRoZSB0ZXh0IGluIHRoZSBmaWx0ZXIgY29udHJvbC4KKwkgKgorCSAqIEBwYXJhbSBzdHJpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaWx0ZXJUZXh0KFN0cmluZyBzdHJpbmcpIHsKKwkJaWYgKGZpbHRlclRleHQgIT0gbnVsbCkgeworCQkJZmlsdGVyVGV4dC5zZXRUZXh0KHN0cmluZyk7CisJCQlzZWxlY3RBbGwoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdHRlcm4gZmlsdGVyIHVzZWQgYnkgdGhpcyB0cmVlLgorCSAqCisJICogQHJldHVybiBUaGUgcGF0dGVybiBmaWx0ZXI7IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBmaW5hbCBQYXR0ZXJuRmlsdGVyIGdldFBhdHRlcm5GaWx0ZXIoKSB7CisJCXJldHVybiBwYXR0ZXJuRmlsdGVyOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgdHJlZSB2aWV3ZXIgb2YgdGhlIHJlY2VpdmVyLgorCSAqCisJICogQHJldHVybiB0aGUgdHJlZSB2aWV3ZXIKKwkgKi8KKwlwdWJsaWMgVHJlZVZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiB0cmVlVmlld2VyOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgZmlsdGVyIHRleHQgZm9yIHRoZSByZWNlaXZlciwgaWYgaXQgd2FzIGNyZWF0ZWQuIE90aGVyd2lzZSByZXR1cm4KKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGZpbHRlciBUZXh0LCBvciBudWxsIGlmIGl0IHdhcyBub3QgY3JlYXRlZAorCSAqLworCXB1YmxpYyBUZXh0IGdldEZpbHRlckNvbnRyb2woKSB7CisJCXJldHVybiBmaWx0ZXJUZXh0OworCX0KKworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIHRleHQgb2YgdGhlIGZpbHRlciBjb250cm9sLiBJZiB0aGUgdGV4dAorCSAqIHdpZGdldCBpcyBub3QgY3JlYXRlZCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgorCSAqCisJICogQHJldHVybiBTdHJpbmcgaW4gdGhlIHRleHQsIG9yIG51bGwgaWYgdGhlIHRleHQgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbHRlclN0cmluZygpIHsKKwkJcmV0dXJuIGZpbHRlclRleHQgIT0gbnVsbCA/IGZpbHRlclRleHQuZ2V0VGV4dCgpIDogbnVsbDsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIHVudGlsIHRoZSBmaXJzdCBmb2N1cy4gQSBkZWZhdWx0IHZhbHVlIGlzCisJICogcHJvdmlkZWQsIHNvIHRoaXMgbWV0aG9kIG9ubHkgbmVlZCBiZSBjYWxsZWQgaWYgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdAorCSAqIGluaXRpYWwgdGV4dCBpcyBkZXNpcmVkLgorCSAqCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIGluaXRpYWwgdGV4dCB0byBhcHBlYXIgaW4gdGV4dCBmaWVsZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KSB7CisJCWluaXRpYWxUZXh0ID0gdGV4dDsKKwkJaWYgKGZpbHRlclRleHQgIT0gbnVsbCkgeworCQkJZmlsdGVyVGV4dC5zZXRNZXNzYWdlKHRleHQpOworCQkJaWYgKGZpbHRlclRleHQuaXNGb2N1c0NvbnRyb2woKSkgeworCQkJCXNldEZpbHRlclRleHQoaW5pdGlhbFRleHQpOworCQkJCXRleHRDaGFuZ2VkKCk7CisJCQl9IGVsc2UgeworCQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJaWYgKCFmaWx0ZXJUZXh0LmlzRGlzcG9zZWQoKQorCQkJCQkJCQkmJiBmaWx0ZXJUZXh0LmlzRm9jdXNDb250cm9sKCkpIHsKKwkJCQkJCQlzZXRGaWx0ZXJUZXh0KGluaXRpYWxUZXh0KTsKKwkJCQkJCQl0ZXh0Q2hhbmdlZCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzZXRGaWx0ZXJUZXh0KGluaXRpYWxUZXh0KTsKKwkJCXRleHRDaGFuZ2VkKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZWxlY3QgYWxsIHRleHQgaW4gdGhlIGZpbHRlciB0ZXh0IGZpZWxkLgorCSAqCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VsZWN0QWxsKCkgeworCQlpZiAoZmlsdGVyVGV4dCAhPSBudWxsKSB7CisJCQlmaWx0ZXJUZXh0LnNlbGVjdEFsbCgpOworCQl9CisJfQorCisJLyoqCisJICogR2V0IHRoZSBpbml0aWFsIHRleHQgZm9yIHRoZSByZWNlaXZlci4KKwkgKgorCSAqIEByZXR1cm4gU3RyaW5nCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsVGV4dCgpIHsKKwkJcmV0dXJuIGluaXRpYWxUZXh0OworCX0KKworCS8qKgorCSAqIFJldHVybiBhIGJvbGQgZm9udCBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLgorCSAqIENsaWVudHMgY2FuIG9wdCB0byBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYSBWaWV3ZXIncyBsYWJlbCBwcm92aWRlciB0byBnZXQKKwkgKiBhIGJvbGQgZm9udCBmb3Igd2hpY2ggdG8gaGlnaGxpZ2h0IHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSB0cmVlLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIGVsZW1lbnQgZm9yIHdoaWNoIGEgbWF0Y2ggc2hvdWxkIGJlIGRldGVybWluZWQKKwkgKiBAcGFyYW0gdHJlZQorCSAqICAgICAgICAgICAgRmlsdGVyZWRUcmVlIGluIHdoaWNoIHRoZSBlbGVtZW50IHJlc2lkZXMKKwkgKiBAcGFyYW0gZmlsdGVyCisJICogICAgICAgICAgICBQYXR0ZXJuRmlsdGVyIHdoaWNoIGRldGVybWluZXMgYSBtYXRjaAorCSAqCisJICogQHJldHVybiBib2xkIGZvbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZvbnQgZ2V0Qm9sZEZvbnQoT2JqZWN0IGVsZW1lbnQsIEZpbHRlcmVkVHJlZSB0cmVlLAorCQkJUGF0dGVybkZpbHRlciBmaWx0ZXIpIHsKKwkJU3RyaW5nIGZpbHRlclRleHQgPSB0cmVlLmdldEZpbHRlclN0cmluZygpOworCisJCWlmIChmaWx0ZXJUZXh0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLy8gRG8gbm90aGluZyBpZiBpdCdzIGVtcHR5IHN0cmluZworCQlTdHJpbmcgaW5pdGlhbFRleHQgPSB0cmVlLmdldEluaXRpYWxUZXh0KCk7CisJCWlmICghZmlsdGVyVGV4dC5lcXVhbHMoIiIpICYmICFmaWx0ZXJUZXh0LmVxdWFscyhpbml0aWFsVGV4dCkpIHsvLyROT04tTkxTLTEkCisJCQlpZiAodHJlZS5nZXRQYXR0ZXJuRmlsdGVyKCkgIT0gZmlsdGVyKSB7CisJCQkJYm9vbGVhbiBpbml0aWFsID0gaW5pdGlhbFRleHQgIT0gbnVsbAorCQkJCQkJJiYgaW5pdGlhbFRleHQuZXF1YWxzKGZpbHRlclRleHQpOworCQkJCWlmIChpbml0aWFsKSB7CisJCQkJCWZpbHRlci5zZXRQYXR0ZXJuKG51bGwpOworCQkJCX0gZWxzZSBpZiAoZmlsdGVyVGV4dCAhPSBudWxsKSB7CisJCQkJCWZpbHRlci5zZXRQYXR0ZXJuKGZpbHRlclRleHQpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmaWx0ZXIuaXNFbGVtZW50VmlzaWJsZSh0cmVlLmdldFZpZXdlcigpLCBlbGVtZW50KQorCQkJCQkmJiBmaWx0ZXIuaXNMZWFmTWF0Y2godHJlZS5nZXRWaWV3ZXIoKSwgZWxlbWVudCkpIHsKKwkJCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZCgKKwkJCQkJCUpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDdXN0b20gdHJlZSB2aWV3ZXIgc3ViY2xhc3MgdGhhdCBjbGVhcnMgdGhlIGNhY2hlcyBpbiBwYXR0ZXJuRmlsdGVyIG9uCisJICogYW55IGNoYW5nZSB0byB0aGUgdHJlZS4gU2VlIGJ1ZyAxODcyMDAuCisJICoKKwkgKiBAc2luY2UgMy4zCisJICoKKwkgKi8KKwljbGFzcyBOb3RpZnlpbmdUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBwYXJlbnQKKwkJICogQHBhcmFtIHN0eWxlCisJCSAqLworCQlwdWJsaWMgTm90aWZ5aW5nVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGFkZChPYmplY3QgcGFyZW50RWxlbWVudE9yVHJlZVBhdGgsIE9iamVjdCBjaGlsZEVsZW1lbnQpIHsKKwkJCWdldFBhdHRlcm5GaWx0ZXIoKS5jbGVhckNhY2hlcygpOworCQkJc3VwZXIuYWRkKHBhcmVudEVsZW1lbnRPclRyZWVQYXRoLCBjaGlsZEVsZW1lbnQpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGFkZChPYmplY3QgcGFyZW50RWxlbWVudE9yVHJlZVBhdGgsIE9iamVjdFtdIGNoaWxkRWxlbWVudHMpIHsKKwkJCWdldFBhdHRlcm5GaWx0ZXIoKS5jbGVhckNhY2hlcygpOworCQkJc3VwZXIuYWRkKHBhcmVudEVsZW1lbnRPclRyZWVQYXRoLCBjaGlsZEVsZW1lbnRzKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoT2JqZWN0IGlucHV0LCBPYmplY3Qgb2xkSW5wdXQpIHsKKwkJCWdldFBhdHRlcm5GaWx0ZXIoKS5jbGVhckNhY2hlcygpOworCQkJc3VwZXIuaW5wdXRDaGFuZ2VkKGlucHV0LCBvbGRJbnB1dCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaW5zZXJ0KE9iamVjdCBwYXJlbnRFbGVtZW50T3JUcmVlUGF0aCwgT2JqZWN0IGVsZW1lbnQsCisJCQkJaW50IHBvc2l0aW9uKSB7CisJCQlnZXRQYXR0ZXJuRmlsdGVyKCkuY2xlYXJDYWNoZXMoKTsKKwkJCXN1cGVyLmluc2VydChwYXJlbnRFbGVtZW50T3JUcmVlUGF0aCwgZWxlbWVudCwgcG9zaXRpb24pOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisJCQlnZXRQYXR0ZXJuRmlsdGVyKCkuY2xlYXJDYWNoZXMoKTsKKwkJCXN1cGVyLnJlZnJlc2goKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7CisJCQlnZXRQYXR0ZXJuRmlsdGVyKCkuY2xlYXJDYWNoZXMoKTsKKwkJCXN1cGVyLnJlZnJlc2godXBkYXRlTGFiZWxzKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbGVtZW50KSB7CisJCQlnZXRQYXR0ZXJuRmlsdGVyKCkuY2xlYXJDYWNoZXMoKTsKKwkJCXN1cGVyLnJlZnJlc2goZWxlbWVudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKKwkJCWdldFBhdHRlcm5GaWx0ZXIoKS5jbGVhckNhY2hlcygpOworCQkJc3VwZXIucmVmcmVzaChlbGVtZW50LCB1cGRhdGVMYWJlbHMpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgZWxlbWVudHNPclRyZWVQYXRocykgeworCQkJZ2V0UGF0dGVybkZpbHRlcigpLmNsZWFyQ2FjaGVzKCk7CisJCQlzdXBlci5yZW1vdmUoZWxlbWVudHNPclRyZWVQYXRocyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7CisJCQlnZXRQYXR0ZXJuRmlsdGVyKCkuY2xlYXJDYWNoZXMoKTsKKwkJCXN1cGVyLnJlbW92ZShwYXJlbnQsIGVsZW1lbnRzKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0W10gZWxlbWVudHNPclRyZWVQYXRocykgeworCQkJZ2V0UGF0dGVybkZpbHRlcigpLmNsZWFyQ2FjaGVzKCk7CisJCQlzdXBlci5yZW1vdmUoZWxlbWVudHNPclRyZWVQYXRocyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVwbGFjZShPYmplY3QgcGFyZW50RWxlbWVudE9yVHJlZVBhdGgsIGludCBpbmRleCwKKwkJCQlPYmplY3QgZWxlbWVudCkgeworCQkJZ2V0UGF0dGVybkZpbHRlcigpLmNsZWFyQ2FjaGVzKCk7CisJCQlzdXBlci5yZXBsYWNlKHBhcmVudEVsZW1lbnRPclRyZWVQYXRoLCBpbmRleCwgZWxlbWVudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0Q2hpbGRDb3VudChPYmplY3QgZWxlbWVudE9yVHJlZVBhdGgsIGludCBjb3VudCkgeworCQkJZ2V0UGF0dGVybkZpbHRlcigpLmNsZWFyQ2FjaGVzKCk7CisJCQlzdXBlci5zZXRDaGlsZENvdW50KGVsZW1lbnRPclRyZWVQYXRoLCBjb3VudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKKwkJCWdldFBhdHRlcm5GaWx0ZXIoKS5jbGVhckNhY2hlcygpOworCQkJc3VwZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzZXRIYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudE9yVHJlZVBhdGgsIGJvb2xlYW4gaGFzQ2hpbGRyZW4pIHsKKwkJCWdldFBhdHRlcm5GaWx0ZXIoKS5jbGVhckNhY2hlcygpOworCQkJc3VwZXIuc2V0SGFzQ2hpbGRyZW4oZWxlbWVudE9yVHJlZVBhdGgsIGhhc0NoaWxkcmVuKTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9QYXR0ZXJuRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9QYXR0ZXJuRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlYTk0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1BhdHRlcm5GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDM1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weTsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKKworLyoqCisgKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlBhdHRlcm5GaWx0ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKwkvKgorCSAqIENhY2hlIG9mIGZpbHRlcmVkIGVsZW1lbnRzIGluIHRoZSB0cmVlCisJICovCisJcHJpdmF0ZSBNYXA8T2JqZWN0LCBPYmplY3RbXT4gY2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkvKgorCSAqIE1hcHMgcGFyZW50IGVsZW1lbnRzIHRvIFRSVUUgb3IgRkFMU0UKKwkgKi8KKwlwcml2YXRlIE1hcDxPYmplY3QsIEJvb2xlYW4+IGZvdW5kQW55Q2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGJvb2xlYW4gdXNlQ2FjaGUgPSBmYWxzZTsKKworCS8qKgorCSAqIFdoZXRoZXIgdG8gaW5jbHVkZSBhIGxlYWRpbmcgd2lsZGNhcmQgZm9yIGFsbCBwcm92aWRlZCBwYXR0ZXJucy4gQQorCSAqIHRyYWlsaW5nIHdpbGRjYXJkIGlzIGFsd2F5cyBpbmNsdWRlZC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUxlYWRpbmdXaWxkY2FyZCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIHN0cmluZyBwYXR0ZXJuIG1hdGNoZXIgdXNlZCBmb3IgdGhpcyBwYXR0ZXJuIGZpbHRlci4KKwkgKi8KKwlwcml2YXRlIFN0cmluZ01hdGNoZXIgbWF0Y2hlcjsKKworCXByaXZhdGUgYm9vbGVhbiB1c2VFYXJseVJldHVybklmTWF0Y2hlcklzTnVsbCA9IHRydWU7CisKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBFTVBUWSA9IG5ldyBPYmplY3RbMF07CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgT2JqZWN0W10gZmlsdGVyKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7CisJCS8vIHdlIGRvbid0IHdhbnQgdG8gb3B0aW1pemUgaWYgd2UndmUgZXh0ZW5kZWQgdGhlIGZpbHRlciAuLi4gdGhpcworCQkvLyBuZWVkcyB0byBiZSBhZGRyZXNzZWQgaW4gMy40CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY0MDQKKwkJaWYgKG1hdGNoZXIgPT0gbnVsbCAmJiB1c2VFYXJseVJldHVybklmTWF0Y2hlcklzTnVsbCkgeworCQkJcmV0dXJuIGVsZW1lbnRzOworCQl9CisKKwkJaWYgKCF1c2VDYWNoZSkgeworCQkJcmV0dXJuIHN1cGVyLmZpbHRlcih2aWV3ZXIsIHBhcmVudCwgZWxlbWVudHMpOworCQl9CisKKwkJT2JqZWN0W10gZmlsdGVyZWQgPSBjYWNoZS5nZXQocGFyZW50KTsKKwkJaWYgKGZpbHRlcmVkID09IG51bGwpIHsKKwkJCUJvb2xlYW4gZm91bmRBbnkgPSBmb3VuZEFueUNhY2hlLmdldChwYXJlbnQpOworCQkJaWYgKGZvdW5kQW55ICE9IG51bGwgJiYgIWZvdW5kQW55LmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJZmlsdGVyZWQgPSBFTVBUWTsKKwkJCX0gZWxzZSB7CisJCQkJZmlsdGVyZWQgPSBzdXBlci5maWx0ZXIodmlld2VyLCBwYXJlbnQsIGVsZW1lbnRzKTsKKwkJCX0KKwkJCWNhY2hlLnB1dChwYXJlbnQsIGZpbHRlcmVkKTsKKwkJfQorCQlyZXR1cm4gZmlsdGVyZWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgbWFrZXMgaXQgdGhyb3VnaCB0aGUgZmlsdGVyLiBUaGlzCisJICogbWV0aG9kIHVzZXMgY2FjaGluZyBpZiBlbmFibGVkOyB0aGUgY29tcHV0YXRpb24gaXMgZG9uZSBpbgorCSAqIGNvbXB1dGVBbnlWaXNpYmxlLgorCSAqCisJICogQHBhcmFtIHZpZXdlcgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gZWxlbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyAobXVzdCBub3QgYmUgYW4gZW1wdHkgYXJyYXkpCisJICogQHJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgbWFrZXMgaXQgdGhyb3VnaCB0aGUgZmlsdGVyLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0FueVZpc2libGUoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKKwkJaWYgKG1hdGNoZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoIXVzZUNhY2hlKSB7CisJCQlyZXR1cm4gY29tcHV0ZUFueVZpc2libGUodmlld2VyLCBlbGVtZW50cyk7CisJCX0KKworCQlPYmplY3RbXSBmaWx0ZXJlZCA9IGNhY2hlLmdldChwYXJlbnQpOworCQlpZiAoZmlsdGVyZWQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGZpbHRlcmVkLmxlbmd0aCA+IDA7CisJCX0KKwkJQm9vbGVhbiBmb3VuZEFueSA9IGZvdW5kQW55Q2FjaGUuZ2V0KHBhcmVudCk7CisJCWlmIChmb3VuZEFueSA9PSBudWxsKSB7CisJCQlmb3VuZEFueSA9IGNvbXB1dGVBbnlWaXNpYmxlKHZpZXdlciwgZWxlbWVudHMpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCWZvdW5kQW55Q2FjaGUucHV0KHBhcmVudCwgZm91bmRBbnkpOworCQl9CisJCXJldHVybiBmb3VuZEFueS5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBtYWtlcyBpdCB0aHJvdWdoIHRoZSBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gdmlld2VyCisJICogICAgICAgICAgICB0aGUgdmlld2VyCisJICogQHBhcmFtIGVsZW1lbnRzCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gdGVzdAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IG9mIHRoZSBlbGVtZW50cyBtYWtlcyBpdCB0aHJvdWdoIHRoZQorCSAqICAgICAgICAgZmlsdGVyCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVBbnlWaXNpYmxlKFZpZXdlciB2aWV3ZXIsIE9iamVjdFtdIGVsZW1lbnRzKSB7CisJCWJvb2xlYW4gZWxlbWVudEZvdW5kID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoICYmICFlbGVtZW50Rm91bmQ7IGkrKykgeworCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKKwkJCWVsZW1lbnRGb3VuZCA9IGlzRWxlbWVudFZpc2libGUodmlld2VyLCBlbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gZWxlbWVudEZvdW5kOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuIGlzRWxlbWVudFZpc2libGUodmlld2VyLCBlbGVtZW50KTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgYSBsZWFkaW5nIHdpbGRjYXJkIHNob3VsZCBiZSBhdHRhY2hlZCB0byBlYWNoIHBhdHRlcm4KKwkgKiBzdHJpbmcuCisJICoKKwkgKiBAcGFyYW0gaW5jbHVkZUxlYWRpbmdXaWxkY2FyZAorCSAqICAgICAgICAgICAgV2hldGhlciBhIGxlYWRpbmcgd2lsZGNhcmQgc2hvdWxkIGJlIGFkZGVkLgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNldEluY2x1ZGVMZWFkaW5nV2lsZGNhcmQoZmluYWwgYm9vbGVhbiBpbmNsdWRlTGVhZGluZ1dpbGRjYXJkKSB7CisJCXRoaXMuaW5jbHVkZUxlYWRpbmdXaWxkY2FyZCA9IGluY2x1ZGVMZWFkaW5nV2lsZGNhcmQ7CisJfQorCisJLyoqCisJICogVGhlIHBhdHRlcm4gc3RyaW5nIGZvciB3aGljaCB0aGlzIGZpbHRlciBzaG91bGQgc2VsZWN0IGVsZW1lbnRzIGluIHRoZQorCSAqIHZpZXdlci4KKwkgKgorCSAqIEBwYXJhbSBwYXR0ZXJuU3RyaW5nCisJICovCisJcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVyblN0cmluZykgeworCQkvLyB0aGVzZSAyIHN0cmluZ3MgYWxsb3cgdGhlIFBhdHRlcm5GaWx0ZXIgdG8gYmUgZXh0ZW5kZWQgaW4KKwkJLy8gMy4zIC0gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjQwNAorCQlpZiAoIm9yZy5lY2xpcHNlLnVpLmtleXMub3B0aW1pemF0aW9uLnRydWUiLmVxdWFscyhwYXR0ZXJuU3RyaW5nKSkgeyAvLyROT04tTkxTLTEkCisJCQl1c2VFYXJseVJldHVybklmTWF0Y2hlcklzTnVsbCA9IHRydWU7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoIm9yZy5lY2xpcHNlLnVpLmtleXMub3B0aW1pemF0aW9uLmZhbHNlIi5lcXVhbHMocGF0dGVyblN0cmluZykpIHsgLy8kTk9OLU5MUy0xJAorCQkJdXNlRWFybHlSZXR1cm5JZk1hdGNoZXJJc051bGwgPSBmYWxzZTsKKwkJCXJldHVybjsKKwkJfQorCQljbGVhckNhY2hlcygpOworCQlpZiAocGF0dGVyblN0cmluZyA9PSBudWxsIHx8IHBhdHRlcm5TdHJpbmcuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQltYXRjaGVyID0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBwYXR0ZXJuID0gcGF0dGVyblN0cmluZyArICIqIjsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGluY2x1ZGVMZWFkaW5nV2lsZGNhcmQpIHsKKwkJCQlwYXR0ZXJuID0gIioiICsgcGF0dGVybjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJbWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHBhdHRlcm4sIHRydWUsIGZhbHNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENsZWFycyB0aGUgY2FjaGVzIHVzZWQgZm9yIG9wdGltaXppbmcgdGhpcyBmaWx0ZXIuIE5lZWRzIHRvIGJlIGNhbGxlZAorCSAqIHdoZW5ldmVyIHRoZSB0cmVlIGNvbnRlbnQgY2hhbmdlcy4KKwkgKi8KKwkvKiBwYWNrYWdlICovdm9pZCBjbGVhckNhY2hlcygpIHsKKwkJY2FjaGUuY2xlYXIoKTsKKwkJZm91bmRBbnlDYWNoZS5jbGVhcigpOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgZ2l2ZW4gU3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4uCisJICoKKwkgKiBAcGFyYW0gc3RyaW5nCisJICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHRlc3QKKwkgKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHN0cmluZykgeworCQlpZiAobWF0Y2hlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaChzdHJpbmcpOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIHZhbGlkIHNlbGVjdGlvbiBpbiB0aGUgZmlsdGVyZWQKKwkgKiB0cmVlLiBGb3IgZXhhbXBsZSwgaWYgYSB0cmVlIGhhcyBpdGVtcyB0aGF0IGFyZSBjYXRlZ29yaXplZCwgdGhlIGNhdGVnb3J5CisJICogaXRzZWxmIG1heSBub3QgYmUgYSB2YWxpZCBzZWxlY3Rpb24gc2luY2UgaXQgaXMgdXNlZCBtZXJlbHkgdG8gb3JnYW5pemUKKwkgKiB0aGUgZWxlbWVudHMuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgZWxpZ2libGUgZm9yIGF1dG9tYXRpYyBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRTZWxlY3RhYmxlKE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBlbGVtZW50ICE9IG51bGw7CisJfQorCisJLyoqCisJICogQW5zd2VycyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBnaXZlbiB2aWV3ZXIgbWF0Y2hlcyB0aGUgZmlsdGVyCisJICogcGF0dGVybi4gVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIHNob3cgYSBsZWFmIGVsZW1lbnQKKwkgKiBpbiB0aGUgdHJlZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWx0ZXIgdGV4dCBtYXRjaGVzIHRoZSB0ZXh0IG9mCisJICogdGhlIGdpdmVuIGVsZW1lbnQncyB0ZXh0LCBvciB0aGF0IG9mIGl0J3MgY2hpbGRyZW4gKGlmIHRoZSBlbGVtZW50IGhhcworCSAqIGFueSkuCisJICoKKwkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKwkgKgorCSAqIEBwYXJhbSB2aWV3ZXIKKwkgKiAgICAgICAgICAgIHRoZSB0cmVlIHZpZXdlciBpbiB3aGljaCB0aGUgZWxlbWVudCByZXNpZGVzCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGluIHRoZSB0cmVlIHRvIGNoZWNrIGZvciBhIG1hdGNoCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgZmlsdGVyIHBhdHRlcm4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRWaXNpYmxlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBpc1BhcmVudE1hdGNoKHZpZXdlciwgZWxlbWVudCkgfHwgaXNMZWFmTWF0Y2godmlld2VyLCBlbGVtZW50KTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBpZiB0aGUgcGFyZW50IChjYXRlZ29yeSkgaXMgYSBtYXRjaCB0byB0aGUgZmlsdGVyIHRleHQuIFRoZSBkZWZhdWx0CisJICogYmVoYXZpb3IgcmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQgZWxlbWVudCB0aGF0CisJICogaXMgYSBtYXRjaCB3aXRoIHRoZSBmaWx0ZXIgdGV4dC4KKwkgKgorCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIHZpZXdlcgorCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50CisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSB0cmVlIGVsZW1lbnQgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyCisJICogICAgICAgICB0ZXh0CisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJlbnRNYXRjaChWaWV3ZXIgdmlld2VyLCBPYmplY3QgZWxlbWVudCkgeworCQlPYmplY3RbXSBjaGlsZHJlbiA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpICgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpCisJCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKKworCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5sZW5ndGggPiAwKSkgeworCQkJcmV0dXJuIGlzQW55VmlzaWJsZSh2aWV3ZXIsIGVsZW1lbnQsIGNoaWxkcmVuKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgKGxlYWYpIGVsZW1lbnQgaXMgYSBtYXRjaCB3aXRoIHRoZSBmaWx0ZXIgdGV4dC4gVGhlCisJICogZGVmYXVsdCBiZWhhdmlvciBjaGVja3MgdGhhdCB0aGUgbGFiZWwgb2YgdGhlIGVsZW1lbnQgaXMgYSBtYXRjaC4KKwkgKgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIHZpZXdlcgorCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50CisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSB0cmVlIGVsZW1lbnQgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQncyBsYWJlbCBtYXRjaGVzIHRoZSBmaWx0ZXIgdGV4dAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzTGVhZk1hdGNoKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlbGVtZW50KSB7CisJCVN0cmluZyBsYWJlbFRleHQgPSAoKElMYWJlbFByb3ZpZGVyKSAoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikKKwkJCQkuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRUZXh0KGVsZW1lbnQpOworCisJCWlmIChsYWJlbFRleHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB3b3JkTWF0Y2hlcyhsYWJlbFRleHQpOworCX0KKworCS8qKgorCSAqIFRha2UgdGhlIGdpdmVuIGZpbHRlciB0ZXh0IGFuZCBicmVhayBpdCBkb3duIGludG8gd29yZHMgdXNpbmcgYQorCSAqIEJyZWFrSXRlcmF0b3IuCisJICoKKwkgKiBAcGFyYW0gdGV4dAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygd29yZHMKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGdldFdvcmRzKFN0cmluZyB0ZXh0KSB7CisJCUxpc3Q8U3RyaW5nPiB3b3JkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyBCcmVhayB0aGUgdGV4dCB1cCBpbnRvIHdvcmRzLCBzZXBhcmF0aW5nIGJhc2VkIG9uIHdoaXRlc3BhY2UgYW5kCisJCS8vIGNvbW1vbiBwdW5jdHVhdGlvbi4KKwkJLy8gUHJldmlvdXNseSB1c2VkIFN0cmluZy5zcGxpdCguLi4sICJcXFciKSwgd2hlcmUgIlxXIiBpcyBhIHJlZ3VsYXIKKwkJLy8gZXhwcmVzc2lvbiAoc2VlIHRoZSBKYXZhZG9jIGZvciBjbGFzcyBQYXR0ZXJuKS4KKwkJLy8gTmVlZCB0byBhdm9pZCBib3RoIFN0cmluZy5zcGxpdCBhbmQgcmVndWxhciBleHByZXNzaW9ucywgaW4gb3JkZXIgdG8KKwkJLy8gY29tcGlsZSBhZ2FpbnN0IEpDTCBGb3VuZGF0aW9uIChidWcgODAwNTMpLgorCQkvLyBBbHNvIG5lZWQgdG8gZG8gdGhpcyBpbiBhbiBOTC1zZW5zaXRpdmUgd2F5LiBUaGUgdXNlIG9mIEJyZWFrSXRlcmF0b3IKKwkJLy8gd2FzIHN1Z2dlc3RlZCBpbiBidWcgOTA1NzkuCisJCUJyZWFrSXRlcmF0b3IgaXRlciA9IEJyZWFrSXRlcmF0b3IuZ2V0V29yZEluc3RhbmNlKCk7CisJCWl0ZXIuc2V0VGV4dCh0ZXh0KTsKKwkJaW50IGkgPSBpdGVyLmZpcnN0KCk7CisJCXdoaWxlIChpICE9IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yLkRPTkUgJiYgaSA8IHRleHQubGVuZ3RoKCkpIHsKKwkJCWludCBqID0gaXRlci5mb2xsb3dpbmcoaSk7CisJCQlpZiAoaiA9PSBqYXZhLnRleHQuQnJlYWtJdGVyYXRvci5ET05FKSB7CisJCQkJaiA9IHRleHQubGVuZ3RoKCk7CisJCQl9CisJCQkvLyBtYXRjaCB0aGUgd29yZAorCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQodGV4dC5jaGFyQXQoaSkpKSB7CisJCQkJU3RyaW5nIHdvcmQgPSB0ZXh0LnN1YnN0cmluZyhpLCBqKTsKKwkJCQl3b3Jkcy5hZGQod29yZCk7CisJCQl9CisJCQlpID0gajsKKwkJfQorCQlyZXR1cm4gd29yZHMudG9BcnJheShuZXcgU3RyaW5nW3dvcmRzLnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBpZiBhbnkgb2YgdGhlIHdvcmRzIGluIHRleHQgc2F0aXNmeSB0aGUgbWF0Y2gKKwkgKiBjcml0ZXJhLgorCSAqCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIG1hdGNoCisJICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9uZSBvZiB0aGUgd29yZHMgaW4gdGV4dCBzYXRpc2lmZXMKKwkgKiAgICAgICAgIHRoZSBtYXRjaCBjcml0ZXJpYS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB3b3JkTWF0Y2hlcyhTdHJpbmcgdGV4dCkgeworCQlpZiAodGV4dCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBJZiB0aGUgd2hvbGUgdGV4dCBtYXRjaGVzIHdlIGFyZSBhbGwgc2V0CisJCWlmIChtYXRjaCh0ZXh0KSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IG9mIHRoZSB3b3JkcyBvZiB0aGUgdGV4dCBtYXRjaGVzCisJCVN0cmluZ1tdIHdvcmRzID0gZ2V0V29yZHModGV4dCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyB3b3JkID0gd29yZHNbaV07CisJCQlpZiAobWF0Y2god29yZCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBDYW4gYmUgY2FsbGVkIGJ5IHRoZSBmaWx0ZXJlZCB0cmVlIHRvIHR1cm4gb24gY2FjaGluZy4KKwkgKgorCSAqIEBwYXJhbSB1c2VDYWNoZQorCSAqICAgICAgICAgICAgVGhlIHVzZUNhY2hlIHRvIHNldC4KKwkgKi8KKwl2b2lkIHNldFVzZUNhY2hlKGJvb2xlYW4gdXNlQ2FjaGUpIHsKKwkJdGhpcy51c2VDYWNoZSA9IHVzZUNhY2hlOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1NlYXJjaFBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1NlYXJjaFBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI2NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvU2VhcmNoUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsNjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5pbnRlcm5hbC5jb3B5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5VdGlsOworCisvKioKKyAqIEEgY29weSBvZiBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlYXJjaFBhdHRlcm4KKyAqLworcHVibGljIGNsYXNzIFNlYXJjaFBhdHRlcm4geworCisJLy8gUnVsZXMgZm9yIHBhdHRlcm4gbWF0Y2hpbmc6IChleGFjdCwgcHJlZml4LCBwYXR0ZXJuKSBbIHwgY2FzZSBzZW5zaXRpdmVdCisJLyoqCisJICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIG1hdGNoZXMgZXhhY3RseSB0aGUgc2VhcmNoIHJlc3VsdCwgdGhhdAorCSAqIGlzLCB0aGUgc291cmNlIG9mIHRoZSBzZWFyY2ggcmVzdWx0IGVxdWFscyB0aGUgc2VhcmNoIHBhdHRlcm4uIFNlYXJjaCBwYXR0ZXJuCisJICogc2hvdWxkIHN0YXJ0IGZyb20gbG93ZXJDYXNlIGNoYXIuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9FWEFDVF9NQVRDSCA9IDA7CisKKwkvKioKKwkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gaXMgYSBwcmVmaXggb2YgdGhlIHNlYXJjaCByZXN1bHQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9QUkVGSVhfTUFUQ0ggPSAweDAwMDE7CisKKwkvKioKKwkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUgd2lsZCBjYXJkcyAoJyonIG9yCisJICogJz8nKS4gQSAnKicgd2lsZC1jYXJkIGNhbiByZXBsYWNlIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2gKKwkgKiByZXN1bHQuIEEgJz8nIHdpbGQtY2FyZCByZXBsYWNlcyBleGFjdGx5IDEgY2hhcmFjdGVyIGluIHRoZSBzZWFyY2gKKwkgKiByZXN1bHQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9QQVRURVJOX01BVENIID0gMHgwMDAyOworCisJLyoqCisJICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHNlYXJjaCByZXN1bHQgb25seSBpZiBjYXNlcworCSAqIGFyZSB0aGUgc2FtZS4gQ2FuIGJlIGNvbWJpbmVkIHRvIHByZXZpb3VzIHJ1bGVzLCBlLmcuCisJICoge0BsaW5rICNSVUxFX0VYQUNUX01BVENIfSB8IHtAbGluayAjUlVMRV9DQVNFX1NFTlNJVElWRX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0NBU0VfU0VOU0lUSVZFID0gMHgwMDA4OworCisJLyoqCisJICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGlzIGJsYW5rLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQkxBTktfTUFUQ0ggPSAweDAwMjA7CisKKwkvKioKKwkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgYSBDYW1lbCBDYXNlIGV4cHJlc3Npb24uIDxicj4KKwkgKiBFeGFtcGxlczoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPk5QRTwvY29kZT4gdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG1hdGNoCisJICogPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+IGFuZAorCSAqIDxjb2RlPk5wUGVybWlzc2lvbkV4Y2VwdGlvbjwvY29kZT4gdHlwZXMsPC9saT4KKwkgKiA8bGk+PGNvZGU+TnVQb0V4PC9jb2RlPiB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgb25seSBtYXRjaAorCSAqIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiB0eXBlLjwvbGk+CisJICogPC91bD4KKwkgKgorCSAqCisJICogPGJyPgorCSAqIENhbiBiZSBjb21iaW5lZCB0byB7QGxpbmsgI1JVTEVfUFJFRklYX01BVENIfSBtYXRjaCBydWxlLiBGb3IgZXhhbXBsZSwKKwkgKiB3aGVuIHByZWZpeCBtYXRjaCBydWxlIGlzIGNvbWJpbmVkIHdpdGggQ2FtZWwgQ2FzZSBtYXRjaCBydWxlLAorCSAqIDxjb2RlPiJuUEUiPC9jb2RlPiBwYXR0ZXJuIHdpbGwgbWF0Y2ggPGNvZGU+blBFeGNlcHRpb248L2NvZGU+LiA8YnI+CisJICogTWF0Y2ggcnVsZSB7QGxpbmsgI1JVTEVfUEFUVEVSTl9NQVRDSH0gbWF5IGFsc28gYmUgY29tYmluZWQgYnV0IGJvdGgKKwkgKiBydWxlcyB3aWxsIG5vdCBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IGFzIHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKwkgKiBVc2VkIG1hdGNoIHJ1bGUgZGVwZW5kcyBvbiB3aGV0aGVyIHN0cmluZyBwYXR0ZXJuIGNvbnRhaW5zIHNwZWNpZmljCisJICogcGF0dGVybiBjaGFyYWN0ZXJzIChlLmcuICcqJyBvciAnPycpIG9yIG5vdC4gSWYgaXQgZG9lcywgdGhlbiBvbmx5CisJICogUGF0dGVybiBtYXRjaCBydWxlIHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlIG9ubHkgQ2FtZWwgQ2FzZSBtYXRjaCB3aWxsIGJlCisJICogdXNlZC4gRm9yIGV4YW1wbGUsIHdpdGggPGNvZGU+Ik5QRSI8L2NvZGU+IHN0cmluZyBwYXR0ZXJuLCBzZWFyY2ggd2lsbAorCSAqIG9ubHkgdXNlIENhbWVsIENhc2UgbWF0Y2ggcnVsZSwgYnV0IHdpdGggPGNvZGU+TipQKkUqPC9jb2RlPiBzdHJpbmcKKwkgKiBwYXR0ZXJuLCBpdCB3aWxsIHVzZSBvbmx5IFBhdHRlcm4gbWF0Y2ggcnVsZS4KKwkgKgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQ0FNRUxDQVNFX01BVENIID0gMHgwMDgwOworCisJcHJpdmF0ZSBpbnQgbWF0Y2hSdWxlOworCisJcHJpdmF0ZSBTdHJpbmcgc3RyaW5nUGF0dGVybjsKKworCXByaXZhdGUgU3RyaW5nIGluaXRpYWxQYXR0ZXJuOworCisJcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEVORF9TWU1CT0wgPSAnPCc7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFOWV9TVFJJTkcgPSAnKic7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEJMQU5LID0gJyAnOworCisJcHJpdmF0ZSBpbnQgYWxsb3dlZFJ1bGVzOworCisJLyoqCisJICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgU2VhcmNoUGF0dGVybiBEZWZhdWx0IGFsbG93ZWRSdWxlcyBmb3IgaXQgaXMKKwkgKiByZXN1bHQgb2YgYmVsb25nIGxvZ2ljIG9wZXJhdGlvbjogKCBSVUxFX0VYQUNUX01BVENIIHwgUlVMRV9QUkVGSVhfTUFUQ0ggfAorCSAqIFJVTEVfUEFUVEVSTl9NQVRDSCB8IFJVTEVfQ0FNRUxDQVNFX01BVENIICkKKwkgKgorCSAqLworCXB1YmxpYyBTZWFyY2hQYXR0ZXJuKCkgeworCQl0aGlzKFJVTEVfRVhBQ1RfTUFUQ0ggfCBSVUxFX1BSRUZJWF9NQVRDSCB8IFJVTEVfUEFUVEVSTl9NQVRDSAorCQkJCXwgUlVMRV9DQU1FTENBU0VfTUFUQ0ggfCBSVUxFX0JMQU5LX01BVENIKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgc2VhcmNoIHBhdHRlcm4gd2l0aCB0aGUgcnVsZSB0byBhcHBseSBmb3IgbWF0Y2hpbmcgaW5kZXgga2V5cy4KKwkgKiBJdCBjYW4gYmUgZXhhY3QgbWF0Y2gsIHByZWZpeCBtYXRjaCwgcGF0dGVybiBtYXRjaCBvciBjYW1lbENhc2UgbWF0Y2guCisJICogUnVsZSBjYW4gYWxzbyBiZSBjb21iaW5lZCB3aXRoIGEgY2FzZSBzZW5zaXRpdml0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIGFsbG93ZWRSdWxlcworCSAqICAgICAgICAgICAgb25lIG9mIHtAbGluayAjUlVMRV9FWEFDVF9NQVRDSH0sIHtAbGluayAjUlVMRV9QUkVGSVhfTUFUQ0h9LAorCSAqICAgICAgICAgICAge0BsaW5rICNSVUxFX1BBVFRFUk5fTUFUQ0h9LCB7QGxpbmsgI1JVTEVfQ0FTRV9TRU5TSVRJVkV9LAorCSAqICAgICAgICAgICAge0BsaW5rICNSVUxFX0NBTUVMQ0FTRV9NQVRDSH0gY29tYmluZWQgd2l0aCBvbmUgb2YgZm9sbG93aW5nCisJICogICAgICAgICAgICB2YWx1ZXM6IHtAbGluayAjUlVMRV9FWEFDVF9NQVRDSH0sIHtAbGluayAjUlVMRV9QUkVGSVhfTUFUQ0h9LAorCSAqICAgICAgICAgICAge0BsaW5rICNSVUxFX1BBVFRFUk5fTUFUQ0h9IG9yIHtAbGluayAjUlVMRV9DQU1FTENBU0VfTUFUQ0h9LgorCSAqICAgICAgICAgICAgZS5nLiB7QGxpbmsgI1JVTEVfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rICNSVUxFX0NBU0VfU0VOU0lUSVZFfQorCSAqICAgICAgICAgICAgaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwKKwkgKiAgICAgICAgICAgIHtAbGluayAjUlVMRV9QUkVGSVhfTUFUQ0h9IGlmIGEgcHJlZml4IG5vbiBjYXNlIHNlbnNpdGl2ZQorCSAqICAgICAgICAgICAgbWF0Y2ggaXMgcmVxdWVzdGVkIG9yIHtAbGluayAjUlVMRV9FWEFDVF9NQVRDSH0gaWYgYSBub24gY2FzZQorCSAqICAgICAgICAgICAgc2Vuc2l0aXZlIGFuZCBlcmFzdXJlIG1hdGNoIGlzIHJlcXVlc3RlZC48YnI+CisJICogICAgICAgICAgICBOb3RlIGFsc28gdGhhdCBkZWZhdWx0IGJlaGF2aW9yIGZvciBnZW5lcmljIHR5cGVzL21ldGhvZHMKKwkgKiAgICAgICAgICAgIHNlYXJjaCBpcyB0byBmaW5kIGV4YWN0IG1hdGNoZXMuCisJICovCisJcHVibGljIFNlYXJjaFBhdHRlcm4oaW50IGFsbG93ZWRSdWxlcykgeworCQl0aGlzLmFsbG93ZWRSdWxlcyA9IGFsbG93ZWRSdWxlczsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHN0cmluZyBwYXR0ZXJuIHVzZWQgYnkgbWF0Y2hlcgorCSAqCisJICogQHJldHVybiBwYXR0ZXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgeworCQlyZXR1cm4gdGhpcy5zdHJpbmdQYXR0ZXJuOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzdHJpbmdQYXR0ZXJuCisJICogICAgICAgICAgICBUaGUgc3RyaW5nUGF0dGVybiB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgc3RyaW5nUGF0dGVybikgeworCQl0aGlzLmluaXRpYWxQYXR0ZXJuID0gc3RyaW5nUGF0dGVybjsKKwkJdGhpcy5zdHJpbmdQYXR0ZXJuID0gc3RyaW5nUGF0dGVybjsKKwkJaW5pdGlhbGl6ZVBhdHRlcm5BbmRNYXRjaFJ1bGUoc3RyaW5nUGF0dGVybik7CisJCW1hdGNoUnVsZSA9IG1hdGNoUnVsZSAmIHRoaXMuYWxsb3dlZFJ1bGVzOworCQlpZiAobWF0Y2hSdWxlID09IFJVTEVfUEFUVEVSTl9NQVRDSCkgeworCQkJc3RyaW5nTWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHRoaXMuc3RyaW5nUGF0dGVybiwgdHJ1ZSwgZmFsc2UpOworCQl9CisJfQorCisJLyoqCisJICogTWF0Y2hlcyB0ZXh0IHdpdGggcGF0dGVybi4gbWF0Y2hpbmcgaXMgZGV0ZXJtaW5lIGJ5IG1hdGNoS2luZC4KKwkgKgorCSAqIEBwYXJhbSB0ZXh0CisJICogQHJldHVybiB0cnVlIGlmIHNlYXJjaCBwYXR0ZXJuIHdhcyBtYXRjaGVkIHdpdGggdGV4dCBmYWxzZSBpbiBvdGhlciB3YXkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyB0ZXh0KSB7CisJCXN3aXRjaCAobWF0Y2hSdWxlKSB7CisJCWNhc2UgUlVMRV9CTEFOS19NQVRDSDoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIFJVTEVfUEFUVEVSTl9NQVRDSDoKKwkJCXJldHVybiBzdHJpbmdNYXRjaGVyLm1hdGNoKHRleHQpOworCQljYXNlIFJVTEVfRVhBQ1RfTUFUQ0g6CisJCQlyZXR1cm4gc3RyaW5nUGF0dGVybi5lcXVhbHNJZ25vcmVDYXNlKHRleHQpOworCQljYXNlIFJVTEVfQ0FNRUxDQVNFX01BVENIOgorCQkJaWYgKGNhbWVsQ2FzZU1hdGNoKHN0cmluZ1BhdHRlcm4sIHRleHQpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQkvLyRGQUxMLVRIUk9VR0gkCisJCQlkZWZhdWx0OgorCQkJcmV0dXJuIHN0YXJ0c1dpdGhJZ25vcmVDYXNlKHRleHQsIHN0cmluZ1BhdHRlcm4pOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYXR0ZXJuQW5kTWF0Y2hSdWxlKFN0cmluZyBwYXR0ZXJuKSB7CisJCWludCBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOworCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCW1hdGNoUnVsZSA9IFJVTEVfQkxBTktfTUFUQ0g7CisJCQlzdHJpbmdQYXR0ZXJuID0gcGF0dGVybjsKKwkJCXJldHVybjsKKwkJfQorCQljaGFyIGxhc3QgPSBwYXR0ZXJuLmNoYXJBdChsZW5ndGggLSAxKTsKKworCQlpZiAocGF0dGVybi5pbmRleE9mKCcqJykgIT0gLTEgfHwgcGF0dGVybi5pbmRleE9mKCc/JykgIT0gLTEpIHsKKwkJCW1hdGNoUnVsZSA9IFJVTEVfUEFUVEVSTl9NQVRDSDsKKwkJCXN3aXRjaCAobGFzdCkgeworCQkJY2FzZSBFTkRfU1lNQk9MOgorCQkJY2FzZSBCTEFOSzoKKwkJCQlzdHJpbmdQYXR0ZXJuID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgbGVuZ3RoIC0gMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFOWV9TVFJJTkc6CisJCQkJc3RyaW5nUGF0dGVybiA9IHBhdHRlcm47CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0cmluZ1BhdHRlcm4gPSBwYXR0ZXJuICsgQU5ZX1NUUklORzsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh2YWxpZGF0ZU1hdGNoUnVsZShwYXR0ZXJuLCBSVUxFX0NBTUVMQ0FTRV9NQVRDSCkgPT0gUlVMRV9DQU1FTENBU0VfTUFUQ0gpIHsKKwkJCW1hdGNoUnVsZSA9IFJVTEVfQ0FNRUxDQVNFX01BVENIOworCQkJc3RyaW5nUGF0dGVybiA9IHBhdHRlcm47CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAobGFzdCA9PSBFTkRfU1lNQk9MIHx8IGxhc3QgPT0gQkxBTkspIHsKKwkJCW1hdGNoUnVsZSA9IFJVTEVfRVhBQ1RfTUFUQ0g7CisJCQlzdHJpbmdQYXR0ZXJuID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgbGVuZ3RoIC0gMSk7CisJCQlyZXR1cm47CisJCX0KKworCQltYXRjaFJ1bGUgPSBSVUxFX1BSRUZJWF9NQVRDSDsKKwkJc3RyaW5nUGF0dGVybiA9IHBhdHRlcm47CisKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdGV4dAorCSAqIEBwYXJhbSBwcmVmaXgKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGV4dCBzdGFydHMgd2l0aCBnaXZlbiBwcmVmaXgsIGlnbm9yaW5nIGNhc2UgZmFsc2UgaW4KKwkgKiAgICAgICAgIG90aGVyIHdheQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBzdGFydHNXaXRoSWdub3JlQ2FzZShTdHJpbmcgdGV4dCwgU3RyaW5nIHByZWZpeCkgeworCQlpbnQgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisJCWludCBwcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoKCk7CisJCWlmICh0ZXh0TGVuZ3RoIDwgcHJlZml4TGVuZ3RoKQorCQkJcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gcHJlZml4TGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UocHJlZml4LmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyCisJCQkJCS50b0xvd2VyQ2FzZSh0ZXh0LmNoYXJBdChpKSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lIHVzaW5nIENhbWVsQ2FzZSBydWxlcywKKwkgKiBvciBmYWxzZSBvdGhlcndpc2UuIENhbWVsQ2FzZSBtYXRjaGluZyBkb2VzIE5PVCBhY2NlcHQgZXhwbGljaXQKKwkgKiB3aWxkLWNhcmRzICcqJyBhbmQgJz8nIGFuZCBpcyBpbmhlcmVudGx5IGNhc2Ugc2Vuc2l0aXZlLiA8YnI+CisJICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0CisJICogc3BhY2VzLCBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBib3RoIHVwcGVyCisJICogYW5kIGxvd2VyIENhbWVsQ2FzZSwgZGVwZW5kaW5nIHdoZXRoZXIgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGlzCisJICogY2FwaXRhbGl6ZWQgb3Igbm90LiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzCisJICogYXNzdW1lZCB0byBjb250YWluIGEgc2VxdWVuY2Ugb2YgY2FwaXRhbHMgd2hpY2ggYXJlIGFwcGVhcmluZyBpbiB0aGUKKwkgKiBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorCSAqICdOZXdQZXJmRGF0YScuIEEgbG93ZXIgQ2FtZWxDYXNlIHBhdHRlcm4gdXNlcyBhIGxvd2VyY2FzZSBmaXJzdAorCSAqIGNoYXJhY3Rlci4gSW4gSmF2YSwgdHlwZSBuYW1lcyBmb2xsb3cgdGhlIHVwcGVyIENhbWVsQ2FzZSBjb252ZW50aW9uLAorCSAqIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIgQ2FtZWxDYXNlIGNvbnZlbnRpb24uIDxicj4KKwkgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaCBpbiBhCisJICogY2FzZSBzZW5zaXRpdmUgd2F5LiBUaGVzZSBjaGFyYWN0ZXJzIG11c3QgYXBwZWFyIGluIHNlcXVlbmNlIGluIHRoZSBuYW1lLgorCSAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorCSAqICdOdWxsUG9pbnRlckV4Q0VQVElPTicgb3IgJ051UG9FeCcgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQKKwkgKiBub3QgJ05vUG9pbnRlckV4Y2VwdGlvbicuIDxicj4KKwkgKiA8YnI+CisJICogRXhhbXBsZXM6CisJICogPG9sPgorCSAqIDxsaT4KKwkgKgorCSAqIDxwcmU+CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAmcXVvdDtOUEUmcXVvdDsKKwkgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uIC8gTm9QZXJtaXNzaW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgIHJlc3VsdCA9Jmd0OyB0cnVlCisJICogPC9wcmU+CisJICoKKwkgKiA8L2xpPgorCSAqIDxsaT4KKwkgKgorCSAqIDxwcmU+CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAmcXVvdDtOdVBvRXgmcXVvdDsKKwkgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgIHJlc3VsdCA9Jmd0OyB0cnVlCisJICogPC9wcmU+CisJICoKKwkgKiA8L2xpPgorCSAqIDxsaT4KKwkgKgorCSAqIDxwcmU+CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAmcXVvdDtucGUmcXVvdDsKKwkgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgIHJlc3VsdCA9Jmd0OyBmYWxzZQorCSAqIDwvcHJlPgorCSAqCisJICogPC9saT4KKwkgKiA8L29sPgorCSAqCisJICogQHBhcmFtIHBhdHRlcm4KKwkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBwYXR0ZXJuCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBuYW1lCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQorCSAqCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNhbWVsQ2FzZU1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgbmFtZSkgeworCQlpZiAocGF0dGVybiA9PSBudWxsKQorCQkJcmV0dXJuIHRydWU7IC8vIG51bGwgcGF0dGVybiBpcyBlcXVpdmFsZW50IHRvICcqJworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisKKwkJcmV0dXJuIGNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIDAsIHBhdHRlcm4ubGVuZ3RoKCksIG5hbWUsIDAsIG5hbWUKKwkJCQkubGVuZ3RoKCkpOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdHJ1ZSBpZiBhIHN1Yi1wYXR0ZXJuIG1hdGNoZXMgdGhlIHN1YnBhcnQgb2YgdGhlIGdpdmVuIG5hbWUgdXNpbmcKKwkgKiBDYW1lbENhc2UgcnVsZXMsIG9yIGZhbHNlIG90aGVyd2lzZS4gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdAorCSAqIGV4cGxpY2l0IHdpbGQtY2FyZHMgJyonIGFuZCAnPycgYW5kIGlzIGluaGVyZW50bHkgY2FzZSBzZW5zaXRpdmUuIENhbgorCSAqIG1hdGNoIG9ubHkgc3Vic2V0IG9mIG5hbWUvcGF0dGVybiwgY29uc2lkZXJpbmcgZW5kIHBvc2l0aW9ucyBhcworCSAqIG5vbi1pbmNsdXNpdmUuIFRoZSBzdWJwYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQKKwkgKiBwYXR0ZXJuRW5kIHBvc2l0aW9ucy4gPGJyPgorCSAqIENhbWVsQ2FzZSBkZW5vdGVzIHRoZSBjb252ZW50aW9uIG9mIHdyaXRpbmcgY29tcG91bmQgbmFtZXMgd2l0aG91dAorCSAqIHNwYWNlcywgYW5kIGNhcGl0YWxpemluZyBldmVyeSB0ZXJtLiBUaGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgYm90aCB1cHBlcgorCSAqIGFuZCBsb3dlciBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcworCSAqIGNhcGl0YWxpemVkIG9yIG5vdC4gVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcworCSAqIGFzc3VtZWQgdG8gY29udGFpbiBhIHNlcXVlbmNlIG9mIGNhcGl0YWxzIHdoaWNoIGFyZSBhcHBlYXJpbmcgaW4gdGhlCisJICogbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKwkgKiAnTmV3UGVyZkRhdGEnLiBBIGxvd2VyIENhbWVsQ2FzZSBwYXR0ZXJuIHVzZXMgYSBsb3dlcmNhc2UgZmlyc3QKKwkgKiBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlciBDYW1lbENhc2UgY29udmVudGlvbiwKKwkgKiB3aGVyZWFzIG1ldGhvZCBvciBmaWVsZCBuYW1lcyBmb2xsb3cgdGhlIGxvd2VyIENhbWVsQ2FzZSBjb252ZW50aW9uLiA8YnI+CisJICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgbWF0Y2ggaW4gYQorCSAqIGNhc2Ugc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKwkgKiBGb3IgaW5zdGFuY2UsICdOUEV4Y2VwJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKwkgKiAnTnVsbFBvaW50ZXJFeENFUFRJT04nIG9yICdOdVBvRXgnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0CisJICogbm90ICdOb1BvaW50ZXJFeGNlcHRpb24nLiA8YnI+CisJICogPGJyPgorCSAqIEV4YW1wbGVzOgorCSAqIDxvbD4KKwkgKiA8bGk+CisJICoKKwkgKiA8cHJlPgorCSAqICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJnF1b3Q7TlBFJnF1b3Q7CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCA9IDAKKwkgKiAgICAgICAgICAgICAgICAgcGF0dGVybkVuZCA9IDMKKwkgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgIG5hbWVTdGFydCA9IDAKKwkgKiAgICAgICAgICAgICAgICAgbmFtZUVuZCA9IDIwCisJICogICAgICAgICAgICAgICAgIHJlc3VsdCA9Jmd0OyB0cnVlCisJICogPC9wcmU+CisJICoKKwkgKiA8L2xpPgorCSAqIDxsaT4KKwkgKgorCSAqIDxwcmU+CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAmcXVvdDtOUEUmcXVvdDsKKwkgKiAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ID0gMAorCSAqICAgICAgICAgICAgICAgICBwYXR0ZXJuRW5kID0gMworCSAqICAgICAgICAgICAgICAgICBuYW1lID0gTm9QZXJtaXNzaW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgIG5hbWVTdGFydCA9IDAKKwkgKiAgICAgICAgICAgICAgICAgbmFtZUVuZCA9IDIxCisJICogICAgICAgICAgICAgICAgIHJlc3VsdCA9Jmd0OyB0cnVlCisJICogPC9wcmU+CisJICoKKwkgKiA8L2xpPgorCSAqIDxsaT4KKwkgKgorCSAqIDxwcmU+CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAmcXVvdDtOdVBvRXgmcXVvdDsKKwkgKiAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ID0gMAorCSAqICAgICAgICAgICAgICAgICBwYXR0ZXJuRW5kID0gNgorCSAqICAgICAgICAgICAgICAgICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICAgbmFtZVN0YXJ0ID0gMAorCSAqICAgICAgICAgICAgICAgICBuYW1lRW5kID0gMjAKKwkgKiAgICAgICAgICAgICAgICAgcmVzdWx0ID0mZ3Q7IHRydWUKKwkgKiA8L3ByZT4KKwkgKgorCSAqIDwvbGk+CisJICogPGxpPgorCSAqCisJICogPHByZT4KKwkgKiAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICZxdW90O051UG9FeCZxdW90OworCSAqICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQgPSAwCisJICogICAgICAgICAgICAgICAgIHBhdHRlcm5FbmQgPSA2CisJICogICAgICAgICAgICAgICAgIG5hbWUgPSBOb1Blcm1pc3Npb25FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICAgbmFtZVN0YXJ0ID0gMAorCSAqICAgICAgICAgICAgICAgICBuYW1lRW5kID0gMjEKKwkgKiAgICAgICAgICAgICAgICAgcmVzdWx0ID0mZ3Q7IGZhbHNlCisJICogPC9wcmU+CisJICoKKwkgKiA8L2xpPgorCSAqIDxsaT4KKwkgKgorCSAqIDxwcmU+CisJICogICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAmcXVvdDtucGUmcXVvdDsKKwkgKiAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ID0gMAorCSAqICAgICAgICAgICAgICAgICBwYXR0ZXJuRW5kID0gMworCSAqICAgICAgICAgICAgICAgICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICAgbmFtZVN0YXJ0ID0gMAorCSAqICAgICAgICAgICAgICAgICBuYW1lRW5kID0gMjAKKwkgKiAgICAgICAgICAgICAgICAgcmVzdWx0ID0mZ3Q7IGZhbHNlCisJICogPC9wcmU+CisJICoKKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICoKKwkgKiBAcGFyYW0gcGF0dGVybgorCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHBhdHRlcm4KKwkgKiBAcGFyYW0gcGF0dGVyblN0YXJ0CisJICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHBhdHRlcm4sIGluY2x1c2l2ZQorCSAqIEBwYXJhbSBwYXR0ZXJuRW5kCisJICogICAgICAgICAgICB0aGUgZW5kIGluZGV4IG9mIHRoZSBwYXR0ZXJuLCBleGNsdXNpdmUKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUKKwkgKiBAcGFyYW0gbmFtZVN0YXJ0CisJICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIG5hbWUsIGluY2x1c2l2ZQorCSAqIEBwYXJhbSBuYW1lRW5kCisJICogICAgICAgICAgICB0aGUgZW5kIGluZGV4IG9mIHRoZSBuYW1lLCBleGNsdXNpdmUKKwkgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWJwYXJ0IG9mIHRoZSBnaXZlbiBuYW1lLAorCSAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNhbWVsQ2FzZU1hdGNoKFN0cmluZyBwYXR0ZXJuLCBpbnQgcGF0dGVyblN0YXJ0LAorCQkJaW50IHBhdHRlcm5FbmQsIFN0cmluZyBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgeworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisJCWlmIChwYXR0ZXJuID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsgLy8gbnVsbCBwYXR0ZXJuIGlzIGVxdWl2YWxlbnQgdG8gJyonCisJCWlmIChwYXR0ZXJuRW5kIDwgMCkKKwkJCXBhdHRlcm5FbmQgPSBwYXR0ZXJuLmxlbmd0aCgpOworCQlpZiAobmFtZUVuZCA8IDApCisJCQluYW1lRW5kID0gbmFtZS5sZW5ndGgoKTsKKworCQlpZiAocGF0dGVybkVuZCA8PSBwYXR0ZXJuU3RhcnQpCisJCQlyZXR1cm4gbmFtZUVuZCA8PSBuYW1lU3RhcnQ7CisJCWlmIChuYW1lRW5kIDw9IG5hbWVTdGFydCkKKwkJCXJldHVybiBmYWxzZTsKKwkJLy8gY2hlY2sgZmlyc3QgcGF0dGVybiBjaGFyCisJCWlmIChuYW1lLmNoYXJBdChuYW1lU3RhcnQpICE9IHBhdHRlcm4uY2hhckF0KHBhdHRlcm5TdGFydCkpIHsKKwkJCS8vIGZpcnN0IGNoYXIgbXVzdCBzdHJpY3RseSBtYXRjaCAodXBwZXIvbG93ZXIpCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpbnQgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm5FbmQ7CisKKwkJaWYgKHBhdHRlcm4uY2hhckF0KHBhdHRlcm5FbmQgLSAxKSA9PSBFTkRfU1lNQk9MIHx8IHBhdHRlcm4uY2hhckF0KHBhdHRlcm5FbmQgLSAxKSA9PSBCTEFOSyApCisJCQlwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybkVuZCAtIDE7CisKKworCQljaGFyIHBhdHRlcm5DaGFyLCBuYW1lQ2hhcjsKKwkJaW50IGlQYXR0ZXJuID0gcGF0dGVyblN0YXJ0OworCQlpbnQgaU5hbWUgPSBuYW1lU3RhcnQ7CisKKwkJLy8gTWFpbiBsb29wIGlzIG9uIHBhdHRlcm4gY2hhcmFjdGVycworCQl3aGlsZSAodHJ1ZSkgeworCisJCQlpUGF0dGVybisrOworCQkJaU5hbWUrKzsKKworCQkJCWlmIChpUGF0dGVybiA9PSBwYXR0ZXJuRW5kKSB7CisJCQkJLy8gV2UgaGF2ZSBleGhhdXN0ZWQgcGF0dGVybiwgc28gaXQncyBhIG1hdGNoCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCWlmIChpTmFtZSA9PSBuYW1lRW5kKSB7CisJCQkJaWYgKGlQYXR0ZXJuID09IHBhdHRlcm5MZW5ndGgpCisJCQkJCXJldHVybiB0cnVlOworCQkJCS8vIFdlIGhhdmUgZXhoYXVzdGVkIG5hbWUgKGFuZCBub3QgcGF0dGVybiksIHNvIGl0J3Mgbm90IGEgbWF0Y2gKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIEZvciBhcyBsb25nIGFzIHdlJ3JlIGV4YWN0bHkgbWF0Y2hpbmcsIGJyaW5nIGl0IG9uIChldmVuIGlmIGl0J3MKKwkJCS8vIGEgbG93ZXIgY2FzZSBjaGFyYWN0ZXIpCisJCQlpZiAoKHBhdHRlcm5DaGFyID0gcGF0dGVybi5jaGFyQXQoaVBhdHRlcm4pKSA9PSBuYW1lLmNoYXJBdChpTmFtZSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gSWYgY2hhcmFjdGVycyBhcmUgbm90IGVxdWFscywgdGhlbiBpdCdzIG5vdCBhIG1hdGNoIGlmCisJCQkvLyBwYXR0ZXJuQ2hhciBpcyBsb3dlcmNhc2UKKwkJCWlmICghaXNQYXR0ZXJuQ2hhckFsbG93ZWQocGF0dGVybkNoYXIpKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJLy8gcGF0dGVybkNoYXIgaXMgdXBwZXJjYXNlLCBzbyBsZXQncyBmaW5kIHRoZSBuZXh0IHVwcGVyY2FzZSBpbgorCQkJLy8gbmFtZQorCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCkgeworCQkJCQlpZiAoKGlQYXR0ZXJuID09IHBhdHRlcm5MZW5ndGgpICYmIChwYXR0ZXJuQ2hhciA9PSBFTkRfU1lNQk9MIHx8IHBhdHRlcm5DaGFyID09IEJMQU5LKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJbmFtZUNoYXIgPSBuYW1lLmNoYXJBdChpTmFtZSk7CisKKwkJCQlpZiAoKGlQYXR0ZXJuID09IHBhdHRlcm5MZW5ndGgpICYmIChwYXR0ZXJuQ2hhciA9PSBFTkRfU1lNQk9MIHx8IHBhdHRlcm5DaGFyID09IEJMQU5LKSkgeworCQkJCQlpZiAoaXNOYW1lQ2hhckFsbG93ZWQobmFtZUNoYXIpKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJaU5hbWUrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KG5hbWVDaGFyKSkgeworCQkJCQkvLyBuYW1lQ2hhciBpcyBkaWdpdCA9PiBicmVhayBpZiB0aGUgZGlnaXQgaXMgY3VycmVudCBwYXR0ZXJuIGNoYXJhY3RlciBvdGhlcndpc2UgY29uc3VtZSBpdAorCQkJCQlpZiAocGF0dGVybkNoYXIgPT0gbmFtZUNoYXIpIGJyZWFrOworCQkJCQlpTmFtZSsrOworCQkJCX0gZWxzZSBpZiAoIWlzTmFtZUNoYXJBbGxvd2VkKG5hbWVDaGFyKSkgeworCQkJCQkvLyBuYW1lQ2hhciBpcyBsb3dlcmNhc2UKKwkJCQkJaU5hbWUrKzsKKwkJCQkvLyBuYW1lQ2hhciBpcyB1cHBlcmNhc2UuLi4KKwkJCQl9IGVsc2UgaWYgKHBhdHRlcm5DaGFyICE9IG5hbWVDaGFyKSB7CisJCQkJCS8vIC4uIGFuZCBpdCBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuQ2hhciwgc28gaXQncyBub3QgYSBtYXRjaAorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gLi4gYW5kIGl0IG1hdGNoZWQgcGF0dGVybkNoYXIuIEJhY2sgdG8gdGhlIGJpZyBsb29wCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIEF0IHRoaXMgcG9pbnQsIGVpdGhlciBuYW1lIGhhcyBiZWVuIGV4aGF1c3RlZCwgb3IgaXQgaXMgYXQgYW4KKwkJCS8vIHVwcGVyY2FzZSBsZXR0ZXIuCisJCQkvLyBTaW5jZSBwYXR0ZXJuIGlzIGFsc28gYXQgYW4gdXBwZXJjYXNlIGxldHRlcgorCQl9CisJfQorCisJLyoqCisJICogQ2hlY2tzIHBhdHRlcm4ncyBjaGFyYWN0ZXIgaXMgYWxsb3dlZCBmb3Igc3BlY2lmaWVkIHNldC4gSXQgY291bGQgYmUKKwkgKiBvdmVycmlkZSBpZiB5b3Ugd2FudCBjaGFuZ2UgbG9naWMgb2YgY2FtZWxDYXNlTWF0Y2ggbWV0aG9kcy4KKwkgKgorCSAqIEBwYXJhbSBwYXR0ZXJuQ2hhcgorCSAqIEByZXR1cm4gdHJ1ZSBpZiBwYXR0ZXJuQ2hhciBpcyBpbiBzZXQgb2YgYWxsb3dlZCBjaGFyYWN0ZXJzIGZvciBwYXR0ZXJuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXR0ZXJuQ2hhckFsbG93ZWQoY2hhciBwYXR0ZXJuQ2hhcikgeworCQlyZXR1cm4gcGF0dGVybkNoYXIgPT0gRU5EX1NZTUJPTCB8fCBwYXR0ZXJuQ2hhciA9PSBCTEFOSworCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHBhdHRlcm5DaGFyKSB8fCBDaGFyYWN0ZXIuaXNEaWdpdChwYXR0ZXJuQ2hhcik7CisJfQorCisJLyoqCisJICogQ2hlY2tzIGNoYXJhY3RlciBvZiBlbGVtZW50J3MgbmFtZSBpcyBhbGxvd2VkIGZvciBzcGVjaWZpZWQgc2V0LiBJdCBjb3VsZAorCSAqIGJlIG92ZXJyaWRlIGlmIHlvdSB3YW50IGNoYW5nZSBsb2dpYyBvZiBjYW1lbENhc2VNYXRjaCBtZXRob2RzLgorCSAqCisJICogQHBhcmFtIG5hbWVDaGFyIC0KKwkgKiAgICAgICAgICAgIG5hbWUgb2Ygc2VhcmNoZWQgZWxlbWVudAorCSAqIEByZXR1cm4gaWYgbmFtZUNoYXIgaXMgaW4gc2V0IG9mIGFsbG93ZWQgY2hhcmFjdGVycyBmb3IgbmFtZSBvZiBlbGVtZW50CisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lQ2hhckFsbG93ZWQoY2hhciBuYW1lQ2hhcikgeworCQlyZXR1cm4gQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKG5hbWVDaGFyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBydWxlIHRvIGFwcGx5IGZvciBtYXRjaGluZyBrZXlzLiBDYW4gYmUgZXhhY3QgbWF0Y2gsIHByZWZpeAorCSAqIG1hdGNoLCBwYXR0ZXJuIG1hdGNoIG9yIGNhbWVsY2FzZSBtYXRjaC4gUnVsZSBjYW4gYWxzbyBiZSBjb21iaW5lZCB3aXRoIGEKKwkgKiBjYXNlIHNlbnNpdGl2aXR5IGZsYWcuCisJICoKKwkgKiBAcmV0dXJuIG9uZSBvZiBSVUxFX0VYQUNUX01BVENILCBSVUxFX1BSRUZJWF9NQVRDSCwgUlVMRV9QQVRURVJOX01BVENILAorCSAqICAgICAgICAgUlVMRV9DQU1FTENBU0VfTUFUQ0gsIGNvbWJpbmVkIHdpdGggUlVMRV9DQVNFX1NFTlNJVElWRSwgZS5nLgorCSAqICAgICAgICAgUlVMRV9FWEFDVF9NQVRDSCB8IFJVTEVfQ0FTRV9TRU5TSVRJVkUgaWYgYW4gZXhhY3QgYW5kIGNhc2UKKwkgKiAgICAgICAgIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsIG9yIFJVTEVfUFJFRklYX01BVENIIGlmIGEgcHJlZml4CisJICogICAgICAgICBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWF0Y2hSdWxlKCkgeworCQlyZXR1cm4gdGhpcy5tYXRjaFJ1bGU7CisJfQorCisJLyoqCisJICogVmFsaWRhdGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGdpdmVuIHN0cmluZyBwYXR0ZXJuIGFuZCBtYXRjaCBydWxlLiA8YnI+CisJICogT3B0aW1pemVkIChpZS4gcmV0dXJuZWQgbWF0Y2ggcnVsZSBpcyBtb2RpZmllZCkgY29tYmluYXRpb25zIGFyZToKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjUlVMRV9QQVRURVJOX01BVENIfSB3aXRob3V0IGFueSAnKicgb3IgJz8nIGluIHN0cmluZyBwYXR0ZXJuOiBwYXR0ZXJuIG1hdGNoIGJpdAorCSAqIGlzIHVuc2V0LDwvbGk+CisJICogPGxpPntAbGluayAjUlVMRV9QQVRURVJOX01BVENIfSBhbmQge0BsaW5rICNSVUxFX1BSRUZJWF9NQVRDSH0gYml0cyBzaW11bHRhbmVvdXNseSBzZXQ6CisJICogcHJlZml4IG1hdGNoIGJpdCBpcyB1bnNldCw8L2xpPgorCSAqIDxsaT57QGxpbmsgI1JVTEVfUEFUVEVSTl9NQVRDSH0gYW5kIHtAbGluayAjUlVMRV9DQU1FTENBU0VfTUFUQ0h9IGJpdHMgc2ltdWx0YW5lb3VzbHkgc2V0OgorCSAqIGNhbWVsIGNhc2UgbWF0Y2ggYml0IGlzIHVuc2V0LDwvbGk+CisJICogPGxpPntAbGluayAjUlVMRV9DQU1FTENBU0VfTUFUQ0h9IHdpdGggaW52YWxpZCBjb21iaW5hdGlvbiBvZiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZQorCSAqIGNoYXJhY3RlcnM6IGNhbWVsIGNhc2UgbWF0Y2ggYml0IGlzIHVuc2V0IGFuZCByZXBsYWNlZCB3aXRoIHByZWZpeCBtYXRjaCBwYXR0ZXJuLDwvbGk+CisJICogPGxpPntAbGluayAjUlVMRV9DQU1FTENBU0VfTUFUQ0h9IGNvbWJpbmVkIHdpdGgge0BsaW5rICNSVUxFX1BSRUZJWF9NQVRDSH0gYW5kCisJICoge0BsaW5rICNSVUxFX0NBU0VfU0VOU0lUSVZFfSBiaXRzIGlzIHJlZHVjZWQgdG8gb25seSB7QGxpbmsgI1JVTEVfQ0FNRUxDQVNFX01BVENIfSBhcyBDYW1lbAorCSAqIENhc2Ugc2VhcmNoIGlzIGFscmVhZHkgcHJlZml4IGFuZCBjYXNlIHNlbnNpdGl2ZSw8L2xpPgorCSAqIDwvdWw+CisJICogPGJyPgorCSAqIFJlamVjdGVkIChpZS4gcmV0dXJuZWQgbWF0Y2ggcnVsZSAtMSkgY29tYmluYXRpb25zIGFyZToKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjUlVMRV9QQVRURVJOX01BVENIfSB3aXRoIGFueSBvdGhlciBtYXRjaCBtb2RlIGJpdCBzZXQsPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIHN0cmluZ1BhdHRlcm4gVGhlIHN0cmluZyBwYXR0ZXJuCisJICogQHBhcmFtIG1hdGNoUnVsZSBUaGUgbWF0Y2ggcnVsZQorCSAqIEByZXR1cm4gT3B0aW1pemVkIHZhbGlkIG1hdGNoIHJ1bGUgb3IgLTEgaWYgYW4gaW5jb21wYXRpYmlsaXR5IHdhcyBkZXRlY3RlZC4KKwkgKi8KKwlwcml2YXRlIGludCB2YWxpZGF0ZU1hdGNoUnVsZShTdHJpbmcgc3RyaW5nUGF0dGVybiwgaW50IG1hdGNoUnVsZSkgeworCisJCS8vIFZlcmlmeSBQYXR0ZXJuIG1hdGNoIHJ1bGUKKwkJaW50IHN0YXJJbmRleCA9IHN0cmluZ1BhdHRlcm4uaW5kZXhPZignKicpOworCQlpbnQgcXVlc3Rpb25JbmRleCA9IHN0cmluZ1BhdHRlcm4uaW5kZXhPZignPycpOworCQlpZiAoc3RhckluZGV4IDwgMCAmJiBxdWVzdGlvbkluZGV4IDwgMCkgeworCQkJLy8gcmVzZXQgcGF0dGVybiBtYXRjaCBiaXQgaWYgYW55CisJCQltYXRjaFJ1bGUgJj0gflJVTEVfUEFUVEVSTl9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCS8vIGZvcmNlIFBhdHRlcm4gcnVsZQorCQkJbWF0Y2hSdWxlIHw9IFJVTEVfUEFUVEVSTl9NQVRDSDsKKwkJfQorCQlpZiAoKG1hdGNoUnVsZSAmIFJVTEVfUEFUVEVSTl9NQVRDSCkgIT0gMCkgeworCQkJLy8gcmVtb3ZlIENhbWVsIENhc2UgYW5kIFByZWZpeCBtYXRjaCBiaXRzIGlmIGFueQorCQkJbWF0Y2hSdWxlICY9IH5SVUxFX0NBTUVMQ0FTRV9NQVRDSDsKKwkJCW1hdGNoUnVsZSAmPSB+UlVMRV9QUkVGSVhfTUFUQ0g7CisJCX0KKworCQkvLyBWZXJpZnkgQ2FtZWwgQ2FzZSBtYXRjaCBydWxlCisJCWlmICgobWF0Y2hSdWxlICYgUlVMRV9DQU1FTENBU0VfTUFUQ0gpICE9IDApIHsKKwkJCS8vIFZlcmlmeSBzdGluZyBwYXR0ZXJuIHZhbGlkaXR5CisJCQlpbnQgbGVuZ3RoID0gc3RyaW5nUGF0dGVybi5sZW5ndGgoKTsKKwkJCWJvb2xlYW4gdmFsaWRDYW1lbENhc2UgPSB0cnVlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggJiYgdmFsaWRDYW1lbENhc2U7IGkrKykgeworCQkJCWNoYXIgY2ggPSBzdHJpbmdQYXR0ZXJuLmNoYXJBdChpKTsKKwkJCQl2YWxpZENhbWVsQ2FzZSA9IGlzVmFsaWRDYW1lbENhc2VDaGFyKGNoKTsKKwkJCX0KKwkJCXZhbGlkQ2FtZWxDYXNlID0gdmFsaWRDYW1lbENhc2UgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1BhdHRlcm4uY2hhckF0KDApKTsKKwkJCS8vIFZlcmlmeSBiaXRzIGNvbXBhdGliaWxpdHkKKwkJCWlmICh2YWxpZENhbWVsQ2FzZSkgeworCQkJCWlmICgobWF0Y2hSdWxlICYgUlVMRV9QUkVGSVhfTUFUQ0gpICE9IDApIHsKKwkJCQkJaWYgKChtYXRjaFJ1bGUgJiBSVUxFX0NBU0VfU0VOU0lUSVZFKSAhPSAwKSB7CisJCQkJCQkvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gQ2FtZWwgQ2FzZSBtYXRjaCBydWxlCisJCQkJCQltYXRjaFJ1bGUgJj0gflJVTEVfUFJFRklYX01BVENIOworCQkJCQkJbWF0Y2hSdWxlICY9IH5SVUxFX0NBU0VfU0VOU0lUSVZFOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltYXRjaFJ1bGUgJj0gflJVTEVfQ0FNRUxDQVNFX01BVENIOworCQkJCWlmICgobWF0Y2hSdWxlICYgUlVMRV9QUkVGSVhfTUFUQ0gpID09IDApIHsKKwkJCQkJbWF0Y2hSdWxlIHw9IFJVTEVfUFJFRklYX01BVENIOworCQkJCQltYXRjaFJ1bGUgfD0gUlVMRV9DQVNFX1NFTlNJVElWRTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG1hdGNoUnVsZTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBpZiBjaGFyYWN0ZXIgaXMgdmFsaWQgY2FtZWxDYXNlIGNoYXJhY3RlcgorCSAqCisJICogQHBhcmFtIGNoCisJICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gYmUgdmFsaWRhdGVkCisJICogQHJldHVybiB0cnVlIGlmIGNoYXJhY3RlciBpcyB2YWxpZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRDYW1lbENhc2VDaGFyKGNoYXIgY2gpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGVsbHMgd2hldGhlciB0aGUgZ2l2ZW4gPGNvZGU+U2VhcmNoUGF0dGVybjwvY29kZT4gZXF1YWxzIHRoaXMgcGF0dGVybi4KKwkgKgorCSAqIEBwYXJhbSBwYXR0ZXJuCisJICogICAgICAgICAgICBwYXR0ZXJuIHRvIGJlIGNoZWNrZWQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHBhdHRlcm4gZXF1YWxzIHRoaXMgc2VhcmNoIHBhdHRlcm4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHNQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gcGF0dGVybikgeworCQlyZXR1cm4gdHJpbVdpbGRjYXJkQ2hhcmFjdGVycyhwYXR0ZXJuLmluaXRpYWxQYXR0ZXJuKS5lcXVhbHMoCisJCQkJdHJpbVdpbGRjYXJkQ2hhcmFjdGVycyh0aGlzLmluaXRpYWxQYXR0ZXJuKSk7CisJfQorCisJLyoqCisJICogVGVsbHMgd2hldGhlciB0aGUgZ2l2ZW4gPGNvZGU+U2VhcmNoUGF0dGVybjwvY29kZT4gaXMgYSBzdWItcGF0dGVybiBvZgorCSAqIHRoaXMgcGF0dGVybi4KKwkgKiA8cD4KKwkgKiA8aT5XQVJOSU5HOiBUaGlzIG1ldGhvZCBpcyA8Yj5ub3Q8L2I+IGRlZmluZWQgaW4gcmVhZGluZyBvcmRlciwgaS5lLgorCSAqIDxjb2RlPmEuaXNTdWJQYXR0ZXJuKGIpPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiBpZmYKKwkgKiA8Y29kZT5iPC9jb2RlPiBpcyBhIHN1Yi1wYXR0ZXJuIG9mIDxjb2RlPmE8L2NvZGU+LCBhbmQgbm90IHZpY2UtdmVyc2EuCisJICogPC9pPgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBwYXR0ZXJuCisJICogICAgICAgICAgICBwYXR0ZXJuIHRvIGJlIGNoZWNrZWQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHBhdHRlcm4gaXMgYSBzdWIgcGF0dGVybiBvZiB0aGlzIHNlYXJjaCBwYXR0ZXJuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdWJQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gcGF0dGVybikgeworCQlyZXR1cm4gdHJpbVdpbGRjYXJkQ2hhcmFjdGVycyhwYXR0ZXJuLmluaXRpYWxQYXR0ZXJuKS5zdGFydHNXaXRoKAorCQkJCXRyaW1XaWxkY2FyZENoYXJhY3RlcnModGhpcy5pbml0aWFsUGF0dGVybikpOworCX0KKworCS8qKgorCSAqIFRyaW1zIHNlcXVlbmNlcyBvZiAnKicgY2hhcmFjdGVycworCSAqCisJICogQHBhcmFtIHBhdHRlcm4KKwkgKiAgICAgICAgICAgIHN0cmluZyB0byBiZSB0cmltbWVkCisJICogQHJldHVybiB0cmltbWVkIHBhdHRlcm4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyB0cmltV2lsZGNhcmRDaGFyYWN0ZXJzKFN0cmluZyBwYXR0ZXJuKSB7CisJCXJldHVybiBVdGlsLnJlcGxhY2VBbGwocGF0dGVybiwgIlxcKisiLCAiXFwqIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvU2hvd1ZpZXdEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1Nob3dWaWV3RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNDkyNQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1Nob3dWaWV3RGlhbG9nLmphdmEKQEAgLTAsMCArMSw0NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTZWJhc3RpYW4gRGF2aWRzIC0gYnVnIDEyODUyNiwgYnVnIDEyODUyOQorICogICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAZ21haWwuY29tPiAtIEJ1ZyA0NDAzODEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LldvcmtiZW5jaFNXVEFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5Mb2NhbGl6YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmRlc2NyaXB0b3IuYmFzaWMuTVBhcnREZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dMYWJlbEtleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qb3B1cERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuU2hvd1ZpZXdEaWFsb2cuCisgKi8KK3B1YmxpYyBjbGFzcyBTaG93Vmlld0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzCisJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElEb3VibGVDbGlja0xpc3RlbmVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR19TRUNUSU9OX05BTUUgPSAiU2hvd1ZpZXdEaWFsb2ciOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9IRUlHSFQgPSAzMDA7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9XSURUSCA9IDI1MDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9FWFBBTkRFRF9DQVRFR09SSUVTX0lEID0gRElBTE9HX1NFVFRJTkdfU0VDVElPTl9OQU1FCisJCQkrICIuU1RPUkVfRVhQQU5ERURfQ0FURUdPUklFU19JRCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9TRUxFQ1RFRF9WSUVXX0lEID0gRElBTE9HX1NFVFRJTkdfU0VDVElPTl9OQU1FCisJCQkrICIuU1RPUkVfU0VMRUNURURfVklFV19JRCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgRmlsdGVyZWRUcmVlIGZpbHRlcmVkVHJlZTsKKworCXByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOworCisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisJcHJpdmF0ZSBNUGFydERlc2NyaXB0b3JbXSB2aWV3RGVzY3MgPSBuZXcgTVBhcnREZXNjcmlwdG9yWzBdOworCisJcHJpdmF0ZSBMYWJlbCBkZXNjcmlwdGlvbkhpbnQ7CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTaG93Vmlld0RpYWxvZy4KKwkgKgorCSAqIEBwYXJhbSB3aW5kb3cKKwkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggd2luZG93CisJICogQHBhcmFtIHZpZXdSZWcKKwkgKiAgICAgICAgICAgIHRoZSB2aWV3IHJlZ2lzdHJ5CisJICovCisJcHVibGljIFNob3dWaWV3RGlhbG9nKFNoZWxsIHNoZWxsLCBNQXBwbGljYXRpb24gYXBwbGljYXRpb24sCisJCQlJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlzdXBlcihzaGVsbCk7CisJCXRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgYSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgeworCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJc2F2ZVdpZGdldFZhbHVlcygpOworCQl9CisJCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOworCX0KKworCS8qKgorCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgeworCQl2aWV3RGVzY3MgPSBuZXcgTVBhcnREZXNjcmlwdG9yWzBdOworCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlzaGVsbC5zZXRUZXh0KFdvcmtiZW5jaFNXVE1lc3NhZ2VzLlNob3dWaWV3X3NoZWxsVGl0bGUpOworCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLAorCQkvLyBJV29ya2JlbmNoSGVscENvbnRleHRJZHMuU0hPV19WSUVXX0RJQUxPRyk7CisJfQorCisJLyoqCisJICogQWRkcyBidXR0b25zIHRvIHRoaXMgZGlhbG9nJ3MgYnV0dG9uIGJhci4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgYWRkcyBzdGFuZGFyZCBvayBhbmQKKwkgKiBjYW5jZWwgYnV0dG9ucyB1c2luZyB0aGUgPGNvZGU+Y3JlYXRlQnV0dG9uPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kLgorCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsCisJCQkJSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKElEaWFsb2dMYWJlbEtleXMuT0tfTEFCRUxfS0VZKSwgdHJ1ZSk7CisJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAorCQkJCUpGYWNlUmVzb3VyY2VzLmdldFN0cmluZyhJRGlhbG9nTGFiZWxLZXlzLkNBTkNFTF9MQUJFTF9LRVkpLAorCQkJCWZhbHNlKTsKKwkJdXBkYXRlQnV0dG9ucygpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoaXMgZGlhbG9nIChhYm92ZQorCSAqIHRoZSBidXR0b24gYmFyKS4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCisJICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQkvLyBSdW4gc3VwZXIuCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCisJCWNyZWF0ZUZpbHRlcmVkVHJlZVZpZXdlcihjb21wb3NpdGUpOworCisJCWxheW91dFRvcENvbnRyb2woZmlsdGVyZWRUcmVlKTsKKworCQkvLyBVc2UgRjIuLi4gbGFiZWwKKwkJZGVzY3JpcHRpb25IaW50ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOworCQlkZXNjcmlwdGlvbkhpbnQuc2V0VGV4dChXb3JrYmVuY2hTV1RNZXNzYWdlcy5TaG93Vmlld19zZWxlY3RWaWV3SGVscCk7CisJCWRlc2NyaXB0aW9uSGludC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwKKwkJCQlmYWxzZSkpOworCQlkZXNjcmlwdGlvbkhpbnQuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJLy8gUmVzdG9yZSB0aGUgbGFzdCBzdGF0ZQorCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7CisKKwkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisKKwkJLy8gUmV0dXJuIHJlc3VsdHMuCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGZpbHRlcmVkIHRyZWUgdmlld2VyIGluIHRoZSBwYXJlbnQuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbHRlcmVkVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CisJCVBhdHRlcm5GaWx0ZXIgZmlsdGVyID0gbmV3IFZpZXdQYXR0ZXJuRmlsdGVyKGNvbnRleHQpOworCQlpbnQgc3R5bGVCaXRzID0gU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKKwkJZmlsdGVyZWRUcmVlID0gbmV3IEZpbHRlcmVkVHJlZShwYXJlbnQsIHN0eWxlQml0cywgZmlsdGVyKTsKKwkJZmlsdGVyZWRUcmVlLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKKwkJCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKKworCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBmaWx0ZXJlZFRyZWUuZ2V0Vmlld2VyKCk7CisKKwkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3TGFiZWxQcm92aWRlcihjb250ZXh0KSk7CisJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKGFwcGxpY2F0aW9uKSk7CisJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld0NvbXBhcmF0b3IoKSk7CisJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoYXBwbGljYXRpb24pOworCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOworCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7CisJCQkJaGFuZGxlVHJlZVZpZXdlcktleVByZXNzZWQoZSk7CisJCQl9CisJCX0pOworCisJCS8vIGlmIHRoZSB0cmVlIGhhcyBvbmx5IG9uZSBvciB6ZXJvIHZpZXdzLCBkaXNhYmxlIHRoZSBmaWx0ZXIgdGV4dAorCQkvLyBjb250cm9sCisJCWlmIChoYXNBdE1vc3RPbmVWaWV3KGZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKSkpIHsKKwkJCVRleHQgZmlsdGVyVGV4dCA9IGZpbHRlcmVkVHJlZS5nZXRGaWx0ZXJDb250cm9sKCk7CisJCQlpZiAoZmlsdGVyVGV4dCAhPSBudWxsKSB7CisJCQkJZmlsdGVyVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgbGVzcyB0aGFuIHR3byB2aWV3cyBpbiB0aGUgbGlzdC4KKwkgKgorCSAqIEBwYXJhbSB0cmVlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuIHR3byB2aWV3cyBpbiB0aGUgbGlzdC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFzQXRNb3N0T25lVmlldyhUcmVlVmlld2VyIHRyZWUpIHsKKwkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlCisJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOworCQlPYmplY3RbXSBjaGlsZHJlbiA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyh0cmVlLmdldElucHV0KCkpOworCisJCWlmIChjaGlsZHJlbi5sZW5ndGggPD0gMSkgeworCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlyZXR1cm4gIWNvbnRlbnRQcm92aWRlci5oYXNDaGlsZHJlbihjaGlsZHJlblswXSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJaWYgKGZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKS5pc0V4cGFuZGFibGUoZWxlbWVudCkpIHsKKwkJCWZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKS5zZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQsCisJCQkJCSFmaWx0ZXJlZFRyZWUuZ2V0Vmlld2VyKCkuZ2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50KSk7CisJCX0gZWxzZSBpZiAodmlld0Rlc2NzLmxlbmd0aCA+IDApIHsKKwkJCXNhdmVXaWRnZXRWYWx1ZXMoKTsKKwkJCXNldFJldHVybkNvZGUoT0spOworCQkJY2xvc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgZGlhbG9nIHN0b3JlIHRvIGNhY2hlIHZhbHVlcyBpbnRvCisJICovCisJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKKwkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoU1dUQWN0aXZhdG9yLmdldERlZmF1bHQoKQorCQkJCS5nZXREaWFsb2dTZXR0aW5ncygpOworCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzCisJCQkJLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdfU0VDVElPTl9OQU1FKTsKKwkJaWYgKHNlY3Rpb24gPT0gbnVsbCkgeworCQkJc2VjdGlvbiA9IHdvcmtiZW5jaFNldHRpbmdzCisJCQkJCS5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HX1NFQ1RJT05fTkFNRSk7CisJCX0KKwkJcmV0dXJuIHNlY3Rpb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVzY3JpcHRvcnMgZm9yIHRoZSBzZWxlY3RlZCB2aWV3cy4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3JzIGZvciB0aGUgc2VsZWN0ZWQgdmlld3MKKwkgKi8KKwlwdWJsaWMgTVBhcnREZXNjcmlwdG9yW10gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gdmlld0Rlc2NzOworCX0KKworCS8qKgorCSAqIExheW91dCB0aGUgdG9wIGNvbnRyb2wuCisJICoKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wuCisJICovCisJcHJpdmF0ZSB2b2lkIGxheW91dFRvcENvbnRyb2woQ29udHJvbCBjb250cm9sKSB7CisJCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJc3BlYy53aWR0aEhpbnQgPSBMSVNUX1dJRFRIOworCQlzcGVjLmhlaWdodEhpbnQgPSBMSVNUX0hFSUdIVDsKKwkJY29udHJvbC5zZXRMYXlvdXREYXRhKHNwZWMpOworCX0KKworCS8qKgorCSAqIFVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleQorCSAqIGhlbGQgbGFzdCB0aW1lIHRoaXMgZGlhbG9nIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKKwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKworCQlTdHJpbmdbXSBleHBhbmRlZENhdGVnb3J5SWRzID0gc2V0dGluZ3MKKwkJCQkuZ2V0QXJyYXkoU1RPUkVfRVhQQU5ERURfQ0FURUdPUklFU19JRCk7CisJCWlmIChleHBhbmRlZENhdGVnb3J5SWRzID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKGV4cGFuZGVkQ2F0ZWdvcnlJZHMubGVuZ3RoID4gMCkKKwkJCWZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKS5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkQ2F0ZWdvcnlJZHMpOworCisJCVN0cmluZyBzZWxlY3RlZFBhcnRJZCA9IHNldHRpbmdzLmdldChTVE9SRV9TRUxFQ1RFRF9WSUVXX0lEKTsKKwkJaWYgKHNlbGVjdGVkUGFydElkICE9IG51bGwpIHsKKwkJCUxpc3Q8TVBhcnREZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IGFwcGxpY2F0aW9uLmdldERlc2NyaXB0b3JzKCk7CisJCQlmb3IgKE1QYXJ0RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlpZiAoc2VsZWN0ZWRQYXJ0SWQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJCWZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oCisJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVzY3JpcHRvciksIHRydWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaW5jZSBPSyB3YXMgcHJlc3NlZCwgd3JpdGUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgZGlhbG9nIHN0b3JlIHNvIHRoYXQKKwkgKiB0aGV5IHdpbGwgcGVyc2lzdCBpbnRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBkaWFsb2cKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgeworCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOworCisJCS8vIENvbGxlY3QgdGhlIGlkcyBvZiB0aGUgYWxsIGV4cGFuZGVkIGNhdGVnb3JpZXMKKwkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IGZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKQorCQkJCS5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7CisJCVN0cmluZ1tdIGV4cGFuZGVkQ2F0ZWdvcnlJZHMgPSBuZXcgU3RyaW5nW2V4cGFuZGVkRWxlbWVudHMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBhbmRlZEVsZW1lbnRzLmxlbmd0aDsgKytpKSB7CisJCQlpZiAoZXhwYW5kZWRFbGVtZW50c1tpXSBpbnN0YW5jZW9mIE1QYXJ0RGVzY3JpcHRvcikKKwkJCQlleHBhbmRlZENhdGVnb3J5SWRzW2ldID0gKChNUGFydERlc2NyaXB0b3IpIGV4cGFuZGVkRWxlbWVudHNbaV0pCisJCQkJCQkuZ2V0RWxlbWVudElkKCk7CisJCQllbHNlCisJCQkJZXhwYW5kZWRDYXRlZ29yeUlkc1tpXSA9IGV4cGFuZGVkRWxlbWVudHNbaV0udG9TdHJpbmcoKTsKKwkJfQorCisJCS8vIFNhdmUgdGhlbSBmb3IgbmV4dCB0aW1lLgorCQlzZXR0aW5ncy5wdXQoU1RPUkVfRVhQQU5ERURfQ0FURUdPUklFU19JRCwgZXhwYW5kZWRDYXRlZ29yeUlkcyk7CisKKwkJU3RyaW5nIHNlbGVjdGVkVmlld0lkID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHZpZXdEZXNjcy5sZW5ndGggPiAwKSB7CisJCQkvLyBpbiB0aGUgY2FzZSBvZiBhIG11bHRpLXNlbGVjdGlvbiwgaXQncyBwcm9iYWJseSBsZXNzIGNvbmZ1c2luZworCQkJLy8gdG8gc3RvcmUganVzdCB0aGUgZmlyc3QgcmF0aGVyIHRoYW4gdGhlIHdob2xlIG11bHRpLXNlbGVjdGlvbgorCQkJc2VsZWN0ZWRWaWV3SWQgPSB2aWV3RGVzY3NbMF0uZ2V0RWxlbWVudElkKCk7CisJCX0KKwkJc2V0dGluZ3MucHV0KFNUT1JFX1NFTEVDVEVEX1ZJRVdfSUQsIHNlbGVjdGVkVmlld0lkKTsKKwl9CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCisJICoKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOworCQl1cGRhdGVCdXR0b25zKCk7CisJCVN0cmluZyB0b29sdGlwID0gIiI7CisJCWlmICh2aWV3RGVzY3MubGVuZ3RoID4gMCkgeworCQkJdG9vbHRpcCA9IHZpZXdEZXNjc1swXS5nZXRUb29sdGlwKCk7CisJCQl0b29sdGlwID0gTG9jYWxpemF0aW9uSGVscGVyLmdldExvY2FsaXplZCh0b29sdGlwLCB2aWV3RGVzY3NbMF0sCisJCQkJCWNvbnRleHQpOworCQl9CisJCWJvb2xlYW4gaGFzVG9vbHRpcCA9ICh0b29sdGlwID09IG51bGwpID8gZmFsc2UgOiB0b29sdGlwLmxlbmd0aCgpID4gMDsKKwkJZGVzY3JpcHRpb25IaW50LnNldFZpc2libGUodmlld0Rlc2NzLmxlbmd0aCA9PSAxICYmIGhhc1Rvb2x0aXApOworCX0KKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgYnV0dG9uIGVuYWJsZW1lbnQgc3RhdGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKKwkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKKwkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbiBvYmplY3QuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQlBcnJheUxpc3Q8TVBhcnREZXNjcmlwdG9yPiBkZXNjcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlmb3IgKEl0ZXJhdG9yPD8+IGkgPSBzZWwuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlPYmplY3QgbyA9IGkubmV4dCgpOworCQkJaWYgKG8gaW5zdGFuY2VvZiBNUGFydERlc2NyaXB0b3IpIHsKKwkJCQlkZXNjcy5hZGQoKE1QYXJ0RGVzY3JpcHRvcikgbyk7CisJCQl9CisJCX0KKworCQl2aWV3RGVzY3MgPSBuZXcgTVBhcnREZXNjcmlwdG9yW2Rlc2NzLnNpemUoKV07CisJCWRlc2NzLnRvQXJyYXkodmlld0Rlc2NzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkgeworCQlyZXR1cm4gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwl9CisKKwl2b2lkIGhhbmRsZVRyZWVWaWV3ZXJLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7CisJCS8vIHBvcHVwIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHZpZXcKKwkJaWYgKGRlc2NyaXB0aW9uSGludC5pc1Zpc2libGUoKSAmJiBldmVudC5rZXlDb2RlID09IFNXVC5GMgorCQkJCSYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKSB7CisJCQkvLyBGSVhNRSBSQVAgZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpCisJCQlJVHJlZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRyZWVTZWxlY3Rpb24pIGZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJCS8vIG9ubHkgc2hvdyBkZXNjcmlwdGlvbiBpZiBvbmUgdmlldyBpcyBzZWxlY3RlZAorCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgeworCQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQkJCWlmIChvIGluc3RhbmNlb2YgTVBhcnREZXNjcmlwdG9yKSB7CisJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICgoTVBhcnREZXNjcmlwdG9yKSBvKS5nZXRUb29sdGlwKCk7CisJCQkJCWRlc2NyaXB0aW9uID0gTG9jYWxpemF0aW9uSGVscGVyLmdldExvY2FsaXplZChkZXNjcmlwdGlvbiwKKwkJCQkJCQkoTVBhcnREZXNjcmlwdG9yKSBvLCBjb250ZXh0KTsKKwkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24ubGVuZ3RoKCkgPT0gMCkKKwkJCQkJCWRlc2NyaXB0aW9uID0gV29ya2JlbmNoU1dUTWVzc2FnZXMuU2hvd1ZpZXdfbm9EZXNjOworCQkJCQlwb3BVcChkZXNjcmlwdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHBvcFVwKGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQluZXcgUG9wdXBEaWFsb2coZmlsdGVyZWRUcmVlLmdldFNoZWxsKCksIFBvcHVwRGlhbG9nLkhPVkVSX1NIRUxMU1RZTEUsCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfU0laRSA9IDE1OworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsTG9jYXRpb24oUG9pbnQgaW5pdGlhbFNpemUpIHsKKwkJCQkvLyBzaG93IHBvcHVwIHJlbGF0aXZlIHRvIGN1cnNvcgorCQkJCURpc3BsYXkgZGlzcGxheSA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOworCQkJCVBvaW50IGxvY2F0aW9uID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOworCQkJCWxvY2F0aW9uLnggKz0gQ1VSU09SX1NJWkU7CisJCQkJbG9jYXRpb24ueSArPSBDVVJTT1JfU0laRTsKKwkJCQlyZXR1cm4gbG9jYXRpb247CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7CisJCQkJbGFiZWwuc2V0VGV4dChkZXNjcmlwdGlvbik7CisJCQkJbGFiZWwuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZXZlbnQpIHsKKwkJCQkJCWNsb3NlKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQkvLyBVc2UgdGhlIGNvbXBhY3QgbWFyZ2lucyBlbXBsb3llZCBieSBQb3B1cERpYWxvZy4KKwkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKKwkJCQkJCXwgR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gUG9wdXBEaWFsb2cuUE9QVVBfSE9SSVpPTlRBTFNQQUNJTkc7CisJCQkJZ2QudmVydGljYWxJbmRlbnQgPSBQb3B1cERpYWxvZy5QT1BVUF9WRVJUSUNBTFNQQUNJTkc7CisJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCQkJcmV0dXJuIGxhYmVsOworCQkJfQorCQl9Lm9wZW4oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc2l6YWJsZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvU3RyaW5nTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvU3RyaW5nTWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDE4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9TdHJpbmdNYXRjaGVyLmphdmEKQEAgLTAsMCArMSw0OTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LmludGVybmFsLmNvcHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1pc2MuU3RyaW5nTWF0Y2hlci4KKyAqLworcHVibGljIGNsYXNzIFN0cmluZ01hdGNoZXIgeworCXByb3RlY3RlZCBTdHJpbmcgZlBhdHRlcm47CisKKwlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7IC8vIHBhdHRlcm4gbGVuZ3RoCisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmSWdub3JlV2lsZENhcmRzOworCisJcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZUNhc2U7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzTGVhZGluZ1N0YXI7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzVHJhaWxpbmdTdGFyOworCisJcHJvdGVjdGVkIFN0cmluZyBmU2VnbWVudHNbXTsgLy8gdGhlIGdpdmVuIHBhdHRlcm4gaXMgc3BsaXQgaW50byAqIHNlcGFyYXRlZAorCQkJCQkJCQkJLy8gc2VnbWVudHMKKworCS8qIGJvdW5kYXJ5IHZhbHVlIGJleW9uZCB3aGljaCB3ZSBkb24ndCBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgdGV4dCAqLworCXByb3RlY3RlZCBpbnQgZkJvdW5kID0gMDsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBmU2luZ2xlV2lsZENhcmQgPSAnXHUwMDAwJzsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zaXRpb24geworCQlpbnQgc3RhcnQ7IC8vIGluY2x1c2l2ZQorCisJCWludCBlbmQ7IC8vIGV4Y2x1c2l2ZQorCisJCXB1YmxpYyBQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJCXRoaXMuc3RhcnQgPSBzdGFydDsKKwkJCXRoaXMuZW5kID0gZW5kOworCQl9CisKKwkJcHVibGljIGludCBnZXRTdGFydCgpIHsKKwkJCXJldHVybiBzdGFydDsKKwkJfQorCisJCXB1YmxpYyBpbnQgZ2V0RW5kKCkgeworCQkJcmV0dXJuIGVuZDsKKwkJfQorCX0KKworCS8qKgorCSAqIFN0cmluZ01hdGNoZXIgY29uc3RydWN0b3IgdGFrZXMgaW4gYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUKKwkgKiBwYXR0ZXJuIHdoaWNoIG1heSBjb250YWluICcqJyBmb3IgMCBhbmQgbWFueSBjaGFyYWN0ZXJzIGFuZCAnPycgZm9yCisJICogZXhhY3RseSBvbmUgY2hhcmFjdGVyLgorCSAqCisJICogTGl0ZXJhbCAnKicgYW5kICc/JyBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZCBpbiB0aGUgcGF0dGVybiBlLmcuLCAiXCoiCisJICogbWVhbnMgbGl0ZXJhbCAiKiIsIGV0Yy4KKwkgKgorCSAqIEVzY2FwaW5nIGFueSBvdGhlciBjaGFyYWN0ZXIgKGluY2x1ZGluZyB0aGUgZXNjYXBlIGNoYXJhY3RlciBpdHNlbGYpLAorCSAqIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4gZS5nLiwgIlxhIiBtZWFucyAiYSIgYW5kCisJICogIlxcIiBtZWFucyAiXCIKKwkgKgorCSAqIElmIGludm9raW5nIHRoZSBTdHJpbmdNYXRjaGVyIHdpdGggc3RyaW5nIGxpdGVyYWxzIGluIEphdmEsIGRvbid0IGZvcmdldAorCSAqIGVzY2FwZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSAiXFwiLgorCSAqCisJICogQHBhcmFtIHBhdHRlcm4KKwkgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHRvIG1hdGNoIHRleHQgYWdhaW5zdAorCSAqIEBwYXJhbSBpZ25vcmVDYXNlCisJICogICAgICAgICAgICBpZiB0cnVlLCBjYXNlIGlzIGlnbm9yZWQKKwkgKiBAcGFyYW0gaWdub3JlV2lsZENhcmRzCisJICogICAgICAgICAgICBpZiB0cnVlLCB3aWxkIGNhcmRzIGFuZCB0aGVpciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpZ25vcmVkCisJICogICAgICAgICAgICAoZXZlcnl0aGluZyBpcyB0YWtlbiBsaXRlcmFsbHkpLgorCSAqLworCXB1YmxpYyBTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlnbm9yZUNhc2UsCisJCQlib29sZWFuIGlnbm9yZVdpbGRDYXJkcykgeworCQlpZiAocGF0dGVybiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJZklnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOworCQlmSWdub3JlV2lsZENhcmRzID0gaWdub3JlV2lsZENhcmRzOworCQlmUGF0dGVybiA9IHBhdHRlcm47CisJCWZMZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOworCisJCWlmIChmSWdub3JlV2lsZENhcmRzKSB7CisJCQlwYXJzZU5vV2lsZENhcmRzKCk7CisJCX0gZWxzZSB7CisJCQlwYXJzZVdpbGRDYXJkcygpOworCQl9CisJfQorCisJLyoqCisJICogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcGF0dGVybiBiZXR3ZWVuIDxjb2RlPnN0YXJ0PC9jb2RlCisJICogKShpbmNsdXNpdmUpIGFuZCA8Y29kZT5lbmQ8L2NvZGU+KGV4Y2x1c2l2ZSkuCisJICoKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgdGhlIFN0cmluZyBvYmplY3QgdG8gc2VhcmNoIGluCisJICogQHBhcmFtIHN0YXJ0CisJICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgaW5jbHVzaXZlCisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgdGhlIGVuZGluZyBpbmRleCBvZiB0aGUgc2VhcmNoIHJhbmdlLCBleGNsdXNpdmUKKwkgKiBAcmV0dXJuIGFuIDxjb2RlPlN0cmluZ01hdGNoZXIuUG9zaXRpb248L2NvZGU+IG9iamVjdCB0aGF0IGtlZXBzIHRoZQorCSAqICAgICAgICAgc3RhcnRpbmcgKGluY2x1c2l2ZSkgYW5kIGVuZGluZyBwb3NpdGlvbnMgKGV4Y2x1c2l2ZSkgb2YgdGhlCisJICogICAgICAgICBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlCisJICogICAgICAgICB0ZXh0OyByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQgb3Igc3VidGV4dCBpcyBlbXB0eSAoc3RhcnQ9PWVuZCkuCisJICogICAgICAgICBBIHBhaXIgb2YgemVyb3MgaXMgcmV0dXJuZWQgaWYgcGF0dGVybiBpcyBlbXB0eSBzdHJpbmcgTm90ZSB0aGF0CisJICogICAgICAgICBmb3IgcGF0dGVybiBsaWtlICIqYWJjKiIgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzdGFycywKKwkgKiAgICAgICAgIHBvc2l0aW9uIG9mICJhYmMiIGlzIHJldHVybmVkLiBGb3IgYSBwYXR0ZXJuIGxpa2UiKj8/KiIgaW4gdGV4dAorCSAqICAgICAgICAgImFiY2RmIiwgKDEsMykgaXMgcmV0dXJuZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nTWF0Y2hlci5Qb3NpdGlvbiBmaW5kKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJaWYgKHRleHQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisKKwkJaW50IHRsZW4gPSB0ZXh0Lmxlbmd0aCgpOworCQlpZiAoc3RhcnQgPCAwKSB7CisJCQlzdGFydCA9IDA7CisJCX0KKwkJaWYgKGVuZCA+IHRsZW4pIHsKKwkJCWVuZCA9IHRsZW47CisJCX0KKwkJaWYgKGVuZCA8IDAgfHwgc3RhcnQgPj0gZW5kKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoZkxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBzdGFydCk7CisJCX0KKwkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpIHsKKwkJCWludCB4ID0gcG9zSW4odGV4dCwgc3RhcnQsIGVuZCk7CisJCQlpZiAoeCA8IDApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBuZXcgUG9zaXRpb24oeCwgeCArIGZMZW5ndGgpOworCQl9CisKKwkJaW50IHNlZ0NvdW50ID0gZlNlZ21lbnRzLmxlbmd0aDsKKwkJaWYgKHNlZ0NvdW50ID09IDApIHsKKwkJCXJldHVybiBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCk7CisJCX0KKworCQlpbnQgY3VyUG9zID0gc3RhcnQ7CisJCWludCBtYXRjaFN0YXJ0ID0gLTE7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQgJiYgY3VyUG9zIDwgZW5kOyArK2kpIHsKKwkJCVN0cmluZyBjdXJyZW50ID0gZlNlZ21lbnRzW2ldOworCQkJaW50IG5leHRNYXRjaCA9IHJlZ0V4cFBvc0luKHRleHQsIGN1clBvcywgZW5kLCBjdXJyZW50KTsKKwkJCWlmIChuZXh0TWF0Y2ggPCAwKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJbWF0Y2hTdGFydCA9IG5leHRNYXRjaDsKKwkJCX0KKwkJCWN1clBvcyA9IG5leHRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7CisJCX0KKwkJaWYgKGkgPCBzZWdDb3VudCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIG5ldyBQb3NpdGlvbihtYXRjaFN0YXJ0LCBjdXJQb3MpOworCX0KKworCS8qKgorCSAqIG1hdGNoIHRoZSBnaXZlbiA8Y29kZT50ZXh0PC9jb2RlPiB3aXRoIHRoZSBwYXR0ZXJuCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hlZCBvdGhlcndpc2UgZmFsc2UKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKKwkJaWYgKHRleHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBtYXRjaCh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpKTsKKwl9CisKKwkvKioKKwkgKiBHaXZlbiB0aGUgc3RhcnRpbmcgKGluY2x1c2l2ZSkgYW5kIHRoZSBlbmRpbmcgKGV4Y2x1c2l2ZSkgcG9zaXRpb25zIGluCisJICogdGhlIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzIHdpdGgKKwkgKiBhUGF0dGVybgorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgdGV4dCBtYXRjaGVzIHRoZSBwYXR0ZXJuCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIGEgU3RyaW5nIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgdG8gbWF0Y2gKKwkgKiBAcGFyYW0gc3RhcnQKKwkgKiAgICAgICAgICAgIG1hcmtzIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nCisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgbWFya3MgdGhlIGVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nCisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCQlpZiAobnVsbCA9PSB0ZXh0KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKworCQlpZiAoc3RhcnQgPiBlbmQpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChmSWdub3JlV2lsZENhcmRzKSB7CisJCQlyZXR1cm4gKGVuZCAtIHN0YXJ0ID09IGZMZW5ndGgpCisJCQkJCSYmIGZQYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoZklnbm9yZUNhc2UsIDAsIHRleHQsIHN0YXJ0LAorCQkJCQkJCWZMZW5ndGgpOworCQl9CisJCWludCBzZWdDb3VudCA9IGZTZWdtZW50cy5sZW5ndGg7CisJCWlmIChzZWdDb3VudCA9PSAwICYmIChmSGFzTGVhZGluZ1N0YXIgfHwgZkhhc1RyYWlsaW5nU3RhcikpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChzdGFydCA9PSBlbmQpIHsKKwkJCXJldHVybiBmTGVuZ3RoID09IDA7CisJCX0KKwkJaWYgKGZMZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIHN0YXJ0ID09IGVuZDsKKwkJfQorCisJCWludCB0bGVuID0gdGV4dC5sZW5ndGgoKTsKKwkJaWYgKHN0YXJ0IDwgMCkgeworCQkJc3RhcnQgPSAwOworCQl9CisJCWlmIChlbmQgPiB0bGVuKSB7CisJCQllbmQgPSB0bGVuOworCQl9CisKKwkJaW50IHRDdXJQb3MgPSBzdGFydDsKKwkJaW50IGJvdW5kID0gZW5kIC0gZkJvdW5kOworCQlpZiAoYm91bmQgPCAwKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaW50IGkgPSAwOworCQlTdHJpbmcgY3VycmVudCA9IGZTZWdtZW50c1tpXTsKKwkJaW50IHNlZ0xlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7CisKKwkJLyogcHJvY2VzcyBmaXJzdCBzZWdtZW50ICovCisJCWlmICghZkhhc0xlYWRpbmdTdGFyKSB7CisJCQlpZiAoIXJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgc3RhcnQsIGN1cnJlbnQsIDAsIHNlZ0xlbmd0aCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkrK2k7CisJCQl0Q3VyUG9zID0gdEN1clBvcyArIHNlZ0xlbmd0aDsKKwkJfQorCQlpZiAoKGZTZWdtZW50cy5sZW5ndGggPT0gMSkgJiYgKCFmSGFzTGVhZGluZ1N0YXIpCisJCQkJJiYgKCFmSGFzVHJhaWxpbmdTdGFyKSkgeworCQkJLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZGNhcmRzIHNwZWNpZmllZAorCQkJcmV0dXJuIHRDdXJQb3MgPT0gZW5kOworCQl9CisJCS8qIHByb2Nlc3MgbWlkZGxlIHNlZ21lbnRzICovCisJCXdoaWxlIChpIDwgc2VnQ291bnQpIHsKKwkJCWN1cnJlbnQgPSBmU2VnbWVudHNbaV07CisJCQlpbnQgY3VycmVudE1hdGNoOworCQkJaW50IGsgPSBjdXJyZW50LmluZGV4T2YoZlNpbmdsZVdpbGRDYXJkKTsKKwkJCWlmIChrIDwgMCkgeworCQkJCWN1cnJlbnRNYXRjaCA9IHRleHRQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOworCQkJCWlmIChjdXJyZW50TWF0Y2ggPCAwKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWN1cnJlbnRNYXRjaCA9IHJlZ0V4cFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7CisJCQkJaWYgKGN1cnJlbnRNYXRjaCA8IDApIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXRDdXJQb3MgPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOworCQkJaSsrOworCQl9CisKKwkJLyogcHJvY2VzcyBmaW5hbCBzZWdtZW50ICovCisJCWlmICghZkhhc1RyYWlsaW5nU3RhciAmJiB0Q3VyUG9zICE9IGVuZCkgeworCQkJaW50IGNsZW4gPSBjdXJyZW50Lmxlbmd0aCgpOworCQkJcmV0dXJuIHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgZW5kIC0gY2xlbiwgY3VycmVudCwgMCwgY2xlbik7CisJCX0KKwkJcmV0dXJuIGkgPT0gc2VnQ291bnQ7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkCisJICogJyonIGNoYXJhY3RlcnMuIFNpbmNlIHdpbGRjYXJkcyBhcmUgbm90IGJlaW5nIHVzZWQgaW4gdGhpcyBjYXNlLCB0aGUKKwkgKiBwYXR0ZXJuIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHNlZ21lbnQuCisJICovCisJcHJpdmF0ZSB2b2lkIHBhcnNlTm9XaWxkQ2FyZHMoKSB7CisJCWZTZWdtZW50cyA9IG5ldyBTdHJpbmdbMV07CisJCWZTZWdtZW50c1swXSA9IGZQYXR0ZXJuOworCQlmQm91bmQgPSBmTGVuZ3RoOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHNlZ21lbnRzIHNlcGVyYXRlZCBieSB3aWxkY2FyZCAnKicKKwkgKiBjaGFyYWN0ZXJzLgorCSAqCisJICogQHBhcmFtIHAKKwkgKiAgICAgICAgICAgICwgYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHdpdGggJyonCisJICogICAgICAgICAgICBhbmQvb3IgJz8nCisJICovCisJcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgeworCQlpZiAoZlBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZIYXNMZWFkaW5nU3RhciA9IHRydWU7CisJCX0KKwkJaWYgKGZQYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsvLyROT04tTkxTLTEkCisJCQkvKiBtYWtlIHN1cmUgaXQncyBub3QgYW4gZXNjYXBlZCB3aWxkY2FyZCAqLworCQkJaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgeworCQkJCWZIYXNUcmFpbGluZ1N0YXIgPSB0cnVlOworCQkJfQorCQl9CisKKwkJVmVjdG9yPFN0cmluZz4gdGVtcCA9IG5ldyBWZWN0b3I8PigpOworCisJCWludCBwb3MgPSAwOworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl3aGlsZSAocG9zIDwgZkxlbmd0aCkgeworCQkJY2hhciBjID0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXFwnOgorCQkJCWlmIChwb3MgPj0gZkxlbmd0aCkgeworCQkJCQlidWYuYXBwZW5kKGMpOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXIgbmV4dCA9IGZQYXR0ZXJuLmNoYXJBdChwb3MrKyk7CisJCQkJCS8qIGlmIGl0J3MgYW4gZXNjYXBlIHNlcXVlbmNlICovCisJCQkJCWlmIChuZXh0ID09ICcqJyB8fCBuZXh0ID09ICc/JyB8fCBuZXh0ID09ICdcXCcpIHsKKwkJCQkJCWJ1Zi5hcHBlbmQobmV4dCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBub3QgYW4gZXNjYXBlIHNlcXVlbmNlLCBqdXN0IGluc2VydCBsaXRlcmFsbHkgKi8KKwkJCQkJCWJ1Zi5hcHBlbmQoYyk7CisJCQkJCQlidWYuYXBwZW5kKG5leHQpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnKic6CisJCQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKKwkJCQkJLyogbmV3IHNlZ21lbnQgKi8KKwkJCQkJdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKKwkJCQkJZkJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKKwkJCQkJYnVmLnNldExlbmd0aCgwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICc/JzoKKwkJCQkvKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaCB3aWxkY2FyZCAqLworCQkJCWJ1Zi5hcHBlbmQoZlNpbmdsZVdpbGRDYXJkKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnVmLmFwcGVuZChjKTsKKwkJCX0KKwkJfQorCisJCS8qIGFkZCBsYXN0IGJ1ZmZlciB0byBzZWdtZW50IGxpc3QgKi8KKwkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKKwkJCXRlbXAuYWRkRWxlbWVudChidWYudG9TdHJpbmcoKSk7CisJCQlmQm91bmQgKz0gYnVmLmxlbmd0aCgpOworCQl9CisKKwkJZlNlZ21lbnRzID0gbmV3IFN0cmluZ1t0ZW1wLnNpemUoKV07CisJCXRlbXAuY29weUludG8oZlNlZ21lbnRzKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgbm8gd2lsZGNhcmQKKwkgKiBAcGFyYW0gc3RhcnQKKwkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKKwkgKiBAcGFyYW0gZW5kCisJICogICAgICAgICAgICB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKKwkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdAorCSAqICAgICAgICAgZm91bmQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsvLyBubyB3aWxkIGNhcmQgaW4KKwkJCQkJCQkJCQkJCQkJCS8vIHBhdHRlcm4KKwkJaW50IG1heCA9IGVuZCAtIGZMZW5ndGg7CisKKwkJaWYgKCFmSWdub3JlQ2FzZSkgeworCQkJaW50IGkgPSB0ZXh0LmluZGV4T2YoZlBhdHRlcm4sIHN0YXJ0KTsKKwkJCWlmIChpID09IC0xIHx8IGkgPiBtYXgpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gaTsKKwkJfQorCisJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgeworCQkJaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBmUGF0dGVybiwgMCwgZkxlbmd0aCkpIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAtMTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IG9ubHkgY29udGFpbiAnPycocykKKwkgKiBAcGFyYW0gc3RhcnQKKwkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKKwkgKiBAcGFyYW0gZW5kCisJICogICAgICAgICAgICB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKKwkgKiBAcGFyYW0gcAorCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW5zICc/JworCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90CisJICogICAgICAgICBmb3VuZAorCSAqLworCXByb3RlY3RlZCBpbnQgcmVnRXhwUG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHApIHsKKwkJaW50IHBsZW4gPSBwLmxlbmd0aCgpOworCisJCWludCBtYXggPSBlbmQgLSBwbGVuOworCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKKwkJCWlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKSB7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8qKgorCSAqCisJICogQHJldHVybiBib29sZWFuCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIGEgU3RyaW5nIHRvIG1hdGNoCisJICogQHBhcmFtIHN0YXJ0CisJICogICAgICAgICAgICBpbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIG1hdGNoLCBpbmNsdXNpdmUKKwkgKiBAcGFyYW0gZW5kCisJICogICAgICAgICAgICA8L2NvZGU+IGludCB0aGF0IGluZGljYXRlcyB0aGUgZW5kaW5nIGluZGV4IG9mIG1hdGNoLAorCSAqICAgICAgICAgICAgZXhjbHVzaXZlCisJICogQHBhcmFtIHAKKwkgKiAgICAgICAgICAgIFN0cmluZywgU3RyaW5nLCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgY29udGFpbgorCSAqICAgICAgICAgICAgJz8nCisJICogQHBhcmFtIGlnbm9yZUNhc2UKKwkgKiAgICAgICAgICAgIGJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgY29kZT5wPC9jb2RlPiBpcyBjYXNlIHNlbnNpdGl2ZQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHJlZ0V4cFJlZ2lvbk1hdGNoZXMoU3RyaW5nIHRleHQsIGludCB0U3RhcnQsIFN0cmluZyBwLAorCQkJaW50IHBTdGFydCwgaW50IHBsZW4pIHsKKwkJd2hpbGUgKHBsZW4tLSA+IDApIHsKKwkJCWNoYXIgdGNoYXIgPSB0ZXh0LmNoYXJBdCh0U3RhcnQrKyk7CisJCQljaGFyIHBjaGFyID0gcC5jaGFyQXQocFN0YXJ0KyspOworCisJCQkvKiBwcm9jZXNzIHdpbGQgY2FyZHMgKi8KKwkJCWlmICghZklnbm9yZVdpbGRDYXJkcykgeworCQkJCS8qIHNraXAgc2luZ2xlIHdpbGQgY2FyZHMgKi8KKwkJCQlpZiAocGNoYXIgPT0gZlNpbmdsZVdpbGRDYXJkKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWlmIChwY2hhciA9PSB0Y2hhcikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGZJZ25vcmVDYXNlKSB7CisJCQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCisJCQkJCQkudG9VcHBlckNhc2UocGNoYXIpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbAorCQkJCS8vIGNhc2VzOworCQkJCS8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKKwkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIKKwkJCQkJCS50b0xvd2VyQ2FzZShwY2hhcikpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0ZXh0CisJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIG1hdGNoCisJICogQHBhcmFtIHN0YXJ0CisJICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCisJICogQHBhcmFtIHAKKwkgKiAgICAgICAgICAgIGEgcGF0dGVybiBzdHJpbmcgdGhhdCBoYXMgbm8gd2lsZGNhcmQKKwkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdAorCSAqICAgICAgICAgZm91bmQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHRleHRQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgeworCisJCWludCBwbGVuID0gcC5sZW5ndGgoKTsKKwkJaW50IG1heCA9IGVuZCAtIHBsZW47CisKKwkJaWYgKCFmSWdub3JlQ2FzZSkgeworCQkJaW50IGkgPSB0ZXh0LmluZGV4T2YocCwgc3RhcnQpOworCQkJaWYgKGkgPT0gLTEgfHwgaSA+IG1heCkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJldHVybiBpOworCQl9CisKKwkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7CisJCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIHAsIDAsIHBsZW4pKSB7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gLTE7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvVmlld0NvbXBhcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1ZpZXdDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMDU5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1ZpZXdDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmRlc2NyaXB0b3IuYmFzaWMuTVBhcnREZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKKworLyoqCisgKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlZpZXdDb21wYXJhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBWaWV3Q29tcGFyYXRvciBleHRlbmRzIFZpZXdlckNvbXBhcmF0b3IgeworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOworCisJLyoqCisJICogVmlld1NvcnRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqCisJICogQHBhcmFtIHJlZworCSAqICAgICAgICAgICAgYW4gSVZpZXdSZWdpc3RyeQorCSAqLworCXB1YmxpYyBWaWV3Q29tcGFyYXRvcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmVnYXRpdmUsIHplcm8sIG9yIHBvc2l0aXZlIG51bWJlciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKwkgKiBmaXJzdCBlbGVtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCS8vIHBsYWNlICJHZW5lcmFsIiBjYXRlZ29yeSBmaXJzdAorCQlpZiAoV29ya2JlbmNoU1dUTWVzc2FnZXMuSUNhdGVnb3J5X2dlbmVyYWwuZXF1YWxzKGUxKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKFdvcmtiZW5jaFNXVE1lc3NhZ2VzLklDYXRlZ29yeV9nZW5lcmFsLmVxdWFscyhlMikpCisJCQlyZXR1cm4gMTsKKworCQlTdHJpbmcgc3RyMTsKKwkJaWYgKGUxIGluc3RhbmNlb2YgTVBhcnREZXNjcmlwdG9yKQorCQkJc3RyMSA9ICgoTVBhcnREZXNjcmlwdG9yKSBlMSkuZ2V0TG9jYWxpemVkTGFiZWwoKTsKKwkJZWxzZQorCQkJc3RyMSA9IGUxLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nIHN0cjI7CisJCWlmIChlMiBpbnN0YW5jZW9mIE1QYXJ0RGVzY3JpcHRvcikKKwkJCXN0cjIgPSAoKE1QYXJ0RGVzY3JpcHRvcikgZTIpLmdldExvY2FsaXplZExhYmVsKCk7CisJCWVsc2UKKwkJCXN0cjIgPSBlMi50b1N0cmluZygpOworCQlpZiAoc3RyMSA9PSBudWxsKQorCQkJc3RyMSA9IEVNUFRZX1NUUklORzsKKwkJaWYgKHN0cjIgPT0gbnVsbCkKKwkJCXN0cjIgPSBFTVBUWV9TVFJJTkc7CisJCXJldHVybiBnZXRDb21wYXJhdG9yKCkuY29tcGFyZShzdHIxLCBzdHIyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9WaWV3Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9WaWV3Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NjUxYQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1ZpZXdDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5NUGFydERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworLyoqCisgKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlZpZXdDb250ZW50UHJvdmlkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgeworCisJZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX1RBRyA9ICJjYXRlZ29yeVRhZzoiOworCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBDQVRFR09SWV9UQUdfTEVOR1RIID0gQ0FURUdPUllfVEFHLmxlbmd0aCgpOworCisJLyoqCisJICogQ2hpbGQgY2FjaGUuIE1hcCBmcm9tIE9iamVjdC0+T2JqZWN0W10uIE91ciBoYXNDaGlsZHJlbigpIG1ldGhvZCBpcworCSAqIGV4cGVuc2l2ZSBzbyBpdCdzIGJldHRlciB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZiBnZXRDaGlsZHJlbigpLgorCSAqLworCXByaXZhdGUgTWFwPE9iamVjdCwgT2JqZWN0W10+IGNoaWxkTWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3RbXT4oKTsKKworCXByaXZhdGUgTUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworCisJcHVibGljIFZpZXdDb250ZW50UHJvdmlkZXIoTUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisJCXRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQljaGlsZE1hcC5jbGVhcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQljaGlsZE1hcC5jbGVhcigpOworCQlhcHBsaWNhdGlvbiA9IChNQXBwbGljYXRpb24pIG5ld0lucHV0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0W10gY2hpbGRyZW4gPSBjaGlsZE1hcC5nZXQoZWxlbWVudCk7CisJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisJCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKGVsZW1lbnQpOworCQkJY2hpbGRNYXAucHV0KGVsZW1lbnQsIGNoaWxkcmVuKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW47CisJfQorCisJcHJpdmF0ZSBPYmplY3RbXSBjcmVhdGVDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbikgeworCQkJTGlzdDxNUGFydERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzID0gKChNQXBwbGljYXRpb24pIGVsZW1lbnQpCisJCQkJCS5nZXREZXNjcmlwdG9ycygpOworCQkJU2V0PFN0cmluZz4gY2F0ZWdvcnlUYWdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkJU2V0PE1QYXJ0RGVzY3JpcHRvcj4gbm9DYXRlZ29yeURlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQ8TVBhcnREZXNjcmlwdG9yPigpOworCQkJZm9yIChNUGFydERlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJTGlzdDxTdHJpbmc+IHRhZ3MgPSBkZXNjcmlwdG9yLmdldFRhZ3MoKTsKKwkJCQlTdHJpbmcgY2F0ZWdvcnkgPSBudWxsOworCQkJCWJvb2xlYW4gaXNWaWV3ID0gZmFsc2U7CisJCQkJZm9yIChTdHJpbmcgdGFnIDogdGFncykgeworCQkJCQlpZiAodGFnLmVxdWFscygiVmlldyIpKQorCQkJCQkJaXNWaWV3ID0gdHJ1ZTsKKwkJCQkJZWxzZSBpZiAodGFnLnN0YXJ0c1dpdGgoQ0FURUdPUllfVEFHKSkgeworCQkJCQkJY2F0ZWdvcnkgPSB0YWcuc3Vic3RyaW5nKENBVEVHT1JZX1RBR19MRU5HVEgpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChpc1ZpZXcpIHsKKwkJCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpCisJCQkJCQljYXRlZ29yeVRhZ3MuYWRkKGNhdGVnb3J5KTsKKwkJCQkJZWxzZQorCQkJCQkJbm9DYXRlZ29yeURlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKKwkJCQl9CisJCQl9CisKKwkJCVNldDxPYmplY3Q+IGNvbWJpbmVkVG9wRWxlbWVudHMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7CisJCQljb21iaW5lZFRvcEVsZW1lbnRzLmFkZEFsbChjYXRlZ29yeVRhZ3MpOworCQkJY29tYmluZWRUb3BFbGVtZW50cy5hZGRBbGwobm9DYXRlZ29yeURlc2NyaXB0b3JzKTsKKwkJCXJldHVybiBjb21iaW5lZFRvcEVsZW1lbnRzLnRvQXJyYXkoKTsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlMaXN0PE1QYXJ0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBhcHBsaWNhdGlvbi5nZXREZXNjcmlwdG9ycygpOworCQkJU2V0PE1QYXJ0RGVzY3JpcHRvcj4gY2F0ZWdvcnlEZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0PE1QYXJ0RGVzY3JpcHRvcj4oKTsKKwkJCWZvciAoTVBhcnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCUxpc3Q8U3RyaW5nPiB0YWdzID0gZGVzY3JpcHRvci5nZXRUYWdzKCk7CisJCQkJZm9yIChTdHJpbmcgdGFnIDogdGFncykgeworCQkJCQlpZiAoIXRhZy5zdGFydHNXaXRoKENBVEVHT1JZX1RBRykpCisJCQkJCQljb250aW51ZTsKKwkJCQkJU3RyaW5nIGNhdGVnb3J5VGFnID0gdGFnLnN1YnN0cmluZyhDQVRFR09SWV9UQUdfTEVOR1RIKTsKKwkJCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGNhdGVnb3J5VGFnKSkKKwkJCQkJCWNhdGVnb3J5RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBjYXRlZ29yeURlc2NyaXB0b3JzLnRvQXJyYXkoKTsKKwkJfQorCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9WaWV3TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvVmlld0xhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMxMGQzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvVmlld0xhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJlbmphbWluIE11c2thbGxhICAtIGJ1ZyA3NzcxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5NUGFydERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LnV0aWwuSVNXVFJlc291cmNlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CisKKy8qKgorICogQmFzZWQgb24gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5WaWV3TGFiZWxQcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFZpZXdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciB7CisKKwkvKioKKwkgKiBJbWFnZSBkZXNjcmlwdG9yIGZvciBlbmFibGVkIGNsZWFyIGJ1dHRvbi4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX0lDT04gPSAib3JnLmVjbGlwc2UuZTQuZGVzY3JpcHRvci5mb2xkZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBHZXQgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIHRoZSBjbGVhciBidXR0b24uCisJICovCisJc3RhdGljIHsKKwkJQnVuZGxlIGJ1bmRsZSA9IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuV29ya2JlbmNoU1dUQWN0aXZhdG9yCisJCQkJLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKKwkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9vYmouZ2lmIik7CisJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7CisJCUltYWdlRGVzY3JpcHRvciBlbmFibGVkRGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7CisJCWlmIChlbmFibGVkRGVzYyAhPSBudWxsKQorCQkJSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChGT0xERVJfSUNPTiwgZW5hYmxlZERlc2MpOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgSW1hZ2U+IGltYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisKKwkvKioKKwkgKiBAcGFyYW0gd2luZG93CisJICogICAgICAgICAgICB0aGUgd29ya2JlbmNoIHdpbmRvdworCSAqIEBwYXJhbSBkaW1tZWRGb3JlZ3JvdW5kCisJICogICAgICAgICAgICB0aGUgZGltbWVkIGZvcmVncm91bmQgY29sb3IgdG8gdXNlIGZvciB2aWV3cyB0aGF0IGFyZSBhbHJlYWR5CisJICogICAgICAgICAgICBvcGVuCisJICovCisJcHVibGljIFZpZXdMYWJlbFByb3ZpZGVyKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJZm9yIChJbWFnZSBpbWFnZSA6IGltYWdlTWFwLnZhbHVlcygpKSB7CisJCQlpbWFnZS5kaXNwb3NlKCk7CisJCX0KKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0RGVzY3JpcHRvcikgeworCQkJU3RyaW5nIGljb25VUkkgPSAoKE1QYXJ0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0SWNvblVSSSgpOworCQkJaWYgKGljb25VUkkgIT0gbnVsbCAmJiBpY29uVVJJLmxlbmd0aCgpID4gMCkgeworCQkJCUltYWdlIGltYWdlID0gaW1hZ2VNYXAuZ2V0KGljb25VUkkpOworCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7CisJCQkJCUlTV1RSZXNvdXJjZVV0aWxpdGllcyByZXNVdGlscyA9IChJU1dUUmVzb3VyY2VVdGlsaXRpZXMpIGNvbnRleHQKKwkJCQkJCQkuZ2V0KElSZXNvdXJjZVV0aWxpdGllcy5jbGFzcy5nZXROYW1lKCkpOworCQkJCQlpbWFnZSA9IHJlc1V0aWxzLmltYWdlRGVzY3JpcHRvckZyb21VUkkoCisJCQkJCQkJVVJJLmNyZWF0ZVVSSShpY29uVVJJKSkuY3JlYXRlSW1hZ2UoKTsKKwkJCQkJaW1hZ2VNYXAucHV0KGljb25VUkksIGltYWdlKTsKKwkJCQl9CisJCQkJcmV0dXJuIGltYWdlOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZU1hcC5nZXQoRk9MREVSX0lDT04pOworCQkJaWYgKGltYWdlID09IG51bGwpIHsKKwkJCQlpbWFnZSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKQorCQkJCQkJLmdldERlc2NyaXB0b3IoRk9MREVSX0lDT04pLmNyZWF0ZUltYWdlKCk7CisJCQkJaW1hZ2VNYXAucHV0KEZPTERFUl9JQ09OLCBpbWFnZSk7CisJCQl9CisJCQlyZXR1cm4gaW1hZ2U7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCVN0cmluZyBsYWJlbCA9IFdvcmtiZW5jaFNXVE1lc3NhZ2VzLlZpZXdMYWJlbF91bmtub3duOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJbGFiZWwgPSAoU3RyaW5nKSBlbGVtZW50OworCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydERlc2NyaXB0b3IpIHsKKwkJCWxhYmVsID0gKChNUGFydERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldExvY2FsaXplZExhYmVsKCk7CisJCX0KKwkJcmV0dXJuIGxhYmVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvVmlld1BhdHRlcm5GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1ZpZXdQYXR0ZXJuRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyN2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L1ZpZXdQYXR0ZXJuRmlsdGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLkxvY2FsaXphdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLk1QYXJ0RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworLyoqCisgKiBCYXNlZCBvbiBvZiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlZpZXdQYXR0ZXJuRmlsdGVyLgorICovCitwdWJsaWMgY2xhc3MgVmlld1BhdHRlcm5GaWx0ZXIgZXh0ZW5kcyBQYXR0ZXJuRmlsdGVyIHsKKworCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBWaWV3UGF0dGVybkZpbHRlcgorCSAqLworCXB1YmxpYyBWaWV3UGF0dGVybkZpbHRlcihJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlzdXBlcigpOworCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudFNlbGVjdGFibGUoT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydERlc2NyaXB0b3I7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNMZWFmTWF0Y2goVmlld2VyIHZpZXdlciwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydERlc2NyaXB0b3IpIHsKKwkJCU1QYXJ0RGVzY3JpcHRvciBkZXNjID0gKE1QYXJ0RGVzY3JpcHRvcikgZWxlbWVudDsKKwkJCXRleHQgPSBMb2NhbGl6YXRpb25IZWxwZXIuZ2V0TG9jYWxpemVkKGRlc2MuZ2V0TGFiZWwoKSwgZGVzYywKKwkJCQkJY29udGV4dCk7CisJCQlpZiAod29yZE1hdGNoZXModGV4dCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9Xb3JrYmVuY2hTV1RNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvV29ya2JlbmNoU1dUTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzVmYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L2ludGVybmFsL2NvcHkvV29ya2JlbmNoU1dUTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIFNlYmFzdGlhbiBEYXZpZHMgLSBidWcgMTI4NTI5CisgKiBTZW1pb24gQ2hpY2hlbG5pdHNreSAoc2VtaW9uQGlsLmlibS5jb20pIC0gYnVnIDI3ODA2NAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QuaW50ZXJuYWwuY29weTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICogQmFzZWQgb24gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXMKKyAqLworcHVibGljIGNsYXNzIFdvcmtiZW5jaFNXVE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5pbnRlcm5hbC5jb3B5Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJlZFRyZWVfQWNjZXNzaWJsZUxpc3RlbmVyQ2xlYXJCdXR0b247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyZWRUcmVlX0NsZWFyVG9vbFRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJlZFRyZWVfRmlsdGVyTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJlZFRyZWVfQWNjZXNzaWJsZUxpc3RlbmVyRmlsdGVyZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmlld0xhYmVsX3Vua25vd247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd1ZpZXdfbm9EZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dWaWV3X3NlbGVjdFZpZXdIZWxwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElDYXRlZ29yeV9vdGhlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJQ2F0ZWdvcnlfZ2VuZXJhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93Vmlld19zaGVsbFRpdGxlOworCisJLy8gSURFQXBwbGljYXRpb24gbWVzc2FnZXMKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VNYW5kYXRvcnlUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VNYW5kYXRvcnlNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdExvY2tUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RCZVNldFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdEJlU2V0TWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbEVycm9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElERUFwcGxpY2F0aW9uX3ZlcnNpb25UaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJREVBcHBsaWNhdGlvbl92ZXJzaW9uTWVzc2FnZTsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlyZWxvYWRNZXNzYWdlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRNZXNzYWdlcygpIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV29ya2JlbmNoU1dUTWVzc2FnZXMuY2xhc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC9pbnRlcm5hbC9jb3B5L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODJjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvaW50ZXJuYWwvY29weS9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICAgIFNlYmFzdGlhbiBEYXZpZHMgKHNkYXZpZHNAZ214LmRlKSAKKyMgICAgICAgIC0gRml4IGZvciBCdWcgNTcwODcKKyMgICAgICAgIC0gRml4IGZvciBCdWcgMTM4MDM0IFtQcmVmZXJlbmNlc10gTGFiZWwgZGVjb3JhdGlvbnMgcGFnZSAtIGV4dHJhIHNwYWNlCisjICAgICAgICAtIEZpeCBmb3IgQnVnIDEyODUyOQorIyAgICAgU2VtaW9uIENoaWNoZWxuaXRza3kgKHNlbWlvbkBpbC5pYm0uY29tKSAtIGJ1ZyAyNzgwNjQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBCYXNlZCBvbiAvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL0VjbGlwc2UgVUkvb3JnL2VjbGlwc2UvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworCitGaWx0ZXJlZFRyZWVfQWNjZXNzaWJsZUxpc3RlbmVyQ2xlYXJCdXR0b249Q2xlYXIgZmlsdGVyIGZpZWxkCitGaWx0ZXJlZFRyZWVfQ2xlYXJUb29sVGlwPUNsZWFyCitGaWx0ZXJlZFRyZWVfRmlsdGVyTWVzc2FnZT10eXBlIGZpbHRlciB0ZXh0CitGaWx0ZXJlZFRyZWVfQWNjZXNzaWJsZUxpc3RlbmVyRmlsdGVyZWQ9ezB9IHsxfSBtYXRjaGVzLgorVmlld0xhYmVsX3Vua25vd24gPSBVbmtub3duCitTaG93Vmlld19ub0Rlc2MgPSBObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUuCitTaG93Vmlld19zZWxlY3RWaWV3SGVscCA9IFVzZSBGMiB0byBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBzZWxlY3RlZCB2aWV3LgorSUNhdGVnb3J5X290aGVyID0gT3RoZXIKK0lDYXRlZ29yeV9nZW5lcmFsID0gR2VuZXJhbAorU2hvd1ZpZXdfc2hlbGxUaXRsZSA9IFNob3cgVmlldworCisjIElERUFwcGxpY2F0aW9uIG1lc3NhZ2VzCitJbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgRXJyb3IKK0lERUFwcGxpY2F0aW9uX3dvcmtzcGFjZU1hbmRhdG9yeVRpdGxlPVdvcmtzcGFjZSBpcyBNYW5kYXRvcnkKK0lERUFwcGxpY2F0aW9uX3dvcmtzcGFjZU1hbmRhdG9yeU1lc3NhZ2U9SURFcyBuZWVkIGEgdmFsaWQgd29ya3NwYWNlLiBSZXN0YXJ0IHdpdGhvdXQgdGhlIEBub25lIG9wdGlvbi4KK0lERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1Xb3Jrc3BhY2UgQ2Fubm90IEJlIExvY2tlZAorSURFQXBwbGljYXRpb25fd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9Q291bGQgbm90IGxhdW5jaCB0aGUgcHJvZHVjdCBiZWNhdXNlIHRoZSBhc3NvY2lhdGVkIHdvcmtzcGFjZSBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IGFub3RoZXIgRWNsaXBzZSBhcHBsaWNhdGlvbi4KK0lERUFwcGxpY2F0aW9uX3dvcmtzcGFjZUNhbm5vdEJlU2V0VGl0bGU9V29ya3NwYWNlIENhbm5vdCBCZSBDcmVhdGVkCitJREVBcHBsaWNhdGlvbl93b3Jrc3BhY2VDYW5ub3RCZVNldE1lc3NhZ2U9Q291bGQgbm90IGxhdW5jaCB0aGUgcHJvZHVjdCBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgd29ya3NwYWNlIGNhbm5vdCBiZSBjcmVhdGVkLiAgVGhlIHNwZWNpZmllZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IGlzIGVpdGhlciBpbnZhbGlkIG9yIHJlYWQtb25seS4KK0lERUFwcGxpY2F0aW9uX3ZlcnNpb25UaXRsZSA9IERpZmZlcmVudCBXb3Jrc3BhY2UgVmVyc2lvbgorSURFQXBwbGljYXRpb25fdmVyc2lvbk1lc3NhZ2UgPSBcCitUaGlzIHdvcmtzcGFjZSB3YXMgd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhlIHByb2R1Y3QgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG5cblwKK3swfVxuXG5cCitVcGRhdGluZyB0aGUgd29ya3NwYWNlIG1heSBtYWtlIGl0IGluY29tcGF0aWJsZSB3aXRoIG90aGVyIHZlcnNpb25zIG9mIHRoZSBwcm9kdWN0LlxuXAorUHJlc3MgT0sgdG8gdXBkYXRlIHRoZSB3b3Jrc3BhY2UgYW5kIG9wZW4gaXQuICBQcmVzcyBDYW5jZWwgdG8gc2VsZWN0IGEgZGlmZmVyZW50IHdvcmtzcGFjZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC91dGlsL0JpbmRpbmdQcm9jZXNzaW5nQWRkb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3N3dC91dGlsL0JpbmRpbmdQcm9jZXNzaW5nQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJkNmIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L3V0aWwvQmluZGluZ1Byb2Nlc3NpbmdBZGRvbi5qYXZhCkBAIC0wLDAgKzEsNDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEBnbWFpbC5jb20+IC0gQnVnIDQyOTU3NQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0LnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb250ZXh0cy5Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkVDb21tYW5kU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5FQmluZGluZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3MuaW50ZXJuYWwuQmluZGluZ1RhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLmludGVybmFsLkJpbmRpbmdUYWJsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUG9saWN5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NQmluZGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUJpbmRpbmdUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NQmluZGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUtleUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLkVDb250ZXh0U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuU2NoZW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCisvKioKKyAqIFByb2Nlc3MgY29udGV4dHMgaW4gdGhlIG1vZGVsLCBmZWVkaW5nIHRoZW0gaW50byB0aGUgY29tbWFuZCBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQmluZGluZ1Byb2Nlc3NpbmdBZGRvbiB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9TQ0hFTUVTID0geyAib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgfTsKKworCUBJbmplY3QKKwlwcml2YXRlIE1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKworCUBJbmplY3QKKwlwcml2YXRlIElFdmVudEJyb2tlciBicm9rZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlcjsKKworCUBJbmplY3QKKwlwcml2YXRlIEJpbmRpbmdUYWJsZU1hbmFnZXIgYmluZGluZ1RhYmxlczsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIEJpbmRpbmdNYW5hZ2VyIGJpbmRpbmdNYW5hZ2VyOworCisJQEluamVjdAorCXByaXZhdGUgRUNvbW1hbmRTZXJ2aWNlIGNvbW1hbmRTZXJ2aWNlOworCisJQEluamVjdAorCXByaXZhdGUgRUJpbmRpbmdTZXJ2aWNlIGJpbmRpbmdTZXJ2aWNlOworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgYWRkaXRpb25IYW5kbGVyOworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgY29udGV4dEhhbmRsZXI7CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCVN0cmluZ1tdIHNjaGVtZXMgPSBERUZBVUxUX1NDSEVNRVM7CisJCWlmIChiaW5kaW5nTWFuYWdlciAhPSBudWxsKSB7CisJCQlmaW5hbCBTY2hlbWUgYWN0aXZlU2NoZW1lID0gYmluZGluZ01hbmFnZXIuZ2V0QWN0aXZlU2NoZW1lKCk7CisJCQlpZiAoYWN0aXZlU2NoZW1lICE9IG51bGwpIHsKKwkJCQlzY2hlbWVzID0gZ2V0U2NoZW1lSWRzKGFjdGl2ZVNjaGVtZS5nZXRJZCgpKTsKKwkJCX0KKwkJfQorCQliaW5kaW5nVGFibGVzLnNldEFjdGl2ZVNjaGVtZXMoc2NoZW1lcyk7CisJCWRlZmluZUJpbmRpbmdUYWJsZXMoKTsKKwkJYWN0aXZhdGVDb250ZXh0cyhhcHBsaWNhdGlvbik7CisJCXJlZ2lzdGVyTW9kZWxMaXN0ZW5lcnMoKTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGdldFNjaGVtZUlkcyhTdHJpbmcgc2NoZW1lSWQpIHsKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJd2hpbGUgKHNjaGVtZUlkICE9IG51bGwpIHsKKwkJCXN0cmluZ3MuYWRkKHNjaGVtZUlkKTsKKwkJCXRyeSB7CisJCQkJc2NoZW1lSWQgPSBnZXRTY2hlbWUoc2NoZW1lSWQpLmdldFBhcmVudElkKCk7CisJCQl9IGNhdGNoIChmaW5hbCBOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBzdHJpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1tzdHJpbmdzLnNpemUoKV0pOworCX0KKworCXByaXZhdGUgZmluYWwgU2NoZW1lIGdldFNjaGVtZShTdHJpbmcgc2NoZW1lSWQpIHsKKwkJcmV0dXJuIGJpbmRpbmdNYW5hZ2VyLmdldFNjaGVtZShzY2hlbWVJZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ29udGV4dHMoT2JqZWN0IG1lKSB7CisJCWlmIChtZSBpbnN0YW5jZW9mIE1CaW5kaW5ncykgeworCQkJTUNvbnRleHQgY29udGV4dE1vZGVsID0gKE1Db250ZXh0KSBtZTsKKwkJCU1CaW5kaW5ncyBjb250YWluZXIgPSAoTUJpbmRpbmdzKSBtZTsKKwkJCUxpc3Q8TUJpbmRpbmdDb250ZXh0PiBiaW5kaW5nQ29udGV4dHMgPSBjb250YWluZXIKKwkJCQkJLmdldEJpbmRpbmdDb250ZXh0cygpOworCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TW9kZWwuZ2V0Q29udGV4dCgpOworCQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAhYmluZGluZ0NvbnRleHRzLmlzRW1wdHkoKSkgeworCQkJCUVDb250ZXh0U2VydmljZSBjcyA9IGNvbnRleHQuZ2V0KEVDb250ZXh0U2VydmljZS5jbGFzcyk7CisJCQkJZm9yIChNQmluZGluZ0NvbnRleHQgZWxlbWVudCA6IGJpbmRpbmdDb250ZXh0cykgeworCQkJCQljcy5hY3RpdmF0ZUNvbnRleHQoZWxlbWVudC5nZXRFbGVtZW50SWQoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChtZSBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCUxpc3Q8TVVJRWxlbWVudD4gY2hpbGRyZW4gPSAoKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSBtZSkuZ2V0Q2hpbGRyZW4oKTsKKwkJCUl0ZXJhdG9yPE1VSUVsZW1lbnQ+IGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOworCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisJCQkJTVVJRWxlbWVudCBlID0gaS5uZXh0KCk7CisJCQkJYWN0aXZhdGVDb250ZXh0cyhlKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBkZWZpbmVCaW5kaW5nVGFibGVzKCkgeworCQlBY3RpdmF0b3IudHJhY2UoUG9saWN5LkRFQlVHX0NNRFMsCisJCQkJIkluaXRpYWxpemUgYmluZGluZyB0YWJsZXMgZnJvbSBtb2RlbCIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCWZvciAoTUJpbmRpbmdUYWJsZSBiaW5kaW5nVGFibGUgOiBhcHBsaWNhdGlvbi5nZXRCaW5kaW5nVGFibGVzKCkpIHsKKwkJCWRlZmluZUJpbmRpbmdUYWJsZShiaW5kaW5nVGFibGUpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGJpbmRpbmdUYWJsZQorCSAqLworCXByaXZhdGUgdm9pZCBkZWZpbmVCaW5kaW5nVGFibGUoTUJpbmRpbmdUYWJsZSBiaW5kaW5nVGFibGUpIHsKKwkJQXNzZXJ0LmlzTm90TnVsbCgKKwkJCQliaW5kaW5nVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSwKKwkJCQkiQmluZGluZyBjb250ZXh0IHJlZmVycmVkIHRvIGJ5IHRoZSBiaW5kaW5nIHRhYmxlIFwiIiArIGJpbmRpbmdUYWJsZS5nZXRFbGVtZW50SWQoKSArICJcIiIpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5pc05vdE51bGwoYmluZGluZ1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0RWxlbWVudElkKCksCisJCQkJIkVsZW1lbnQgSUQgb2YgYmluZGluZyB0YWJsZSBcIiIgKyBiaW5kaW5nVGFibGUuZ2V0RWxlbWVudElkKCkgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJZmluYWwgQ29udGV4dCBiaW5kaW5nQ29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoYmluZGluZ1RhYmxlCisJCQkJLmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0RWxlbWVudElkKCkpOworCQlCaW5kaW5nVGFibGUgdGFibGUgPSBiaW5kaW5nVGFibGVzLmdldFRhYmxlKGJpbmRpbmdUYWJsZQorCQkJCS5nZXRCaW5kaW5nQ29udGV4dCgpLmdldEVsZW1lbnRJZCgpKTsKKwkJaWYgKHRhYmxlID09IG51bGwpIHsKKwkJCXRhYmxlID0gbmV3IEJpbmRpbmdUYWJsZShiaW5kaW5nQ29udGV4dCk7CisJCQliaW5kaW5nVGFibGVzLmFkZFRhYmxlKHRhYmxlKTsKKwkJfQorCQlmb3IgKE1LZXlCaW5kaW5nIGJpbmRpbmcgOiBiaW5kaW5nVGFibGUuZ2V0QmluZGluZ3MoKSkgeworCQkJZGVmaW5lQmluZGluZyh0YWJsZSwgYmluZGluZ0NvbnRleHQsIGJpbmRpbmcpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGJpbmRpbmdUYWJsZQorCSAqIEBwYXJhbSBiaW5kaW5nCisJICovCisJcHJpdmF0ZSB2b2lkIGRlZmluZUJpbmRpbmcoQmluZGluZ1RhYmxlIGJpbmRpbmdUYWJsZSwKKwkJCUNvbnRleHQgYmluZGluZ0NvbnRleHQsIE1LZXlCaW5kaW5nIGJpbmRpbmcpIHsKKwkJQmluZGluZyBrZXlCaW5kaW5nID0gY3JlYXRlQmluZGluZyhiaW5kaW5nQ29udGV4dCwKKwkJCQliaW5kaW5nLmdldENvbW1hbmQoKSwgYmluZGluZy5nZXRQYXJhbWV0ZXJzKCksCisJCQkJYmluZGluZy5nZXRLZXlTZXF1ZW5jZSgpLCBiaW5kaW5nKTsKKwkJaWYgKGtleUJpbmRpbmcgIT0gbnVsbAorCQkJCSYmICFiaW5kaW5nLmdldFRhZ3MoKS5jb250YWlucygKKwkJCQkJCUVCaW5kaW5nU2VydmljZS5ERUxFVEVEX0JJTkRJTkdfVEFHKSkgeworCQkJYmluZGluZ1RhYmxlLmFkZEJpbmRpbmcoa2V5QmluZGluZyk7CisJCX0KKwl9CisKKwlwcml2YXRlIEJpbmRpbmcgY3JlYXRlQmluZGluZyhDb250ZXh0IGJpbmRpbmdDb250ZXh0LCBNQ29tbWFuZCBjbWRNb2RlbCwKKwkJCUxpc3Q8TVBhcmFtZXRlcj4gbW9kZWxQYXJtcywgU3RyaW5nIGtleVNlcXVlbmNlLCBNS2V5QmluZGluZyBiaW5kaW5nKSB7CisJCUJpbmRpbmcga2V5QmluZGluZyA9IG51bGw7CisKKwkJaWYgKGJpbmRpbmcuZ2V0VHJhbnNpZW50RGF0YSgpCisJCQkJLmdldChFQmluZGluZ1NlcnZpY2UuTU9ERUxfVE9fQklORElOR19LRVkpICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJa2V5QmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5nLmdldFRyYW5zaWVudERhdGEoKS5nZXQoCisJCQkJCQlFQmluZGluZ1NlcnZpY2UuTU9ERUxfVE9fQklORElOR19LRVkpOworCQkJCXJldHVybiBrZXlCaW5kaW5nOworCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworCQkJCVN5c3RlbS5lcnIKKwkJCQkJCS5wcmludGxuKCJJbnZhbGlkIHR5cGUgc3RvcmVkIGluIHRyYW5zaWVudCBkYXRhIHdpdGggdGhlIGtleSAiCisJCQkJCQkJCSsgRUJpbmRpbmdTZXJ2aWNlLk1PREVMX1RPX0JJTkRJTkdfS0VZKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCisJCWlmIChjbWRNb2RlbCA9PSBudWxsKSB7CisJCQlBY3RpdmF0b3IubG9nKElTdGF0dXMuRVJST1IsICJiaW5kaW5nIHdpdGggbm8gY29tbWFuZDogIiArIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBudWxsOworCQlpZiAobW9kZWxQYXJtcyAhPSBudWxsICYmICFtb2RlbFBhcm1zLmlzRW1wdHkoKSkgeworCQkJcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJZm9yIChNUGFyYW1ldGVyIG1QYXJtIDogbW9kZWxQYXJtcykgeworCQkJCXBhcmFtZXRlcnMucHV0KG1QYXJtLmdldE5hbWUoKSwgbVBhcm0uZ2V0VmFsdWUoKSk7CisJCQl9CisJCX0KKwkJUGFyYW1ldGVyaXplZENvbW1hbmQgY21kID0gY29tbWFuZFNlcnZpY2UuY3JlYXRlQ29tbWFuZCgKKwkJCQljbWRNb2RlbC5nZXRFbGVtZW50SWQoKSwgcGFyYW1ldGVycyk7CisJCVRyaWdnZXJTZXF1ZW5jZSBzZXF1ZW5jZSA9IG51bGw7CisJCXNlcXVlbmNlID0gYmluZGluZ1NlcnZpY2UuY3JlYXRlU2VxdWVuY2Uoa2V5U2VxdWVuY2UpOworCisJCWlmIChjbWQgPT0gbnVsbCkgeworCQkJU3lzdGVtLmVycgorCQkJCQkucHJpbnRsbigiRmFpbGVkIHRvIGZpbmQgY29tbWFuZCBmb3IgYmluZGluZzogIiArIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoc2VxdWVuY2UgPT0gbnVsbCkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gbWFwIGJpbmRpbmc6ICIgKyBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgc2NoZW1lSWQgPSBudWxsOworCQkJCVN0cmluZyBsb2NhbGUgPSBudWxsOworCQkJCVN0cmluZyBwbGF0Zm9ybSA9IG51bGw7CisKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQkJTGlzdDxTdHJpbmc+IHRhZ3MgPSBiaW5kaW5nLmdldFRhZ3MoKTsKKwkJCQlmb3IgKFN0cmluZyB0YWcgOiB0YWdzKSB7CisJCQkJCS8vIHJlbWVtYmVyIHRvIHNraXAgdGhlICc6JyBpbiBlYWNoIHRhZyEKKwkJCQkJaWYgKHRhZy5zdGFydHNXaXRoKEVCaW5kaW5nU2VydmljZS5TQ0hFTUVfSURfQVRUUl9UQUcpKSB7CisJCQkJCQlzY2hlbWVJZCA9IHRhZy5zdWJzdHJpbmcoOSk7CisJCQkJCQlhdHRycy5wdXQoRUJpbmRpbmdTZXJ2aWNlLlNDSEVNRV9JRF9BVFRSX1RBRywgc2NoZW1lSWQpOworCQkJCQl9IGVsc2UgaWYgKHRhZy5zdGFydHNXaXRoKEVCaW5kaW5nU2VydmljZS5MT0NBTEVfQVRUUl9UQUcpKSB7CisJCQkJCQlsb2NhbGUgPSB0YWcuc3Vic3RyaW5nKDcpOworCQkJCQkJYXR0cnMucHV0KEVCaW5kaW5nU2VydmljZS5MT0NBTEVfQVRUUl9UQUcsIGxvY2FsZSk7CisJCQkJCX0gZWxzZSBpZiAodGFnCisJCQkJCQkJLnN0YXJ0c1dpdGgoRUJpbmRpbmdTZXJ2aWNlLlBMQVRGT1JNX0FUVFJfVEFHKSkgeworCQkJCQkJcGxhdGZvcm0gPSB0YWcuc3Vic3RyaW5nKDkpOworCQkJCQkJYXR0cnMucHV0KEVCaW5kaW5nU2VydmljZS5QTEFURk9STV9BVFRSX1RBRywgcGxhdGZvcm0pOworCQkJCQl9IGVsc2UgaWYgKHRhZy5zdGFydHNXaXRoKEVCaW5kaW5nU2VydmljZS5UWVBFX0FUVFJfVEFHKSkgeworCQkJCQkJLy8gc3lzdGVtIGJpbmRpbmdzIHdvbid0IHBhc3MgdGhpcyBhdHRyCisJCQkJCQlhdHRycy5wdXQoRUJpbmRpbmdTZXJ2aWNlLlRZUEVfQVRUUl9UQUcsICJ1c2VyIik7CisJCQkJCX0KKwkJCQl9CisJCQkJa2V5QmluZGluZyA9IGJpbmRpbmdTZXJ2aWNlLmNyZWF0ZUJpbmRpbmcoc2VxdWVuY2UsIGNtZCwKKwkJCQkJCWJpbmRpbmdDb250ZXh0LmdldElkKCksIGF0dHJzKTsKKwkJCQliaW5kaW5nLmdldFRyYW5zaWVudERhdGEoKS5wdXQoCisJCQkJCQlFQmluZGluZ1NlcnZpY2UuTU9ERUxfVE9fQklORElOR19LRVksIGtleUJpbmRpbmcpOworCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCQlBY3RpdmF0b3IudHJhY2UoUG9saWN5LkRFQlVHX01FTlVTLAorCQkJCQkJImZhaWxlZCB0byBjcmVhdGU6ICIgKyBiaW5kaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCX0KKwkJcmV0dXJuIGtleUJpbmRpbmc7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoTUtleUJpbmRpbmcgYmluZGluZywgYm9vbGVhbiBhZGQsIE9iamVjdCBlT2JqKSB7CisJCU9iamVjdCBwYXJlbnRPYmogPSAoKEVPYmplY3QpIGJpbmRpbmcpLmVDb250YWluZXIoKTsKKwkJaWYgKCEocGFyZW50T2JqIGluc3RhbmNlb2YgTUJpbmRpbmdUYWJsZSkpIHsKKwkJCS8vIHRoZSBsaW5rIHdpbGwgYWxyZWFkeSBiZSBicm9rZW4gZm9yIHJlbW92ZXMsIHNvIHdlJ2xsIHRyeSB0aGlzCisJCQlpZiAoZU9iaiBpbnN0YW5jZW9mIE1CaW5kaW5nVGFibGUpIHsKKwkJCQlwYXJlbnRPYmogPSBlT2JqOworCQkJfQorCQl9CisKKwkJaWYgKHBhcmVudE9iaiA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNQmluZGluZ1RhYmxlIGJ0ID0gKE1CaW5kaW5nVGFibGUpIHBhcmVudE9iajsKKwkJZmluYWwgQ29udGV4dCBiaW5kaW5nQ29udGV4dCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoYnQKKwkJCQkuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRFbGVtZW50SWQoKSk7CisJCUJpbmRpbmdUYWJsZSB0YWJsZSA9IGJpbmRpbmdUYWJsZXMuZ2V0VGFibGUoYmluZGluZ0NvbnRleHQuZ2V0SWQoKSk7CisJCWlmICh0YWJsZSA9PSBudWxsKSB7CisJCQlBY3RpdmF0b3IubG9nKElTdGF0dXMuRVJST1IsICJUcnlpbmcgdG8gY3JlYXRlIFwnIiArIGJpbmRpbmcgLy8kTk9OLU5MUy0xJAorCQkJCQkrICJcJyB3aXRob3V0IGJpbmRpbmcgdGFibGUgIiArIGJpbmRpbmdDb250ZXh0LmdldElkKCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwkJQmluZGluZyBrZXlCaW5kaW5nID0gY3JlYXRlQmluZGluZyhiaW5kaW5nQ29udGV4dCwKKwkJCQliaW5kaW5nLmdldENvbW1hbmQoKSwgYmluZGluZy5nZXRQYXJhbWV0ZXJzKCksCisJCQkJYmluZGluZy5nZXRLZXlTZXF1ZW5jZSgpLCBiaW5kaW5nKTsKKwkJaWYgKGtleUJpbmRpbmcgIT0gbnVsbCkgeworCQkJaWYgKGFkZCkgeworCQkJCXRhYmxlLmFkZEJpbmRpbmcoa2V5QmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCXRhYmxlLnJlbW92ZUJpbmRpbmcoa2V5QmluZGluZyk7CisJCQl9CisJCX0KKwl9CisKKwlAUHJlRGVzdHJveQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVucmVnc2l0ZXJNb2RlbExpc3RlbmVycygpOworCX0KKworCXByaXZhdGUgdm9pZCByZWdpc3Rlck1vZGVsTGlzdGVuZXJzKCkgeworCQlhZGRpdGlvbkhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCU9iamVjdCBlbGVtZW50T2JqID0gZXZlbnQKKwkJCQkJCS5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuRUxFTUVOVCk7CisJCQkJaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCQkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJCQkJZm9yIChPYmplY3QgbmV3T2JqIDogVUlFdmVudHMuYXNJdGVyYWJsZShldmVudCwKKwkJCQkJCQkJVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSkpIHsKKwkJCQkJCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgTUJpbmRpbmdUYWJsZSkgeworCQkJCQkJCQlNQmluZGluZ1RhYmxlIGJ0ID0gKE1CaW5kaW5nVGFibGUpIG5ld09iajsKKwkJCQkJCQkJZmluYWwgQ29udGV4dCBiaW5kaW5nQ29udGV4dCA9IGNvbnRleHRNYW5hZ2VyCisJCQkJCQkJCQkJLmdldENvbnRleHQoYnQuZ2V0QmluZGluZ0NvbnRleHQoKQorCQkJCQkJCQkJCQkJLmdldEVsZW1lbnRJZCgpKTsKKwkJCQkJCQkJZmluYWwgQmluZGluZ1RhYmxlIHRhYmxlID0gbmV3IEJpbmRpbmdUYWJsZSgKKwkJCQkJCQkJCQliaW5kaW5nQ29udGV4dCk7CisJCQkJCQkJCWJpbmRpbmdUYWJsZXMuYWRkVGFibGUodGFibGUpOworCQkJCQkJCQlMaXN0PE1LZXlCaW5kaW5nPiBiaW5kaW5ncyA9IGJ0LmdldEJpbmRpbmdzKCk7CisJCQkJCQkJCWZvciAoTUtleUJpbmRpbmcgYmluZGluZyA6IGJpbmRpbmdzKSB7CisJCQkJCQkJCQlCaW5kaW5nIGtleUJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKAorCQkJCQkJCQkJCQliaW5kaW5nQ29udGV4dCwKKwkJCQkJCQkJCQkJYmluZGluZy5nZXRDb21tYW5kKCksCisJCQkJCQkJCQkJCWJpbmRpbmcuZ2V0UGFyYW1ldGVycygpLAorCQkJCQkJCQkJCQliaW5kaW5nLmdldEtleVNlcXVlbmNlKCksIGJpbmRpbmcpOworCQkJCQkJCQkJaWYgKGtleUJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkJCQkJCXRhYmxlLmFkZEJpbmRpbmcoa2V5QmluZGluZyk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNQmluZGluZ1RhYmxlKSB7CisJCQkJCS8vIGFkZGluZyBhIGJpbmRpbmcKKwkJCQkJaWYgKFVJRXZlbnRzLmlzQUREKGV2ZW50KSkgeworCQkJCQkJZm9yIChPYmplY3QgbmV3T2JqIDogVUlFdmVudHMuYXNJdGVyYWJsZShldmVudCwKKwkJCQkJCQkJVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSkpIHsKKwkJCQkJCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgTUtleUJpbmRpbmcpIHsKKwkJCQkJCQkJTUtleUJpbmRpbmcgYmluZGluZyA9IChNS2V5QmluZGluZykgbmV3T2JqOworCQkJCQkJCQl1cGRhdGVCaW5kaW5nKGJpbmRpbmcsIHRydWUsIGVsZW1lbnRPYmopOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyByZW1vdmluZyBhIGJpbmRpbmcKKwkJCQkJZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQkJCQlmb3IgKE9iamVjdCBvbGRPYmogOiBVSUV2ZW50cy5hc0l0ZXJhYmxlKGV2ZW50LAorCQkJCQkJCQlVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKSkgeworCQkJCQkJCWlmIChvbGRPYmogaW5zdGFuY2VvZiBNS2V5QmluZGluZykgeworCQkJCQkJCQlNS2V5QmluZGluZyBiaW5kaW5nID0gKE1LZXlCaW5kaW5nKSBvbGRPYmo7CisJCQkJCQkJCXVwZGF0ZUJpbmRpbmcoYmluZGluZywgZmFsc2UsIGVsZW1lbnRPYmopOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIE1LZXlCaW5kaW5nKSB7CisJCQkJCU1LZXlCaW5kaW5nIGJpbmRpbmcgPSAoTUtleUJpbmRpbmcpIGVsZW1lbnRPYmo7CisKKwkJCQkJU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgZXZlbnQKKwkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkFUVE5BTUUpOworCisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTUtleUJpbmRpbmcuIiArIGF0dHJOYW1lICsgIjogIgorCQkJCQkvLyArIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5UWVBFKSk7CisJCQkJCWlmIChVSUV2ZW50cy5pc1NFVChldmVudCkpIHsKKwkJCQkJCU9iamVjdCBvbGRPYmogPSBldmVudAorCQkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk9MRF9WQUxVRSk7CisJCQkJCQlpZiAoVUlFdmVudHMuS2V5QmluZGluZy5DT01NQU5ELmVxdWFscyhhdHRyTmFtZSkpIHsKKwkJCQkJCQlNS2V5QmluZGluZyBvbGRCaW5kaW5nID0gKE1LZXlCaW5kaW5nKSBFY29yZVV0aWwKKwkJCQkJCQkJCS5jb3B5KChFT2JqZWN0KSBiaW5kaW5nKTsKKwkJCQkJCQlvbGRCaW5kaW5nLnNldENvbW1hbmQoKE1Db21tYW5kKSBvbGRPYmopOworCQkJCQkJCXVwZGF0ZUJpbmRpbmcob2xkQmluZGluZywgZmFsc2UsCisJCQkJCQkJCQkoKEVPYmplY3QpIGJpbmRpbmcpLmVDb250YWluZXIoKSk7CisJCQkJCQkJdXBkYXRlQmluZGluZyhiaW5kaW5nLCB0cnVlLCBudWxsKTsKKwkJCQkJCX0gZWxzZSBpZiAoVUlFdmVudHMuS2V5U2VxdWVuY2UuS0VZU0VRVUVOQ0UKKwkJCQkJCQkJLmVxdWFscyhhdHRyTmFtZSkpIHsKKwkJCQkJCQlNS2V5QmluZGluZyBvbGRCaW5kaW5nID0gKE1LZXlCaW5kaW5nKSBFY29yZVV0aWwKKwkJCQkJCQkJCS5jb3B5KChFT2JqZWN0KSBiaW5kaW5nKTsKKwkJCQkJCQlvbGRCaW5kaW5nLnNldEtleVNlcXVlbmNlKChTdHJpbmcpIG9sZE9iaik7CisJCQkJCQkJdXBkYXRlQmluZGluZyhvbGRCaW5kaW5nLCBmYWxzZSwKKwkJCQkJCQkJCSgoRU9iamVjdCkgYmluZGluZykuZUNvbnRhaW5lcigpKTsKKwkJCQkJCQl1cGRhdGVCaW5kaW5nKGJpbmRpbmcsIHRydWUsIG51bGwpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKFVJRXZlbnRzLktleUJpbmRpbmcuUEFSQU1FVEVSUy5lcXVhbHMoYXR0ck5hbWUpKSB7CisJCQkJCQlpZiAoVUlFdmVudHMuaXNBREQoZXZlbnQpKSB7CisJCQkJCQkJT2JqZWN0IG5ld09iaiA9IGV2ZW50CisJCQkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSk7CisJCQkJCQkJTUtleUJpbmRpbmcgb2xkQmluZGluZyA9IChNS2V5QmluZGluZykgRWNvcmVVdGlsCisJCQkJCQkJCQkuY29weSgoRU9iamVjdCkgYmluZGluZyk7CisJCQkJCQkJaWYgKFVJRXZlbnRzLkV2ZW50VHlwZXMuQUREX01BTlkuZXF1YWxzKGV2ZW50CisJCQkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLlRZUEUpKSkgeworCQkJCQkJCQlvbGRCaW5kaW5nLmdldFBhcmFtZXRlcnMoKS5yZW1vdmVBbGwoCisJCQkJCQkJCQkJKENvbGxlY3Rpb248Pz4pIG5ld09iaik7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJb2xkQmluZGluZy5nZXRQYXJhbWV0ZXJzKCkucmVtb3ZlKG5ld09iaik7CisJCQkJCQkJfQorCQkJCQkJCXVwZGF0ZUJpbmRpbmcob2xkQmluZGluZywgZmFsc2UsCisJCQkJCQkJCQkoKEVPYmplY3QpIGJpbmRpbmcpLmVDb250YWluZXIoKSk7CisJCQkJCQkJdXBkYXRlQmluZGluZyhiaW5kaW5nLCB0cnVlLCBudWxsKTsKKwkJCQkJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQkJCQkJT2JqZWN0IG9sZE9iaiA9IGV2ZW50CisJCQkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk9MRF9WQUxVRSk7CisJCQkJCQkJTUtleUJpbmRpbmcgb2xkQmluZGluZyA9IChNS2V5QmluZGluZykgRWNvcmVVdGlsCisJCQkJCQkJCQkuY29weSgoRU9iamVjdCkgYmluZGluZyk7CisJCQkJCQkJaWYgKFVJRXZlbnRzLkV2ZW50VHlwZXMuUkVNT1ZFX01BTlkuZXF1YWxzKGV2ZW50CisJCQkJCQkJCQkuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLlRZUEUpKSkgeworCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQkJCQkJQ29sbGVjdGlvbjxNUGFyYW1ldGVyPiBwYXJtcyA9IChDb2xsZWN0aW9uPE1QYXJhbWV0ZXI+KSBvbGRPYmo7CisJCQkJCQkJCW9sZEJpbmRpbmcuZ2V0UGFyYW1ldGVycygpLmFkZEFsbChwYXJtcyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJb2xkQmluZGluZy5nZXRQYXJhbWV0ZXJzKCkuYWRkKAorCQkJCQkJCQkJCShNUGFyYW1ldGVyKSBvbGRPYmopOworCQkJCQkJCX0KKworCQkJCQkJCXVwZGF0ZUJpbmRpbmcob2xkQmluZGluZywgZmFsc2UsCisJCQkJCQkJCQkoKEVPYmplY3QpIGJpbmRpbmcpLmVDb250YWluZXIoKSk7CisJCQkJCQkJdXBkYXRlQmluZGluZyhiaW5kaW5nLCB0cnVlLCBudWxsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBpZiB3ZSd2ZSB1cGRhdGVkIHRoZSB0YWdzIGZvciBhbiBNS2V5QmluZGluZworCQkJCQllbHNlIGlmIChVSUV2ZW50cy5BcHBsaWNhdGlvbkVsZW1lbnQuVEFHUy5lcXVhbHMoYXR0ck5hbWUpKSB7CisJCQkJCQlMaXN0PFN0cmluZz4gdGFncyA9IGJpbmRpbmcuZ2V0VGFncygpOworCQkJCQkJLy8gaWYgd2UgYWRkZWQgYSBkZWxldGVkIHRhZyB0byB0aGUgTUtleUJpbmRpbmcsIHRoZW4KKwkJCQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBydW50aW1lIGJpbmRpbmcgdGFibGVzCisJCQkJCQlpZiAodGFncy5jb250YWlucyhFQmluZGluZ1NlcnZpY2UuREVMRVRFRF9CSU5ESU5HX1RBRykpIHsKKwkJCQkJCQl1cGRhdGVCaW5kaW5nKGJpbmRpbmcsIGZhbHNlLCBlbGVtZW50T2JqKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGVsc2Ugd2UncmUgYWRkaW5nIHRoZSBiaW5kaW5nIHRvIHRoZSBydW50aW1lIHRhYmxlcworCQkJCQkJZWxzZSB7CisJCQkJCQkJdXBkYXRlQmluZGluZyhiaW5kaW5nLCB0cnVlLCBlbGVtZW50T2JqKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKwkJYnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5CaW5kaW5nVGFibGVDb250YWluZXIuVE9QSUNfQklORElOR1RBQkxFUywKKwkJCQlhZGRpdGlvbkhhbmRsZXIpOworCQlicm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkJpbmRpbmdUYWJsZS5UT1BJQ19CSU5ESU5HUywgYWRkaXRpb25IYW5kbGVyKTsKKwkJYnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5LZXlCaW5kaW5nLlRPUElDX0NPTU1BTkQsIGFkZGl0aW9uSGFuZGxlcik7CisJCWJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuS2V5QmluZGluZy5UT1BJQ19QQVJBTUVURVJTLCBhZGRpdGlvbkhhbmRsZXIpOworCQlicm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLktleVNlcXVlbmNlLlRPUElDX0tFWVNFUVVFTkNFLAorCQkJCWFkZGl0aW9uSGFuZGxlcik7CisJCWJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuQXBwbGljYXRpb25FbGVtZW50LlRPUElDX1RBR1MsCisJCQkJYWRkaXRpb25IYW5kbGVyKTsKKworCQljb250ZXh0SGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0IGVsZW1lbnRPYmogPSBldmVudAorCQkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCQlPYmplY3QgbmV3T2JqID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSk7CisJCQkJaWYgKFVJRXZlbnRzLkV2ZW50VHlwZXMuU0VULmVxdWFscyhldmVudAorCQkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5UWVBFKSkKKwkJCQkJCSYmIG5ld09iaiBpbnN0YW5jZW9mIElFY2xpcHNlQ29udGV4dCkgeworCQkJCQlhY3RpdmF0ZUNvbnRleHRzKGVsZW1lbnRPYmopOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJYnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5Db250ZXh0LlRPUElDX0NPTlRFWFQsIGNvbnRleHRIYW5kbGVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdW5yZWdzaXRlck1vZGVsTGlzdGVuZXJzKCkgeworCQlicm9rZXIudW5zdWJzY3JpYmUoYWRkaXRpb25IYW5kbGVyKTsKKwkJYnJva2VyLnVuc3Vic2NyaWJlKGFkZGl0aW9uSGFuZGxlcik7CisJCWJyb2tlci51bnN1YnNjcmliZShhZGRpdGlvbkhhbmRsZXIpOworCQlicm9rZXIudW5zdWJzY3JpYmUoYWRkaXRpb25IYW5kbGVyKTsKKwkJYnJva2VyLnVuc3Vic2NyaWJlKGFkZGl0aW9uSGFuZGxlcik7CisJCWJyb2tlci51bnN1YnNjcmliZShjb250ZXh0SGFuZGxlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L3V0aWwvSVNXVFJlc291cmNlVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9zd3QvdXRpbC9JU1dUUmVzb3VyY2VVdGlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkzYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvc3d0L3V0aWwvSVNXVFJlc291cmNlVXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBCZXN0U29sdXRpb24uYXQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFRvbSBTY2hpbmRsIDx0b20uc2NoaW5kbEBiZXN0c29sdXRpb24uYXQ+IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklSZXNvdXJjZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgaW50ZXJmYWNlIElTV1RSZXNvdXJjZVV0aWxpdGllcyBleHRlbmRzCisJCUlSZXNvdXJjZVV0aWxpdGllczxJbWFnZURlc2NyaXB0b3I+IHsKKworCS8qKgorCSAqIExvdy1sZXZlbCB1dGlsaXR5IHRvIHN0YW1wIGFuIGFkb3JubWVudCBvbnRvIGEgZ2l2ZW4gSW1hZ2UuCisJICoKKwkgKiBAcGFyYW0gdG9BZG9ybgorCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIGJlIGFkb3JuZWQgKG11c3Qgbm90IGJlIG51bGwpCisJICogQHBhcmFtIGFkb3JubWVudAorCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIGFkb3JuIHdpdGguCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhZG9ybmVkIGltYWdlIG9yICd0b0Fkb3JuJyBpZiAnYWRvcm5tZW50JyBpcyBudWxsCisJICovCisJcHVibGljIEltYWdlIGFkb3JuSW1hZ2UoSW1hZ2UgdG9BZG9ybiwgSW1hZ2UgYWRvcm5tZW50KTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzA5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXJhcCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSmF2YVNFLTEuNyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MWIwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8ub3B0aW9ucwpAQCAtMCwwICsxLDcgQEAKK29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9kZWJ1ZyA9IGZhbHNlCitvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvdHJhY2UvbWVudXMgPSBmYWxzZQorb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3RyYWNlL2NvbW1hbmRzID0gZmFsc2UKK29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC90cmFjZS9lY2xpcHNlLmNvbnRleHQgPSBmYWxzZQorb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3RyYWNlL2VjbGlwc2UuY29udGV4dC52ZXJib3NlID0gZmFsc2UKK29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC90cmFjZS93b3JrYmVuY2ggPSBmYWxzZQorb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3RyYWNlL3JlbmRlcmVyID0gZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyNjg5MQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaDwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmRzLmNvcmUuYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFmOWMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpAQCAtMCwwICsxLDQzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8Y29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2giIHZlcnNpb249IjIiPgorICAgIDxyZXNvdXJjZSBwYXRoPSJNRVRBLUlORi9NQU5JRkVTVC5NRiI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDMxOTQ2MyAtIFJlbW92ZSBkZWFkIGNvZGUiIGlkPSI5MjM3OTU0NjEiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSIxLjEuMCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSIxLjAuMSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjkyNDg0NDAzOSI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjEuMi4yIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjEuMi4xIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJNRVRBLUlORi9NQU5JRkVTVC5NRiIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsU2VydmljZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDMxOTQ2MyAtIFJlbW92ZSBkZWFkIGNvZGUiIGlkPSIzMDUzMjQxMzQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxTZXJ2aWNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaF8xLjEuMCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9JUHJlc2VudGF0aW9uRW5naW5lLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMTIwOTAwODEzMCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjEuMyIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSIxLjIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iQUNUSVZFIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL1VJRXZlbnRzLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cyRBcHBsaWNhdGlvbiI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iTmV3IGRpYWxvZ3MgZmllbGQgaW4gTUFwcGxpY2F0aW9uIiBpZD0iNDAzNzY3MzM2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLkFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkRJQUxPR1MiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9Ik5ldyBkaWFsb2dzIGZpZWxkIGluIE1BcHBsaWNhdGlvbiIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5BcHBsaWNhdGlvbiIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJUT1BJQ19ESUFMT0dTIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL1VJRXZlbnRzLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cyRDYXRlZ29yeSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5DYXRlZ29yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMT0NBTElaRURfTkFNRSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5DYXRlZ29yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJUT1BJQ19MT0NBTElaRURfTkFNRSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9VSUV2ZW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMkQ29tbWFuZCI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5Db21tYW5kIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxPQ0FMSVpFRF9DT01NQU5ETkFNRSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5Db21tYW5kIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxPQ0FMSVpFRF9ERVNDUklQVElPTiIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5Db21tYW5kIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRPUElDX0xPQ0FMSVpFRF9DT01NQU5ETkFNRSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5Db21tYW5kIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRPUElDX0xPQ0FMSVpFRF9ERVNDUklQVElPTiIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9VSUV2ZW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMkUGFydCI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5QYXJ0Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxPQ0FMSVpFRF9ERVNDUklQVElPTiIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5QYXJ0Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRPUElDX0xPQ0FMSVpFRF9ERVNDUklQVElPTiIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9VSUV2ZW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMkUGFydERlc2NyaXB0b3IiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MjM5OTEgLSBBZGQgc3VwcG9ydCBmb3IgTG9jYWxlIGNoYW5nZXMgYXQgcnVudGltZSB0byB0aGUgQXBwbGljYXRpb24gTW9kZWwiIGlkPSI0MDM3NjczMzYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuUGFydERlc2NyaXB0b3IiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTE9DQUxJWkVEX0RFU0NSSVBUSU9OIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDIzOTkxIC0gQWRkIHN1cHBvcnQgZm9yIExvY2FsZSBjaGFuZ2VzIGF0IHJ1bnRpbWUgdG8gdGhlIEFwcGxpY2F0aW9uIE1vZGVsIiBpZD0iNDAzNzY3MzM2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLlBhcnREZXNjcmlwdG9yIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRPUElDX0xPQ0FMSVpFRF9ERVNDUklQVElPTiIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9VSUV2ZW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMkVUlFbGVtZW50Ij4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDIzOTkxIC0gQWRkIHN1cHBvcnQgZm9yIExvY2FsZSBjaGFuZ2VzIGF0IHJ1bnRpbWUgdG8gdGhlIEFwcGxpY2F0aW9uIE1vZGVsIiBpZD0iNDAzNzY3MzM2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLlVJRWxlbWVudCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMT0NBTElaRURfQUNDRVNTSUJJTElUWVBIUkFTRSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5VSUVsZW1lbnQiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iVE9QSUNfTE9DQUxJWkVEX0FDQ0VTU0lCSUxJVFlQSFJBU0UiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvVUlFdmVudHMuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzJFVJTGFiZWwiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MjM5OTEgLSBBZGQgc3VwcG9ydCBmb3IgTG9jYWxlIGNoYW5nZXMgYXQgcnVudGltZSB0byB0aGUgQXBwbGljYXRpb24gTW9kZWwiIGlkPSI0MDM3NjczMzYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuVUlMYWJlbCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMT0NBTElaRURfTEFCRUwiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MjM5OTEgLSBBZGQgc3VwcG9ydCBmb3IgTG9jYWxlIGNoYW5nZXMgYXQgcnVudGltZSB0byB0aGUgQXBwbGljYXRpb24gTW9kZWwiIGlkPSI0MDM3NjczMzYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuVUlMYWJlbCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMT0NBTElaRURfVE9PTFRJUCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5VSUxhYmVsIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRPUElDX0xPQ0FMSVpFRF9MQUJFTCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQyMzk5MSAtIEFkZCBzdXBwb3J0IGZvciBMb2NhbGUgY2hhbmdlcyBhdCBydW50aW1lIHRvIHRoZSBBcHBsaWNhdGlvbiBNb2RlbCIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5VSUxhYmVsIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRPUElDX0xPQ0FMSVpFRF9UT09MVElQIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL1VJRXZlbnRzLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cyRVSUxpZmVDeWNsZSI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5VSUxpZmVDeWNsZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJBUFBfU0hVVERPV05fU1RBUlRFRCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5VSUxpZmVDeWNsZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJQRVJTUEVDVElWRV9SRVNFVCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQWxsIG9mIHRoZSBzdWJpbnRlcmZhY2VzIHNob3VsZG4ndCBiZSBzdWJjbGFzc2VkIGVpdGhlciIgaWQ9IjQwMzc2NzMzNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5VSUxpZmVDeWNsZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJUSEVNRV9DSEFOR0VEIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDAzNzY3MzM2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLlVJTGlmZUN5Y2xlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlRIRU1FX0RFRklOSVRJT05fQ0hBTkdFRCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FT2JqTW9kZWxIYW5kbGVyLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FT2JqTW9kZWxIYW5kbGVyIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU9iak1vZGVsSGFuZGxlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRBZGFwdGVyKE9iamVjdCwgQ2xhc3MpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU9iak1vZGVsSGFuZGxlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRBZGFwdGVyTGlzdCgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU9iak1vZGVsSGFuZGxlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRDaGlsZHJlbihPYmplY3QsIFN0cmluZykiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjMzODk0NDEyNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FT2JqTW9kZWxIYW5kbGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImdldFByb3BJZHMoT2JqZWN0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iMzM4OTQ0MTI2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVPYmpNb2RlbEhhbmRsZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0UHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU9iak1vZGVsSGFuZGxlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJzZXRQcm9wZXJ0eShPYmplY3QsIFN0cmluZywgT2JqZWN0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iMzM4OTQ4MjIzIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVPYmpNb2RlbEhhbmRsZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRU9iak1vZGVsSGFuZGxlcigpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0VQbGFjZWhvbGRlclJlc29sdmVyLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGxhY2Vob2xkZXJSZXNvbHZlciI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iNDA2MDUyOTkwIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQbGFjZWhvbGRlclJlc29sdmVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InJlc29sdmVQbGFjZWhvbGRlclJlZihNUGxhY2Vob2xkZXIsIE1XaW5kb3cpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lEZWx0YS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSURlbHRhIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSI0MDYwNTI5OTAiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSURlbHRhIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImFwcGx5KCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JRGVsdGEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0T2JqZWN0KCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSU1vZGVsUmVjb25jaWxpbmdTZXJ2aWNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iYXBwbHlEZWx0YXMoQ29sbGVjdGlvbiZsdDtNb2RlbERlbHRhJmd0OykiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iYXBwbHlEZWx0YXMoQ29sbGVjdGlvbiZsdDtNb2RlbERlbHRhJmd0OywgU3RyaW5nW10pIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSI0MDYwNTI5OTAiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSU1vZGVsUmVjb25jaWxpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZU1vZGVsUmVjb25jaWxlcigpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lQYXJ0TGlzdGVuZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklQYXJ0TGlzdGVuZXIiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JUGFydExpc3RlbmVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InBhcnRBY3RpdmF0ZWQoTVBhcnQpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSI0MDYwNTI5OTAiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSVBhcnRMaXN0ZW5lciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJwYXJ0QnJvdWdodFRvVG9wKE1QYXJ0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iNDA2MDUyOTkwIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklQYXJ0TGlzdGVuZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0icGFydERlYWN0aXZhdGVkKE1QYXJ0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iNDA2MDUyOTkwIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklQYXJ0TGlzdGVuZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0icGFydEhpZGRlbihNUGFydCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JUGFydExpc3RlbmVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InBhcnRWaXNpYmxlKE1QYXJ0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JU2F2ZUhhbmRsZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklTYXZlSGFuZGxlciI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iNDA2MDUyOTkwIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklTYXZlSGFuZGxlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJwcm9tcHRUb1NhdmUoQ29sbGVjdGlvbiZsdDtNUGFydCZndDspIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSI0MDYwNTI5OTAiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSVNhdmVIYW5kbGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InByb21wdFRvU2F2ZShNUGFydCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JU2F2ZUhhbmRsZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ic2F2ZShNUGFydCwgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JU2F2ZUhhbmRsZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ic2F2ZVBhcnRzKENvbGxlY3Rpb24mbHQ7TVBhcnQmZ3Q7LCBib29sZWFuKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JU2VsZWN0aW9uTGlzdGVuZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklTZWxlY3Rpb25MaXN0ZW5lciI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iNDA2MDUyOTkwIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklTZWxlY3Rpb25MaXN0ZW5lciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJzZWxlY3Rpb25DaGFuZ2VkKE1QYXJ0LCBPYmplY3QpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lXaW5kb3dDbG9zZUhhbmRsZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklXaW5kb3dDbG9zZUhhbmRsZXIiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjQwNjA1Mjk5MCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JV2luZG93Q2xvc2VIYW5kbGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNsb3NlKE1XaW5kb3cpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL01vZGVsRGVsdGEuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsRGVsdGEiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjMzODk0NDEyNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbERlbHRhIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNvbnZlcnQoT2JqZWN0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iMzM4OTQ0MTI2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsRGVsdGEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0QXR0cmlidXRlTmFtZSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxEZWx0YSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRBdHRyaWJ1dGVWYWx1ZSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxEZWx0YSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRPYmplY3QoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iMzM4OTQ4MjIzIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsRGVsdGEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTW9kZWxEZWx0YShPYmplY3QsIFN0cmluZywgT2JqZWN0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9Nb2RlbEhhbmRsZXJCYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbEhhbmRsZXJCYXNlIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxIYW5kbGVyQmFzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRDaGlsZHJlbihPYmplY3QsIFN0cmluZykiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjMzODk0NDEyNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbEhhbmRsZXJCYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImdldFByb3BJZHMoT2JqZWN0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iMzM4OTQ0MTI2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsSGFuZGxlckJhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0UHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxIYW5kbGVyQmFzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJzZXRQcm9wZXJ0eShPYmplY3QsIFN0cmluZywgT2JqZWN0KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iQnVnIDQxMTI1NyAtIC5hcGlfZGVzY3JpcHRpb24gZmlsZXMgaW4gS2VwbGVyIHJlbGVhc2UgZG8gbm90IGNvbnRhaW4gQG5vcmVmZXJlbmNlIiBpZD0iMzM4OTQ4MjIzIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsSGFuZGxlckJhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTW9kZWxIYW5kbGVyQmFzZSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL01vZGVsUmVjb25jaWxlci5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxSZWNvbmNpbGVyIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxSZWNvbmNpbGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNvbnN0cnVjdERlbHRhcyhPYmplY3QsIE9iamVjdCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkJ1ZyA0MTEyNTcgLSAuYXBpX2Rlc2NyaXB0aW9uIGZpbGVzIGluIEtlcGxlciByZWxlYXNlIGRvIG5vdCBjb250YWluIEBub3JlZmVyZW5jZSIgaWQ9IjMzODk0NDEyNiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbFJlY29uY2lsZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0icmVjb3JkQ2hhbmdlcyhPYmplY3QpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDQxMjYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxSZWNvbmNpbGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InNlcmlhbGl6ZSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJCdWcgNDExMjU3IC0gLmFwaV9kZXNjcmlwdGlvbiBmaWxlcyBpbiBLZXBsZXIgcmVsZWFzZSBkbyBub3QgY29udGFpbiBAbm9yZWZlcmVuY2UiIGlkPSIzMzg5NDgyMjMiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxSZWNvbmNpbGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Ik1vZGVsUmVjb25jaWxlcigpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyZTFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpAQCAtMCwwICsxLDIgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorbGluZS5zZXBhcmF0b3I9XG4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmYmIxOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDM5MSBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5tZXRob2RQYXJhbWV0ZXJzPWRvIG5vdCBnZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS43CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcm90ZWN0ZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2xpbmVfY29tbWVudF9zdGFydGluZ19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX3R5cGVfYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfbGFtYmRhX2Fycm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5qb2luX2xpbmVzX2luX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5qb2luX3dyYXBwZWRfbGluZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFGb3JtYXR0ZXI9b3JnLmVjbGlwc2UuamR0LmNvcmUuZGVmYXVsdEphdmFGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMWQzMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnByZWZzCkBAIC0wLDAgKzEsMiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJFRl9TVFJJQ1RMWV9DT01QQVRJQkxFX0pSRV9OT1RfQVZBSUxBQkxFPXdhcm5pbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzU1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsMTI0IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwX3Byb2ZpbGU9b3JnLmVjbGlwc2UuamR0LnVpLmRlZmF1bHQuZWNsaXBzZV9jbGVhbl91cF9wcm9maWxlCitjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQorZm9ybWF0dGVyX3Byb2ZpbGU9b3JnLmVjbGlwc2UuamR0LnVpLmRlZmF1bHQuZWNsaXBzZV9wcm9maWxlCitmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgorb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKK29yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Oworb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9OTkKK29yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTk5CitvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcmV0dXJuIHRoZSAke2JhcmVfZmllbGRfbmFtZX1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXG4gKiBAcGFyYW0gJHtwYXJhbX0gdGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXRcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxuICogJHt0YWdzfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAke3llYXJ9IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKlxuICogQ29udHJpYnV0b3JzXDpcbiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZGVsZWdhdGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBkZWxlZ2F0ZSBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmRlbGVnYXRlY29tbWVudCIgbmFtZVw9ImRlbGVnYXRlY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKiAke3NlZV90b190YXJnZXR9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XG5cbiR7dHlwZWNvbW1lbnR9XG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgorc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitzcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz1mYWxzZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9dHJ1ZQorc3BfY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitzcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitzcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz10cnVlCitzcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorc3BfY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitzcF9jbGVhbnVwLnVzZV9sYW1iZGE9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5ZWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLnByZWZzCkBAIC0wLDAgKzEsOTcgQEAKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRF9XSVRIT1VUX0RFRkFVTFRfVkFMVUU9RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9BUElfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9SRUVYUE9SVEVEX0FQSV9UWVBFPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1JFRVhQT1JURURfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFPUVycm9yCitBUElfVVNFX1NDQU5fRklFTERfU0VWRVJJVFk9RXJyb3IKK0FQSV9VU0VfU0NBTl9NRVRIT0RfU0VWRVJJVFk9RXJyb3IKK0FQSV9VU0VfU0NBTl9UWVBFX1NFVkVSSVRZPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfTUVUSE9EPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfUkVTVFJJQ1RJT05TPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9DT05TVFJVQ1RPUj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfU1VQRVJDTEFTUz1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX0NIQU5HRURfQ09OVFJBQ1RFRF9TVVBFUklOVEVSRkFDRVNfU0VUPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9FTlVNX0NPTlNUQU5UPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0FEREVEX1ZBTFVFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0ZJTkFMX1RPX05PTl9GSU5BTF9TVEFUSUNfQ09OU1RBTlQ9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX1NUQVRJQ19UT19TVEFUSUM9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQUxVRT1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9BUkdVTUVOVD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVkFMVUU9RXJyb3IKK0lMTEVHQUxfRVhURU5EPVdhcm5pbmcKK0lMTEVHQUxfSU1QTEVNRU5UPVdhcm5pbmcKK0lMTEVHQUxfSU5TVEFOVElBVEU9V2FybmluZworSUxMRUdBTF9PVkVSUklERT1XYXJuaW5nCitJTExFR0FMX1JFRkVSRU5DRT1XYXJuaW5nCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfU1VQRVJfSU5URVJGQUNFX1dJVEhfTUVUSE9EUz1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5WQUxJRF9KQVZBRE9DX1RBRz1XYXJuaW5nCitJTlZBTElEX1JFRkVSRU5DRV9JTl9TWVNURU1fTElCUkFSSUVTPUVycm9yCitMRUFLX0VYVEVORD1XYXJuaW5nCitMRUFLX0ZJRUxEX0RFQ0w9V2FybmluZworTEVBS19JTVBMRU1FTlQ9V2FybmluZworTEVBS19NRVRIT0RfUEFSQU09V2FybmluZworTEVBS19NRVRIT0RfUkVUVVJOX1RZUEU9V2FybmluZworTUVUSE9EX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fRklOQUxfVE9fRklOQUw9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fU1RBVElDX1RPX1NUQVRJQz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0FOTk9UQVRJT05fREVGQVVMVF9WQUxVRT1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitNSVNTSU5HX0VFX0RFU0NSSVBUSU9OUz1XYXJuaW5nCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQURERURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9BRERFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0NMQVNTX0JPVU5EPUVycm9yCitUWVBFX1BBUkFNRVRFUl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9JTlRFUkZBQ0VfQk9VTkQ9RXJyb3IKK1VOVVNFRF9QUk9CTEVNX0ZJTFRFUlM9V2FybmluZworYXV0b21hdGljYWxseV9yZW1vdmVkX3VudXNlZF9wcm9ibGVtX2ZpbHRlcnM9ZmFsc2UKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uPUVycm9yCitpbmNvbXBhdGlibGVfYXBpX2NvbXBvbmVudF92ZXJzaW9uX2luY2x1ZGVfbWFqb3Jfd2l0aG91dF9icmVha2luZ19jaGFuZ2U9RGlzYWJsZWQKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb25faW5jbHVkZV9taW5vcl93aXRob3V0X2FwaV9jaGFuZ2U9RGlzYWJsZWQKK2ludmFsaWRfc2luY2VfdGFnX3ZlcnNpb249RXJyb3IKK21hbGZvcm1lZF9zaW5jZV90YWc9RXJyb3IKK21pc3Npbmdfc2luY2VfdGFnPUVycm9yCityZXBvcnRfYXBpX2JyZWFrYWdlX3doZW5fbWFqb3JfdmVyc2lvbl9pbmNyZW1lbnRlZD1EaXNhYmxlZAorcmVwb3J0X3Jlc29sdXRpb25fZXJyb3JzX2FwaV9jb21wb25lbnQ9V2FybmluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlNTA0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKQEAgLTAsMCArMSwzMiBAQAorY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCitjb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCitjb21waWxlcnMucC5idWlsZD0xCitjb21waWxlcnMucC5idWlsZC5iaW4uaW5jbHVkZXM9MQorY29tcGlsZXJzLnAuYnVpbGQuZW5jb2RpbmdzPTIKK2NvbXBpbGVycy5wLmJ1aWxkLmphdmEuY29tcGlsZXI9MgorY29tcGlsZXJzLnAuYnVpbGQuamF2YS5jb21wbGlhbmNlPTEKK2NvbXBpbGVycy5wLmJ1aWxkLm1pc3Npbmcub3V0cHV0PTEKK2NvbXBpbGVycy5wLmJ1aWxkLm91dHB1dC5saWJyYXJ5PTEKK2NvbXBpbGVycy5wLmJ1aWxkLnNvdXJjZS5saWJyYXJ5PTEKK2NvbXBpbGVycy5wLmJ1aWxkLnNyYy5pbmNsdWRlcz0xCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKK2NvbXBpbGVycy5wLmludGVybmFsPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTIKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0xCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tcmVxdWlyZS1idW5kbGU9MQorY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKK2NvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKK2NvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKK2NvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQorY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKK2NvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCitjb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYworY29tcGlsZXJzLnMub3Blbi10YWdzPTEKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDQzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaDtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjMuMC5xdWFsaWZpZXIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLm9zZ2k7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcztidW5kbGUtdmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHM7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpO2J1bmRsZS12ZXJzaW9uPSIxLjEuMCIsCisgb3JnLmVjbGlwc2UuY29yZS5qb2JzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZTtidW5kbGUtdmVyc2lvbj0iMi41LjAiLAorIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMjAwLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQudWkuZGk7YnVuZGxlLXZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSIyLjcuMCIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zCitSZXF1aXJlLUNhcGFiaWxpdHk6IG9yZy5lY2xpcHNlLnJhcAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS43CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guZnJhZ21lbnQsCisgICBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dCwKKyAgIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QsCisgICBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giLAorIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5hZGRvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gsCisgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmxpZmVjeWNsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0IiwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5BY3RpdmF0b3IKK1NlcnZpY2UtQ29tcG9uZW50OiBPU0dJLUlORi9wcm9ncmVzcy54bWwsIE9TR0ktSU5GL3BhcnRTZXJ2aWNlLnhtbCwKKyBPU0dJLUlORi9sb2NhbGVjaGFuZ2VzZXJ2aWNlLnhtbAorSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iMy44LjEiLAorIGphdmF4LmFubm90YXRpb247dmVyc2lvbj0iMS4wLjAiLAorIGphdmF4LmluamVjdDt2ZXJzaW9uPSIxLjAuMCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL01FVEEtSU5GL3AyLmluZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL01FVEEtSU5GL3AyLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUxYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvTUVUQS1JTkYvcDIuaW5mCkBAIC0wLDAgKzEsMTMgQEAKKyMgRW5zdXJlIHRoYXQgbW9kaWZpZWQgUkFQIGU0IHBsYXRmb3JtIGJ1bmRsZXMgYXJlIG9ubHkgaW5zdGFsbGVkIGluIFJBUCBlbnZpcm9ubWVudAorIyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMTc3CisjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTA5MjIKKworIyBNYWtlIHN1cmUgdGhhdCBhIFJBUCBSV1QgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCityZXF1aXJlcy4wLm5hbWVzcGFjZSA9IG9yZy5lY2xpcHNlLnJhcAorcmVxdWlyZXMuMC5uYW1lID0gb3JnLmVjbGlwc2UucmFwLnJ3dAorCisjIERvIG5vdCBhbGxvdyB0byBpbnN0YWxsIHRoaXMgSVUgaW4gY2FzZSB0aGUgU1dUIGJ1bmRsZSBpcyBhdmFpbGFibGUKK3JlcXVpcmVzLjEubmFtZXNwYWNlID0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdQorcmVxdWlyZXMuMS5uYW1lID0gb3JnLmVjbGlwc2Uuc3d0CityZXF1aXJlcy4xLm1pbiA9IDAKK3JlcXVpcmVzLjEubWF4ID0gMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvT1NHSS1JTkYvbG9jYWxlY2hhbmdlc2VydmljZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9PU0dJLUlORi9sb2NhbGVjaGFuZ2VzZXJ2aWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZjZTUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvT1NHSS1JTkYvbG9jYWxlY2hhbmdlc2VydmljZS54bWwKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIG5hbWU9IklMb2NhbGVDaGFuZ2VTZXJ2aWNlIGNvbnRleHQgZnVuY3Rpb24iPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC5Mb2NhbGVDaGFuZ2VTZXJ2aWNlQ29udGV4dEZ1bmN0aW9uIi8+CisgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5jb250ZXh0LmtleSIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ubHMuSUxvY2FsZUNoYW5nZVNlcnZpY2UiLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb24iLz4KKyAgIDwvc2VydmljZT4KKzwvc2NyOmNvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL09TR0ktSU5GL3BhcnRTZXJ2aWNlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL09TR0ktSU5GL3BhcnRTZXJ2aWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkwNTRmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvT1NHSS1JTkYvcGFydFNlcnZpY2UueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucGFydFNlcnZpY2UiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUGFydFNlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uIi8+CisgICA8c2VydmljZT4KKyAgICAgIDxwcm92aWRlIGludGVyZmFjZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JQ29udGV4dEZ1bmN0aW9uIi8+CisgICA8L3NlcnZpY2U+CisgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5jb250ZXh0LmtleSIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZSIvPgorPC9zY3I6Y29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL09TR0ktSU5GL3Byb2dyZXNzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL09TR0ktSU5GL3Byb2dyZXNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M3YmVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvT1NHSS1JTkYvcHJvZ3Jlc3MueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucHJvZ3Jlc3MiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUHJvZ3Jlc3NNb25pdG9yRnVuY3Rpb24iLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb24iLz4KKyAgIDwvc2VydmljZT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLmNvbnRleHQua2V5IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciIvPgorPC9zY3I6Y29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlNGU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPk5vdmVtYmVyIDIwLCAyMDA4PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhMjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIC5vcHRpb25zLFwKKyAgICAgICAgICAgICAgIE9TR0ktSU5GLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitzcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKK3NvdXJjZS4uID0gc3JjLyxcCisgICAgICAgICAgIHNyYy1yYXAvCitqcmUuY29tcGlsYXRpb24ucHJvZmlsZSA9IEphdmFTRS0xLjcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL2ZvcmNlUXVhbGlmaWVyVXBkYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFkZGMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvZm9yY2VRdWFsaWZpZXJVcGRhdGUudHh0CkBAIC0wLDAgKzEsNCBAQAorIyBUbyBmb3JjZSBhIHZlcnNpb24gcXVhbGlmaWVyIHVwZGF0ZSBhZGQgdGhlIGJ1ZyBoZXJlCitCdWcgNDAzMzUyIC0gVXBkYXRlIGFsbCBwYXJlbnQgdmVyc2lvbnMgdG8gbWF0Y2ggb3VyIGJ1aWxkIHN0cmVhbQorQnVnIDQwNzk2MSAtIENvbXBhcmF0b3IgbG9nIHNob3dzIHNwZWNpYWwgcHJvYmxlbSB0aGF0IHdpbGwgcmVxdWlyZSAidG91Y2hlcyIKKwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGNhN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BsdWdpbk5hbWUgPSBFY2xpcHNlIGU0IFdvcmtiZW5jaAorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKKworY29udGVudC10eXBlLmU0Lm5hbWUgPSBlNCBYTUkKK2V4dGVuc2lvbi1wb2ludC5tb2RlbC5uYW1lID0gTW9kZWwgZXh0ZW5zaW9ucworZXh0ZW5zaW9uLXBvaW50Lm1vZGVsLmRlZmluaXRpb24uZW5yaWNobWVudC5uYW1lID0gTW9kZWwgZGVmaW5pdGlvbiBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY4MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvcGx1Z2luLnhtbApAQCAtMCwwICsxLDY4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgorPHBsdWdpbj4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9yZy5lY2xpcHNlLmU0LndvcmtiZW5jaC5tb2RlbCIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5tb2RlbC5uYW1lIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwuZXhzZCIvPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ib3JnLmVjbGlwc2UuZTQud29ya2JlbmNoLm1vZGVsLmRlZmluaXRpb24uZW5yaWNobWVudCIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5tb2RlbC5kZWZpbml0aW9uLmVucmljaG1lbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvb3JnLmVjbGlwc2UuZTQud29ya2JlbmNoLm1vZGVsLmRlZmluaXRpb24uZW5yaWNobWVudC5leHNkIi8+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5Db25maWd1cmF0aW9uRWxlbWVudEFkYXB0ZXIiPgorICAgICAgICAgPGFkYXB0ZXIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbEhhbmRsZXJCYXNlIj4KKyAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU9iak1vZGVsSGFuZGxlciI+CisgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsSGFuZGxlckJhc2UiPgorICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgPC9mYWN0b3J5PgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgorICAgICAgPHBhcnNlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5FNFhNSVJlc291cmNlRmFjdG9yeSIKKyAgICAgICAgICAgIHR5cGU9ImU0eG1pIj4KKyAgICAgIDwvcGFyc2VyPgorICAgPC9leHRlbnNpb24+CisgICAKKyAgIDxleHRlbnNpb24KKyAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+CisgICAgIDxjb250ZW50LXR5cGUKKyAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCisgICAgICAgICAgZmlsZS1leHRlbnNpb25zPSJlNHhtaSIKKyAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuY29udGVudC10eXBlIgorICAgICAgICAgIG5hbWU9IiVjb250ZW50LXR5cGUuZTQubmFtZSIKKyAgICAgICAgICBwcmlvcml0eT0ibG93Ij4KKyAgICAgPC9jb250ZW50LXR5cGU+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwuZGVmaW5pdGlvbi5lbnJpY2htZW50Ij4KKyAgICAgIDxkZWZpbml0aW9uRW5yaWNobWVudAorICAgICAgICAgICAgZVBhY2thZ2VOUz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24iPgorICAgICAgPC9kZWZpbml0aW9uRW5yaWNobWVudD4KKyAgICAgIDxkZWZpbml0aW9uRW5yaWNobWVudAorICAgICAgICAgICAgZVBhY2thZ2VOUz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24vY29tbWFuZHMiPgorICAgICAgPC9kZWZpbml0aW9uRW5yaWNobWVudD4KKyAgICAgIDxkZWZpbml0aW9uRW5yaWNobWVudAorICAgICAgICAgICAgZVBhY2thZ2VOUz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24vdWkiPgorICAgICAgPC9kZWZpbml0aW9uRW5yaWNobWVudD4KKyAgICAgIDxkZWZpbml0aW9uRW5yaWNobWVudAorICAgICAgICAgICAgZVBhY2thZ2VOUz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24vdWkvbWVudSI+CisgICAgICA8L2RlZmluaXRpb25FbnJpY2htZW50PgorICAgICAgPGRlZmluaXRpb25FbnJpY2htZW50CisgICAgICAgICAgICBlUGFja2FnZU5TPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi91aS9iYXNpYyI+CisgICAgICA8L2RlZmluaXRpb25FbnJpY2htZW50PgorICAgICAgPGRlZmluaXRpb25FbnJpY2htZW50CisgICAgICAgICAgICBlUGFja2FnZU5TPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi91aS9hZHZhbmNlZCI+CisgICAgICA8L2RlZmluaXRpb25FbnJpY2htZW50PgorICAgICAgPGRlZmluaXRpb25FbnJpY2htZW50CisgICAgICAgICAgICBlUGFja2FnZU5TPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi9kZXNjcmlwdG9yL2Jhc2ljIj4KKyAgICAgIDwvZGVmaW5pdGlvbkVucmljaG1lbnQ+CisgICAgICA8ZGVmaW5pdGlvbkVucmljaG1lbnQKKyAgICAgICAgICAgIGVQYWNrYWdlTlM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdWkvMjAxMC9VSU1vZGVsL2ZyYWdtZW50Ij4KKyAgICAgIDwvZGVmaW5pdGlvbkVucmljaG1lbnQ+CisgICA8L2V4dGVuc2lvbj4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvcG9tLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2YmI4YwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3BvbS54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UucmFwLmU0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQtcmVsZW5nPC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcmVsZW5nL3JlbGVuZy10YXJnZXQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDwhLS0gdG8gZW5zdXJlIHRoYXQgdGhlIGZlYXR1cmUgbG9va3VwIG9mIHRoZSB1aSB0ZXN0IHdvcmtzIC0tPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GLzwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHljaG8tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc2NoZW1hL29yZy5lY2xpcHNlLmU0LndvcmtiZW5jaC5tb2RlbC5kZWZpbml0aW9uLmVucmljaG1lbnQuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NjaGVtYS9vcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwuZGVmaW5pdGlvbi5lbnJpY2htZW50LmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjODY0MQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NjaGVtYS9vcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwuZGVmaW5pdGlvbi5lbnJpY2htZW50LmV4c2QKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2giIGlkPSJtb2RlbC5kZWZpbml0aW9uLmVucmljaG1lbnQiIG5hbWU9Ik1vZGVsIGRlZmluaXRpb24gZXh0ZW5zaW9ucyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAmbHQ7c3Ryb25nJmd0O1RoaXMgaXMgbm90IGFuIEFQSS4gVGhlIHNjaGVtYSBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgbm90IGZyb3plbiBhbmQgbWlnaHQgY2hhbmdlIGluIGEgbm9uLWJhY2t3YXJkIGNvbXBhdGlibGUgd2F5IGluIHRoZSBmdXR1cmUuJmx0Oy9zdHJvbmcmZ3Q7CismbHQ7cCZndDsKK1RoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGVucmljaCB0aGUgVUkgbW9kZWwgd2l0aCBjdXN0b20gVUkgbW9kZWwgZWxlbWVudHMuCismbHQ7cCZndDsKK1RvIGZpbmQgYW5kIGNyZWF0ZSBhIGN1c3RvbSBVSSBtb2RlbCBlbGVtZW50IHZpYSB0aGUgRU1vZGVsU2VydmljZSNjcmVhdGVNb2RlbEVsZW1lbnQoQ2xhc3MpIG1ldGhvZCB0aGUgZWxlbWVudHMgaGF2ZSB0byBiZSBwdWJsaXNjaGVkIHZpYSB0aGlzIEV4dGVuc2lvblBvaW50LgorJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVmaW5pdGlvbkVucmljaG1lbnQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbkVucmljaG1lbnQiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlUGFja2FnZU5TIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEEgbmFtZXNwYWNlIFVSSSB0byB0aGUgRVBhY2thZ2Ugd2hpY2ggY29udGFpbnMgY3VzdG9tIGFwcGxpY2F0aW9uIG1vZGVsIGNsYXNzZXMuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDQuNAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgdG8gcmVnaXN0ZXIgYSBtb2RlbCBkZWZpbml0b24gZW5yaWNobWVudDoKKworJmx0O2V4dGVuc2lvbgorICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwuZGVmaW5pdGlvbi5lbnJpY2htZW50JnF1b3Q7Jmd0OworICAmbHQ7ZGVmaW5pdGlvbkVucmljaG1lbnQKKyAgZVBhY2thZ2VOUz0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi91aSZxdW90OyZndDsKKyAgJmx0Oy9kZWZpbml0aW9uRW5yaWNobWVudCZndDsKKyZsdDsvZXh0ZW5zaW9uJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7CitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAoraHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zY2hlbWEvb3JnLmVjbGlwc2UuZTQud29ya2JlbmNoLm1vZGVsLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zY2hlbWEvb3JnLmVjbGlwc2UuZTQud29ya2JlbmNoLm1vZGVsLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmZTE1NwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NjaGVtYS9vcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwuZXhzZApAQCAtMCwwICsxLDIyNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaCIgaWQ9Im1vZGVsIiBuYW1lPSJNb2RlbCBleHRlbnNpb25zIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICZsdDtzdHJvbmcmZ3Q7VGhpcyBpcyBub3QgYW4gQVBJLiBUaGUgc2NoZW1hIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBub3QgZnJvemVuIGFuZCBtaWdodCBjaGFuZ2UgaW4gYSBub24tYmFja3dhcmQgY29tcGF0aWJsZSB3YXkgaW4gdGhlIGZ1dHVyZS4mbHQ7L3N0cm9uZyZndDsKKyZsdDtwJmd0OworVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgZXh0ZW5zaWJpbGl0eSBmb3IgdGhlIFVJIG1vZGVsIG9mIHRoZSBydW5uaW5nIGFwcGxpY2F0aW9uLiBNb2RpZmljYXRpb25zIGNhbiBiZSBkb25lIGluIGEgZGVjbGFyYXRpdmUgbWFubmVyIGJ5IHVzaW5nIFhNTCBtb2RlbCBmcmFnbWVudHMsIG9yIHByb2dyYW1tYXRpY2FsbHkgYnkgc3VwcGx5aW5nIG1vZGVsIHByb2Nlc3NvcnMuCismbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7CitXaGVuZXZlciBwb3NzaWJsZSwgdGhlIG1vZGVsIGV4dGVuc2lvbnMgb2YgZGVwZW5kZW50IGJ1bmRsZXMgYXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGV4dGVuc2lvbnMgb2YgYnVuZGxlcyB0aGF0IGRlcGVuZCBvbiB0aGVtLgorJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnJhZ21lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImZyYWdtZW50Ij4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICBUaGUgbW9kZWwgZnJhZ21lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIFVJIG1vZGVsIG9mIHRoZSBydW5uaW5nIGFwcGxpY2F0aW9uLiBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBtb2RlbCBmcmFnbWVudCBpcyBleHBlY3RlZCB0byBjb25mb3JtIHRvIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5mcmFnbWVudC5NTW9kZWxGcmFnbWVudHMmbHQ7L2NvZGUmZ3Q7ICBpbnRlcmZhY2UuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBVUkkgZGVzY3JpYmluZyBsb2NhdGlvbiBvZiB0aGUgbW9kZWwgZnJhZ21lbnQuICBDYW4gYmUgb2YgdGhlIGZvcm0gJmx0O2NvZGUmZ3Q7cGxhdGZvcm06L3BsdWdpbi9idW5kbGUuaWQvLi4ucGF0aCZsdDsvY29kZSZndDsuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGx5IiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJhbHdheXMiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGRlZmluZXMgaW4gd2hpY2ggY2FzZSBhIGZyYWdtZW50IGlzIG1lcmdlZCBpbnRvIHRoZSBtb2RlbDoKKyZsdDt1bCZndDsKKyZsdDtsaSZndDthbHdheXM6IGVhY2ggdGltZSB0aGUgYXBwbGljYXRpb24gc3RhcnRlZCBwb3RlbnRpYWxseSByZXBsYWNpbmcgZXhpc3RpbmcgbW9kZWwgZWxlbWVudHMgYW5kIGxvb3NpbmcgaW5mb3JtYXRpb24gc3RvcmVkJmx0Oy9saSZndDsKKyZsdDtsaSZndDtpbml0aWFsOiBvbmx5IHdoZW4gY29taW5nIGZyb20gYSBub25lIHBlcnNpc3RlbnQgc3RhdGUmbHQ7L2xpJmd0OworJmx0O2xpJmd0O25vdGV4aXN0czogb25seSBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5IGluIHRoZSBtb2RlbCZsdDsvbGkmZ3Q7CismbHQ7L3VsJmd0OworICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgICAgPHNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYWx3YXlzIj4KKyAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+CisgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImluaXRpYWwiPgorICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibm90ZXhpc3RzIj4KKyAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+CisgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzb3IiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIFByb2dyYW1tYXRpYyBwcm9jZXNzb3IgdGhhdCBnZXRzIGNhbGxlZCB3aXRoIHRoZSBpbnRlbnRpb24gb2YgbW9kaWZ5aW5nIFVJIG1vZGVsLgorICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBKYXZhIGNsYXNzIGNvbnRhaW5pbmcgbW9kZWwgcHJvY2Vzc29yLiBBIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBxdWFsaWZpZXIgJmx0O2NvZGUmZ3Q7JnF1b3Q7b3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5FeGVjdXRlJnF1b3Q7Jmx0Oy9jb2RlJmd0OyAgd2lsbCBiZSBpbnZva2VkIGFzIGEgcGFydCBvZiB0aGUgbW9kZWwgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiZWZvcmVmcmFnbWVudCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhpcyBmbGFnIHNwZWNpZmllcyB0aGF0IHRoZSBwcm9jZXNzb3IgaGFzIHRvIGJlIGludm9rZWQgYmVmb3JlIG1vZGVsIGZyYWdtZW50cyBhcmUgYWRkZWQuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwbHkiIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImFsd2F5cyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgZGVmaW5lcyBpbiB3aGljaCBjYXNlIGEgcHJvY2Vzc29yIGlzIHJ1bgorJmx0O3VsJmd0OworJmx0O2xpJmd0O2Fsd2F5czogZWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkJmx0Oy9saSZndDsKKyZsdDtsaSZndDtpbml0aWFsOiBvbmx5IHdoZW4gY29taW5nIGZyb20gYSBub25lIHBlcnNpc3RlbnQgc3RhdGUmbHQ7L2xpJmd0OworJmx0Oy91bCZndDsKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDxzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImFsd2F5cyI+CisgICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpbml0aWFsIj4KKyAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+CisgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJlbGVtZW50Ij4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICBBIG1vZGVsIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnRleHQgdXNlZCB0byBpbnZva2UgdGhlIHByb2Nlc3Nvci4KKyAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciBvZiBhIG1vZGVsIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnRleHQuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dEtleSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBIG9wdGlvbmFsIGtleSB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgbW9kZWwgZWxlbWVudCBpbiB0aGUgY29udGV4dC4gVGhlIHZhbHVlIG9mICZxdW90O2lkJnF1b3Q7IGlzIHVzZWQgaWYgdGhpcyB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICA0LjIKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIGZvciB0aGUgcHJlZmVyZW5jZSBleHRlbnNpb24gcG9pbnQ6IAorJmx0O3AmZ3Q7CismbHQ7cHJlJmd0OworICAgJmx0O2V4dGVuc2lvbgorICAgICAgICAgaWQ9JnF1b3Q7dGhlbWVDb250cmlidXRpb24mcXVvdDsKKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmU0LndvcmtiZW5jaC5tb2RlbCZxdW90OyZndDsKKyAgICAgICZsdDtwcm9jZXNzb3IKKyAgICAgICAgICAgIGJlZm9yZWZyYWdtZW50PSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmU0LmRlbW8uc2ltcGxlaWRlLmludGVybmFsLlRoZW1lTWVudVByb2Nlc3NvciZxdW90OyZndDsKKyAgICAgICAgICZsdDtlbGVtZW50CisgICAgICAgICAgICAgICBpZD0mcXVvdDtzaW1wbGVpZGUubWFpbm1lbnUmcXVvdDsmZ3Q7CisgICAgICAgICAmbHQ7L2VsZW1lbnQmZ3Q7CisgICAgICAmbHQ7L3Byb2Nlc3NvciZndDsKKyAgICZsdDsvZXh0ZW5zaW9uJmd0OworICAgJmx0O2V4dGVuc2lvbgorICAgICAgICAgaWQ9JnF1b3Q7bG9nQ29udHJpYnV0aW9uJnF1b3Q7CisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lNC53b3JrYmVuY2gubW9kZWwmcXVvdDsmZ3Q7CisgICAgICAmbHQ7c25pcHBldAorICAgICAgICAgICAgdXJpPSZxdW90O3BsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZTQuZGVtby5sb2cveG1pL2NvbXBvbmVudHMuZTR4bWkmcXVvdDsmZ3Q7CisgICAgICAmbHQ7L3NuaXBwZXQmZ3Q7CisgICAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7CitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAoraHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMtcmFwL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9hZGRvbnMvQ29tbWFuZFByb2Nlc3NpbmdBZGRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvYWRkb25zL0NvbW1hbmRQcm9jZXNzaW5nQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ4NzY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjLXJhcC9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvYWRkb25zL0NvbW1hbmRQcm9jZXNzaW5nQWRkb24uamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guYWRkb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmRNYW5hZ2VyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JQ29tbWFuZE1hbmFnZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uLk5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5FQ29tbWFuZFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kcy5pbnRlcm5hbC5IYW5kbGVyU2VydmljZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUG9saWN5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLkxvY2FsaXphdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUNvbW1hbmRQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CisKKy8qKgorICogUHJvY2VzcyBjb21tYW5kcyBpbiB0aGUgbW9kZWwsIGZlZWRpbmcgdGhlbSBpbnRvIHRoZSBjb21tYW5kIHNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tYW5kUHJvY2Vzc2luZ0FkZG9uIHsKKwlASW5qZWN0CisJcHJpdmF0ZSBFQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2U7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKKworCUBJbmplY3QKKwlwcml2YXRlIE1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKworCUBJbmplY3QKKwlwcml2YXRlIElFdmVudEJyb2tlciBicm9rZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCXByaXZhdGUgQ2F0ZWdvcnkgdW5kZWZpbmVkQ2F0ZWdvcnk7CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBhZGRpdGlvbkhhbmRsZXI7CisKKwlwcml2YXRlIElDb21tYW5kTWFuYWdlckxpc3RlbmVyIGNtTGlzdGVuZXI7CisKKwlwcml2YXRlIGZpbmFsIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJQEluamVjdAorCXB1YmxpYyBDb21tYW5kUHJvY2Vzc2luZ0FkZG9uKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNtZAorCSAqIEBwYXJhbSBtb2RlbFNlcnZpY2UKKwkgKiBAcGFyYW0gY2F0ZWdvcnlNb2RlbAorCSAqIEByZXR1cm4gYSBjb21tYW5kIG1vZGVsIGVsZW1lbnQKKwkgKiBAdGhyb3dzIE5vdERlZmluZWRFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1Db21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29tbWFuZCBjbWQsIEVNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlLAorCQkJZmluYWwgTUNhdGVnb3J5IGNhdGVnb3J5TW9kZWwpIHRocm93cyBOb3REZWZpbmVkRXhjZXB0aW9uIHsKKwkJTUNvbW1hbmQgY29tbWFuZCA9IG1vZGVsU2VydmljZS5jcmVhdGVNb2RlbEVsZW1lbnQoTUNvbW1hbmQuY2xhc3MpOworCQljb21tYW5kLnNldEVsZW1lbnRJZChjbWQuZ2V0SWQoKSk7CisJCWNvbW1hbmQuc2V0Q2F0ZWdvcnkoY2F0ZWdvcnlNb2RlbCk7CisJCWNvbW1hbmQuc2V0Q29tbWFuZE5hbWUoY21kLmdldE5hbWUoKSk7CisJCWNvbW1hbmQuc2V0RGVzY3JpcHRpb24oY21kLmdldERlc2NyaXB0aW9uKCkpOworCisJCS8vIGRlYWwgd2l0aCBwYXJhbWV0ZXJzCisJCS8vIGNvbW1hbmQuZ2V0UGFyYW1ldGVycygpLmFkZEFsbChwYXJhbWV0ZXJzKTsKKwkJSVBhcmFtZXRlcltdIGNtZFBhcm1zID0gY21kLmdldFBhcmFtZXRlcnMoKTsKKwkJaWYgKGNtZFBhcm1zICE9IG51bGwpIHsKKwkJCWZvciAoSVBhcmFtZXRlciBjbWRQYXJtIDogY21kUGFybXMpIHsKKwkJCQlNQ29tbWFuZFBhcmFtZXRlciBwYXJtTW9kZWwgPSBtb2RlbFNlcnZpY2UKKwkJCQkJCS5jcmVhdGVNb2RlbEVsZW1lbnQoTUNvbW1hbmRQYXJhbWV0ZXIuY2xhc3MpOworCQkJCXBhcm1Nb2RlbC5zZXRFbGVtZW50SWQoY21kUGFybS5nZXRJZCgpKTsKKwkJCQlwYXJtTW9kZWwuc2V0TmFtZShjbWRQYXJtLmdldE5hbWUoKSk7CisJCQkJcGFybU1vZGVsLnNldE9wdGlvbmFsKGNtZFBhcm0uaXNPcHRpb25hbCgpKTsKKwkJCQlQYXJhbWV0ZXJUeXBlIHBhcm1UeXBlID0gY21kLmdldFBhcmFtZXRlclR5cGUoY21kUGFybS5nZXRJZCgpKTsKKwkJCQlpZiAocGFybVR5cGUgIT0gbnVsbCkgeworCQkJCQlwYXJtTW9kZWwuc2V0VHlwZUlkKHBhcm1UeXBlLmdldElkKCkpOworCQkJCX0KKwkJCQljb21tYW5kLmdldFBhcmFtZXRlcnMoKS5hZGQocGFybU1vZGVsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29tbWFuZDsKKwl9CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCUFjdGl2YXRvci50cmFjZShQb2xpY3kuREVCVUdfQ01EUywgIkluaXRpYWxpemUgY29tbWFuZHMgZnJvbSBtb2RlbCIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCXVuZGVmaW5lZENhdGVnb3J5ID0gY29tbWFuZFNlcnZpY2UuZGVmaW5lQ2F0ZWdvcnkoTUFwcGxpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkiQXBwbGljYXRpb24gQ2F0ZWdvcnkiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQljcmVhdGVDYXRlZ29yaWVzKCk7CisJCWNyZWF0ZUNvbW1hbmRzKCk7CisJCXJlZ2lzdGVyTW9kZWxMaXN0ZW5lcnMoKTsKKwkJcmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIoKTsKKwl9CisKKwlAUHJlRGVzdHJveQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVucmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIoKTsKKwkJdW5yZWdzaXRlck1vZGVsTGlzdGVuZXJzKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTW9kZWxMaXN0ZW5lcnMoKSB7CisJCWFkZGl0aW9uSGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJaWYgKGFwcGxpY2F0aW9uID09IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSkgeworCQkJCQlpZiAoVUlFdmVudHMuaXNBREQoZXZlbnQpKSB7CisJCQkJCQlmb3IgKE9iamVjdCBvYmogOiBVSUV2ZW50cy5hc0l0ZXJhYmxlKGV2ZW50LCBVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFKSkgeworCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNQ29tbWFuZCkgeworCQkJCQkJCQljcmVhdGVDb21tYW5kKChNQ29tbWFuZCkgb2JqKTsKKwkJCQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1DYXRlZ29yeSkgeworCQkJCQkJCQljcmVhdGVDYXRlZ29yeSgoTUNhdGVnb3J5KSBvYmopOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKwkJYnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5BcHBsaWNhdGlvbi5UT1BJQ19DT01NQU5EUywgYWRkaXRpb25IYW5kbGVyKTsKKwkJYnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5BcHBsaWNhdGlvbi5UT1BJQ19DQVRFR09SSUVTLCBhZGRpdGlvbkhhbmRsZXIpOworCX0KKworCXByaXZhdGUgdm9pZCB1bnJlZ3NpdGVyTW9kZWxMaXN0ZW5lcnMoKSB7CisJCWJyb2tlci51bnN1YnNjcmliZShhZGRpdGlvbkhhbmRsZXIpOworCQlicm9rZXIudW5zdWJzY3JpYmUoYWRkaXRpb25IYW5kbGVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIoKSB7CisJCWNtTGlzdGVuZXIgPSBuZXcgSUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIoKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBjb21tYW5kTWFuYWdlckNoYW5nZWQoQ29tbWFuZE1hbmFnZXJFdmVudCBjb21tYW5kTWFuYWdlckV2ZW50KSB7CisJCQkJaWYgKGNvbW1hbmRNYW5hZ2VyRXZlbnQuaXNDb21tYW5kQ2hhbmdlZCgpKSB7CisJCQkJCWlmIChjb21tYW5kTWFuYWdlckV2ZW50LmlzQ29tbWFuZERlZmluZWQoKSkgeworCQkJCQkJZmluYWwgU3RyaW5nIGNvbW1hbmRJZCA9IGNvbW1hbmRNYW5hZ2VyRXZlbnQuZ2V0Q29tbWFuZElkKCk7CisJCQkJCQlpZiAoZmluZENvbW1hbmQoY29tbWFuZElkKSAhPSBudWxsKSB7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJZmluYWwgQ29tbWFuZCBjb21tYW5kID0gY29tbWFuZE1hbmFnZXJFdmVudC5nZXRDb21tYW5kTWFuYWdlcigpLmdldENvbW1hbmQoCisJCQkJCQkJCWNvbW1hbmRJZCk7CisJCQkJCQlpZiAoY29tbWFuZC5nZXRIYW5kbGVyKCkgPT0gbnVsbCkgeworCQkJCQkJCWNvbW1hbmQuc2V0SGFuZGxlcihIYW5kbGVyU2VydmljZUltcGwuZ2V0SGFuZGxlcihjb21tYW5kSWQsIGNvbnRleHQpKTsKKwkJCQkJCX0KKwkJCQkJCXRyeSB7CisJCQkJCQkJTUNhdGVnb3J5IGNhdGVnb3J5TW9kZWwgPSBmaW5kQ2F0ZWdvcnkoY29tbWFuZC5nZXRDYXRlZ29yeSgpLmdldElkKCkpOworCQkJCQkJCWZpbmFsIE1Db21tYW5kIGNyZWF0ZWRDb21tYW5kID0gY3JlYXRlQ29tbWFuZChjb21tYW5kLCBtb2RlbFNlcnZpY2UsCisJCQkJCQkJCQljYXRlZ29yeU1vZGVsKTsKKwkJCQkJCQlhcHBsaWNhdGlvbi5nZXRDb21tYW5kcygpLmFkZChjcmVhdGVkQ29tbWFuZCk7CisJCQkJCQl9IGNhdGNoIChOb3REZWZpbmVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldExvZ1NlcnZpY2UoKQorCQkJCQkJCQkJLmxvZygwLCAiRmFpbGVkIHRvIGNyZWF0ZSBjb21tYW5kICIgKyBjb21tYW5kSWQsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisJCWNvbW1hbmRNYW5hZ2VyLmFkZENvbW1hbmRNYW5hZ2VyTGlzdGVuZXIoY21MaXN0ZW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIoKSB7CisJCWNvbW1hbmRNYW5hZ2VyLnJlbW92ZUNvbW1hbmRNYW5hZ2VyTGlzdGVuZXIoY21MaXN0ZW5lcik7CisJfQorCisJcHJvdGVjdGVkIE1Db21tYW5kIGZpbmRDb21tYW5kKFN0cmluZyBjb21tYW5kSWQpIHsKKwkJZm9yIChNQ29tbWFuZCBjbWQgOiBhcHBsaWNhdGlvbi5nZXRDb21tYW5kcygpKSB7CisJCQlpZiAoY29tbWFuZElkLmVxdWFscyhjbWQuZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJcmV0dXJuIGNtZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgTUNhdGVnb3J5IGZpbmRDYXRlZ29yeShTdHJpbmcgaWQpIHsKKwkJZmluYWwgTGlzdDxNQ2F0ZWdvcnk+IGNhdGVnb3JpZXMgPSBhcHBsaWNhdGlvbi5nZXRDYXRlZ29yaWVzKCk7CisJCWZvciAoTUNhdGVnb3J5IGNhdCA6IGNhdGVnb3JpZXMpIHsKKwkJCWlmIChpZC5lcXVhbHMoY2F0LmdldEVsZW1lbnRJZCgpKSkgeworCQkJCXJldHVybiBjYXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbW1hbmRzKCkgeworCQlmb3IgKE1Db21tYW5kIGNtZE1vZGVsIDogYXBwbGljYXRpb24uZ2V0Q29tbWFuZHMoKSkgeworCQkJY3JlYXRlQ29tbWFuZChjbWRNb2RlbCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29tbWFuZChNQ29tbWFuZCBjbWRNb2RlbCkgeworCQlJUGFyYW1ldGVyW10gcGFybXMgPSBudWxsOworCQlTdHJpbmcgaWQgPSBjbWRNb2RlbC5nZXRFbGVtZW50SWQoKTsKKwkJU3RyaW5nIG5hbWUgPSBsb2NhbGl6ZShjbWRNb2RlbC5nZXRDb21tYW5kTmFtZSgpLCBjbWRNb2RlbCk7CisJCVN0cmluZyBkZXNjID0gbG9jYWxpemUoY21kTW9kZWwuZ2V0RGVzY3JpcHRpb24oKSwgY21kTW9kZWwpOworCQlMaXN0PE1Db21tYW5kUGFyYW1ldGVyPiBtb2RlbFBhcm1zID0gY21kTW9kZWwuZ2V0UGFyYW1ldGVycygpOworCQlpZiAobW9kZWxQYXJtcyAhPSBudWxsICYmICFtb2RlbFBhcm1zLmlzRW1wdHkoKSkgeworCQkJQXJyYXlMaXN0PFBhcmFtZXRlcj4gcGFybUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKwkJCWZvciAoTUNvbW1hbmRQYXJhbWV0ZXIgY21kUGFybSA6IG1vZGVsUGFybXMpIHsKKwkJCQlQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlclR5cGUgPSBudWxsOworCQkJCWlmIChjbWRQYXJtLmdldFR5cGVJZCgpICE9IG51bGwgJiYgY21kUGFybS5nZXRUeXBlSWQoKS5sZW5ndGgoKSA+IDApIHsKKwkJCQkJcGFyYW1ldGVyVHlwZSA9IGNvbW1hbmRNYW5hZ2VyLmdldFBhcmFtZXRlclR5cGUoY21kUGFybS5nZXRUeXBlSWQoKSk7CisJCQkJfQorCQkJCXBhcm1MaXN0LmFkZChuZXcgUGFyYW1ldGVyKGNtZFBhcm0uZ2V0RWxlbWVudElkKCksIGNtZFBhcm0uZ2V0TmFtZSgpLCBudWxsLAorCQkJCQkJcGFyYW1ldGVyVHlwZSwgY21kUGFybS5pc09wdGlvbmFsKCkpKTsKKwkJCX0KKwkJCXBhcm1zID0gcGFybUxpc3QudG9BcnJheShuZXcgUGFyYW1ldGVyW3Bhcm1MaXN0LnNpemUoKV0pOworCQl9CisJCUNhdGVnb3J5IGNhdCA9IHVuZGVmaW5lZENhdGVnb3J5OworCQlpZiAoY21kTW9kZWwuZ2V0Q2F0ZWdvcnkoKSAhPSBudWxsKSB7CisJCQljYXQgPSBjb21tYW5kU2VydmljZS5nZXRDYXRlZ29yeShjbWRNb2RlbC5nZXRDYXRlZ29yeSgpLmdldEVsZW1lbnRJZCgpKTsKKwkJfQorCQljb21tYW5kU2VydmljZS5kZWZpbmVDb21tYW5kKGlkLCBuYW1lLCBkZXNjLCBjYXQsIHBhcm1zKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ2F0ZWdvcmllcygpIHsKKwkJZm9yIChNQ2F0ZWdvcnkgY2F0TW9kZWwgOiBhcHBsaWNhdGlvbi5nZXRDYXRlZ29yaWVzKCkpIHsKKwkJCWNyZWF0ZUNhdGVnb3J5KGNhdE1vZGVsKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVDYXRlZ29yeShNQ2F0ZWdvcnkgY2F0TW9kZWwpIHsKKwkJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjb21tYW5kU2VydmljZS5nZXRDYXRlZ29yeShjYXRNb2RlbC5nZXRFbGVtZW50SWQoKSk7CisJCWlmICghY2F0ZWdvcnkuaXNEZWZpbmVkKCkpIHsKKwkJCWNhdGVnb3J5LmRlZmluZShsb2NhbGl6ZShjYXRNb2RlbC5nZXROYW1lKCksIGNhdE1vZGVsKSwKKwkJCQkJbG9jYWxpemUoY2F0TW9kZWwuZ2V0RGVzY3JpcHRpb24oKSwgY2F0TW9kZWwpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEF0dGVtcHQgdG8gbG9jYWxpemUgdGhlIHByb3ZpZGVkIGtleS4gUmV0dXJuIHRoZSBsb2NhbGl6ZWQgdmFyaWFudCBpZiBmb3VuZCBvciB0aGUga2V5IGl0c2VsZgorCSAqIG90aGVyd2lzZS4KKwkgKgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBwb3NzaWJsZSBrZXkgcmVmZXJlbmNlCisJICogQHBhcmFtIG1vZGVsRWxlbWVudAorCSAqICAgICAgICAgICAgdGhlIGRlZmluaW5nIG1vZGVsIGVsZW1lbnQKKwkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgdmFyaWFudCBpZiBmb3VuZCwgb3IgdGhlIGtleQorCSAqLworCXByaXZhdGUgU3RyaW5nIGxvY2FsaXplKFN0cmluZyBrZXksIE1BcHBsaWNhdGlvbkVsZW1lbnQgbW9kZWxFbGVtZW50KSB7CisJCWlmIChrZXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nIGxvY2FsaXplZCA9IExvY2FsaXphdGlvbkhlbHBlci5nZXRMb2NhbGl6ZWQoa2V5LCBtb2RlbEVsZW1lbnQpOworCQlyZXR1cm4gbG9jYWxpemVkID09IG51bGwgPyBrZXkgOiBsb2NhbGl6ZWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL0xvY2FsZUNoYW5nZVNlcnZpY2VDb250ZXh0RnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC9Mb2NhbGVDaGFuZ2VTZXJ2aWNlQ29udGV4dEZ1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhZWRkZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC9Mb2NhbGVDaGFuZ2VTZXJ2aWNlQ29udGV4dEZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBEaXJrIEZhdXRoIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIERpcmsgRmF1dGggPGRpcmsuZmF1dGhAZ29vZ2xlbWFpbC5jb20+IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLm5scy5JTG9jYWxlQ2hhbmdlU2VydmljZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworCisvKioKKyAqIENvbnRleHQgZnVuY3Rpb24gdG8gcHJvdmlkZSB0aGUgTG9jYWxlQ2hhbmdlU2VydmljZUltcGwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbGVDaGFuZ2VTZXJ2aWNlQ29udGV4dEZ1bmN0aW9uIGV4dGVuZHMgQ29udGV4dEZ1bmN0aW9uIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29tcHV0ZShJRWNsaXBzZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGNvbnRleHRLZXkpIHsKKwkJSUxvY2FsZUNoYW5nZVNlcnZpY2UgbGNTZXJ2aWNlID0gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZSgKKwkJCQlMb2NhbGVDaGFuZ2VTZXJ2aWNlSW1wbC5jbGFzcywgY29udGV4dCk7CisKKwkJLy8gYWRkIHRoZSBuZXcgb2JqZWN0IHRvIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0CisJCU1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGNvbnRleHQuZ2V0KE1BcHBsaWNhdGlvbi5jbGFzcyk7CisJCUlFY2xpcHNlQ29udGV4dCBjdHggPSBhcHBsaWNhdGlvbi5nZXRDb250ZXh0KCk7CisJCWN0eC5zZXQoSUxvY2FsZUNoYW5nZVNlcnZpY2UuY2xhc3MsIGxjU2VydmljZSk7CisJCXJldHVybiBsY1NlcnZpY2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL0xvY2FsZUNoYW5nZVNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvTG9jYWxlQ2hhbmdlU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ4YWYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL0xvY2FsZUNoYW5nZVNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUgRGlyayBGYXV0aCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBEaXJrIEZhdXRoIDxkaXJrLmZhdXRoQGdvb2dsZW1haWwuY29tPiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgRmFiaWFuIE1pZWhlIC0gQnVnIDQ0MDQzNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5pbnRlcm5hbC5zZXJ2aWNlcy5SZXNvdXJjZUJ1bmRsZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ubHMuSUxvY2FsZUNoYW5nZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy50cmFuc2xhdGlvbi5UcmFuc2xhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Mb2NhbGl6YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbUJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbW1lZFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhcjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmxvZy5Mb2dTZXJ2aWNlOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElMb2NhbGVDaGFuZ2VTZXJ2aWNlfSB0aGF0IGNoYW5nZXMgdGhlIHtAbGluayBMb2NhbGV9IGluIHRoZQorICogc3BlY2lmaWVkIHtAbGluayBJRWNsaXBzZUNvbnRleHR9IGFuZCBhZGRpdGlvbmFsbHkgZmlyZXMgYW4gZXZlbnQgb24gdGhlIGV2ZW50IGJ1cy4KKyAqCisgKiBAYXV0aG9yIERpcmsgRmF1dGgKKyAqCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgTG9jYWxlQ2hhbmdlU2VydmljZUltcGwgaW1wbGVtZW50cyBJTG9jYWxlQ2hhbmdlU2VydmljZSB7CisKKwlNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwlASW5qZWN0CisJSUV2ZW50QnJva2VyIGJyb2tlcjsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlMb2dTZXJ2aWNlIGxvZ1NlcnZpY2U7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcge0BsaW5rIExvY2FsZUNoYW5nZVNlcnZpY2VJbXBsfSBmb3IgdGhlIGdpdmVuIHtAbGluayBJRWNsaXBzZUNvbnRleHR9LgorCSAqCisJICogQHBhcmFtIGFwcGxpY2F0aW9uCisJICogICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgdGhlIGNvbnRleHQgZnJvbS4KKwkgKi8KKwlASW5qZWN0CisJcHVibGljIExvY2FsZUNoYW5nZVNlcnZpY2VJbXBsKE1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworCQl0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hhbmdlQXBwbGljYXRpb25Mb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworCisJCS8vIHRoZSBUcmFuc2xhdGlvblNlcnZpY2UuTE9DQUxFIGNvbnRleHQgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBhcyBTdHJpbmcKKwkJLy8gc28gd2UgcHV0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIExvY2FsZSB0byB0aGUgY29udGV4dAorCQl0aGlzLmFwcGxpY2F0aW9uLmdldENvbnRleHQoKS5zZXQoVHJhbnNsYXRpb25TZXJ2aWNlLkxPQ0FMRSwgbG9jYWxlKTsKKworCQkvLyB1cGRhdGUgbW9kZWwKKwkJdXBkYXRlTG9jYWxpemF0aW9uKHRoaXMuYXBwbGljYXRpb24uZ2V0Q2hpbGRyZW4oKSk7CisKKwkJLy8gZmlyZSBldmVudAorCQlicm9rZXIucG9zdChMT0NBTEVfQ0hBTkdFLCBsb2NhbGUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoYW5nZUFwcGxpY2F0aW9uTG9jYWxlKFN0cmluZyBsb2NhbGVTdHJpbmcpIHsKKwkJdHJ5IHsKKwkJCUxvY2FsZSBsb2NhbGUgPSBSZXNvdXJjZUJ1bmRsZUhlbHBlci50b0xvY2FsZShsb2NhbGVTdHJpbmcpOworCisJCQkvLyBzZXQgdGhlIGxvY2FsZSB0byB0aGUgYXBwbGljYXRpb24gY29udGV4dAorCQkJLy8gdXNlIHRoZSByZXNvbHZlZCBsb2NhbGUgaW5zdGVhZCBvZiB0aGUgZ2l2ZW4gbG9jYWxlIHN0cmluZyB0byBhdm9pZCBpbnZhbGlkIGxvY2FsZXMKKwkJCS8vIGluIGNvbnRleHQKKwkJCXRoaXMuYXBwbGljYXRpb24uZ2V0Q29udGV4dCgpLnNldChUcmFuc2xhdGlvblNlcnZpY2UuTE9DQUxFLCBsb2NhbGUpOworCisJCQkvLyB1cGRhdGUgbW9kZWwKKwkJCXVwZGF0ZUxvY2FsaXphdGlvbih0aGlzLmFwcGxpY2F0aW9uLmdldENoaWxkcmVuKCkpOworCisJCQkvLyBmaXJlIGV2ZW50CisJCQlicm9rZXIucG9zdChMT0NBTEVfQ0hBTkdFLCBsb2NhbGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gcGVyZm9ybWluZyBhIGxvY2FsZSB1cGRhdGUgZmFpbGVkCisJCQkvLyB0aGVyZSBpcyBubyBsb2NhbGUgY2hhbmdlIHBlcmZvcm1lZAorCQkJaWYgKGxvZ1NlcnZpY2UgIT0gbnVsbCkKKwkJCQlsb2dTZXJ2aWNlLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgZS5nZXRNZXNzYWdlKCkKKwkJCQkJCSsgIiAtIE5vIExvY2FsZSBjaGFuZ2Ugd2lsbCBiZSBwZXJmb3JtZWQuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qKgorCSAqIFdpbGwgaXRlcmF0ZSBvdmVyIHRoZSBnaXZlbiBsaXN0IG9mIHtAbGluayBNVUlFbGVtZW50fXMgYW5kIGluZm9ybSB0aGVtIGFib3V0IHRoZSBMb2NhbGUKKwkgKiBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGNoaWxkcmVuCisJICogICAgICAgICAgICBUaGUgbGlzdCBvZiB7QGxpbmsgTVVJRWxlbWVudH1zIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIExvY2FsZSB1cGRhdGVzLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiB9KQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxvY2FsaXphdGlvbihMaXN0PD8gZXh0ZW5kcyBNVUlFbGVtZW50PiBjaGlsZHJlbikgeworCQlmb3IgKE1VSUVsZW1lbnQgZWxlbWVudCA6IGNoaWxkcmVuKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyKSB7CisJCQkJdXBkYXRlTG9jYWxpemF0aW9uKCgoTUVsZW1lbnRDb250YWluZXIpIGVsZW1lbnQpLmdldENoaWxkcmVuKCkpOworCQkJfQorCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCQlNV2luZG93IHdpbmRvdyA9IChNV2luZG93KSBlbGVtZW50OworCQkJCU1NZW51IG1haW5NZW51ID0gd2luZG93LmdldE1haW5NZW51KCk7CisJCQkJaWYgKG1haW5NZW51ICE9IG51bGwpIHsKKwkJCQkJbWFpbk1lbnUudXBkYXRlTG9jYWxpemF0aW9uKCk7CisJCQkJCXVwZGF0ZUxvY2FsaXphdGlvbihtYWluTWVudS5nZXRDaGlsZHJlbigpKTsKKwkJCQl9CisJCQkJdXBkYXRlTG9jYWxpemF0aW9uKHdpbmRvdy5nZXRTaGFyZWRFbGVtZW50cygpKTsKKwkJCQl1cGRhdGVMb2NhbGl6YXRpb24od2luZG93LmdldFdpbmRvd3MoKSk7CisJCQl9CisKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVRyaW1tZWRXaW5kb3cpIHsKKwkJCQlmb3IgKE1UcmltQmFyIHRyaW1CYXIgOiAoKE1UcmltbWVkV2luZG93KSBlbGVtZW50KS5nZXRUcmltQmFycygpKSB7CisJCQkJCXRyaW1CYXIudXBkYXRlTG9jYWxpemF0aW9uKCk7CisJCQkJCXVwZGF0ZUxvY2FsaXphdGlvbih0cmltQmFyLmdldENoaWxkcmVuKCkpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmUpIHsKKwkJCQl1cGRhdGVMb2NhbGl6YXRpb24oKChNUGVyc3BlY3RpdmUpIGVsZW1lbnQpLmdldFdpbmRvd3MoKSk7CisJCQl9CisKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCQlNUGFydCBtUGFydCA9IChNUGFydCkgZWxlbWVudDsKKwkJCQlNVG9vbEJhciB0b29sYmFyID0gbVBhcnQuZ2V0VG9vbGJhcigpOworCQkJCWlmICh0b29sYmFyICE9IG51bGwgJiYgdG9vbGJhci5nZXRDaGlsZHJlbigpICE9IG51bGwpIHsKKwkJCQkJdG9vbGJhci51cGRhdGVMb2NhbGl6YXRpb24oKTsKKwkJCQkJdXBkYXRlTG9jYWxpemF0aW9uKHRvb2xiYXIuZ2V0Q2hpbGRyZW4oKSk7CisJCQkJfQorCQkJfQorCisJCQkoKE1Mb2NhbGl6YWJsZSkgZWxlbWVudCkudXBkYXRlTG9jYWxpemF0aW9uKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYmI5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgUmVuw6kgQnJhbmRzdGV0dGVyIC0gQnVnIDQxOTc0OSAtIFtXb3JrYmVuY2hdIFtlNCBXb3JrYmVuY2hdIC0gUmVtb3ZlIHRoZSBkZXByZWNhdGVkIFBhY2thZ2VBZG1pbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z1RyYWNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuRmlsdGVyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5JbnZhbGlkU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLkJ1bmRsZVRyYWNrZXI7CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOworCisvKioKKyAqIEJ1bmRsZUFjdGl2YXRvciB0byBhY2Nlc3MgdGhlIHJlcXVpcmVkIE9TR2kgc2VydmljZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCS8qKgorCSAqIFRoZSBidW5kbGUgc3ltYm9saWMgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9XT1JLQkVOQ0ggPSAib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIGFjdGl2YXRvcjsKKworCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgU2VydmljZVRyYWNrZXI8TG9jYXRpb24sIExvY2F0aW9uPiBsb2NhdGlvblRyYWNrZXI7CisKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyPERlYnVnT3B0aW9ucywgRGVidWdPcHRpb25zPiBkZWJ1Z1RyYWNrZXI7CisJcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlcjxMb2dTZXJ2aWNlLCBMb2dTZXJ2aWNlPiBsb2dUcmFja2VyOworCisJLyoqIFRyYWNrcyBhbGwgYnVuZGxlcyB3aGljaCBhcmUgaW4gdGhlIHN0YXRlOiBSRVNPTFZFRCwgU1RBUlRJTkcsIEFDVElWRSBvciBTVE9QUElORy4gKi8KKwlwcml2YXRlIEJ1bmRsZVRyYWNrZXI8TGlzdDxCdW5kbGU+PiByZXNvbHZlZEJ1bmRsZXM7CisKKwkvKiogQSBCdW5kbGVUcmFja2VyQ3VzdG9taXplciB3aGljaCBpcyBhYmxlIHRvIHJlc29sdmUgYSBidW5kbGUgdG8gdGhlIGEgc3ltYm9saWMgbmFtZS4gKi8KKwlwcml2YXRlIGZpbmFsIEJ1bmRsZUZpbmRlciBidW5kbGVGaW5kZXIgPSBuZXcgQnVuZGxlRmluZGVyKCk7CisKKwlwcml2YXRlIERlYnVnVHJhY2UgdHJhY2U7CisKKwkvKioKKwkgKiBHZXQgdGhlIGRlZmF1bHQgYWN0aXZhdG9yLgorCSAqCisJICogQHJldHVybiBhIEJ1bmRsZUFjdGl2YXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBhY3RpdmF0b3I7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgYnVuZGxlIG9iamVjdAorCSAqLworCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgeworCQlyZXR1cm4gY29udGV4dC5nZXRCdW5kbGUoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYnVuZGxlTmFtZQorCSAqICAgICAgICAgICAgdGhlIGJ1bmRsZSBzeW1ib2xpYyBuYW1lCisJICogQHJldHVybiBBIGJ1bmRsZSBpZiBmb3VuZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZUZvck5hbWUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKwkJcmV0dXJuIGJ1bmRsZUZpbmRlci5maW5kQnVuZGxlKGJ1bmRsZU5hbWUpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhpcyBidW5kbGVzIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgeworCQlyZXR1cm4gY29udGV4dDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBMb2NhdGlvbiBzZXJ2aWNlCisJICovCisJcHVibGljIExvY2F0aW9uIGdldEluc3RhbmNlTG9jYXRpb24oKSB7CisJCWlmIChsb2NhdGlvblRyYWNrZXIgPT0gbnVsbCkgeworCQkJRmlsdGVyIGZpbHRlciA9IG51bGw7CisJCQl0cnkgeworCQkJCWZpbHRlciA9IGNvbnRleHQuY3JlYXRlRmlsdGVyKExvY2F0aW9uLklOU1RBTkNFX0ZJTFRFUik7CisJCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUgdGhpcy4gSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB3ZSBoYXZlIHRlc3RlZCB0aGUKKwkJCQkvLyBhYm92ZSBmb3JtYXQuCisJCQl9CisJCQlsb2NhdGlvblRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXI8TG9jYXRpb24sIExvY2F0aW9uPihjb250ZXh0LCBmaWx0ZXIsIG51bGwpOworCQkJbG9jYXRpb25UcmFja2VyLm9wZW4oKTsKKwkJfQorCQlyZXR1cm4gbG9jYXRpb25UcmFja2VyLmdldFNlcnZpY2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlhY3RpdmF0b3IgPSB0aGlzOworCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCisJCS8vIHRyYWNrIHJlcXVpcmVkIGJ1bmRsZXMKKwkJcmVzb2x2ZWRCdW5kbGVzID0gbmV3IEJ1bmRsZVRyYWNrZXI8TGlzdDxCdW5kbGU+Pihjb250ZXh0LCBCdW5kbGUuUkVTT0xWRUQKKwkJCQl8IEJ1bmRsZS5TVEFSVElORyB8IEJ1bmRsZS5BQ1RJVkUgfCBCdW5kbGUuU1RPUFBJTkcsIGJ1bmRsZUZpbmRlcik7CisJCXJlc29sdmVkQnVuZGxlcy5vcGVuKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAobG9jYXRpb25UcmFja2VyICE9IG51bGwpIHsKKwkJCWxvY2F0aW9uVHJhY2tlci5jbG9zZSgpOworCQkJbG9jYXRpb25UcmFja2VyID0gbnVsbDsKKwkJfQorCQlpZiAoZGVidWdUcmFja2VyICE9IG51bGwpIHsKKwkJCXRyYWNlID0gbnVsbDsKKwkJCWRlYnVnVHJhY2tlci5jbG9zZSgpOworCQkJZGVidWdUcmFja2VyID0gbnVsbDsKKwkJfQorCQlpZiAobG9nVHJhY2tlciAhPSBudWxsKSB7CisJCQlsb2dUcmFja2VyLmNsb3NlKCk7CisJCQlsb2dUcmFja2VyID0gbnVsbDsKKwkJfQorCQlpZiAocmVzb2x2ZWRCdW5kbGVzICE9IG51bGwpIHsKKwkJCS8vIHRoZSBjbG9zZSBvZiB0aGUgQnVuZGxlVHJhY2tlciB3aWxsIGFsc28gcmVtb3ZlIGFsbCBlbnRyaWVzIGZvcm0gdGhlIEJ1bmRsZUZpbmRlcgorCQkJcmVzb2x2ZWRCdW5kbGVzLmNsb3NlKCk7CisJCQlyZXNvbHZlZEJ1bmRsZXMgPSBudWxsOworCQl9CisJfQorCisJcHVibGljIERlYnVnT3B0aW9ucyBnZXREZWJ1Z09wdGlvbnMoKSB7CisJCWlmIChkZWJ1Z1RyYWNrZXIgPT0gbnVsbCkgeworCQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWRlYnVnVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4oY29udGV4dCwKKwkJCQkJRGVidWdPcHRpb25zLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7CisJCQlkZWJ1Z1RyYWNrZXIub3BlbigpOworCQl9CisJCXJldHVybiBkZWJ1Z1RyYWNrZXIuZ2V0U2VydmljZSgpOworCX0KKworCXB1YmxpYyBEZWJ1Z1RyYWNlIGdldFRyYWNlKCkgeworCQlpZiAodHJhY2UgPT0gbnVsbCkgeworCQkJdHJhY2UgPSBnZXREZWJ1Z09wdGlvbnMoKS5uZXdEZWJ1Z1RyYWNlKFBJX1dPUktCRU5DSCk7CisJCX0KKwkJcmV0dXJuIHRyYWNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgb3B0aW9uLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXJyb3IpIHsKKwkJZmluYWwgRGVidWdPcHRpb25zIGRlYnVnT3B0aW9ucyA9IGFjdGl2YXRvci5nZXREZWJ1Z09wdGlvbnMoKTsKKwkJaWYgKGRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpCisJCQkJJiYgZGVidWdPcHRpb25zLmdldEJvb2xlYW5PcHRpb24oUElfV09SS0JFTkNIICsgb3B0aW9uLCBmYWxzZSkpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworCQkJaWYgKGVycm9yICE9IG51bGwpIHsKKwkJCQllcnJvci5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisJCQl9CisJCX0KKwkJYWN0aXZhdG9yLmdldFRyYWNlKCkudHJhY2Uob3B0aW9uLCBtc2csIGVycm9yKTsKKwl9CisKKwlwdWJsaWMgTG9nU2VydmljZSBnZXRMb2dTZXJ2aWNlKCkgeworCQlMb2dTZXJ2aWNlIGxvZ1NlcnZpY2UgPSBudWxsOworCQlpZiAobG9nVHJhY2tlciAhPSBudWxsKSB7CisJCQlsb2dTZXJ2aWNlID0gbG9nVHJhY2tlci5nZXRTZXJ2aWNlKCk7CisJCX0gZWxzZSB7CisJCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQkJbG9nVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcjxMb2dTZXJ2aWNlLCBMb2dTZXJ2aWNlPihjb250ZXh0LAorCQkJCQkJTG9nU2VydmljZS5jbGFzcy5nZXROYW1lKCksIG51bGwpOworCQkJCWxvZ1RyYWNrZXIub3BlbigpOworCQkJCWxvZ1NlcnZpY2UgPSBsb2dUcmFja2VyLmdldFNlcnZpY2UoKTsKKwkJCX0KKwkJfQorCQlpZiAobG9nU2VydmljZSA9PSBudWxsKSB7CisJCQlsb2dTZXJ2aWNlID0gbmV3IExvZ1NlcnZpY2UoKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJCQkJbG9nKG51bGwsIGxldmVsLCBtZXNzYWdlLCBudWxsKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQlsb2cobnVsbCwgbGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbG9nKFNlcnZpY2VSZWZlcmVuY2Ugc3IsIGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJCQkJbG9nKHNyLCBsZXZlbCwgbWVzc2FnZSwgbnVsbCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbG9nKFNlcnZpY2VSZWZlcmVuY2Ugc3IsIGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJCQkJaWYgKGxldmVsID09IExvZ1NlcnZpY2UuTE9HX0VSUk9SKSB7CisJCQkJCQlTeXN0ZW0uZXJyLnByaW50KCJFUlJPUjogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIGlmIChsZXZlbCA9PSBMb2dTZXJ2aWNlLkxPR19XQVJOSU5HKSB7CisJCQkJCQlTeXN0ZW0uZXJyLnByaW50KCJXQVJOSU5HOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgaWYgKGxldmVsID09IExvZ1NlcnZpY2UuTE9HX0lORk8pIHsKKwkJCQkJCVN5c3RlbS5lcnIucHJpbnQoIklORk86ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSBpZiAobGV2ZWwgPT0gTG9nU2VydmljZS5MT0dfREVCVUcpIHsKKwkJCQkJCVN5c3RlbS5lcnIucHJpbnQoIkRFQlVHOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJU3lzdGVtLmVyci5wcmludCgibG9nIGxldmVsICIgKyBsZXZlbCArICI6ICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJfQorCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7CisJCQkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCX0KKwkJcmV0dXJuIGxvZ1NlcnZpY2U7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7CisJCUxvZ1NlcnZpY2UgbG9nU2VydmljZSA9IGFjdGl2YXRvci5nZXRMb2dTZXJ2aWNlKCk7CisJCWlmIChsb2dTZXJ2aWNlICE9IG51bGwpCisJCQlsb2dTZXJ2aWNlLmxvZyhsZXZlbCwgbWVzc2FnZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCUxvZ1NlcnZpY2UgbG9nU2VydmljZSA9IGFjdGl2YXRvci5nZXRMb2dTZXJ2aWNlKCk7CisJCWlmIChsb2dTZXJ2aWNlICE9IG51bGwpCisJCQlsb2dTZXJ2aWNlLmxvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQWN0aXZlQ2hpbGRMb29rdXBGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9BY3RpdmVDaGlsZExvb2t1cEZ1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0N2M4YQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQWN0aXZlQ2hpbGRMb29rdXBGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0RnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEFjdGl2ZUNoaWxkTG9va3VwRnVuY3Rpb24gZXh0ZW5kcyBDb250ZXh0RnVuY3Rpb24geworCisJcHJpdmF0ZSBTdHJpbmcgbG9jYWxWYXI7CisJcHJpdmF0ZSBTdHJpbmcgdmFyOworCisJcHVibGljIEFjdGl2ZUNoaWxkTG9va3VwRnVuY3Rpb24oU3RyaW5nIHZhciwgU3RyaW5nIGxvY2FsVmFyKSB7CisJCXRoaXMudmFyID0gdmFyOworCQl0aGlzLmxvY2FsVmFyID0gbG9jYWxWYXI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb21wdXRlKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgY29udGV4dEtleSkgeworCQlJRWNsaXBzZUNvbnRleHQgY2hpbGRDb250ZXh0ID0gY29udGV4dC5nZXRBY3RpdmVDaGlsZCgpOworCQlpZiAoY2hpbGRDb250ZXh0ICE9IG51bGwpIHsKKwkJCXJldHVybiBjaGlsZENvbnRleHQuZ2V0KHZhcik7CisJCX0KKwkJcmV0dXJuIGNvbnRleHQuZ2V0KGxvY2FsVmFyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQWN0aXZlUGFydExvb2t1cEZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0FjdGl2ZVBhcnRMb29rdXBGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTQzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0FjdGl2ZVBhcnRMb29rdXBGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVdpbmRvdzsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZlUGFydExvb2t1cEZ1bmN0aW9uIGV4dGVuZHMgQ29udGV4dEZ1bmN0aW9uIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29tcHV0ZShJRWNsaXBzZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGNvbnRleHRLZXkpIHsKKwkJLyoqCisJCSAqIFRoaXMgaXMgdGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBUT0RPOiBnZW5lcmFsaXplIGl0CisJCSAqLworCQlNQ29udGV4dCB3aW5kb3cgPSBjb250ZXh0LmdldChNV2luZG93LmNsYXNzKTsKKwkJaWYgKHdpbmRvdyA9PSBudWxsKSB7CisJCQl3aW5kb3cgPSBjb250ZXh0LmdldChNQXBwbGljYXRpb24uY2xhc3MpOworCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJSUVjbGlwc2VDb250ZXh0IGN1cnJlbnQgPSB3aW5kb3cuZ2V0Q29udGV4dCgpOworCQlpZiAoY3VycmVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gY3VycmVudC5nZXRBY3RpdmVMZWFmKCkuZ2V0KE1QYXJ0LmNsYXNzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0FwcGxpY2F0aW9uUGFydFNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0FwcGxpY2F0aW9uUGFydFNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1NGY2NQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQXBwbGljYXRpb25QYXJ0U2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QbGFjZWhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NSW5wdXRQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklQYXJ0TGlzdGVuZXI7CisKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblBhcnRTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEVQYXJ0U2VydmljZSB7CisKKwlwcml2YXRlIE1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKworCUBJbmplY3QKKwlBcHBsaWNhdGlvblBhcnRTZXJ2aWNlSW1wbChNQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKwkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworCX0KKworCXByaXZhdGUgRVBhcnRTZXJ2aWNlIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKSB7CisJCUlFY2xpcHNlQ29udGV4dCBhY3RpdmVXaW5kb3dDb250ZXh0ID0gYXBwbGljYXRpb24uZ2V0Q29udGV4dCgpLmdldEFjdGl2ZUNoaWxkKCk7CisJCWlmIChhY3RpdmVXaW5kb3dDb250ZXh0ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW4gYWN0aXZlIHdpbmRvdyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJRVBhcnRTZXJ2aWNlIGFjdGl2ZVdpbmRvd1BhcnRTZXJ2aWNlID0gYWN0aXZlV2luZG93Q29udGV4dC5nZXQoRVBhcnRTZXJ2aWNlLmNsYXNzKTsKKwkJaWYgKGFjdGl2ZVdpbmRvd1BhcnRTZXJ2aWNlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGl2ZSB3aW5kb3cgY29udGV4dCBpcyBpbnZhbGlkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoYWN0aXZlV2luZG93UGFydFNlcnZpY2UgPT0gdGhpcykgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBhY3RpdmUgd2luZG93Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gYWN0aXZlV2luZG93UGFydFNlcnZpY2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkUGFydExpc3RlbmVyKElQYXJ0TGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorCQkJCSJMaXN0ZW5lcnMgc2hvdWxkIG9ubHkgYmUgYXR0YWNoZWQvcmVtb3ZlZCBmcm9tIGEgd2luZG93J3MgcGFydCBzZXJ2aWNlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW1vdmVQYXJ0TGlzdGVuZXIoSVBhcnRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisJCQkJIkxpc3RlbmVycyBzaG91bGQgb25seSBiZSBhdHRhY2hlZC9yZW1vdmVkIGZyb20gYSB3aW5kb3cncyBwYXJ0IHNlcnZpY2UiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzUGFydE9yUGxhY2Vob2xkZXJJblBlcnNwZWN0aXZlKFN0cmluZyBlbGVtZW50SWQsIE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSkgeworCQlyZXR1cm4gZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLmlzUGFydE9yUGxhY2Vob2xkZXJJblBlcnNwZWN0aXZlKGVsZW1lbnRJZCwgcGVyc3BlY3RpdmUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN3aXRjaFBlcnNwZWN0aXZlKE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSkgeworCQlnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuc3dpdGNoUGVyc3BlY3RpdmUocGVyc3BlY3RpdmUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFjdGl2YXRlKE1QYXJ0IHBhcnQpIHsKKwkJZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLmFjdGl2YXRlKHBhcnQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFjdGl2YXRlKE1QYXJ0IHBhcnQsIGJvb2xlYW4gcmVxdWlyZXNGb2N1cykgeworCQlnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuYWN0aXZhdGUocGFydCwgcmVxdWlyZXNGb2N1cyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCWdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5yZXF1ZXN0QWN0aXZhdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGJyaW5nVG9Ub3AoTVBhcnQgcGFydCkgeworCQlnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuYnJpbmdUb1RvcChwYXJ0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBhcnQgZmluZFBhcnQoU3RyaW5nIGlkKSB7CisJCXJldHVybiBnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuZmluZFBhcnQoaWQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPE1QYXJ0PiBnZXRQYXJ0cygpIHsKKwkJcmV0dXJuIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5nZXRQYXJ0cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGFydCBnZXRBY3RpdmVQYXJ0KCkgeworCQlyZXR1cm4gZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1BhcnRWaXNpYmxlKE1QYXJ0IHBhcnQpIHsKKwkJcmV0dXJuIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5pc1BhcnRWaXNpYmxlKHBhcnQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGFydCBjcmVhdGVQYXJ0KFN0cmluZyBpZCkgeworCQlyZXR1cm4gZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLmNyZWF0ZVBhcnQoaWQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGxhY2Vob2xkZXIgY3JlYXRlU2hhcmVkUGFydChTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5jcmVhdGVTaGFyZWRQYXJ0KGlkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBsYWNlaG9sZGVyIGNyZWF0ZVNoYXJlZFBhcnQoU3RyaW5nIGlkLCBib29sZWFuIGZvcmNlKSB7CisJCXJldHVybiBnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuY3JlYXRlU2hhcmVkUGFydChpZCwgZm9yY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGFydCBzaG93UGFydChTdHJpbmcgaWQsIFBhcnRTdGF0ZSBwYXJ0U3RhdGUpIHsKKwkJcmV0dXJuIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5zaG93UGFydChpZCwgcGFydFN0YXRlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBhcnQgc2hvd1BhcnQoTVBhcnQgcGFydCwgUGFydFN0YXRlIHBhcnRTdGF0ZSkgeworCQlyZXR1cm4gZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLnNob3dQYXJ0KHBhcnQsIHBhcnRTdGF0ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGlkZVBhcnQoTVBhcnQgcGFydCkgeworCQlnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuaGlkZVBhcnQocGFydCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGlkZVBhcnQoTVBhcnQgcGFydCwgYm9vbGVhbiBmb3JjZSkgeworCQlnZXRBY3RpdmVXaW5kb3dTZXJ2aWNlKCkuaGlkZVBhcnQocGFydCwgZm9yY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPE1QYXJ0PiBnZXREaXJ0eVBhcnRzKCkgeworCQlyZXR1cm4gZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLmdldERpcnR5UGFydHMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYXZlUGFydChNUGFydCBwYXJ0LCBib29sZWFuIGNvbmZpcm0pIHsKKwkJcmV0dXJuIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5zYXZlUGFydChwYXJ0LCBjb25maXJtKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYXZlQWxsKGJvb2xlYW4gY29uZmlybSkgeworCQlyZXR1cm4gZ2V0QWN0aXZlV2luZG93U2VydmljZSgpLnNhdmVBbGwoY29uZmlybSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248TUlucHV0UGFydD4gZ2V0SW5wdXRQYXJ0cyhTdHJpbmcgaW5wdXRVcmkpIHsKKwkJcmV0dXJuIGdldEFjdGl2ZVdpbmRvd1NlcnZpY2UoKS5nZXRJbnB1dFBhcnRzKGlucHV0VXJpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQnVuZGxlRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0J1bmRsZUZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmU5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0J1bmRsZUZpbmRlci5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgUmVuw6kgQnJhbmRzdGV0dGVyIC0gQnVnIDQxOTc0OSAtIFtXb3JrYmVuY2hdIFtlNCBXb3JrYmVuY2hdIC0gUmVtb3ZlIHRoZSBkZXByZWNhdGVkIFBhY2thZ2VBZG1pbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5CdW5kbGVUcmFja2VyQ3VzdG9taXplcjsKKworLyoqCisgKiBBIHNpbXBsZSB7QGxpbmsgQnVuZGxlVHJhY2tlckN1c3RvbWl6ZXJ9IHdoaWNoIGlzIGFibGUgdG8gcmVzb2x2ZSBhIGJ1bmRsZSBieSBpdHMgc3ltYm9saWMgbmFtZS4KKyAqLworLyoKKyAqIFRPRE86IFRoaXMgaW1wbGVtZW50YXRpb24gY2FuIHByb2JhYmx5IGJlIHJlbW92ZWQgYWZ0ZXIgYSBzd2l0Y2ggdG8gT1NHaSA2IHdoaWNoIHdpbGwgaGF2ZSB0aGUKKyAqIHBvc3NpYmlsaXR5IHRvIGxvb2t1cCBidW5kbGVzIHdpdGggdGhlIEZyYW1ld29ya1dpcmluZyNmaW5kUHJvdmlkZXJzKFJlcXVpcmVtZW50KSBtZXRob2QuCisgKi8KK2ZpbmFsIGNsYXNzIEJ1bmRsZUZpbmRlciBpbXBsZW1lbnRzIEJ1bmRsZVRyYWNrZXJDdXN0b21pemVyPExpc3Q8QnVuZGxlPj4geworCisJLyoqIE1hcCBvZiBidW5kbGUgc3ltYm9saWMgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyBidW5kbGVzIChoaW50OiBkaWZmZXJlbnQgdmVyc2lvbnMpLiAqLworCXByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIExpc3Q8QnVuZGxlPj4gdHJhY2tlZEJ1bmRsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMaXN0PEJ1bmRsZT4+KCk7CisKKwkvKioKKwkgKiBSZXNvbHZlcyB0aGUgbGF0ZXN0IGJ1bmRsZSB3aXRoIHRoZSBnaXZlbiBidW5kbGUgc3ltYm9saWMgbmFtZS4KKwkgKiA8cD4KKwkgKiBUaGUgbGF0ZXN0IG1lYW5zIHRoZSBidW5kbGUgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uLgorCSAqIDwvcD4KKwkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCisJICogICAgICAgICAgICB0aGUgYnVuZGxlIHN5bWJvbGljIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBsYXRlc3QgYnVuZGxlIHdpdGggdGhlIGdpdmVuIGJ1bmRsZSBzeW1ib2xpYyBuYW1lCisJICovCisJcHVibGljIEJ1bmRsZSBmaW5kQnVuZGxlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKKwkJTGlzdDxCdW5kbGU+IGJ1bmRsZXNXaXRoU2FtZVN5bU5hbWUgPSB0cmFja2VkQnVuZGxlcy5nZXQoc3ltYm9saWNOYW1lKTsKKwkJaWYgKGJ1bmRsZXNXaXRoU2FtZVN5bU5hbWUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCUxpc3Q8QnVuZGxlPiBzbmFwc2hvdCA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlPihidW5kbGVzV2l0aFNhbWVTeW1OYW1lKTsKKworCQlzd2l0Y2ggKHNuYXBzaG90LnNpemUoKSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gbnVsbDsKKwkJY2FzZSAxOgorCQkJcmV0dXJuIHNuYXBzaG90LmdldCgwKTsKKwkJZGVmYXVsdDoKKwkJCUNvbGxlY3Rpb25zLnNvcnQoc25hcHNob3QsIFZlcnNpb25Db21wZXJhdG9yLklOU1RBTkNFKTsgLy8gc29ydCB0aGUgc25hcHNob3QgYnkgdmVyc2lvbgorCQkJcmV0dXJuIHNuYXBzaG90LmdldCgwKTsgLy8gdGhlIGhpZ2hlc3QgaXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxCdW5kbGU+IGFkZGluZ0J1bmRsZShCdW5kbGUgYnVuZGxlLCBCdW5kbGVFdmVudCBldmVudCkgeworCQlTdHJpbmcgYnVuZGxlU3ltTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKKwkJaWYgKGJ1bmRsZVN5bU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PEJ1bmRsZT4gYnVuZGxlc1dpdGhTYW1lU3ltTmFtZSA9IHRyYWNrZWRCdW5kbGVzLmdldChidW5kbGVTeW1OYW1lKTsKKwkJaWYgKGJ1bmRsZXNXaXRoU2FtZVN5bU5hbWUgPT0gbnVsbCkgeworCQkJYnVuZGxlc1dpdGhTYW1lU3ltTmFtZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxCdW5kbGU+KCk7CisKKwkJCWlmICh0cmFja2VkQnVuZGxlcy5wdXRJZkFic2VudChidW5kbGVTeW1OYW1lLCBidW5kbGVzV2l0aFNhbWVTeW1OYW1lKSAhPSBudWxsKSB7CisJCQkJLy8gc29tZSBvdGhlciB0aHJlYWQgaGFzIHdvbiB0aGUgcmFjZSwgc28gd2UgdXNlIGhpcyBMaXN0IG9iamVjdAorCQkJCWJ1bmRsZXNXaXRoU2FtZVN5bU5hbWUgPSB0cmFja2VkQnVuZGxlcy5nZXQoYnVuZGxlU3ltTmFtZSk7CisJCQl9CisJCX0KKworCQlidW5kbGVzV2l0aFNhbWVTeW1OYW1lLmFkZChidW5kbGUpOworCisJCS8vIHJldHVybiB0aGUgbGlzdCB0byBtYXJrIHRoYXQgd2Ugd2FudCB0byBiZSBpbmZvcm1lZCBhYm91dCBvdGhlciBjaGFuZ2VzIG9mIHRoZSBidW5kbGUgYW5kCisJCS8vIHRvIHJlbW92ZSB0aGUgYnVuZGxlIGluIHRoZSAjcmVtb3ZlZEJ1bmRsZSgpIG1ldGhvZCB3aXRob3V0IGEgbG9va3VwIGluIHRoZQorCQkvLyAjdHJhY2tlZEJ1bmRsZXMgbWFwCisJCXJldHVybiBidW5kbGVzV2l0aFNhbWVTeW1OYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1vZGlmaWVkQnVuZGxlKEJ1bmRsZSBidW5kbGUsIEJ1bmRsZUV2ZW50IGV2ZW50LCBMaXN0PEJ1bmRsZT4gYnVuZGxlc1dpdGhTYW1lU3ltTmFtZSkgeworCQkvLyBub3Qgb2YgaW50ZXJlc3QKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW1vdmVkQnVuZGxlKEJ1bmRsZSBidW5kbGUsIEJ1bmRsZUV2ZW50IGV2ZW50LCBMaXN0PEJ1bmRsZT4gYnVuZGxlc1dpdGhTYW1lU3ltTmFtZSkgeworCQkvLyB0aGUgb2JqZWN0IGlzIHRoZSBsaXN0IHdoaWNoIHdhcyByZXR1cm5lZCBpbnNpZGUgdGhlICNhZGRpbmdCdW5kbGUoKSBtZXRob2QgYW5kIHNvIHdlCisJCS8vIGRvbid0IG5lZWQgYSBsb29rdXAgaW4gdGhlICN0cmFja2VkQnVuZGxlcyB0byBmaW5kIHRoZSBsaXN0CisJCWJ1bmRsZXNXaXRoU2FtZVN5bU5hbWUucmVtb3ZlKGJ1bmRsZSk7CisJfQorCisJLyoqCisJICogQSBzaW1wbGUge0BsaW5rIENvbXBhcmF0b3J9IHdoaWNoIG9yZGVycyB0aGUgYnVuZGxlcyBieSB0aGVpciB2ZXJzaW9uIGluIGFzY2VuZGluZyBvcmRlci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWZXJzaW9uQ29tcGVyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8QnVuZGxlPiB7CisJCS8qKiBBIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHtAbGluayBDb21wYXJhdG9yfSAodGhlIGNvbXBhcmUgaXMgZG9uZSBzdGF0ZS1sZXNzKS4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPEJ1bmRsZT4gSU5TVEFOQ0UgPSBuZXcgVmVyc2lvbkNvbXBlcmF0b3IoKTsKKworCQlwcml2YXRlIFZlcnNpb25Db21wZXJhdG9yKCkgeworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgY29tcGFyZShCdW5kbGUgYnVuZGxlMSwgQnVuZGxlIGJ1bmRsZTIpIHsKKwkJCWlmIChidW5kbGUxID09IG51bGwpIHsKKwkJCQlyZXR1cm4gYnVuZGxlMiA9PSBudWxsID8gMCA6IDE7IC8vIG51bGwgZWxlbWVudHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorCQkJfQorCisJCQlpZiAoYnVuZGxlMiA9PSBudWxsKSB7CisJCQkJcmV0dXJuIC0xOyAvLyBudWxsIGVsZW1lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKKwkJCX0KKworCQkJcmV0dXJuIGJ1bmRsZTIuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhidW5kbGUxLmdldFZlcnNpb24oKSk7IC8vIG5ld2VzdCB2ZXJzaW9uIGZpcnN0CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0NvbW1hbmRMaW5lT3B0aW9uTW9kZWxQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQ29tbWFuZExpbmVPcHRpb25Nb2RlbFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjFlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0NvbW1hbmRMaW5lT3B0aW9uTW9kZWxQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmVTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVPcHRpb25Nb2RlbFByb2Nlc3NvciB7CisJQEluamVjdAorCXByaXZhdGUgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQ7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwlASW5qZWN0CisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgdm9pZCBwcm9jZXNzKCkgeworCQlzZWxlY3RGb3JjZWRQZXJzcGVjdGl2ZSgpOworCX0KKworCXByaXZhdGUgdm9pZCBzZWxlY3RGb3JjZWRQZXJzcGVjdGl2ZSgpIHsKKwkJU3RyaW5nIGZvcmNlZFBlcnNwZWN0aXZlSWQgPSAoU3RyaW5nKSBjb250ZXh0LmdldChFNFdvcmtiZW5jaC5GT1JDRURfUEVSU1BFQ1RJVkVfSUQpOworCQlpZiAoZm9yY2VkUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlMaXN0PE1QZXJzcGVjdGl2ZVN0YWNrPiBwZXJzcFN0YWNrTGlzdCA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoYXBwbGljYXRpb24sIG51bGwsCisJCQkJTVBlcnNwZWN0aXZlU3RhY2suY2xhc3MsIG51bGwpOworCisJCWlmIChwZXJzcFN0YWNrTGlzdC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCU1QZXJzcGVjdGl2ZVN0YWNrIHBlcnNwU3RhY2sgPSBwZXJzcFN0YWNrTGlzdC5nZXQoMCk7CisJCU1QZXJzcGVjdGl2ZSBzZWxlY3RlZCA9IHBlcnNwU3RhY2suZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisKKwkJaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQuZ2V0RWxlbWVudElkKCkuZXF1YWxzKGZvcmNlZFBlcnNwZWN0aXZlSWQpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKE1QZXJzcGVjdGl2ZSBwZXJzcCA6IHBlcnNwU3RhY2suZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKHBlcnNwLmdldEVsZW1lbnRJZCgpLmVxdWFscyhmb3JjZWRQZXJzcGVjdGl2ZUlkKSkgeworCQkJCXBlcnNwU3RhY2suc2V0U2VsZWN0ZWRFbGVtZW50KHBlcnNwKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0NvbXBvc2l0ZURlbHRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0NvbXBvc2l0ZURlbHRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2NzU3MgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQ29tcG9zaXRlRGVsdGEuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklEZWx0YTsKKworcHVibGljIGNsYXNzIENvbXBvc2l0ZURlbHRhIGltcGxlbWVudHMgSURlbHRhIHsKKworCXByaXZhdGUgZmluYWwgT2JqZWN0IG9iamVjdDsKKworCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxJRGVsdGE+IGRlbHRhcyA9IG5ldyBMaW5rZWRMaXN0PElEZWx0YT4oKTsKKworCXB1YmxpYyBDb21wb3NpdGVEZWx0YShPYmplY3Qgb2JqZWN0KSB7CisJCXRoaXMub2JqZWN0ID0gb2JqZWN0OworCX0KKworCXB1YmxpYyB2b2lkIGFkZChJRGVsdGEgZGVsdGEpIHsKKwkJZGVsdGFzLmFkZChkZWx0YSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgYXBwbHkoKSB7CisJCWZvciAoSURlbHRhIGRlbHRhIDogZGVsdGFzKSB7CisJCQlkZWx0YS5hcHBseSgpOworCQl9CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgeworCQlyZXR1cm4gb2JqZWN0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Db25maWd1cmF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQ29uZmlndXJhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzZWY1NgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQ29uZmlndXJhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFNpbW9uIFNjaG9seiA8c2ltb24uc2Nob2x6QHZvZ2VsbGEuY29tPiAtIEJ1ZyA0NjA0MDUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsSGFuZGxlckJhc2U7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBNb2RlbEhhbmRsZXJCYXNlIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0lNUEwgPSAiY2xhc3NJbXBsIjsgLy8kTk9OLU5MUy0xJAorCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBUIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3M8VD4gYWRhcHRlclR5cGUpIHsKKwkJaWYgKGFkYXB0ZXJUeXBlLmlzSW5zdGFuY2UodGhpcykpIHsKKwkJCXJldHVybiBhZGFwdGVyVHlwZS5jYXN0KHRoaXMpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gbmV3IENsYXNzW10geyBNb2RlbEhhbmRsZXJCYXNlLmNsYXNzIH07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgaWQpIHsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGljZSA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGtpZHMgPSBpY2UuZ2V0Q2hpbGRyZW4oaWQpOworCQlyZXR1cm4ga2lkczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgaWQpIHsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGljZSA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7CisKKwkJLy8gQ29uc3RydWN0IGEgbWVhbmluZ2Z1bCAnbGFiZWwnCisJCWlmICgibGFiZWwiLmVxdWFscyhpZCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIGlkVmFsID0gaWNlLmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIG5hbWVWYWwgPSBpY2UuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKKworCQkJU3RyaW5nIGNvbnN0cnVjdGVkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCQlpZiAobmFtZVZhbCAhPSBudWxsKSB7CisJCQkJY29uc3RydWN0ZWROYW1lID0gbmFtZVZhbDsKKwkJCQlpZiAoaWRWYWwgIT0gbnVsbCkKKwkJCQkJY29uc3RydWN0ZWROYW1lICs9ICIgWyIgKyBpZFZhbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl9IGVsc2UgaWYgKGlkVmFsICE9IG51bGwpIHsKKwkJCQljb25zdHJ1Y3RlZE5hbWUgPSBpZFZhbDsKKwkJCX0gZWxzZQorCQkJCWNvbnN0cnVjdGVkTmFtZSA9IGljZS5nZXROYW1lKCk7CisKKwkJCXJldHVybiBjb25zdHJ1Y3RlZE5hbWU7CisJCX0gZWxzZSBpZiAoQ0xBU1NfSU1QTC5lcXVhbHMoaWQpKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBpY2UuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcmV0dXJuIGljZS5nZXRBdHRyaWJ1dGUoaWQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wSWRzKE9iamVjdCBlbGVtZW50KSB7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudCBpY2UgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50OworCQlyZXR1cm4gaWNlLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBpZCwgT2JqZWN0IHZhbHVlKSB7CisJCXN1cGVyLnNldFByb3BlcnR5KGVsZW1lbnQsIGlkLCB2YWx1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Db250cmlidXRpb25zQW5hbHl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQ29udHJpYnV0aW9uc0FuYWx5emVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkYzNiMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvQ29udHJpYnV0aW9uc0FuYWx5emVyLmphdmEKQEAgLTAsMCArMSw3NzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICAgTWF4aW1lIFBvcmhlbCA8bWF4aW1lLnBvcmhlbEBvYmVvLmZyPiBPYmVvIC0gQnVnIDQzNTk0OQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5leHByZXNzaW9ucy5SZWZlcmVuY2VFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRXhwcmVzc2lvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmNvbW1hbmRzLk1Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1Db3JlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51U2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVBvcHVwTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXJDb250cmlidXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhckVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhclNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1UcmltQ29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworcHVibGljIGZpbmFsIGNsYXNzIENvbnRyaWJ1dGlvbnNBbmFseXplciB7CisJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBtc2csIFRocm93YWJsZSBlcnJvcikgeworCQlBY3RpdmF0b3IudHJhY2UoIi90cmFjZS9tZW51cyIsIG1zZywgZXJyb3IpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBtc2csIE9iamVjdCBtZW51LCBPYmplY3QgbWVudU1vZGVsKSB7CisJCXRyYWNlKG1zZyArICI6ICIgKyBtZW51ICsgIjogIiArIG1lbnVNb2RlbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBnYXRoZXJUcmltQ29udHJpYnV0aW9ucyhNVHJpbUJhciB0cmltTW9kZWwsCisJCQlMaXN0PE1UcmltQ29udHJpYnV0aW9uPiB0cmltQ29udHJpYnV0aW9ucywgU3RyaW5nIGVsZW1lbnRJZCwKKwkJCUFycmF5TGlzdDxNVHJpbUNvbnRyaWJ1dGlvbj4gdG9Db250cmlidXRlLCBFeHByZXNzaW9uQ29udGV4dCBlQ29udGV4dCkgeworCQlpZiAoZWxlbWVudElkID09IG51bGwgfHwgZWxlbWVudElkLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKE1UcmltQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiA6IHRyaW1Db250cmlidXRpb25zKSB7CisJCQlTdHJpbmcgcGFyZW50SWQgPSBjb250cmlidXRpb24uZ2V0UGFyZW50SWQoKTsKKwkJCWJvb2xlYW4gZmlsdGVyZWQgPSBpc0ZpbHRlcmVkKHRyaW1Nb2RlbCwgY29udHJpYnV0aW9uKTsKKwkJCWlmIChmaWx0ZXJlZCB8fCAhZWxlbWVudElkLmVxdWFscyhwYXJlbnRJZCkgfHwgIWNvbnRyaWJ1dGlvbi5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl0b0NvbnRyaWJ1dGUuYWRkKGNvbnRyaWJ1dGlvbik7CisJCX0KKwl9CisKKwlzdGF0aWMgYm9vbGVhbiBpc0ZpbHRlcmVkKE1UcmltQmFyIHRyaW1Nb2RlbCwgTVRyaW1Db250cmlidXRpb24gY29udHJpYnV0aW9uKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgWFhYZ2F0aGVyVG9vbEJhckNvbnRyaWJ1dGlvbnMoZmluYWwgTVRvb2xCYXIgdG9vbGJhck1vZGVsLAorCQkJZmluYWwgTGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4gdG9vbGJhckNvbnRyaWJ1dGlvbkxpc3QsIGZpbmFsIFN0cmluZyBpZCwKKwkJCWZpbmFsIEFycmF5TGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4gdG9Db250cmlidXRlKSB7CisJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKE1Ub29sQmFyQ29udHJpYnV0aW9uIHRvb2xCYXJDb250cmlidXRpb24gOiB0b29sYmFyQ29udHJpYnV0aW9uTGlzdCkgeworCQkJU3RyaW5nIHBhcmVudElEID0gdG9vbEJhckNvbnRyaWJ1dGlvbi5nZXRQYXJlbnRJZCgpOworCQkJYm9vbGVhbiBmaWx0ZXJlZCA9IGlzRmlsdGVyZWQodG9vbGJhck1vZGVsLCB0b29sQmFyQ29udHJpYnV0aW9uKTsKKwkJCWlmIChmaWx0ZXJlZCB8fCAhaWQuZXF1YWxzKHBhcmVudElEKSB8fCAhdG9vbEJhckNvbnRyaWJ1dGlvbi5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl0b0NvbnRyaWJ1dGUuYWRkKHRvb2xCYXJDb250cmlidXRpb24pOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGdhdGhlclRvb2xCYXJDb250cmlidXRpb25zKGZpbmFsIE1Ub29sQmFyIHRvb2xiYXJNb2RlbCwKKwkJCWZpbmFsIExpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IHRvb2xiYXJDb250cmlidXRpb25MaXN0LCBmaW5hbCBTdHJpbmcgaWQsCisJCQlmaW5hbCBBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSwgZmluYWwgRXhwcmVzc2lvbkNvbnRleHQgZUNvbnRleHQpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAoTVRvb2xCYXJDb250cmlidXRpb24gdG9vbEJhckNvbnRyaWJ1dGlvbiA6IHRvb2xiYXJDb250cmlidXRpb25MaXN0KSB7CisJCQlTdHJpbmcgcGFyZW50SUQgPSB0b29sQmFyQ29udHJpYnV0aW9uLmdldFBhcmVudElkKCk7CisJCQlib29sZWFuIGZpbHRlcmVkID0gaXNGaWx0ZXJlZCh0b29sYmFyTW9kZWwsIHRvb2xCYXJDb250cmlidXRpb24pOworCQkJaWYgKGZpbHRlcmVkIHx8ICFpZC5lcXVhbHMocGFyZW50SUQpIHx8ICF0b29sQmFyQ29udHJpYnV0aW9uLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXRvQ29udHJpYnV0ZS5hZGQodG9vbEJhckNvbnRyaWJ1dGlvbik7CisJCX0KKwl9CisKKwlzdGF0aWMgYm9vbGVhbiBpc0ZpbHRlcmVkKE1Ub29sQmFyIHRvb2xiYXJNb2RlbCwgTVRvb2xCYXJDb250cmlidXRpb24gdG9vbEJhckNvbnRyaWJ1dGlvbikgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIFhYWGdhdGhlck1lbnVDb250cmlidXRpb25zKGZpbmFsIE1NZW51IG1lbnVNb2RlbCwKKwkJCWZpbmFsIExpc3Q8TU1lbnVDb250cmlidXRpb24+IG1lbnVDb250cmlidXRpb25MaXN0LCBmaW5hbCBTdHJpbmcgaWQsCisJCQlmaW5hbCBBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSwgZmluYWwgRXhwcmVzc2lvbkNvbnRleHQgZUNvbnRleHQsCisJCQlib29sZWFuIGluY2x1ZGVQb3B1cHMpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCUFycmF5TGlzdDxTdHJpbmc+IHBvcHVwSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWlmIChpbmNsdWRlUG9wdXBzKSB7CisJCQlwb3B1cElkcy5hZGQoaWQpOworCQkJZm9yIChTdHJpbmcgdGFnIDogbWVudU1vZGVsLmdldFRhZ3MoKSkgeworCQkJCWlmICh0YWcuc3RhcnRzV2l0aCgicG9wdXA6IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgdG1wID0gdGFnLnN1YnN0cmluZygicG9wdXA6Ii5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKCFwb3B1cElkcy5jb250YWlucyh0bXApKSB7CisJCQkJCQlwb3B1cElkcy5hZGQodG1wKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+IGluY2x1ZGVkUG9wdXBzID0gbmV3IEFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4oKTsKKwkJZm9yIChNTWVudUNvbnRyaWJ1dGlvbiBtZW51Q29udHJpYnV0aW9uIDogbWVudUNvbnRyaWJ1dGlvbkxpc3QpIHsKKwkJCVN0cmluZyBwYXJlbnRJRCA9IG1lbnVDb250cmlidXRpb24uZ2V0UGFyZW50SWQoKTsKKwkJCWlmIChwYXJlbnRJRCA9PSBudWxsKSB7CisJCQkJLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZvciB0aGlzIHRvIGJlIG51bGwsIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBidWcgMzIwNzkwCisJCQkJY29udGludWU7CisJCQl9CisJCQlib29sZWFuIHBvcHVwVGFyZ2V0ID0gaW5jbHVkZVBvcHVwcyAmJiBwb3B1cElkcy5jb250YWlucyhwYXJlbnRJRCk7CisJCQlib29sZWFuIHBvcHVwQW55ID0gaW5jbHVkZVBvcHVwcyAmJiBtZW51TW9kZWwgaW5zdGFuY2VvZiBNUG9wdXBNZW51CisJCQkJCSYmIFBPUFVQX1BBUkVOVF9JRC5lcXVhbHMocGFyZW50SUQpOworCQkJYm9vbGVhbiBmaWx0ZXJlZCA9IGlzRmlsdGVyZWQobWVudU1vZGVsLCBtZW51Q29udHJpYnV0aW9uLCBpbmNsdWRlUG9wdXBzKTsKKwkJCWlmICghZmlsdGVyZWQgJiYgbWVudUNvbnRyaWJ1dGlvbi5pc1RvQmVSZW5kZXJlZCgpICYmIHBvcHVwQW55KSB7CisJCQkJLy8gcHJvY2VzcyBQT1BVUF9BTlkgZmlyc3QKKwkJCQl0b0NvbnRyaWJ1dGUuYWRkKG1lbnVDb250cmlidXRpb24pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZmlsdGVyZWQgfHwgKCFwb3B1cFRhcmdldCAmJiAhcGFyZW50SUQuZXF1YWxzKGlkKSkKKwkJCQl8fCAhbWVudUNvbnRyaWJ1dGlvbi5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpbmNsdWRlZFBvcHVwcy5hZGQobWVudUNvbnRyaWJ1dGlvbik7CisJCQl9CisJCX0KKwkJdG9Db250cmlidXRlLmFkZEFsbChpbmNsdWRlZFBvcHVwcyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGdhdGhlck1lbnVDb250cmlidXRpb25zKGZpbmFsIE1NZW51IG1lbnVNb2RlbCwKKwkJCWZpbmFsIExpc3Q8TU1lbnVDb250cmlidXRpb24+IG1lbnVDb250cmlidXRpb25MaXN0LCBmaW5hbCBTdHJpbmcgaWQsCisJCQlmaW5hbCBBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+IHRvQ29udHJpYnV0ZSwgZmluYWwgRXhwcmVzc2lvbkNvbnRleHQgZUNvbnRleHQsCisJCQlib29sZWFuIGluY2x1ZGVQb3B1cHMpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWJvb2xlYW4gbWVudUJhciA9ICgoKE1VSUVsZW1lbnQpICgoRU9iamVjdCkgbWVudU1vZGVsKS5lQ29udGFpbmVyKCkpIGluc3RhbmNlb2YgTVdpbmRvdyk7CisJCWZvciAoTU1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWJ1dGlvbiA6IG1lbnVDb250cmlidXRpb25MaXN0KSB7CisJCQlTdHJpbmcgcGFyZW50SUQgPSBtZW51Q29udHJpYnV0aW9uLmdldFBhcmVudElkKCk7CisJCQlpZiAocGFyZW50SUQgPT0gbnVsbCkgeworCQkJCS8vIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgdGhpcyB0byBiZSBudWxsLCB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYnVnIDMyMDc5MAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYm9vbGVhbiBwb3B1cCA9IHBhcmVudElELmVxdWFscyhQT1BVUF9QQVJFTlRfSUQpICYmIChtZW51TW9kZWwgaW5zdGFuY2VvZiBNUG9wdXBNZW51KQorCQkJCQkmJiBpbmNsdWRlUG9wdXBzOworCQkJYm9vbGVhbiBmaWx0ZXJlZCA9IGlzRmlsdGVyZWQobWVudU1vZGVsLCBtZW51Q29udHJpYnV0aW9uLCBpbmNsdWRlUG9wdXBzKTsKKwkJCWlmIChmaWx0ZXJlZCB8fCAoIXBvcHVwICYmICFwYXJlbnRJRC5lcXVhbHMoaWQpKSB8fCAhbWVudUNvbnRyaWJ1dGlvbi5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobWVudUJhciB8fCBpc1Zpc2libGUobWVudUNvbnRyaWJ1dGlvbiwgZUNvbnRleHQpKSB7CisJCQkJdG9Db250cmlidXRlLmFkZChtZW51Q29udHJpYnV0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworCXN0YXRpYyBib29sZWFuIGlzRmlsdGVyZWQoTU1lbnUgbWVudU1vZGVsLCBNTWVudUNvbnRyaWJ1dGlvbiBtZW51Q29udHJpYnV0aW9uLAorCQkJYm9vbGVhbiBpbmNsdWRlUG9wdXBzKSB7CisJCWlmIChpbmNsdWRlUG9wdXBzIHx8IG1lbnVNb2RlbC5nZXRUYWdzKCkuY29udGFpbnMoQ29udHJpYnV0aW9uc0FuYWx5emVyLk1DX1BPUFVQKSkgeworCQkJcmV0dXJuICFtZW51Q29udHJpYnV0aW9uLmdldFRhZ3MoKS5jb250YWlucyhDb250cmlidXRpb25zQW5hbHl6ZXIuTUNfUE9QVVApCisJCQkJCSYmIG1lbnVDb250cmlidXRpb24uZ2V0VGFncygpLmNvbnRhaW5zKENvbnRyaWJ1dGlvbnNBbmFseXplci5NQ19NRU5VKTsKKwkJfQorCQlpZiAobWVudU1vZGVsLmdldFRhZ3MoKS5jb250YWlucyhDb250cmlidXRpb25zQW5hbHl6ZXIuTUNfTUVOVSkpIHsKKwkJCXJldHVybiAhbWVudUNvbnRyaWJ1dGlvbi5nZXRUYWdzKCkuY29udGFpbnMoQ29udHJpYnV0aW9uc0FuYWx5emVyLk1DX01FTlUpCisJCQkJCSYmIG1lbnVDb250cmlidXRpb24uZ2V0VGFncygpLmNvbnRhaW5zKENvbnRyaWJ1dGlvbnNBbmFseXplci5NQ19QT1BVUCk7CisJCX0KKwkJaWYgKCFpbmNsdWRlUG9wdXBzKSB7CisJCQkvLyBub3QgaW5jbHVkaW5nIHBvcHVwcywgc28gZmlsdGVyIG91dCBwb3B1cCBtZW51IGNvbnRyaWJ1dGlvbnMgaWYgdGhlIG1lbnUgaXMgYSByZWd1bGFyCisJCQkvLyBtZW51CisJCQlyZXR1cm4gbWVudUNvbnRyaWJ1dGlvbi5nZXRUYWdzKCkuY29udGFpbnMoQ29udHJpYnV0aW9uc0FuYWx5emVyLk1DX1BPUFVQKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RJbmZvKEV4cHJlc3Npb25JbmZvIGluZm8sIE1FeHByZXNzaW9uIGV4cCkgeworCQlpZiAoIShleHAgaW5zdGFuY2VvZiBNQ29yZUV4cHJlc3Npb24pKSB7CisJCQlyZXR1cm47CisJCX0KKwkJTUNvcmVFeHByZXNzaW9uIGV4cHIgPSAoTUNvcmVFeHByZXNzaW9uKSBleHA7CisJCUV4cHJlc3Npb24gcmVmID0gbnVsbDsKKwkJaWYgKGV4cHIuZ2V0Q29yZUV4cHJlc3Npb24oKSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKKwkJCXJlZiA9IChFeHByZXNzaW9uKSBleHByLmdldENvcmVFeHByZXNzaW9uKCk7CisJCX0gZWxzZSB7CisJCQlyZWYgPSBuZXcgUmVmZXJlbmNlRXhwcmVzc2lvbihleHByLmdldENvcmVFeHByZXNzaW9uSWQoKSk7CisJCQlleHByLnNldENvcmVFeHByZXNzaW9uKHJlZik7CisJCX0KKwkJcmVmLmNvbGxlY3RFeHByZXNzaW9uSW5mbyhpbmZvKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaXNpYmxlKE1NZW51Q29udHJpYnV0aW9uIG1lbnVDb250cmlidXRpb24sIEV4cHJlc3Npb25Db250ZXh0IGVDb250ZXh0KSB7CisJCWlmIChtZW51Q29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGlzVmlzaWJsZSgoTUNvcmVFeHByZXNzaW9uKSBtZW51Q29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCksIGVDb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaXNpYmxlKE1Ub29sQmFyQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiwgRXhwcmVzc2lvbkNvbnRleHQgZUNvbnRleHQpIHsKKwkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRWaXNpYmxlV2hlbigpID09IG51bGwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBpc1Zpc2libGUoKE1Db3JlRXhwcmVzc2lvbikgY29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCksIGVDb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaXNpYmxlKE1UcmltQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiwgRXhwcmVzc2lvbkNvbnRleHQgZUNvbnRleHQpIHsKKwkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRWaXNpYmxlV2hlbigpID09IG51bGwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBpc1Zpc2libGUoKE1Db3JlRXhwcmVzc2lvbikgY29udHJpYnV0aW9uLmdldFZpc2libGVXaGVuKCksIGVDb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaXNpYmxlKE1Db3JlRXhwcmVzc2lvbiBleHAsIGZpbmFsIEV4cHJlc3Npb25Db250ZXh0IGVDb250ZXh0KSB7CisJCWZpbmFsIEV4cHJlc3Npb24gcmVmOworCQlpZiAoZXhwLmdldENvcmVFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CisJCQlyZWYgPSAoRXhwcmVzc2lvbikgZXhwLmdldENvcmVFeHByZXNzaW9uKCk7CisJCX0gZWxzZSB7CisJCQlyZWYgPSBuZXcgUmVmZXJlbmNlRXhwcmVzc2lvbihleHAuZ2V0Q29yZUV4cHJlc3Npb25JZCgpKTsKKwkJCWV4cC5zZXRDb3JlRXhwcmVzc2lvbihyZWYpOworCQl9CisJCS8vIENyZWF0ZXMgZGVwZW5kZW5jeSBvbiBhIHByZWRlZmluZWQgdmFsdWUgdGhhdCBjYW4gYmUgInBva2VkIiBieSB0aGUgZXZhbHVhdGlvbgorCQkvLyBzZXJ2aWNlCisJCUV4cHJlc3Npb25JbmZvIGluZm8gPSByZWYuY29tcHV0ZUV4cHJlc3Npb25JbmZvKCk7CisJCVN0cmluZ1tdIG5hbWVzID0gaW5mby5nZXRBY2Nlc3NlZFByb3BlcnR5TmFtZXMoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CisJCQllQ29udGV4dC5nZXRWYXJpYWJsZShuYW1lICsgIi5ldmFsdWF0aW9uU2VydmljZUxpbmsiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWJvb2xlYW4gcmV0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlyZXQgPSByZWYuZXZhbHVhdGUoZUNvbnRleHQpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0cmFjZSgiaXNWaXNpYmxlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVudUNvbnRyaWJ1dGlvbnMoZmluYWwgTU1lbnUgbWVudU1vZGVsLAorCQkJZmluYWwgQXJyYXlMaXN0PE1NZW51Q29udHJpYnV0aW9uPiB0b0NvbnRyaWJ1dGUsCisJCQlmaW5hbCBBcnJheUxpc3Q8TU1lbnVFbGVtZW50PiBtZW51Q29udHJpYnV0aW9uc1RvUmVtb3ZlKSB7CisKKwkJSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nTWVudUlkcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nU2VwYXJhdG9yTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoTU1lbnVFbGVtZW50IGNoaWxkIDogbWVudU1vZGVsLmdldENoaWxkcmVuKCkpIHsKKwkJCVN0cmluZyBlbGVtZW50SWQgPSBjaGlsZC5nZXRFbGVtZW50SWQoKTsKKwkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1NZW51ICYmIGVsZW1lbnRJZCAhPSBudWxsKSB7CisJCQkJZXhpc3RpbmdNZW51SWRzLmFkZChlbGVtZW50SWQpOworCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1NZW51U2VwYXJhdG9yICYmIGVsZW1lbnRJZCAhPSBudWxsKSB7CisJCQkJZXhpc3RpbmdTZXBhcmF0b3JOYW1lcy5hZGQoZWxlbWVudElkKTsKKwkJCX0KKwkJfQorCisJCWJvb2xlYW4gZG9uZSA9IHRvQ29udHJpYnV0ZS5zaXplKCkgPT0gMDsKKwkJd2hpbGUgKCFkb25lKSB7CisJCQlBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+IGN1ckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1NZW51Q29udHJpYnV0aW9uPih0b0NvbnRyaWJ1dGUpOworCQkJaW50IHJldHJ5Q291bnQgPSB0b0NvbnRyaWJ1dGUuc2l6ZSgpOworCQkJdG9Db250cmlidXRlLmNsZWFyKCk7CisKKwkJCWZvciAoTU1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWJ1dGlvbiA6IGN1ckxpc3QpIHsKKwkJCQlpZiAoIXByb2Nlc3NBZGRpdGlvbihtZW51TW9kZWwsIG1lbnVDb250cmlidXRpb25zVG9SZW1vdmUsIG1lbnVDb250cmlidXRpb24sCisJCQkJCQlleGlzdGluZ01lbnVJZHMsIGV4aXN0aW5nU2VwYXJhdG9yTmFtZXMpKSB7CisJCQkJCXRvQ29udHJpYnV0ZS5hZGQobWVudUNvbnRyaWJ1dGlvbik7CisJCQkJfQorCQkJfQorCQkJLy8gV2UncmUgZG9uZSBpZiB0aGUgcmV0cnlMaXN0IGlzIG5vdyBlbXB0eSAoZXZlcnl0aGluZyBkb25lKSBvcgorCQkJLy8gaWYgdGhlIGxpc3QgaGFzbid0IGNoYW5nZWQgYXQgYWxsIChubyBob3BlKQorCQkJZG9uZSA9ICh0b0NvbnRyaWJ1dGUuc2l6ZSgpID09IDApIHx8ICh0b0NvbnRyaWJ1dGUuc2l6ZSgpID09IHJldHJ5Q291bnQpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHByb2Nlc3NBZGRpdGlvbihmaW5hbCBNTWVudSBtZW51TW9kZWwsCisJCQlmaW5hbCBBcnJheUxpc3Q8TU1lbnVFbGVtZW50PiBtZW51Q29udHJpYnV0aW9uc1RvUmVtb3ZlLAorCQkJTU1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWJ1dGlvbiwgZmluYWwgSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nTWVudUlkcywKKwkJCUhhc2hTZXQ8U3RyaW5nPiBleGlzdGluZ1NlcGFyYXRvck5hbWVzKSB7CisJCWludCBpZHggPSBnZXRJbmRleChtZW51TW9kZWwsIG1lbnVDb250cmlidXRpb24uZ2V0UG9zaXRpb25JblBhcmVudCgpKTsKKwkJaWYgKGlkeCA9PSAtMSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW0gOiBtZW51Q29udHJpYnV0aW9uLmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChpdGVtIGluc3RhbmNlb2YgTU1lbnUgJiYgZXhpc3RpbmdNZW51SWRzLmNvbnRhaW5zKGl0ZW0uZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJLy8gc2tpcCB0aGlzLCBpdCdzIGFscmVhZHkgdGhlcmUKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIE1NZW51U2VwYXJhdG9yCisJCQkJCSYmIGV4aXN0aW5nU2VwYXJhdG9yTmFtZXMuY29udGFpbnMoaXRlbS5nZXRFbGVtZW50SWQoKSkpIHsKKwkJCQkvLyBza2lwIHRoaXMsIGl0J3MgYWxyZWFkeSB0aGVyZQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJTU1lbnVFbGVtZW50IGNvcHkgPSAoTU1lbnVFbGVtZW50KSBFY29yZVV0aWwuY29weSgoRU9iamVjdCkgaXRlbSk7CisJCQlpZiAoREVCVUcpIHsKKwkJCQl0cmFjZSgiYWRkTWVudUNvbnRyaWJ1dGlvbiAiICsgY29weSwgbWVudU1vZGVsLmdldFdpZGdldCgpLCBtZW51TW9kZWwpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQltZW51Q29udHJpYnV0aW9uc1RvUmVtb3ZlLmFkZChjb3B5KTsKKwkJCW1lbnVNb2RlbC5nZXRDaGlsZHJlbigpLmFkZChpZHgrKywgY29weSk7CisJCQlpZiAoY29weSBpbnN0YW5jZW9mIE1NZW51ICYmIGNvcHkuZ2V0RWxlbWVudElkKCkgIT0gbnVsbCkgeworCQkJCWV4aXN0aW5nTWVudUlkcy5hZGQoY29weS5nZXRFbGVtZW50SWQoKSk7CisJCQl9IGVsc2UgaWYgKGNvcHkgaW5zdGFuY2VvZiBNTWVudVNlcGFyYXRvciAmJiBjb3B5LmdldEVsZW1lbnRJZCgpICE9IG51bGwpIHsKKwkJCQlleGlzdGluZ1NlcGFyYXRvck5hbWVzLmFkZChjb3B5LmdldEVsZW1lbnRJZCgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc0FkZGl0aW9uKGZpbmFsIE1Ub29sQmFyIHRvb2xCYXJNb2RlbCwKKwkJCU1Ub29sQmFyQ29udHJpYnV0aW9uIHRvb2xCYXJDb250cmlidXRpb24sIExpc3Q8TVRvb2xCYXJFbGVtZW50PiBjb250cmlidXRpb25zLAorCQkJSGFzaFNldDxTdHJpbmc+IGV4aXN0aW5nU2VwYXJhdG9yTmFtZXMpIHsKKwkJaW50IGlkeCA9IGdldEluZGV4KHRvb2xCYXJNb2RlbCwgdG9vbEJhckNvbnRyaWJ1dGlvbi5nZXRQb3NpdGlvbkluUGFyZW50KCkpOworCQlpZiAoaWR4ID09IC0xKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChNVG9vbEJhckVsZW1lbnQgaXRlbSA6IHRvb2xCYXJDb250cmlidXRpb24uZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvcgorCQkJCQkmJiBleGlzdGluZ1NlcGFyYXRvck5hbWVzLmNvbnRhaW5zKGl0ZW0uZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJLy8gc2tpcCB0aGlzLCBpdCdzIGFscmVhZHkgdGhlcmUKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCU1Ub29sQmFyRWxlbWVudCBjb3B5ID0gKE1Ub29sQmFyRWxlbWVudCkgRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIGl0ZW0pOworCQkJaWYgKERFQlVHKSB7CisJCQkJdHJhY2UoImFkZFRvb2xCYXJDb250cmlidXRpb24gIiArIGNvcHksIHRvb2xCYXJNb2RlbC5nZXRXaWRnZXQoKSwgdG9vbEJhck1vZGVsKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJdG9vbEJhck1vZGVsLmdldENoaWxkcmVuKCkuYWRkKGlkeCsrLCBjb3B5KTsKKwkJCWNvbnRyaWJ1dGlvbnMuYWRkKGNvcHkpOworCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvciAmJiBjb3B5LmdldEVsZW1lbnRJZCgpICE9IG51bGwpIHsKKwkJCQlleGlzdGluZ1NlcGFyYXRvck5hbWVzLmFkZChjb3B5LmdldEVsZW1lbnRJZCgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc0FkZGl0aW9uKGZpbmFsIE1UcmltQmFyIHRyaW1CYXIsIE1UcmltQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiwKKwkJCUxpc3Q8TVRyaW1FbGVtZW50PiBjb250cmlidXRpb25zLCBIYXNoU2V0PFN0cmluZz4gZXhpc3RpbmdUb29sYmFySWRzKSB7CisJCWludCBpZHggPSBnZXRJbmRleCh0cmltQmFyLCBjb250cmlidXRpb24uZ2V0UG9zaXRpb25JblBhcmVudCgpKTsKKwkJaWYgKGlkeCA9PSAtMSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZvciAoTVRyaW1FbGVtZW50IGl0ZW0gOiBjb250cmlidXRpb24uZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBNVG9vbEJhciAmJiBleGlzdGluZ1Rvb2xiYXJJZHMuY29udGFpbnMoaXRlbS5nZXRFbGVtZW50SWQoKSkpIHsKKwkJCQkvLyBza2lwIHRoaXMsIGl0J3MgYWxyZWFkeSB0aGVyZQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJTVRyaW1FbGVtZW50IGNvcHkgPSAoTVRyaW1FbGVtZW50KSBFY29yZVV0aWwuY29weSgoRU9iamVjdCkgaXRlbSk7CisJCQlpZiAoREVCVUcpIHsKKwkJCQl0cmFjZSgiYWRkVHJpbUNvbnRyaWJ1dGlvbiAiICsgY29weSwgdHJpbUJhci5nZXRXaWRnZXQoKSwgdHJpbUJhcik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXRyaW1CYXIuZ2V0Q2hpbGRyZW4oKS5hZGQoaWR4KyssIGNvcHkpOworCQkJY29udHJpYnV0aW9ucy5hZGQoY29weSk7CisJCQlpZiAoY29weSBpbnN0YW5jZW9mIE1Ub29sQmFyICYmIGNvcHkuZ2V0RWxlbWVudElkKCkgIT0gbnVsbCkgeworCQkJCWV4aXN0aW5nVG9vbGJhcklkcy5hZGQoY29weS5nZXRFbGVtZW50SWQoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IGdldEluZGV4KE1FbGVtZW50Q29udGFpbmVyPD8+IG1lbnVNb2RlbCwgU3RyaW5nIHBvc2l0aW9uSW5QYXJlbnQpIHsKKwkJU3RyaW5nIGlkID0gbnVsbDsKKwkJU3RyaW5nIG1vZGlmaWVyID0gbnVsbDsKKwkJaWYgKHBvc2l0aW9uSW5QYXJlbnQgIT0gbnVsbCAmJiBwb3NpdGlvbkluUGFyZW50Lmxlbmd0aCgpID4gMCkgeworCQkJU3RyaW5nW10gYXJyYXkgPSBwb3NpdGlvbkluUGFyZW50LnNwbGl0KCI9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCW1vZGlmaWVyID0gYXJyYXlbMF07CisJCQkvLyBtYXkgaGF2ZSBhbiBpbnZhbGlkIHBvc2l0aW9uLCBjaGVjayBmb3IgdGhpcworCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDEpIHsKKwkJCQlpZCA9IGFycmF5WzFdOworCQkJfQorCQl9CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbWVudU1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpOworCQl9CisKKwkJaW50IGlkeCA9IDA7CisJCWludCBzaXplID0gbWVudU1vZGVsLmdldENoaWxkcmVuKCkuc2l6ZSgpOworCQl3aGlsZSAoaWR4IDwgc2l6ZSkgeworCQkJaWYgKGlkLmVxdWFscyhtZW51TW9kZWwuZ2V0Q2hpbGRyZW4oKS5nZXQoaWR4KS5nZXRFbGVtZW50SWQoKSkpIHsKKwkJCQlpZiAoImFmdGVyIi5lcXVhbHMobW9kaWZpZXIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWR4Kys7CisJCQkJfQorCQkJCXJldHVybiBpZHg7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCQlyZXR1cm4gaWQuZXF1YWxzKCJhZGRpdGlvbnMiKSA/IG1lbnVNb2RlbC5nZXRDaGlsZHJlbigpLnNpemUoKSA6IC0xOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHN0YXRpYyBNQ29tbWFuZCBnZXRDb21tYW5kQnlJZChNQXBwbGljYXRpb24gYXBwLCBTdHJpbmcgY21kSWQpIHsKKwkJZmluYWwgTGlzdDxNQ29tbWFuZD4gY21kcyA9IGFwcC5nZXRDb21tYW5kcygpOworCQlmb3IgKE1Db21tYW5kIGNtZCA6IGNtZHMpIHsKKwkJCWlmIChjbWRJZC5lcXVhbHMoY21kLmdldEVsZW1lbnRJZCgpKSkgeworCQkJCXJldHVybiBjbWQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJc3RhdGljIGNsYXNzIEtleSB7CisJCXByaXZhdGUgaW50IHRhZyA9IC0xOworCQlwcml2YXRlIGludCBoYyA9IC0xOworCQlwcml2YXRlIFN0cmluZyBwYXJlbnRJZDsKKwkJcHJpdmF0ZSBTdHJpbmcgcG9zaXRpb247CisJCXByaXZhdGUgTUNvcmVFeHByZXNzaW9uIHZleHA7CisJCXByaXZhdGUgT2JqZWN0IGZhY3Rvcnk7CisKKwkJcHVibGljIEtleShTdHJpbmcgcGFyZW50SWQsIFN0cmluZyBwb3NpdGlvbiwgTGlzdDxTdHJpbmc+IHRhZ3MsIE1Db3JlRXhwcmVzc2lvbiB2ZXhwLAorCQkJCU9iamVjdCBmYWN0b3J5KSB7CisJCQl0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7CisJCQl0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisJCQl0aGlzLnZleHAgPSB2ZXhwOworCQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKwkJCWlmICh0YWdzLmNvbnRhaW5zKCJzY2hlbWU6bWVudSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YWcgPSAxOworCQkJfSBlbHNlIGlmICh0YWdzLmNvbnRhaW5zKCJzY2hlbWU6cG9wdXAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFnID0gMjsKKwkJCX0gZWxzZSBpZiAodGFncy5jb250YWlucygic2NoZW1lOnRvb2xiYXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFnID0gMzsKKwkJCX0gZWxzZSB7CisJCQkJdGFnID0gMDsKKwkJCX0KKwkJfQorCisJCWludCBnZXRTY2hlbWVUYWcoKSB7CisJCQlyZXR1cm4gdGFnOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBLZXkpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJS2V5IG90aGVyID0gKEtleSkgb2JqOworCQkJT2JqZWN0IGV4cDEgPSB2ZXhwID09IG51bGwgPyBudWxsIDogdmV4cC5nZXRDb3JlRXhwcmVzc2lvbigpOworCQkJT2JqZWN0IGV4cDIgPSBvdGhlci52ZXhwID09IG51bGwgPyBudWxsIDogb3RoZXIudmV4cC5nZXRDb3JlRXhwcmVzc2lvbigpOworCQkJcmV0dXJuIFV0aWwuZXF1YWxzKHBhcmVudElkLCBvdGhlci5wYXJlbnRJZCkgJiYgVXRpbC5lcXVhbHMocG9zaXRpb24sIG90aGVyLnBvc2l0aW9uKQorCQkJCQkmJiBnZXRTY2hlbWVUYWcoKSA9PSBvdGhlci5nZXRTY2hlbWVUYWcoKSAmJiBVdGlsLmVxdWFscyhleHAxLCBleHAyKQorCQkJCQkmJiBVdGlsLmVxdWFscyhmYWN0b3J5LCBvdGhlci5mYWN0b3J5KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJaWYgKGhjID09IC0xKSB7CisJCQkJT2JqZWN0IGV4cDEgPSB2ZXhwID09IG51bGwgPyBudWxsIDogdmV4cC5nZXRDb3JlRXhwcmVzc2lvbigpOworCQkJCWhjID0gVXRpbC5oYXNoQ29kZShwYXJlbnRJZCk7CisJCQkJaGMgPSBoYyAqIDg3ICsgVXRpbC5oYXNoQ29kZShwb3NpdGlvbik7CisJCQkJaGMgPSBoYyAqIDg3ICsgZ2V0U2NoZW1lVGFnKCk7CisJCQkJaGMgPSBoYyAqIDg3ICsgVXRpbC5oYXNoQ29kZShleHAxKTsKKwkJCQloYyA9IGhjICogODcgKyBVdGlsLmhhc2hDb2RlKGZhY3RvcnkpOworCQkJfQorCQkJcmV0dXJuIGhjOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiICIgKyBwYXJlbnRJZCArICItLSIgKyBwb3NpdGlvbiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJKyAiLS0iICsgZ2V0U2NoZW1lVGFnKCkgKyAiLS0iICsgdmV4cDsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCXN0YXRpYyBjbGFzcyBNZW51S2V5IGV4dGVuZHMgS2V5IHsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZID0gIkNvbnRyaWJ1dGlvbkZhY3RvcnkiOyAvLyROT04tTkxTLTEkCisJCXByaXZhdGUgTU1lbnVDb250cmlidXRpb24gY29udHJpYnV0aW9uOworCisJCXB1YmxpYyBNZW51S2V5KE1NZW51Q29udHJpYnV0aW9uIG1jKSB7CisJCQlzdXBlcihtYy5nZXRQYXJlbnRJZCgpLCBtYy5nZXRQb3NpdGlvbkluUGFyZW50KCksIG1jLmdldFRhZ3MoKSwgKE1Db3JlRXhwcmVzc2lvbikgbWMKKwkJCQkJLmdldFZpc2libGVXaGVuKCksIG1jLmdldFRyYW5zaWVudERhdGEoKS5nZXQoRkFDVE9SWSkpOworCQkJdGhpcy5jb250cmlidXRpb24gPSBtYzsKKwkJCW1jLnNldFdpZGdldCh0aGlzKTsKKwkJfQorCisJCXB1YmxpYyBNTWVudUNvbnRyaWJ1dGlvbiBnZXRDb250cmlidXRpb24oKSB7CisJCQlyZXR1cm4gY29udHJpYnV0aW9uOworCQl9CisJfQorCisJc3RhdGljIGNsYXNzIFRvb2xCYXJLZXkgZXh0ZW5kcyBLZXkgeworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUlkgPSAiVG9vbEJhckNvbnRyaWJ1dGlvbkZhY3RvcnkiOyAvLyROT04tTkxTLTEkCisJCXByaXZhdGUgTVRvb2xCYXJDb250cmlidXRpb24gY29udHJpYnV0aW9uOworCisJCXB1YmxpYyBUb29sQmFyS2V5KE1Ub29sQmFyQ29udHJpYnV0aW9uIG1jKSB7CisJCQlzdXBlcihtYy5nZXRQYXJlbnRJZCgpLCBtYy5nZXRQb3NpdGlvbkluUGFyZW50KCksIG1jLmdldFRhZ3MoKSwgKE1Db3JlRXhwcmVzc2lvbikgbWMKKwkJCQkJLmdldFZpc2libGVXaGVuKCksIG1jLmdldFRyYW5zaWVudERhdGEoKS5nZXQoRkFDVE9SWSkpOworCQkJdGhpcy5jb250cmlidXRpb24gPSBtYzsKKwkJCW1jLnNldFdpZGdldCh0aGlzKTsKKwkJfQorCisJCXB1YmxpYyBNVG9vbEJhckNvbnRyaWJ1dGlvbiBnZXRDb250cmlidXRpb24oKSB7CisJCQlyZXR1cm4gY29udHJpYnV0aW9uOworCQl9CisJfQorCisJc3RhdGljIGNsYXNzIFRyaW1LZXkgZXh0ZW5kcyBLZXkgeworCQlwcml2YXRlIE1UcmltQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbjsKKworCQlwdWJsaWMgVHJpbUtleShNVHJpbUNvbnRyaWJ1dGlvbiBtYykgeworCQkJc3VwZXIobWMuZ2V0UGFyZW50SWQoKSwgbWMuZ2V0UG9zaXRpb25JblBhcmVudCgpLCBtYy5nZXRUYWdzKCksIChNQ29yZUV4cHJlc3Npb24pIG1jCisJCQkJCS5nZXRWaXNpYmxlV2hlbigpLCBudWxsKTsKKwkJCXRoaXMuY29udHJpYnV0aW9uID0gbWM7CisJCQltYy5zZXRXaWRnZXQodGhpcyk7CisJCX0KKworCQlwdWJsaWMgTVRyaW1Db250cmlidXRpb24gZ2V0Q29udHJpYnV0aW9uKCkgeworCQkJcmV0dXJuIGNvbnRyaWJ1dGlvbjsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIE1lbnVLZXkgZ2V0S2V5KE1NZW51Q29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbikgeworCQlpZiAoY29udHJpYnV0aW9uLmdldFdpZGdldCgpIGluc3RhbmNlb2YgTWVudUtleSkgeworCQkJcmV0dXJuIChNZW51S2V5KSBjb250cmlidXRpb24uZ2V0V2lkZ2V0KCk7CisJCX0KKwkJcmV0dXJuIG5ldyBNZW51S2V5KGNvbnRyaWJ1dGlvbik7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVG9vbEJhcktleSBnZXRLZXkoTVRvb2xCYXJDb250cmlidXRpb24gY29udHJpYnV0aW9uKSB7CisJCWlmIChjb250cmlidXRpb24uZ2V0V2lkZ2V0KCkgaW5zdGFuY2VvZiBUb29sQmFyS2V5KSB7CisJCQlyZXR1cm4gKFRvb2xCYXJLZXkpIGNvbnRyaWJ1dGlvbi5nZXRXaWRnZXQoKTsKKwkJfQorCQlyZXR1cm4gbmV3IFRvb2xCYXJLZXkoY29udHJpYnV0aW9uKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmltS2V5IGdldEtleShNVHJpbUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24pIHsKKwkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRXaWRnZXQoKSBpbnN0YW5jZW9mIFRyaW1LZXkpIHsKKwkJCXJldHVybiAoVHJpbUtleSkgY29udHJpYnV0aW9uLmdldFdpZGdldCgpOworCQl9CisJCXJldHVybiBuZXcgVHJpbUtleShjb250cmlidXRpb24pOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludENvbnRyaWJ1dGlvbnMoQXJyYXlMaXN0PE1NZW51Q29udHJpYnV0aW9uPiBjb250cmlidXRpb25zKSB7CisJCWZvciAoTU1lbnVDb250cmlidXRpb24gYyA6IGNvbnRyaWJ1dGlvbnMpIHsKKwkJCXRyYWNlKCJcbiIgKyBjLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChNTWVudUVsZW1lbnQgZWxlbWVudCA6IGMuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCXByaW50RWxlbWVudCgxLCBlbGVtZW50KTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRFbGVtZW50KGludCBsZXZlbCwgTU1lbnVFbGVtZW50IGVsZW1lbnQpIHsKKwkJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKKwkJCWJ1Zi5hcHBlbmQoJ1x0Jyk7CisJCX0KKwkJYnVmLmFwcGVuZChlbGVtZW50LnRvU3RyaW5nKCkpOworCQl0cmFjZShidWYudG9TdHJpbmcoKSwgbnVsbCk7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTU1lbnUpIHsKKwkJCWZvciAoTU1lbnVFbGVtZW50IGl0ZW0gOiAoKE1NZW51KSBlbGVtZW50KS5nZXRDaGlsZHJlbigpKSB7CisJCQkJcHJpbnRFbGVtZW50KGxldmVsICsgMSwgaXRlbSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2VUb29sQmFyQ29udHJpYnV0aW9ucyhBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IGNvbnRyaWJ1dGlvbnMsCisJCQlBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+IHJlc3VsdCkgeworCQlIYXNoTWFwPFRvb2xCYXJLZXksIEFycmF5TGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4+IGJ1Y2tldHMgPSBuZXcgSGFzaE1hcDxUb29sQmFyS2V5LCBBcnJheUxpc3Q8TVRvb2xCYXJDb250cmlidXRpb24+PigpOworCQl0cmFjZSgibWVyZ2VDb250cmlidXRpb25zIHNpemU6ICIgKyBjb250cmlidXRpb25zLnNpemUoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gZmlyc3QgcGFzcywgc29ydCBieSBwYXJlbnRJZD9wb3NpdGlvbixzY2hlbWUsdmlzaWJsZVdoZW4KKwkJZm9yIChNVG9vbEJhckNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gOiBjb250cmlidXRpb25zKSB7CisJCQlUb29sQmFyS2V5IGtleSA9IGdldEtleShjb250cmlidXRpb24pOworCQkJQXJyYXlMaXN0PE1Ub29sQmFyQ29udHJpYnV0aW9uPiBzbG90ID0gYnVja2V0cy5nZXQoa2V5KTsKKwkJCWlmIChzbG90ID09IG51bGwpIHsKKwkJCQlzbG90ID0gbmV3IEFycmF5TGlzdDxNVG9vbEJhckNvbnRyaWJ1dGlvbj4oKTsKKwkJCQlidWNrZXRzLnB1dChrZXksIHNsb3QpOworCQkJfQorCQkJc2xvdC5hZGQoY29udHJpYnV0aW9uKTsKKwkJfQorCQlJdGVyYXRvcjxNVG9vbEJhckNvbnRyaWJ1dGlvbj4gaSA9IGNvbnRyaWJ1dGlvbnMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGkuaGFzTmV4dCgpICYmICFidWNrZXRzLmlzRW1wdHkoKSkgeworCQkJTVRvb2xCYXJDb250cmlidXRpb24gY29udHJpYnV0aW9uID0gaS5uZXh0KCk7CisJCQlUb29sQmFyS2V5IGtleSA9IGdldEtleShjb250cmlidXRpb24pOworCQkJQXJyYXlMaXN0PE1Ub29sQmFyQ29udHJpYnV0aW9uPiBzbG90ID0gYnVja2V0cy5yZW1vdmUoa2V5KTsKKwkJCWlmIChzbG90ID09IG51bGwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCU1Ub29sQmFyQ29udHJpYnV0aW9uIHRvQ29udHJpYnV0ZSA9IG51bGw7CisJCQlmb3IgKE1Ub29sQmFyQ29udHJpYnV0aW9uIGl0ZW0gOiBzbG90KSB7CisJCQkJaWYgKHRvQ29udHJpYnV0ZSA9PSBudWxsKSB7CisJCQkJCXRvQ29udHJpYnV0ZSA9IGl0ZW07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlPYmplY3RbXSBhcnJheSA9IGl0ZW0uZ2V0Q2hpbGRyZW4oKS50b0FycmF5KCk7CisJCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgeworCQkJCQlNVG9vbEJhckVsZW1lbnQgbWUgPSAoTVRvb2xCYXJFbGVtZW50KSBhcnJheVtjXTsKKwkJCQkJaWYgKCFjb250YWluc01hdGNoaW5nKHRvQ29udHJpYnV0ZS5nZXRDaGlsZHJlbigpLCBtZSkpIHsKKwkJCQkJCXRvQ29udHJpYnV0ZS5nZXRDaGlsZHJlbigpLmFkZChtZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAodG9Db250cmlidXRlICE9IG51bGwpIHsKKwkJCQl0b0NvbnRyaWJ1dGUuc2V0V2lkZ2V0KG51bGwpOworCQkJCXJlc3VsdC5hZGQodG9Db250cmlidXRlKTsKKwkJCX0KKwkJfQorCQl0cmFjZSgibWVyZ2VDb250cmlidXRpb25zOiBmaW5hbCBzaXplOiAiICsgcmVzdWx0LnNpemUoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2VDb250cmlidXRpb25zKEFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4gY29udHJpYnV0aW9ucywKKwkJCUFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4gcmVzdWx0KSB7CisJCUhhc2hNYXA8TWVudUtleSwgQXJyYXlMaXN0PE1NZW51Q29udHJpYnV0aW9uPj4gYnVja2V0cyA9IG5ldyBIYXNoTWFwPE1lbnVLZXksIEFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4+KCk7CisJCXRyYWNlKCJtZXJnZUNvbnRyaWJ1dGlvbnMgc2l6ZTogIiArIGNvbnRyaWJ1dGlvbnMuc2l6ZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQlwcmludENvbnRyaWJ1dGlvbnMoY29udHJpYnV0aW9ucyk7CisJCS8vIGZpcnN0IHBhc3MsIHNvcnQgYnkgcGFyZW50SWQ/cG9zaXRpb24sc2NoZW1lLHZpc2libGVXaGVuCisJCWZvciAoTU1lbnVDb250cmlidXRpb24gY29udHJpYnV0aW9uIDogY29udHJpYnV0aW9ucykgeworCQkJTWVudUtleSBrZXkgPSBnZXRLZXkoY29udHJpYnV0aW9uKTsKKwkJCUFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4gc2xvdCA9IGJ1Y2tldHMuZ2V0KGtleSk7CisJCQlpZiAoc2xvdCA9PSBudWxsKSB7CisJCQkJc2xvdCA9IG5ldyBBcnJheUxpc3Q8TU1lbnVDb250cmlidXRpb24+KCk7CisJCQkJYnVja2V0cy5wdXQoa2V5LCBzbG90KTsKKwkJCX0KKwkJCXNsb3QuYWRkKGNvbnRyaWJ1dGlvbik7CisJCX0KKwkJSXRlcmF0b3I8TU1lbnVDb250cmlidXRpb24+IGkgPSBjb250cmlidXRpb25zLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpLmhhc05leHQoKSAmJiAhYnVja2V0cy5pc0VtcHR5KCkpIHsKKwkJCU1NZW51Q29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiA9IGkubmV4dCgpOworCQkJTWVudUtleSBrZXkgPSBnZXRLZXkoY29udHJpYnV0aW9uKTsKKwkJCUFycmF5TGlzdDxNTWVudUNvbnRyaWJ1dGlvbj4gc2xvdCA9IGJ1Y2tldHMucmVtb3ZlKGtleSk7CisJCQlpZiAoc2xvdCA9PSBudWxsKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlNTWVudUNvbnRyaWJ1dGlvbiB0b0NvbnRyaWJ1dGUgPSBudWxsOworCQkJZm9yIChNTWVudUNvbnRyaWJ1dGlvbiBpdGVtIDogc2xvdCkgeworCQkJCWlmICh0b0NvbnRyaWJ1dGUgPT0gbnVsbCkgeworCQkJCQl0b0NvbnRyaWJ1dGUgPSBpdGVtOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJT2JqZWN0W10gYXJyYXkgPSBpdGVtLmdldENoaWxkcmVuKCkudG9BcnJheSgpOworCQkJCWludCBpZHggPSBnZXRJbmRleCh0b0NvbnRyaWJ1dGUsIGl0ZW0uZ2V0UG9zaXRpb25JblBhcmVudCgpKTsKKwkJCQlpZiAoaWR4ID09IC0xKSB7CisJCQkJCWlkeCA9IDA7CisJCQkJfQorCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKKwkJCQkJTU1lbnVFbGVtZW50IG1lID0gKE1NZW51RWxlbWVudCkgYXJyYXlbY107CisJCQkJCWlmICghY29udGFpbnNNYXRjaGluZyh0b0NvbnRyaWJ1dGUuZ2V0Q2hpbGRyZW4oKSwgbWUpKSB7CisJCQkJCQl0b0NvbnRyaWJ1dGUuZ2V0Q2hpbGRyZW4oKS5hZGQoaWR4LCBtZSk7CisJCQkJCQlpZHgrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICh0b0NvbnRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCXRvQ29udHJpYnV0ZS5zZXRXaWRnZXQobnVsbCk7CisJCQkJcmVzdWx0LmFkZCh0b0NvbnRyaWJ1dGUpOworCQkJfQorCQl9CisJCXRyYWNlKCJtZXJnZUNvbnRyaWJ1dGlvbnM6IGZpbmFsIHNpemU6ICIgKyByZXN1bHQuc2l6ZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNNYXRjaGluZyhMaXN0PE1NZW51RWxlbWVudD4gY2hpbGRyZW4sIE1NZW51RWxlbWVudCBtZSkgeworCQlmb3IgKE1NZW51RWxlbWVudCBlbGVtZW50IDogY2hpbGRyZW4pIHsKKwkJCWlmIChVdGlsLmVxdWFscyhtZS5nZXRFbGVtZW50SWQoKSwgZWxlbWVudC5nZXRFbGVtZW50SWQoKSkKKwkJCQkJJiYgZWxlbWVudC5nZXRDbGFzcygpLmlzSW5zdGFuY2UobWUpCisJCQkJCSYmIChlbGVtZW50IGluc3RhbmNlb2YgTU1lbnVTZXBhcmF0b3IgfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1NZW51KSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTWF0Y2hpbmcoTGlzdDxNVG9vbEJhckVsZW1lbnQ+IGNoaWxkcmVuLCBNVG9vbEJhckVsZW1lbnQgbWUpIHsKKwkJZm9yIChNVG9vbEJhckVsZW1lbnQgZWxlbWVudCA6IGNoaWxkcmVuKSB7CisJCQlpZiAoVXRpbC5lcXVhbHMobWUuZ2V0RWxlbWVudElkKCksIGVsZW1lbnQuZ2V0RWxlbWVudElkKCkpCisJCQkJCSYmIGVsZW1lbnQuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG1lKQorCQkJCQkmJiAoZWxlbWVudCBpbnN0YW5jZW9mIE1Ub29sQmFyU2VwYXJhdG9yIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNVG9vbEJhcikpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc01hdGNoaW5nKExpc3Q8TVRyaW1FbGVtZW50PiBjaGlsZHJlbiwgTVRyaW1FbGVtZW50IG1lKSB7CisJCWZvciAoTVRyaW1FbGVtZW50IGVsZW1lbnQgOiBjaGlsZHJlbikgeworCQkJaWYgKFV0aWwuZXF1YWxzKG1lLmdldEVsZW1lbnRJZCgpLCBlbGVtZW50LmdldEVsZW1lbnRJZCgpKQorCQkJCQkmJiBlbGVtZW50LmdldENsYXNzKCkuaXNJbnN0YW5jZShtZSkKKwkJCQkJJiYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNVG9vbEJhclNlcGFyYXRvciB8fCBlbGVtZW50IGluc3RhbmNlb2YgTVRvb2xCYXIpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4Rm9ySWQoTUVsZW1lbnRDb250YWluZXI8TU1lbnVFbGVtZW50PiBwYXJlbnRNZW51LCBTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWludCBpID0gMDsKKwkJZm9yIChNTWVudUVsZW1lbnQgaXRlbSA6IHBhcmVudE1lbnUuZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKGlkLmVxdWFscyhpdGVtLmdldEVsZW1lbnRJZCgpKSkgeworCQkJCXJldHVybiBpOworCQkJfQorCQkJaSsrOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ19QT1BVUCA9ICJtZW51Q29udHJpYnV0aW9uOnBvcHVwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DX01FTlUgPSAibWVudUNvbnRyaWJ1dGlvbjptZW51IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DX1RPT0xCQVIgPSAibWVudUNvbnRyaWJ1dGlvbjp0b29sYmFyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUFVQX1BBUkVOVF9JRCA9ICJwb3B1cCI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZVRyaW1Db250cmlidXRpb25zKEFycmF5TGlzdDxNVHJpbUNvbnRyaWJ1dGlvbj4gY29udHJpYnV0aW9ucywKKwkJCUFycmF5TGlzdDxNVHJpbUNvbnRyaWJ1dGlvbj4gcmVzdWx0KSB7CisJCUhhc2hNYXA8VHJpbUtleSwgQXJyYXlMaXN0PE1UcmltQ29udHJpYnV0aW9uPj4gYnVja2V0cyA9IG5ldyBIYXNoTWFwPFRyaW1LZXksIEFycmF5TGlzdDxNVHJpbUNvbnRyaWJ1dGlvbj4+KCk7CisJCXRyYWNlKCJtZXJnZUNvbnRyaWJ1dGlvbnMgc2l6ZTogIiArIGNvbnRyaWJ1dGlvbnMuc2l6ZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBmaXJzdCBwYXNzLCBzb3J0IGJ5IHBhcmVudElkP3Bvc2l0aW9uLHNjaGVtZSx2aXNpYmxlV2hlbgorCQlmb3IgKE1UcmltQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiA6IGNvbnRyaWJ1dGlvbnMpIHsKKwkJCVRyaW1LZXkga2V5ID0gZ2V0S2V5KGNvbnRyaWJ1dGlvbik7CisJCQlBcnJheUxpc3Q8TVRyaW1Db250cmlidXRpb24+IHNsb3QgPSBidWNrZXRzLmdldChrZXkpOworCQkJaWYgKHNsb3QgPT0gbnVsbCkgeworCQkJCXNsb3QgPSBuZXcgQXJyYXlMaXN0PE1UcmltQ29udHJpYnV0aW9uPigpOworCQkJCWJ1Y2tldHMucHV0KGtleSwgc2xvdCk7CisJCQl9CisJCQlzbG90LmFkZChjb250cmlidXRpb24pOworCQl9CisJCUl0ZXJhdG9yPE1UcmltQ29udHJpYnV0aW9uPiBpID0gY29udHJpYnV0aW9ucy5pdGVyYXRvcigpOworCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWJ1Y2tldHMuaXNFbXB0eSgpKSB7CisJCQlNVHJpbUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBpLm5leHQoKTsKKwkJCVRyaW1LZXkga2V5ID0gZ2V0S2V5KGNvbnRyaWJ1dGlvbik7CisJCQlBcnJheUxpc3Q8TVRyaW1Db250cmlidXRpb24+IHNsb3QgPSBidWNrZXRzLnJlbW92ZShrZXkpOworCQkJaWYgKHNsb3QgPT0gbnVsbCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJTVRyaW1Db250cmlidXRpb24gdG9Db250cmlidXRlID0gbnVsbDsKKwkJCWZvciAoTVRyaW1Db250cmlidXRpb24gaXRlbSA6IHNsb3QpIHsKKwkJCQlpZiAodG9Db250cmlidXRlID09IG51bGwpIHsKKwkJCQkJdG9Db250cmlidXRlID0gaXRlbTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCU9iamVjdFtdIGFycmF5ID0gaXRlbS5nZXRDaGlsZHJlbigpLnRvQXJyYXkoKTsKKwkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7CisJCQkJCU1UcmltRWxlbWVudCBtZSA9IChNVHJpbUVsZW1lbnQpIGFycmF5W2NdOworCQkJCQlpZiAoIWNvbnRhaW5zTWF0Y2hpbmcodG9Db250cmlidXRlLmdldENoaWxkcmVuKCksIG1lKSkgeworCQkJCQkJdG9Db250cmlidXRlLmdldENoaWxkcmVuKCkuYWRkKG1lKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICh0b0NvbnRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCXRvQ29udHJpYnV0ZS5zZXRXaWRnZXQobnVsbCk7CisJCQkJcmVzdWx0LmFkZCh0b0NvbnRyaWJ1dGUpOworCQkJfQorCQl9CisJCXRyYWNlKCJtZXJnZUNvbnRyaWJ1dGlvbnM6IGZpbmFsIHNpemU6ICIgKyByZXN1bHQuc2l6ZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZU1vZGVsSW50ZXJmYWNlcyhPYmplY3QgbW9kZWxPYmplY3QsIElFY2xpcHNlQ29udGV4dCBjb250ZXh0LAorCQkJQ2xhc3M8Pz5bXSBpbnRlcmZhY2VzKSB7CisJCWZvciAoQ2xhc3M8Pz4gaW50ZiA6IGludGVyZmFjZXMpIHsKKwkJCUFjdGl2YXRvci50cmFjZShQb2xpY3kuREVCVUdfQ09OVEVYVFMsICJBZGRpbmcgIiArIGludGYuZ2V0TmFtZSgpICsgIiBmb3IgIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJKyBtb2RlbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSwgbnVsbCk7CisJCQljb250ZXh0LnNldChpbnRmLmdldE5hbWUoKSwgbW9kZWxPYmplY3QpOworCisJCQlwb3B1bGF0ZU1vZGVsSW50ZXJmYWNlcyhtb2RlbE9iamVjdCwgY29udGV4dCwgaW50Zi5nZXRJbnRlcmZhY2VzKCkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9EZWZhdWx0TG9nZ2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRGVmYXVsdExvZ2dlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2ZDcwOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRGVmYXVsdExvZ2dlclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5sb2cuSUxvZ2dlclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuRnJhbWV3b3JrVXRpbDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdExvZ2dlclByb3ZpZGVyIGltcGxlbWVudHMgSUxvZ2dlclByb3ZpZGVyIHsKKwlASW5qZWN0CisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCUBPdmVycmlkZQorCXB1YmxpYyBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoQ2xhc3M8Pz4gY2xhenopIHsKKwkJSUVjbGlwc2VDb250ZXh0IGNoaWxkQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlQ2hpbGQoKTsKKwkJY2hpbGRDb250ZXh0LnNldCgibG9nZ2VyLmJ1bmRsZW5hbWUiLCBGcmFtZXdvcmtVdGlsLmdldEJ1bmRsZShjbGF6eikuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKFdvcmtiZW5jaExvZ2dlci5jbGFzcywgY2hpbGRDb250ZXh0KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FNFdvcmtiZW5jaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FNFdvcmtiZW5jaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODk5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0U0V29ya2JlbmNoLmphdmEKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTQgQmVzdFNvbHV0aW9uLmF0IGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBUb20gU2NoaW5kbCA8dG9tLnNjaGluZGxAYmVzdHNvbHV0aW9uLmF0PiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIENocmlzdGlhbiBHZW9yZ2kgKFNBUCkgICAgICAgICAgICAgICAgICAgLSBCdWcgNDMyNDgwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLkV4cHJlc3Npb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJV29ya2JlbmNofQorICovCitwdWJsaWMgY2xhc3MgRTRXb3JrYmVuY2ggaW1wbGVtZW50cyBJV29ya2JlbmNoIHsKKwkvKioKKwkgKiBUaGUgYXJndW1lbnQgZm9yIHRoZSBsb2NhbGUgYWN0aXZlIHNoZWxsIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPmxvY2FsQWN0aXZlU2hlbGw8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfQUNUSVZFX1NIRUxMID0gImxvY2FsQWN0aXZlU2hlbGwiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciB0aGUge0BsaW5rIFVSSX0gb2YgdGhlIGluaXRpYWwgd29ya2JlbmNoIG1vZGVsIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPmluaXRpYWxXb3JrYmVuY2hNb2RlbFVSSTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX1dPUktCRU5DSF9NT0RFTF9VUkkgPSAiaW5pdGlhbFdvcmtiZW5jaE1vZGVsVVJJIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBhcmd1bWVudCBmb3IgdGhlIHtAbGluayBMb2NhdGlvbn0gb2YgdGhlIHJ1bm5pbmcgaW5zdGFuY2UgPGJyPgorCSAqIDxicj4KKwkgKiBWYWx1ZSBpczogPGNvZGU+aW5zdGFuY2VMb2NhdGlvbjwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQU5DRV9MT0NBVElPTiA9ICJpbnN0YW5jZUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBhcmd1bWVudCBmb3IgdGhlIHJlbmRlcmVyIGZhY3RvcnkgdG8gdXNlIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPnJlbmRlcmVyRmFjdG9yeVVyaTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5ERVJFUl9GQUNUT1JZX1VSSSA9ICJyZW5kZXJlckZhY3RvcnlVcmkiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciBzZXR0aW5nIHRoZSBkZWx0YSBzdG9yZSBsb2NhdGlvbiA8YnI+CisJICogPGJyPgorCSAqIFZhbHVlIGlzOiA8Y29kZT5kZWx0YVJlc3RvcmU8L2NvZGU+CisJICoKKwkgKiBAZGVwcmVjYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMVEFfUkVTVE9SRSA9ICJkZWx0YVJlc3RvcmUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciBzZXR0aW5nIFJUTCBtb2RlIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPmRpcjwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVExfTU9ERSA9ICJkaXIiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciB0aGUgcGVyc3BlY3RpdmUgdG8gYWN0aXZhdGUgPGJyPgorCSAqIDxicj4KKwkgKiBWYWx1ZSBpczogPGNvZGU+cGVyc3BlY3RpdmVJZDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRURfUEVSU1BFQ1RJVkVfSUQgPSAiZm9yY2VkUGVyc3BldGl2ZUlkIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fU0FWRURfTU9ERUxfRk9VTkQgPSAiTk9fU0FWRURfTU9ERUxfRk9VTkQiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciB0aGUgd2hldGhlciB0byBmb3JjZWZ1bGx5IHNob3cgdGhlIGxvY2F0aW9uIGluIHRoZSB3aW5kb3cgdGl0bGUgKHNldCBvbiB0aGUKKwkgKiBjb21tYW5kIGxpbmUpPGJyPgorCSAqIDxicj4KKwkgKiBWYWx1ZSBpczogPGNvZGU+Zm9yY2VkU2hvd0xvY2F0aW9uPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkNFRF9TSE9XX0xPQ0FUSU9OID0gImZvcmNlZFNob3dMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbjw/PiBvc2dpUmVnaXN0cmF0aW9uOworCisJSUVjbGlwc2VDb250ZXh0IGFwcENvbnRleHQ7CisJSVByZXNlbnRhdGlvbkVuZ2luZSByZW5kZXJlcjsKKwlNQXBwbGljYXRpb24gYXBwTW9kZWwgPSBudWxsOworCXByaXZhdGUgVUlFdmVudFB1Ymxpc2hlciB1aUV2ZW50UHVibGlzaGVyOworCisJcHJpdmF0ZSBib29sZWFuIHJlc3RhcnQ7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSUVjbGlwc2VDb250ZXh0fSBmb3IgdGhlIG1haW4gYXBwbGljYXRpb24KKwkgKi8KKwlwdWJsaWMgSUVjbGlwc2VDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBhcHBDb250ZXh0OworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICoKKwkgKiBAcGFyYW0gdWlSb290CisJICogICAgICAgICAgICB0aGUgcm9vdCBVSSBlbGVtZW50CisJICogQHBhcmFtIGFwcGxpY2F0aW9uQ29udGV4dAorCSAqICAgICAgICAgICAgdGhlIHJvb3QgY29udGV4dAorCSAqLworCXB1YmxpYyBFNFdvcmtiZW5jaChNQXBwbGljYXRpb25FbGVtZW50IHVpUm9vdCwgSUVjbGlwc2VDb250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgeworCQlpZCA9IGNyZWF0ZUlkKCk7CisJCWFwcENvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7CisJCWFwcENvbnRleHQuc2V0KElXb3JrYmVuY2guY2xhc3MuZ2V0TmFtZSgpLCB0aGlzKTsKKwkJaWYgKHVpUm9vdCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbikgeworCQkJYXBwTW9kZWwgPSAoTUFwcGxpY2F0aW9uKSB1aVJvb3Q7CisJCX0KKworCQlpZiAodWlSb290IGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uKSB7CisJCQlpbml0KChNQXBwbGljYXRpb24pIHVpUm9vdCk7CisJCX0KKworCQl1aUV2ZW50UHVibGlzaGVyID0gbmV3IFVJRXZlbnRQdWJsaXNoZXIoYXBwQ29udGV4dCk7CisJCWFwcENvbnRleHQuc2V0KFVJRXZlbnRQdWJsaXNoZXIuY2xhc3MsIHVpRXZlbnRQdWJsaXNoZXIpOworCQkoKE5vdGlmaWVyKSB1aVJvb3QpLmVBZGFwdGVycygpLmFkZCh1aUV2ZW50UHVibGlzaGVyKTsKKwkJSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcGVydGllcy5wdXQoImlkIiwgZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKKworCQlvc2dpUmVnaXN0cmF0aW9uID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkKKwkJCQkucmVnaXN0ZXJTZXJ2aWNlKElXb3JrYmVuY2guY2xhc3MuZ2V0TmFtZSgpLCB0aGlzLCBwcm9wZXJ0aWVzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVJZCgpIHsKKwkJcmV0dXJuIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHVpUm9vdAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZFJ1blVJKE1BcHBsaWNhdGlvbkVsZW1lbnQgdWlSb290KSB7CisJCS8vIEhhcyBzb21lb25lIGFscmVhZHkgY3JlYXRlZCBvbmUgPworCQlpbnN0YW50aWF0ZVJlbmRlcmVyKCk7CisKKwkJaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKKwkJCXJlbmRlcmVyLnJ1bih1aVJvb3QsIGFwcENvbnRleHQpOworCQl9CisJfQorCisJLyoqCisJICoKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnN0YW50aWF0ZVJlbmRlcmVyKCkgeworCQlyZW5kZXJlciA9IChJUHJlc2VudGF0aW9uRW5naW5lKSBhcHBDb250ZXh0LmdldChJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzLmdldE5hbWUoKSk7CisJCWlmIChyZW5kZXJlciA9PSBudWxsKSB7CisJCQlTdHJpbmcgcHJlc2VudGF0aW9uVVJJID0gKFN0cmluZykgYXBwQ29udGV4dC5nZXQoSVdvcmtiZW5jaC5QUkVTRU5UQVRJT05fVVJJX0FSRyk7CisJCQlpZiAocHJlc2VudGF0aW9uVVJJICE9IG51bGwpIHsKKwkJCQlJQ29udHJpYnV0aW9uRmFjdG9yeSBmYWN0b3J5ID0gKElDb250cmlidXRpb25GYWN0b3J5KSBhcHBDb250ZXh0CisJCQkJCQkuZ2V0KElDb250cmlidXRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisJCQkJcmVuZGVyZXIgPSAoSVByZXNlbnRhdGlvbkVuZ2luZSkgZmFjdG9yeS5jcmVhdGUocHJlc2VudGF0aW9uVVJJLCBhcHBDb250ZXh0KTsKKwkJCQlhcHBDb250ZXh0LnNldChJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzLmdldE5hbWUoKSwgcmVuZGVyZXIpOworCQkJfQorCQkJaWYgKHJlbmRlcmVyID09IG51bGwpIHsKKwkJCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlcikgYXBwQ29udGV4dC5nZXQoTG9nZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisJCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBwcmVzZW50YXRpb24gZW5naW5lIGZvciBVUkk6ICIgKyBwcmVzZW50YXRpb25VUkkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdChNQXBwbGljYXRpb24gYXBwRWxlbWVudCkgeworCQlBY3RpdmF0b3IudHJhY2UoUG9saWN5LkRFQlVHX1dPUktCRU5DSCwgImluaXQoKSB3b3JrYmVuY2giLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCisJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gYXBwRWxlbWVudC5nZXRDb250ZXh0KCk7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuc2V0KEV4cHJlc3Npb25Db250ZXh0LkFMTE9XX0FDVElWQVRJT04sIEJvb2xlYW4uVFJVRSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKKwkJaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKKwkJCXJlbmRlcmVyLnN0b3AoKTsKKwkJfQorCQlpZiAodWlFdmVudFB1Ymxpc2hlciAhPSBudWxsICYmIGFwcE1vZGVsICE9IG51bGwpIHsKKwkJCSgoTm90aWZpZXIpIGFwcE1vZGVsKS5lQWRhcHRlcnMoKS5yZW1vdmUodWlFdmVudFB1Ymxpc2hlcik7CisJCQl1aUV2ZW50UHVibGlzaGVyID0gbnVsbDsKKwkJfQorCQlpZiAob3NnaVJlZ2lzdHJhdGlvbiAhPSBudWxsKSB7CisJCQlvc2dpUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKKwkJCW9zZ2lSZWdpc3RyYXRpb24gPSBudWxsOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHJlc3RhcnQoKSB7CisJCXRoaXMucmVzdGFydCA9IHRydWU7CisJCXJldHVybiBjbG9zZSgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgd29ya2JlbmNoIHNob3VsZCBiZSByZXN0YXJ0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RhcnQoKSB7CisJCXJldHVybiByZXN0YXJ0OworCX0KKwkvLyBUT0RPOiBSZW1vdmUgaW4gUkFQCisJLy8gLyoqCisJLy8gKiBAcmV0dXJuIGEgY29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvb2t1cCBPU0dpIHNlcnZpY2VzCisJLy8gKi8KKwkvLyBwdWJsaWMgc3RhdGljIElFY2xpcHNlQ29udGV4dCBnZXRTZXJ2aWNlQ29udGV4dCgpIHsKKwkvLyByZXR1cm4KKwkvLyBFY2xpcHNlQ29udGV4dEZhY3RvcnkuZ2V0U2VydmljZUNvbnRleHQoQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkpOworCS8vIH0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7CisJCXJldHVybiBhcHBNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbnRleHQgY2hhaW4uIEl0IGJvdGggY3JlYXRlcyB0aGUgY2hhaW4gZm9yIHRoZSBjdXJyZW50IG1vZGVsLCBhbmQgYWRkcyBlQWRhcHRlcnMKKwkgKiBzbyBpdCBjYW4gYWRkIG5ldyBjb250ZXh0cyB3aGVuIG5ldyBtb2RlbCBpdGVtcyBhcmUgYWRkZWQuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udGV4dAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250ZXh0CisJICogQHBhcmFtIGNvbnRleHRNb2RlbAorCSAqICAgICAgICAgICAgbmVlZHMgYSBjb250ZXh0IGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGEgY2hhaW5lZCB7QGxpbmsgSUVjbGlwc2VDb250ZXh0fQorCSAqLworCXB1YmxpYyBzdGF0aWMgSUVjbGlwc2VDb250ZXh0IGluaXRpYWxpemVDb250ZXh0KElFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0LAorCQkJTUNvbnRleHQgY29udGV4dE1vZGVsKSB7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCQlpZiAoY29udGV4dE1vZGVsLmdldENvbnRleHQoKSAhPSBudWxsKSB7CisJCQljb250ZXh0ID0gY29udGV4dE1vZGVsLmdldENvbnRleHQoKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnRleHQgPSBwYXJlbnRDb250ZXh0LmNyZWF0ZUNoaWxkKCJQYXJ0Q29udGV4dCgiICsgY29udGV4dE1vZGVsICsgJyknKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5ERUJVR19DT05URVhUUywgImluaXRpYWxpemVDb250ZXh0KCIgLy8kTk9OLU5MUy0xJAorCQkJCSsgcGFyZW50Q29udGV4dC50b1N0cmluZygpICsgIiwgIiArIGNvbnRleHRNb2RlbCArICIpIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkvLyBmaWxsIGluIHRoZSBpbnRlcmZhY2VzLCBzbyBNQ29udHJpYnV0ZWRQYXJ0LmNsYXNzLmdldE5hbWUoKSB3aWxsCisJCS8vIHJldHVybiB0aGUgbW9kZWwgZWxlbWVudCwgZm9yIGV4YW1wbGUuCisJCUNvbnRyaWJ1dGlvbnNBbmFseXplci5wb3B1bGF0ZU1vZGVsSW50ZXJmYWNlcyhjb250ZXh0TW9kZWwsIGNvbnRleHQsIGNvbnRleHRNb2RlbAorCQkJCS5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSk7CisKKwkJLy8gZGVjbGFyZXMgbW9kaWZpYWJsZSB2YXJpYWJsZXMgZnJvbSB0aGUgbW9kZWwKKwkJTGlzdDxTdHJpbmc+IGNvbnRhaW5lZFByb3BlcnRpZXMgPSBjb250ZXh0TW9kZWwuZ2V0VmFyaWFibGVzKCk7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBjb250YWluZWRQcm9wZXJ0aWVzKSB7CisJCQljb250ZXh0LmRlY2xhcmVNb2RpZmlhYmxlKG5hbWUpOworCQl9CisKKwkJY29udGV4dE1vZGVsLnNldENvbnRleHQoY29udGV4dCk7CisJCXJldHVybiBjb250ZXh0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FNFhNSVJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0U0WE1JUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVlNzVjCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FNFhNSVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUhlbHBlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKKworcHVibGljIGNsYXNzIEU0WE1JUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgeworCisJcHJpdmF0ZSBNYXA8RU9iamVjdCwgU3RyaW5nPiBvYmplY3RNYXAgPSBuZXcgV2Vha0hhc2hNYXA8RU9iamVjdCwgU3RyaW5nPigpOworCXByaXZhdGUgU2V0PFN0cmluZz4ga25vd25JZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKwlwdWJsaWMgRTRYTUlSZXNvdXJjZSgpIHsKKwl9CisKKwlwdWJsaWMgRTRYTUlSZXNvdXJjZShVUkkgdXJpKSB7CisJCXN1cGVyKHVyaSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW50ZXJuYWxJZChFT2JqZWN0IG9iamVjdCwgU3RyaW5nIGlkKSB7CisJCW9iamVjdE1hcC5wdXQob2JqZWN0LCBpZCk7CisJCWtub3duSWRzLmFkZChpZCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbElkKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvYmplY3RNYXAuZ2V0KG9iamVjdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gdXNlSURzKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBjcmVhdGVJZCgpIHsKKwkJcmV0dXJuIEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJU3RyaW5nIGlkID0gY3JlYXRlSWQoKTsKKwkJd2hpbGUgKGtub3duSWRzLmNvbnRhaW5zKGlkKSkgeworCQkJaWQgPSBjcmVhdGVJZCgpOworCQl9CisJCXJldHVybiBpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJRChFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBpZCkgeworCQlpZiAoaWQgIT0gbnVsbCkgeworCQkJU3RyaW5nIGludGVybmFsSWQgPSBvYmplY3RNYXAuZ2V0KGVPYmplY3QpOworCQkJaWYgKGludGVybmFsSWQgIT0gbnVsbCkgeworCQkJCXN1cGVyLnNldElEKGVPYmplY3QsIGludGVybmFsSWQpOworCQkJfQorCQkJb2JqZWN0TWFwLnB1dChlT2JqZWN0LCBpZCk7CisJCQlrbm93bklkcy5hZGQoaWQpOworCQl9CisJCXN1cGVyLnNldElEKGVPYmplY3QsIGlkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldElEKEVPYmplY3QgZU9iamVjdCkgeworCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEVudHJ5PD8sID8+KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCVN0cmluZyBpZCA9IHN1cGVyLmdldElEKGVPYmplY3QpOworCQlpZiAoaWQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGlkOworCQl9CisKKwkJaWQgPSBvYmplY3RNYXAuZ2V0KGVPYmplY3QpOworCQlpZiAoaWQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGlkOworCQl9CisKKwkJaWQgPSBnZXRVbmlxdWVJZCgpOworCQlzZXRJRChlT2JqZWN0LCBpZCk7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiBGdW5jdGlvbmFsIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgb2JqZWN0cworCSAqLworCXByaXZhdGUgaW50ZXJmYWNlIE9iamVjdENyZWF0b3IgeworCQlNQXBwbGljYXRpb25FbGVtZW50IGNyZWF0ZSgpOworCX0KKworCXN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3RDcmVhdG9yPiBkZXByZWNhdGVkVHlwZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3RDcmVhdG9yPigpOworCXN0YXRpYyB7CisJCWRlcHJlY2F0ZWRUeXBlTWFwcGluZ3MucHV0KCJPcGFxdWVNZW51IiwgbmV3IE9iamVjdENyZWF0b3IoKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE1BcHBsaWNhdGlvbkVsZW1lbnQgY3JlYXRlKCkgeworCQkJCQkJcmV0dXJuIE9wYXF1ZUVsZW1lbnRVdGlsLmNyZWF0ZU9wYXF1ZU1lbnUoKTsKKwkJCQkJfQorCQkJCX0pOworCQlkZXByZWNhdGVkVHlwZU1hcHBpbmdzLnB1dCgiT3BhcXVlTWVudUl0ZW0iLCBuZXcgT2JqZWN0Q3JlYXRvcigpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgTUFwcGxpY2F0aW9uRWxlbWVudCBjcmVhdGUoKSB7CisJCQkJCQlyZXR1cm4gT3BhcXVlRWxlbWVudFV0aWwuY3JlYXRlT3BhcXVlTWVudUl0ZW0oKTsKKwkJCQkJfQorCQkJCX0pOworCQlkZXByZWNhdGVkVHlwZU1hcHBpbmdzLnB1dCgiT3BhcXVlTWVudVNlcGFyYXRvciIsIG5ldyBPYmplY3RDcmVhdG9yKCkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBNQXBwbGljYXRpb25FbGVtZW50IGNyZWF0ZSgpIHsKKwkJCQkJCXJldHVybiBPcGFxdWVFbGVtZW50VXRpbC5jcmVhdGVPcGFxdWVNZW51U2VwYXJhdG9yKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJZGVwcmVjYXRlZFR5cGVNYXBwaW5ncy5wdXQoIk9wYXF1ZVRvb2xJdGVtIiwgbmV3IE9iamVjdENyZWF0b3IoKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE1BcHBsaWNhdGlvbkVsZW1lbnQgY3JlYXRlKCkgeworCQkJCQkJcmV0dXJuIE9wYXF1ZUVsZW1lbnRVdGlsLmNyZWF0ZU9wYXF1ZVRvb2xJdGVtKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJZGVwcmVjYXRlZFR5cGVNYXBwaW5ncy5wdXQoIlJlbmRlcmVkTWVudSIsIG5ldyBPYmplY3RDcmVhdG9yKCkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBNQXBwbGljYXRpb25FbGVtZW50IGNyZWF0ZSgpIHsKKwkJCQkJCXJldHVybiBSZW5kZXJlZEVsZW1lbnRVdGlsLmNyZWF0ZVJlbmRlcmVkTWVudSgpOworCQkJCQl9CisJCQkJfSk7CisJCWRlcHJlY2F0ZWRUeXBlTWFwcGluZ3MucHV0KCJSZW5kZXJlZE1lbnVJdGVtIiwgbmV3IE9iamVjdENyZWF0b3IoKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE1BcHBsaWNhdGlvbkVsZW1lbnQgY3JlYXRlKCkgeworCQkJCQkJcmV0dXJuIFJlbmRlcmVkRWxlbWVudFV0aWwuY3JlYXRlUmVuZGVyZWRNZW51SXRlbSgpOworCQkJCQl9CisJCQkJfSk7CisJCWRlcHJlY2F0ZWRUeXBlTWFwcGluZ3MucHV0KCJSZW5kZXJlZFRvb2xCYXIiLCBuZXcgT2JqZWN0Q3JlYXRvcigpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgTUFwcGxpY2F0aW9uRWxlbWVudCBjcmVhdGUoKSB7CisJCQkJCQlyZXR1cm4gUmVuZGVyZWRFbGVtZW50VXRpbC5jcmVhdGVSZW5kZXJlZFRvb2xCYXIoKTsKKwkJCQkJfQorCQkJCX0pOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgeworCQkvLyBIYW5kbGUgbWFwcGluZyBvZiBkZXByZWNhdGVkIHR5cGVzCisJCXJldHVybiBuZXcgWE1JSGVscGVySW1wbCh0aGlzKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEVPYmplY3QgY3JlYXRlT2JqZWN0KEVGYWN0b3J5IGVGYWN0b3J5LCBFQ2xhc3NpZmllciB0eXBlKSB7CisJCQkJaWYgKE1NZW51RmFjdG9yeS5JTlNUQU5DRSA9PSBlRmFjdG9yeSAmJiB0eXBlICE9IG51bGwgJiYgdHlwZS5nZXROYW1lKCkgIT0gbnVsbCkgeworCQkJCQlmaW5hbCBPYmplY3RDcmVhdG9yIG9iamVjdENyZWF0b3IgPSBkZXByZWNhdGVkVHlwZU1hcHBpbmdzLmdldCh0eXBlLmdldE5hbWUoKSk7CisJCQkJCWlmIChvYmplY3RDcmVhdG9yICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiAoRU9iamVjdCkgb2JqZWN0Q3JlYXRvci5jcmVhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlT2JqZWN0KGVGYWN0b3J5LCB0eXBlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0VHlwZShFRmFjdG9yeSBlRmFjdG9yeSwgU3RyaW5nIHR5cGVOYW1lKSB7CisJCQkJaWYgKGRlcHJlY2F0ZWRUeXBlTWFwcGluZ3MuY29udGFpbnNLZXkodHlwZU5hbWUpKSB7CisJCQkJCS8vIG5lZWQgYSB0ZW1wIGluc3RhbmNlIG9mIHRoZSBub3cgcmVtb3ZlZCBFQ2xhc3Mgc28gdGhhdAorCQkJCQkvLyBjcmVhdGVPYmplY3QsIGFib3ZlLCBjYW4gZG8gaXQncyB3b3JrLgorCQkJCQlmaW5hbCBFQ2xhc3MgdGVtcEVDbGFzcyA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUNsYXNzKCk7CisJCQkJCXRlbXBFQ2xhc3Muc2V0TmFtZSh0eXBlTmFtZSk7CisJCQkJCXJldHVybiB0ZW1wRUNsYXNzOworCQkJCX0KKwkJCQlyZXR1cm4gc3VwZXIuZ2V0VHlwZShlRmFjdG9yeSwgdHlwZU5hbWUpOworCQkJfQorCisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FNFhNSVJlc291cmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FNFhNSVJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0U0WE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUGFyc2VyUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxQYXJzZXJQb29sSW1wbDsKKworLyoqCisgKiBSZXNvdXJjZSBmYWN0b3J5IGZvciB7QGxpbmsgRTRYTUlSZXNvdXJjZX0uCisgKi8KK3B1YmxpYyBjbGFzcyBFNFhNSVJlc291cmNlRmFjdG9yeSBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgeworCisJLyoqCisJICogTGlzdCB1c2VkIGZvciBFTUYge0BsaW5rIFhNTFJlc291cmNlI09QVElPTl9VU0VfQ0FDSEVEX0xPT0tVUF9UQUJMRX0gb3B0aW9uIHZhbHVlLiBQYWNrYWdlZAorCSAqIGluIGEgVGhyZWFkTG9jYWwgcGVyIEVNRiByZWNvbW1lbmRhdGlvbiBmb3IgdGhyZWFkIHNhZmV0eS4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsPExpc3Q8T2JqZWN0Pj4gbG9va3VwVGFibGUgPSBuZXcgVGhyZWFkTG9jYWw8TGlzdDxPYmplY3Q+PigpOworCS8qKgorCSAqIFBhcnNlciBwb29sIG9iamVjdCBmb3Ige0BsaW5rIFhNTFJlc291cmNlI09QVElPTl9VU0VfUEFSU0VSX1BPT0x9IG9wdGlvbi4gQWxzbyBuZWVkZWQgZm9yCisJICogc2V0dGluZyB7QGxpbmsgWE1MUmVzb3VyY2UjT1BUSU9OX1VTRV9ERVBSRUNBVEVEX01FVEhPRFN9IGZvciBmYWxzZS4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFhNTFBhcnNlclBvb2wgcGFyc2VyUG9vbCA9IG5ldyBYTUxQYXJzZXJQb29sSW1wbCgpOworCS8qKgorCSAqIE1hcCB1c2VkIGZvciB7QGxpbmsgWE1MUmVzb3VyY2UjT1BUSU9OX1VTRV9YTUxfTkFNRV9UT19GRUFUVVJFX01BUH0uIFBlciBFTUYgZG9jdW1lbnRhdGlvbiwKKwkgKiB0aGUgbWFwIGlzIGhvc3RlZCB3aXRoaW4gYSBUaHJlYWRMb2NhbGUgZm9yIHRocmVhZCBzYWZldHkuCisJICovCisJcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxNYXA8T2JqZWN0LCBPYmplY3Q+PiBuYW1lVG9GZWF0dXJlTWFwID0gbmV3IFRocmVhZExvY2FsPE1hcDxPYmplY3QsIE9iamVjdD4+KCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlmaW5hbCBFNFhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEU0WE1JUmVzb3VyY2UodXJpKTsKKworCQkvLyBjb25maWd1cmUgZGVmYXVsdCBzYXZlL2xvYWQgb3B0aW9ucywgYXMgc3VnZ2VzdGVkIGJ5CisJCS8vIEVNRjogRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmssIFNlY29uZCBFZGl0aW9uCisJCS8vIFNlY3Rpb24gMTUuNS4xCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSByZXNvdXJjZS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9DT05GSUdVUkFUSU9OX0NBQ0hFLCBCb29sZWFuLlRSVUUpOworCQlzYXZlT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9DQUNIRURfTE9PS1VQX1RBQkxFLCBsb29rdXBUYWJsZS5nZXQoKSk7CisKKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBsb2FkT3B0aW9ucyA9IHJlc291cmNlLmdldERlZmF1bHRMb2FkT3B0aW9ucygpOworCQlsb2FkT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0RFRkVSX0FUVEFDSE1FTlQsIEJvb2xlYW4uVFJVRSk7CisJCWxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fREVGRVJfSURSRUZfUkVTT0xVVElPTiwgQm9vbGVhbi5UUlVFKTsKKwkJbG9hZE9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfUEFSU0VSX1BPT0wsIHBhcnNlclBvb2wpOworCQlsb2FkT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9YTUxfTkFNRV9UT19GRUFUVVJFX01BUCwgbmFtZVRvRmVhdHVyZU1hcC5nZXQoKSk7CisJCWxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0RFUFJFQ0FURURfTUVUSE9EUywgQm9vbGVhbi5GQUxTRSk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0VNRkRlbHRhRW50cnlTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GRGVsdGFFbnRyeVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNmQxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0VNRkRlbHRhRW50cnlTZXQuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLk1vZGVsRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKKworcHVibGljIGNsYXNzIEVNRkRlbHRhRW50cnlTZXQgZXh0ZW5kcyBNb2RlbERlbHRhIHsKKworCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGtleTsKKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOworCisJcHVibGljIEVNRkRlbHRhRW50cnlTZXQoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIob2JqZWN0LCBmZWF0dXJlLmdldE5hbWUoKSwgbnVsbCk7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJCXRoaXMua2V5ID0ga2V5OworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgYXBwbHkoKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlFTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSAoRU1hcDxTdHJpbmcsIFN0cmluZz4pICgoRU9iamVjdCkgZ2V0T2JqZWN0KCkpLmVHZXQoZmVhdHVyZSk7CisJCW1hcC5wdXQoa2V5LCB2YWx1ZSk7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GRGVsdGFNYXBTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GRGVsdGFNYXBTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM2OTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FTUZEZWx0YU1hcFNldC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKK2NsYXNzIEVNRkRlbHRhTWFwU2V0IGV4dGVuZHMgTW9kZWxEZWx0YSB7CisKKwlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBkZWx0YU1hcDsKKworCUVNRkRlbHRhTWFwU2V0KEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWFwPFN0cmluZywgU3RyaW5nPiBkZWx0YU1hcCkgeworCQlzdXBlcihvYmplY3QsIGZlYXR1cmUuZ2V0TmFtZSgpLCBudWxsKTsKKwkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKwkJdGhpcy5kZWx0YU1hcCA9IGRlbHRhTWFwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGFwcGx5KCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJRU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gKEVNYXA8U3RyaW5nLCBTdHJpbmc+KSAoKEVPYmplY3QpIGdldE9iamVjdCgpKS5lR2V0KGZlYXR1cmUpOworCQltYXAuY2xlYXIoKTsKKwkJbWFwLnB1dEFsbChkZWx0YU1hcCk7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GTW9kZWxEZWx0YURlbGF5ZWRTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GTW9kZWxEZWx0YURlbGF5ZWRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmIwNmEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FTUZNb2RlbERlbHRhRGVsYXllZFNldC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCitwdWJsaWMgY2xhc3MgRU1GTW9kZWxEZWx0YURlbGF5ZWRTZXQgZXh0ZW5kcyBFTUZNb2RlbERlbHRhU2V0IHsKKworCXByaXZhdGUgT2JqZWN0IHJvb3Q7CisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwlwcml2YXRlIE9iamVjdCB2YWx1ZTsKKworCXB1YmxpYyBFTUZNb2RlbERlbHRhRGVsYXllZFNldChPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHJvb3QsIFN0cmluZyBpZCkgeworCQlzdXBlcihvYmplY3QsIGZlYXR1cmUsIG51bGwpOworCQl0aGlzLnJvb3QgPSByb290OworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGFwcGx5KCkgeworCQlMaXN0PE9iamVjdD4gcmVmZXJlbmNlcyA9IFhNTE1vZGVsUmVjb25jaWxlci5nZXRSZWZlcmVuY2VzKHJvb3QpOworCQl2YWx1ZSA9IFhNTE1vZGVsUmVjb25jaWxlci5maW5kUmVmZXJlbmNlKHJlZmVyZW5jZXMsIGlkKTsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJfQorCQlyZXR1cm4gc3VwZXIuYXBwbHkoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GTW9kZWxEZWx0YVNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FTUZNb2RlbERlbHRhU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2Y2MxMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GTW9kZWxEZWx0YVNldC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCitwdWJsaWMgY2xhc3MgRU1GTW9kZWxEZWx0YVNldCBleHRlbmRzIE1vZGVsRGVsdGEgeworCisJcHJpdmF0ZSBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKKworCXB1YmxpYyBFTUZNb2RlbERlbHRhU2V0KE9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKKwkJc3VwZXIob2JqZWN0LCBmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOworCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGFwcGx5KCkgeworCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZ2V0T2JqZWN0KCk7CisJCWVPYmplY3QuZVNldChmZWF0dXJlLCBnZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0VNRk1vZGVsRGVsdGFUaHJlZVdheURlbGF5ZWRTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GTW9kZWxEZWx0YVRocmVlV2F5RGVsYXllZFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmY4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0VNRk1vZGVsRGVsdGFUaHJlZVdheURlbGF5ZWRTZXQuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFTUZNb2RlbERlbHRhVGhyZWVXYXlEZWxheWVkU2V0IGV4dGVuZHMgRU1GTW9kZWxEZWx0YVNldCB7CisKKwlwcml2YXRlIExpc3Q8Pz4gb3JpZ2luYWxSZWZlcmVuY2VzOworCXByaXZhdGUgTGlzdDw/PiB1c2VyUmVmZXJlbmNlczsKKwlwcml2YXRlIExpc3Q8Pz4gY3VycmVudFJlZmVyZW5jZXM7CisKKwlwdWJsaWMgRU1GTW9kZWxEZWx0YVRocmVlV2F5RGVsYXllZFNldChPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKKwkJCUxpc3Q8Pz4gb3JpZ2luYWxSZWZlcmVuY2VzLCBMaXN0PD8+IHVzZXJSZWZlcmVuY2VzLCBMaXN0PD8+IGN1cnJlbnRSZWZlcmVuY2VzKSB7CisJCXN1cGVyKG9iamVjdCwgZmVhdHVyZSwgbnVsbCk7CisJCXRoaXMub3JpZ2luYWxSZWZlcmVuY2VzID0gb3JpZ2luYWxSZWZlcmVuY2VzOworCQl0aGlzLnVzZXJSZWZlcmVuY2VzID0gdXNlclJlZmVyZW5jZXM7CisJCXRoaXMuY3VycmVudFJlZmVyZW5jZXMgPSBjdXJyZW50UmVmZXJlbmNlczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZVZhbHVlKCkgeworCQl1c2VyUmVmZXJlbmNlcyA9IChMaXN0PD8+KSBjb252ZXJ0KHVzZXJSZWZlcmVuY2VzKTsKKwkJcmV0dXJuIFhNTE1vZGVsUmVjb25jaWxlci50aHJlZVdheU1lcmdlKG9yaWdpbmFsUmVmZXJlbmNlcywgdXNlclJlZmVyZW5jZXMsCisJCQkJY3VycmVudFJlZmVyZW5jZXMpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRU1GTW9kZWxEZWx0YVVuc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0VNRk1vZGVsRGVsdGFVbnNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGU5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0VNRk1vZGVsRGVsdGFVbnNldC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCitwdWJsaWMgZmluYWwgY2xhc3MgRU1GTW9kZWxEZWx0YVVuc2V0IGV4dGVuZHMgTW9kZWxEZWx0YSB7CisKKwlwcml2YXRlIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOworCisJcHVibGljIEVNRk1vZGVsRGVsdGFVbnNldChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCXN1cGVyKGVPYmplY3QsIGZlYXR1cmUuZ2V0TmFtZSgpLCBudWxsKTsKKwkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyBhcHBseSgpIHsKKwkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGdldE9iamVjdCgpOworCQllT2JqZWN0LmVVbnNldChmZWF0dXJlKTsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0V4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRXhjZXB0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNmRjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklFeGNlcHRpb25IYW5kbGVyOworCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElFeGNlcHRpb25IYW5kbGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FeHRlbnNpb25Qb2ludFByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0V4dGVuc2lvblBvaW50UHJveHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QzOTEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9FeHRlbnNpb25Qb2ludFByb3h5LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBFeHRlbnNpb25Qb2ludFByb3h5IHsKKworCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7CisJcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOworCXByaXZhdGUgSURlbGVnYXRlSW5pdGlhbGl6ZXIgZGVsZWdhdGVJbml0aWFsaXplcjsKKworCXByaXZhdGUgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKKwlwcml2YXRlIE9iamVjdCBkZWxlZ2F0ZTsKKworCXB1YmxpYyBFeHRlbnNpb25Qb2ludFByb3h5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXRoaXMoZWxlbWVudCwgcHJvcGVydHlOYW1lLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgRXh0ZW5zaW9uUG9pbnRQcm94eShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5TmFtZSwKKwkJCUlEZWxlZ2F0ZUluaXRpYWxpemVyIGRlbGVnYXRlSW5pdGlhbGl6ZXIpIHsKKwkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKKwkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisJCXRoaXMuZGVsZWdhdGVJbml0aWFsaXplciA9IGRlbGVnYXRlSW5pdGlhbGl6ZXI7CisJfQorCisJcHVibGljIE9iamVjdCBnZXREZWxlZ2F0ZSgpIHsKKwkJcmV0dXJuIGRlbGVnYXRlOworCX0KKworCXB1YmxpYyBPYmplY3QgY3JlYXRlRGVsZWdhdGUoTUFwcGxpY2F0aW9uRWxlbWVudCBtb2RlbCkgeworCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCAmJiAhZmFpbGVkKSB7CisJCQl0cnkgeworCQkJCWRlbGVnYXRlID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKHByb3BlcnR5TmFtZSk7CisJCQkJaWYgKGRlbGVnYXRlSW5pdGlhbGl6ZXIgIT0gbnVsbCkgeworCQkJCQlkZWxlZ2F0ZUluaXRpYWxpemVyLmluaXRpYWxpemUobW9kZWwsIGRlbGVnYXRlKTsKKwkJCQl9CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlmYWlsZWQgPSB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBkZWxlZ2F0ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzZXRGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisJCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7CisJCQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkKGRlbGVnYXRlLmdldENsYXNzKCksIG5hbWUpOworCQkJaWYgKGZpZWxkICE9IG51bGwpIHsKKwkJCQlib29sZWFuIGFjY2Vzc2libGUgPSBmaWVsZC5pc0FjY2Vzc2libGUoKTsKKwkJCQl0cnkgeworCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQkJCQlmaWVsZC5zZXQoZGVsZWdhdGUsIHZhbHVlKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKGFjY2Vzc2libGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBGaWVsZCBnZXRGaWVsZChDbGFzczw/PiBjbHMsIFN0cmluZyBuYW1lKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gY2xzLmdldERlY2xhcmVkRmllbGQobmFtZSk7CisJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZ2V0RmllbGQoY2xzLmdldFN1cGVyY2xhc3MoKSwgbmFtZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0V4dGVuc2lvbnNTb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0V4dGVuc2lvbnNTb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0OTlhNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvRXh0ZW5zaW9uc1NvcnQuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNYW51bWl0dGluZyBUZWNobm9sb2dpZXMgSW5jIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBCcmlhbiBkZSBBbHdpcyAoTVRJKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFJlbsOpIEJyYW5kc3RldHRlciAtIEJ1ZyA0MTk3NDkgLSBbV29ya2JlbmNoXSBbZTQgV29ya2JlbmNoXSAtIFJlbW92ZSB0aGUgZGVwcmVjYXRlZCBQYWNrYWdlQWRtaW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5uYW1lc3BhY2UuQnVuZGxlTmFtZXNwYWNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay53aXJpbmcuQnVuZGxlV2lyZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsud2lyaW5nLkJ1bmRsZVdpcmluZzsKKworLyoqCisgKiBTb3J0IHtAbGluayBJRXh0ZW5zaW9ufXMgYnkgdGhlaXIgcGx1Zy1pbiBkZXBlbmRlbmNpZXMgc3VjaCB0aGF0IGFueSBleHRlbnNpb24gZnJvbSBidW5kbGUgQQorICogc2hvdWxkIGJlIHNvcnRlZCBiZWZvcmUgYW55IGV4dGVuc2lvbnMgZnJvbSBhbnkgYnVuZGxlcyB0aGF0IGRlcGVuZCBvbiBBLgorICogPHA+CisgKiBDb25zaWRlciBoYXZpbmcgZXh0ZW5zaW9ucyBmcm9tIGJ1bmRsZXMgQSwgQiwgYW5kIEMsIHdoZXJlIEEgZGVwZW5kcyBvbiBCLCBhbmQgQiBkZXBlbmRzIG9uIEMuCisgKiBUaGUgcmVzdWx0IG9mIHRoaXMgc29ydCBzaG91bGQgYmUgdGhlIGV4dGVuc2lvbnMgZnJvbSBDLCB0aGVuIGZyb20gQiwgYW5kIGZpbmFsbHkgZnJvbSBBLgorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5zaW9uc1NvcnQgZXh0ZW5kcyBUb3BvbG9naWNhbFNvcnQ8SUV4dGVuc2lvbiwgQnVuZGxlPiB7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQnVuZGxlIGdldElkKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7CisJCUlDb250cmlidXRvciBjb250cmlidXRvciA9IGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpOworCQlyZXR1cm4gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGVGb3JOYW1lKGNvbnRyaWJ1dG9yLmdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYnVuZGxlcyB0aGF0IHRoZSBnaXZlbiBidW5kbGUgcmVxdWlyZXMuCisJICoKKwkgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSB7QGxpbmsgSXRlcmFibGV9IHNldCBvZiBidW5kbGVzIGN1cnJlbnRseSByZXF1aXJlZCBieSB0aGUgZ2VpdmVuCisJICogICAgICAgICBidW5kbGUuIEFuIGVtcHR5IHtAbGluayBJdGVyYWJsZX0gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZ2l2ZW4ge0Bjb2RlIEJ1bmRsZX0gb2JqZWN0CisJICogICAgICAgICBoYXMgYmVjb21lIHN0YWxlIG9yIHRoZXJlIGFyZSBubyBidW5kbGVzIHJlcXVpcmVkLgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYnVuZGxlfSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPEJ1bmRsZT4gZ2V0UmVxdWlyZW1lbnRzKEJ1bmRsZSBidW5kbGUpIHsKKwkJLy8gcHVudCB0byBnZXREZXBlbmRlbnRzKCkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmVjdXJzaXZlbHkgY29sbGVjdHMgYWxsIGJ1bmRsZXMgd2hpY2ggZGVwZW5kLW9uL3JlcXVpcmUgdGhlIGdpdmVuIHtAbGluayBCdW5kbGVXaXJpbmd9LgorCSAqIDxwPgorCSAqIEFsbCByZS1leHBvcnRzIHdpbGwgYmUgZm9sbG93ZWQgYW5kIGFsc28gYmUgY29udGFpbmVkIGluIHRoZSByZXN1bHQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGRlcGVuZGVudHMKKwkgKiAgICAgICAgICAgIHRoZSByZXN1bHQgd2hpY2ggd2lsbCBjb250YWluIGFsbCB0aGUgYnVuZGxlcyB3aGljaCByZXF1aXJlIHRoZSBnaXZlbgorCSAqICAgICAgICAgICAge0BsaW5rIEJ1bmRsZVdpcmluZ30KKwkgKiBAcGFyYW0gcHJvdmlkZXJXaXJpbmcKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQnVuZGxlV2lyaW5nfSBmb3Igd2hpY2ggdGhlIHJlcXVpcmVycyBzaG91bGQgYmUgcmVzb2x2ZWQKKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgZWl0aGVyIHRoZSByZXF1aXJpbmcgb3IgdGhlIHByb3ZpZGVyV2lyaW5nIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZXBlbmRlbnRzKFNldDxCdW5kbGU+IGRlcGVuZGVudHMsIEJ1bmRsZVdpcmluZyBwcm92aWRlcldpcmluZykgeworCQlMaXN0PEJ1bmRsZVdpcmU+IHJlcXVpcmVyV2lyZXMgPSBwcm92aWRlcldpcmluZworCQkJCS5nZXRQcm92aWRlZFdpcmVzKEJ1bmRsZU5hbWVzcGFjZS5CVU5ETEVfTkFNRVNQQUNFKTsKKwkJaWYgKHJlcXVpcmVyV2lyZXMgPT0gbnVsbCkgeworCQkJLy8gd2UgZG9uJ3QgaG9sZCBsb2NrcyB3aGlsZSBjaGVja2luZyB0aGUgZ3JhcGgsIGp1c3QgcmV0dXJuIGlmIG5vIGxvbmdlciBpc0luVXNlCisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChCdW5kbGVXaXJlIHJlcXVpcmVCdW5kbGVXaXJlIDogcmVxdWlyZXJXaXJlcykgeworCQkJQnVuZGxlIHJlcXVpcmVyID0gcmVxdWlyZUJ1bmRsZVdpcmUuZ2V0UmVxdWlyZXIoKS5nZXRCdW5kbGUoKTsKKwkJCWlmIChkZXBlbmRlbnRzLmNvbnRhaW5zKHJlcXVpcmVyKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGVwZW5kZW50cy5hZGQocmVxdWlyZXIpOworCQkJU3RyaW5nIHJlRXhwb3J0ID0gcmVxdWlyZUJ1bmRsZVdpcmUuZ2V0UmVxdWlyZW1lbnQoKS5nZXREaXJlY3RpdmVzKCkKKwkJCQkJLmdldChCdW5kbGVOYW1lc3BhY2UuUkVRVUlSRU1FTlRfVklTSUJJTElUWV9ESVJFQ1RJVkUpOworCQkJaWYgKEJ1bmRsZU5hbWVzcGFjZS5WSVNJQklMSVRZX1JFRVhQT1JULmVxdWFscyhyZUV4cG9ydCkpIHsKKwkJCQlhZGREZXBlbmRlbnRzKGRlcGVuZGVudHMsIHJlcXVpcmVCdW5kbGVXaXJlLmdldFJlcXVpcmVyV2lyaW5nKCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYnVuZGxlcyB0aGF0IGN1cnJlbnRseSByZXF1aXJlIHRoZSBnaXZlbiBidW5kbGUuCisJICogPHA+CisJICogSWYge0Bjb2RlIGJ1bmRsZX0gaXMgcmVxdWlyZWQgYW5kIHRoZW4gcmUtZXhwb3J0ZWQgYnkgYW5vdGhlciBidW5kbGUgdGhlbiBhbGwgdGhlIHJlcXVpcmluZworCSAqIGJ1bmRsZXMgb2YgdGhlIHJlLWV4cG9ydGluZyBidW5kbGUgYXJlIGluY2x1ZGVkIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcyB0aGV5IHRyYW5zaXRpdmVseQorCSAqIGRlcGVuZCBvbiB7QGNvZGUgYnVuZGxlfS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSB7QGxpbmsgSXRlcmFibGV9IHNldCBvZiBidW5kbGVzIGN1cnJlbnRseSByZXF1aXJpbmcge0Bjb2RlIGJ1bmRsZX0uCisJICogICAgICAgICBBbiBlbXB0eSB7QGxpbmsgSXRlcmFibGV9IHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHtAY29kZSBidW5kbGV9IGhhcyBiZWNvbWUgc3RhbGUgb3IKKwkgKiAgICAgICAgIGhhcyBubyBkZXBlbmRlbnRzLgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYnVuZGxlfSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPEJ1bmRsZT4gZ2V0RGVwZW5kZW5jaWVzKEJ1bmRsZSBidW5kbGUpIHsKKwkJQnVuZGxlV2lyaW5nIHByb3ZpZGVyV2lyaW5nID0gYnVuZGxlLmFkYXB0KEJ1bmRsZVdpcmluZy5jbGFzcyk7CisJCWlmICghcHJvdmlkZXJXaXJpbmcuaXNJblVzZSgpKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKwkJfQorCisJCVNldDxCdW5kbGU+IHJlcXVpcmVkID0gbmV3IEhhc2hTZXQ8QnVuZGxlPigpOworCQlhZGREZXBlbmRlbnRzKHJlcXVpcmVkLCBwcm92aWRlcldpcmluZyk7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocmVxdWlyZWQpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvR2VuZXJpY01BcHBsaWNhdGlvbkVsZW1lbnRGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9HZW5lcmljTUFwcGxpY2F0aW9uRWxlbWVudEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyODU0YwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvR2VuZXJpY01BcHBsaWNhdGlvbkVsZW1lbnRGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlFdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FTW9kZWxTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKKworLyoqCisgKiBBIGZhY3Rvcnkgd2hpY2ggaXMgYWJsZSB0byBidWlsZCB0aGUgRU1GIGJhc2VkIEVPYmplY3RzIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIE1BcHBsaWNhdGlvbkVsZW1lbnR9CisgKiBjbGFzcy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgZmFjdG9yeSBjaGVja3MgdGhlIEVjbGlwc2UgRXh0ZW5zaW9uUmVnaXN0cnkgZm9yIGFsbCByZWdpc3RlcmVkIEVNRi1wYWNrYWdlcywgdmlhIHRoZQorICoge0Bjb2RlICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UifSBFeHRlbnNpb25Qb2ludCBnZW5lcmF0ZWQgYnkgRU1GLiBJdCB1c2VzIHRoZQorICogRVBhY2thZ2UgTmFtZXNwYWNlIFVSSSBtZW50aW9uZWQgaW4gdGhpcyBFeHRlbnNpb25Qb2ludCB0byBidWlsZCBhIG1hcHBpbmcgYmV0d2VlbiBub3JtYWwgamF2YQorICogY2xhc3MgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBFQ2xhc3N9LgorICogPC9wPgorICoKKyAqIDxwPgorICogPGI+SW1wb3J0YW50OjwvYj4gVGhlIG1hcHBpbmcgd2lsbCBvbmx5IGNvbnRhaW4ge0BsaW5rIEVDbGFzc31lcyB3aGljaCBleHRlbmQgdGhlCisgKiB7QGxpbmsgTUFwcGxpY2F0aW9uRWxlbWVudH0gYW5kIGFyZSBuZWl0aGVyIGFic3RyYWN0IG5vciBhbiBpbnRlcmZhY2UuCisgKiA8L3A+CisgKi8KK2ZpbmFsIGNsYXNzIEdlbmVyaWNNQXBwbGljYXRpb25FbGVtZW50RmFjdG9yeUltcGwgeworCisJLyoqCisJICogQW4gRXh0ZW5zaW9uUmVnaXN0cnlMaXN0ZW5lciB3aGljaCB3aWxsIGJ1aWxkIHRoZSByZXF1aXJlZCB7QGxpbmsgQ2xhc3N9IHRvIHtAbGluayBFQ2xhc3N9CisJICogbWFwcGluZy4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIE1BcHBsaWNhdGlvbkVsZW1lbnRDbGFzc1RvRUNsYXNzIGVtZkdlbmVyYXRlZFBhY2thZ2VzOworCisJLyoqCisJICogU29sZSBjb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBleHRlbnNpb25SZWdpc3RyeQorCSAqICAgICAgICAgICAgdGhlIEVjbGlwc2UgRXh0ZW5zaW9uUmVnaXN0cnkKKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIEVjbGlwc2UgRXh0ZW5zaW9uUmVnaXN0cnkgaXMge0Bjb2RlIG51bGx9CisJICovCisJR2VuZXJpY01BcHBsaWNhdGlvbkVsZW1lbnRGYWN0b3J5SW1wbChJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsKKwkJaWYgKGV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIEV4dGVuc2lvblJlZ2lzdHJ5IGdpdmVuISIpOyAvLyROT04tTkxTLTEkCisKKwkJZW1mR2VuZXJhdGVkUGFja2FnZXMgPSBuZXcgTUFwcGxpY2F0aW9uRWxlbWVudENsYXNzVG9FQ2xhc3MoKTsKKworCQkvLyBBIGNsZWFuLXVwIHdvdWxkIGJlIG5pY2UgYnV0IHRoZSBvbmx5IHVzaW5nIHNlcnZpY2UgaXMgcmVhbGl6ZWQgYXMgYSBzaW5nbGV0b24tc2VydmljZQorCQkvLyB3aGljaCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIHJ1bm5pbmcgYXBwbGljYXRpb24gYW5kIHNvIHRoaXMgaW5zdGFuY2Ugd2lsbCBhbHNvIGxpZmUgYXMKKwkJLy8gbG9uZyBhcyB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZy4KKwkJZXh0ZW5zaW9uUmVnaXN0cnkuYWRkTGlzdGVuZXIoZW1mR2VuZXJhdGVkUGFja2FnZXMsCisJCQkJTUFwcGxpY2F0aW9uRWxlbWVudENsYXNzVG9FQ2xhc3MuRVBfTU9ERUxfREVGSU5JVElPTl9FTlJJQ0hNRU5UKTsKKwkJZW1mR2VuZXJhdGVkUGFja2FnZXMuaW5pdGlhbGl6ZShleHRlbnNpb25SZWdpc3RyeSk7CisJfQorCisJLyoqCisJICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGFuZCBjcmVhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBFT2JqZWN0fSBpbXBsZW1lbnRhdGlvbiBmb3IgaXQuCisJICoKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIHRoZSBjbGFzcyBmb3Igd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEVPYmplY3R9IHNob3VsZCBiZSBjcmVhdGVkCisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgRU9iamVjdH0gb3Ige0Bjb2RlIG51bGx9IGlmIGl0IHdhc24ndCBhYmxlIHRvIGNyZWF0ZSBvbmUKKwkgKiAgICAgICAgIChlLmcuOiBubyB7QGxpbmsgRUNsYXNzfSBtYXBzIHRvIHRoZSBnaXZlbiB7QGxpbmsgQ2xhc3N9KQorCSAqLworCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVPYmplY3QoQ2xhc3M8PyBleHRlbmRzIE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGNsYXp6KSB7CisJCUVDbGFzcyBlQ2xhc3MgPSBlbWZHZW5lcmF0ZWRQYWNrYWdlcy5nZXRFQ2xhc3MoY2xhenopOworCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKKwkJCXJldHVybiBFY29yZVV0aWwuY3JlYXRlKGVDbGFzcyk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBbiBFY2xpcHNlIEV4dGVuc2lvblJlZ2lzdHJ5LUxpc3RlbmVyIHdoaWNoIHdpbGwgYnVpbGQgdGhlIHJlcXVpcmVkIG1hcCB0byBmaW5kIHRoZQorCSAqIHtAbGluayBFQ2xhc3N9IGZvciB0aGUgZ2l2ZW4ge0BsaW5rIENsYXNzfS4KKwkgKgorCSAqIDxwPgorCSAqIFRoaXMgTGlzdGVuZXIgbXVzdCBiZSByZWdpc3RlcmVkIG9uIEVNRidzIHtAdmFsdWUgI0VQX01PREVMX0RFRklOSVRJT05fRU5SSUNITUVOVH0gZXh0ZW5zaW9uCisJICogcG9pbnQgdG8gYnVpbGQgdGhlIGFwcHJvcHJpYXRlIG1hcHBpbmcgYmV0d2VlbiB7QGxpbmsgQ2xhc3N9IGFuZCB7QGxpbmsgRUNsYXNzfS4KKwkgKiA8L3A+CisJICoKKwkgKiA8cD4KKwkgKiA8Yj5JbmZvOjwvYj4gVGhpcyBtYXAgd2lsbCBvbmx5IGNvbnRhaW4gY29uY3JldGUge0BsaW5rIEVDbGFzc30gb2JqZWN0cyB3aGljaCBleHRlbmQgdGhlCisJICoge0BsaW5rIE1BcHBsaWNhdGlvbkVsZW1lbnR9LgorCSAqIDwvcD4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNQXBwbGljYXRpb25FbGVtZW50Q2xhc3NUb0VDbGFzcyBpbXBsZW1lbnRzIElSZWdpc3RyeUV2ZW50TGlzdGVuZXIgeworCisJCS8qKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUgd2hpY2ggaG9sZHMgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUF9NT0RFTF9ERUZJTklUSU9OX0VOUklDSE1FTlQgPSAib3JnLmVjbGlwc2UuZTQud29ya2JlbmNoLm1vZGVsLmRlZmluaXRpb24uZW5yaWNobWVudCI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogVGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbnNpZGUgdGhlIGV4dGVuc2lvbiBwb2ludCB3aGljaCBob2xkcyB0aGUgcmVxdWlyZWQKKwkJICogaW5mb3JtYXRpb24uCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0VMRU1FTlRfTkFNRSA9ICJkZWZpbml0aW9uRW5yaWNobWVudCI7IC8vJE5PTi1OTFMtMSQKKworCQkvKiogQXR0cmlidXRlIG5hbWUgd2hpY2ggaG9sZHMgdGhlIEVNRiBFUGFja2FnZSBOYW1lc3BhY2UgVVJJLiAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0FUVFJfRVBBQ0tBR0VfVVJJID0gImVQYWNrYWdlTlMiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqIEhvbGRzIHRoZSBtYXBwaW5nIGJldHdlZW4ge0BsaW5rIENsYXNzfSBhbmQge0BsaW5rIEVDbGFzc30uICovCisJCXByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4sIEVDbGFzcz4gY2xhc3NUb0VDbGFzcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4sIEVDbGFzcz4oKTsKKworCQkvKioKKwkJICogSG9sZHMgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIHBlciBleHRlbnNpb24gcG9pbnQgd2hpY2ggbmVlZHMgdG8gYmUgY2xlYW4tdXAgaW4gdGhlCisJCSAqIHtAbGluayAjcmVtb3ZlZChJRXh0ZW5zaW9uW10pfSBtZXRob2QuCisJCSAqLworCQlwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8SUV4dGVuc2lvbiwgTGlzdDxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4+PiByZWdpc3RlcmVkQ2xhc3NlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJRXh0ZW5zaW9uLCBMaXN0PENsYXNzPD8gZXh0ZW5kcyBNQXBwbGljYXRpb25FbGVtZW50Pj4+KCk7CisKKwkJLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgTUFwcGxpY2F0aW9uRWxlbWVudH0tRUNsYXNzLiAqLworCQlwcml2YXRlIGZpbmFsIEVDbGFzcyBtQXBwbGljYXRpb25FbGVtZW50RUNsYXNzID0gQXBwbGljYXRpb25QYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCQkuZ2V0QXBwbGljYXRpb25FbGVtZW50KCk7CisKKwkJLyoqCisJCSAqIE1ldGhvZCB3aGljaCB3aWxsIGluaXRpYWxpemUgdGhlIG1hcHBpbmcgd2l0aCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gRWNsaXBzZQorCQkgKiBFeHRlbnNpb25SZWdpc3RyeS4KKwkJICoKKwkJICogPHA+CisJCSAqIFRoZSBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbGwge0BsaW5rICNFUF9NT0RFTF9ERUZJTklUSU9OX0VOUklDSE1FTlR9IGV4dGVuc2lvbnMgZm9ybSB0aGUKKwkJICogZ2l2ZW4gRWNsaXBzZSBFeHRlbnNpb25SZWdpc3RyeSBhbmQgaW5pdGlhbGl6ZXMgdGhlIGJhc2ljIG1hcHBpbmcuCisJCSAqIDwvcD4KKwkJICoKKwkJICogQHBhcmFtIGV4dGVuc2lvblJlZ2lzdHJ5CisJCSAqICAgICAgICAgICAgdGhlIEVjbGlwc2UgRXh0ZW5zaW9uUmVnaXN0cnkgb24gd2hpY2ggdGhlIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZAorCQkgKi8KKwkJdm9pZCBpbml0aWFsaXplKElFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgeworCQkJaWYgKGV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpIHsgLy8ganVzdCBmb3Igc2FmZXR5J3Mgc2FrZQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIEV4dGVuc2lvblJlZ2lzdHJ5IGdpdmVuISIpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCUlFeHRlbnNpb25Qb2ludCBlcEdlbmVyYXRlZFBhY2thZ2UgPSBleHRlbnNpb25SZWdpc3RyeQorCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoRVBfTU9ERUxfREVGSU5JVElPTl9FTlJJQ0hNRU5UKTsKKwkJCWlmIChlcEdlbmVyYXRlZFBhY2thZ2UgIT0gbnVsbCkgeworCQkJCWFkZGVkKGVwR2VuZXJhdGVkUGFja2FnZS5nZXRFeHRlbnNpb25zKCkpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIExvb2t1cCB0aGUge0BsaW5rIEVDbGFzc30gZm9yIHRoZSBnaXZlbiB7QGxpbmsgQ2xhc3N9LgorCQkgKgorCQkgKiBAcGFyYW0gZWxlbWVudFR5cGUKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIENsYXNzfSB0byB3aGljaCB0aGUge0BsaW5rIEVDbGFzc30gc2hvdWxkIGJlIGZvdW5kCisJCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEVDbGFzc30gb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgd2FzIGZvdW5kCisJCSAqLworCQlwdWJsaWMgRUNsYXNzIGdldEVDbGFzcyhDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4gZWxlbWVudFR5cGUpIHsKKwkJCXJldHVybiBjbGFzc1RvRUNsYXNzLmdldChlbGVtZW50VHlwZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYWRkZWQoSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMpIHsKKwkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25zKSB7CisJCQkJTGlzdDxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4+IGVsZW1lbnRzVG9DbGVhbnVwID0gYWRkVG9NYXBwaW5nKGV4dGVuc2lvbgorCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKKworCQkJCWlmIChlbGVtZW50c1RvQ2xlYW51cCAhPSBudWxsKSB7CisJCQkJCS8vIGtlZXAgdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjbGFzcyBwZXIgZXh0ZW5zaW9uIHRvIHJlbW92ZSB0aGVtIGluIHRoZQorCQkJCQkvLyAjcmVtb3ZlKElFeHRlbnNpb25bXSkgbWV0aG9kCisJCQkJCXJlZ2lzdGVyZWRDbGFzc2VzLnB1dChleHRlbnNpb24sIGVsZW1lbnRzVG9DbGVhbnVwKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVtb3ZlZChJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgeworCQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKKwkJCQlMaXN0PENsYXNzPD8gZXh0ZW5kcyBNQXBwbGljYXRpb25FbGVtZW50Pj4gbW9kZWxDbGFzc2VzVG9SZW1vdmUgPSByZWdpc3RlcmVkQ2xhc3NlcworCQkJCQkJLnJlbW92ZShleHRlbnNpb24pOworCisJCQkJaWYgKG1vZGVsQ2xhc3Nlc1RvUmVtb3ZlICE9IG51bGwpIHsKKwkJCQkJLy8gY2xlYW4tdXAKKwkJCQkJZm9yIChDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4gbW9kZWxDbGFzcyA6IG1vZGVsQ2xhc3Nlc1RvUmVtb3ZlKSB7CisJCQkJCQljbGFzc1RvRUNsYXNzLnJlbW92ZShtb2RlbENsYXNzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBhZGRlZChJRXh0ZW5zaW9uUG9pbnRbXSBleHRlbnNpb25Qb2ludHMpIHsKKwkJCS8vIG5vdCBvZiBpbnRlcmVzdAorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlbW92ZWQoSUV4dGVuc2lvblBvaW50W10gZXh0ZW5zaW9uUG9pbnRzKSB7CisJCQkvLyBub3Qgb2YgaW50ZXJlc3QKKwkJfQorCisJCS8qKgorCQkgKiBSZWFkcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH1zIGFuZCB1cGRhdGVzIHRoZQorCQkgKiBtYXBwaW5nLgorCQkgKgorCQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnRzCisJCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIHJlYWQgdGhlIGluZm9ybWF0aW9uIGZyb20KKwkJICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGxpbmsgQ2xhc3N9ZXMgd2hpY2ggd2VyZSBwdXQgdG8gdGhlIHtAbGluayAjY2xhc3NUb0VDbGFzc30gbWFwcGluZworCQkgKiAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2VyZSBwdXQgaW50byB0aGF0IGxpc3QKKwkJICovCisJCXByaXZhdGUgTGlzdDxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4+IGFkZFRvTWFwcGluZygKKwkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWd1cmF0aW9uRWxlbWVudHMpIHsKKwkJCWlmIChjb25maWd1cmF0aW9uRWxlbWVudHMgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlMaXN0PENsYXNzPD8gZXh0ZW5kcyBNQXBwbGljYXRpb25FbGVtZW50Pj4gYWxsTWFwcGVkRW50cmllZCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1BcHBsaWNhdGlvbkVsZW1lbnQ+PigpOworCisJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50IDogY29uZmlndXJhdGlvbkVsZW1lbnRzKSB7CisJCQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhDT05GSUdfRUxFTUVOVF9OQU1FKSkgeworCQkJCQlTdHJpbmcgZW1mTnNVUkkgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShDT05GSUdfQVRUUl9FUEFDS0FHRV9VUkkpOworCisJCQkJCS8vIGZpbmQgRVBhY2thZ2UKKwkJCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlbWZOc1VSSSk7CisKKwkJCQkJLy8gYnVpbGQgQ2xhc3MgdG8gRUNsYXNzIG1hcHBpbmcgZnJvbSB0aGUgY2xhc3NlcyBpbiB0aGUgRVBhY2thZ2UKKwkJCQkJTWFwPENsYXNzPD8gZXh0ZW5kcyBNQXBwbGljYXRpb25FbGVtZW50PiwgRUNsYXNzPiBtYXBwaW5nID0gYnVpbGRNYXBwaW5nKGVQYWNrYWdlKTsKKworCQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSB7CisJCQkJCQlmb3IgKE1hcC5FbnRyeTxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4sIEVDbGFzcz4gZW50cnkgOiBtYXBwaW5nCisJCQkJCQkJCS5lbnRyeVNldCgpKSB7CisKKwkJCQkJCQkvLyBpZiB0aGUgY3VycmVudCB0aHJlYWQgYWRkZWQgdGhlIG1hcHBpbmcgd2Uga2VlcCB0aGUga2V5IHNvIGl0IGNhbiBiZQorCQkJCQkJCS8vIHJlbW92ZWQgYWZ0ZXJ3YXJkcyBpbiB0aGUgI3JlbW92ZShJRXh0ZW5zaW9uW10pIG1ldGhvZAorCQkJCQkJCWlmIChjbGFzc1RvRUNsYXNzLnB1dElmQWJzZW50KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKSA9PSBudWxsKSB7CisJCQkJCQkJCWFsbE1hcHBlZEVudHJpZWQuYWRkKGVudHJ5LmdldEtleSgpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIG51bGwgbWVhbnMgbm90aGluZyBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uRWxlbWVudGVzIHdhcyBhZGRlZCB0byB0aGUgQ2xhc3MgdG8KKwkJCS8vIEVDbGFzcyBtYXAKKwkJCXJldHVybiBhbGxNYXBwZWRFbnRyaWVkLmlzRW1wdHkoKSA/IG51bGwgOiBhbGxNYXBwZWRFbnRyaWVkOworCQl9CisKKwkJLyoqCisJCSAqIFV0aWxpdHkgbWV0aG9kIHdoaWNoIHdhbGtzIHRocm91Z2ggYWxsIHtAbGluayBFQ2xhc3N9IG9mIHRoZSBnaXZlbiB7QGxpbmsgRVBhY2thZ2V9IHRvCisJCSAqIGJ1aWxkIGEgQ2xhc3MtVG8tRUNsYXNzIG1hcC4KKwkJICogPHA+CisJCSAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB0YWtlIHtAbGluayBFQ2xhc3N9ZXMgaW50byBhY2NvdW50IHdoaWNoIGV4dGVuZCB0aGUKKwkJICoge0BsaW5rIE1BcHBsaWNhdGlvbkVsZW1lbnR9IGFuZCBhcmUgbmVpdGhlciBhIGFic3RyYWN0IGNsYXNzIG5vciBhbiBpbnRlcmZhY2UuIFdoaWNoCisJCSAqIG1lYW5zIHRoZSBtYXBwaW5nIHdpbGwgb25seSBjb250YWluIHtAbGluayBFTW9kZWxTZXJ2aWNlI2NyZWF0ZU1vZGVsRWxlbWVudChDbGFzcyl9CisJCSAqIHJlbGV2YW50IGNsYXNzZXMuCisJCSAqIDwvcD4KKwkJICoKKwkJICogQHBhcmFtIGVQYWNrYWdlCisJCSAqICAgICAgICAgICAgdGhlIEVQYWNrYWdlIHRvIHNjYW4KKwkJICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIGFsbCB7QGxpbmsgQ2xhc3N9ZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEVDbGFzc30gd2hpY2gKKwkJICogICAgICAgICBhcmUgcHJvdmlkZWQgYnkgdGhlIGdpdmVuIHtAbGluayBFUGFja2FnZX0gYW5kIGV4dGVuZCB0aGUKKwkJICogICAgICAgICB7QGxpbmsgTUFwcGxpY2F0aW9uRWxlbWVudH07IHtAY29kZSBudWxsfSBvdGhlcndpc2UKKwkJICovCisJCXByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBNQXBwbGljYXRpb25FbGVtZW50PiwgRUNsYXNzPiBidWlsZE1hcHBpbmcoCisJCQkJRVBhY2thZ2UgZVBhY2thZ2UpIHsKKwkJCWlmIChlUGFja2FnZSA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCisJCQlMaXN0PEVDbGFzc2lmaWVyPiBlQ2xhc3NpZmllcnMgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKTsKKwkJCU1hcDxDbGFzczw/IGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4sIEVDbGFzcz4gbWFwcGluZyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBNQXBwbGljYXRpb25FbGVtZW50PiwgRUNsYXNzPigpOworCisJCQlmb3IgKEVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyIDogZUNsYXNzaWZpZXJzKSB7CisJCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7CisJCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKKworCQkJCQlpZiAobUFwcGxpY2F0aW9uRWxlbWVudEVDbGFzcy5pc1N1cGVyVHlwZU9mKGVDbGFzcykgJiYgIWVDbGFzcy5pc0Fic3RyYWN0KCkKKwkJCQkJCQkmJiAhZUNsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCQkJQ2xhc3M8PyBleHRlbmRzIE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGluc3RhbmNlQ2xhc3MgPSAoQ2xhc3M8PyBleHRlbmRzIE1BcHBsaWNhdGlvbkVsZW1lbnQ+KSBlQ2xhc3MKKwkJCQkJCQkJLmdldEluc3RhbmNlQ2xhc3MoKTsKKworCQkJCQkJLy8gdGhlIE1hcC5FbnRyeSBjaGVjayBpcyBqdXN0IGZvciBzYWZldHksIGJlY2F1c2Ugb2YgdGhlIEVNRiBzcGVjaWFsIGZvcgorCQkJCQkJLy8gS2V5L1ZhbHVlIHBhaXJzIGluIEhhc2hNYXBzCisJCQkJCQkvLyAoc2VlOiBVSUVsZW1lbnRzLmVjb3JlL2FwcGxpY2F0aW9uL1N0cmluZ1RvU3RyaW5nTWFwKQorCQkJCQkJaWYgKCFpbnN0YW5jZUNsYXNzLmVxdWFscyhNYXAuRW50cnkuY2xhc3MpKSB7CisJCQkJCQkJLy8gYWRkIHRoZSBlbnRyeSwgYnV0IGlmIHRoZXJlIHdhcyBhbHJlYWR5IGEgbWFwcGluZyB3ZSBzaG91bGQgbG9nIGl0CisJCQkJCQkJRUNsYXNzIHByZXZpb3VzRW50cnkgPSBtYXBwaW5nLnB1dChpbnN0YW5jZUNsYXNzLCBlQ2xhc3MpOworCisJCQkJCQkJaWYgKHByZXZpb3VzRW50cnkgIT0gbnVsbCkgeworCQkJCQkJCQlBY3RpdmF0b3IKKwkJCQkJCQkJCQkubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsCisJCQkJCQkJCQkJCQlpbnN0YW5jZUNsYXNzCisJCQkJCQkJCQkJCQkJCSsgIiBpcyBtYXBwZWQgdG8gbXVsdGlwbGUgRUNsYXNzZXMgKCIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIiwgIiArIHByZXZpb3VzRW50cnkuZ2V0TmFtZSgpICsgIikhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBtYXBwaW5nLmlzRW1wdHkoKSA/IG51bGwgOiBtYXBwaW5nOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9JRGVsZWdhdGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9JRGVsZWdhdGVJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjNhODkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL0lEZWxlZ2F0ZUluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb25FbGVtZW50OworCisvKioKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURlbGVnYXRlSW5pdGlhbGl6ZXIgeworCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNQXBwbGljYXRpb25FbGVtZW50IG1vZGVsLCBPYmplY3QgZGVsZWdhdGUpOworCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL01vZGVsQXNzZW1ibGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL01vZGVsQXNzZW1ibGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNmZkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvTW9kZWxBc3NlbWJsZXIuamF2YQpAQCAtMCwwICsxLDMyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxNCBCZXN0U29sdXRpb24uYXQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFRvbSBTY2hpbmRsPHRvbS5zY2hpbmRsQGJlc3Rzb2x1dGlvbi5hdD4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIDxMYXJzLlZvZ2VsQGdtYWlsLmNvbT4gLSBCdWcgNDMwMDc1LCA0MzAwODAsIDQzMTQ2NCwgNDMzMzM2CisgKiAgICAgUmVuw6kgQnJhbmRzdGV0dGVyIC0gQnVnIDQxOTc0OSAtIFtXb3JrYmVuY2hdIFtlNCBXb3JrYmVuY2hdIC0gUmVtb3ZlIHRoZSBkZXByZWNhdGVkIFBhY2thZ2VBZG1pbgorICogICAgIEJyaWFuIGRlIEFsd2lzIChNVEkpIC0gQnVnIDQzMzA1MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5FY2xpcHNlQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5FeGVjdXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuZnJhZ21lbnQuTU1vZGVsRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuZnJhZ21lbnQuTU1vZGVsRnJhZ21lbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmZyYWdtZW50LmltcGwuRnJhZ21lbnRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5pbnRlcm5hbC5Nb2RlbFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgTW9kZWxBc3NlbWJsZXIgeworCUBJbmplY3QKKwlwcml2YXRlIExvZ2dlciBsb2dnZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCUBJbmplY3QKKwlwcml2YXRlIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeTsKKworCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRlbnNpb25Qb2ludElEID0gIm9yZy5lY2xpcHNlLmU0LndvcmtiZW5jaC5tb2RlbCI7IC8vJE5PTi1OTFMtMSQKKworCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMID0gImluaXRpYWwiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEVYSVNUUyA9ICJub3RleGlzdHMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBQcm9jZXNzIHRoZSBtb2RlbAorCSAqLworCXB1YmxpYyB2b2lkIHByb2Nlc3NNb2RlbChib29sZWFuIGluaXRpYWwpIHsKKwkJSUV4dGVuc2lvblBvaW50IGV4dFBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uUG9pbnRJRCk7CisJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnNTb3J0KCkuc29ydChleHRQb2ludC5nZXRFeHRlbnNpb25zKCkpOworCisJCUxpc3Q8TUFwcGxpY2F0aW9uRWxlbWVudD4gaW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8TUFwcGxpY2F0aW9uRWxlbWVudD4oKTsKKwkJTGlzdDxNQXBwbGljYXRpb25FbGVtZW50PiBhZGRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNQXBwbGljYXRpb25FbGVtZW50PigpOworCisJCS8vIHJ1biBwcm9jZXNzb3JzIHdoaWNoIGFyZSBtYXJrZWQgdG8gcnVuIGJlZm9yZSBmcmFnbWVudHMKKwkJcnVuUHJvY2Vzc29ycyhleHRlbnNpb25zLCBpbml0aWFsLCBmYWxzZSk7CisJCXByb2Nlc3NGcmFnbWVudHMoZXh0ZW5zaW9ucywgaW1wb3J0cywgYWRkZWRFbGVtZW50cywgaW5pdGlhbCk7CisJCS8vIHJ1biBwcm9jZXNzb3JzIHdoaWNoIGFyZSBtYXJrZWQgdG8gcnVuIGFmdGVyIGZyYWdtZW50cworCQlydW5Qcm9jZXNzb3JzKGV4dGVuc2lvbnMsIGluaXRpYWwsIHRydWUpOworCisJCXJlc29sdmVJbXBvcnRzKGltcG9ydHMsIGFkZGVkRWxlbWVudHMpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBleHRlbnNpb25zCisJICogQHBhcmFtIGltcG9ydHMKKwkgKiBAcGFyYW0gYWRkZWRFbGVtZW50cworCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzRnJhZ21lbnRzKElFeHRlbnNpb25bXSBleHRlbnNpb25zLCBMaXN0PE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGltcG9ydHMsCisJCQlMaXN0PE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGFkZGVkRWxlbWVudHMsIGJvb2xlYW4gaW5pdGlhbCkgeworCisJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25zKSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZXMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNlcykgeworCQkJCWlmICgiZnJhZ21lbnQiLmVxdWFscyhjZS5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGluaXRpYWwgfHwgIUlOSVRJQUwuZXF1YWxzKGNlLmdldEF0dHJpYnV0ZSgiYXBwbHkiKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcHJvY2Vzc0ZyYWdtZW50KGNlLCBpbXBvcnRzLCBhZGRlZEVsZW1lbnRzLCBpbml0aWFsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzRnJhZ21lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBMaXN0PE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGltcG9ydHMsCisJCQlMaXN0PE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGFkZGVkRWxlbWVudHMsIGJvb2xlYW4gaW5pdGlhbCkgeworCQlFNFhNSVJlc291cmNlIGFwcGxpY2F0aW9uUmVzb3VyY2UgPSAoRTRYTUlSZXNvdXJjZSkgKChFT2JqZWN0KSBhcHBsaWNhdGlvbikuZVJlc291cmNlKCk7CisJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gYXBwbGljYXRpb25SZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOworCQlJQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBjZS5nZXRDb250cmlidXRvcigpOworCQlTdHJpbmcgYXR0clVSSSA9IGNlLmdldEF0dHJpYnV0ZSgidXJpIik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIGJ1bmRsZU5hbWUgPSBjb250cmlidXRvci5nZXROYW1lKCk7CisJCWlmIChhdHRyVVJJID09IG51bGwpIHsKKwkJCWxvZ2dlci53YXJuKCJVbmFibGUgdG8gZmluZCBsb2NhdGlvbiBmb3IgdGhlIG1vZGVsIGV4dGVuc2lvbiBcInswfVwiIiwgYnVuZGxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCVVSSSB1cmk7CisJCXRyeSB7CisJCQkvLyBjaGVjayBpZiB0aGUgYXR0clVSSSBpcyBhbHJlYWR5IGEgcGxhdGZvcm0gVVJJCisJCQlpZiAoVVJJSGVscGVyLmlzUGxhdGZvcm1VUkkoYXR0clVSSSkpIHsKKwkJCQl1cmkgPSBVUkkuY3JlYXRlVVJJKGF0dHJVUkkpOworCQkJfSBlbHNlIHsKKwkJCQlTdHJpbmcgcGF0aCA9IGJ1bmRsZU5hbWUgKyAnLycgKyBhdHRyVVJJOworCQkJCXVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVBsdWdpblVSSShwYXRoLCBmYWxzZSk7CisJCQl9CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLndhcm4oZSwgIkludmFsaWQgbG9jYXRpb24gXCIiICsgYXR0clVSSSArICJcIiBvZiBtb2RlbCBleHRlbnNpb24gXCIiICsgYnVuZGxlTmFtZSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJcmV0dXJuOworCQl9CisKKwkJU3RyaW5nIGNvbnRyaWJ1dG9yVVJJID0gVVJJSGVscGVyLmNvbnN0cnVjdFBsYXRmb3JtVVJJKGNvbnRyaWJ1dG9yKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2U7CisJCXRyeSB7CisJCQlyZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLndhcm4oZSwgIlVuYWJsZSB0byByZWFkIG1vZGVsIGV4dGVuc2lvbiBmcm9tIFwiIiArIHVyaS50b1N0cmluZygpICsiXCIgb2YgXCIiICsgYnVuZGxlTmFtZSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJcmV0dXJuOworCQl9CisKKwkJRUxpc3Q8Pz4gY29udGVudHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOworCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlPYmplY3QgZXh0ZW5zaW9uUm9vdCA9IGNvbnRlbnRzLmdldCgwKTsKKworCQlpZiAoIShleHRlbnNpb25Sb290IGluc3RhbmNlb2YgTU1vZGVsRnJhZ21lbnRzKSkgeworCQkJbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgZXh0ZW5zaW9uIFwiezB9XCIiLCBidW5kbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisJCWJvb2xlYW4gY2hlY2tFeGlzdCA9ICFpbml0aWFsICYmIE5PVEVYSVNUUy5lcXVhbHMoY2UuZ2V0QXR0cmlidXRlKCJhcHBseSIpKTsgLy8kTk9OLU5MUy0xJAorCisJCU1Nb2RlbEZyYWdtZW50cyBmcmFnbWVudHNDb250YWluZXIgPSAoTU1vZGVsRnJhZ21lbnRzKSBleHRlbnNpb25Sb290OworCQlMaXN0PE1Nb2RlbEZyYWdtZW50PiBmcmFnbWVudHMgPSBmcmFnbWVudHNDb250YWluZXIuZ2V0RnJhZ21lbnRzKCk7CisJCWJvb2xlYW4gZXZhbEltcG9ydHMgPSBmYWxzZTsKKwkJZm9yIChNTW9kZWxGcmFnbWVudCBmcmFnbWVudCA6IGZyYWdtZW50cykgeworCQkJTGlzdDxNQXBwbGljYXRpb25FbGVtZW50PiBlbGVtZW50cyA9IGZyYWdtZW50LmdldEVsZW1lbnRzKCk7CisJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IDApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9yIChNQXBwbGljYXRpb25FbGVtZW50IGVsIDogZWxlbWVudHMpIHsKKwkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgZWw7CisKKwkJCQlFNFhNSVJlc291cmNlIHIgPSAoRTRYTUlSZXNvdXJjZSkgby5lUmVzb3VyY2UoKTsKKworCQkJCWlmIChjaGVja0V4aXN0ICYmIGFwcGxpY2F0aW9uUmVzb3VyY2UuZ2V0SURUb0VPYmplY3RNYXAoKS5jb250YWluc0tleShyLmdldElEKG8pKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlhcHBsaWNhdGlvblJlc291cmNlLnNldElEKG8sIHIuZ2V0SUQobykpOworCisJCQkJaWYgKGNvbnRyaWJ1dG9yVVJJICE9IG51bGwpCisJCQkJCWVsLnNldENvbnRyaWJ1dG9yVVJJKGNvbnRyaWJ1dG9yVVJJKTsKKworCQkJCS8vIFJlbWVtYmVyIElEcyBvZiBzdWJpdGVtcworCQkJCVRyZWVJdGVyYXRvcjxFT2JqZWN0PiB0cmVlSXQgPSBFY29yZVV0aWwuZ2V0QWxsQ29udGVudHMobywgdHJ1ZSk7CisJCQkJd2hpbGUgKHRyZWVJdC5oYXNOZXh0KCkpIHsKKwkJCQkJRU9iamVjdCBlT2JqID0gdHJlZUl0Lm5leHQoKTsKKwkJCQkJciA9IChFNFhNSVJlc291cmNlKSBlT2JqLmVSZXNvdXJjZSgpOworCQkJCQlpZiAoY29udHJpYnV0b3JVUkkgIT0gbnVsbCAmJiAoZU9iaiBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbkVsZW1lbnQpKQorCQkJCQkJKChNQXBwbGljYXRpb25FbGVtZW50KSBlT2JqKS5zZXRDb250cmlidXRvclVSSShjb250cmlidXRvclVSSSk7CisJCQkJCWFwcGxpY2F0aW9uUmVzb3VyY2Uuc2V0SUQoZU9iaiwgci5nZXRJbnRlcm5hbElkKGVPYmopKTsKKwkJCQl9CisJCQl9CisKKwkJCUxpc3Q8TUFwcGxpY2F0aW9uRWxlbWVudD4gbWVyZ2VkID0gZnJhZ21lbnQubWVyZ2UoYXBwbGljYXRpb24pOworCisJCQlpZiAobWVyZ2VkLnNpemUoKSA+IDApIHsKKwkJCQlldmFsSW1wb3J0cyA9IHRydWU7CisJCQkJYWRkZWRFbGVtZW50cy5hZGRBbGwobWVyZ2VkKTsKKwkJCX0KKwkJfQorCisJCWlmIChldmFsSW1wb3J0cykgeworCQkJTGlzdDxNQXBwbGljYXRpb25FbGVtZW50PiBsb2NhbEltcG9ydHMgPSBmcmFnbWVudHNDb250YWluZXIuZ2V0SW1wb3J0cygpOworCQkJaWYgKGxvY2FsSW1wb3J0cyAhPSBudWxsKSB7CisJCQkJaW1wb3J0cy5hZGRBbGwobG9jYWxJbXBvcnRzKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBleHRlbnNpb25zCisJICogQHBhcmFtIGFmdGVyRnJhZ21lbnRzCisJICovCisJcHJpdmF0ZSB2b2lkIHJ1blByb2Nlc3NvcnMoSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMsIGJvb2xlYW4gaW5pdGlhbCwgYm9vbGVhbiBhZnRlckZyYWdtZW50cykgeworCQlmb3IgKElFeHRlbnNpb24gZXh0ZW5zaW9uIDogZXh0ZW5zaW9ucykgeworCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2VzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZXMpIHsKKwkJCQlib29sZWFuIHBhcnNlQm9vbGVhbiA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGNlLmdldEF0dHJpYnV0ZSgiYmVmb3JlZnJhZ21lbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoInByb2Nlc3NvciIuZXF1YWxzKGNlLmdldE5hbWUoKSkgJiYgYWZ0ZXJGcmFnbWVudHMgIT0gcGFyc2VCb29sZWFuKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGluaXRpYWwgfHwgIUlOSVRJQUwuZXF1YWxzKGNlLmdldEF0dHJpYnV0ZSgiYXBwbHkiKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcnVuUHJvY2Vzc29yKGNlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBydW5Qcm9jZXNzb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7CisJCUlFY2xpcHNlQ29udGV4dCBsb2NhbENvbnRleHQgPSBFY2xpcHNlQ29udGV4dEZhY3RvcnkuY3JlYXRlKCk7CisJCUlDb250cmlidXRpb25GYWN0b3J5IGZhY3RvcnkgPSBjb250ZXh0LmdldChJQ29udHJpYnV0aW9uRmFjdG9yeS5jbGFzcyk7CisKKwkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2VFbCA6IGNlLmdldENoaWxkcmVuKCJlbGVtZW50IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIGlkID0gY2VFbC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKGlkID09IG51bGwpIHsKKwkJCQlsb2dnZXIud2FybigiTm8gZWxlbWVudCBpZCBnaXZlbiIpOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVN0cmluZyBrZXkgPSBjZUVsLmdldEF0dHJpYnV0ZSgiY29udGV4dEtleSIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoa2V5ID09IG51bGwpIHsKKwkJCQlrZXkgPSBpZDsKKwkJCX0KKworCQkJTUFwcGxpY2F0aW9uRWxlbWVudCBlbCA9IE1vZGVsVXRpbHMuZmluZEVsZW1lbnRCeUlkKGFwcGxpY2F0aW9uLCBpZCk7CisJCQlpZiAoZWwgPT0gbnVsbCkgeworCQkJCWxvZ2dlci53YXJuKCJDb3VsZCBub3QgZmluZCBlbGVtZW50IHdpdGggaWQgJyIgKyBpZCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJbG9jYWxDb250ZXh0LnNldChrZXksIGVsKTsKKwkJfQorCisJCXRyeSB7CisJCQlPYmplY3QgbyA9IGZhY3RvcnkKKwkJCQkJLmNyZWF0ZSgiYnVuZGxlY2xhc3M6Ly8iICsgY2UuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyAiLyIgKyBjZS5nZXRBdHRyaWJ1dGUoImNsYXNzIiksIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAorCQkJCQkJCWNvbnRleHQsIGxvY2FsQ29udGV4dCk7CisJCQlpZiAobyA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgcHJvY2Vzc29yICIgKyBjZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgKyAiIGZyb20gIiArIGNlLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCX0gZWxzZSB7CisJCQkJQ29udGV4dEluamVjdGlvbkZhY3RvcnkuaW52b2tlKG8sIEV4ZWN1dGUuY2xhc3MsIGNvbnRleHQsIGxvY2FsQ29udGV4dCk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIud2FybihlLCAiQ291bGQgbm90IHJ1biBwcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlc29sdmVJbXBvcnRzKExpc3Q8TUFwcGxpY2F0aW9uRWxlbWVudD4gaW1wb3J0cywKKwkJCUxpc3Q8TUFwcGxpY2F0aW9uRWxlbWVudD4gYWRkZWRFbGVtZW50cykgeworCQlpZiAoaW1wb3J0cy5pc0VtcHR5KCkpCisJCQlyZXR1cm47CisJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYWxsIGNvbXBvbmVudHMgbG9hZGVkLCByZXNvbHZlIGltcG9ydHMKKwkJTWFwPE1BcHBsaWNhdGlvbkVsZW1lbnQsIE1BcHBsaWNhdGlvbkVsZW1lbnQ+IGltcG9ydE1hcHMgPSBuZXcgSGFzaE1hcDxNQXBwbGljYXRpb25FbGVtZW50LCBNQXBwbGljYXRpb25FbGVtZW50PigpOworCQlmb3IgKE1BcHBsaWNhdGlvbkVsZW1lbnQgaW1wb3J0ZWRFbGVtZW50IDogaW1wb3J0cykgeworCQkJTUFwcGxpY2F0aW9uRWxlbWVudCByZWFsRWxlbWVudCA9IE1vZGVsVXRpbHMuZmluZEVsZW1lbnRCeUlkKGFwcGxpY2F0aW9uLAorCQkJCQlpbXBvcnRlZEVsZW1lbnQuZ2V0RWxlbWVudElkKCkpOworCQkJaWYgKHJlYWxFbGVtZW50ID09IG51bGwpIHsKKwkJCQlsb2dnZXIud2FybigiQ291bGQgbm90IHJlc29sdmUgYW4gaW1wb3J0IGVsZW1lbnQgZm9yICciICsgcmVhbEVsZW1lbnQgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKworCQkJaW1wb3J0TWFwcy5wdXQoaW1wb3J0ZWRFbGVtZW50LCByZWFsRWxlbWVudCk7CisJCX0KKworCQlUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXQgPSBFY29yZVV0aWwuZ2V0QWxsQ29udGVudHMoYWRkZWRFbGVtZW50cyk7CisJCUxpc3Q8UnVubmFibGU+IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKKworCQkvLyBUT0RPIFByb2JhYmx5IHVzZSBFY29yZVV0aWwuVXNhZ2VDcm9zc1JlZmVyZW5jZXIKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJRU9iamVjdCBvID0gaXQubmV4dCgpOworCisJCQlFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3I8RU9iamVjdD4gZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjxFT2JqZWN0PikgbworCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUVPYmplY3QgaW1wb3J0T2JqZWN0ID0gZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKKwkJCQlpZiAoaW1wb3J0T2JqZWN0LmVDb250YWlubWVudEZlYXR1cmUoKSA9PSBGcmFnbWVudFBhY2thZ2VJbXBsLkxpdGVyYWxzLk1PREVMX0ZSQUdNRU5UU19fSU1QT1JUUykgeworCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7CisKKwkJCQkJTUFwcGxpY2F0aW9uRWxlbWVudCBlbCA9IGltcG9ydE1hcHMuZ2V0KGltcG9ydE9iamVjdCk7CisJCQkJCWlmIChlbCA9PSBudWxsKSB7CisJCQkJCQlsb2dnZXIud2FybigiQ291bGQgbm90IHJlc29sdmUgaW1wb3J0IGZvciAiICsgZWwpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKworCQkJCQlmaW5hbCBFT2JqZWN0IGludGVyYWxUYXJnZXQgPSBvOworCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgaW50ZXJuYWxGZWF0dXJlID0gZmVhdHVyZTsKKwkJCQkJZmluYWwgTUFwcGxpY2F0aW9uRWxlbWVudCBpbnRlcm5hbEVsbWVudCA9IGVsOworCQkJCQlmaW5hbCBFT2JqZWN0IGludGVybmFsSW1wb3J0T2JqZWN0ID0gaW1wb3J0T2JqZWN0OworCisJCQkJCWNvbW1hbmRzLmFkZChuZXcgUnVubmFibGUoKSB7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCWlmIChpbnRlcm5hbEZlYXR1cmUuaXNNYW55KCkpIHsKKwkJCQkJCQkJbG9nZ2VyLmVycm9yKCJSZXBsYWNpbmciKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQkJCQkJTGlzdDxPYmplY3Q+IGwgPSAoTGlzdDxPYmplY3Q+KSBpbnRlcmFsVGFyZ2V0LmVHZXQoaW50ZXJuYWxGZWF0dXJlKTsKKwkJCQkJCQkJaW50IGluZGV4ID0gbC5pbmRleE9mKGludGVybmFsSW1wb3J0T2JqZWN0KTsKKwkJCQkJCQkJaWYgKGluZGV4ID49IDApIHsKKwkJCQkJCQkJCWwuc2V0KGluZGV4LCBpbnRlcm5hbEVsbWVudCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpbnRlcmFsVGFyZ2V0LmVTZXQoaW50ZXJuYWxGZWF0dXJlLCBpbnRlcm5hbEVsbWVudCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmb3IgKFJ1bm5hYmxlIGNtZCA6IGNvbW1hbmRzKSB7CisJCQljbWQucnVuKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL01vZGVsUmVjb25jaWxpbmdTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL01vZGVsUmVjb25jaWxpbmdTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzOTEwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklNb2RlbFJlY29uY2lsaW5nU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxSZWNvbmNpbGVyOworCitwdWJsaWMgY2xhc3MgTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UgaW1wbGVtZW50cyBJTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UgeworCisJQEluamVjdAorCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyBNb2RlbFJlY29uY2lsZXIgY3JlYXRlTW9kZWxSZWNvbmNpbGVyKCkgeworCQlyZXR1cm4gbmV3IFhNTE1vZGVsUmVjb25jaWxlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGFwcGx5RGVsdGFzKENvbGxlY3Rpb248TW9kZWxEZWx0YT4gZGVsdGFzKSB7CisJCXJldHVybiBhcHBseURlbHRhcyhkZWx0YXMsIG51bGwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGFwcGx5RGVsdGFzKENvbGxlY3Rpb248TW9kZWxEZWx0YT4gZGVsdGFzLCBTdHJpbmdbXSBmaWx0ZXJzKSB7CisJCWlmIChmaWx0ZXJzID09IG51bGwpIHsKKwkJCWZpbHRlcnMgPSBuZXcgU3RyaW5nWzBdOworCQl9CisKKwkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoQWN0aXZhdG9yLlBJX1dPUktCRU5DSCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCUxpbmtlZExpc3Q8TW9kZWxEZWx0YT4gZGVsYXllZERlbHRhcyA9IG5ldyBMaW5rZWRMaXN0PE1vZGVsRGVsdGE+KCk7CisKKwkJZGVsdGFJdGVyYXRpb25Mb29wOiBmb3IgKGZpbmFsIE1vZGVsRGVsdGEgZGVsdGEgOiBkZWx0YXMpIHsKKwkJCWZvciAoU3RyaW5nIGZpbHRlciA6IGZpbHRlcnMpIHsKKwkJCQlpZiAoZGVsdGEuZ2V0QXR0cmlidXRlTmFtZSgpLmVxdWFscyhmaWx0ZXIpKSB7CisJCQkJCWNvbnRpbnVlIGRlbHRhSXRlcmF0aW9uTG9vcDsKKwkJCQl9CisJCQl9CisKKwkJCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKKwkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQlzdGF0dXNbMF0gPSBkZWx0YS5hcHBseSgpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQkJCXN0YXR1c1swXSA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLlBJX1dPUktCRU5DSCwKKwkJCQkJCQkiRmFpbGVkIHRvIGFwcGx5IGRlbHRhIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0pOworCisJCQlpZiAoc3RhdHVzWzBdLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5DQU5DRUwpIHsKKwkJCQlkZWxheWVkRGVsdGFzLmFkZChkZWx0YSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzWzBdKTsKKworCQkJc3dpdGNoIChzdGF0dXNbMF0uZ2V0Q29kZSgpKSB7CisJCQljYXNlIElTdGF0dXMuSU5GTzoKKwkJCQlsb2dnZXIuaW5mbyhzdGF0dXNbMF0uZ2V0TWVzc2FnZSgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HOgorCQkJCWxvZ2dlci53YXJuKHN0YXR1c1swXS5nZXRNZXNzYWdlKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJU3RhdHVzLkVSUk9SOgorCQkJCWxvZ2dlci5lcnJvcihzdGF0dXNbMF0uZ2V0TWVzc2FnZSgpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZvciAoSXRlcmF0b3I8TW9kZWxEZWx0YT4gaXQgPSBkZWxheWVkRGVsdGFzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCWZpbmFsIE1vZGVsRGVsdGEgZGVsdGEgPSBpdC5uZXh0KCk7CisJCQlmaW5hbCBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07CisJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJc3RhdHVzWzBdID0gZGVsdGEuYXBwbHkoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQlzdGF0dXNbMF0gPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5QSV9XT1JLQkVOQ0gsCisJCQkJCQkJIkZhaWxlZCB0byBhcHBseSBkZWx0YSIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9KTsKKworCQkJaWYgKHN0YXR1c1swXS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuQ0FOQ0VMKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXNbMF0pOworCisJCQlzd2l0Y2ggKHN0YXR1c1swXS5nZXRDb2RlKCkpIHsKKwkJCWNhc2UgSVN0YXR1cy5JTkZPOgorCQkJCWxvZ2dlci5pbmZvKHN0YXR1c1swXS5nZXRNZXNzYWdlKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJU3RhdHVzLldBUk5JTkc6CisJCQkJbG9nZ2VyLndhcm4oc3RhdHVzWzBdLmdldE1lc3NhZ2UoKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElTdGF0dXMuRVJST1I6CisJCQkJbG9nZ2VyLmVycm9yKHN0YXR1c1swXS5nZXRNZXNzYWdlKCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG11bHRpU3RhdHVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Nb2RlbFNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL01vZGVsU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY4Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Nb2RlbFNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxMDEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8TGFycy5Wb2dlbEBnbWFpbC5jb20+IC0gQnVnIDQzNDYxMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUJpbmRpbmdDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmNvbW1hbmRzLk1CaW5kaW5nVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUtleUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5NUGFydERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVNuaXBwZXRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5TaWRlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTUFkdmFuY2VkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NQXJlYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1CYXNpY0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTYXNoQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbUJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NVHJpbW1lZFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3dFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLmltcGwuQmFzaWNGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuaW50ZXJuYWwuTW9kZWxVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVByZXNlbnRhdGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guU2VsZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50cy5FdmVudFRhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRVBsYWNlaG9sZGVyUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVsZW1lbnRNYXRjaGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbFNlcnZpY2VJbXBsIGltcGxlbWVudHMgRU1vZGVsU2VydmljZSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEhPU1RFRF9FTEVNRU5UID0gIkhvc3RlZEVsZW1lbnQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBhcHBDb250ZXh0OworCisJLyoqIEZhY3Rvcnkgd2hpY2ggaXMgYWJsZSB0byBjcmVhdGUge0BsaW5rIE1BcHBsaWNhdGlvbkVsZW1lbnR9cyBpbiBhIGdlbmVyaWMgd2F5LiAqLworCXByaXZhdGUgR2VuZXJpY01BcHBsaWNhdGlvbkVsZW1lbnRGYWN0b3J5SW1wbCBtQXBwbGljYXRpb25FbGVtZW50RmFjdG9yeTsKKworCS8vIENsZWFucyB1cCBhZnRlciBhIGhvc3RlZCBlbGVtZW50IGlzIGRpc3Bvc2VkCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgaG9zdGVkRWxlbWVudEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJZmluYWwgTVVJRWxlbWVudCBjaGFuZ2VkRWxlbWVudCA9IChNVUlFbGVtZW50KSBldmVudC5nZXRQcm9wZXJ0eShFdmVudFRhZ3MuRUxFTUVOVCk7CisJCQlpZiAoIWNoYW5nZWRFbGVtZW50LmdldFRhZ3MoKS5jb250YWlucyhIT1NURURfRUxFTUVOVCkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChjaGFuZ2VkRWxlbWVudC5nZXRXaWRnZXQoKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgY2hhbmdlZEVsZW1lbnQ7CisJCQlpZiAoIShlT2JqLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE1XaW5kb3cpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlNV2luZG93IGhvc3RpbmdXaW5kb3cgPSAoTVdpbmRvdykgZU9iai5lQ29udGFpbmVyKCk7CisJCQlob3N0aW5nV2luZG93LmdldFNoYXJlZEVsZW1lbnRzKCkucmVtb3ZlKGNoYW5nZWRFbGVtZW50KTsKKwkJCWNoYW5nZWRFbGVtZW50LmdldFRhZ3MoKS5yZW1vdmUoSE9TVEVEX0VMRU1FTlQpOworCQl9CisJfTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBzaW5nbGV0b24gc2VydmljZS4gT25lIGluc3RhbmNlIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVubmluZyBhcHBsaWNhdGlvbgorCSAqCisJICogQHBhcmFtIGFwcENvbnRleHQKKwkgKiAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbkNvbnRleHQgdG8gZ2V0IHRoZSBldmVudEJyb2tlciBmcm9tCisJICoKKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGFwcENvbnRleHQgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgTW9kZWxTZXJ2aWNlSW1wbChJRWNsaXBzZUNvbnRleHQgYXBwQ29udGV4dCkgeworCQlpZiAoYXBwQ29udGV4dCA9PSBudWxsKQorCQkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJObyBhcHBsaWNhdGlvbiBjb250ZXh0IGdpdmVuISIpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQl0aGlzLmFwcENvbnRleHQgPSBhcHBDb250ZXh0OworCQlJRXZlbnRCcm9rZXIgZXZlbnRCcm9rZXIgPSBhcHBDb250ZXh0LmdldChJRXZlbnRCcm9rZXIuY2xhc3MpOworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuVUlFbGVtZW50LlRPUElDX1dJREdFVCwgaG9zdGVkRWxlbWVudEhhbmRsZXIpOworCisJCW1BcHBsaWNhdGlvbkVsZW1lbnRGYWN0b3J5ID0gbmV3IEdlbmVyaWNNQXBwbGljYXRpb25FbGVtZW50RmFjdG9yeUltcGwoCisJCQkJYXBwQ29udGV4dC5nZXQoSUV4dGVuc2lvblJlZ2lzdHJ5LmNsYXNzKSk7CisJfQorCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIGZpbmFsIDxUIGV4dGVuZHMgTUFwcGxpY2F0aW9uRWxlbWVudD4gVCBjcmVhdGVNb2RlbEVsZW1lbnQoQ2xhc3M8VD4gZWxlbWVudFR5cGUpIHsKKwkJaWYgKGVsZW1lbnRUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQXJndW1lbnQgY2Fubm90IGJlIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVQgYmFjayA9IChUKSBtQXBwbGljYXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGVFT2JqZWN0KGVsZW1lbnRUeXBlKTsKKwkJaWYgKGJhY2sgIT0gbnVsbCkgeworCQkJcmV0dXJuIGJhY2s7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJVbnN1cHBvcnRlZCBtb2RlbCBvYmplY3QgdHlwZTogIiArIGVsZW1lbnRUeXBlLmdldENhbm9uaWNhbE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIDxUPiB2b2lkIGZpbmRFbGVtZW50c1JlY3Vyc2l2ZShNQXBwbGljYXRpb25FbGVtZW50IHNlYXJjaFJvb3QsIENsYXNzPFQ+IGNsYXp6LAorCQkJU2VsZWN0b3IgbWF0Y2hlciwgTGlzdDxUPiBlbGVtZW50cywgaW50IHNlYXJjaEZsYWdzKSB7CisJCUFzc2VydC5pc0xlZ2FsKHNlYXJjaFJvb3QgIT0gbnVsbCk7CisJCWlmIChzZWFyY2hGbGFncyA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBhcmUgKndlKiBhIG1hdGNoID8KKwkJYm9vbGVhbiBjbGFzc01hdGNoID0gY2xhenogPT0gbnVsbCA/IHRydWUgOiBjbGF6ei5pc0luc3RhbmNlKHNlYXJjaFJvb3QpOworCQlpZiAoY2xhc3NNYXRjaCAmJiBtYXRjaGVyLnNlbGVjdChzZWFyY2hSb290KSkgeworCQkJaWYgKCFlbGVtZW50cy5jb250YWlucyhzZWFyY2hSb290KSkgeworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCVQgZWxlbWVudCA9IChUKSBzZWFyY2hSb290OworCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKKwkJCX0KKwkJfQorCQlpZiAoc2VhcmNoUm9vdCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbiAmJiAoc2VhcmNoRmxhZ3MgPT0gQU5ZV0hFUkUpKSB7CisJCQlNQXBwbGljYXRpb24gYXBwID0gKE1BcHBsaWNhdGlvbikgc2VhcmNoUm9vdDsKKworCQkJTGlzdDxNQXBwbGljYXRpb25FbGVtZW50PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8TUFwcGxpY2F0aW9uRWxlbWVudD4oKTsKKwkJCWlmIChjbGF6eiAhPSBudWxsKSB7CisJCQkJaWYgKGNsYXp6LmVxdWFscyhNSGFuZGxlci5jbGFzcykpIHsKKwkJCQkJY2hpbGRyZW4uYWRkQWxsKGFwcC5nZXRIYW5kbGVycygpKTsKKwkJCQl9IGVsc2UgaWYgKGNsYXp6LmVxdWFscyhNQ29tbWFuZC5jbGFzcykpIHsKKwkJCQkJY2hpbGRyZW4uYWRkQWxsKGFwcC5nZXRDb21tYW5kcygpKTsKKwkJCQl9IGVsc2UgaWYgKGNsYXp6LmVxdWFscyhNQmluZGluZ0NvbnRleHQuY2xhc3MpKSB7CisJCQkJCWNoaWxkcmVuLmFkZEFsbChhcHAuZ2V0QmluZGluZ0NvbnRleHRzKCkpOworCQkJCX0gZWxzZSBpZiAoY2xhenouZXF1YWxzKE1CaW5kaW5nVGFibGUuY2xhc3MpIHx8IGNsYXp6LmVxdWFscyhNS2V5QmluZGluZy5jbGFzcykpIHsKKwkJCQkJY2hpbGRyZW4uYWRkQWxsKGFwcC5nZXRCaW5kaW5nVGFibGVzKCkpOworCQkJCX0KKwkJCQkvLyB9IGVsc2UgeyBvbmx5IGxvb2sgZm9yIHRoZXNlIGlmIHNwZWNpZmljYWxseSBhc2tlZC4KKwkJCQkvLyBjaGlsZHJlbi5hZGRBbGwoYXBwLmdldEhhbmRsZXJzKCkpOworCQkJCS8vIGNoaWxkcmVuLmFkZEFsbChhcHAuZ2V0Q29tbWFuZHMoKSk7CisJCQkJLy8gY2hpbGRyZW4uYWRkQWxsKGFwcC5nZXRCaW5kaW5nQ29udGV4dHMoKSk7CisJCQkJLy8gY2hpbGRyZW4uYWRkQWxsKGFwcC5nZXRCaW5kaW5nVGFibGVzKCkpOworCQkJfQorCisJCQlmb3IgKE1BcHBsaWNhdGlvbkVsZW1lbnQgY2hpbGQgOiBjaGlsZHJlbikgeworCQkJCWZpbmRFbGVtZW50c1JlY3Vyc2l2ZShjaGlsZCwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQl9CisJCX0KKworCQlpZiAoc2VhcmNoUm9vdCBpbnN0YW5jZW9mIE1CaW5kaW5nQ29udGV4dCAmJiAoc2VhcmNoRmxhZ3MgPT0gQU5ZV0hFUkUpKSB7CisJCQlNQmluZGluZ0NvbnRleHQgYmluZGluZ0NvbnRleHQgPSAoTUJpbmRpbmdDb250ZXh0KSBzZWFyY2hSb290OworCQkJZm9yIChNQmluZGluZ0NvbnRleHQgY2hpbGQgOiBiaW5kaW5nQ29udGV4dC5nZXRDaGlsZHJlbigpKSB7CisJCQkJZmluZEVsZW1lbnRzUmVjdXJzaXZlKGNoaWxkLCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCX0KKwkJfQorCisJCWlmIChzZWFyY2hSb290IGluc3RhbmNlb2YgTUJpbmRpbmdUYWJsZSkgeworCQkJTUJpbmRpbmdUYWJsZSBiaW5kaW5nVGFibGUgPSAoTUJpbmRpbmdUYWJsZSkgc2VhcmNoUm9vdDsKKwkJCWZvciAoTUtleUJpbmRpbmcgY2hpbGQgOiBiaW5kaW5nVGFibGUuZ2V0QmluZGluZ3MoKSkgeworCQkJCWZpbmRFbGVtZW50c1JlY3Vyc2l2ZShjaGlsZCwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQl9CisJCX0KKworCQkvLyBDaGVjayByZWd1bGFyIGNvbnRhaW5lcnMKKwkJaWYgKHNlYXJjaFJvb3QgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJaWYgKHNlYXJjaFJvb3QgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykgeworCQkJCWlmICgoc2VhcmNoRmxhZ3MgJiBJTl9BTllfUEVSU1BFQ1RJVkUpICE9IDApIHsKKwkJCQkJLy8gU2VhcmNoICphbGwqIHRoZSBwZXJzcGVjdGl2ZXMKKwkJCQkJTUVsZW1lbnRDb250YWluZXI8PyBleHRlbmRzIE1VSUVsZW1lbnQ+IGNvbnRhaW5lciA9IChNUGVyc3BlY3RpdmVTdGFjaykgc2VhcmNoUm9vdDsKKwkJCQkJTGlzdDw/IGV4dGVuZHMgTVVJRWxlbWVudD4gY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKKwkJCQkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogY2hpbGRyZW4pIHsKKwkJCQkJCWZpbmRFbGVtZW50c1JlY3Vyc2l2ZShjaGlsZCwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKChzZWFyY2hGbGFncyAmIElOX0FDVElWRV9QRVJTUEVDVElWRSkgIT0gMCkgeworCQkJCQkvLyBPbmx5IHNlYXJjaCB0aGUgY3VycmVudGx5IGFjdGl2ZSBwZXJzcGVjdGl2ZSwgaWYgYW55CisJCQkJCU1QZXJzcGVjdGl2ZSBhY3RpdmUgPSAoKE1QZXJzcGVjdGl2ZVN0YWNrKSBzZWFyY2hSb290KS5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQkJaWYgKGFjdGl2ZSAhPSBudWxsKSB7CisJCQkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUoYWN0aXZlLCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoKHNlYXJjaEZsYWdzICYgSU5fU0hBUkVEX0FSRUEpICE9IDAgJiYgc2VhcmNoUm9vdCBpbnN0YW5jZW9mIE1VSUVsZW1lbnQpIHsKKwkJCQkJLy8gT25seSByZWN1cnNlIHRocm91Z2ggdGhlIHNoYXJlZCBhcmVhcworCQkJCQlMaXN0PE1BcmVhPiBhcmVhcyA9IGZpbmRFbGVtZW50cygoTVVJRWxlbWVudCkgc2VhcmNoUm9vdCwgbnVsbCwgTUFyZWEuY2xhc3MsCisJCQkJCQkJbnVsbCk7CisJCQkJCWZvciAoTUFyZWEgYXJlYSA6IGFyZWFzKSB7CisJCQkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUoYXJlYSwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNvbnRhaW5lciA9IChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50Pikgc2VhcmNoUm9vdDsKKwkJCQlMaXN0PE1VSUVsZW1lbnQ+IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7CisJCQkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogY2hpbGRyZW4pIHsKKwkJCQkJZmluZEVsZW1lbnRzUmVjdXJzaXZlKGNoaWxkLCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBTZWFyY2ggVHJpbQorCQlpZiAoc2VhcmNoUm9vdCBpbnN0YW5jZW9mIE1UcmltbWVkV2luZG93ICYmIChzZWFyY2hGbGFncyAmIElOX1RSSU0pICE9IDApIHsKKwkJCU1UcmltbWVkV2luZG93IHR3ID0gKE1UcmltbWVkV2luZG93KSBzZWFyY2hSb290OworCQkJTGlzdDxNVHJpbUJhcj4gYmFycyA9IHR3LmdldFRyaW1CYXJzKCk7CisJCQlmb3IgKE1UcmltQmFyIGJhciA6IGJhcnMpIHsKKwkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUoYmFyLCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCX0KKwkJfQorCisJCS8vIFNlYXJjaCBEZXRhY2hlZCBXaW5kb3dzCisJCWlmIChzZWFyY2hSb290IGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJTVdpbmRvdyB3aW5kb3cgPSAoTVdpbmRvdykgc2VhcmNoUm9vdDsKKwkJCWZvciAoTVdpbmRvdyBkdyA6IHdpbmRvdy5nZXRXaW5kb3dzKCkpIHsKKwkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUoZHcsIGNsYXp6LCBtYXRjaGVyLCBlbGVtZW50cywgc2VhcmNoRmxhZ3MpOworCQkJfQorCisJCQlNTWVudSBtZW51ID0gd2luZG93LmdldE1haW5NZW51KCk7CisJCQlpZiAobWVudSAhPSBudWxsICYmIChzZWFyY2hGbGFncyAmIElOX01BSU5fTUVOVSkgIT0gMCkgeworCQkJCWZpbmRFbGVtZW50c1JlY3Vyc2l2ZShtZW51LCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCX0KKwkJCS8vIENoZWNrIGZvciBIYW5kbGVycworCQkJaWYgKHNlYXJjaEZsYWdzID09IEFOWVdIRVJFICYmIE1IYW5kbGVyLmNsYXNzLmVxdWFscyhjbGF6eikpIHsKKwkJCQlmb3IgKE1IYW5kbGVyIGNoaWxkIDogd2luZG93LmdldEhhbmRsZXJzKCkpIHsKKwkJCQkJZmluZEVsZW1lbnRzUmVjdXJzaXZlKGNoaWxkLCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoc2VhcmNoUm9vdCBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJTVBlcnNwZWN0aXZlIHBlcnNwID0gKE1QZXJzcGVjdGl2ZSkgc2VhcmNoUm9vdDsKKwkJCWZvciAoTVdpbmRvdyBkdyA6IHBlcnNwLmdldFdpbmRvd3MoKSkgeworCQkJCWZpbmRFbGVtZW50c1JlY3Vyc2l2ZShkdywgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQl9CisJCX0KKwkJLy8gU2VhcmNoIHNoYXJlZCBlbGVtZW50cworCQlpZiAoc2VhcmNoUm9vdCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJTVBsYWNlaG9sZGVyIHBoID0gKE1QbGFjZWhvbGRlcikgc2VhcmNoUm9vdDsKKworCQkJLy8gRG9uJ3Qgc2VhcmNoIGluIHNoYXJlZCBhcmVhcyB1bmxlc3MgdGhlIGZsYWcgaXMgc2V0CisJCQlpZiAocGguZ2V0UmVmKCkgIT0gbnVsbAorCQkJCQkmJiAoIShwaC5nZXRSZWYoKSBpbnN0YW5jZW9mIE1BcmVhKSB8fCAoc2VhcmNoRmxhZ3MgJiBJTl9TSEFSRURfQVJFQSkgIT0gMCkpIHsKKwkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUocGguZ2V0UmVmKCksIGNsYXp6LCBtYXRjaGVyLCBlbGVtZW50cywgc2VhcmNoRmxhZ3MpOworCQkJfQorCQl9CisKKwkJaWYgKHNlYXJjaFJvb3QgaW5zdGFuY2VvZiBNUGFydCAmJiAoc2VhcmNoRmxhZ3MgJiBJTl9QQVJUKSAhPSAwKSB7CisJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBzZWFyY2hSb290OworCisJCQlmb3IgKE1NZW51IG1lbnUgOiBwYXJ0LmdldE1lbnVzKCkpIHsKKwkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUobWVudSwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQl9CisKKwkJCU1Ub29sQmFyIHRvb2xCYXIgPSBwYXJ0LmdldFRvb2xiYXIoKTsKKwkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKKwkJCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUodG9vbEJhciwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBzZWFyY2hGbGFncyk7CisJCQl9CisJCQlpZiAoTUhhbmRsZXIuY2xhc3MuZXF1YWxzKGNsYXp6KSkgeworCQkJCWZvciAoTUhhbmRsZXIgY2hpbGQgOiBwYXJ0LmdldEhhbmRsZXJzKCkpIHsKKwkJCQkJZmluZEVsZW1lbnRzUmVjdXJzaXZlKGNoaWxkLCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQ+IExpc3Q8VD4gZmluZEVsZW1lbnRzKE1VSUVsZW1lbnQgc2VhcmNoUm9vdCwgU3RyaW5nIGlkLCBDbGFzczxUPiBjbGF6eiwKKwkJCUxpc3Q8U3RyaW5nPiB0YWdzVG9NYXRjaCkgeworCQlFbGVtZW50TWF0Y2hlciBtYXRjaGVyID0gbmV3IEVsZW1lbnRNYXRjaGVyKGlkLCBjbGF6eiwgdGFnc1RvTWF0Y2gpOworCQlyZXR1cm4gZmluZEVsZW1lbnRzKHNlYXJjaFJvb3QsIGNsYXp6LCBBTllXSEVSRSwgbWF0Y2hlcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBMaXN0PFQ+IGZpbmRFbGVtZW50cyhNVUlFbGVtZW50IHNlYXJjaFJvb3QsIFN0cmluZyBpZCwgQ2xhc3M8VD4gY2xhenosCisJCQlMaXN0PFN0cmluZz4gdGFnc1RvTWF0Y2gsIGludCBzZWFyY2hGbGFncykgeworCQlFbGVtZW50TWF0Y2hlciBtYXRjaGVyID0gbmV3IEVsZW1lbnRNYXRjaGVyKGlkLCBjbGF6eiwgdGFnc1RvTWF0Y2gpOworCQlyZXR1cm4gZmluZEVsZW1lbnRzKHNlYXJjaFJvb3QsIGNsYXp6LCBzZWFyY2hGbGFncywgbWF0Y2hlcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBMaXN0PFQ+IGZpbmRFbGVtZW50cyhNQXBwbGljYXRpb25FbGVtZW50IHNlYXJjaFJvb3QsIENsYXNzPFQ+IGNsYXp6LAorCQkJaW50IHNlYXJjaEZsYWdzLCBTZWxlY3RvciBtYXRjaGVyKSB7CisJCUxpc3Q8VD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisJCWZpbmRFbGVtZW50c1JlY3Vyc2l2ZShzZWFyY2hSb290LCBjbGF6eiwgbWF0Y2hlciwgZWxlbWVudHMsIHNlYXJjaEZsYWdzKTsKKwkJcmV0dXJuIGVsZW1lbnRzOworCX0KKworCXByaXZhdGUgPFQ+IExpc3Q8VD4gZmluZFBlcnNwZWN0aXZlRWxlbWVudHMoTVVJRWxlbWVudCBzZWFyY2hSb290LCBTdHJpbmcgaWQsCisJCQlDbGFzczxUPiBjbGF6eiwKKwkJCUxpc3Q8U3RyaW5nPiB0YWdzVG9NYXRjaCkgeworCQlMaXN0PFQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxUPigpOworCQlFbGVtZW50TWF0Y2hlciBtYXRjaGVyID0gbmV3IEVsZW1lbnRNYXRjaGVyKGlkLCBjbGF6eiwgdGFnc1RvTWF0Y2gpOworCQlmaW5kRWxlbWVudHNSZWN1cnNpdmUoc2VhcmNoUm9vdCwgY2xhenosIG1hdGNoZXIsIGVsZW1lbnRzLCBQUkVTRU5UQVRJT04pOworCQlyZXR1cm4gZWxlbWVudHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1VSUVsZW1lbnQgZmluZChTdHJpbmcgaWQsIE1VSUVsZW1lbnQgc2VhcmNoUm9vdCkgeworCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUxpc3Q8TVVJRWxlbWVudD4gZWxlbWVudHMgPSBmaW5kRWxlbWVudHMoc2VhcmNoUm9vdCwgaWQsIE1VSUVsZW1lbnQuY2xhc3MsIG51bGwpOworCQlpZiAoZWxlbWVudHMuc2l6ZSgpID4gMCkgeworCQkJcmV0dXJuIGVsZW1lbnRzLmdldCgwKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGNvdW50UmVuZGVyYWJsZUNoaWxkcmVuKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTUVsZW1lbnRDb250YWluZXI8Pz4pKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4pIGVsZW1lbnQ7CisJCWludCBjb3VudCA9IDA7CisJCUxpc3Q8TVVJRWxlbWVudD4ga2lkcyA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOworCQlmb3IgKE1VSUVsZW1lbnQga2lkIDoga2lkcykgeworCQkJaWYgKGtpZC5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElFY2xpcHNlQ29udGV4dCBnZXRDb250YWluaW5nQ29udGV4dChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJcmV0dXJuIE1vZGVsVXRpbHMuZ2V0Q29udGFpbmluZ0NvbnRleHQoZWxlbWVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1VSUVsZW1lbnQgY2xvbmVFbGVtZW50KE1VSUVsZW1lbnQgZWxlbWVudCwgTVNuaXBwZXRDb250YWluZXIgc25pcHBldENvbnRhaW5lcikgeworCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZWxlbWVudDsKKwkJTVVJRWxlbWVudCBjbG9uZSA9IChNVUlFbGVtZW50KSBFY29yZVV0aWwuY29weShlT2JqKTsKKworCQkvLyBudWxsIG91dCBhbGwgdGhlIHJlZmVyZW5jZXMKKwkJTGlzdDxNUGxhY2Vob2xkZXI+IHBoTGlzdCA9IGZpbmRFbGVtZW50cyhjbG9uZSwgbnVsbCwgTVBsYWNlaG9sZGVyLmNsYXNzLCBudWxsKTsKKwkJZm9yIChNUGxhY2Vob2xkZXIgcGggOiBwaExpc3QpIHsKKwkJCS8vIFNraXAgcGxhY2Vob2xkZXJzIGluIHRoZSBzaGFyZWRBcmVhCisJCQlpbnQgbG9jYXRpb24gPSBnZXRFbGVtZW50TG9jYXRpb24ocGgpOworCQkJaWYgKChsb2NhdGlvbiAmIElOX1NIQVJFRF9BUkVBKSAhPSAwKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXBoLnNldFJlZihudWxsKTsKKwkJfQorCisJCWlmIChzbmlwcGV0Q29udGFpbmVyICE9IG51bGwpIHsKKwkJCU1VSUVsZW1lbnQgc25pcHBldCA9IGZpbmRTbmlwcGV0KHNuaXBwZXRDb250YWluZXIsIGVsZW1lbnQuZ2V0RWxlbWVudElkKCkpOworCQkJaWYgKHNuaXBwZXQgIT0gbnVsbCkgeworCQkJCXNuaXBwZXRDb250YWluZXIuZ2V0U25pcHBldHMoKS5yZW1vdmUoc25pcHBldCk7CisJCQl9CisJCQlzbmlwcGV0Q29udGFpbmVyLmdldFNuaXBwZXRzKCkuYWRkKGNsb25lKTsKKwkJfQorCisJCS8vIENhY2hlIHRoZSBvcmlnaW5hbCBlbGVtZW50IGluIHRoZSBjbG9uZSdzIHRyYW5zaWVudERhdGEKKwkJY2xvbmUuZ2V0VHJhbnNpZW50RGF0YSgpLnB1dChDTE9ORURfRlJPTV9LRVksIGVsZW1lbnQpOworCisJCXJldHVybiBjbG9uZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVVJRWxlbWVudCBjbG9uZVNuaXBwZXQoTVNuaXBwZXRDb250YWluZXIgc25pcHBldENvbnRhaW5lciwgU3RyaW5nIHNuaXBwZXRJZCwKKwkJCU1XaW5kb3cgcmVmV2luKSB7CisJCWlmIChzbmlwcGV0Q29udGFpbmVyID09IG51bGwgfHwgc25pcHBldElkID09IG51bGwgfHwgc25pcHBldElkLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJTUFwcGxpY2F0aW9uRWxlbWVudCBlbGVtZW50VG9DbG9uZSA9IG51bGw7CisJCWZvciAoTUFwcGxpY2F0aW9uRWxlbWVudCBzbmlwcGV0IDogc25pcHBldENvbnRhaW5lci5nZXRTbmlwcGV0cygpKSB7CisJCQlpZiAoc25pcHBldElkLmVxdWFscyhzbmlwcGV0LmdldEVsZW1lbnRJZCgpKSkgeworCQkJCWVsZW1lbnRUb0Nsb25lID0gc25pcHBldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZWxlbWVudFRvQ2xvbmUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZWxlbWVudFRvQ2xvbmU7CisJCU1VSUVsZW1lbnQgZWxlbWVudCA9IChNVUlFbGVtZW50KSBFY29yZVV0aWwuY29weShlT2JqKTsKKworCQlNVUlFbGVtZW50IGFwcEVsZW1lbnQgPSByZWZXaW4gPT0gbnVsbCA/IG51bGwgOiByZWZXaW4uZ2V0UGFyZW50KCk7CisJCWlmIChhcHBFbGVtZW50IGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uKSB7CisJCQkvLyB1c2UgYXBwQ29udGV4dCBhcyBNQXBwbGljYXRpb24uZ2V0Q29udGV4dCgpIGlzIG51bGwgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mCisJCQkvLyB0aGUgbW9kZWwgcHJvY2Vzc29yIGNsYXNzZXMKKwkJCUVQbGFjZWhvbGRlclJlc29sdmVyIHJlc29sdmVyID0gYXBwQ29udGV4dC5nZXQoRVBsYWNlaG9sZGVyUmVzb2x2ZXIuY2xhc3MpOworCQkJLy8gUmUtcmVzb2x2ZSBhbnkgcGxhY2Vob2xkZXIgcmVmZXJlbmNlcworCQkJTGlzdDxNUGxhY2Vob2xkZXI+IHBoTGlzdCA9IGZpbmRFbGVtZW50cyhlbGVtZW50LCBudWxsLCBNUGxhY2Vob2xkZXIuY2xhc3MsIG51bGwpOworCQkJZm9yIChNUGxhY2Vob2xkZXIgcGggOiBwaExpc3QpIHsKKwkJCQlyZXNvbHZlci5yZXNvbHZlUGxhY2Vob2xkZXJSZWYocGgsIHJlZldpbik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVVJRWxlbWVudCBmaW5kU25pcHBldChNU25pcHBldENvbnRhaW5lciBzbmlwcGV0Q29udGFpbmVyLCBTdHJpbmcgaWQpIHsKKwkJaWYgKHNuaXBwZXRDb250YWluZXIgPT0gbnVsbCB8fCBpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJTGlzdDxNVUlFbGVtZW50PiBzbmlwcGV0cyA9IHNuaXBwZXRDb250YWluZXIuZ2V0U25pcHBldHMoKTsKKwkJZm9yIChNVUlFbGVtZW50IHNuaXBwZXQgOiBzbmlwcGV0cykgeworCQkJaWYgKGlkLmVxdWFscyhzbmlwcGV0LmdldEVsZW1lbnRJZCgpKSkgeworCQkJCXJldHVybiBzbmlwcGV0OworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYnJpbmdUb1RvcChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCXJldHVybjsKKwkJfQorCisJCU1XaW5kb3cgd2luZG93ID0gZ2V0VG9wTGV2ZWxXaW5kb3dGb3IoZWxlbWVudCk7CisJCWlmICh3aW5kb3cgPT0gZWxlbWVudCkgeworCQkJaWYgKCFlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQllbGVtZW50LnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCX0KKworCQkJd2luZG93LmdldFBhcmVudCgpLnNldFNlbGVjdGVkRWxlbWVudCh3aW5kb3cpOworCQl9IGVsc2UgeworCQkJc2hvd0VsZW1lbnRJbldpbmRvdyh3aW5kb3csIGVsZW1lbnQpOworCQl9CisJCVVJRXZlbnRzLnB1Ymxpc2hFdmVudChVSUV2ZW50cy5VSUxpZmVDeWNsZS5CUklOR1RPVE9QLCBlbGVtZW50KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2hvd0VsZW1lbnRJbldpbmRvdyhNV2luZG93IHdpbmRvdywgTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1VSUVsZW1lbnQgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlNUGxhY2Vob2xkZXIgcGggPSBmaW5kUGxhY2Vob2xkZXJGb3Iod2luZG93LCBlbGVtZW50KTsKKwkJCWlmIChwaCAhPSBudWxsKSB7CisJCQkJZWxlbWVudCA9IHBoOworCQkJCXBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCQl9CisJCX0KKworCQlpZiAocGFyZW50ID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCS8vIG5vIHBhcmVudCBidXQgaXMgYSB3aW5kb3csIGNvdWxkIGJlIGEgZGV0YWNoZWQgd2luZG93IHRoZW4KKwkJCXBhcmVudCA9IChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJCS8vIEZvcmNlIHRoZSBlbGVtZW50IHRvIGJlIHJlbmRlcmVkCisJCQkJaWYgKCFlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQkJZWxlbWVudC5zZXRUb0JlUmVuZGVyZWQodHJ1ZSk7CisJCQkJfQorCisJCQkJaWYgKHdpbmRvdyAhPSBwYXJlbnQpIHsKKwkJCQkJc2hvd0VsZW1lbnRJbldpbmRvdyh3aW5kb3csIHBhcmVudCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHBhcmVudCAhPSBudWxsKSB7CisJCQkvLyBGb3JjZSB0aGUgZWxlbWVudCB0byBiZSByZW5kZXJlZAorCQkJaWYgKCFlbGVtZW50LmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQllbGVtZW50LnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCX0KKworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4pIHBhcmVudDsKKwkJCWNvbnRhaW5lci5zZXRTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCk7CisJCQlpZiAod2luZG93ICE9IHBhcmVudCkgeworCQkJCXNob3dFbGVtZW50SW5XaW5kb3cod2luZG93LCBwYXJlbnQpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1QbGFjZWhvbGRlciBmaW5kUGxhY2Vob2xkZXJGb3IoTVdpbmRvdyB3aW5kb3csIE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlMaXN0PE1QbGFjZWhvbGRlcj4gcGhMaXN0ID0gZmluZFBlcnNwZWN0aXZlRWxlbWVudHMod2luZG93LCBudWxsLCBNUGxhY2Vob2xkZXIuY2xhc3MsIG51bGwpOworCQlMaXN0PE1QbGFjZWhvbGRlcj4gZWxlbWVudFJlZnMgPSBuZXcgQXJyYXlMaXN0PE1QbGFjZWhvbGRlcj4oKTsKKwkJZm9yIChNUGxhY2Vob2xkZXIgcGggOiBwaExpc3QpIHsKKwkJCWlmIChwaC5nZXRSZWYoKSA9PSBlbGVtZW50KSB7CisJCQkJZWxlbWVudFJlZnMuYWRkKHBoKTsKKwkJCX0KKwkJfQorCisJCWlmIChlbGVtZW50UmVmcy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAoZWxlbWVudFJlZnMuc2l6ZSgpID09IDEpIHsKKwkJCXJldHVybiBlbGVtZW50UmVmcy5nZXQoMCk7CisJCX0KKworCQkvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBsYWNlaG9sZGVyIHRoZW4gcmV0dXJuIHRoZSBvbmUgaW4gdGhlIHNoYXJlZCBhcmVhCisJCWZvciAoTVBsYWNlaG9sZGVyIHJlZlBoIDogZWxlbWVudFJlZnMpIHsKKwkJCWludCBsb2MgPSBnZXRFbGVtZW50TG9jYXRpb24ocmVmUGgpOworCQkJaWYgKChsb2MgJiBJTl9TSEFSRURfQVJFQSkgIT0gMCkgeworCQkJCXJldHVybiByZWZQaDsKKwkJCX0KKwkJfQorCisJCS8vIEp1c3QgcmV0dXJuIHRoZSBmaXJzdCBvbmUKKwkJcmV0dXJuIGVsZW1lbnRSZWZzLmdldCgwKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtb3ZlKE1VSUVsZW1lbnQgZWxlbWVudCwgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gbmV3UGFyZW50KSB7CisJCW1vdmUoZWxlbWVudCwgbmV3UGFyZW50LCAtMSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1vdmUoTVVJRWxlbWVudCBlbGVtZW50LCBNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBuZXdQYXJlbnQsCisJCQlib29sZWFuIGxlYXZlUGxhY2Vob2xkZXIpIHsKKwkJbW92ZShlbGVtZW50LCBuZXdQYXJlbnQsIC0xLCBsZWF2ZVBsYWNlaG9sZGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtb3ZlKE1VSUVsZW1lbnQgZWxlbWVudCwgTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gbmV3UGFyZW50LCBpbnQgaW5kZXgpIHsKKwkJbW92ZShlbGVtZW50LCBuZXdQYXJlbnQsIGluZGV4LCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbW92ZShNVUlFbGVtZW50IGVsZW1lbnQsIE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IG5ld1BhcmVudCwgaW50IGluZGV4LAorCQkJYm9vbGVhbiBsZWF2ZVBsYWNlaG9sZGVyKSB7CisJCS8vIENhY2hlIHdoZXJlIHdlIHdlcmUKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY3VyUGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaW50IGN1ckluZGV4ID0gY3VyUGFyZW50LmdldENoaWxkcmVuKCkuaW5kZXhPZihlbGVtZW50KTsKKworCQkvLyBNb3ZlIHRoZSBtb2RlbCBlbGVtZW50CisJCWlmIChpbmRleCA9PSAtMSkgeworCQkJbmV3UGFyZW50LmdldENoaWxkcmVuKCkuYWRkKGVsZW1lbnQpOworCQl9IGVsc2UgeworCQkJbmV3UGFyZW50LmdldENoaWxkcmVuKCkuYWRkKGluZGV4LCBlbGVtZW50KTsKKwkJfQorCisJCWlmIChsZWF2ZVBsYWNlaG9sZGVyKSB7CisJCQlNUGxhY2Vob2xkZXIgcGggPSBNQWR2YW5jZWRGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVBsYWNlaG9sZGVyKCk7CisJCQlwaC5zZXRSZWYoZWxlbWVudCk7CisJCQljdXJQYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoY3VySW5kZXgsIHBoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb21iaW5lKE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQgdG9JbnNlcnQsIE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQgcmVsVG8sCisJCQlNUGFydFNhc2hDb250YWluZXIgbmV3U2FzaCwgYm9vbGVhbiBuZXdGaXJzdCwgZmxvYXQgcmF0aW8pIHsKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY3VyUGFyZW50ID0gcmVsVG8uZ2V0UGFyZW50KCk7CisJCWludCBpbmRleCA9IGN1clBhcmVudC5nZXRDaGlsZHJlbigpLmluZGV4T2YocmVsVG8pOworCQljdXJQYXJlbnQuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUocmVsVG8pOworCQlpZiAobmV3Rmlyc3QpIHsKKwkJCW5ld1Nhc2guZ2V0Q2hpbGRyZW4oKS5hZGQodG9JbnNlcnQpOworCQkJbmV3U2FzaC5nZXRDaGlsZHJlbigpLmFkZChyZWxUbyk7CisJCX0gZWxzZSB7CisJCQluZXdTYXNoLmdldENoaWxkcmVuKCkuYWRkKHJlbFRvKTsKKwkJCW5ld1Nhc2guZ2V0Q2hpbGRyZW4oKS5hZGQodG9JbnNlcnQpOworCQl9CisKKwkJLy8gU2V0IHVwIHRoZSBjb250YWluZXIgZGF0YSBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgc2FzaCB0byB0aGUgbW9kZWwKKwkJLy8gVG8gcmFpc2UgdGhlIGdyYW51bGFyaXR5IGFzc3VtZSAxMDAlID09IDEwLDAwMAorCQlpbnQgYWRqdXN0ZWRQY3QgPSAoaW50KSAocmF0aW8gKiAxMDAwMCk7CisJCXRvSW5zZXJ0LnNldENvbnRhaW5lckRhdGEoSW50ZWdlci50b1N0cmluZyhhZGp1c3RlZFBjdCkpOworCQlyZWxUby5zZXRDb250YWluZXJEYXRhKEludGVnZXIudG9TdHJpbmcoMTAwMDAgLSBhZGp1c3RlZFBjdCkpOworCisJCS8vIGFkZCB0aGUgbmV3IHNhc2ggYXQgdGhlIHNhbWUgbG9jYXRpb24KKwkJY3VyUGFyZW50LmdldENoaWxkcmVuKCkuYWRkKGluZGV4LCBuZXdTYXNoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbnNlcnQoTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCB0b0luc2VydCwgTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCByZWxUbywKKwkJCWludCB3aGVyZSwgZmxvYXQgcmF0aW8pIHsKKwkJYXNzZXJ0ICh0b0luc2VydCAhPSBudWxsICYmIHJlbFRvICE9IG51bGwpOworCQlhc3NlcnQgKHJhdGlvID4gMCAmJiByYXRpbyA8IDEwMCk7CisKKwkJLy8gZGV0ZXJtaW5lIGluc2VydGlvbiBvcmRlcgorCQlib29sZWFuIGluc2VydEJlZm9yZSA9IHdoZXJlID09IEFCT1ZFIHx8IHdoZXJlID09IExFRlRfT0Y7CisJCWJvb2xlYW4gaG9yaXpvbnRhbCA9IHdoZXJlID09IExFRlRfT0YgfHwgd2hlcmUgPT0gUklHSFRfT0Y7CisKKwkJTVBhcnRTYXNoQ29udGFpbmVyIG5ld1Nhc2ggPSBCYXNpY0ZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQYXJ0U2FzaENvbnRhaW5lcigpOworCQluZXdTYXNoLnNldEhvcml6b250YWwoaG9yaXpvbnRhbCk7CisKKwkJLy8gTWFpbnRhaW4gdGhlIGV4aXN0aW5nIHdlaWdodCBpbiB0aGUgbmV3IHNhc2gKKwkJbmV3U2FzaC5zZXRDb250YWluZXJEYXRhKHJlbFRvLmdldENvbnRhaW5lckRhdGEoKSk7CisKKwkJY29tYmluZSh0b0luc2VydCwgcmVsVG8sIG5ld1Nhc2gsIGluc2VydEJlZm9yZSwgcmF0aW8pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRldGFjaChNUGFydFNhc2hDb250YWluZXJFbGVtZW50IGVsZW1lbnQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisJCS8vIElmIHdlJ3JlIHNob3dpbmcgdGhyb3VnaCBhIHBsYWNlaG9pbGRlciB0aGVuIGRldGFjaCBpdC4uLgorCQlpZiAoZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBudWxsKSB7CisJCQllbGVtZW50ID0gZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJfQorCisJCS8vIERldGVybWluZSB0aGUgY29ycmVjdCBwYXJlbnQgZm9yIHRoZSBuZXcgd2luZG93CisJCU1XaW5kb3cgd2luZG93ID0gZ2V0VG9wTGV2ZWxXaW5kb3dGb3IoZWxlbWVudCk7CisJCU1QZXJzcGVjdGl2ZSB0aGVQZXJzcCA9IGdldFBlcnNwZWN0aXZlRm9yKGVsZW1lbnQpOworCisJCU1UcmltbWVkV2luZG93IG5ld1dpbmRvdyA9IE1CYXNpY0ZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlVHJpbW1lZFdpbmRvdygpOworCisJCW5ld1dpbmRvdy5zZXRYKHgpOworCQluZXdXaW5kb3cuc2V0WSh5KTsKKwkJbmV3V2luZG93LnNldFdpZHRoKHdpZHRoKTsKKwkJbmV3V2luZG93LnNldEhlaWdodChoZWlnaHQpOworCisJCWVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoZWxlbWVudCk7CisJCU1XaW5kb3dFbGVtZW50IHVpUm9vdCA9IHdyYXBFbGVtZW50Rm9yV2luZG93KGVsZW1lbnQpOworCQluZXdXaW5kb3cuZ2V0Q2hpbGRyZW4oKS5hZGQodWlSb290KTsKKworCQlpZiAodGhlUGVyc3AgIT0gbnVsbCkgeworCQkJdGhlUGVyc3AuZ2V0V2luZG93cygpLmFkZChuZXdXaW5kb3cpOworCQl9IGVsc2UgaWYgKHdpbmRvdyAhPSBudWxsKSB7CisJCQl3aW5kb3cuZ2V0V2luZG93cygpLmFkZChuZXdXaW5kb3cpOworCQl9CisJfQorCisJLyoqCisJICogV3JhcHMgYW4gZWxlbWVudCBpbiBhIFBhcnRTdGFjayBpZiBpdCdzIGEgTVBhcnQgb3IgYW4gTVBsYWNlaG9sZGVyIHRoYXQgcmVmZXJlbmNlcyBhbiBNUGFydAorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGJlIHdyYXBwZWQKKwkgKiBAcmV0dXJuIFRoZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAorCSAqLworCXByaXZhdGUgTVdpbmRvd0VsZW1lbnQgd3JhcEVsZW1lbnRGb3JXaW5kb3coTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQlNVUlFbGVtZW50IHJlZiA9ICgoTVBsYWNlaG9sZGVyKSBlbGVtZW50KS5nZXRSZWYoKTsKKwkJCWlmIChyZWYgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJCU1QYXJ0U3RhY2sgbmV3UFMgPSBNQmFzaWNGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVBhcnRTdGFjaygpOworCQkJCW5ld1BTLmdldENoaWxkcmVuKCkuYWRkKChNUGxhY2Vob2xkZXIpIGVsZW1lbnQpOworCQkJCXJldHVybiBuZXdQUzsKKwkJCX0KKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCU1QYXJ0U3RhY2sgbmV3UFMgPSBNQmFzaWNGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVBhcnRTdGFjaygpOworCQkJbmV3UFMuZ2V0Q2hpbGRyZW4oKS5hZGQoKE1QYXJ0KSBlbGVtZW50KTsKKwkJCXJldHVybiBuZXdQUzsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvd0VsZW1lbnQpIHsKKwkJCXJldHVybiAoTVdpbmRvd0VsZW1lbnQpIGVsZW1lbnQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1UcmltQmFyIGdldFRyaW0oTVRyaW1tZWRXaW5kb3cgd2luZG93LCBTaWRlVmFsdWUgc3YpIHsKKwkJTGlzdDxNVHJpbUJhcj4gYmFycyA9IHdpbmRvdy5nZXRUcmltQmFycygpOworCQlmb3IgKE1UcmltQmFyIGJhciA6IGJhcnMpIHsKKwkJCWlmIChiYXIuZ2V0U2lkZSgpID09IHN2KSB7CisJCQkJcmV0dXJuIGJhcjsKKwkJCX0KKwkJfQorCisJCS8vIERpZG4ndCBmaW5kIGEgdHJpbSBiYXIgZm9yIHRoZSBzaWRlLCBtYWtlIG9uZQorCQlNVHJpbUJhciBuZXdCYXIgPSBCYXNpY0ZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVUcmltQmFyKCk7CisKKwkJLy8gQXNzaWduIGRlZmF1bHQgaWRzIHRvIHRoZSB0cmltIGJhcnMgdG8gbWF0Y2ggbGVnYWN5IGVjbGlwc2UKKwkJaWYgKHN2ID09IFNpZGVWYWx1ZS5UT1ApIHsKKwkJCW5ld0Jhci5zZXRFbGVtZW50SWQoIm9yZy5lY2xpcHNlLnVpLm1haW4ubWVudSIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoc3YgPT0gU2lkZVZhbHVlLkJPVFRPTSkgeworCQkJbmV3QmFyLnNldEVsZW1lbnRJZCgib3JnLmVjbGlwc2UudWkudHJpbS5zdGF0dXMiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgaWYgKHN2ID09IFNpZGVWYWx1ZS5MRUZUKSB7CisJCQluZXdCYXIuc2V0RWxlbWVudElkKCJvcmcuZWNsaXBzZS51aS50cmltLnZlcnRpY2FsMSIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoc3YgPT0gU2lkZVZhbHVlLlJJR0hUKSB7CisJCQluZXdCYXIuc2V0RWxlbWVudElkKCJvcmcuZWNsaXBzZS51aS50cmltLnZlcnRpY2FsMiIpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQluZXdCYXIuc2V0U2lkZShzdik7CisJCXdpbmRvdy5nZXRUcmltQmFycygpLmFkZChuZXdCYXIpOworCQlyZXR1cm4gbmV3QmFyOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNV2luZG93IGdldFRvcExldmVsV2luZG93Rm9yKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZWxlbWVudDsKKwkJd2hpbGUgKGVPYmogIT0gbnVsbCAmJiAhKGVPYmouZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uKSkgeworCQkJZU9iaiA9IGVPYmouZUNvbnRhaW5lcigpOworCQl9CisKKwkJaWYgKGVPYmogaW5zdGFuY2VvZiBNV2luZG93KSB7CisJCQlyZXR1cm4gKE1XaW5kb3cpIGVPYmo7CisJCX0KKworCQlyZXR1cm4gbnVsbDsgLy8gT29vcHMhCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1QZXJzcGVjdGl2ZSBnZXRQZXJzcGVjdGl2ZUZvcihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKworCQl3aGlsZSAodHJ1ZSkgeworCQkJLy8gaWYgd2UgaGF2ZSBhIHBsYWNlaG9sZGVyLCByZWFzc2lnbiBvdXJzZWx2ZXMKKwkJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IGVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQlpZiAocGxhY2Vob2xkZXIgIT0gbnVsbCkgeworCQkJCWVsZW1lbnQgPSBwbGFjZWhvbGRlcjsKKwkJCX0KKwkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7CisJCQlpZiAoY29udGFpbmVyID09IG51bGwgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uKSB7CisJCQkJLy8gY2xpbWJlZCB0byB0aGUgdG9wIGFuZCBmb3VuZCBub3RoaW5nLCByZXR1cm4gbnVsbAorCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNUGVyc3BlY3RpdmVTdGFjaykgeworCQkJCS8vIHBhcmVudCBpcyBhIHBlcnNwZWN0aXZlIHN0YWNrLCB3ZSBvdXJzZWx2ZXMgc2hvdWxkIGJlIGEgcGVyc3BlY3RpdmUKKwkJCQlyZXR1cm4gKE1QZXJzcGVjdGl2ZSkgZWxlbWVudDsKKwkJCX0KKworCQkJLy8gY2xpbWIgdXAKKwkJCWVsZW1lbnQgPSAoTVVJRWxlbWVudCkgY29udGFpbmVyOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXRQZXJzcGVjdGl2ZU1vZGVsKE1QZXJzcGVjdGl2ZSBwZXJzcCwgTVdpbmRvdyB3aW5kb3cpIHsKKwkJcmVzZXRQZXJzcGVjdGl2ZU1vZGVsKHBlcnNwLCB3aW5kb3csIHRydWUpOworCX0KKworCXByaXZhdGUgdm9pZCByZXNldFBlcnNwZWN0aXZlTW9kZWwoTVBlcnNwZWN0aXZlIHBlcnNwLCBNV2luZG93IHdpbmRvdywKKwkJCWJvb2xlYW4gcmVtb3ZlU2hhcmVkUGxhY2Vob2xkZXJzKSB7CisJCWlmIChwZXJzcCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocmVtb3ZlU2hhcmVkUGxhY2Vob2xkZXJzKSB7CisJCQkvLyBSZW1vdmUgYW55IHZpZXdzIChQbGFjZWhvbGRlcnMpIGZyb20gdGhlIHNoYXJlZCBhcmVhCisJCQlFUGFydFNlcnZpY2UgcHMgPSB3aW5kb3cuZ2V0Q29udGV4dCgpLmdldChFUGFydFNlcnZpY2UuY2xhc3MpOworCQkJTGlzdDxNQXJlYT4gYXJlYXMgPSBmaW5kRWxlbWVudHMod2luZG93LCBudWxsLCBNQXJlYS5jbGFzcywgbnVsbCk7CisJCQlpZiAoYXJlYXMuc2l6ZSgpID09IDEpIHsKKwkJCQlNQXJlYSBhcmVhID0gYXJlYXMuZ2V0KDApOworCisJCQkJLy8gU3RyaXAgb3V0IHRoZSBwbGFjZWhvbGRlcnMgaW4gdmlzaWJsZSBzdGFja3MKKwkJCQlMaXN0PE1QbGFjZWhvbGRlcj4gcGhMaXN0ID0gZmluZEVsZW1lbnRzKGFyZWEsIG51bGwsIE1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCk7CisJCQkJZm9yIChNUGxhY2Vob2xkZXIgcGggOiBwaExpc3QpIHsKKwkJCQkJcHMuaGlkZVBhcnQoKE1QYXJ0KSBwaC5nZXRSZWYoKSk7CisJCQkJCXBoLmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkucmVtb3ZlKHBoKTsKKwkJCQl9CisKKwkJCQkvLyBQcmV2ZW50IHNoYXJlZCBzdGFja3MgaWRzIGZyb20gY2xhc2hpbmcgd2l0aCB0aGUgb25lcyBpbiB0aGUgcGVyc3BlY3RpdmUKKwkJCQlMaXN0PE1QYXJ0U3RhY2s+IHN0YWNrcyA9IGZpbmRFbGVtZW50cyhhcmVhLCBudWxsLCBNUGFydFN0YWNrLmNsYXNzLCBudWxsKTsKKwkJCQlmb3IgKE1QYXJ0U3RhY2sgc3RhY2sgOiBzdGFja3MpIHsKKwkJCQkJU3RyaW5nIGdlbmVyYXRlZElkID0gIlBhcnRTdGFja0AiICsgSW50ZWdlci50b0hleFN0cmluZyhzdGFjay5oYXNoQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzdGFjay5zZXRFbGVtZW50SWQoZ2VuZXJhdGVkSWQpOworCQkJCX0KKworCQkJCS8vIEFsc28gcmVtb3ZlIGFueSBtaW4vbWF4IHRhZ3Mgb24gdGhlIGFyZWEgKG9yIGl0cyBwbGFjZWhvbGRlcikKKwkJCQlNVUlFbGVtZW50IGFyZWFQcmVzZW50YXRpb24gPSBhcmVhOworCQkJCWlmIChhcmVhLmdldEN1clNoYXJlZFJlZigpICE9IG51bGwpIHsKKwkJCQkJYXJlYVByZXNlbnRhdGlvbiA9IGFyZWEuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQkJfQorCisJCQkJYXJlYVByZXNlbnRhdGlvbi5nZXRUYWdzKCkucmVtb3ZlKElQcmVzZW50YXRpb25FbmdpbmUuTUFYSU1JWkVEKTsKKwkJCQlhcmVhUHJlc2VudGF0aW9uLmdldFRhZ3MoKS5yZW1vdmUoSVByZXNlbnRhdGlvbkVuZ2luZS5NSU5JTUlaRUQpOworCQkJCWFyZWFQcmVzZW50YXRpb24uZ2V0VGFncygpLnJlbW92ZShJUHJlc2VudGF0aW9uRW5naW5lLk1JTklNSVpFRF9CWV9aT09NKTsKKwkJCX0KKwkJfQorCisJCS8vIFJlbW92ZSBhbnkgbWluaW1pemVkIHN0YWNrcyBmb3IgdGhpcyBwZXJzcGVjdGl2ZQorCQlMaXN0PE1UcmltQmFyPiBiYXJzID0gZmluZEVsZW1lbnRzKHdpbmRvdywgbnVsbCwgTVRyaW1CYXIuY2xhc3MsIG51bGwpOworCQlMaXN0PE1Ub29sQ29udHJvbD4gdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PE1Ub29sQ29udHJvbD4oKTsKKwkJZm9yIChNVHJpbUJhciBiYXIgOiBiYXJzKSB7CisJCQlmb3IgKE1VSUVsZW1lbnQgYmFyS2lkIDogYmFyLmdldENoaWxkcmVuKCkpIHsKKwkJCQlpZiAoIShiYXJLaWQgaW5zdGFuY2VvZiBNVG9vbENvbnRyb2wpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlTdHJpbmcgaWQgPSBiYXJLaWQuZ2V0RWxlbWVudElkKCk7CisJCQkJaWYgKGlkICE9IG51bGwgJiYgaWQuY29udGFpbnMocGVyc3AuZ2V0RWxlbWVudElkKCkpKSB7CisJCQkJCXRvUmVtb3ZlLmFkZCgoTVRvb2xDb250cm9sKSBiYXJLaWQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvciAoTVRvb2xDb250cm9sIHRvb2xDb250cm9sIDogdG9SZW1vdmUpIHsKKwkJCS8vIENsb3NlIGFueSBvcGVuIGZhc3QgdmlldworCQkJdG9vbENvbnRyb2wuc2V0VG9CZVJlbmRlcmVkKGZhbHNlKTsKKwkJCXRvb2xDb250cm9sLmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkucmVtb3ZlKHRvb2xDb250cm9sKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNwZWN0aXZlTW9kZWwoTVBlcnNwZWN0aXZlIHBlcnNwLCBNV2luZG93IHdpbmRvdykgeworCQkvLyBwaWNrIGEgbmV3IHBlcnNwZWN0aXZlIHRvIGJlY29tZSBhY3RpdmUgKGlmIGFueSkKKwkJTVVJRWxlbWVudCBwc0VsZW1lbnQgPSBwZXJzcC5nZXRQYXJlbnQoKTsKKwkJTVBlcnNwZWN0aXZlU3RhY2sgcHMgPSAoTVBlcnNwZWN0aXZlU3RhY2spIHBzRWxlbWVudDsKKwkJYm9vbGVhbiBmb3VuZE5ld1NlbGVjdGlvbiA9IGZhbHNlOworCQlpZiAocHMuZ2V0U2VsZWN0ZWRFbGVtZW50KCkgPT0gcGVyc3ApIHsKKwkJCWZvciAoTVBlcnNwZWN0aXZlIHAgOiBwcy5nZXRDaGlsZHJlbigpKSB7CisJCQkJaWYgKHAgIT0gcGVyc3AgJiYgcC5pc1RvQmVSZW5kZXJlZCgpKSB7CisJCQkJCXBzLnNldFNlbGVjdGVkRWxlbWVudChwKTsKKwkJCQkJZm91bmROZXdTZWxlY3Rpb24gPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghZm91bmROZXdTZWxlY3Rpb24pIHsKKwkJCQlwcy5zZXRTZWxlY3RlZEVsZW1lbnQobnVsbCk7CisJCQl9CisJCX0KKworCQkvLyBSZW1vdmUgdHJhbnNpZW50IGVsZW1lbnRzIChtaW5pbWl6ZWQgc3RhY2tzLCBkZXRhY2hlZCB3aW5kb3dzKQorCQlyZXNldFBlcnNwZWN0aXZlTW9kZWwocGVyc3AsIHdpbmRvdywgZmFsc2UpOworCisJCS8vIHVucmVuZGVyIHRoZSBwZXJzcGVjdGl2ZSBhbmQgcmVtb3ZlIGl0CisJCXBlcnNwLnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCXBzLmdldENoaWxkcmVuKCkucmVtb3ZlKHBlcnNwKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBlcnNwZWN0aXZlIGdldEFjdGl2ZVBlcnNwZWN0aXZlKE1XaW5kb3cgd2luZG93KSB7CisJCUxpc3Q8TVBlcnNwZWN0aXZlU3RhY2s+IHBTdGFja3MgPSBmaW5kRWxlbWVudHMod2luZG93LCBudWxsLCBNUGVyc3BlY3RpdmVTdGFjay5jbGFzcywgbnVsbCk7CisJCWlmIChwU3RhY2tzLnNpemUoKSA9PSAxKSB7CisJCQlyZXR1cm4gcFN0YWNrcy5nZXQoMCkuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IHRvQmVSZW5kZXJlZENvdW50KE1FbGVtZW50Q29udGFpbmVyPD8+IGNvbnRhaW5lcikgeworCQlpbnQgY291bnQgPSAwOworCQlmb3IgKE1VSUVsZW1lbnQgY2hpbGQgOiBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKGNoaWxkLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVVJRWxlbWVudCBnZXRDb250YWluZXIoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcmV0dXJuIChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldEVsZW1lbnRMb2NhdGlvbihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIE5PVF9JTl9VSTsKKwkJfQorCisJCS8vIElmIHRoZSBlbGVtZW50IGlzIHNoYXJlZCB0aGVuIHVzZSBpdHMgY3VycmVudCBwbGFjZWhvbGRlcgorCQlpZiAoZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBudWxsKSB7CisJCQllbGVtZW50ID0gZWxlbWVudC5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJfQorCisJCWludCBsb2NhdGlvbiA9IE5PVF9JTl9VSTsKKwkJTVVJRWxlbWVudCBjdXJFbGVtZW50ID0gZWxlbWVudDsKKwkJd2hpbGUgKGN1ckVsZW1lbnQgIT0gbnVsbCkgeworCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgY3VyRWxlbWVudCkuZUNvbnRhaW5lcigpOworCQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgTVVJRWxlbWVudCkpCisJCQkJcmV0dXJuIE5PVF9JTl9VSTsKKworCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbikgeworCQkJCWlmIChsb2NhdGlvbiAhPSBOT1RfSU5fVUkpCisJCQkJCXJldHVybiBsb2NhdGlvbjsKKwkJCQlyZXR1cm4gT1VUU0lERV9QRVJTUEVDVElWRTsKKwkJCX0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSB7CisJCQkJTVBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlID0gKE1QZXJzcGVjdGl2ZSkgY29udGFpbmVyOworCQkJCU1VSUVsZW1lbnQgcGVyc3BQYXJlbnQgPSBwZXJzcGVjdGl2ZS5nZXRQYXJlbnQoKTsKKwkJCQlpZiAocGVyc3BQYXJlbnQgPT0gbnVsbCkgeworCQkJCQlsb2NhdGlvbiA9IE5PVF9JTl9VSTsKKwkJCQl9IGVsc2UgaWYgKHBlcnNwZWN0aXZlLmdldFBhcmVudCgpLmdldFNlbGVjdGVkRWxlbWVudCgpID09IHBlcnNwZWN0aXZlKSB7CisJCQkJCWxvY2F0aW9uIHw9IElOX0FDVElWRV9QRVJTUEVDVElWRTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhdGlvbiB8PSBJTl9BTllfUEVSU1BFQ1RJVkU7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNVHJpbUJhcikgeworCQkJCWxvY2F0aW9uID0gSU5fVFJJTTsKKwkJCX0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTUFyZWEpIHsKKwkJCQlsb2NhdGlvbiA9IElOX1NIQVJFRF9BUkVBOworCQkJfQorCisJCQljdXJFbGVtZW50ID0gKE1VSUVsZW1lbnQpIGNvbnRhaW5lcjsKKwkJfQorCisJCXJldHVybiBOT1RfSU5fVUk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1QYXJ0RGVzY3JpcHRvciBnZXRQYXJ0RGVzY3JpcHRvcihTdHJpbmcgaWQpIHsKKwkJTUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gYXBwQ29udGV4dC5nZXQoTUFwcGxpY2F0aW9uLmNsYXNzKTsKKworCQkvLyBJZiB0aGUgaWQgY29udGFpbnMgYSAnOicgdXNlIHRoZSBwYXJ0IGJlZm9yZSBpdCBhcyB0aGUgZGVzY3JpcHRvciBpZAorCQlpbnQgY29sb25JbmRleCA9IGlkID09IG51bGwgPyAtMSA6IGlkLmluZGV4T2YoJzonKTsKKwkJU3RyaW5nIGRlc2NJZCA9IGNvbG9uSW5kZXggPT0gLTEgPyBpZCA6IGlkLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTsKKworCQlmb3IgKE1QYXJ0RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogYXBwbGljYXRpb24uZ2V0RGVzY3JpcHRvcnMoKSkgeworCQkJaWYgKGRlc2NyaXB0b3IuZ2V0RWxlbWVudElkKCkuZXF1YWxzKGRlc2NJZCkpIHsKKwkJCQlyZXR1cm4gZGVzY3JpcHRvcjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBoaWRlTG9jYWxQbGFjZWhvbGRlcnMoTVdpbmRvdyB3aW5kb3csIE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSkgeworCQlMaXN0PE1QbGFjZWhvbGRlcj4gZ2xvYmFscyA9IGZpbmRFbGVtZW50cyh3aW5kb3csIG51bGwsIE1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCwKKwkJCQlPVVRTSURFX1BFUlNQRUNUSVZFIHwgSU5fU0hBUkVEX0FSRUEpOworCisJCS8vIEl0ZXJhdGUgYWNyb3NzIHRoZSBwZXJzcGVjdGl2ZShzKSByZW1vdmluZyBhbnkgJ2xvY2FsJyBwbGFjZWhvbGRlcnMKKwkJTGlzdDxNUGVyc3BlY3RpdmU+IHBlcnNwcyA9IG5ldyBBcnJheUxpc3Q8TVBlcnNwZWN0aXZlPigpOworCQlpZiAocGVyc3BlY3RpdmUgIT0gbnVsbCkgeworCQkJcGVyc3BzLmFkZChwZXJzcGVjdGl2ZSk7CisJCX0gZWxzZSB7CisJCQlwZXJzcHMgPSBmaW5kRWxlbWVudHMod2luZG93LCBudWxsLCBNUGVyc3BlY3RpdmUuY2xhc3MsIG51bGwpOworCQl9CisKKwkJZm9yIChNUGVyc3BlY3RpdmUgcGVyc3AgOiBwZXJzcHMpIHsKKwkJCUxpc3Q8TVBsYWNlaG9sZGVyPiBsb2NhbHMgPSBmaW5kRWxlbWVudHMocGVyc3AsIG51bGwsIE1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCwKKwkJCQkJSU5fQU5ZX1BFUlNQRUNUSVZFKTsKKwkJCWZvciAoTVBsYWNlaG9sZGVyIGxvY2FsIDogbG9jYWxzKSB7CisJCQkJZm9yIChNUGxhY2Vob2xkZXIgZ2xvYmFsIDogZ2xvYmFscykgeworCQkJCQlpZiAoZ2xvYmFsLmdldFJlZigpID09IGxvY2FsLmdldFJlZigpKSB7CisJCQkJCQlsb2NhbC5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gbG9jYWxQYXJlbnQgPSBsb2NhbC5nZXRQYXJlbnQoKTsKKwkJCQkJCXNldFN0YWNrVmlzaWJpbGl0eShsb2NhbFBhcmVudCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICovCisJcHJpdmF0ZSB2b2lkIHNldFN0YWNrVmlzaWJpbGl0eShNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQpIHsKKwkJZm9yIChNVUlFbGVtZW50IGNoaWxkIDogcGFyZW50LmdldENoaWxkcmVuKCkpIHsKKwkJCWlmIChjaGlsZC5pc1RvQmVSZW5kZXJlZCgpICYmIGNoaWxkLmlzVmlzaWJsZSgpKSB7CisJCQkJcGFyZW50LnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJcGFyZW50LnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCS8vIGNvbnRpbnVlIG1vZGlmeWluZyB0aGUgdmlzaWJpbGl0eSBhcyB0aGUgcGFyZW50J3MgcGFyZW50IG1heSBhbHNvCisJCS8vIG5lZWQgdG8gYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIKKwkJc2V0U3RhY2tWaXNpYmlsaXR5KHBhcmVudC5nZXRQYXJlbnQoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNMYXN0RWRpdG9yU3RhY2soTVVJRWxlbWVudCBzdGFjaykgeworCQlpZiAoIShzdGFjayBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBpcyBpdCBpbiB0aGUgc2hhcmVkIGFyZWE/CisJCU1VSUVsZW1lbnQgcGFyZW50ID0gc3RhY2suZ2V0UGFyZW50KCk7CisJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1BcmVhKSkgeworCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCQl9CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gT0ssIGl0J3MgaW4gdGhlIGFyZWEsIGlzIGl0IHRoZSBsYXN0IFRCUiBvbmUgPworCQlNQXJlYSBhcmVhID0gKE1BcmVhKSBwYXJlbnQ7CisJCUxpc3Q8TVBhcnRTdGFjaz4gc3RhY2tzID0gZmluZEVsZW1lbnRzKGFyZWEsIG51bGwsIE1QYXJ0U3RhY2suY2xhc3MsIG51bGwpOworCQlpbnQgY291bnQgPSAwOworCQlmb3IgKE1QYXJ0U3RhY2sgYVN0YWNrIDogc3RhY2tzKSB7CisJCQlpZiAoYVN0YWNrLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJCXJldHVybiBjb3VudCA8IDIgJiYgc3RhY2suaXNUb0JlUmVuZGVyZWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBob3N0RWxlbWVudChNVUlFbGVtZW50IGVsZW1lbnQsIE1XaW5kb3cgaG9zdFdpbmRvdywgT2JqZWN0IHVpQ29udGFpbmVyLAorCQkJSUVjbGlwc2VDb250ZXh0IGhvc3RDb250ZXh0KSB7CisJCS8vIFRoaXMgaXMgc3VidGxlOyB1bmxlc3MgdGhlIGVsZW1lbnQgaXMgaG9va2VkIGludG8gdGhlIG1vZGVsIGl0IHdvbid0IGZpcmUgZXZlbnRzCisJCWhvc3RXaW5kb3cuZ2V0U2hhcmVkRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7CisJCWVsZW1lbnQuZ2V0VGFncygpLmFkZChIT1NURURfRUxFTUVOVCk7CisKKwkJSVByZXNlbnRhdGlvbkVuZ2luZSByZW5kZXJlciA9IGhvc3RXaW5kb3cuZ2V0Q29udGV4dCgpLmdldChJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzKTsKKwkJcmVuZGVyZXIuY3JlYXRlR3VpKGVsZW1lbnQsIHVpQ29udGFpbmVyLCBob3N0Q29udGV4dCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNIb3N0ZWRFbGVtZW50KE1VSUVsZW1lbnQgZWxlbWVudCwgTVdpbmRvdyBob3N0V2luZG93KSB7CisJCU1VSUVsZW1lbnQgY3VyRWxlbWVudCA9IGVsZW1lbnQ7CisJCXdoaWxlIChjdXJFbGVtZW50ICE9IG51bGwgJiYgIWN1ckVsZW1lbnQuZ2V0VGFncygpLmNvbnRhaW5zKEhPU1RFRF9FTEVNRU5UKSkgeworCQkJaWYgKGN1ckVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCkgIT0gbnVsbCkgeworCQkJCWN1ckVsZW1lbnQgPSBjdXJFbGVtZW50LmdldEN1clNoYXJlZFJlZigpOworCQkJfSBlbHNlIHsKKwkJCQljdXJFbGVtZW50ID0gY3VyRWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJfQorCisJCWlmIChjdXJFbGVtZW50ID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBob3N0V2luZG93LmdldFNoYXJlZEVsZW1lbnRzKCkuY29udGFpbnMoY3VyRWxlbWVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9PcGFxdWVFbGVtZW50VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9PcGFxdWVFbGVtZW50VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTU4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL09wYXF1ZUVsZW1lbnRVdGlsLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EaXJlY3RNZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1EaXJlY3RUb29sSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVTZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEl0ZW07CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgJ29wYXF1ZScgbWVudSBhbmQgdG9vbCBiYXIgZWxlbWVudHMgaW4gdGhlCisgKiBtb2RlbC4KKyAqLworcHVibGljIGNsYXNzIE9wYXF1ZUVsZW1lbnRVdGlsIHsKKworCS8qKgorCSAqIEEgdGFnIHZhbHVlIHRoYXQgaW5kaWNhdGVzIGEgbWVudSwgbWVudSBpdGVtLCBtZW51IHNlcGFyYXRvciBvciB0b29sIGl0ZW0gaXMgJ29wYXF1ZScKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BBUVVFX1RBRyA9ICJPcGFxdWUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBIHRyYW5zaWVudCB2YWx1ZSBrZXkgZm9yIHRoZSAnb3BhcXVlIGl0ZW0nCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QQVFVRV9JVEVNX0tFWSA9ICJPcGFxdWVJdGVtIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmVtb3ZlIHRoZSAnb3BhcXVlIGl0ZW0nIGZyb20gdGhlIFVJIEVsZW1lbnQKKwkgKgorCSAqIEBwYXJhbSB1aUVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBVSSBlbGVtZW50CisJICogQHJldHVybiB0aGUgcmVtb3ZlZCAnb3BhcXVlIGl0ZW0nIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3QgY2xlYXJPcGFxdWVJdGVtKE1VSUVsZW1lbnQgdWlFbGVtZW50KSB7CisJCXJldHVybiB1aUVsZW1lbnQuZ2V0VHJhbnNpZW50RGF0YSgpLnJlbW92ZShPUEFRVUVfSVRFTV9LRVkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBvcGFxdWUgbWVudQorCSAqCisJICogQHJldHVybiBhIG5ldyBvcGFxdWUgbWVudQorCSAqLworCXB1YmxpYyBzdGF0aWMgTU1lbnUgY3JlYXRlT3BhcXVlTWVudSgpIHsKKwkJZmluYWwgTU1lbnUgbWVudSA9IE1NZW51RmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVNZW51KCk7CisJCW1lbnUuZ2V0VGFncygpLmFkZChPUEFRVUVfVEFHKTsKKwkJcmV0dXJuIG1lbnU7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIG9wYXF1ZSBtZW51IGl0ZW0KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgb3BhcXVlIG1lbnUgaXRlbS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1NZW51SXRlbSBjcmVhdGVPcGFxdWVNZW51SXRlbSgpIHsKKwkJZmluYWwgTU1lbnVJdGVtIGl0ZW0gPSBNTWVudUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlRGlyZWN0TWVudUl0ZW0oKTsKKwkJaXRlbS5nZXRUYWdzKCkuYWRkKE9QQVFVRV9UQUcpOworCQlyZXR1cm4gaXRlbTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gb3BhcXVlIG1lbnUgc2VwYXJhdG9yCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IG9wYXF1ZSBtZW51IHNlcGFyYXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgTU1lbnVTZXBhcmF0b3IgY3JlYXRlT3BhcXVlTWVudVNlcGFyYXRvcigpIHsKKwkJZmluYWwgTU1lbnVTZXBhcmF0b3Igc2VwYXJhdG9yID0gTU1lbnVGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU1lbnVTZXBhcmF0b3IoKTsKKwkJc2VwYXJhdG9yLmdldFRhZ3MoKS5hZGQoT1BBUVVFX1RBRyk7CisJCXJldHVybiBzZXBhcmF0b3I7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIG9wYXF1ZSB0b29sIGl0ZW0KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgb3BhcXVlIHRvb2wgaXRlbS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1Ub29sSXRlbSBjcmVhdGVPcGFxdWVUb29sSXRlbSgpIHsKKwkJZmluYWwgTVRvb2xJdGVtIGl0ZW0gPSBNTWVudUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlRGlyZWN0VG9vbEl0ZW0oKTsKKwkJaXRlbS5nZXRUYWdzKCkuYWRkKE9QQVFVRV9UQUcpOworCQlyZXR1cm4gaXRlbTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlICdvcGFxdWUgaXRlbScgYXNzb2NpYXRlZCB3aXRoIHRoZSBVSSBFbGVtZW50LgorCSAqCisJICogQHBhcmFtIHVpRWxlbWVudAorCSAqICAgICAgICAgICAgYSBVSSBlbGVtZW50CisJICogQHJldHVybiB0aGUgb3BhcXVlIGl0ZW0gb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRPcGFxdWVJdGVtKE1VSUVsZW1lbnQgdWlFbGVtZW50KSB7CisJCXJldHVybiB1aUVsZW1lbnQuZ2V0VHJhbnNpZW50RGF0YSgpLmdldChPUEFRVUVfSVRFTV9LRVkpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHdoZXRoZXIgYSBtZW51IGVsZW1lbnQgaXMgYW4gb3BhcXVlIG1lbnVlCisJICoKKwkgKiBAcGFyYW0gaXRlbQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaXMgYW4gJ29wYXF1ZScgbWVudQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09wYXF1ZU1lbnUoTVVJRWxlbWVudCBpdGVtKSB7CisJCXJldHVybiBpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIE1NZW51ICYmIGl0ZW0uZ2V0VGFncygpLmNvbnRhaW5zKE9QQVFVRV9UQUcpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHdoZXRoZXIgYSBtZW51IGVsZW1lbnQgaXMgYW4gb3BhcXVlIG1lbnUgaXRlbQorCSAqCisJICogQHBhcmFtIGl0ZW0KKwkgKiAgICAgICAgICAgIGEgbWVudSBpdGVtLgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1lbnUgZWxlbWVudCBpcyBhbiAnb3BhcXVlJyBtZW51IGl0ZW0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcGFxdWVNZW51SXRlbShNVUlFbGVtZW50IGl0ZW0pIHsKKwkJcmV0dXJuIGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgTURpcmVjdE1lbnVJdGVtCisJCQkJJiYgaXRlbS5nZXRUYWdzKCkuY29udGFpbnMoT1BBUVVFX1RBRyk7CisJfQorCisJLyoqCisJICogVGVzdHMgd2hldGhlciBhIG1lbnUgZWxlbWVudCBpcyBhbiBvcGFxdWUgbWVudSBzZXBhcmF0b3IKKwkgKgorCSAqIEBwYXJhbSBpdGVtCisJICogICAgICAgICAgICBhIG1lbnUgaXRlbS4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZW51IGVsZW1lbnQgaXMgYW4gJ29wYXF1ZScgc2VwYXJhdG9yCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3BhcXVlTWVudVNlcGFyYXRvcihNVUlFbGVtZW50IGl0ZW0pIHsKKwkJcmV0dXJuIGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgTU1lbnVTZXBhcmF0b3IKKwkJCQkmJiBpdGVtLmdldFRhZ3MoKS5jb250YWlucyhPUEFRVUVfVEFHKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB3aGV0aGVyIGEgVUkgZWxlbWVudCBpcyBhbiAnb3BhcXVlJyB0b29sIGl0ZW0KKwkgKgorCSAqIEBwYXJhbSB1aUVsZW1lbnQKKwkgKiAgICAgICAgICAgIGEgVUkgZWxlbWVudC4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0b29sIGl0ZW0gaXMgJ29wYXF1ZScKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcGFxdWVUb29sSXRlbShNVUlFbGVtZW50IHVpRWxlbWVudCkgeworCQlyZXR1cm4gdWlFbGVtZW50ICE9IG51bGwgJiYgdWlFbGVtZW50IGluc3RhbmNlb2YgTURpcmVjdFRvb2xJdGVtCisJCQkJJiYgdWlFbGVtZW50LmdldFRhZ3MoKS5jb250YWlucyhPUEFRVUVfVEFHKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlICdvcGFxdWUgaXRlbScgYXNzb2NpYXRlZCB3aXRoIHRoZSBVSSBFbGVtZW50LgorCSAqCisJICogQHBhcmFtIHVpRWxlbWVudAorCSAqICAgICAgICAgICAgdGhlIFVJIEVsZW1lbnQuCisJICogQHBhcmFtIG9wYXF1ZUl0ZW0KKwkgKiAgICAgICAgICAgIHRoZSBvcGFxdWUgaXRlbS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3BhcXVlSXRlbShNVUlFbGVtZW50IHVpRWxlbWVudCwgT2JqZWN0IG9wYXF1ZUl0ZW0pIHsKKwkJdWlFbGVtZW50LmdldFRyYW5zaWVudERhdGEoKS5wdXQoT1BBUVVFX0lURU1fS0VZLCBvcGFxdWVJdGVtKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUGFyYW1ldGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmM2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSVBhcmFtZXRlclZhbHVlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklUeXBlZFBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5jb21tb24uSGFuZGxlT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CisKKy8qKgorICogPHA+CisgKiBBIHBhcmFtZXRlciBmb3IgYSBjb21tYW5kLiBBIHBhcmFtZXRlciBpZGVudGlmaWVzIGEgdHlwZSBvZiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjb21tYW5kIG1pZ2h0CisgKiBhY2NlcHQuIEZvciBleGFtcGxlLCBhICJTaG93IFZpZXciIGNvbW1hbmQgbWlnaHQgYWNjZXB0IHRoZSBpZCBvZiBhIHZpZXcgZm9yIGRpc3BsYXkuIFRoaXMKKyAqIHBhcmFtZXRlciBhbHNvIGlkZW50aWZpZXMgcG9zc2libGUgdmFsdWVzLCBmb3IgZGlzcGxheSBpbiB0aGUgdXNlciBpbnRlcmZhY2UuCisgKiA8L3A+CisgKiA8cD4KKyAqIFBhcmFtZXRlcnMgYXJlIG11dGFibGUsIGFuZCBjYW4gY2hhbmdlIGFzIHRoZSBjb21tYW5kIGNoYW5nZXMuIE5vdGlmaWNhdGlvbnMgd2lsbCBub3QgYmUgc2VudCBpZgorICogdGhlIHBhcmFtZXRlciBpdHNlbGYgY2hhbmdlcy4gTGlzdGVuZXJzIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgY29tbWFuZC4KKyAqIDwvcD4KKyAqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXIgaW1wbGVtZW50cyBJUGFyYW1ldGVyLCBJVHlwZWRQYXJhbWV0ZXIgeworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgYXR0cmlidXRlIGNvbnRhaW4gdGhlIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHRvIHJldHJpZXZlCisJICogdGhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIDxjb2RlPklQYXJhbWV0ZXJWYWx1ZXM8L2NvZGU+LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUVTID0gInZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBjb25zdGFudCBpbnRlZ2VyIGhhc2ggY29kZSB2YWx1ZSBtZWFuaW5nIHRoZSBoYXNoIGNvZGUgaGFzIG5vdCB5ZXQgYmVlbiBjb21wdXRlZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9DT0RFX05PVF9DT01QVVRFRCA9IC0xOworCisJLyoqCisJICogQSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgaGFzaCBjb2RlIGZvciBhbGwgc2NoZW1lcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKKworCS8qKgorCSAqIFRoZSBzZWVkIGZvciB0aGUgaGFzaCBjb2RlIGZvciBhbGwgc2NoZW1lcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9JTklUSUFMID0gSGFuZGxlT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5oYXNoQ29kZSgpOworCisJLyoqCisJICogVGhlIGhhc2ggY29kZSBmb3IgdGhpcyBvYmplY3QuIFRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgbGF6aWx5LCBhbmQgbWFya2VkIGFzIGludmFsaWQgd2hlbiBvbmUKKwkgKiBvZiB0aGUgdmFsdWVzIG9uIHdoaWNoIGl0IGlzIGJhc2VkIGNoYW5nZXMuCisJICovCisJcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2hDb2RlID0gSEFTSF9DT0RFX05PVF9DT01QVVRFRDsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIG9iamVjdC4gVGhpcyBpZGVudGlmaWVyIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBvYmplY3RzIG9mIHRoZQorCSAqIHNhbWUgdHlwZSBhbmQgc2hvdWxkIG5ldmVyIGNoYW5nZS4gVGhpcyB2YWx1ZSB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaWQ7CisKKwkvKioKKwkgKiBUaGUgbm9uLWV4dGVybmFsaXplZCBuYW1lIG9mIHRoaXMgcGFyYW1ldGVyLiBUaGUgbmFtZSBpcyB1c2VkIGFzIHRoZSBpbiBhIG5hbWUtdmFsdWUKKwkgKiBwYXJhbWV0ZXIgbWFwLiBUaGlzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyBvcHRpb25hbCAoYXMgb3Bwb3NlZCB0byByZXF1aXJlZCkuCisJICovCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIG9wdGlvbmFsOworCisJLyoqCisJICogVGhlIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyLiBUaGlzIHZhbHVlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdAorCSAqIHR5cGVkLgorCSAqLworCXByaXZhdGUgZmluYWwgUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXJUeXBlOworCisJLyoqCisJICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4gVGhpcyBzdHJpbmcgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LCBhbmQgaXMKKwkgKiBub3QgbWVhbnQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGxhemlseSwgYW5kIGlzIGNsZWFyZWQgaWYgb25lCisJICogb2YgaXRzIGRlcGVuZGVudCB2YWx1ZXMgY2hhbmdlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgdHJhbnNpZW50IFN0cmluZyBzdHJpbmcgPSBudWxsOworCisJLyoqCisJICogVGhlIGFjdHVhbCA8Y29kZT5JUGFyYW1ldGVyVmFsdWVzPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyBsYXppbHkgbG9hZGVkIGZyb20gdGhlCisJICogPGNvZGU+dmFsdWVzQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+LCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjbGFzcy1sb2FkaW5nLgorCSAqLworCXByaXZhdGUgdHJhbnNpZW50IElQYXJhbWV0ZXJWYWx1ZXMgdmFsdWVzID0gbnVsbDsKKworCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhbHVlc0NvbmZpZ3VyYXRpb25FbGVtZW50OworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5QYXJhbWV0ZXI8L2NvZGU+IHdpdGggYWxsIG9mIGl0cyB2YWx1ZXMgcHJlLWRlZmluZWQuCisJICoKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhcmFtZXRlcjsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIFRoZSBuYW1lIGZvciB0aGlzIHBhcmFtZXRlcjsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHZhbHVlcworCSAqICAgICAgICAgICAgVGhlIHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXI7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlCisJICogICAgICAgICAgICB0aGUgdHlwZSBmb3IgdGhpcyBwYXJhbWV0ZXI7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFybWV0ZXIgZG9lc24ndAorCSAqICAgICAgICAgICAgZGVjbGFyZSB0eXBlLgorCSAqIEBwYXJhbSBvcHRpb25hbAorCSAqICAgICAgICAgICAgV2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbCAoYXMgb3Bwb3NlZCB0byByZXF1aXJlZCkuCisJICovCisJcHVibGljIFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgaWQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmFsdWVzLAorCQkJZmluYWwgUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXJUeXBlLCBmaW5hbCBib29sZWFuIG9wdGlvbmFsKSB7CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgYSBwYXJhbWV0ZXIgd2l0aCBhIG51bGwgaWQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgbmFtZSBvZiBhIHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJdGhpcy52YWx1ZXNDb25maWd1cmF0aW9uRWxlbWVudCA9IHZhbHVlczsKKwkJdGhpcy5pZCA9IGlkOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnBhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXJUeXBlOworCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7CisJfQorCisJLyoqCisJICogVGVzdHMgd2hldGhlciB0aGlzIG9iamVjdCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdC4gQSBwYXJhbWV0ZXIgaXMgb25seSBlcXVhbCB0byBhbm90aGVyCisJICogcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUgcHJvcGVydGllcy4KKwkgKgorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIFRoZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1YWw7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKHRoaXMgPT0gb2JqZWN0KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFBhcmFtZXRlcikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBvYmplY3Q7CisJCWlmICghVXRpbC5lcXVhbHMoaWQsIHBhcmFtZXRlci5pZCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIVV0aWwuZXF1YWxzKG5hbWUsIHBhcmFtZXRlci5uYW1lKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghVXRpbC5lcXVhbHModmFsdWVzLCBwYXJhbWV0ZXIudmFsdWVzKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIFV0aWwuZXF1YWxzKG9wdGlvbmFsLCBwYXJhbWV0ZXIub3B0aW9uYWwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBQYXJhbWV0ZXJUeXBlIGdldFBhcmFtZXRlclR5cGUoKSB7CisJCXJldHVybiBwYXJhbWV0ZXJUeXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBJUGFyYW1ldGVyVmFsdWVzIGdldFZhbHVlcygpIHRocm93cyBQYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb24geworCQlpZiAodmFsdWVzID09IG51bGwpIHsKKwkJCWlmICh2YWx1ZXNDb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJdmFsdWVzID0gKElQYXJhbWV0ZXJWYWx1ZXMpIHZhbHVlc0NvbmZpZ3VyYXRpb25FbGVtZW50CisJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX1ZBTFVFUyk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCXRocm93IG5ldyBQYXJhbWV0ZXJWYWx1ZXNFeGNlcHRpb24oIlByb2JsZW0gY3JlYXRpbmcgcGFyYW1ldGVyIHZhbHVlcyIsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJfSBjYXRjaCAoZmluYWwgQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhyb3cgbmV3IFBhcmFtZXRlclZhbHVlc0V4Y2VwdGlvbigKKwkJCQkJCQkiUGFyYW1ldGVyIHZhbHVlcyB3ZXJlIG5vdCBhbiBpbnN0YW5jZSBvZiBJUGFyYW1ldGVyVmFsdWVzIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZhbHVlcyA9IG5ldyBJUGFyYW1ldGVyVmFsdWVzKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJWYWx1ZXMoKSB7CisJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKKwkJaWYgKGhhc2hDb2RlID09IEhBU0hfQ09ERV9OT1RfQ09NUFVURUQpIHsKKwkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKGlkKTsKKwkJCWlmIChoYXNoQ29kZSA9PSBIQVNIX0NPREVfTk9UX0NPTVBVVEVEKSB7CisJCQkJaGFzaENvZGUrKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaGFzaENvZGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKKwkJcmV0dXJuIG9wdGlvbmFsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChzdHJpbmcgPT0gbnVsbCkgeworCQkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworCQkJYnVmZmVyLmFwcGVuZCgiUGFyYW1ldGVyKCIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKGlkKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKKwkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7CisJCQlidWZmZXIuYXBwZW5kKCcsJyk7CisJCQlidWZmZXIuYXBwZW5kKHZhbHVlcyk7CisJCQlidWZmZXIuYXBwZW5kKCcsJyk7CisJCQlidWZmZXIuYXBwZW5kKG9wdGlvbmFsKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJyknKTsKKworCQkJc3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7CisJCX0KKworCQlyZXR1cm4gc3RyaW5nOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUGFydEFjdGl2YXRpb25IaXN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BhcnRBY3RpdmF0aW9uSGlzdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyM2MwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BhcnRBY3RpdmF0aW9uSGlzdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1FbGVtZW50Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1HZW5lcmljU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NQXJlYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworY2xhc3MgUGFydEFjdGl2YXRpb25IaXN0b3J5IHsKKworCXByaXZhdGUgUGFydFNlcnZpY2VJbXBsIHBhcnRTZXJ2aWNlOworCisJcHJpdmF0ZSBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZTsKKworCXByaXZhdGUgTGlua2VkTGlzdDxNUGFydD4gZ2VuZXJhbEFjdGl2YXRpb25IaXN0b3J5ID0gbmV3IExpbmtlZExpc3Q8TVBhcnQ+KCk7CisKKwlQYXJ0QWN0aXZhdGlvbkhpc3RvcnkoUGFydFNlcnZpY2VJbXBsIHBhcnRTZXJ2aWNlLCBFTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZSkgeworCQl0aGlzLnBhcnRTZXJ2aWNlID0gcGFydFNlcnZpY2U7CisJCXRoaXMubW9kZWxTZXJ2aWNlID0gbW9kZWxTZXJ2aWNlOworCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQlnZW5lcmFsQWN0aXZhdGlvbkhpc3RvcnkuY2xlYXIoKTsKKwl9CisKKwl2b2lkIGFjdGl2YXRlKE1QYXJ0IHBhcnQsIGJvb2xlYW4gYWN0aXZhdGVCcmFuY2gpIHsKKwkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBwYXJ0LmdldENvbnRleHQoKTsKKwkJaWYgKGFjdGl2YXRlQnJhbmNoKSB7CisJCQljb250ZXh0LmFjdGl2YXRlQnJhbmNoKCk7CisJCX0gZWxzZSB7CisJCQlJRWNsaXBzZUNvbnRleHQgcGFyZW50ID0gY29udGV4dC5nZXRQYXJlbnQoKTsKKwkJCWRvIHsKKwkJCQljb250ZXh0LmFjdGl2YXRlKCk7CisJCQkJY29udGV4dCA9IHBhcmVudDsKKwkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJCQl9IHdoaWxlIChwYXJlbnQuZ2V0KE1XaW5kb3cuY2xhc3MpICE9IG51bGwpOworCQl9CisKKwkJcHJlcGVuZChwYXJ0KTsKKwl9CisKKwkvKioKKwkgKiBQbGFjZXMgdGhlIHNwZWNpZmllZCBwYXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGFjdGl2YXRpb24gaGlzdG9yeSBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUKKwkgKiBsaXN0LiBJZiBpdCBpcyBhbHJlYWR5IGluIHRoZSBhY3RpdmF0aW9uIGhpc3RvcnksIHRoZW4gaXRzIHBvc2l0aW9uIHdpbGwgbm90IGNoYW5nZS4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBwb3NzaWJseSBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgYWN0aXZhdGlvbiBoaXN0b3J5CisJICovCisJdm9pZCBhcHBlbmQoTVBhcnQgcGFydCkgeworCQlpZiAoIWdlbmVyYWxBY3RpdmF0aW9uSGlzdG9yeS5jb250YWlucyhwYXJ0KSkgeworCQkJZ2VuZXJhbEFjdGl2YXRpb25IaXN0b3J5LmFkZExhc3QocGFydCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgcGFydCB0byB0aGUgZnJvbnQgb2YgdGhlIGFjdGl2YXRpb24gaGlzdG9yeS4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBpbnNlcnQgaW50byB0aGUgZnJvbnQgb2YgdGhlIGFjdGl2YXRpb24gaGlzdG9yeQorCSAqLworCXZvaWQgcHJlcGVuZChNUGFydCBwYXJ0KSB7CisJCWdlbmVyYWxBY3RpdmF0aW9uSGlzdG9yeS5yZW1vdmUocGFydCk7CisJCWdlbmVyYWxBY3RpdmF0aW9uSGlzdG9yeS5hZGRGaXJzdChwYXJ0KTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3MgdG8gc2VlIGlmIHRoaXMgZWxlbWVudCBhbmQgaXRzIHBhcmVudHMgYXJlIGFjdHVhbGx5IGJlaW5nIHJlbmRlcmVkLgorCSAqLworCWJvb2xlYW4gaXNWYWxpZChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhZWxlbWVudC5pc1RvQmVSZW5kZXJlZCgpIHx8ICFlbGVtZW50LmlzVmlzaWJsZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlNVUlFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJLy8gbWlnaHQgYmUgYSBkZXRhY2hlZCB3aW5kb3cKKwkJCXBhcmVudCA9IChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJfQorCisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGlzVmFsaWQocGFydFNlcnZpY2UuZ2V0TG9jYWxQbGFjZWhvbGRlcihlbGVtZW50KSk7CisJCX0KKworCQlyZXR1cm4gaXNWYWxpZChwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB0byBzZWUgaWYgdGhpcyBlbGVtZW50IGFuZCBpdHMgcGFyZW50cyBhcmUgYWN0dWFsbHkgYmVpbmcgcmVuZGVyZWQuCisJICovCisJYm9vbGVhbiBpc1ZhbGlkKE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSwgTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIGlmIChlbGVtZW50ID09IG51bGwgfHwgIWVsZW1lbnQuaXNUb0JlUmVuZGVyZWQoKSB8fCAhZWxlbWVudC5pc1Zpc2libGUoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJTUVsZW1lbnRDb250YWluZXI8Pz4gcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlmb3IgKE1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA6IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMocGVyc3BlY3RpdmUsIG51bGwsCisJCQkJCU1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCkpIHsKKwkJCQlpZiAocGxhY2Vob2xkZXIuZ2V0UmVmKCkgPT0gZWxlbWVudCkgeworCQkJCQlyZXR1cm4gaXNWYWxpZChwZXJzcGVjdGl2ZSwgcGxhY2Vob2xkZXIpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNV2luZG93KSB7CisJCQkJLy8gbWlnaHQgYmUgYSBkZXRhY2hlZCB3aW5kb3cKKwkJCQlyZXR1cm4gaXNWYWxpZChwZXJzcGVjdGl2ZSwgKE1VSUVsZW1lbnQpICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNR2VuZXJpY1N0YWNrICYmIHBhcmVudC5nZXRTZWxlY3RlZEVsZW1lbnQoKSAhPSBlbGVtZW50KSB7CisJCQkvLyBpZiBpbiBhIHN0YWNrLCB0aGVuIG9ubHkgdmFsaWQgaWYgd2UncmUgdGhlIHNlbGVjdGVkIGVsZW1lbnQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBpc1ZhbGlkKHBlcnNwZWN0aXZlLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkIHdpdGhpbiBhbiBNQXJlYSwgYW5kIHRvIHJldHVybiB0aGUgYXJlYSBpZiBpdAorCSAqIGlzLgorCSAqLworCXByaXZhdGUgTUFyZWEgaXNJbkFyZWEoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IGVsZW1lbnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCWlmIChwbGFjZWhvbGRlciA9PSBudWxsKSB7CisJCQlNVUlFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQkvLyBtYXkgYmUgbnVsbCBmb3IgZGV0YWNoZWQgd2luZG93cworCQkJCXBhcmVudCA9IChNVUlFbGVtZW50KSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKKwkJCX0KKwkJCXJldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24gPyBudWxsIDogcGFyZW50IGluc3RhbmNlb2YgTUFyZWEgPyAoTUFyZWEpIHBhcmVudAorCQkJCQk6IGlzSW5BcmVhKHBhcmVudCk7CisJCX0KKworCQlNVUlFbGVtZW50IHBhcmVudCA9IHBsYWNlaG9sZGVyLmdldFBhcmVudCgpOworCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCS8vIG1heSBiZSBudWxsIGZvciBkZXRhY2hlZCB3aW5kb3dzCisJCQlwYXJlbnQgPSAoTVVJRWxlbWVudCkgKChFT2JqZWN0KSBwbGFjZWhvbGRlcikuZUNvbnRhaW5lcigpOworCQl9CisJCXJldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24gPyBudWxsIDogcGFyZW50IGluc3RhbmNlb2YgTUFyZWEgPyAoTUFyZWEpIHBhcmVudAorCQkJCTogaXNJbkFyZWEocGFyZW50KTsKKwl9CisKKwlwcml2YXRlIE1QYXJ0IGdldEFjdGl2YXRpb25DYW5kaWRhdGUoTVBhcnQgcGFydCkgeworCQkvLyBnZXQgYWxsIHRoZSBwb3NzaWJsZSBwYXJ0cyB0aGF0IHdlIGNhbiBwb3NzaWJseSBhY3RpdmF0ZQorCQlDb2xsZWN0aW9uPE1QYXJ0PiBjYW5kaWRhdGVzID0gcGFydC5nZXRDb250ZXh0KCkuZ2V0KEVQYXJ0U2VydmljZS5jbGFzcykuZ2V0UGFydHMoKTsKKwkJcmV0dXJuIGZpbmRBY3RpdmF0aW9uQ2FuZGlkYXRlKGNhbmRpZGF0ZXMsIHBhcnQpOworCX0KKworCS8qKgorCSAqIEZpbmRzIGFuZCByZXR1cm5zIGEgcGFydCB0aGF0IGlzIGEgdmFsaWQgY2FuZGlkYXRlIHRvIGJlIGdyYW50ZWQgYWN0aXZhdGlvbi4KKwkgKi8KKwlwcml2YXRlIE1QYXJ0IGZpbmRBY3RpdmF0aW9uQ2FuZGlkYXRlKENvbGxlY3Rpb248TVBhcnQ+IGNhbmRpZGF0ZXMsIE1QYXJ0IGN1cnJlbnRseUFjdGl2ZVBhcnQpIHsKKwkJY2FuZGlkYXRlcy5yZW1vdmUoY3VycmVudGx5QWN0aXZlUGFydCk7CisKKwkJTVBsYWNlaG9sZGVyIGFjdGl2ZVBsYWNlaG9sZGVyID0gcGFydFNlcnZpY2UuZ2V0TG9jYWxQbGFjZWhvbGRlcihjdXJyZW50bHlBY3RpdmVQYXJ0KTsKKwkJZm9yIChNUGFydCBjYW5kaWRhdGUgOiBjYW5kaWRhdGVzKSB7CisJCQkvLyBtYWtlIHN1cmUgaXQncyByZW5kZXJlZCBhbmQgdmlzaWJsZQorCQkJaWYgKGlzVmFsaWQoY2FuZGlkYXRlKSkgeworCQkJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IHBhcnRTZXJ2aWNlLmdldExvY2FsUGxhY2Vob2xkZXIoY2FuZGlkYXRlKTsKKwkJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBwbGFjZWhvbGRlciA9PSBudWxsID8gY2FuZGlkYXRlLmdldFBhcmVudCgpCisJCQkJCQk6IHBsYWNlaG9sZGVyLmdldFBhcmVudCgpOworCQkJCS8vIHN0YWNrcyByZXF1aXJlIHNwZWNpYWwgY29uc2lkZXJhdGlvbnMgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFjdGl2YXRlIHNvbWV0aGluZworCQkJCS8vIHRoYXQncyBub3QgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaWYgcG9zc2libGUgZ2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50CisJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1HZW5lcmljU3RhY2spIHsKKwkJCQkJTVVJRWxlbWVudCBzZWxlY3Rpb24gPSBwYXJlbnQuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJCS8vIGlmIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBhcnQsIHRoZSBjYW5kaWRhdGUgaXMgdmFsaWQKKwkJCQkJaWYgKHNlbGVjdGlvbiA9PSBhY3RpdmVQbGFjZWhvbGRlciB8fCBzZWxlY3Rpb24gPT0gY3VycmVudGx5QWN0aXZlUGFydCkgeworCQkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJCQkJfQorCisJCQkJCS8vIGlmIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIHRoZSBjdXJyZW50IGNhbmRpZGF0ZSwgdGhlIGNhbmRpZGF0ZSBpcyB2YWxpZAorCQkJCQlpZiAoc2VsZWN0aW9uID09IGNhbmRpZGF0ZSB8fCBzZWxlY3Rpb24gPT0gcGxhY2Vob2xkZXIpIHsKKwkJCQkJCXJldHVybiBjYW5kaWRhdGU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBub3QgaW4gYSBzdGFjaywganVzdCByZXR1cm4gdGhlIGNhbmRpZGF0ZSB0aGVuCisJCQkJCXJldHVybiBjYW5kaWRhdGU7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCU1QYXJ0IGdldEFjdGl2YXRpb25DYW5kaWRhdGUoQ29sbGVjdGlvbjxNUGFydD4gdmFsaWRQYXJ0cykgeworCQkvLyBjaGVjayBhY3RpdmF0aW9uIGhpc3RvcnksIHNpbmNlIHRoZSBoaXN0b3J5IGlzIGdsb2JhbCwgd2UgbmVlZCB0byBmaWx0ZXIgaXQgZG93biBmaXJzdAorCQlDb2xsZWN0aW9uPE1QYXJ0PiB2YWxpZENhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PE1QYXJ0PigpOworCQlmb3IgKE1QYXJ0IHZhbGlkUGFydCA6IGdlbmVyYWxBY3RpdmF0aW9uSGlzdG9yeSkgeworCQkJaWYgKHZhbGlkUGFydHMuY29udGFpbnModmFsaWRQYXJ0KSkgeworCQkJCXZhbGlkQ2FuZGlkYXRlcy5hZGQodmFsaWRQYXJ0KTsKKwkJCX0KKwkJfQorCisJCU1QYXJ0IGNhbmRpZGF0ZSA9IGZpbmRBY3RpdmF0aW9uQ2FuZGlkYXRlKHZhbGlkQ2FuZGlkYXRlcyk7CisJCWlmIChjYW5kaWRhdGUgPT0gbnVsbCkgeworCQkJdmFsaWRQYXJ0cy5yZW1vdmVBbGwodmFsaWRDYW5kaWRhdGVzKTsKKwkJCXJldHVybiBmaW5kQWN0aXZhdGlvbkNhbmRpZGF0ZSh2YWxpZFBhcnRzKTsKKwkJfQorCQlyZXR1cm4gY2FuZGlkYXRlOworCX0KKworCXByaXZhdGUgTVBhcnQgZmluZEFjdGl2YXRpb25DYW5kaWRhdGUoQ29sbGVjdGlvbjxNUGFydD4gY2FuZGlkYXRlcykgeworCQlmb3IgKE1QYXJ0IGNhbmRpZGF0ZSA6IGNhbmRpZGF0ZXMpIHsKKwkJCS8vIG1ha2Ugc3VyZSBpdCdzIHJlbmRlcmVkIGFuZCB2aXNpYmxlCisJCQlpZiAoaXNWYWxpZChjYW5kaWRhdGUpKSB7CisJCQkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gcGFydFNlcnZpY2UuZ2V0TG9jYWxQbGFjZWhvbGRlcihjYW5kaWRhdGUpOworCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudCA9IHBsYWNlaG9sZGVyID09IG51bGwgPyBjYW5kaWRhdGUuZ2V0UGFyZW50KCkKKwkJCQkJCTogcGxhY2Vob2xkZXIuZ2V0UGFyZW50KCk7CisJCQkJLy8gc3RhY2tzIHJlcXVpcmUgc3BlY2lhbCBjb25zaWRlcmF0aW9ucyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gYWN0aXZhdGUgc29tZXRoaW5nCisJCQkJLy8gdGhhdCdzIG5vdCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpZiBwb3NzaWJsZSBnZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQKKwkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTUdlbmVyaWNTdGFjaykgeworCQkJCQlNVUlFbGVtZW50IHNlbGVjdGlvbiA9IHBhcmVudC5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQkJLy8gaWYgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgdGhlIGN1cnJlbnQgY2FuZGlkYXRlLCB0aGUgY2FuZGlkYXRlIGlzIHZhbGlkCisJCQkJCWlmIChzZWxlY3Rpb24gPT0gY2FuZGlkYXRlIHx8IHNlbGVjdGlvbiA9PSBwbGFjZWhvbGRlcikgeworCQkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIG5vdCBpbiBhIHN0YWNrLCBqdXN0IHJldHVybiB0aGUgY2FuZGlkYXRlIHRoZW4KKwkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJTVBhcnQgZ2V0TmV4dEFjdGl2YXRpb25DYW5kaWRhdGUoQ29sbGVjdGlvbjxNUGFydD4gdmFsaWRQYXJ0cywgTVBhcnQgcGFydCkgeworCQlNQXJlYSBhcmVhID0gaXNJbkFyZWEocGFydCk7CisJCWlmIChhcmVhICE9IG51bGwpIHsKKwkJCS8vIGZvY3VzIHNob3VsZCBzdGF5IGluIHRoZSBhcmVhIGlmIHBvc3NpYmxlCisJCQlNUGFydCBjYW5kaWRhdGUgPSBnZXRTaWJsaW5nQWN0aXZhdGlvbkNhbmRpZGF0ZShwYXJ0KTsKKwkJCWlmIChjYW5kaWRhdGUgIT0gbnVsbCkgeworCQkJCXJldHVybiBjYW5kaWRhdGU7CisJCQl9CisKKwkJCS8vIG5vIHNpYmxpbmcgY2FuZGlkYXRlLCBmaW5kIGFub3RoZXIgcGFydCBpbiB0aGUgYXJlYSB0byBhY3RpdmF0ZQorCQkJY2FuZGlkYXRlID0gZmluZEFjdGl2YXRpb25DYW5kaWRhdGUoCisJCQkJCW1vZGVsU2VydmljZS5maW5kRWxlbWVudHMoYXJlYSwgbnVsbCwgTVBhcnQuY2xhc3MsIG51bGwpLCBwYXJ0KTsKKwkJCWlmIChjYW5kaWRhdGUgIT0gbnVsbCkgeworCQkJCXJldHVybiBjYW5kaWRhdGU7CisJCQl9CisJCX0KKworCQkvLyBjaGVjayBhY3RpdmF0aW9uIGhpc3RvcnksIHNpbmNlIHRoZSBoaXN0b3J5IGlzIGdsb2JhbCwgd2UgbmVlZCB0byBmaWx0ZXIgaXQgZG93biBmaXJzdAorCQlDb2xsZWN0aW9uPE1QYXJ0PiB2YWxpZENhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PE1QYXJ0PigpOworCQlmb3IgKE1QYXJ0IHZhbGlkUGFydCA6IGdlbmVyYWxBY3RpdmF0aW9uSGlzdG9yeSkgeworCQkJaWYgKHZhbGlkUGFydHMuY29udGFpbnModmFsaWRQYXJ0KSkgeworCQkJCXZhbGlkQ2FuZGlkYXRlcy5hZGQodmFsaWRQYXJ0KTsKKwkJCX0KKwkJfQorCisJCU1QYXJ0IGNhbmRpZGF0ZSA9IGZpbmRBY3RpdmF0aW9uQ2FuZGlkYXRlKHZhbGlkQ2FuZGlkYXRlcywgcGFydCk7CisJCXJldHVybiBjYW5kaWRhdGUgPT0gbnVsbCA/IGdldEFjdGl2YXRpb25DYW5kaWRhdGUocGFydCkgOiBjYW5kaWRhdGU7CisJfQorCisJdm9pZCBmb3JnZXQoTVdpbmRvdyB3aW5kb3csIE1QYXJ0IHBhcnQsIGJvb2xlYW4gZnVsbCkgeworCQlpZiAoZnVsbCkgeworCQkJZ2VuZXJhbEFjdGl2YXRpb25IaXN0b3J5LnJlbW92ZShwYXJ0KTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyIDogbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3aW5kb3csIG51bGwsCisJCQkJCU1QbGFjZWhvbGRlci5jbGFzcywgbnVsbCkpIHsKKwkJCQkvLyBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGxhY2Vob2xkZXIgYXJvdW5kLCB3ZSBzaG91bGQga2VlcCB0aGlzCisJCQkJaWYgKHBsYWNlaG9sZGVyLmdldFJlZigpID09IHBhcnQgJiYgcGxhY2Vob2xkZXIuaXNUb0JlUmVuZGVyZWQoKSkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCisJCQlnZW5lcmFsQWN0aXZhdGlvbkhpc3RvcnkucmVtb3ZlKHBhcnQpOworCQl9CisJfQorCisJTVBhcnQgZ2V0QWN0aXZhdGlvbkNhbmRpZGF0ZShNUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUpIHsKKwkJZm9yIChNUGFydCBjYW5kaWRhdGUgOiBnZW5lcmFsQWN0aXZhdGlvbkhpc3RvcnkpIHsKKwkJCWlmIChwYXJ0U2VydmljZS5pc0luQ29udGFpbmVyKHBlcnNwZWN0aXZlLCBjYW5kaWRhdGUpCisJCQkJCSYmIGlzVmFsaWQocGVyc3BlY3RpdmUsIGNhbmRpZGF0ZSkpIHsKKwkJCQlyZXR1cm4gY2FuZGlkYXRlOworCQkJfQorCQl9CisKKwkJTGlzdDxTdHJpbmc+IGFjdGl2ZVRhZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlhY3RpdmVUYWcuYWRkKEVQYXJ0U2VydmljZS5BQ1RJVkVfT05fQ0xPU0VfVEFHKTsKKwkJTGlzdDxNUGFydD4gYWN0aXZlQ2FuZGlkYXRlcyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMocGVyc3BlY3RpdmUsIG51bGwsIE1QYXJ0LmNsYXNzLAorCQkJCWFjdGl2ZVRhZyk7CisJCWlmIChhY3RpdmVDYW5kaWRhdGVzLnNpemUoKSA+IDApIHsKKwkJCWFjdGl2ZUNhbmRpZGF0ZXMuZ2V0KDApLmdldFRhZ3MoKS5yZW1vdmUoRVBhcnRTZXJ2aWNlLkFDVElWRV9PTl9DTE9TRV9UQUcpOworCQkJTVBhcnQgY2FuZGlkYXRlID0gYWN0aXZlQ2FuZGlkYXRlcy5nZXQoMCk7CisJCQlpZiAocGFydFNlcnZpY2UuaXNJbkNvbnRhaW5lcihwZXJzcGVjdGl2ZSwgY2FuZGlkYXRlKQorCQkJCQkmJiBpc1ZhbGlkKHBlcnNwZWN0aXZlLCBjYW5kaWRhdGUpKSB7CisJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJCX0KKwkJfQorCisJCUNvbGxlY3Rpb248TVBhcnQ+IGNhbmRpZGF0ZXMgPSBwZXJzcGVjdGl2ZS5nZXRDb250ZXh0KCkuZ2V0KEVQYXJ0U2VydmljZS5jbGFzcykuZ2V0UGFydHMoKTsKKwkJZm9yIChNUGFydCBjYW5kaWRhdGUgOiBjYW5kaWRhdGVzKSB7CisJCQlpZiAoaXNWYWxpZChwZXJzcGVjdGl2ZSwgY2FuZGlkYXRlKSkgeworCQkJCXJldHVybiBjYW5kaWRhdGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBNUGFydCBnZXRTaWJsaW5nQWN0aXZhdGlvbkNhbmRpZGF0ZShNUGFydCBwYXJ0KSB7CisJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IHBhcnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCU1VSUVsZW1lbnQgY2FuZGlkYXRlID0gZ2V0U2libGluZ1NlbGVjdGlvbkNhbmRpZGF0ZShwYXJ0LCBwbGFjZWhvbGRlciA9PSBudWxsID8gcGFydAorCQkJCTogcGxhY2Vob2xkZXIpOworCQlyZXR1cm4gKE1QYXJ0KSAoY2FuZGlkYXRlIGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyID8gKChNUGxhY2Vob2xkZXIpIGNhbmRpZGF0ZSkuZ2V0UmVmKCkKKwkJCQk6IGNhbmRpZGF0ZSk7CisJfQorCisJcHJpdmF0ZSBNVUlFbGVtZW50IGdldFNpYmxpbmdTZWxlY3Rpb25DYW5kaWRhdGUoTVBhcnQgcGFydCwgTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCUxpc3Q8TVVJRWxlbWVudD4gc2libGluZ3MgPSBlbGVtZW50LmdldFBhcmVudCgpLmdldENoaWxkcmVuKCk7CisJCWZvciAoTVBhcnQgcHJldmlvdXNseUFjdGl2YXRlZFBhcnQgOiBnZW5lcmFsQWN0aXZhdGlvbkhpc3RvcnkpIHsKKwkJCWlmIChwcmV2aW91c2x5QWN0aXZhdGVkUGFydCAhPSBwYXJ0ICYmIGlzVmFsaWQocHJldmlvdXNseUFjdGl2YXRlZFBhcnQpKSB7CisJCQkJaWYgKHNpYmxpbmdzLmNvbnRhaW5zKHByZXZpb3VzbHlBY3RpdmF0ZWRQYXJ0KSkgeworCQkJCQlyZXR1cm4gcHJldmlvdXNseUFjdGl2YXRlZFBhcnQ7CisJCQkJfQorCisJCQkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gcGFydFNlcnZpY2UuZ2V0TG9jYWxQbGFjZWhvbGRlcihwcmV2aW91c2x5QWN0aXZhdGVkUGFydCk7CisJCQkJaWYgKHBsYWNlaG9sZGVyICE9IG51bGwgJiYgcGxhY2Vob2xkZXIuaXNUb0JlUmVuZGVyZWQoKQorCQkJCQkJJiYgc2libGluZ3MuY29udGFpbnMocGxhY2Vob2xkZXIpKSB7CisJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJTVVJRWxlbWVudCBnZXRTaWJsaW5nU2VsZWN0aW9uQ2FuZGlkYXRlKE1QYXJ0IHBhcnQpIHsKKwkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gcGFydC5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJcmV0dXJuIGdldFNpYmxpbmdTZWxlY3Rpb25DYW5kaWRhdGUocGFydCwgcGxhY2Vob2xkZXIgPT0gbnVsbCA/IHBhcnQgOiBwbGFjZWhvbGRlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9QYXJ0U2VydmljZUNyZWF0aW9uRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUGFydFNlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzNmExYwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUGFydFNlcnZpY2VDcmVhdGlvbkZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuSUluamVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJ0U2VydmljZUNyZWF0aW9uRnVuY3Rpb24gZXh0ZW5kcyBDb250ZXh0RnVuY3Rpb24geworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb21wdXRlKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgY29udGV4dEtleSkgeworCQkvLyBsb29rIGZvciB0aGUgdG9wLW1vc3QgTVdpbmRvdyBpbiB0aGUgY29udGV4dCBjaGFpbjoKKworCQkvLyAxc3Q6IGdvIHVwIHRoZSB0cmVlIHRvIGZpbmQgdG9wbW9zdCBNV2luZG93CisJCU1XaW5kb3cgd2luZG93ID0gbnVsbDsKKwkJSUVjbGlwc2VDb250ZXh0IGN1cnJlbnQgPSBjb250ZXh0OworCQlkbyB7CisJCQlNQ29udGV4dCBtb2RlbCA9IGN1cnJlbnQuZ2V0KE1Db250ZXh0LmNsYXNzKTsKKwkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE1XaW5kb3cpCisJCQkJd2luZG93ID0gKE1XaW5kb3cpIG1vZGVsOworCQkJY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisJCX0gd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCk7CisKKwkJaWYgKHdpbmRvdyA9PSBudWxsKSB7CisJCQlpZiAoY29udGV4dC5nZXQoTUFwcGxpY2F0aW9uLmNsYXNzKSAhPSBudWxsKSB7CisJCQkJLy8gY2FsbGVkIGZyb20gQXBwbGljYXRpb24gc2NvcGUKKwkJCQlyZXR1cm4gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShBcHBsaWNhdGlvblBhcnRTZXJ2aWNlSW1wbC5jbGFzcywgY29udGV4dCk7CisJCQl9CisJCQlyZXR1cm4gSUluamVjdG9yLk5PVF9BX1ZBTFVFOworCQl9CisKKwkJSUVjbGlwc2VDb250ZXh0IHdpbmRvd0NvbnRleHQgPSB3aW5kb3cuZ2V0Q29udGV4dCgpOworCQlQYXJ0U2VydmljZUltcGwgc2VydmljZSA9IHdpbmRvd0NvbnRleHQuZ2V0TG9jYWwoUGFydFNlcnZpY2VJbXBsLmNsYXNzKTsKKwkJaWYgKHNlcnZpY2UgPT0gbnVsbCkgeworCQkJc2VydmljZSA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoUGFydFNlcnZpY2VJbXBsLmNsYXNzLCB3aW5kb3dDb250ZXh0KTsKKwkJCXdpbmRvd0NvbnRleHQuc2V0KFBhcnRTZXJ2aWNlSW1wbC5jbGFzcywgc2VydmljZSk7CisJCX0KKwkJcmV0dXJuIHNlcnZpY2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BhcnRTZXJ2aWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9QYXJ0U2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJmZTMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9QYXJ0U2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDE0MTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIChMYXJzLlZvZ2VsQGdtYWlsLmNvbSkgLSBCdWcgNDE2MDgyCisgKiAgICAgU2ltb24gU2Nob2x6IDxzaW1vbi5zY2hvbHpAdm9nZWxsYS5jb20+IC0gQnVnIDQ1MDQxMQorICogICAgIERpcmsgRmF1dGggPGRpcmsuZmF1dGhAZ29vZ2xlbWFpbC5jb20+IC0gQnVnIDQ2Mzk2MgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHRNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuSW5qZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5QZXJzaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLk1QYXJ0RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NRWxlbWVudENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NR2VuZXJpY1N0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTUFyZWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QbGFjZWhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NQ29tcG9zaXRlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NSW5wdXRQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U2FzaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXJFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVN0YWNrRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMuRUNvbnRleHRTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLklTZXJ2aWNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRU1vZGVsU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRVBhcnRTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JUGFydExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5JU2F2ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKKworcHVibGljIGNsYXNzIFBhcnRTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEVQYXJ0U2VydmljZSB7CisKKwlwcml2YXRlIEV2ZW50SGFuZGxlciBzZWxlY3RlZEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCS8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgd2UgaGF2ZSBubyBsaXN0ZW5lcnMKKwkJCWlmICghbGlzdGVuZXJzLmlzRW1wdHkoKSkgeworCQkJCU9iamVjdCBvbGRTZWxlY3RlZCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5PTERfVkFMVUUpOworCQkJCWlmIChvbGRTZWxlY3RlZCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJCQlvbGRTZWxlY3RlZCA9ICgoTVBsYWNlaG9sZGVyKSBvbGRTZWxlY3RlZCkuZ2V0UmVmKCk7CisJCQkJfQorCisJCQkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gbnVsbDsKKwkJCQlPYmplY3Qgc2VsZWN0ZWQgPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFKTsKKwkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpIHsKKwkJCQkJcGxhY2Vob2xkZXIgPSAoTVBsYWNlaG9sZGVyKSBzZWxlY3RlZDsKKwkJCQkJc2VsZWN0ZWQgPSBwbGFjZWhvbGRlci5nZXRSZWYoKTsKKwkJCQl9CisKKwkJCQlNUGFydCBvbGRTZWxlY3RlZFBhcnQgPSBvbGRTZWxlY3RlZCBpbnN0YW5jZW9mIE1QYXJ0ID8gKE1QYXJ0KSBvbGRTZWxlY3RlZCA6IG51bGw7CisJCQkJTVBhcnQgc2VsZWN0ZWRQYXJ0ID0gc2VsZWN0ZWQgaW5zdGFuY2VvZiBNUGFydCA/IChNUGFydCkgc2VsZWN0ZWQgOiBudWxsOworCisJCQkJaWYgKG9sZFNlbGVjdGVkUGFydCAhPSBudWxsICYmIGdldFBhcnRzKCkuY29udGFpbnMoc2VsZWN0ZWRQYXJ0KSkgeworCQkJCQlmaXJlUGFydEhpZGRlbihvbGRTZWxlY3RlZFBhcnQpOworCQkJCX0KKworCQkJCWlmIChzZWxlY3RlZFBhcnQgIT0gbnVsbCAmJiBzZWxlY3RlZFBhcnQuaXNUb0JlUmVuZGVyZWQoKQorCQkJCQkJJiYgZ2V0UGFydHMoKS5jb250YWlucyhzZWxlY3RlZFBhcnQpKSB7CisJCQkJCS8vIGFzayB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIHRoaXMgcGFydAorCQkJCQlpZiAocGxhY2Vob2xkZXIgPT0gbnVsbCkgeworCQkJCQkJaWYgKHNlbGVjdGVkUGFydC5nZXRQYXJlbnQoKS5nZXRSZW5kZXJlcigpICE9IG51bGwpIHsKKwkJCQkJCQllbmdpbmUuY3JlYXRlR3VpKHNlbGVjdGVkUGFydCk7CisJCQkJCQkJZmlyZVBhcnRWaXNpYmxlKHNlbGVjdGVkUGFydCk7CisJCQkJCQkJZmlyZVBhcnRCcm91Z2h0VG9Ub3Aoc2VsZWN0ZWRQYXJ0KTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChwbGFjZWhvbGRlci5nZXRQYXJlbnQoKS5nZXRSZW5kZXJlcigpICE9IG51bGwpIHsKKwkJCQkJCWVuZ2luZS5jcmVhdGVHdWkocGxhY2Vob2xkZXIpOworCQkJCQkJZmlyZVBhcnRWaXNpYmxlKHNlbGVjdGVkUGFydCk7CisJCQkJCQlmaXJlUGFydEJyb3VnaHRUb1RvcChzZWxlY3RlZFBhcnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfTsKKworCXByaXZhdGUgRXZlbnRIYW5kbGVyIG1pbmltaXplZFBhcnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQlPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrKSkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk5FV19WQUxVRSk7CisJCQlPYmplY3Qgb2xkVmFsdWUgPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKTsKKworCQkJYm9vbGVhbiBtaW5pbWl6ZWRUYWdBZGRlZCA9IFVJRXZlbnRzLmlzQUREKGV2ZW50KQorCQkJCQkmJiBJUHJlc2VudGF0aW9uRW5naW5lLk1JTklNSVpFRC5lcXVhbHMobmV3VmFsdWUpOworCQkJYm9vbGVhbiBtaW5pbWl6ZWRUYWdSZW1vdmVkID0gVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpCisJCQkJCSYmIElQcmVzZW50YXRpb25FbmdpbmUuTUlOSU1JWkVELmVxdWFscyhvbGRWYWx1ZSk7CisKKwkJCWlmICghKG1pbmltaXplZFRhZ0FkZGVkIHx8IG1pbmltaXplZFRhZ1JlbW92ZWQpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlNUGFydCBwYXJ0ID0gdG9QYXJ0KCgoTVBhcnRTdGFjaykgZWxlbWVudCkuZ2V0U2VsZWN0ZWRFbGVtZW50KCkpOworCQkJaWYgKHBhcnQgIT0gbnVsbCAmJiBtaW5pbWl6ZWRUYWdBZGRlZCkgeworCQkJCWZpcmVQYXJ0SGlkZGVuKHBhcnQpOworCQkJfSBlbHNlIGlmIChwYXJ0ICE9IG51bGwpIHsKKwkJCQlmaXJlUGFydFZpc2libGUocGFydCk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIE1QYXJ0IHRvUGFydChNU3RhY2tFbGVtZW50IHN0YWNrRWxlbWVudCkgeworCQkJaWYgKHN0YWNrRWxlbWVudCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHN0YWNrRWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlciA/IChNUGFydCkgKChNUGxhY2Vob2xkZXIpIHN0YWNrRWxlbWVudCkKKwkJCQkJCS5nZXRSZWYoKSA6IChNUGFydCkgc3RhY2tFbGVtZW50OworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworCisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwkvKioKKwkgKiBNaWdodCBiZSBudWxsIGlmIHRoaXMgcGFydCBzZXJ2aWNlIGlzIGNyZWF0ZWQgZm9yIHRoZSBhcHBsaWNhdGlvbgorCSAqLworCXByaXZhdGUgTVdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJUHJlc2VudGF0aW9uRW5naW5lIGVuZ2luZTsKKworCUBJbmplY3QKKwlwcml2YXRlIEVNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlOworCisJQEluamVjdAorCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIElTYXZlSGFuZGxlciBzYXZlSGFuZGxlcjsKKworCUBJbmplY3QKKwlwcml2YXRlIElFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKworCS8vIEBPcHRpb25hbCBhcyB0aGUgY29udGV4dCBzZXJ2aWNlIG1heSBub3QgaGF2ZSBiZWVuIGluc3RhbGxlZAorCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIEVDb250ZXh0U2VydmljZSBjb250ZXh0U2VydmljZTsKKworCUBJbmplY3QKKwlAT3B0aW9uYWwKKwlwcml2YXRlIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyOworCisJcHJpdmF0ZSBQYXJ0QWN0aXZhdGlvbkhpc3RvcnkgcGFydEFjdGl2YXRpb25IaXN0b3J5OworCisJcHJpdmF0ZSBNUGFydCBhY3RpdmVQYXJ0OworCisJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOworCisJcHJpdmF0ZSBib29sZWFuIGNvbnN0cnVjdGVkID0gZmFsc2U7CisKKwlASW5qZWN0CisJcHVibGljIFBhcnRTZXJ2aWNlSW1wbChNQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEBPcHRpb25hbCBNV2luZG93IHdpbmRvdykgeworCQkvLyBubyBuZWVkIHRvIHRyYWNrIGNoYW5nZXM6CisJCXRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKwkJd29ya2JlbmNoV2luZG93ID0gd2luZG93OworCX0KKworCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHVuaWRlbnRpZmllZE1lc3NhZ2UsIFN0cmluZyBpZGVudGlmaWVkTWVzc2FnZSwgU3RyaW5nIGlkLCBFeGNlcHRpb24gZSkgeworCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7CisJCQlsb2dnZXIuZXJyb3IoZSwgdW5pZGVudGlmaWVkTWVzc2FnZSk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZXJyb3IoZSwgTkxTLmJpbmQoaWRlbnRpZmllZE1lc3NhZ2UsIGlkKSk7CisJCX0KKwl9CisKKwlASW5qZWN0CisJdm9pZCBzZXRQYXJ0KEBPcHRpb25hbCBATmFtZWQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1BBUlQpIE1QYXJ0IHApIHsKKwkJaWYgKGFjdGl2ZVBhcnQgIT0gcCkgeworCQkJaWYgKHAgIT0gbnVsbCkgeworCQkJCU1QZXJzcGVjdGl2ZSBwZXJzcCA9IG1vZGVsU2VydmljZS5nZXRQZXJzcGVjdGl2ZUZvcihwKTsKKwkJCQlib29sZWFuIGluQ3VycmVudFBlcnNwZWN0aXZlID0gcGVyc3AgPT0gbnVsbAorCQkJCQkJfHwgcGVyc3AgPT0gcGVyc3AuZ2V0UGFyZW50KCkuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJaWYgKGluQ3VycmVudFBlcnNwZWN0aXZlKSB7CisJCQkJCWFjdGl2YXRlKHAsIHRydWUsIHRydWUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYWN0aXZhdGUocCwgdHJ1ZSwgdHJ1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlAUG9zdENvbnN0cnVjdAorCXZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKwkJZXZlbnRCcm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkVsZW1lbnRDb250YWluZXIuVE9QSUNfU0VMRUNURURFTEVNRU5ULCBzZWxlY3RlZEhhbmRsZXIpOworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoVUlFdmVudHMuQXBwbGljYXRpb25FbGVtZW50LlRPUElDX1RBR1MsIG1pbmltaXplZFBhcnRIYW5kbGVyKTsKKwkJY29uc3RydWN0ZWQgPSB0cnVlOworCQlwYXJ0QWN0aXZhdGlvbkhpc3RvcnkgPSBuZXcgUGFydEFjdGl2YXRpb25IaXN0b3J5KHRoaXMsIG1vZGVsU2VydmljZSk7CisJCWlmIChhY3RpdmVQYXJ0ICE9IG51bGwpIHsKKwkJCXBhcnRBY3RpdmF0aW9uSGlzdG9yeS5wcmVwZW5kKGFjdGl2ZVBhcnQpOworCQl9CisJfQorCisJQFByZURlc3Ryb3kKKwl2b2lkIHByZURlc3Ryb3koKSB7CisJCWNvbnN0cnVjdGVkID0gZmFsc2U7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKHNlbGVjdGVkSGFuZGxlcik7CisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKG1pbmltaXplZFBhcnRIYW5kbGVyKTsKKwkJcGFydEFjdGl2YXRpb25IaXN0b3J5LmNsZWFyKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpcmVQYXJ0QWN0aXZhdGVkKGZpbmFsIE1QYXJ0IHBhcnQpIHsKKwkJZm9yIChmaW5hbCBPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQkoKElQYXJ0TGlzdGVuZXIpIGxpc3RlbmVyKS5wYXJ0QWN0aXZhdGVkKHBhcnQpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCQkJCWxvZ2dlci5lcnJvcih0aHJvd2FibGUsICJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgbm90aWZ5aW5nIHBhcnQgbGlzdGVuZXJzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaXJlUGFydERlYWN0aXZhdGVkKGZpbmFsIE1QYXJ0IHBhcnQpIHsKKwkJZm9yIChmaW5hbCBPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQkoKElQYXJ0TGlzdGVuZXIpIGxpc3RlbmVyKS5wYXJ0RGVhY3RpdmF0ZWQocGFydCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKwkJCQkJbG9nZ2VyLmVycm9yKHRocm93YWJsZSwgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBub3RpZnlpbmcgcGFydCBsaXN0ZW5lcnMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpcmVQYXJ0SGlkZGVuKGZpbmFsIE1QYXJ0IHBhcnQpIHsKKwkJZm9yIChmaW5hbCBPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQkoKElQYXJ0TGlzdGVuZXIpIGxpc3RlbmVyKS5wYXJ0SGlkZGVuKHBhcnQpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCQkJCWxvZ2dlci5lcnJvcih0aHJvd2FibGUsICJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgbm90aWZ5aW5nIHBhcnQgbGlzdGVuZXJzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaXJlUGFydFZpc2libGUoZmluYWwgTVBhcnQgcGFydCkgeworCQlmb3IgKGZpbmFsIE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgeworCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJCSgoSVBhcnRMaXN0ZW5lcikgbGlzdGVuZXIpLnBhcnRWaXNpYmxlKHBhcnQpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCQkJCWxvZ2dlci5lcnJvcih0aHJvd2FibGUsICJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgbm90aWZ5aW5nIHBhcnQgbGlzdGVuZXJzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaXJlUGFydEJyb3VnaHRUb1RvcChmaW5hbCBNUGFydCBwYXJ0KSB7CisJCWZvciAoZmluYWwgT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7CisJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJKChJUGFydExpc3RlbmVyKSBsaXN0ZW5lcikucGFydEJyb3VnaHRUb1RvcChwYXJ0KTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworCQkJCQlsb2dnZXIuZXJyb3IodGhyb3dhYmxlLCAiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIG5vdGlmeWluZyBwYXJ0IGxpc3RlbmVycyIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRQYXJ0TGlzdGVuZXIoSVBhcnRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW1vdmVQYXJ0TGlzdGVuZXIoSVBhcnRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIE1XaW5kb3cgZ2V0V2luZG93KCkgeworCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCisJCQlyZXR1cm4gd29ya2JlbmNoV2luZG93OworCQlpZiAoYXBwbGljYXRpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCkgIT0gbnVsbCkKKwkJCXJldHVybiBhcHBsaWNhdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJTGlzdDxNV2luZG93PiB3aW5kb3dzID0gYXBwbGljYXRpb24uZ2V0Q2hpbGRyZW4oKTsKKwkJaWYgKHdpbmRvd3Muc2l6ZSgpICE9IDApCisJCQlyZXR1cm4gd2luZG93cy5nZXQoMCk7CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgTUNvbnRleHQgZ2V0UGFyZW50V2l0aENvbnRleHQoTVVJRWxlbWVudCBwYXJ0KSB7CisJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudCA9IHBhcnQuZ2V0UGFyZW50KCk7CisJCU1VSUVsZW1lbnQgaW50ZXJtZWRpYXRlID0gcGFyZW50OworCQlpZiAoaW50ZXJtZWRpYXRlID09IG51bGwpIHsKKwkJCWludGVybWVkaWF0ZSA9IHBhcnQ7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKKwkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCQkJaWYgKCgoTUNvbnRleHQpIHBhcmVudCkuZ2V0Q29udGV4dCgpICE9IG51bGwpCisJCQkJCQlyZXR1cm4gKE1Db250ZXh0KSBwYXJlbnQ7CisJCQkJfQorCQkJCWludGVybWVkaWF0ZSA9IHBhcmVudDsKKwkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJCQl9CisJCX0KKworCQlNUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBtb2RlbFNlcnZpY2UuZmluZFBsYWNlaG9sZGVyRm9yKGdldFdpbmRvdygpLCBpbnRlcm1lZGlhdGUpOworCQlwYXJlbnQgPSBwbGFjZWhvbGRlci5nZXRQYXJlbnQoKTsKKwkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCQlpZiAoKChNQ29udGV4dCkgcGFyZW50KS5nZXRDb250ZXh0KCkgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIChNQ29udGV4dCkgcGFyZW50OworCQkJfQorCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGJyaW5nVG9Ub3AoTVBhcnQgcGFydCkgeworCQlpZiAoaXNJbkNvbnRhaW5lcihwYXJ0KSkgeworCQkJTVVJRWxlbWVudCBjdXJyZW50RWxlbWVudCA9IHBhcnQ7CisJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBwYXJ0LmdldFBhcmVudCgpOworCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQkJY3VycmVudEVsZW1lbnQgPSBtb2RlbFNlcnZpY2UuZmluZFBsYWNlaG9sZGVyRm9yKGdldFdpbmRvdygpLCBwYXJ0KTsKKwkJCQlwYXJlbnQgPSBjdXJyZW50RWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCX0KKworCQkJLy8gSWYgdGhlIHBhcnQgaXMgaW4gdGhlIHNhbWUgc3RhY2sgYXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFydCB0aGVuIGFjdGl2YXRlIGl0CisJCQkvLyBpbnN0ZWFkCisJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBhY3RpdmVQYXJlbnQgPSBhY3RpdmVQYXJ0ICE9IG51bGwgPyBhY3RpdmVQYXJ0CisJCQkJCS5nZXRQYXJlbnQoKSA6IG51bGw7CisJCQlpZiAoYWN0aXZlUGFydCAhPSBudWxsICYmIGFjdGl2ZVBhcmVudCA9PSBudWxsKSB7CisJCQkJTVBsYWNlaG9sZGVyIGFjdGl2ZVBIID0gbW9kZWxTZXJ2aWNlLmZpbmRQbGFjZWhvbGRlckZvcihnZXRXaW5kb3coKSwgYWN0aXZlUGFydCk7CisJCQkJaWYgKGFjdGl2ZVBIICE9IG51bGwpIHsKKwkJCQkJYWN0aXZlUGFyZW50ID0gYWN0aXZlUEguZ2V0UGFyZW50KCk7CisJCQkJfQorCQkJfQorCQkJaWYgKHBhcmVudCA9PSBhY3RpdmVQYXJlbnQgJiYgcGFydCAhPSBhY3RpdmVQYXJ0KSB7CisJCQkJYWN0aXZhdGUocGFydCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlNVUlFbGVtZW50IG9sZFNlbGVjdGVkRWxlbWVudCA9IHBhcmVudC5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKworCQkJZGVsZWdhdGVCcmluZ1RvVG9wKHBhcnQpOworCisJCQkvLyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQgaXMgYWN0dWFsbHkgdmFsaWQKKwkJCWlmIChvbGRTZWxlY3RlZEVsZW1lbnQgIT0gY3VycmVudEVsZW1lbnQKKwkJCQkJJiYgcGFyZW50LmdldENoaWxkcmVuKCkuY29udGFpbnMob2xkU2VsZWN0ZWRFbGVtZW50KQorCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNR2VuZXJpY1N0YWNrPD8+KSB7CisJCQkJaWYgKG9sZFNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1QbGFjZWhvbGRlcikgeworCQkJCQlvbGRTZWxlY3RlZEVsZW1lbnQgPSAoKE1QbGFjZWhvbGRlcikgb2xkU2VsZWN0ZWRFbGVtZW50KS5nZXRSZWYoKTsKKwkJCQl9CisJCQkJaW50ZXJuYWxGaXhDb250ZXh0KHBhcnQsIG9sZFNlbGVjdGVkRWxlbWVudCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBnZXRTdWJDb250ZXh0KE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1Db250ZXh0KSB7CisJCQlyZXR1cm4gKChNQ29udGV4dCkgZWxlbWVudCkuZ2V0Q29udGV4dCgpOworCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9ICgoTUVsZW1lbnRDb250YWluZXI8Pz4pIGVsZW1lbnQpLmdldFNlbGVjdGVkRWxlbWVudCgpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1Db250ZXh0KSB7CisJCQkJcmV0dXJuICgoTUNvbnRleHQpIHNlbGVjdGVkRWxlbWVudCkuZ2V0Q29udGV4dCgpOworCQkJfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJCXJldHVybiBnZXRTdWJDb250ZXh0KChNVUlFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCBpbnRlcm5hbEZpeENvbnRleHQoTVBhcnQgcGFydCwgTVVJRWxlbWVudCBvbGRTZWxlY3RlZEVsZW1lbnQpIHsKKwkJaWYgKG9sZFNlbGVjdGVkRWxlbWVudCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNQ29udGV4dCBwYXJlbnRQYXJ0ID0gZ2V0UGFyZW50V2l0aENvbnRleHQob2xkU2VsZWN0ZWRFbGVtZW50KTsKKwkJaWYgKHBhcmVudFBhcnQgPT0gbnVsbCkgeworCQkJLy8gdGVjaG5pY2FsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIHRoZXJlIHNob3VsZCBiZSBhbiBNV2luZG93IHNvbWV3aGVyZQorCQkJcmV0dXJuOworCQl9CisJCUlFY2xpcHNlQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gcGFyZW50UGFydC5nZXRDb250ZXh0KCk7CisJCUlFY2xpcHNlQ29udGV4dCBvbGRDb250ZXh0ID0gZ2V0U3ViQ29udGV4dChvbGRTZWxlY3RlZEVsZW1lbnQpOworCQlPYmplY3QgY2hpbGQgPSBwYXJlbnRDb250ZXh0LmdldEFjdGl2ZUNoaWxkKCk7CisJCWlmIChjaGlsZCA9PSBudWxsIHx8IG9sZENvbnRleHQgPT0gbnVsbCB8fCBjaGlsZCA9PSBvbGRDb250ZXh0KSB7CisJCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQkJLy8gVEJEIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3Nhcnk7IGRlYWN0aXZhdGlvbiBpcyBtaXNzaW5nIHNvbWV3aGVyZQorCQkJCUlFY2xpcHNlQ29udGV4dCBjdXJyZW50QWN0aXZlID0gcGFyZW50Q29udGV4dC5nZXRBY3RpdmVDaGlsZCgpOworCQkJCWlmIChjdXJyZW50QWN0aXZlICE9IG51bGwpCisJCQkJCWN1cnJlbnRBY3RpdmUuZGVhY3RpdmF0ZSgpOworCQkJfSBlbHNlCisJCQkJcGFydC5nZXRDb250ZXh0KCkuYWN0aXZhdGUoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGFydCBmaW5kUGFydChTdHJpbmcgaWQpIHsKKwkJTGlzdDxNUGFydD4gcGFydHMgPSBnZXRQYXJ0cyhNUGFydC5jbGFzcywgaWQpOworCQlyZXR1cm4gcGFydHMuc2l6ZSgpID4gMCA/IHBhcnRzLmdldCgwKSA6IG51bGw7CisJfQorCisJcHJpdmF0ZSA8VD4gTGlzdDxUPiBnZXRQYXJ0cyhDbGFzczxUPiBjbHMsIFN0cmluZyBpZCkgeworCQlyZXR1cm4gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyh3b3JrYmVuY2hXaW5kb3csIGlkLCBjbHMsIG51bGwsCisJCQkJRU1vZGVsU2VydmljZS5PVVRTSURFX1BFUlNQRUNUSVZFIHwgRU1vZGVsU2VydmljZS5JTl9BQ1RJVkVfUEVSU1BFQ1RJVkUKKwkJCQkJCXwgRU1vZGVsU2VydmljZS5JTl9TSEFSRURfQVJFQSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248TVBhcnQ+IGdldFBhcnRzKCkgeworCQlyZXR1cm4gZ2V0UGFydHMoTVBhcnQuY2xhc3MsIG51bGwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzUGFydFZpc2libGUoTVBhcnQgcGFydCkgeworCQlpZiAoaXNJbkNvbnRhaW5lcihwYXJ0KSkgeworCQkJTVVJRWxlbWVudCBlbGVtZW50ID0gcGFydDsKKwkJCU1FbGVtZW50Q29udGFpbmVyPD8+IHBhcmVudCA9IHBhcnQuZ2V0UGFyZW50KCk7CisJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQkvLyBtaWdodCBiZSBhIHNoYXJlZCBwYXJ0CisJCQkJZWxlbWVudCA9IHBhcnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spIHsKKwkJCQlyZXR1cm4gcGFyZW50LmdldFNlbGVjdGVkRWxlbWVudCgpID09IGVsZW1lbnQ7CisJCQl9CisKKwkJCXJldHVybiBlbGVtZW50LmlzVmlzaWJsZSgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNJbkNvbnRhaW5lcihNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKG1vZGVsU2VydmljZS5pc0hvc3RlZEVsZW1lbnQoZWxlbWVudCwgZ2V0V2luZG93KCkpKQorCQkJcmV0dXJuIHRydWU7CisJCUxpc3Q8TVVJRWxlbWVudD4gYWxsUGVyc3BlY3RpdmVFbGVtZW50cyA9IG1vZGVsU2VydmljZS5maW5kRWxlbWVudHMod29ya2JlbmNoV2luZG93LCBudWxsLAorCQkJCU1VSUVsZW1lbnQuY2xhc3MsIG51bGwsIEVNb2RlbFNlcnZpY2UuUFJFU0VOVEFUSU9OKTsKKwkJcmV0dXJuIGFsbFBlcnNwZWN0aXZlRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCk7CisJfQorCisJYm9vbGVhbiBpc0luQ29udGFpbmVyKE1FbGVtZW50Q29udGFpbmVyPD8+IGNvbnRhaW5lciwgTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWZvciAoT2JqZWN0IG9iamVjdCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAob2JqZWN0ID09IGVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTUVsZW1lbnRDb250YWluZXI8Pz4pIHsKKwkJCQlpZiAoaXNJbkNvbnRhaW5lcigoTUVsZW1lbnRDb250YWluZXI8Pz4pIG9iamVjdCwgZWxlbWVudCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIpIHsKKwkJCQlNVUlFbGVtZW50IHJlZiA9ICgoTVBsYWNlaG9sZGVyKSBvYmplY3QpLmdldFJlZigpOworCQkJCWlmIChyZWYgPT0gZWxlbWVudCkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KSB7CisJCQkJCWlmIChpc0luQ29udGFpbmVyKChNRWxlbWVudENvbnRhaW5lcjw/PikgcmVmLCBlbGVtZW50KSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJCU1QZXJzcGVjdGl2ZSBwZXJzcCA9IChNUGVyc3BlY3RpdmUpIG9iamVjdDsKKwkJCQlmb3IgKE1XaW5kb3cgZHcgOiBwZXJzcC5nZXRXaW5kb3dzKCkpIHsKKwkJCQkJaWYgKGlzSW5Db250YWluZXIoZHcsIGVsZW1lbnQpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNV2luZG93KSB7CisJCQkJTVdpbmRvdyB3aW4gPSAoTVdpbmRvdykgb2JqZWN0OworCQkJCWZvciAoTVdpbmRvdyBkdyA6IHdpbi5nZXRXaW5kb3dzKCkpIHsKKwkJCQkJaWYgKGlzSW5Db250YWluZXIoZHcsIGVsZW1lbnQpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCU1XaW5kb3cgd2luID0gKE1XaW5kb3cpIGNvbnRhaW5lcjsKKwkJCWZvciAoTVdpbmRvdyBkdyA6IHdpbi5nZXRXaW5kb3dzKCkpIHsKKwkJCQlpZiAoaXNJbkNvbnRhaW5lcihkdywgZWxlbWVudCkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJTVBlcnNwZWN0aXZlIHBlcnNwID0gKE1QZXJzcGVjdGl2ZSkgY29udGFpbmVyOworCQkJZm9yIChNV2luZG93IGR3IDogcGVyc3AuZ2V0V2luZG93cygpKSB7CisJCQkJaWYgKGlzSW5Db250YWluZXIoZHcsIGVsZW1lbnQpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlNUGxhY2Vob2xkZXIgZ2V0TG9jYWxQbGFjZWhvbGRlcihNVUlFbGVtZW50IHBhcnQpIHsKKwkJcmV0dXJuIG1vZGVsU2VydmljZS5maW5kUGxhY2Vob2xkZXJGb3IoZ2V0V2luZG93KCksIHBhcnQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzUGFydE9yUGxhY2Vob2xkZXJJblBlcnNwZWN0aXZlKFN0cmluZyBlbGVtZW50SWQsIE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSkgeworCQlMaXN0PE1QYXJ0PiBmaW5kRWxlbWVudHMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHBlcnNwZWN0aXZlLCBlbGVtZW50SWQsIE1QYXJ0LmNsYXNzLCBudWxsKTsKKwkJaWYgKCFmaW5kRWxlbWVudHMuaXNFbXB0eSgpKSB7CisJCQlNUGFydCBwYXJ0ID0gZmluZEVsZW1lbnRzLmdldCgwKTsKKworCQkJLy8gaWYgdGhhdCBpcyBhIHNoYXJlZCBwYXJ0LCBjaGVjayB0aGUgcGxhY2Vob2xkZXJzCisJCQlpZiAod29ya2JlbmNoV2luZG93LmdldFNoYXJlZEVsZW1lbnRzKCkuY29udGFpbnMocGFydCkpIHsKKwkJCQlMaXN0PE1QbGFjZWhvbGRlcj4gcGxhY2Vob2xkZXJzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyhwZXJzcGVjdGl2ZSwgZWxlbWVudElkLAorCQkJCQkJTVBsYWNlaG9sZGVyLmNsYXNzLCBudWxsKTsKKwkJCQlmb3IgKE1QbGFjZWhvbGRlciBtUGxhY2Vob2xkZXIgOiBwbGFjZWhvbGRlcnMpIHsKKwkJCQkJaWYgKG1QbGFjZWhvbGRlci5pc1Zpc2libGUoKSAmJiBtUGxhY2Vob2xkZXIuaXNUb0JlUmVuZGVyZWQoKSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJLy8gbm90IGEgc2hhcmVkIHBhcnQKKwkJCXJldHVybiBwYXJ0LmlzVmlzaWJsZSgpICYmIHBhcnQuaXNUb0JlUmVuZGVyZWQoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3dpdGNoUGVyc3BlY3RpdmUoTVBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlKSB7CisJCUFzc2VydC5pc05vdE51bGwocGVyc3BlY3RpdmUpOworCQlNV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOworCQlpZiAod2luZG93ICE9IG51bGwgJiYgaXNJbkNvbnRhaW5lcih3aW5kb3csIHBlcnNwZWN0aXZlKSkgeworCQkJcGVyc3BlY3RpdmUuZ2V0UGFyZW50KCkuc2V0U2VsZWN0ZWRFbGVtZW50KHBlcnNwZWN0aXZlKTsKKwkJCUxpc3Q8TVBhcnQ+IG5ld1BlcnNwZWN0aXZlUGFydHMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHBlcnNwZWN0aXZlLCBudWxsLAorCQkJCQlNUGFydC5jbGFzcywgbnVsbCk7CisJCQkvLyBpZiBwb3NzaWJsZSwga2VlcCB0aGUgc2FtZSBhY3RpdmUgcGFydCBhY3Jvc3MgcGVyc3BlY3RpdmUgc3dpdGNoZXMKKwkJCWlmIChuZXdQZXJzcGVjdGl2ZVBhcnRzLmNvbnRhaW5zKGFjdGl2ZVBhcnQpCisJCQkJCSYmIHBhcnRBY3RpdmF0aW9uSGlzdG9yeS5pc1ZhbGlkKHBlcnNwZWN0aXZlLCBhY3RpdmVQYXJ0KSkgeworCQkJCU1QYXJ0IHRhcmdldCA9IGFjdGl2ZVBhcnQ7CisJCQkJSUVjbGlwc2VDb250ZXh0IGFjdGl2ZUNoaWxkID0gYWN0aXZlUGFydC5nZXRDb250ZXh0KCkuZ2V0UGFyZW50KCkuZ2V0QWN0aXZlQ2hpbGQoKTsKKwkJCQlpZiAoYWN0aXZlQ2hpbGQgIT0gbnVsbCkgeworCQkJCQlhY3RpdmVDaGlsZC5kZWFjdGl2YXRlKCk7CisJCQkJfQorCQkJCWlmICh0YXJnZXQuZ2V0Q29udGV4dCgpICE9IG51bGwgJiYgdGFyZ2V0LmdldENvbnRleHQoKS5nZXQoTVBlcnNwZWN0aXZlLmNsYXNzKSAhPSBudWxsCisJCQkJCQkmJiB0YXJnZXQuZ2V0Q29udGV4dCgpLmdldChNUGVyc3BlY3RpdmUuY2xhc3MpLmdldENvbnRleHQoKSA9PSBwZXJzcGVjdGl2ZS5nZXRDb250ZXh0KCkpIHsKKwkJCQkJdGFyZ2V0LmdldENvbnRleHQoKS5hY3RpdmF0ZUJyYW5jaCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXBlcnNwZWN0aXZlLmdldENvbnRleHQoKS5hY3RpdmF0ZSgpOworCQkJCX0KKworCQkJCW1vZGVsU2VydmljZS5icmluZ1RvVG9wKHRhcmdldCk7CisJCQkJYWN0aXZhdGUodGFyZ2V0LCB0cnVlLCBmYWxzZSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlNUGFydCBuZXdBY3RpdmVQYXJ0ID0gcGVyc3BlY3RpdmUuZ2V0Q29udGV4dCgpLmdldEFjdGl2ZUxlYWYoKS5nZXQoTVBhcnQuY2xhc3MpOworCQkJaWYgKG5ld0FjdGl2ZVBhcnQgPT0gbnVsbCkgeworCQkJCS8vIHdoYXRldmVyIHBhcnQgd2FzIHByZXZpb3VzbHkgYWN0aXZlIGNhbiBubyBsb25nZXIgYmUgZm91bmQsIGZpbmQgYW5vdGhlciBvbmUKKwkJCQlNUGFydCBjYW5kaWRhdGUgPSBwYXJ0QWN0aXZhdGlvbkhpc3RvcnkuZ2V0QWN0aXZhdGlvbkNhbmRpZGF0ZShwZXJzcGVjdGl2ZSk7CisJCQkJaWYgKGNhbmRpZGF0ZSAhPSBudWxsKSB7CisJCQkJCW1vZGVsU2VydmljZS5icmluZ1RvVG9wKGNhbmRpZGF0ZSk7CisJCQkJCWFjdGl2YXRlKGNhbmRpZGF0ZSwgdHJ1ZSwgZmFsc2UpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCisJCQkvLyB0aGVyZSBzZWVtcyB0byBiZSBubyBwYXJ0cyBpbiB0aGlzIHBlcnNwZWN0aXZlLCBqdXN0IGFjdGl2YXRlIGl0IGFzIGlzIHRoZW4KKwkJCWlmIChuZXdBY3RpdmVQYXJ0ID09IG51bGwpIHsKKwkJCQltb2RlbFNlcnZpY2UuYnJpbmdUb1RvcChwZXJzcGVjdGl2ZSk7CisJCQkJcGVyc3BlY3RpdmUuZ2V0Q29udGV4dCgpLmFjdGl2YXRlKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICgobW9kZWxTZXJ2aWNlLmdldEVsZW1lbnRMb2NhdGlvbihuZXdBY3RpdmVQYXJ0KSAmIEVNb2RlbFNlcnZpY2UuSU5fU0hBUkVEX0FSRUEpICE9IDApIHsKKwkJCQkJaWYgKG5ld0FjdGl2ZVBhcnQuZ2V0UGFyZW50KCkuZ2V0U2VsZWN0ZWRFbGVtZW50KCkgIT0gbmV3QWN0aXZlUGFydCkgeworCQkJCQkJbmV3QWN0aXZlUGFydCA9IChNUGFydCkgbmV3QWN0aXZlUGFydC5nZXRQYXJlbnQoKS5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhY3RpdmF0ZShuZXdBY3RpdmVQYXJ0LCB0cnVlLCBmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhY3RpdmF0ZShNUGFydCBwYXJ0KSB7CisJCWFjdGl2YXRlKHBhcnQsIHRydWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFjdGl2YXRlKE1QYXJ0IHBhcnQsIGJvb2xlYW4gcmVxdWlyZXNGb2N1cykgeworCQlhY3RpdmF0ZShwYXJ0LCByZXF1aXJlc0ZvY3VzLCB0cnVlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWN0aXZhdGUoTVBhcnQgcGFydCwgYm9vbGVhbiByZXF1aXJlc0ZvY3VzLCBib29sZWFuIGFjdGl2YXRlQnJhbmNoKSB7CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCWlmIChjb25zdHJ1Y3RlZCAmJiBhY3RpdmVQYXJ0ICE9IG51bGwpIHsKKwkJCQlmaXJlUGFydERlYWN0aXZhdGVkKGFjdGl2ZVBhcnQpOworCQkJfQorCQkJYWN0aXZlUGFydCA9IHBhcnQ7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBEZWxlZ2F0ZSBhY3RpdmF0aW9ucyB0byBhIENvbXBvc2l0ZVBhcnQncyBpbm5lciBwYXJ0IChpZiBhbnkpCisJCWlmIChwYXJ0IGluc3RhbmNlb2YgTUNvbXBvc2l0ZVBhcnQpIHsKKwkJCWlmIChwYXJ0LmdldENvbnRleHQoKSAhPSBudWxsKSB7CisJCQkJSUVjbGlwc2VDb250ZXh0IHBDb250ZXh0ID0gcGFydC5nZXRDb250ZXh0KCk7CisJCQkJaWYgKHBDb250ZXh0LmdldEFjdGl2ZUxlYWYoKSAhPSBudWxsKSB7CisJCQkJCU1QYXJ0IGlubmVyID0gcENvbnRleHQuZ2V0QWN0aXZlTGVhZigpLmdldChNUGFydC5jbGFzcyk7CisJCQkJCWlmIChpbm5lciAhPSBudWxsKSB7CisJCQkJCQlwYXJ0ID0gaW5uZXI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBvbmx5IGFjdGl2YXRlIHBhcnRzIHRoYXQgaXMgdW5kZXIgb3VyIGNvbnRyb2wKKwkJaWYgKCFpc0luQ29udGFpbmVyKHBhcnQpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOworCQlJRWNsaXBzZUNvbnRleHQgd2luZG93Q29udGV4dCA9IHdpbmRvdy5nZXRDb250ZXh0KCk7CisJCS8vIGNoZWNrIGlmIHRoZSBhY3RpdmUgcGFydCBoYXMgY2hhbmdlZCBvciBpZiB3ZSBhcmUgbm8gbG9uZ2VyIHRoZSBhY3RpdmUgd2luZG93CisJCWlmICh3aW5kb3dDb250ZXh0LmdldFBhcmVudCgpLmdldEFjdGl2ZUNoaWxkKCkgPT0gd2luZG93Q29udGV4dCAmJiBwYXJ0ID09IGFjdGl2ZVBhcnQpIHsKKwkJCS8vIGluc2VydCBpdCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhY3RpdmF0aW9uIGhpc3RvcnksIGl0IG1heSBub3QgaGF2ZSBiZWVuIGluc2VydGVkCisJCQkvLyBwZW5kaW5nIHdoZW4gdGhpcyBzZXJ2aWNlIHdhcyBpbnN0YW50aWF0ZWQKKwkJCXBhcnRBY3RpdmF0aW9uSGlzdG9yeS5wcmVwZW5kKHBhcnQpOworCQkJVUlFdmVudHMucHVibGlzaEV2ZW50KFVJRXZlbnRzLlVJTGlmZUN5Y2xlLkFDVElWQVRFLCBwYXJ0KTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoY29udGV4dFNlcnZpY2UgIT0gbnVsbCkgeworCQkJY29udGV4dFNlcnZpY2UuZGVmZXJVcGRhdGVzKHRydWUpOworCQl9CisJCWlmIChjb250ZXh0TWFuYWdlciAhPSBudWxsKSB7CisJCQljb250ZXh0TWFuYWdlci5kZWZlclVwZGF0ZXModHJ1ZSk7CisJCX0KKworCQlNUGFydCBsYXN0QWN0aXZlUGFydCA9IGFjdGl2ZVBhcnQ7CisJCWFjdGl2ZVBhcnQgPSBwYXJ0OworCisJCWlmIChjb25zdHJ1Y3RlZCAmJiBsYXN0QWN0aXZlUGFydCAhPSBudWxsICYmIGxhc3RBY3RpdmVQYXJ0ICE9IGFjdGl2ZVBhcnQpIHsKKwkJCWZpcmVQYXJ0RGVhY3RpdmF0ZWQobGFzdEFjdGl2ZVBhcnQpOworCQl9CisKKwkJdHJ5IHsKKwkJCS8vIHJlY29yZCBhbnkgc2libGluZyBpbnRvIHRoZSBhY3RpdmF0aW9uIGhpc3RvcnkgaWYgbmVjZXNzYXJ5LCB0aGlzIHdpbGwgYWxsb3cgaXQgdG8gYmUKKwkJCS8vIHJlc2VsZWN0ZWQgYWdhaW4gaW4gdGhlIGZ1dHVyZSBhcyBpdCB3aWxsIGJlIGFuIGFjdGl2YXRpb24gY2FuZGlkYXRlIGluIHRoZSBmdXR1cmUsCisJCQkvLyB0aGlzCisJCQkvLyBwcmV2ZW50cyBvdGhlciB1bnJlbmRlcmVkIGVsZW1lbnRzIGZyb20gYmVpbmcgc2VsZWN0ZWQgYXJiaXRyYXJpbHkgd2hpY2ggd291bGQgY2F1c2UKKwkJCS8vIHVud2FudGVkIGJ1bmRsZSBhY3RpdmF0aW9uCisJCQlyZWNvcmRTdGFja0FjdGl2YXRpb24ocGFydCk7CisKKwkJCWRlbGVnYXRlQnJpbmdUb1RvcChwYXJ0KTsKKwkJCXdpbmRvdy5nZXRQYXJlbnQoKS5zZXRTZWxlY3RlZEVsZW1lbnQod2luZG93KTsKKworCQkJcGFydEFjdGl2YXRpb25IaXN0b3J5LmFjdGl2YXRlKHBhcnQsIGFjdGl2YXRlQnJhbmNoKTsKKworCQkJaWYgKHJlcXVpcmVzRm9jdXMpIHsKKwkJCQlJUHJlc2VudGF0aW9uRW5naW5lIHBlID0gcGFydC5nZXRDb250ZXh0KCkuZ2V0KElQcmVzZW50YXRpb25FbmdpbmUuY2xhc3MpOworCQkJCXBlLmZvY3VzR3VpKHBhcnQpOworCQkJfQorCisJCQlmaXJlUGFydEFjdGl2YXRlZChwYXJ0KTsKKwkJCVVJRXZlbnRzLnB1Ymxpc2hFdmVudChVSUV2ZW50cy5VSUxpZmVDeWNsZS5BQ1RJVkFURSwgcGFydCk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoY29udGV4dFNlcnZpY2UgIT0gbnVsbCkgeworCQkJCWNvbnRleHRTZXJ2aWNlLmRlZmVyVXBkYXRlcyhmYWxzZSk7CisJCQl9CisJCQlpZiAoY29udGV4dE1hbmFnZXIgIT0gbnVsbCkgeworCQkJCWNvbnRleHRNYW5hZ2VyLmRlZmVyVXBkYXRlcyhmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZWdhdGVCcmluZ1RvVG9wKE1QYXJ0IHBhcnQpIHsKKwkJbW9kZWxTZXJ2aWNlLmJyaW5nVG9Ub3AocGFydCk7CisJCWNyZWF0ZUVsZW1lbnQocGFydCk7CisJfQorCisJLyoqCisJICogUmVjb3JkcyB0aGUgc3BlY2lmaWVkIHBhcmVudCBwYXJ0J3Mgc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgYWN0aXZhdGlvbiBoaXN0b3J5IGlmIHRoZSBwYXJlbnQKKwkgKiBpcyBhIHN0YWNrLgorCSAqCisJICogQHBhcmFtIHBhcnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHdob3NlIHBhcmVudCdzIHNlbGVjdGVkIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGFjdGl2YXRpb24gaGlzdG9yeQorCSAqICAgICAgICAgICAgcmVjb3JkaW5nCisJICovCisJcHJpdmF0ZSB2b2lkIHJlY29yZFN0YWNrQWN0aXZhdGlvbihNUGFydCBwYXJ0KSB7CisJCU1FbGVtZW50Q29udGFpbmVyPD8gZXh0ZW5kcyBNVUlFbGVtZW50PiBwYXJlbnQgPSBwYXJ0LmdldFBhcmVudCgpOworCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTUdlbmVyaWNTdGFjaykgeworCQkJcmVjb3JkU2VsZWN0ZWRBY3RpdmF0aW9uKHBhcmVudCk7CisJCX0gZWxzZSBpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IHBhcnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCQlpZiAocGxhY2Vob2xkZXIgIT0gbnVsbCkgeworCQkJCXBhcmVudCA9IHBsYWNlaG9sZGVyLmdldFBhcmVudCgpOworCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNR2VuZXJpY1N0YWNrKSB7CisJCQkJCXJlY29yZFNlbGVjdGVkQWN0aXZhdGlvbihwYXJlbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJlY29yZHMgdGhlIHNwZWNpZmllZCBwYXJlbnQgJ3Mgc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgYWN0aXZhdGlvbiBoaXN0b3J5LgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgd2hvc2Ugc2VsZWN0ZWQgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYWN0aXZhdGlvbiBoaXN0b3J5CisJICogICAgICAgICAgICByZWNvcmRpbmcKKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVjb3JkU2VsZWN0ZWRBY3RpdmF0aW9uKE1FbGVtZW50Q29udGFpbmVyPD8gZXh0ZW5kcyBNVUlFbGVtZW50PiBwYXJlbnQpIHsKKwkJTVVJRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBwYXJlbnQuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworCQkJcGFydEFjdGl2YXRpb25IaXN0b3J5LmFwcGVuZCgoTVBhcnQpIHNlbGVjdGVkRWxlbWVudCk7CisJCX0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQlNVUlFbGVtZW50IHJlZiA9ICgoTVBsYWNlaG9sZGVyKSBzZWxlY3RlZEVsZW1lbnQpLmdldFJlZigpOworCQkJaWYgKHJlZiBpbnN0YW5jZW9mIE1QYXJ0KSB7CisJCQkJcGFydEFjdGl2YXRpb25IaXN0b3J5LmFwcGVuZCgoTVBhcnQpIHJlZik7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBhcnQgZ2V0QWN0aXZlUGFydCgpIHsKKwkJcmV0dXJuIGFjdGl2ZVBhcnQ7CisJfQorCisJcHJpdmF0ZSBNUGFydCBjcmVhdGVQYXJ0KE1QYXJ0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCU1QYXJ0IHBhcnQgPSBtb2RlbFNlcnZpY2UuY3JlYXRlTW9kZWxFbGVtZW50KE1QYXJ0LmNsYXNzKTsKKwkJcGFydC5zZXRFbGVtZW50SWQoZGVzY3JpcHRvci5nZXRFbGVtZW50SWQoKSk7CisJCXBhcnQuZ2V0TWVudXMoKS5hZGRBbGwoRWNvcmVVdGlsLmNvcHlBbGwoZGVzY3JpcHRvci5nZXRNZW51cygpKSk7CisJCWlmIChkZXNjcmlwdG9yLmdldFRvb2xiYXIoKSAhPSBudWxsKSB7CisJCQlwYXJ0LnNldFRvb2xiYXIoKE1Ub29sQmFyKSBFY29yZVV0aWwuY29weSgoRU9iamVjdCkgZGVzY3JpcHRvci5nZXRUb29sYmFyKCkpKTsKKwkJfQorCQlwYXJ0LnNldENvbnRyaWJ1dG9yVVJJKGRlc2NyaXB0b3IuZ2V0Q29udHJpYnV0b3JVUkkoKSk7CisJCXBhcnQuc2V0Q2xvc2VhYmxlKGRlc2NyaXB0b3IuaXNDbG9zZWFibGUoKSk7CisJCXBhcnQuc2V0Q29udHJpYnV0aW9uVVJJKGRlc2NyaXB0b3IuZ2V0Q29udHJpYnV0aW9uVVJJKCkpOworCQlwYXJ0LnNldExhYmVsKGRlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7CisJCXBhcnQuc2V0SWNvblVSSShkZXNjcmlwdG9yLmdldEljb25VUkkoKSk7CisJCXBhcnQuc2V0VG9vbHRpcChkZXNjcmlwdG9yLmdldFRvb2x0aXAoKSk7CisJCXBhcnQuZ2V0SGFuZGxlcnMoKS5hZGRBbGwoRWNvcmVVdGlsLmNvcHlBbGwoZGVzY3JpcHRvci5nZXRIYW5kbGVycygpKSk7CisJCXBhcnQuZ2V0VGFncygpLmFkZEFsbChkZXNjcmlwdG9yLmdldFRhZ3MoKSk7CisJCXBhcnQuZ2V0UGVyc2lzdGVkU3RhdGUoKS5wdXRBbGwoZGVzY3JpcHRvci5nZXRQZXJzaXN0ZWRTdGF0ZSgpKTsKKwkJcGFydC5nZXRCaW5kaW5nQ29udGV4dHMoKS5hZGRBbGwoZGVzY3JpcHRvci5nZXRCaW5kaW5nQ29udGV4dHMoKSk7CisJCXJldHVybiBwYXJ0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGFydCBjcmVhdGVQYXJ0KFN0cmluZyBpZCkgeworCQlNUGFydERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1vZGVsU2VydmljZS5nZXRQYXJ0RGVzY3JpcHRvcihpZCk7CisJCXJldHVybiBjcmVhdGVQYXJ0KGRlc2NyaXB0b3IpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNUGxhY2Vob2xkZXIgY3JlYXRlU2hhcmVkUGFydChTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIGNyZWF0ZVNoYXJlZFBhcnQoaWQsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBsYWNlaG9sZGVyIGNyZWF0ZVNoYXJlZFBhcnQoU3RyaW5nIGlkLCBib29sZWFuIGZvcmNlKSB7CisJCU1XaW5kb3cgc2hhcmVkV2luZG93ID0gZ2V0V2luZG93KCk7CisJCS8vIERvIHdlIGFscmVhZHkgaGF2ZSB0aGUgcGFydCB0byBzaGFyZT8KKwkJTVBhcnQgc2hhcmVkUGFydCA9IG51bGw7CisKKwkJLy8gY2hlY2sgZm9yIGV4aXN0aW5nIHBhcnRzIGlmIG5lY2Vzc2FyeQorCQlpZiAoIWZvcmNlKSB7CisJCQlmb3IgKE1VSUVsZW1lbnQgZWxlbWVudCA6IHNoYXJlZFdpbmRvdy5nZXRTaGFyZWRFbGVtZW50cygpKSB7CisJCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudElkKCkuZXF1YWxzKGlkKSkgeworCQkJCQlzaGFyZWRQYXJ0ID0gKE1QYXJ0KSBlbGVtZW50OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoc2hhcmVkUGFydCA9PSBudWxsKSB7CisJCQlNUGFydERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1vZGVsU2VydmljZS5nZXRQYXJ0RGVzY3JpcHRvcihpZCk7CisJCQlzaGFyZWRQYXJ0ID0gY3JlYXRlUGFydChkZXNjcmlwdG9yKTsKKwkJCWlmIChzaGFyZWRQYXJ0ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJLy8gUmVwbGFjZSB0aGUgaWQgdG8gZW5zdXJlIHRoYXQgbXVsdGktaW5zdGFuY2UgcGFydHMgd29yayBjb3JyZWN0bHkKKwkJCXNoYXJlZFBhcnQuc2V0RWxlbWVudElkKGlkKTsKKworCQkJc2hhcmVkV2luZG93LmdldFNoYXJlZEVsZW1lbnRzKCkuYWRkKHNoYXJlZFBhcnQpOworCQl9CisKKwkJcmV0dXJuIGNyZWF0ZVNoYXJlZFBhcnQoc2hhcmVkUGFydCk7CisJfQorCisJcHJpdmF0ZSBNUGxhY2Vob2xkZXIgY3JlYXRlU2hhcmVkUGFydChNUGFydCBzaGFyZWRQYXJ0KSB7CisJCS8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBzaGFyZWQgcGFydAorCQlNUGxhY2Vob2xkZXIgc2hhcmVkUGFydFJlZiA9IG1vZGVsU2VydmljZS5jcmVhdGVNb2RlbEVsZW1lbnQoTVBsYWNlaG9sZGVyLmNsYXNzKTsKKwkJc2hhcmVkUGFydFJlZi5zZXRFbGVtZW50SWQoc2hhcmVkUGFydC5nZXRFbGVtZW50SWQoKSk7CisJCXNoYXJlZFBhcnRSZWYuc2V0UmVmKHNoYXJlZFBhcnQpOworCQlyZXR1cm4gc2hhcmVkUGFydFJlZjsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgcGFydCB0byB0aGUgY3VycmVudCBjb250YWluZXIgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgY29udGFpbmVyLiBUaGUgcGFydCBtYXkgc3RpbGwKKwkgKiBiZSBhZGRlZCB0byB0aGUgY29udGFpbmVyIGlmIHRoZSBwYXJ0IHN1cHBvcnRzIGhhdmluZyBtdWx0aXBsZSBjb3BpZXMgb2YgaXRzZWxmIGluIGEgZ2l2ZW4KKwkgKiBjb250YWluZXIuCisJICoKKwkgKiBAcGFyYW0gcHJvdmlkZWRQYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBhZGQKKwkgKiBAcGFyYW0gbG9jYWxQYXJ0CisJICogICAgICAgICAgICBhIHBhcnQgdGhhdCBzaGFyZXMgYXR0cmlidXRlcyB3aXRoIDxjb2RlPnByb3ZpZGVkUGFydDwvY29kZT4sIGZvciBleGFtcGxlLCBpdCBtYXkKKwkgKiAgICAgICAgICAgIGhhdmUgYmVlbiBiYWNrZWQgYnkgdGhlIHNhbWUgcGFydCBkZXNjcmlwdG9yLCB0aGlzIHBhcnQgbWF5IGFscmVhZHkgYmUgaW4gdGhlCisJICogICAgICAgICAgICBjdXJyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gYSBwYXJ0IHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGN1cnJlbnQgY29udGFpbmVyLCBub3RlIHRoYXQgdGhpcyBtYXkgbm90CisJICogICAgICAgICBuZWNlc3NhcmlseSBiZSA8Y29kZT5wcm92aWRlZFBhcnQ8L2NvZGU+CisJICogQHNlZSBNUGFydERlc2NyaXB0b3IjaXNBbGxvd011bHRpcGxlKCkKKwkgKi8KKwlwcml2YXRlIE1QYXJ0IGFkZFBhcnQoTVBhcnQgcHJvdmlkZWRQYXJ0LCBNUGFydCBsb2NhbFBhcnQpIHsKKwkJTVBhcnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtb2RlbFNlcnZpY2UuZ2V0UGFydERlc2NyaXB0b3IocHJvdmlkZWRQYXJ0LmdldEVsZW1lbnRJZCgpKTsKKwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgeworCQkJLy8gdGhlcmUgaXMgbm8gcGFydCBkZXNjcmlwdG9yIGJhY2tpbmcgdGhlIHByb3ZpZGVkIHBhcnQsIGp1c3QgYWRkIGl0IHRvIHRoZSBjb250YWluZXIKKwkJCS8vIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKKwkJCWlmICghaXNJbkNvbnRhaW5lcihwcm92aWRlZFBhcnQpKSB7CisJCQkJYWRqdXN0UGxhY2Vob2xkZXIocHJvdmlkZWRQYXJ0KTsKKwkJCQlhZGRUb0xhc3RDb250YWluZXIobnVsbCwgcHJvdmlkZWRQYXJ0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwcm92aWRlZFBhcnQgIT0gbG9jYWxQYXJ0ICYmICFkZXNjcmlwdG9yLmlzQWxsb3dNdWx0aXBsZSgpKSB7CisJCQkJLy8gbXVsdGlwbGUgY29waWVzIG9mIHRoaXMgcGFydCBhcmUgbm90IGFsbG93ZWQsIGp1c3QgcmV0dXJuIHRoZSBsb2NhbCBvbmUKKwkJCQlyZXR1cm4gbG9jYWxQYXJ0OworCQkJfQorCisJCQkvLyBhbHJlYWR5IGluIHRoZSBjb250YWluZXIsIHJldHVybiBhcyBpcworCQkJaWYgKGlzSW5Db250YWluZXIocHJvdmlkZWRQYXJ0KSkgeworCQkJCXJldHVybiBwcm92aWRlZFBhcnQ7CisJCQl9CisKKwkJCS8vIGNvcnJlY3RzIHRoaXMgcGFydCdzIHBsYWNlaG9sZGVyIGlmIG5lY2Vzc2FyeQorCQkJYWRqdXN0UGxhY2Vob2xkZXIocHJvdmlkZWRQYXJ0KTsKKworCQkJU3RyaW5nIGNhdGVnb3J5ID0gZGVzY3JpcHRvci5nZXRDYXRlZ29yeSgpOworCQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKKwkJCQkvLyBubyBjYXRlZ29yeSwganVzdCBhZGQgaXQgdG8gdGhlIGVuZAorCQkJCWFkZFRvTGFzdENvbnRhaW5lcihudWxsLCBwcm92aWRlZFBhcnQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIm9yZy5lY2xpcHNlLmU0LnByaW1hcnlEYXRhU3RhY2siLmVxdWFscyhjYXRlZ29yeSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlNRWxlbWVudENvbnRhaW5lcjw/IGV4dGVuZHMgTVVJRWxlbWVudD4gY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CisJCQkJCU1VSUVsZW1lbnQgYXJlYSA9IG1vZGVsU2VydmljZS5maW5kKCJvcmcuZWNsaXBzZS51aS5lZGl0b3JzcyIsIGNvbnRhaW5lcik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQlNUGFydFN0YWNrIGFjdGl2ZVN0YWNrID0gbnVsbDsKKwkJCQkJaWYgKGFyZWEgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIKKwkJCQkJCQkmJiAoKE1QbGFjZWhvbGRlcikgYXJlYSkuZ2V0UmVmKCkgaW5zdGFuY2VvZiBNQXJlYSkgeworCQkJCQkJLy8gRmluZCB0aGUgY3VycmVudGx5ICdhY3RpdmUnIHN0YWNrIGluIHRoZSBhcmVhCisJCQkJCQlNQXJlYSBhID0gKE1BcmVhKSAoKE1QbGFjZWhvbGRlcikgYXJlYSkuZ2V0UmVmKCk7CisJCQkJCQlNVUlFbGVtZW50IGN1ckFjdGl2ZSA9IGEuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJCQl3aGlsZSAoY3VyQWN0aXZlIGluc3RhbmNlb2YgTUVsZW1lbnRDb250YWluZXI8Pz4pIHsKKwkJCQkJCQlpZiAoY3VyQWN0aXZlIGluc3RhbmNlb2YgTVBhcnRTdGFjaykgeworCQkJCQkJCQlhY3RpdmVTdGFjayA9IChNUGFydFN0YWNrKSBjdXJBY3RpdmU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlNRWxlbWVudENvbnRhaW5lcjw/PiBjdXJDb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8Pz4pIGN1ckFjdGl2ZTsKKwkJCQkJCQljdXJBY3RpdmUgPSBjdXJDb250YWluZXIuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoYWN0aXZlU3RhY2sgIT0gbnVsbCkgeworCQkJCQkJYWN0aXZlU3RhY2suZ2V0Q2hpbGRyZW4oKS5hZGQocHJvdmlkZWRQYXJ0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIEZpbmQgdGhlIGZpcnN0IHZpc2libGUgc3RhY2sgaW4gdGhlIGFyZWEKKwkJCQkJCUxpc3Q8TVBhcnRTdGFjaz4gc2hhcmVkU3RhY2tzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyhhcmVhLCBudWxsLAorCQkJCQkJCQlNUGFydFN0YWNrLmNsYXNzLCBudWxsKTsKKwkJCQkJCWlmIChzaGFyZWRTdGFja3Muc2l6ZSgpID4gMCkgeworCQkJCQkJCWZvciAoTVBhcnRTdGFjayBzdGFjayA6IHNoYXJlZFN0YWNrcykgeworCQkJCQkJCQlpZiAoc3RhY2suaXNUb0JlUmVuZGVyZWQoKSkgeworCQkJCQkJCQkJc3RhY2suZ2V0Q2hpbGRyZW4oKS5hZGQocHJvdmlkZWRQYXJ0KTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlhZGRUb0xhc3RDb250YWluZXIobnVsbCwgcHJvdmlkZWRQYXJ0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisJCQkJCUxpc3Q8TUVsZW1lbnRDb250YWluZXI+IGNvbnRhaW5lcnMgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKGdldENvbnRhaW5lcigpLAorCQkJCQkJCW51bGwsIE1FbGVtZW50Q29udGFpbmVyLmNsYXNzLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNhdGVnb3J5KSwKKwkJCQkJCQlFTW9kZWxTZXJ2aWNlLlBSRVNFTlRBVElPTik7CisJCQkJCWlmIChjb250YWluZXJzLmlzRW1wdHkoKSkgeworCQkJCQkJLy8gY291bGRuJ3QgZmluZCBhbnkgY29udGFpbmVycyB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLCBqdXN0IGFkZCBpdCB0byB0aGUKKwkJCQkJCS8vIGVuZAorCQkJCQkJYWRkVG9MYXN0Q29udGFpbmVyKGNhdGVnb3J5LCBwcm92aWRlZFBhcnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gYWRkIHRoZSBwYXJ0IHRvIHRoZSBjb250YWluZXIKKwkJCQkJCU1FbGVtZW50Q29udGFpbmVyPE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQ+IGNvbnRhaW5lciA9IGNvbnRhaW5lcnMuZ2V0KDApOworCQkJCQkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gcHJvdmlkZWRQYXJ0LmdldEN1clNoYXJlZFJlZigpOworCQkJCQkJaWYgKHBsYWNlaG9sZGVyID09IG51bGwpIHsKKwkJCQkJCQljb250YWluZXIuZ2V0Q2hpbGRyZW4oKS5hZGQocHJvdmlkZWRQYXJ0KTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29udGFpbmVyLmdldENoaWxkcmVuKCkuYWRkKHBsYWNlaG9sZGVyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcHJvdmlkZWRQYXJ0OworCX0KKworCXByaXZhdGUgdm9pZCBhZGp1c3RQbGFjZWhvbGRlcihNUGFydCBwYXJ0KSB7CisJCWlmIChpc1NoYXJlZChwYXJ0KSkgeworCQkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gcGFydC5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJCS8vIGlmIHRoaXMgcGFydCBkb2Vzbid0IGhhdmUgYW55IHBsYWNlaG9sZGVycywgd2UgbmVlZCB0byBtYWtlIG9uZQorCQkJaWYgKHBsYWNlaG9sZGVyID09IG51bGwKKwkJCS8vIGFsdGVybmF0aXZlbHksIGlmIGl0IGhhcyBvbmUgYnV0IGl0J3Mgbm90IGluIHRoZSBjdXJyZW50IGNvbnRhaW5lciwgdGhlbiB3ZQorCQkJLy8gbmVlZCB0byBzcGF3biBhbm90aGVyIG9uZSBhcyB3ZSBkb24ndCB3YW50IHRvIHJldXNlIHRoZSBzYW1lIG9uZSBhbmQgZW5kIHVwCisJCQkvLyBzaGlmdGluZyB0aGF0IHBsYWNlaG9sZGVyIHRvIHRoZSBjdXJyZW50IGNvbnRhaW5lciBkdXJpbmcgdGhlIGFkZCBvcGVyYXRpb24KKwkJCQkJfHwgKHBsYWNlaG9sZGVyLmdldFBhcmVudCgpICE9IG51bGwgJiYgIWlzSW5Db250YWluZXIocGxhY2Vob2xkZXIpKSkgeworCQkJCXBsYWNlaG9sZGVyID0gY3JlYXRlU2hhcmVkUGFydChwYXJ0KTsKKwkJCQlwYXJ0LnNldEN1clNoYXJlZFJlZihwbGFjZWhvbGRlcik7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNTaGFyZWQoTVBhcnQgcGFydCkgeworCQlyZXR1cm4gZ2V0V2luZG93KCkuZ2V0U2hhcmVkRWxlbWVudHMoKS5jb250YWlucyhwYXJ0KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkVG9MYXN0Q29udGFpbmVyKFN0cmluZyBjYXRlZ29yeSwgTVBhcnQgcGFydCkgeworCQkvLyBPSywgd2UgaGF2ZW4ndCBmb3VuZCBhbiBleHBsaWNpdCBwbGFjZWhvbGRlcjsKKwkJLy8gSWYgdGhpcyBpcyBhIG11bHRpLWluc3RhbmNlIHZpZXcgc2VlIGlmIHRoZXJlJ3MgYSAnZ2xvYmFsJyBwbGFjZWhvbGRlcgorCQlTdHJpbmcgcGFydElkID0gcGFydC5nZXRFbGVtZW50SWQoKTsKKwkJaW50IGNvbG9uSW5kZXggPSBwYXJ0SWQgPT0gbnVsbCA/IC0xIDogcGFydElkLmluZGV4T2YoJzonKTsKKwkJaWYgKGNvbG9uSW5kZXggPj0gMCkgeworCQkJU3RyaW5nIGRlc2NJZCA9IHBhcnQuZ2V0RWxlbWVudElkKCkuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpOworCQkJZGVzY0lkICs9ICI6KiI7IC8vJE5PTi1OTFMtMSQKKwkJCUxpc3Q8TVBsYWNlaG9sZGVyPiBwaExpc3QgPSBtb2RlbFNlcnZpY2UuZmluZEVsZW1lbnRzKHdvcmtiZW5jaFdpbmRvdywgZGVzY0lkLAorCQkJCQlNUGxhY2Vob2xkZXIuY2xhc3MsIG51bGwsIEVNb2RlbFNlcnZpY2UuUFJFU0VOVEFUSU9OKTsKKwkJCWlmIChwaExpc3Quc2l6ZSgpID4gMCkgeworCQkJCU1VSUVsZW1lbnQgcGhQYXJlbnQgPSBwaExpc3QuZ2V0KDApLmdldFBhcmVudCgpOworCQkJCWlmIChwaFBhcmVudCBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spIHsKKwkJCQkJTVBhcnRTdGFjayB0aGVTdGFjayA9IChNUGFydFN0YWNrKSBwaFBhcmVudDsKKwkJCQkJaW50IHBoSW5kZXggPSB0aGVTdGFjay5nZXRDaGlsZHJlbigpLmluZGV4T2YocGhMaXN0LmdldCgwKSk7CisJCQkJCWFkanVzdFBsYWNlaG9sZGVyKHBhcnQpOworCQkJCQlNUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBwYXJ0LmdldEN1clNoYXJlZFJlZigpOworCQkJCQlpZiAocGxhY2Vob2xkZXIgPT0gbnVsbCkgeworCQkJCQkJdGhlU3RhY2suZ2V0Q2hpbGRyZW4oKS5hZGQocGhJbmRleCwgcGFydCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGVTdGFjay5nZXRDaGlsZHJlbigpLmFkZChwaEluZGV4LCBwbGFjZWhvbGRlcik7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBsYXN0Q29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSBnZXRMYXN0Q29udGFpbmVyKCk7CisJCU1QbGFjZWhvbGRlciBwbGFjZWhvbGRlciA9IHBhcnQuZ2V0Q3VyU2hhcmVkUmVmKCk7CisJCWlmIChwbGFjZWhvbGRlciA9PSBudWxsKSB7CisJCQlsYXN0Q29udGFpbmVyLmdldENoaWxkcmVuKCkuYWRkKHBhcnQpOworCQl9IGVsc2UgeworCQkJbGFzdENvbnRhaW5lci5nZXRDaGlsZHJlbigpLmFkZChwbGFjZWhvbGRlcik7CisJCX0KKworCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgeworCQkJbGFzdENvbnRhaW5lci5nZXRUYWdzKCkuYWRkKGNhdGVnb3J5KTsKKwkJfQorCX0KKworCXByaXZhdGUgTUVsZW1lbnRDb250YWluZXI8PyBleHRlbmRzIE1VSUVsZW1lbnQ+IGdldExhc3RDb250YWluZXIoKSB7CisJCU1FbGVtZW50Q29udGFpbmVyPD8gZXh0ZW5kcyBNVUlFbGVtZW50PiBzZWFyY2hSb290ID0gZ2V0Q29udGFpbmVyKCk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlMaXN0PE1VSUVsZW1lbnQ+IGNoaWxkcmVuID0gKExpc3Q8TVVJRWxlbWVudD4pIHNlYXJjaFJvb3QuZ2V0Q2hpbGRyZW4oKTsKKwkJaWYgKGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7CisJCQlNUGFydFN0YWNrIHN0YWNrID0gbW9kZWxTZXJ2aWNlLmNyZWF0ZU1vZGVsRWxlbWVudChNUGFydFN0YWNrLmNsYXNzKTsKKwkJCWNoaWxkcmVuLmFkZChzdGFjayk7CisJCQlyZXR1cm4gc3RhY2s7CisJCX0KKworCQlNRWxlbWVudENvbnRhaW5lcjw/PiBsYXN0Q29udGFpbmVyID0gZ2V0TGFzdENvbnRhaW5lcihzZWFyY2hSb290LCBjaGlsZHJlbik7CisJCWlmIChsYXN0Q29udGFpbmVyIGluc3RhbmNlb2YgTVBhcnRTdGFjaykgeworCQkJcmV0dXJuIGxhc3RDb250YWluZXI7CisJCX0KKworCQkvLyBObyBzdGFja3MgZm91bmQgbWFrZSBvbmUgYW5kIGFkZCBpdAorCQlNUGFydFN0YWNrIHN0YWNrID0gbW9kZWxTZXJ2aWNlLmNyZWF0ZU1vZGVsRWxlbWVudChNUGFydFN0YWNrLmNsYXNzKTsKKwkJc3RhY2suc2V0RWxlbWVudElkKCJDcmVhdGVkQnlHZXRMYXN0Q29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGNoaWxkcmVuLmdldCgwKSBpbnN0YW5jZW9mIE1QYXJ0U2FzaENvbnRhaW5lcikgeworCQkJTVBhcnRTYXNoQ29udGFpbmVyIHBzYyA9IChNUGFydFNhc2hDb250YWluZXIpIGNoaWxkcmVuLmdldCgwKTsKKwkJCXBzYy5nZXRDaGlsZHJlbigpLmFkZChzdGFjayk7CisJCX0gZWxzZSB7CisJCQkvLyBXZSBuZWVkIGEgc2FzaCBzbyAnaW5zZXJ0JyB0aGUgbmV3IHN0YWNrCisJCQltb2RlbFNlcnZpY2UuaW5zZXJ0KHN0YWNrLCAoTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCkgY2hpbGRyZW4uZ2V0KDApLAorCQkJCQlFTW9kZWxTZXJ2aWNlLlJJR0hUX09GLCAwLjVmKTsKKwkJfQorCQlyZXR1cm4gc3RhY2s7CisJfQorCisJcHJpdmF0ZSBNRWxlbWVudENvbnRhaW5lcjw/IGV4dGVuZHMgTVVJRWxlbWVudD4gZ2V0TGFzdENvbnRhaW5lcihNRWxlbWVudENvbnRhaW5lcjw/PiBjb250YWluZXIsIExpc3Q8Pz4gY2hpbGRyZW4pIHsKKwkJaWYgKGNoaWxkcmVuLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlmb3IgKGludCBpID0gY2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKKwkJCU9iamVjdCBtdWlFbGVtZW50ID0gY2hpbGRyZW4uZ2V0KGkpOworCQkJaWYgKG11aUVsZW1lbnQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJCU1FbGVtZW50Q29udGFpbmVyPD8+IGNoaWxkQ29udGFpbmVyID0gKE1FbGVtZW50Q29udGFpbmVyPD8+KSBtdWlFbGVtZW50OworCQkJCU1FbGVtZW50Q29udGFpbmVyPD8+IGxhc3RDb250YWluZXIgPSBnZXRMYXN0Q29udGFpbmVyKGNoaWxkQ29udGFpbmVyLAorCQkJCQkJY2hpbGRDb250YWluZXIuZ2V0Q2hpbGRyZW4oKSk7CisJCQkJaWYgKGxhc3RDb250YWluZXIgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbGFzdENvbnRhaW5lcjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gSWYgb25lIGNhbm5vdCBiZSBmb3VuZCwgYSBjaGVjayB3aWxsCisJICogYmUgcGVyZm9ybWVkIHRvIHNlZSB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkIGJ5IGEgcGxhY2Vob2xkZXIsIGlmIGl0IGlzLCB0aGUKKwkgKiBwbGFjZWhvbGRlcidzIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBpZiBhbnkuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gcXVlcnkKKwkgKiBAcmV0dXJuIHRoZSBlbGVtZW50J3MgcGFyZW50IGNvbnRhaW5lciwgb3IgdGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50J3MKKwkgKiAgICAgICAgIGN1cnJlbnQgcGxhY2Vob2xkZXIsIGlmIGl0IGhhcyBvbmUKKwkgKi8KKwlwcml2YXRlIE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGdldFBhcmVudChNVUlFbGVtZW50IGVsZW1lbnQpIHsKKwkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlNUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBlbGVtZW50LmdldEN1clNoYXJlZFJlZigpOworCQkJaWYgKHBsYWNlaG9sZGVyID09IG51bGwpIHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBjb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4pIGdldENvbnRhaW5lcigpOworCQkJCXJldHVybiBmaW5kQ29udGFpbmVyKGNvbnRhaW5lciwgZWxlbWVudCk7CisJCQl9CisJCQlyZXR1cm4gcGxhY2Vob2xkZXIuZ2V0UGFyZW50KCk7CisJCX0KKwkJcmV0dXJuIHBhcmVudDsKKwl9CisKKwlwcml2YXRlIE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGZpbmRDb250YWluZXIoTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gY29udGFpbmVyLAorCQkJTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCWZvciAoTVVJRWxlbWVudCBjaGlsZCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAoY2hpbGQgPT0gZWxlbWVudCkgeworCQkJCXJldHVybiBjb250YWluZXI7CisJCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTVBsYWNlaG9sZGVyKSB7CisJCQkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gKE1QbGFjZWhvbGRlcikgY2hpbGQ7CisJCQkJTVVJRWxlbWVudCByZWYgPSBwbGFjZWhvbGRlci5nZXRSZWYoKTsKKwkJCQlpZiAocmVmID09IGVsZW1lbnQpIHsKKwkJCQkJcmV0dXJuIGNvbnRhaW5lcjsKKwkJCQl9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIE1FbGVtZW50Q29udGFpbmVyPD8+KSB7CisJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiByZWYyID0gKE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+KSByZWY7CisJCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IG1hdGNoID0gZmluZENvbnRhaW5lcihyZWYyLCBlbGVtZW50KTsKKwkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiBtYXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IGNoaWxkMiA9IChNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PikgY2hpbGQ7CisJCQkJTUVsZW1lbnRDb250YWluZXI8TVVJRWxlbWVudD4gbWF0Y2ggPSBmaW5kQ29udGFpbmVyKGNoaWxkMiwgZWxlbWVudCk7CisJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG1hdGNoOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIE1VSUVsZW1lbnQgZ2V0UmVtb3ZlVGFyZ2V0KE1QYXJ0IHBhcnQpIHsKKwkJTVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyID0gZ2V0TG9jYWxQbGFjZWhvbGRlcihwYXJ0KTsKKwkJcmV0dXJuIHBsYWNlaG9sZGVyID09IG51bGwgPyBwYXJ0IDogcGxhY2Vob2xkZXI7CisJfQorCisJcHVibGljIE1QYXJ0IGFkZFBhcnQoTVBhcnQgcGFydCkgeworCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnQpOworCQlNUGFydCBsb2NhbFBhcnQgPSBmaW5kUGFydChwYXJ0LmdldEVsZW1lbnRJZCgpKTsKKwkJcmV0dXJuIGFkZFBhcnQocGFydCwgbG9jYWxQYXJ0ID09IG51bGwgPyBwYXJ0IDogbG9jYWxQYXJ0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTVBhcnQgc2hvd1BhcnQoU3RyaW5nIGlkLCBQYXJ0U3RhdGUgcGFydFN0YXRlKSB7CisJCUFzc2VydC5pc05vdE51bGwoaWQpOworCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnRTdGF0ZSk7CisKKwkJTVBhcnQgcGFydCA9IGZpbmRQYXJ0KGlkKTsKKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJTVBhcnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtb2RlbFNlcnZpY2UuZ2V0UGFydERlc2NyaXB0b3IoaWQpOworCQkJcGFydCA9IGNyZWF0ZVBhcnQoZGVzY3JpcHRvcik7CisJCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNob3dQYXJ0KGFkZFBhcnQocGFydCksIHBhcnRTdGF0ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1QYXJ0IHNob3dQYXJ0KE1QYXJ0IHBhcnQsIFBhcnRTdGF0ZSBwYXJ0U3RhdGUpIHsKKwkJQXNzZXJ0LmlzTm90TnVsbChwYXJ0KTsKKwkJQXNzZXJ0LmlzTm90TnVsbChwYXJ0U3RhdGUpOworCisJCU1QYXJ0IGFkZGVkUGFydCA9IGFkZFBhcnQocGFydCk7CisJCU1QbGFjZWhvbGRlciBsb2NhbFBsYWNlaG9sZGVyID0gZ2V0TG9jYWxQbGFjZWhvbGRlcihhZGRlZFBhcnQpOworCQkvLyBjb3JyZWN0IHRoZSBwbGFjZWhvbGRlciBzZXR0aW5nIGlmIG5lY2Vzc2FyeQorCQlpZiAobG9jYWxQbGFjZWhvbGRlciAhPSBudWxsICYmIGFkZGVkUGFydC5nZXRDdXJTaGFyZWRSZWYoKSAhPSBsb2NhbFBsYWNlaG9sZGVyKSB7CisJCQlhZGRlZFBhcnQuc2V0Q3VyU2hhcmVkUmVmKGxvY2FsUGxhY2Vob2xkZXIpOworCQl9CisKKwkJc3dpdGNoIChwYXJ0U3RhdGUpIHsKKwkJY2FzZSBBQ1RJVkFURToKKwkJCWFjdGl2YXRlKGFkZGVkUGFydCk7CisJCQlyZXR1cm4gYWRkZWRQYXJ0OworCQljYXNlIFZJU0lCTEU6CisJCQlNUGFydCBhY3RpdmVQYXJ0ID0gZ2V0QWN0aXZlUGFydCgpOworCQkJaWYgKGFjdGl2ZVBhcnQgPT0gbnVsbAorCQkJCQl8fCAoYWN0aXZlUGFydCAhPSBhZGRlZFBhcnQgJiYgZ2V0UGFyZW50KGFjdGl2ZVBhcnQpID09IGdldFBhcmVudChhZGRlZFBhcnQpKSkgeworCQkJCWRlbGVnYXRlQnJpbmdUb1RvcChhZGRlZFBhcnQpOworCQkJCWFjdGl2YXRlKGFkZGVkUGFydCk7CisJCQl9IGVsc2UgeworCQkJCWJyaW5nVG9Ub3AoYWRkZWRQYXJ0KTsKKwkJCX0KKwkJCXJldHVybiBhZGRlZFBhcnQ7CisJCWNhc2UgQ1JFQVRFOgorCQkJY3JlYXRlRWxlbWVudChhZGRlZFBhcnQpOworCQkJcmV0dXJuIGFkZGVkUGFydDsKKwkJfQorCQlyZXR1cm4gYWRkZWRQYXJ0OworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVFbGVtZW50KE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAobW9kZWxTZXJ2aWNlLmlzSG9zdGVkRWxlbWVudChlbGVtZW50LCB3b3JrYmVuY2hXaW5kb3cpKSB7CisJCQkvLyBhc3N1bWUgdGhlIGNsaWVudCBoYXMgZnVsbCBjb250cm9sCisJCQlyZXR1cm47CisJCX0KKworCQlNUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBlbGVtZW50LmdldEN1clNoYXJlZFJlZigpOworCQlpZiAocGxhY2Vob2xkZXIgIT0gbnVsbCkgeworCQkJZWxlbWVudC5zZXRUb0JlUmVuZGVyZWQodHJ1ZSk7CisJCQllbGVtZW50ID0gcGxhY2Vob2xkZXI7CisJCX0KKworCQkvLyByZW5kZXIgdGhpcyBlbGVtZW50CisJCWVsZW1lbnQuc2V0VG9CZVJlbmRlcmVkKHRydWUpOworCisJCS8vIHJlbmRlciBhbGwgb2YgaXRzIHBhcmVudHMKKwkJTVVJRWxlbWVudCBwYXJlbnRXaW5kb3cgPSB3b3JrYmVuY2hXaW5kb3c7CisJCS8vIGRldGVybWluZSB0aGUgdG9wIHBhcmVudCB0aGF0IG5lZWRzIHRvIGJlIGZvcmNpYmx5IGNyZWF0ZWQKKwkJTVVJRWxlbWVudCB0YXJnZXQgPSBudWxsOworCQlNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IHBhcmVudFdpbmRvdykgeworCQkJcGFyZW50LnNldFRvQmVSZW5kZXJlZCh0cnVlKTsKKwkJCWlmIChwYXJlbnQuZ2V0V2lkZ2V0KCkgPT0gbnVsbCkgeworCQkJCXRhcmdldCA9IHBhcmVudDsKKwkJCX0KKwkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwkJfQorCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKKwkJCS8vIGZvcmNlIHRoZSBlbGVtZW50J3MgcGFyZW50IGhpZXJhcmNoeSB0byBiZSBjcmVhdGVkCisJCQllbmdpbmUuY3JlYXRlR3VpKHRhcmdldCk7CisJCX0KKwkJLy8gYXNrIHRoZSBlbmdpbmUgdG8gY3JlYXRlIHRoZSBlbGVtZW50CisJCWlmIChlbGVtZW50LmdldFdpZGdldCgpID09IG51bGwpCisJCQllbmdpbmUuY3JlYXRlR3VpKGVsZW1lbnQpOworCisJCXBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMSkgeworCQkJLy8gaWYgd2UncmUgdGhlIG9ubHkgY2hpbGQsIHNldCBvdXJzZWx2ZXMgYXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQKKwkJCXBhcmVudC5zZXRTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJaWYgKGFjdGl2ZVBhcnQgPT0gbnVsbCkgeworCQkJTVBhcnQgY2FuZGlkYXRlID0gcGFydEFjdGl2YXRpb25IaXN0b3J5LmdldEFjdGl2YXRpb25DYW5kaWRhdGUoZ2V0UGFydHMoKSk7CisJCQlpZiAoY2FuZGlkYXRlICE9IG51bGwpIHsKKwkJCQlhY3RpdmF0ZShjYW5kaWRhdGUpOworCQkJfQorCQl9IGVsc2UgaWYgKCFwYXJ0QWN0aXZhdGlvbkhpc3RvcnkuaXNWYWxpZChhY3RpdmVQYXJ0KSB8fCAhZ2V0UGFydHMoKS5jb250YWlucyhhY3RpdmVQYXJ0KSkgeworCQkJTVBhcnQgY2FuZGlkYXRlID0gcGFydEFjdGl2YXRpb25IaXN0b3J5LmdldE5leHRBY3RpdmF0aW9uQ2FuZGlkYXRlKGdldFBhcnRzKCksCisJCQkJCWFjdGl2ZVBhcnQpOworCQkJaWYgKGNhbmRpZGF0ZSAhPSBudWxsKSB7CisJCQkJYWN0aXZhdGUoY2FuZGlkYXRlKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVQYXJ0KE1QYXJ0IHBhcnQpIHsKKwkJaGlkZVBhcnQocGFydCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVQYXJ0KE1QYXJ0IHBhcnQsIGJvb2xlYW4gZm9yY2UpIHsKKwkJaWYgKGlzSW5Db250YWluZXIocGFydCkpIHsKKwkJCU1QbGFjZWhvbGRlciBzaGFyZWRSZWYgPSBwYXJ0LmdldEN1clNoYXJlZFJlZigpOworCQkJTVVJRWxlbWVudCB0b0JlUmVtb3ZlZCA9IGdldFJlbW92ZVRhcmdldChwYXJ0KTsKKwkJCU1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IHBhcmVudCA9IGdldFBhcmVudCh0b0JlUmVtb3ZlZCk7CisJCQlMaXN0PE1VSUVsZW1lbnQ+IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7CisKKwkJCS8vIGNoZWNrIGlmIHdlJ3JlIGEgcGxhY2Vob2xkZXIgYnV0IG5vdCBhY3R1YWxseSB0aGUgc2hhcmVkIHJlZiBvZiB0aGUgcGFydAorCQkJaWYgKHRvQmVSZW1vdmVkICE9IHBhcnQgJiYgdG9CZVJlbW92ZWQgaW5zdGFuY2VvZiBNUGxhY2Vob2xkZXIKKwkJCQkJJiYgc2hhcmVkUmVmICE9IHRvQmVSZW1vdmVkKSB7CisJCQkJdG9CZVJlbW92ZWQuc2V0VG9CZVJlbmRlcmVkKGZhbHNlKTsKKworCQkJCS8vIGlmIHNvLCBub3QgbXVjaCB0byBkbywgcmVtb3ZlIG91cnNlbHZlcyBpZiBuZWNlc3NhcnkgYnV0IHRoYXQncyBpdAorCQkJCWlmIChmb3JjZSB8fCBwYXJ0LmdldFRhZ3MoKS5jb250YWlucyhSRU1PVkVfT05fSElERV9UQUcpKSB7CisJCQkJCXBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZSh0b0JlUmVtb3ZlZCk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKworCQkJYm9vbGVhbiBpc0FjdGl2ZUNoaWxkID0gaXNBY3RpdmVDaGlsZChwYXJ0KTsKKwkJCU1QYXJ0IGFjdGl2YXRpb25DYW5kaWRhdGUgPSBudWxsOworCQkJLy8gY2hlY2sgaWYgd2UncmUgdGhlIGFjdGl2ZSBjaGlsZAorCQkJaWYgKGlzQWN0aXZlQ2hpbGQpIHsKKwkJCQkvLyBnZXQgdGhlIGFjdGl2YXRpb24gY2FuZGlkYXRlIGlmIHdlIGFyZQorCQkJCWFjdGl2YXRpb25DYW5kaWRhdGUgPSBwYXJ0QWN0aXZhdGlvbkhpc3RvcnkuZ2V0TmV4dEFjdGl2YXRpb25DYW5kaWRhdGUoZ2V0UGFydHMoKSwKKwkJCQkJCXBhcnQpOworCQkJfQorCisJCQlNUGVyc3BlY3RpdmUgdGhlUGVyc3AgPSBtb2RlbFNlcnZpY2UuZ2V0UGVyc3BlY3RpdmVGb3IodG9CZVJlbW92ZWQpOworCQkJYm9vbGVhbiBuZWVkTmV3U2VsID0gdGhlUGVyc3AgPT0gbnVsbCB8fCAhdGhlUGVyc3AuZ2V0VGFncygpLmNvbnRhaW5zKCJQZXJzcENsb3NpbmciKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKG5lZWROZXdTZWwpIHsKKwkJCQlpZiAocGFyZW50LmdldFNlbGVjdGVkRWxlbWVudCgpID09IHRvQmVSZW1vdmVkKSB7CisJCQkJCS8vIGlmIHdlJ3JlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGFuZCB3ZSdyZSBnb2luZyB0byBiZSBoaWRkZW4sIG5lZWQgdG8gc2VsZWN0CisJCQkJCS8vIHNvbWV0aGluZyBlbHNlCisJCQkJCU1VSUVsZW1lbnQgY2FuZGlkYXRlID0gcGFydEFjdGl2YXRpb25IaXN0b3J5LmdldFNpYmxpbmdTZWxlY3Rpb25DYW5kaWRhdGUocGFydCk7CisJCQkJCWNhbmRpZGF0ZSA9IGNhbmRpZGF0ZSA9PSBudWxsID8gbnVsbAorCQkJCQkJCTogY2FuZGlkYXRlLmdldEN1clNoYXJlZFJlZigpID09IG51bGwgPyBjYW5kaWRhdGUgOiBjYW5kaWRhdGUKKwkJCQkJCQkJCS5nZXRDdXJTaGFyZWRSZWYoKTsKKwkJCQkJaWYgKGNhbmRpZGF0ZSAhPSBudWxsICYmIGNoaWxkcmVuLmNvbnRhaW5zKGNhbmRpZGF0ZSkpIHsKKwkJCQkJCXBhcmVudC5zZXRTZWxlY3RlZEVsZW1lbnQoY2FuZGlkYXRlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZvciAoTVVJRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuKSB7CisJCQkJCQkJaWYgKGNoaWxkICE9IHRvQmVSZW1vdmVkICYmIGNoaWxkLmlzVG9CZVJlbmRlcmVkKCkpIHsKKwkJCQkJCQkJcGFyZW50LnNldFNlbGVjdGVkRWxlbWVudChjaGlsZCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChhY3RpdmF0aW9uQ2FuZGlkYXRlID09IG51bGwpIHsKKwkJCQkJLy8gbm90aGluZyBlbHNlIHRvIGFjdGl2YXRlIGFuZCB3ZSdyZSB0aGUgYWN0aXZlIGNoaWxkLCBkZWFjdGl2YXRlCisJCQkJCWlmIChpc0FjdGl2ZUNoaWxkKSB7CisJCQkJCQlwYXJ0LmdldENvbnRleHQoKS5kZWFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBhY3RpdmF0ZSBvdXIgY2FuZGlkYXRlCisJCQkJCWFjdGl2YXRlKGFjdGl2YXRpb25DYW5kaWRhdGUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHRvQmVSZW1vdmVkICE9IG51bGwpIHsKKwkJCQl0b0JlUmVtb3ZlZC5zZXRUb0JlUmVuZGVyZWQoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlwYXJ0LnNldFRvQmVSZW5kZXJlZChmYWxzZSk7CisJCQl9CisKKwkJCWlmIChwYXJlbnQuZ2V0U2VsZWN0ZWRFbGVtZW50KCkgPT0gdG9CZVJlbW92ZWQpIHsKKwkJCQlwYXJlbnQuc2V0U2VsZWN0ZWRFbGVtZW50KG51bGwpOworCQkJfQorCisJCQlpZiAoZm9yY2UgfHwgcGFydC5nZXRUYWdzKCkuY29udGFpbnMoUkVNT1ZFX09OX0hJREVfVEFHKSkgeworCQkJCWNoaWxkcmVuLnJlbW92ZSh0b0JlUmVtb3ZlZCk7CisJCQl9CisJCQkvLyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGFjdGl2YXRpb24gaGlzdG9yeSBhbHNvIHNpbmNlIHdlJ3JlIGJlaW5nIGhpZGRlbgorCQkJcGFydEFjdGl2YXRpb25IaXN0b3J5LmZvcmdldChnZXRXaW5kb3coKSwgcGFydCwgdG9CZVJlbW92ZWQgPT0gcGFydCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNBY3RpdmVDaGlsZChNUGFydCBwYXJ0KSB7CisJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gcGFydC5nZXRDb250ZXh0KCk7CisJCXJldHVybiBjb250ZXh0ICE9IG51bGwgJiYgY29udGV4dC5nZXRQYXJlbnQoKS5nZXRBY3RpdmVDaGlsZCgpID09IGNvbnRleHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248TVBhcnQ+IGdldERpcnR5UGFydHMoKSB7CisJCUxpc3Q8TVBhcnQ+IGRpcnR5UGFydHMgPSBuZXcgQXJyYXlMaXN0PE1QYXJ0PigpOworCQlmb3IgKE1QYXJ0IHBhcnQgOiBnZXRQYXJ0cygpKSB7CisJCQlpZiAocGFydC5pc0RpcnR5KCkpIHsKKwkJCQlkaXJ0eVBhcnRzLmFkZChwYXJ0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGlydHlQYXJ0czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYXZlUGFydChNUGFydCBwYXJ0LCBib29sZWFuIGNvbmZpcm0pIHsKKwkJaWYgKCFwYXJ0LmlzRGlydHkoKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoc2F2ZUhhbmRsZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIHNhdmVIYW5kbGVyLnNhdmUocGFydCwgY29uZmlybSk7CisJCX0KKworCQlPYmplY3QgY2xpZW50ID0gcGFydC5nZXRPYmplY3QoKTsKKwkJdHJ5IHsKKwkJCUNvbnRleHRJbmplY3Rpb25GYWN0b3J5Lmludm9rZShjbGllbnQsIFBlcnNpc3QuY2xhc3MsIHBhcnQuZ2V0Q29udGV4dCgpKTsKKwkJfSBjYXRjaCAoSW5qZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCWxvZygiRmFpbGVkIHRvIHBlcnNpc3QgY29udGVudHMgb2YgcGFydCIsICJGYWlsZWQgdG8gcGVyc2lzdCBjb250ZW50cyBvZiBwYXJ0ICh7MH0pIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXBhcnQuZ2V0RWxlbWVudElkKCksIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCWxvZygiRmFpbGVkIHRvIHBlcnNpc3QgY29udGVudHMgb2YgcGFydCB2aWEgREkiLCAvLyROT04tTkxTLTEkCisJCQkJCSJGYWlsZWQgdG8gcGVyc2lzdCBjb250ZW50cyBvZiBwYXJ0ICh7MH0pIHZpYSBESSIsIHBhcnQuZ2V0RWxlbWVudElkKCksIGUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2F2ZUFsbChib29sZWFuIGNvbmZpcm0pIHsKKwkJQ29sbGVjdGlvbjxNUGFydD4gZGlydHlQYXJ0cyA9IGdldERpcnR5UGFydHMoKTsKKwkJaWYgKGRpcnR5UGFydHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoc2F2ZUhhbmRsZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIHNhdmVIYW5kbGVyLnNhdmVQYXJ0cyhkaXJ0eVBhcnRzLCBjb25maXJtKTsKKwkJfQorCisJCWZvciAoTVBhcnQgZGlydHlQYXJ0IDogZGlydHlQYXJ0cykgeworCQkJaWYgKCFzYXZlUGFydChkaXJ0eVBhcnQsIGZhbHNlKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjxNSW5wdXRQYXJ0PiBnZXRJbnB1dFBhcnRzKFN0cmluZyBpbnB1dFVyaSkgeworCQlBc3NlcnQuaXNOb3ROdWxsKGlucHV0VXJpLCAiSW5wdXQgdXJpIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCisJCUNvbGxlY3Rpb248TUlucHV0UGFydD4gcnYgPSBuZXcgQXJyYXlMaXN0PE1JbnB1dFBhcnQ+KCk7CisKKwkJZm9yIChNSW5wdXRQYXJ0IHAgOiBnZXRQYXJ0cyhNSW5wdXRQYXJ0LmNsYXNzLCBudWxsKSkgeworCQkJaWYgKGlucHV0VXJpLmVxdWFscyhwLmdldElucHV0VVJJKCkpKSB7CisJCQkJcnYuYWRkKHApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJ2OworCX0KKworCS8qKgorCSAqICJDb250YWluZXIiIGhlcmUgaXM6IDEpIGEgc2VsZWN0ZWQgTVBlcnNwZWN0aXZlLCBvciwgaWYgbm9uZSBhdmFpbGFibGUgMikgdGhlIE1XaW5kb3cgZm9yCisJICogd2hpY2ggdGhpcyBwYXJ0IHNlcnZpY2UgaXMgY3JlYXRlZCwgb3IsIGlmIG5vdCBhdmFpbGFibGUsIDMpIHRoZSBNQXBwbGljYXRpb24uCisJICovCisJcHJpdmF0ZSBNRWxlbWVudENvbnRhaW5lcjw/IGV4dGVuZHMgTVVJRWxlbWVudD4gZ2V0Q29udGFpbmVyKCkgeworCQlNRWxlbWVudENvbnRhaW5lcjw/IGV4dGVuZHMgTVVJRWxlbWVudD4gb3V0ZXJDb250YWluZXIgPSAod29ya2JlbmNoV2luZG93ICE9IG51bGwpID8gd29ya2JlbmNoV2luZG93CisJCQkJOiBhcHBsaWNhdGlvbjsKKworCQkvLyBzZWUgaWYgd2UgY2FuIG5hcnJvdyBpdCBkb3duIHRvIHRoZSBhY3RpdmUgcGVyc3BlY3RpdmUKKwkJZm9yIChNRWxlbWVudENvbnRhaW5lcjw/IGV4dGVuZHMgTVVJRWxlbWVudD4gY29udGFpbmVyID0gb3V0ZXJDb250YWluZXI7IGNvbnRhaW5lciAhPSBudWxsOykgeworCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJCXJldHVybiBjb250YWluZXI7CisJCQl9CisJCQlPYmplY3QgY2hpbGQgPSBjb250YWluZXIuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQlpZiAoY2hpbGQgPT0gbnVsbCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTUVsZW1lbnRDb250YWluZXI8Pz4pIHsKKwkJCQljb250YWluZXIgPSAoTUVsZW1lbnRDb250YWluZXI8Pz4pIGNoaWxkOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gb3V0ZXJDb250YWluZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9QYXJ0U2VydmljZVNhdmVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BhcnRTZXJ2aWNlU2F2ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE1MzQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9QYXJ0U2VydmljZVNhdmVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLkluamVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuUGVyc2lzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSVNhdmVIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBQYXJ0U2VydmljZVNhdmVIYW5kbGVyIGltcGxlbWVudHMgSVNhdmVIYW5kbGVyIHsKKworCXB1YmxpYyBMb2dnZXIgbG9nZ2VyOworCisJcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgdW5pZGVudGlmaWVkTWVzc2FnZSwgU3RyaW5nIGlkZW50aWZpZWRNZXNzYWdlLCBTdHJpbmcgaWQsIEV4Y2VwdGlvbiBlKSB7CisJCWlmIChsb2dnZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKKwkJCWxvZ2dlci5lcnJvcihlLCB1bmlkZW50aWZpZWRNZXNzYWdlKTsKKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5lcnJvcihlLCBOTFMuYmluZChpZGVudGlmaWVkTWVzc2FnZSwgaWQpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhdmUoTVBhcnQgZGlydHlQYXJ0LCBib29sZWFuIGNvbmZpcm0pIHsKKwkJaWYgKGNvbmZpcm0pIHsKKwkJCXN3aXRjaCAocHJvbXB0VG9TYXZlKGRpcnR5UGFydCkpIHsKKwkJCWNhc2UgTk86CisJCQkJcmV0dXJuIHRydWU7CisJCQljYXNlIENBTkNFTDoKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQljYXNlIFlFUzoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCU9iamVjdCBjbGllbnQgPSBkaXJ0eVBhcnQuZ2V0T2JqZWN0KCk7CisJCXRyeSB7CisJCQlDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5pbnZva2UoY2xpZW50LCBQZXJzaXN0LmNsYXNzLCBkaXJ0eVBhcnQuZ2V0Q29udGV4dCgpKTsKKwkJfSBjYXRjaCAoSW5qZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCWxvZygiRmFpbGVkIHRvIHBlcnNpc3QgY29udGVudHMgb2YgcGFydCIsICJGYWlsZWQgdG8gcGVyc2lzdCBjb250ZW50cyBvZiBwYXJ0ICh7MH0pIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCWRpcnR5UGFydC5nZXRFbGVtZW50SWQoKSwgZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJbG9nKCJGYWlsZWQgdG8gcGVyc2lzdCBjb250ZW50cyBvZiBwYXJ0IHZpYSBESSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIkZhaWxlZCB0byBwZXJzaXN0IGNvbnRlbnRzIG9mIHBhcnQgKHswfSkgdmlhIERJIiwgZGlydHlQYXJ0LmdldEVsZW1lbnRJZCgpLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhdmVQYXJ0cyhDb2xsZWN0aW9uPE1QYXJ0PiBkaXJ0eVBhcnRzLCBib29sZWFuIGNvbmZpcm0pIHsKKwkJaWYgKGNvbmZpcm0pIHsKKwkJCUxpc3Q8TVBhcnQ+IGRpcnR5UGFydHNMaXN0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PE1QYXJ0PigKKwkJCQkJZGlydHlQYXJ0cykpOworCQkJU2F2ZVtdIGRlY2lzaW9ucyA9IHByb21wdFRvU2F2ZShkaXJ0eVBhcnRzTGlzdCk7CisJCQlmb3IgKFNhdmUgZGVjaXNpb24gOiBkZWNpc2lvbnMpIHsKKwkJCQlpZiAoZGVjaXNpb24gPT0gU2F2ZS5DQU5DRUwpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNpc2lvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoZGVjaXNpb25zW2ldID09IFNhdmUuWUVTKSB7CisJCQkJCWlmICghc2F2ZShkaXJ0eVBhcnRzTGlzdC5nZXQoaSksIGZhbHNlKSkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlmb3IgKE1QYXJ0IGRpcnR5UGFydCA6IGRpcnR5UGFydHMpIHsKKwkJCWlmICghc2F2ZShkaXJ0eVBhcnQsIGZhbHNlKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2F2ZSBwcm9tcHRUb1NhdmUoTVBhcnQgZGlydHlQYXJ0KSB7CisJCXJldHVybiBTYXZlLllFUzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2F2ZVtdIHByb21wdFRvU2F2ZShDb2xsZWN0aW9uPE1QYXJ0PiBkaXJ0eVBhcnRzKSB7CisJCVNhdmVbXSByYyA9IG5ldyBTYXZlW2RpcnR5UGFydHMuc2l6ZSgpXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByYy5sZW5ndGg7IGkrKykgeworCQkJcmNbaV0gPSBTYXZlLllFUzsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BsYWNlaG9sZGVyUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUGxhY2Vob2xkZXJSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTcxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BsYWNlaG9sZGVyUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NQXJlYTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBsYWNlaG9sZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5pbXBsLkFkdmFuY2VkRmFjdG9yeUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFN0YWNrOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5pbXBsLkJhc2ljRmFjdG9yeUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGFydFNlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FUGxhY2Vob2xkZXJSZXNvbHZlcjsNCisNCisvKioNCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgcmVzb2x2ZXIgdGhhdCBleHBlY3RzIHRoZSBpZCBvZiB0aGUgcGxhY2Vob2xkZXIgdG8gbWF0Y2ggdGhlIGlkIG9mIGENCisgKiBQYXJ0RGVzY3JpcHRvci4gSXQgd2lsbCBjcmVhdGUgYW4gTVBhcnQgZnJvbSB0aGUgZGVzY3JpcHRvciBhbmQgYWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZQ0KKyAqIHdpbmRvdyd3ICdzaGFyZWRFbGVtZW50TGlzdCcgaWYgbmVjZXNzYXJ5Lg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQbGFjZWhvbGRlclJlc29sdmVyIGltcGxlbWVudHMgRVBsYWNlaG9sZGVyUmVzb2x2ZXIgew0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgcmVzb2x2ZVBsYWNlaG9sZGVyUmVmKE1QbGFjZWhvbGRlciBwaCwgTVdpbmRvdyByZWZXaW4pIHsNCisJCWlmIChwaC5nZXRSZWYoKSAhPSBudWxsKQ0KKwkJCXJldHVybjsNCisNCisJCS8vIE11c3QgZ2l2ZSB1cyB0aGUgd2luZG93IHRoYXQgeW91IGFyZSByZXNvbHZpbmcgZm9yLi4uDQorCQlBc3NlcnQuaXNMZWdhbChyZWZXaW4gIT0gbnVsbCk7DQorDQorCQkvLyAuLmFuZCBpdCBtdXN0IGJlIGEgJ3RvcCBsZXZlbCcgd2luZG93DQorCQlNVUlFbGVtZW50IHJlZlBhcmVudCA9IHJlZldpbi5nZXRQYXJlbnQoKTsNCisJCUFzc2VydC5pc0xlZ2FsKHJlZlBhcmVudCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbik7DQorDQorCQkvLyBTbyB3ZSBhbHJlYWR5IGhhdmUgYSBtYXRjaGluZyBzaGFyZWQgZWxlbWVudCA/DQorCQlMaXN0PE1VSUVsZW1lbnQ+IHNoYXJlZEVsZW1lbnRzID0gcmVmV2luLmdldFNoYXJlZEVsZW1lbnRzKCk7DQorCQlmb3IgKE1VSUVsZW1lbnQgc2UgOiBzaGFyZWRFbGVtZW50cykgew0KKwkJCWlmIChwaC5nZXRFbGVtZW50SWQoKS5lcXVhbHMoc2UuZ2V0RWxlbWVudElkKCkpKSB7DQorCQkJCXBoLnNldFJlZihzZSk7DQorCQkJCXJldHVybjsNCisJCQl9DQorCQl9DQorDQorCQkvLyBIYWNrIHRvIG1ha2UgdGhlIDMueCBjb21wYXRpYmlsaXR5IGxheWVyIHdvcmsNCisJCWlmIChwaC5nZXRFbGVtZW50SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCS8vIFRoaXMgY29kZSBpcyBmb3IgdGhlIGVjbGlwc2UgY29tcGF0aWJpbGl0eSBsYXllci4uLg0KKwkJCU1BcmVhIHNoYXJlZEFyZWEgPSBBZHZhbmNlZEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVBcmVhKCk7DQorCQkJLy8gc2hhcmVkQXJlYS5zZXRMYWJlbCgiRWRpdG9yIEFyZWEiKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwkJCU1QYXJ0U3RhY2sgZWRpdG9yU3RhY2sgPSBCYXNpY0ZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQYXJ0U3RhY2soKTsNCisJCQllZGl0b3JTdGFjay5nZXRUYWdzKCkuYWRkKCJvcmcuZWNsaXBzZS5lNC5wcmltYXJ5RGF0YVN0YWNrIik7IC8vJE5PTi1OTFMtMSQNCisJCQllZGl0b3JTdGFjay5nZXRUYWdzKCkuYWRkKCJFZGl0b3JTdGFjayIpOyAvLyROT04tTkxTLTEkDQorCQkJZWRpdG9yU3RhY2suc2V0RWxlbWVudElkKCJvcmcuZWNsaXBzZS5lNC5wcmltYXJ5RGF0YVN0YWNrIik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaGFyZWRBcmVhLmdldENoaWxkcmVuKCkuYWRkKGVkaXRvclN0YWNrKTsNCisJCQlzaGFyZWRBcmVhLnNldEVsZW1lbnRJZChwaC5nZXRFbGVtZW50SWQoKSk7DQorDQorCQkJcmVmV2luLmdldFNoYXJlZEVsZW1lbnRzKCkuYWRkKHNoYXJlZEFyZWEpOw0KKwkJCXBoLnNldFJlZihzaGFyZWRBcmVhKTsNCisJCQlyZXR1cm47DQorCQl9DQorDQorCQkvLyBBc3N1bWUgdGhhdCB0aGUgcGxhY2Vob2xkZXIgaXMgdG8gYSBzaGFyZWQgJ3BhcnQnDQorCQlFUGFydFNlcnZpY2UgcHMgPSByZWZXaW4uZ2V0Q29udGV4dCgpLmdldChFUGFydFNlcnZpY2UuY2xhc3MpOw0KKwkJTVBhcnQgbmV3UmVmZXJlbmNlZFBhcnQgPSBwcy5jcmVhdGVQYXJ0KHBoLmdldEVsZW1lbnRJZCgpKTsNCisJCWlmIChuZXdSZWZlcmVuY2VkUGFydCAhPSBudWxsKSB7DQorCQkJcmVmV2luLmdldFNoYXJlZEVsZW1lbnRzKCkuYWRkKG5ld1JlZmVyZW5jZWRQYXJ0KTsNCisJCQlwaC5zZXRSZWYobmV3UmVmZXJlbmNlZFBhcnQpOw0KKwkJCXJldHVybjsNCisJCX0NCisNCisJCS8vIFNIb3VsZCB3ZSBsb2cgLyBzaG93IGFuIGV4Y2VwdGlvbiBoZXJlID8NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1BvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Qb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQzMGJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Qb2xpY3kuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCisvKioKKyAqIEEgY29tbW9uIGZhY2lsaXR5IGZvciBwYXJzaW5nIHRoZQorICogPGNvZGU+b3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLy5vcHRpb25zPC9jb2RlPiBmaWxlLgorICoKKyAqLworcHVibGljIGNsYXNzIFBvbGljeSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUcgPSAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0NNRFMgPSAiL3RyYWNlL2NvbW1hbmRzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX01FTlVTID0gIi90cmFjZS9tZW51cyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19DT05URVhUUyA9ICIvdHJhY2UvZWNsaXBzZS5jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0NPTlRFWFRTX1ZFUkJPU0UgPSAiL3RyYWNlL2VjbGlwc2UuY29udGV4dC52ZXJib3NlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1dPUktCRU5DSCA9ICIvdHJhY2Uvd29ya2JlbmNoIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1JFTkRFUkVSID0gIi90cmFjZS9yZW5kZXJlciI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUHJvZ3Jlc3NNb25pdG9yRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUHJvZ3Jlc3NNb25pdG9yRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM5OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Qcm9ncmVzc01vbml0b3JGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29udGV4dCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBkZWZhdWx0IHByb2dyZXNzIG1vbml0b3IuIFRoaXMgaXMgZ2VuZXJhbGx5CisgKiB1c2VkIG5lYXIgdGhlIHJvb3Qgb2YgYSBjb250ZXh0IHRyZWUgdG8gcHJvdmlkZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBtb25pdG9yIGZvciBjYXNlcyB3aGVyZSBtb3JlCisgKiBzcGVjaWZpYyBjb250ZXh0cyBoYXZlIG5vdCBwcm92aWRlZCBvbmUuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9ncmVzc01vbml0b3JGdW5jdGlvbiBleHRlbmRzIENvbnRleHRGdW5jdGlvbiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbXB1dGUoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBjb250ZXh0S2V5KSB7CisJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9SZWZsZWN0aW9uQ29udHJpYnV0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9SZWZsZWN0aW9uQ29udHJpYnV0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWJiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1JlZmxlY3Rpb25Db250cmlidXRpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuSW5qZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuY29udHJpYnV0aW9ucy5JQ29udHJpYnV0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmNvbnRyaWJ1dGlvbnMuSUNvbnRyaWJ1dGlvbkZhY3RvcnlTcGk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7CisKKy8qKgorICogQ3JlYXRlIHRoZSBjb250cmlidXRpb24gZmFjdG9yeS4KKyAqLworcHVibGljIGNsYXNzIFJlZmxlY3Rpb25Db250cmlidXRpb25GYWN0b3J5IGltcGxlbWVudHMgSUNvbnRyaWJ1dGlvbkZhY3RvcnkgeworCisJcHJpdmF0ZSBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnk7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGxhbmd1YWdlczsKKworCS8qKgorCSAqIENyZWF0ZSBhIHJlZmxlY3Rpb24gZmFjdG9yeS4KKwkgKgorCSAqIEBwYXJhbSByZWdpc3RyeQorCSAqICAgICAgICAgICAgdG8gcmVhZCBsYW5ndWFnZXMuCisJICovCisJcHVibGljIFJlZmxlY3Rpb25Db250cmlidXRpb25GYWN0b3J5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgeworCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisJCXByb2Nlc3NMYW5ndWFnZXMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZShTdHJpbmcgdXJpU3RyaW5nLCBJRWNsaXBzZUNvbnRleHQgY29udGV4dCwgSUVjbGlwc2VDb250ZXh0IHN0YXRpY0NvbnRleHQpIHsKKwkJcmV0dXJuIGRvQ3JlYXRlKHVyaVN0cmluZywgY29udGV4dCwgc3RhdGljQ29udGV4dCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGUoU3RyaW5nIHVyaVN0cmluZywgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIGRvQ3JlYXRlKHVyaVN0cmluZywgY29udGV4dCwgbnVsbCk7CisJfQorCisJcHJpdmF0ZSBPYmplY3QgZG9DcmVhdGUoU3RyaW5nIHVyaVN0cmluZywgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsIElFY2xpcHNlQ29udGV4dCBzdGF0aWNDb250ZXh0KSB7CisJCWlmICh1cmlTdHJpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJLy8gdHJhbnNsYXRlIG9sZC1zdHlsZSBwbGF0Zm9ybTovcGx1Z2luLyBjbGFzcyBzcGVjaWZpZXJzIGludG8gbmV3LXN0eWxlIGJ1bmRsZWNsYXNzOi8vIFVSSXMKKwkJaWYgKHVyaVN0cmluZy5zdGFydHNXaXRoKCJwbGF0Zm9ybTovcGx1Z2luLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCUFjdGl2YXRvci5sb2coTG9nU2VydmljZS5MT0dfRVJST1IsCisJCQkJCSJwbGF0Zm9ybS1zdHlsZSBVUklzIGRlcHJlY2F0ZWQgZm9yIHJlZmVyZW5jaW5nIHR5cGVzOiAiICsgdXJpU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAorCQkJdXJpU3RyaW5nID0gdXJpU3RyaW5nLnJlcGxhY2UoInBsYXRmb3JtOi9wbHVnaW4vIiwgImJ1bmRsZWNsYXNzOi8vIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJQWN0aXZhdG9yLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgIlVSSSByZXdyaXR0ZW4gYXM6ICIgKyB1cmlTdHJpbmcpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSh1cmkpOworCQlPYmplY3QgY29udHJpYnV0aW9uOworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCWNvbnRyaWJ1dGlvbiA9IGNyZWF0ZUZyb21CdW5kbGUoYnVuZGxlLCBjb250ZXh0LCBzdGF0aWNDb250ZXh0LCB1cmkpOworCQl9IGVsc2UgeworCQkJY29udHJpYnV0aW9uID0gbnVsbDsKKwkJCUFjdGl2YXRvci5sb2coTG9nU2VydmljZS5MT0dfRVJST1IsICJVbmFibGUgdG8gcmV0cmlldmUgdGhlIGJ1bmRsZSBmcm9tIHRoZSBVUkk6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkrIHVyaVN0cmluZyk7CisJCX0KKwkJcmV0dXJuIGNvbnRyaWJ1dGlvbjsKKwl9CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSwgSUVjbGlwc2VDb250ZXh0IGNvbnRleHQsCisJCQlJRWNsaXBzZUNvbnRleHQgc3RhdGljQ29udGV4dCwgVVJJIHVyaSkgeworCQlPYmplY3QgY29udHJpYnV0aW9uOworCQlpZiAodXJpLnNlZ21lbnRDb3VudCgpID4gMSkgeworCQkJU3RyaW5nIHByZWZpeCA9IHVyaS5zZWdtZW50KDApOworCQkJSUNvbnRyaWJ1dGlvbkZhY3RvcnlTcGkgZmFjdG9yeSA9IChJQ29udHJpYnV0aW9uRmFjdG9yeVNwaSkgbGFuZ3VhZ2VzLmdldChwcmVmaXgpOworCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgeworCQkJCVN0cmluZyBtZXNzYWdlID0gIlVuc3VwcG9ydGVkIGNvbnRyaWJ1dGlvbiBmYWN0b3J5IHR5cGUgJyIgKyBwcmVmaXggKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCUFjdGl2YXRvci5sb2coTG9nU2VydmljZS5MT0dfRVJST1IsIG1lc3NhZ2UpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJU3RyaW5nQnVmZmVyIHJlc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcih1cmkuc2VnbWVudCgxKSk7CisJCQlmb3IgKGludCBpID0gMjsgaSA8IHVyaS5zZWdtZW50Q291bnQoKTsgaSsrKSB7CisJCQkJcmVzb3VyY2UuYXBwZW5kKCcvJyk7CisJCQkJcmVzb3VyY2UuYXBwZW5kKHVyaS5zZWdtZW50KGkpKTsKKwkJCX0KKwkJCWNvbnRyaWJ1dGlvbiA9IGZhY3RvcnkuY3JlYXRlKGJ1bmRsZSwgcmVzb3VyY2UudG9TdHJpbmcoKSwgY29udGV4dCk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgY2xhenogPSB1cmkuc2VnbWVudCgwKTsKKwkJCXRyeSB7CisJCQkJQ2xhc3M8Pz4gdGFyZ2V0Q2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXp6KTsKKwkJCQlpZiAoc3RhdGljQ29udGV4dCA9PSBudWxsKQorCQkJCQljb250cmlidXRpb24gPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKHRhcmdldENsYXNzLCBjb250ZXh0KTsKKwkJCQllbHNlCisJCQkJCWNvbnRyaWJ1dGlvbiA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5CisJCQkJCQkJLm1ha2UodGFyZ2V0Q2xhc3MsIGNvbnRleHQsIHN0YXRpY0NvbnRleHQpOworCisJCQkJaWYgKGNvbnRyaWJ1dGlvbiA9PSBudWxsKSB7CisJCQkJCVN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBsb2FkIGNsYXNzICciICsgY2xhenogKyAiJyBmcm9tIGJ1bmRsZSAnIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkrIGJ1bmRsZS5nZXRCdW5kbGVJZCgpICsgIiciOyAvLyROT04tTkxTLTEkCisJCQkJCUFjdGl2YXRvci5sb2coTG9nU2VydmljZS5MT0dfRVJST1IsIG1lc3NhZ2UsIG5ldyBFeGNlcHRpb24oKSk7CisJCQkJfQorCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJY29udHJpYnV0aW9uID0gbnVsbDsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gbG9hZCBjbGFzcyAnIiArIGNsYXp6ICsgIicgZnJvbSBidW5kbGUgJyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkrIGJ1bmRsZS5nZXRCdW5kbGVJZCgpICsgIiciOyAvLyROT04tTkxTLTEkCisJCQkJQWN0aXZhdG9yLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgbWVzc2FnZSwgZSk7CisJCQl9IGNhdGNoIChJbmplY3Rpb25FeGNlcHRpb24gZSkgeworCQkJCWNvbnRyaWJ1dGlvbiA9IG51bGw7CisJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyAnIiArIGNsYXp6ICsgIicgZnJvbSBidW5kbGUgJyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkrIGJ1bmRsZS5nZXRCdW5kbGVJZCgpICsgIiciOyAvLyROT04tTkxTLTEkCisJCQkJQWN0aXZhdG9yLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgbWVzc2FnZSwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvbnRyaWJ1dGlvbjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGFuZ3VhZ2VzKCkgeworCQlsYW5ndWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJU3RyaW5nIGV4dElkID0gIm9yZy5lY2xpcHNlLmU0Lmxhbmd1YWdlcyI7IC8vJE5PTi1OTFMtMSQKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbGFuZ3VhZ2VFbGVtZW50cyA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihleHRJZCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGxhbmd1YWdlRWxlbWVudCA9IGxhbmd1YWdlRWxlbWVudHNbaV07CisJCQl0cnkgeworCQkJCWxhbmd1YWdlcy5wdXQobGFuZ3VhZ2VFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpLCAvLyROT04tTkxTLTEkCisJCQkJCQlsYW5ndWFnZUVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY29udHJpYnV0aW9uRmFjdG9yeSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIEJ1bmRsZSBnZXRCdW5kbGUoVVJJIHBsYXRmb3JtVVJJKSB7CisJCWlmIChwbGF0Zm9ybVVSSS5hdXRob3JpdHkoKSA9PSBudWxsKSB7CisJCQlBY3RpdmF0b3IubG9nKExvZ1NlcnZpY2UuTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBidW5kbGUgZm9yOiAiICsgcGxhdGZvcm1VUkkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGVGb3JOYW1lKHBsYXRmb3JtVVJJLmF1dGhvcml0eSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgdXJpU3RyaW5nKSB7CisJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCXJldHVybiBnZXRCdW5kbGUodXJpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUmVuZGVyZWRFbGVtZW50VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9SZW5kZXJlZEVsZW1lbnRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYWQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvUmVuZGVyZWRFbGVtZW50VXRpbC5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NRGlyZWN0TWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mICdyZW5kZXJlZCcgbWVudSBhbmQgdG9vbCBiYXIgZWxlbWVudHMgaW4KKyAqIHRoZSBtb2RlbC4KKyAqLworcHVibGljIGNsYXNzIFJlbmRlcmVkRWxlbWVudFV0aWwgeworCisJLyoqCisJICogQSB0YWcgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgYSBtZW51LCBtZW51IGl0ZW0gb3IgdG9vbCBpdGVtIGlzICdyZW5kZXJlZCcKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOREVSRURfVEFHID0gIlJlbmRlcmVkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQSB0cmFuc2llbnQgZGF0YSBrZXkgZm9yIGEgcmVuZGVyZWQgZWxlbWVudCdzICdjb250cmlidXRpb24gbWFuYWdlcicuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTl9NQU5BR0VSX0tFWSA9ICJDb250cmlidXRpb25NYW5hZ2VyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ3JlYXRlIGEgJ3JlbmRlcmVkJyBtZW51IGluc3RhbmNlCisJICoKKwkgKiBAcmV0dXJuIHRoZSBuZXcgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1NZW51IGNyZWF0ZVJlbmRlcmVkTWVudSgpIHsKKwkJZmluYWwgTU1lbnUgb2JqZWN0ID0gTU1lbnVGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU1lbnUoKTsKKwkJb2JqZWN0LmdldFRhZ3MoKS5hZGQoUkVOREVSRURfVEFHKTsKKwkJcmV0dXJuIG9iamVjdDsKKworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhICdyZW5kZXJlZCcgbWVudSBpdGVtIGluc3RhbmNlCisJICoKKwkgKiBAcmV0dXJuIHRoZSBuZXcgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1NZW51SXRlbSBjcmVhdGVSZW5kZXJlZE1lbnVJdGVtKCkgeworCQlmaW5hbCBNRGlyZWN0TWVudUl0ZW0gb2JqZWN0ID0gTU1lbnVGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZURpcmVjdE1lbnVJdGVtKCk7CisJCW9iamVjdC5nZXRUYWdzKCkuYWRkKFJFTkRFUkVEX1RBRyk7CisJCXJldHVybiBvYmplY3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgJ3JlbmRlcmVkJyB0b29sIGJhciBpbnN0YW5jZQorCSAqCisJICogQHJldHVybiB0aGUgbmV3IGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBNVG9vbEJhciBjcmVhdGVSZW5kZXJlZFRvb2xCYXIoKSB7CisJCWZpbmFsIE1Ub29sQmFyIG9iamVjdCA9IE1NZW51RmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVUb29sQmFyKCk7CisJCW9iamVjdC5nZXRUYWdzKCkuYWRkKFJFTkRFUkVEX1RBRyk7CisJCXJldHVybiBvYmplY3Q7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjb250cmlidXRpb24gbWFuYWdlciB2YWx1ZSBmb3IgdGhlICdyZW5kZXJlZCcgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBhIHJlbmRlcmVkIGVsZW1lbnQuCisJICogQHJldHVybiB0aGUgY29udHJpYnV0aW9uIG1hbmFnZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb250cmlidXRpb25NYW5hZ2VyKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRUcmFuc2llbnREYXRhKCkuZ2V0KENPTlRSSUJVVElPTl9NQU5BR0VSX0tFWSk7CisJfQorCisJLyoqCisJICogVGVzdCB3aGV0aGVyIHRoZSBVSSBlbGVtZW50IGlzIGFuICdyZW5kZXJlZCcgbWVudS4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICB0aGUgVUkgZWxlbWVudAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaXMgYSAncmVuZGVyZWQnIG1lbnUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJlZE1lbnUoTVVJRWxlbWVudCBlbGVtZW50KSB7CisJCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgTU1lbnUgJiYgZWxlbWVudC5nZXRUYWdzKCkuY29udGFpbnMoUkVOREVSRURfVEFHKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHdoZXRoZXIgdGhlIFVJIGVsZW1lbnQgaXMgYSAncmVuZGVyZWQnIG1lbnUgaXRlbS4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBhIFVJIGVsZW1lbnQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIGEgJ3JlbmRlcmVkJyBtZW51IGl0ZW0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJlZE1lbnVJdGVtKE1VSUVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIE1EaXJlY3RNZW51SXRlbSAmJiBlbGVtZW50LmdldFRhZ3MoKS5jb250YWlucyhSRU5ERVJFRF9UQUcpOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgY29udHJpYnV0aW9uIG1hbmFnZXIgdmFsdWUgZm9yIGEgJ3JlbmRlcmVkJyBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIGEgcmVuZGVyZWQgZWxlbWVudAorCSAqIEBwYXJhbSBjb250cmlidXRpb25NYW5hZ2VyCisJICogICAgICAgICAgICBhIGNvbnRyaWJ1dGlvbiBtYW5hZ2VyCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRyaWJ1dGlvbk1hbmFnZXIoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgY29udHJpYnV0aW9uTWFuYWdlcikgeworCQllbGVtZW50LmdldFRyYW5zaWVudERhdGEoKS5wdXQoQ09OVFJJQlVUSU9OX01BTkFHRVJfS0VZLCBjb250cmlidXRpb25NYW5hZ2VyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODVlMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFRyaXN0YW4gSHVtZSAtIDx0cmlzaHVtZUBnbWFpbC5jb20+IC0KKyAqICAgICAJCUZpeCBmb3IgQnVnIDIzNjkgW1dvcmtiZW5jaF0gV291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHNhdmUgd29ya3NwYWNlIHdpdGhvdXQgZXhpdGluZworICogICAgIAkJSW1wbGVtZW50ZWQgd29ya2JlbmNoIGF1dG8tc2F2ZSB0byBjb3JyZWN0bHkgcmVzdG9yZSBzdGF0ZSBpbiBjYXNlIG9mIGNyYXNoLgorICogICAgIFRlcnJ5IFBhcmtlciA8dHBhcmtlckBnb29nbGUuY29tPiAtIEJ1ZyA0MTY2NzMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5QbGF0Zm9ybVVSTFBsdWdpbkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlVSSVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5pbXBsLkNvbW1hbmRzUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLmltcGwuQWR2YW5jZWRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5pbXBsLkJhc2ljUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuaW1wbC5VaVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuaW1wbC5NZW51UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklNb2RlbFJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSU1vZGVsUmVjb25jaWxpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5Nb2RlbFJlY29uY2lsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgdG8gbG9hZCBhbmQgc2F2ZSB0aGUgbW9kZWwKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbFJlc291cmNlSGFuZGxlciB7CisKKwlwcml2YXRlIFJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldEltcGw7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKKworCUBJbmplY3QKKwlwcml2YXRlIExvZ2dlciBsb2dnZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRWNsaXBzZUNvbnRleHQgY29udGV4dDsKKworCUBJbmplY3QKKwlATmFtZWQoRTRXb3JrYmVuY2guSU5JVElBTF9XT1JLQkVOQ0hfTU9ERUxfVVJJKQorCXByaXZhdGUgVVJJIGFwcGxpY2F0aW9uRGVmaW5pdGlvbkluc3RhbmNlOworCisJQEluamVjdAorCUBPcHRpb25hbAorCUBOYW1lZChFNFdvcmtiZW5jaC5JTlNUQU5DRV9MT0NBVElPTikKKwlwcml2YXRlIExvY2F0aW9uIGluc3RhbmNlTG9jYXRpb247CisKKwkvKioKKwkgKiBEaWN0YXRlcyB3aGV0aGVyIHRoZSBtb2RlbCBzaG91bGQgYmUgc3RvcmVkIHVzaW5nIEVNRiBvciB3aXRoIHRoZSBtZXJnaW5nIGFsZ29yaXRobS4KKwkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1NTI0CisJICoKKwkgKi8KKwlmaW5hbCBwcml2YXRlIGJvb2xlYW4gZGVsdGFSZXN0b3JlOworCWZpbmFsIHByaXZhdGUgYm9vbGVhbiBzYXZlQW5kUmVzdG9yZTsKKwlmaW5hbCBwcml2YXRlIGJvb2xlYW4gY2xlYXJQZXJzaXN0ZWRTdGF0ZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHNhdmVBbmRSZXN0b3JlCisJICogQHBhcmFtIGNsZWFyUGVyc2lzdGVkU3RhdGUKKwkgKiBAcGFyYW0gZGVsdGFSZXN0b3JlCisJICovCisJQEluamVjdAorCXB1YmxpYyBSZXNvdXJjZUhhbmRsZXIoQE5hbWVkKElXb3JrYmVuY2guUEVSU0lTVF9TVEFURSkgYm9vbGVhbiBzYXZlQW5kUmVzdG9yZSwKKwkJCUBOYW1lZChJV29ya2JlbmNoLkNMRUFSX1BFUlNJU1RFRF9TVEFURSkgYm9vbGVhbiBjbGVhclBlcnNpc3RlZFN0YXRlLAorCQkJQE5hbWVkKEU0V29ya2JlbmNoLkRFTFRBX1JFU1RPUkUpIGJvb2xlYW4gZGVsdGFSZXN0b3JlKSB7CisJCXRoaXMuc2F2ZUFuZFJlc3RvcmUgPSBzYXZlQW5kUmVzdG9yZTsKKwkJdGhpcy5jbGVhclBlcnNpc3RlZFN0YXRlID0gY2xlYXJQZXJzaXN0ZWRTdGF0ZTsKKwkJdGhpcy5kZWx0YVJlc3RvcmUgPSBkZWx0YVJlc3RvcmU7CisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwl2b2lkIGluaXQoKSB7CisJCXJlc291cmNlU2V0SW1wbCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJcmVzb3VyY2VTZXRJbXBsLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkKKwkJCQkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIG5ldyBFNFhNSVJlc291cmNlRmFjdG9yeSgpKTsKKworCQlyZXNvdXJjZVNldEltcGwuZ2V0UGFja2FnZVJlZ2lzdHJ5KCkucHV0KEFwcGxpY2F0aW9uUGFja2FnZUltcGwuZU5TX1VSSSwKKwkJCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7CisJCXJlc291cmNlU2V0SW1wbC5nZXRQYWNrYWdlUmVnaXN0cnkoKS5wdXQoQ29tbWFuZHNQYWNrYWdlSW1wbC5lTlNfVVJJLAorCQkJCUNvbW1hbmRzUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKKwkJcmVzb3VyY2VTZXRJbXBsLmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dChVaVBhY2thZ2VJbXBsLmVOU19VUkksIFVpUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKKwkJcmVzb3VyY2VTZXRJbXBsLmdldFBhY2thZ2VSZWdpc3RyeSgpCisJCQkJLnB1dChNZW51UGFja2FnZUltcGwuZU5TX1VSSSwgTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7CisJCXJlc291cmNlU2V0SW1wbC5nZXRQYWNrYWdlUmVnaXN0cnkoKS5wdXQoQmFzaWNQYWNrYWdlSW1wbC5lTlNfVVJJLAorCQkJCUJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKKwkJcmVzb3VyY2VTZXRJbXBsLmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dChBZHZhbmNlZFBhY2thZ2VJbXBsLmVOU19VUkksCisJCQkJQWR2YW5jZWRQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOworCQlyZXNvdXJjZVNldEltcGwKKwkJCQkuZ2V0UGFja2FnZVJlZ2lzdHJ5KCkKKwkJCQkucHV0KG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmRlc2NyaXB0b3IuYmFzaWMuaW1wbC5CYXNpY1BhY2thZ2VJbXBsLmVOU19VUkksCisJCQkJCQlvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLmltcGwuQmFzaWNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOworCisJfQorCisJLyoqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gbW9kZWwgaGFzIHRvcC1sZXZlbCB3aW5kb3dzLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1RvcExldmVsV2luZG93cygpIHsKKwkJcmV0dXJuIGhhc1RvcExldmVsV2luZG93cyhyZXNvdXJjZSk7CisJfQorCisJLyoqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBtb2RlbCBoYXMgdG9wLWxldmVsIHdpbmRvd3MuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGhhc1RvcExldmVsV2luZG93cyhSZXNvdXJjZSBhcHBsaWNhdGlvblJlc291cmNlKSB7CisJCWlmIChhcHBsaWNhdGlvblJlc291cmNlID09IG51bGwgfHwgYXBwbGljYXRpb25SZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwpIHsKKwkJCS8vIElmIHRoZSBhcHBsaWNhdGlvbiByZXNvdXJjZSBkb2Vzbid0IGV4aXN0IG9yIGhhcyBubyBjb250ZW50cywgdGhlbiBpdCBoYXMgbm8KKwkJCS8vIHRvcC1sZXZlbCB3aW5kb3dzIChhbmQgd2UgYXJlIGluIGFuIGVycm9yIHN0YXRlKS4KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlNQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoTUFwcGxpY2F0aW9uKSBhcHBsaWNhdGlvblJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOworCQlyZXR1cm4gIWFwcGxpY2F0aW9uLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZSBsb2FkTW9zdFJlY2VudE1vZGVsKCkgeworCQkvLyBUaGlzIGlzIHRlbXBvcmFyeSBjb2RlIHRvIG1pZ3JhdGUgZXhpc3RpbmcgZGVsdGEgZmlsZXMgaW50byBmdWxsIG1vZGVscworCQlpZiAoZGVsdGFSZXN0b3JlICYmIHNhdmVBbmRSZXN0b3JlICYmICFjbGVhclBlcnNpc3RlZFN0YXRlKSB7CisJCQlGaWxlIGJhc2VMb2NhdGlvbiA9IGdldEJhc2VMb2NhdGlvbigpOworCQkJRmlsZSBkZWx0YUZpbGUgPSBuZXcgRmlsZShiYXNlTG9jYXRpb24sICJkZWx0YXMueG1sIik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKGRlbHRhRmlsZS5leGlzdHMoKSkgeworCQkJCU1BcHBsaWNhdGlvbiBhcHBFbGVtZW50ID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQkvLyBjcmVhdGUgbmV3IHJlc291cmNlIGluIGNhc2UgY29kZSBiZWxvdyBmYWlscyBzb21ld2hlcmUKKwkJCQkJRmlsZSB3b3JrYmVuY2hEYXRhID0gZ2V0V29ya2JlbmNoU2F2ZUxvY2F0aW9uKCk7CisJCQkJCVVSSSByZXN0b3JlTG9jYXRpb25OZXcgPSBVUkkuY3JlYXRlRmlsZVVSSSh3b3JrYmVuY2hEYXRhLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQkJcmVzb3VyY2UgPSByZXNvdXJjZVNldEltcGwuY3JlYXRlUmVzb3VyY2UocmVzdG9yZUxvY2F0aW9uTmV3KTsKKworCQkJCQlSZXNvdXJjZSBvbGRSZXNvdXJjZSA9IGxvYWRSZXNvdXJjZShhcHBsaWNhdGlvbkRlZmluaXRpb25JbnN0YW5jZSk7CisJCQkJCWFwcEVsZW1lbnQgPSAoTUFwcGxpY2F0aW9uKSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKKworCQkJCQljb250ZXh0LnNldChNQXBwbGljYXRpb24uY2xhc3MsIGFwcEVsZW1lbnQpOworCQkJCQlNb2RlbEFzc2VtYmxlciBjb250cmliUHJvY2Vzc29yID0gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZSgKKwkJCQkJCQlNb2RlbEFzc2VtYmxlci5jbGFzcywgY29udGV4dCk7CisJCQkJCWNvbnRyaWJQcm9jZXNzb3IucHJvY2Vzc01vZGVsKHRydWUpOworCisJCQkJCUZpbGUgZGVsdGFPbGRGaWxlID0gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAiZGVsdGFzXzQyTTdtaWdyYXRpb24ueG1sIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZGVsdGFGaWxlLnJlbmFtZVRvKGRlbHRhT2xkRmlsZSk7CisJCQkJCVVSSSByZXN0b3JlTG9jYXRpb24gPSBVUkkuY3JlYXRlRmlsZVVSSShkZWx0YU9sZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc3RvcmVMb2NhdGlvbi50b0ZpbGVTdHJpbmcoKSk7CisKKwkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKKwkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCisJCQkJCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShmaWxlKTsKKwkJCQkJCUlNb2RlbFJlY29uY2lsaW5nU2VydmljZSBtb2RlbFJlY29uY2lsaW5nU2VydmljZSA9IG5ldyBNb2RlbFJlY29uY2lsaW5nU2VydmljZSgpOworCQkJCQkJTW9kZWxSZWNvbmNpbGVyIG1vZGVsUmVjb25jaWxlciA9IG1vZGVsUmVjb25jaWxpbmdTZXJ2aWNlCisJCQkJCQkJCS5jcmVhdGVNb2RlbFJlY29uY2lsZXIoKTsKKwkJCQkJCWRvY3VtZW50Lm5vcm1hbGl6ZURvY3VtZW50KCk7CisJCQkJCQlDb2xsZWN0aW9uPE1vZGVsRGVsdGE+IGRlbHRhcyA9IG1vZGVsUmVjb25jaWxlci5jb25zdHJ1Y3REZWx0YXMob2xkUmVzb3VyY2UKKwkJCQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KDApLCBkb2N1bWVudCk7CisJCQkJCQltb2RlbFJlY29uY2lsaW5nU2VydmljZS5hcHBseURlbHRhcyhkZWx0YXMpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7CisJCQkJCQlsb2dnZXIuZXJyb3IoZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGFwcEVsZW1lbnQgIT0gbnVsbCkgeworCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCkgYXBwRWxlbWVudCk7CisJCQkJCWlmICghaGFzVG9wTGV2ZWxXaW5kb3dzKHJlc291cmNlKSAmJiBsb2dnZXIgIT0gbnVsbCkgeworCQkJCQkJbG9nZ2VyLmVycm9yKCJObyB0b3AtbGV2ZWwgd2luZG93cyBzZWVuIHdoZW4gbWlncmF0aW5nIGZyb20gZXhpc3RpbmcgZGVsdGEgZmlsZXMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiByZXNvdXJjZTsKKwkJCX0KKwkJfQorCisJCUZpbGUgd29ya2JlbmNoRGF0YSA9IG51bGw7CisJCVVSSSByZXN0b3JlTG9jYXRpb24gPSBudWxsOworCisJCWlmIChzYXZlQW5kUmVzdG9yZSkgeworCQkJd29ya2JlbmNoRGF0YSA9IGdldFdvcmtiZW5jaFNhdmVMb2NhdGlvbigpOworCQkJcmVzdG9yZUxvY2F0aW9uID0gVVJJLmNyZWF0ZUZpbGVVUkkod29ya2JlbmNoRGF0YS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCX0KKworCQlpZiAoY2xlYXJQZXJzaXN0ZWRTdGF0ZSAmJiB3b3JrYmVuY2hEYXRhICE9IG51bGwgJiYgd29ya2JlbmNoRGF0YS5leGlzdHMoKSkgeworCQkJd29ya2JlbmNoRGF0YS5kZWxldGUoKTsKKwkJfQorCisJCS8vIGxhc3Qgc3RvcmVkIHRpbWUtc3RhbXAKKwkJbG9uZyByZXN0b3JlTGFzdE1vZGlmaWVkID0gcmVzdG9yZUxvY2F0aW9uID09IG51bGwgPyAwTCA6IG5ldyBGaWxlKAorCQkJCXJlc3RvcmVMb2NhdGlvbi50b0ZpbGVTdHJpbmcoKSkubGFzdE1vZGlmaWVkKCk7CisKKwkJLy8gU2VlIGJ1ZyAzODA2NjMsIGJ1ZyAzODEyMTkKKwkJLy8gbG9uZyBsYXN0QXBwbGljYXRpb25Nb2RpZmljYXRpb24gPSBnZXRMYXN0QXBwbGljYXRpb25Nb2RpZmljYXRpb24oKTsKKwkJLy8gYm9vbGVhbiByZXN0b3JlID0gcmVzdG9yZUxhc3RNb2RpZmllZCA+IGxhc3RBcHBsaWNhdGlvbk1vZGlmaWNhdGlvbjsKKwkJYm9vbGVhbiByZXN0b3JlID0gcmVzdG9yZUxhc3RNb2RpZmllZCA+IDA7CisJCWJvb2xlYW4gaW5pdGlhbE1vZGVsOworCisJCXJlc291cmNlID0gbnVsbDsKKwkJaWYgKHJlc3RvcmUgJiYgc2F2ZUFuZFJlc3RvcmUpIHsKKwkJCXJlc291cmNlID0gbG9hZFJlc291cmNlKHJlc3RvcmVMb2NhdGlvbik7CisJCQkvLyBJZiB0aGUgc2F2ZWQgbW9kZWwgZG9lcyBub3QgaGF2ZSBhbnkgdG9wLWxldmVsIHdpbmRvd3MsIEVjbGlwc2Ugd2lsbCBleGl0CisJCQkvLyBpbW1lZGlhdGVseSwgc28gdGhyb3cgb3V0IHRoZSBwZXJzaXN0ZWQgc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZSB3aXRoIHRoZSBkZWZhdWx0cy4KKwkJCWlmICghaGFzVG9wTGV2ZWxXaW5kb3dzKHJlc291cmNlKSkgeworCQkJCWlmIChsb2dnZXIgIT0gbnVsbCkgeworCQkJCQlsb2dnZXIuZXJyb3IobmV3IEV4Y2VwdGlvbigpLCAvLyBsb2cgYSBzdGFjayB0cmFjZSB0byBoZWxwIGRlYnVnIHRoZSBjb3JydXB0aW9uCisJCQkJCQkJIlRoZSBwZXJzaXN0ZWQgd29ya2JlbmNoIGhhcyBubyB0b3AtbGV2ZWwgd2luZG93cywgc28gcmVpbml0aWFsaXppbmcgd2l0aCBkZWZhdWx0cy4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlyZXNvdXJjZSA9IG51bGw7CisJCQl9CisJCX0KKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCVJlc291cmNlIGFwcGxpY2F0aW9uUmVzb3VyY2UgPSBsb2FkUmVzb3VyY2UoYXBwbGljYXRpb25EZWZpbml0aW9uSW5zdGFuY2UpOworCQkJTUFwcGxpY2F0aW9uIHRoZUFwcCA9IChNQXBwbGljYXRpb24pIGFwcGxpY2F0aW9uUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7CisJCQlyZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlV2l0aEFwcCh0aGVBcHApOworCQkJY29udGV4dC5zZXQoRTRXb3JrYmVuY2guTk9fU0FWRURfTU9ERUxfRk9VTkQsIEJvb2xlYW4uVFJVRSk7CisJCQlpbml0aWFsTW9kZWwgPSB0cnVlOworCQl9IGVsc2UgeworCQkJaW5pdGlhbE1vZGVsID0gZmFsc2U7CisJCX0KKworCQkvLyBBZGQgbW9kZWwgaXRlbXMgZGVzY3JpYmVkIGluIHRoZSBtb2RlbCBleHRlbnNpb24gcG9pbnQKKwkJLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgY29tbWFuZHMgYXJlIHB1dCBpbnRvIHRoZSBjb250ZXh0CisJCU1BcHBsaWNhdGlvbiBhcHBFbGVtZW50ID0gKE1BcHBsaWNhdGlvbikgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7CisKKwkJdGhpcy5jb250ZXh0LnNldChNQXBwbGljYXRpb24uY2xhc3MsIGFwcEVsZW1lbnQpOworCQlNb2RlbEFzc2VtYmxlciBjb250cmliUHJvY2Vzc29yID0gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShNb2RlbEFzc2VtYmxlci5jbGFzcywKKwkJCQljb250ZXh0KTsKKwkJY29udHJpYlByb2Nlc3Nvci5wcm9jZXNzTW9kZWwoaW5pdGlhbE1vZGVsKTsKKworCQlpZiAoIWhhc1RvcExldmVsV2luZG93cyhyZXNvdXJjZSkgJiYgbG9nZ2VyICE9IG51bGwpIHsKKwkJCWxvZ2dlci5lcnJvcihuZXcgRXhjZXB0aW9uKCksIC8vIGxvZyBhIHN0YWNrIHRyYWNlIHRvIGhlbHAgZGVidWcgdGhlCisJCQkJCQkJCQkJCS8vIGNvcnJ1cHRpb24KKwkJCQkJIkluaXRpYWxpemluZyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkZWZpbml0aW9uIGluc3RhbmNlIHlpZWxkcyBubyB0b3AtbGV2ZWwgd2luZG93cyEgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJKyAiQ29udGludWluZyBleGVjdXRpb24sIGJ1dCB0aGUgbWlzc2luZyB3aW5kb3dzIG1heSBjYXVzZSBvdGhlciBpbml0aWFsaXphdGlvbiBmYWlsdXJlcy4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJaWYgKCFjbGVhclBlcnNpc3RlZFN0YXRlKSB7CisJCQlDb21tYW5kTGluZU9wdGlvbk1vZGVsUHJvY2Vzc29yIHByb2Nlc3NvciA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2UoCisJCQkJCUNvbW1hbmRMaW5lT3B0aW9uTW9kZWxQcm9jZXNzb3IuY2xhc3MsIGNvbnRleHQpOworCQkJcHJvY2Vzc29yLnByb2Nlc3MoKTsKKwkJfQorCisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHNhdmVBbmRSZXN0b3JlKQorCQkJcmVzb3VyY2Uuc2F2ZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgcmVzb3VyY2Ugd2l0aCBhbiBhcHAgTW9kZWwsIHVzZWQgZm9yIHNhdmluZyBjb3BpZXMgb2YgdGhlIG1haW4gYXBwIG1vZGVsLgorCSAqCisJICogQHBhcmFtIHRoZUFwcAorCSAqICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIHRvIGFkZCB0byB0aGUgcmVzb3VyY2UKKwkgKiBAcmV0dXJuIGEgcmVzb3VyY2Ugd2l0aCBhIHByb3BlciBzYXZlIHBhdGggd2l0aCB0aGUgbW9kZWwgYXMgY29udGVudHMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VXaXRoQXBwKE1BcHBsaWNhdGlvbiB0aGVBcHApIHsKKwkJUmVzb3VyY2UgcmVzID0gY3JlYXRlUmVzb3VyY2UoKTsKKwkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSB0aGVBcHApOworCQlyZXR1cm4gcmVzOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7CisJCWlmIChzYXZlQW5kUmVzdG9yZSkgeworCQkJVVJJIHNhdmVMb2NhdGlvbiA9IFVSSS5jcmVhdGVGaWxlVVJJKGdldFdvcmtiZW5jaFNhdmVMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCXJldHVybiByZXNvdXJjZVNldEltcGwuY3JlYXRlUmVzb3VyY2Uoc2F2ZUxvY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VTZXRJbXBsLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIndvcmtiZW5jaC54bWkiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIEZpbGUgZ2V0V29ya2JlbmNoU2F2ZUxvY2F0aW9uKCkgeworCQlGaWxlIHdvcmtiZW5jaERhdGEgPSBuZXcgRmlsZShnZXRCYXNlTG9jYXRpb24oKSwgIndvcmtiZW5jaC54bWkiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gd29ya2JlbmNoRGF0YTsKKwl9CisKKwlwcml2YXRlIEZpbGUgZ2V0QmFzZUxvY2F0aW9uKCkgeworCQlGaWxlIGJhc2VMb2NhdGlvbjsKKwkJdHJ5IHsKKwkJCWJhc2VMb2NhdGlvbiA9IG5ldyBGaWxlKFVSSVV0aWwudG9VUkkoaW5zdGFuY2VMb2NhdGlvbi5nZXRVUkwoKSkpOworCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCX0KKwkJYmFzZUxvY2F0aW9uID0gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAiLm1ldGFkYXRhIik7IC8vJE5PTi1OTFMtMSQKKwkJYmFzZUxvY2F0aW9uID0gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAiLnBsdWdpbnMiKTsgLy8kTk9OLU5MUy0xJAorCQliYXNlTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlTG9jYXRpb24sICJvcmcuZWNsaXBzZS5lNC53b3JrYmVuY2giKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gYmFzZUxvY2F0aW9uOworCX0KKworCS8vIEVuc3VyZXMgdGhhdCBldmVuIG1vZGVscyB3aXRoIGVycm9yIGFyZSBsb2FkZWQhCisJcHJpdmF0ZSBSZXNvdXJjZSBsb2FkUmVzb3VyY2UoVVJJIHVyaSkgeworCQlSZXNvdXJjZSByZXNvdXJjZTsKKwkJdHJ5IHsKKwkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UodXJpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gV2UgY291bGQgdXNlIGRpYWdub3N0aWNzIGZvciBiZXR0ZXIgYW5hbHl6aW5nIHRoZSBlcnJvcgorCQkJbG9nZ2VyLmVycm9yKGUsICJVbmFibGUgdG8gbG9hZCByZXNvdXJjZSAiICsgdXJpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIFRPRE8gb25jZSB3ZSBzd2l0Y2ggZnJvbSBkZWx0YXMsIHdlIG9ubHkgbmVlZCB0aGlzIG9uY2Ugb24gdGhlIGRlZmF1bHQgbW9kZWw/CisJCVN0cmluZyBjb250cmlidXRvclVSSSA9IFVSSUhlbHBlci5FTUZ0b1BsYXRmb3JtKHVyaSk7CisJCWlmIChjb250cmlidXRvclVSSSAhPSBudWxsKSB7CisJCQlUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXQgPSBFY29yZVV0aWwuZ2V0QWxsQ29udGVudHMocmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJRU9iamVjdCBvID0gaXQubmV4dCgpOworCQkJCWlmIChvIGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uRWxlbWVudCkgeworCQkJCQkoKE1BcHBsaWNhdGlvbkVsZW1lbnQpIG8pLnNldENvbnRyaWJ1dG9yVVJJKGNvbnRyaWJ1dG9yVVJJKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlIHJlc291cmNlOworCQlpZiAoc2F2ZUFuZFJlc3RvcmUpIHsKKwkJCXJlc291cmNlID0gcmVzb3VyY2VTZXRJbXBsLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQkvLyBXb3JrYXJvdW5kIGZvciBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uOiBObyBpbnN0YW5jZSBkYXRhIGNhbiBiZSBzcGVjaWZpZWQKKwkJCS8vIHRocm93biBieSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJ1bnRpbWUuRGF0YUFyZWEuYXNzZXJ0TG9jYXRpb25Jbml0aWFsaXplZAorCQkJLy8gVGhlIERhdGFBcmVhLmFzc2VydExvY2F0aW9uSW5pdGlhbGl6ZWQgaXMgY2FsbGVkIGJ5IFJlc291cmNlU2V0SW1wbC5nZXRSZXNvdXJjZShVUkksCisJCQkvLyBib29sZWFuKQorCQkJcmVzb3VyY2UgPSByZXNvdXJjZVNldEltcGwuY3JlYXRlUmVzb3VyY2UodXJpKTsKKwkJCXJlc291cmNlLmxvYWQobmV3IFVSTCh1cmkudG9TdHJpbmcoKSkub3BlblN0cmVhbSgpLCByZXNvdXJjZVNldEltcGwuZ2V0TG9hZE9wdGlvbnMoKSk7CisJCX0KKworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdEFwcGxpY2F0aW9uTW9kaWZpY2F0aW9uKCkgeworCQlsb25nIGFwcExhc3RNb2RpZmllZCA9IDBMOworCQlSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXRJbXBsID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCisJCU1hcDxTdHJpbmcsID8+IGF0dHJpYnV0ZXMgPSByZXNvdXJjZVNldEltcGwuZ2V0VVJJQ29udmVydGVyKCkuZ2V0QXR0cmlidXRlcygKKwkJCQlhcHBsaWNhdGlvbkRlZmluaXRpb25JbnN0YW5jZSwKKwkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVVJJQ29udmVydGVyLk9QVElPTl9SRVFVRVNURURfQVRUUklCVVRFUywKKwkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihVUklDb252ZXJ0ZXIuQVRUUklCVVRFX1RJTUVfU1RBTVApKSk7CisKKwkJT2JqZWN0IHRpbWVzdGFtcCA9IGF0dHJpYnV0ZXMuZ2V0KFVSSUNvbnZlcnRlci5BVFRSSUJVVEVfVElNRV9TVEFNUCk7CisJCWlmICh0aW1lc3RhbXAgaW5zdGFuY2VvZiBMb25nKSB7CisJCQlhcHBMYXN0TW9kaWZpZWQgPSAoKExvbmcpIHRpbWVzdGFtcCkubG9uZ1ZhbHVlKCk7CisJCX0gZWxzZSBpZiAoYXBwbGljYXRpb25EZWZpbml0aW9uSW5zdGFuY2UuaXNQbGF0Zm9ybVBsdWdpbigpKSB7CisJCQl0cnkgeworCQkJCWphdmEubmV0LlVSTCB1cmwgPSBuZXcgamF2YS5uZXQuVVJMKGFwcGxpY2F0aW9uRGVmaW5pdGlvbkluc3RhbmNlLnRvU3RyaW5nKCkpOworCQkJCS8vIGNhbid0IGp1c3QgdXNlICd1cmwub3BlbkNvbm5lY3Rpb24oKScgYXMgaXQgdXN1YWxseSByZXR1cm5zIGEKKwkJCQkvLyBQbGF0Zm9ybVVSTFBsdWdpbkNvbm5lY3Rpb24gd2hpY2ggZG9lc24ndCBleHBvc2UgdGhlCisJCQkJLy8gbGFzdC1tb2RpZmljYXRpb24gdGltZS4gU28gd2UgdHJ5IHRvIHJlc29sdmUgdGhlIGZpbGUgdGhyb3VnaAorCQkJCS8vIHRoZSBidW5kbGUgdG8gb2J0YWluIGEgQnVuZGxlVVJMQ29ubmVjdGlvbiBpbnN0ZWFkLgorCQkJCU9iamVjdFtdIG9iaiA9IFBsYXRmb3JtVVJMUGx1Z2luQ29ubmVjdGlvbi5wYXJzZSh1cmwuZ2V0RmlsZSgpLnRyaW0oKSwgdXJsKTsKKwkJCQlCdW5kbGUgYiA9IChCdW5kbGUpIG9ialswXTsKKwkJCQkvLyBmaXJzdCB0cnkgdG8gcmVzb2x2ZSBhcyBhbiBidW5kbGUgZmlsZSBlbnRyeSwgdGhlbiBhcyBhIHJlc291cmNlIHVzaW5nCisJCQkJLy8gdGhlIGJ1bmRsZSdzIGNsYXNzcGF0aAorCQkJCWphdmEubmV0LlVSTCByZXNvbHZlZCA9IGIuZ2V0RW50cnkoKFN0cmluZykgb2JqWzFdKTsKKwkJCQlpZiAocmVzb2x2ZWQgPT0gbnVsbCkgeworCQkJCQlyZXNvbHZlZCA9IGIuZ2V0UmVzb3VyY2UoKFN0cmluZykgb2JqWzFdKTsKKwkJCQl9CisJCQkJaWYgKHJlc29sdmVkICE9IG51bGwpIHsKKwkJCQkJVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbiA9IHJlc29sdmVkLm9wZW5Db25uZWN0aW9uKCk7CisJCQkJCWFwcExhc3RNb2RpZmllZCA9IG9wZW5Db25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKworCQlyZXR1cm4gYXBwTGFzdE1vZGlmaWVkOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvU2VsZWN0aW9uQWdncmVnYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9TZWxlY3Rpb25BZ2dyZWdhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhMzYwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvU2VsZWN0aW9uQWdncmVnYXRvci5qYXZhCkBAIC0wLDAgKzEsMzg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgT2xpdmVyIFB1ZXR0ZXIgLSBhY3RpdmVQYXJ0IHNldCB0byBOVUxMIHdoZW4gYWxsIHBhcnRzIGFyZSBjbG9zZWQgKGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnLzQyMzA0MCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5SdW5BbmRUcmFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuaW50ZXJuYWwuY29udGV4dHMuRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5pbnRlcm5hbC5jb250ZXh0cy5JQ29udGV4dERpc3Bvc2FsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubG9nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5zZXJ2aWNlcy5JU2VydmljZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSVNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CisKK3B1YmxpYyBjbGFzcyBTZWxlY3Rpb25BZ2dyZWdhdG9yIHsKKworCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUX1NFTEVDVElPTiA9ICJvcmcuZWNsaXBzZS51aS5vdXRwdXQuc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUX1BPU1RfU0VMRUNUSU9OID0gIm9yZy5lY2xpcHNlLnVpLm91dHB1dC5wb3N0U2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZ2VuZXJpY0xpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKKwlwcml2YXRlIExpc3RlbmVyTGlzdCBnZW5lcmljUG9zdExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3RlbmVyTGlzdD4gdGFyZ2V0ZWRMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3RlbmVyTGlzdD4oKTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3RlbmVyTGlzdD4gdGFyZ2V0ZWRQb3N0TGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0ZW5lckxpc3Q+KCk7CisJcHJpdmF0ZSBTZXQ8SUVjbGlwc2VDb250ZXh0PiB0cmFja2VkID0gbmV3IEhhc2hTZXQ8SUVjbGlwc2VDb250ZXh0PigpOworCisJcHJpdmF0ZSBFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQlPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCQlNUGFydCBwYXJ0ID0gKE1QYXJ0KSBlbGVtZW50OworCisJCQkJU3RyaW5nIHBhcnRJZCA9IHBhcnQuZ2V0RWxlbWVudElkKCk7CisJCQkJaWYgKHRhcmdldGVkTGlzdGVuZXJzLmNvbnRhaW5zS2V5KHBhcnRJZCkKKwkJCQkJCXx8IHRhcmdldGVkUG9zdExpc3RlbmVycy5jb250YWluc0tleShwYXJ0SWQpKQorCQkJCQl0cmFjayhwYXJ0KTsKKwkJCX0KKwkJfQorCX07CisKKwlwcml2YXRlIE1QYXJ0IGFjdGl2ZVBhcnQ7CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJcHJpdmF0ZSBFUGFydFNlcnZpY2UgcGFydFNlcnZpY2U7CisKKwlwcml2YXRlIElFdmVudEJyb2tlciBldmVudEJyb2tlcjsKKworCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKKworCUBJbmplY3QKKwlTZWxlY3Rpb25BZ2dyZWdhdG9yKElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBFUGFydFNlcnZpY2UgcGFydFNlcnZpY2UsCisJCQlJRXZlbnRCcm9rZXIgZXZlbnRCcm9rZXIsIExvZ2dlciBsb2dnZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwkJdGhpcy5wYXJ0U2VydmljZSA9IHBhcnRTZXJ2aWNlOworCQl0aGlzLmV2ZW50QnJva2VyID0gZXZlbnRCcm9rZXI7CisJCXRoaXMubG9nZ2VyID0gbG9nZ2VyOworCX0KKworCUBQcmVEZXN0cm95CisJdm9pZCBwcmVEZXN0cm95KCkgeworCQlnZW5lcmljTGlzdGVuZXJzLmNsZWFyKCk7CisJCWdlbmVyaWNQb3N0TGlzdGVuZXJzLmNsZWFyKCk7CisJCXRhcmdldGVkTGlzdGVuZXJzLmNsZWFyKCk7CisJCXRhcmdldGVkUG9zdExpc3RlbmVycy5jbGVhcigpOworCisJCWV2ZW50QnJva2VyLnVuc3Vic2NyaWJlKGV2ZW50SGFuZGxlcik7CisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwl2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisJCWV2ZW50QnJva2VyLnN1YnNjcmliZShVSUV2ZW50cy5Db250ZXh0LlRPUElDX0NPTlRFWFQsIGV2ZW50SGFuZGxlcik7CisJfQorCisJQEluamVjdAorCXZvaWQgc2V0UGFydChAT3B0aW9uYWwgQE5hbWVkKElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9QQVJUKSBmaW5hbCBNUGFydCBwYXJ0KSB7CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCWFjdGl2ZVBhcnQgPSBudWxsOworCQkJY29udGV4dC5zZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTiwgbnVsbCk7CisJCX0gZWxzZSBpZiAoYWN0aXZlUGFydCAhPSBwYXJ0KSB7CisJCQlhY3RpdmVQYXJ0ID0gcGFydDsKKwkJCUlFY2xpcHNlQ29udGV4dCBwYXJ0Q29udGV4dCA9IHBhcnQuZ2V0Q29udGV4dCgpOworCQkJaWYgKHBhcnRDb250ZXh0LmNvbnRhaW5zS2V5KE9VVF9QT1NUX1NFTEVDVElPTikpIHsKKwkJCQlPYmplY3Qgc2VsZWN0aW9uID0gcGFydENvbnRleHQuZ2V0KE9VVF9QT1NUX1NFTEVDVElPTik7CisJCQkJY29udGV4dC5zZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTiwgc2VsZWN0aW9uKTsKKwkJCX0gZWxzZSBpZiAocGFydENvbnRleHQuY29udGFpbnNLZXkoT1VUX1NFTEVDVElPTikpIHsKKwkJCQlPYmplY3Qgc2VsZWN0aW9uID0gcGFydENvbnRleHQuZ2V0KE9VVF9TRUxFQ1RJT04pOworCQkJCWNvbnRleHQuc2V0KElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9TRUxFQ1RJT04sIHNlbGVjdGlvbik7CisJCQl9CisJCQl0cmFjayhwYXJ0KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgTVBhcnQgcGFydCwgZmluYWwgT2JqZWN0IHNlbGVjdGlvbikgeworCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGdlbmVyaWNMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCWZpbmFsIElTZWxlY3Rpb25MaXN0ZW5lciBteUxpc3RlbmVyID0gKElTZWxlY3Rpb25MaXN0ZW5lcikgbGlzdGVuZXI7CisJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJbXlMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJCQkJbG9nZ2VyLmVycm9yKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfSk7CisJCX0KKwkJbm90aWZ5VGFyZ2V0ZWRMaXN0ZW5lcnMocGFydCwgc2VsZWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgbm90aWZ5VGFyZ2V0ZWRMaXN0ZW5lcnMoZmluYWwgTVBhcnQgcGFydCwgZmluYWwgT2JqZWN0IHNlbGVjdGlvbikgeworCQlTdHJpbmcgaWQgPSBwYXJ0LmdldEVsZW1lbnRJZCgpOworCQlpZiAoaWQgIT0gbnVsbCkgeworCQkJTGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IHRhcmdldGVkTGlzdGVuZXJzLmdldChpZCk7CisJCQlpZiAobGlzdGVuZXJMaXN0ICE9IG51bGwpIHsKKwkJCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgeworCQkJCQlmaW5hbCBJU2VsZWN0aW9uTGlzdGVuZXIgbXlMaXN0ZW5lciA9IChJU2VsZWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyOworCQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJCQkJbXlMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7CisJCQkJCQl9CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJCQkJCQlsb2dnZXIuZXJyb3IoZXhjZXB0aW9uKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIG5vdGlmeVBvc3RMaXN0ZW5lcnMoZmluYWwgTVBhcnQgcGFydCwgZmluYWwgT2JqZWN0IHNlbGVjdGlvbikgeworCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGdlbmVyaWNQb3N0TGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7CisJCQlmaW5hbCBJU2VsZWN0aW9uTGlzdGVuZXIgbXlMaXN0ZW5lciA9IChJU2VsZWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyOworCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJCW15TGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQkJCWxvZ2dlci5lcnJvcihleGNlcHRpb24pOworCQkJCX0KKwkJCX0pOworCQl9CisJCW5vdGlmeVRhcmdldGVkUG9zdExpc3RlbmVycyhwYXJ0LCBzZWxlY3Rpb24pOworCX0KKworCXByaXZhdGUgdm9pZCBub3RpZnlUYXJnZXRlZFBvc3RMaXN0ZW5lcnMoZmluYWwgTVBhcnQgcGFydCwgZmluYWwgT2JqZWN0IHNlbGVjdGlvbikgeworCQlTdHJpbmcgaWQgPSBwYXJ0LmdldEVsZW1lbnRJZCgpOworCQlpZiAoaWQgIT0gbnVsbCkgeworCQkJTGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IHRhcmdldGVkUG9zdExpc3RlbmVycy5nZXQoaWQpOworCQkJaWYgKGxpc3RlbmVyTGlzdCAhPSBudWxsKSB7CisJCQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCQkJZmluYWwgSVNlbGVjdGlvbkxpc3RlbmVyIG15TGlzdGVuZXIgPSAoSVNlbGVjdGlvbkxpc3RlbmVyKSBsaXN0ZW5lcjsKKwkJCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQkJCW15TGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOworCQkJCQkJfQorCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQkJCQkJbG9nZ2VyLmVycm9yKGV4Y2VwdGlvbik7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB0cmFjayhmaW5hbCBNUGFydCBwYXJ0KSB7CisJCWZpbmFsIElFY2xpcHNlQ29udGV4dCBteUNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CisJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gcGFydC5nZXRDb250ZXh0KCk7CisJCWlmIChjb250ZXh0ICE9IG51bGwgJiYgdHJhY2tlZC5hZGQoY29udGV4dCkpIHsKKwkJCWlmIChjb250ZXh0IGluc3RhbmNlb2YgRWNsaXBzZUNvbnRleHQpIHsKKwkJCQkoKEVjbGlwc2VDb250ZXh0KSBjb250ZXh0KS5ub3RpZnlPbkRpc3Bvc2FsKG5ldyBJQ29udGV4dERpc3Bvc2FsTGlzdGVuZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlZChJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQkJCQkJdHJhY2tlZC5yZW1vdmUoY29udGV4dCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKworCQkJY29udGV4dC5ydW5BbmRUcmFjayhuZXcgUnVuQW5kVHJhY2soKSB7CisJCQkJcHJpdmF0ZSBib29sZWFuIGluaXRpYWwgPSB0cnVlOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIGJvb2xlYW4gY2hhbmdlZChJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQkJCQlmaW5hbCBPYmplY3Qgc2VsZWN0aW9uID0gY29udGV4dC5nZXQoT1VUX1NFTEVDVElPTik7CisJCQkJCWlmIChpbml0aWFsKSB7CisJCQkJCQlpbml0aWFsID0gZmFsc2U7CisJCQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChhY3RpdmVQYXJ0ID09IHBhcnQpIHsKKwkJCQkJCW15Q29udGV4dC5zZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTiwgc2VsZWN0aW9uKTsKKwkJCQkJCXJ1bkV4dGVybmFsQ29kZShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMocGFydCwgc2VsZWN0aW9uKTsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJ1bkV4dGVybmFsQ29kZShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQlub3RpZnlUYXJnZXRlZExpc3RlbmVycyhwYXJ0LCBzZWxlY3Rpb24pOworCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJCQkJLy8gd2UgZG9uJ3QgbmVlZCB0byBrZWVwIHRyYWNraW5nIG5vbi1hY3RpdmUgcGFydHMgdW5sZXNzCisJCQkJCQkvLyB0aGV5IGhhdmUgdGFyZ2V0ZWQgbGlzdGVuZXJzCisJCQkJCQlTdHJpbmcgcGFydElkID0gcGFydC5nZXRFbGVtZW50SWQoKTsKKwkJCQkJCWJvb2xlYW4gY29udGludWVUcmFja2luZyA9IHRhcmdldGVkTGlzdGVuZXJzLmNvbnRhaW5zS2V5KHBhcnRJZCkKKwkJCQkJCQkJfHwgdGFyZ2V0ZWRQb3N0TGlzdGVuZXJzLmNvbnRhaW5zS2V5KHBhcnRJZCk7CisJCQkJCQlpZiAoIWNvbnRpbnVlVHJhY2tpbmcpIHsKKwkJCQkJCQl0cmFja2VkLnJlbW92ZShwYXJ0LmdldENvbnRleHQoKSk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gY29udGludWVUcmFja2luZzsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9KTsKKwkJCWNvbnRleHQucnVuQW5kVHJhY2sobmV3IFJ1bkFuZFRyYWNrKCkgeworCQkJCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsID0gdHJ1ZTsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBib29sZWFuIGNoYW5nZWQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJCQkJZmluYWwgT2JqZWN0IHBvc3RTZWxlY3Rpb24gPSBjb250ZXh0LmdldChPVVRfUE9TVF9TRUxFQ1RJT04pOworCQkJCQlpZiAoaW5pdGlhbCkgeworCQkJCQkJaW5pdGlhbCA9IGZhbHNlOworCQkJCQkJaWYgKHBvc3RTZWxlY3Rpb24gPT0gbnVsbCkgeworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGFjdGl2ZVBhcnQgPT0gcGFydCkgeworCQkJCQkJcnVuRXh0ZXJuYWxDb2RlKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCW5vdGlmeVBvc3RMaXN0ZW5lcnMocGFydCwgcG9zdFNlbGVjdGlvbik7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlydW5FeHRlcm5hbENvZGUobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJbm90aWZ5VGFyZ2V0ZWRQb3N0TGlzdGVuZXJzKHBhcnQsIHBvc3RTZWxlY3Rpb24pOworCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJCQkJLy8gd2UgZG9uJ3QgbmVlZCB0byBrZWVwIHRyYWNraW5nIG5vbi1hY3RpdmUgcGFydHMgdW5sZXNzCisJCQkJCQkvLyB0aGV5IGhhdmUgdGFyZ2V0ZWQgbGlzdGVuZXJzCisJCQkJCQlTdHJpbmcgcGFydElkID0gcGFydC5nZXRFbGVtZW50SWQoKTsKKwkJCQkJCWJvb2xlYW4gY29udGludWVUcmFja2luZyA9IHRhcmdldGVkTGlzdGVuZXJzLmNvbnRhaW5zS2V5KHBhcnRJZCkKKwkJCQkJCQkJfHwgdGFyZ2V0ZWRQb3N0TGlzdGVuZXJzLmNvbnRhaW5zS2V5KHBhcnRJZCk7CisJCQkJCQlpZiAoIWNvbnRpbnVlVHJhY2tpbmcpIHsKKwkJCQkJCQl0cmFja2VkLnJlbW92ZShwYXJ0LmdldENvbnRleHQoKSk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gY29udGludWVUcmFja2luZzsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gY29udGV4dC5nZXQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTik7CisJfQorCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWdlbmVyaWNMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWdlbmVyaWNQb3N0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIHdlIG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIGFscmVhZHksIHNlZSBidWcgMzEwMTEzCisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWdlbmVyaWNMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy8gd2UgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgYWxyZWFkeSwgc2VlIGJ1ZyAzMTAxMTMKKwkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJZ2VuZXJpY1Bvc3RMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBwYXJ0SWQsIElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gdGFyZ2V0ZWRMaXN0ZW5lcnMuZ2V0KHBhcnRJZCk7CisJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgeworCQkJbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOworCQkJdGFyZ2V0ZWRMaXN0ZW5lcnMucHV0KHBhcnRJZCwgbGlzdGVuZXJzKTsKKwkJfQorCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKworCQlNUGFydCBwYXJ0ID0gcGFydFNlcnZpY2UuZmluZFBhcnQocGFydElkKTsKKwkJaWYgKHBhcnQgIT0gbnVsbCkKKwkJCXRyYWNrKHBhcnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgcGFydElkLCBJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IHRhcmdldGVkUG9zdExpc3RlbmVycy5nZXQocGFydElkKTsKKwkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7CisJCQlsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7CisJCQl0YXJnZXRlZFBvc3RMaXN0ZW5lcnMucHV0KHBhcnRJZCwgbGlzdGVuZXJzKTsKKwkJfQorCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKworCQlNUGFydCBwYXJ0ID0gcGFydFNlcnZpY2UuZmluZFBhcnQocGFydElkKTsKKwkJaWYgKHBhcnQgIT0gbnVsbCkKKwkJCXRyYWNrKHBhcnQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBwYXJ0SWQsIElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyB3ZSBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCBhbHJlYWR5LCBzZWUgYnVnIDMxMDExMworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQlMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gdGFyZ2V0ZWRMaXN0ZW5lcnMuZ2V0KHBhcnRJZCk7CisJCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKwkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgcGFydElkLCBJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy8gd2UgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgYWxyZWFkeSwgc2VlIGJ1ZyAzMTAxMTMKKwkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IHRhcmdldGVkUG9zdExpc3RlbmVycy5nZXQocGFydElkKTsKKwkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgeworCQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIE9iamVjdCBnZXRTZWxlY3Rpb24oU3RyaW5nIHBhcnRJZCkgeworCQlNUGFydCBwYXJ0ID0gcGFydFNlcnZpY2UuZmluZFBhcnQocGFydElkKTsKKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlJRWNsaXBzZUNvbnRleHQgcGFydENvbnRleHQgPSBwYXJ0LmdldENvbnRleHQoKTsKKwkJaWYgKHBhcnRDb250ZXh0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBwYXJ0Q29udGV4dC5nZXQoT1VUX1NFTEVDVElPTik7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1NlbGVjdGlvblNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1NlbGVjdGlvblNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlNmE5YQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvU2VsZWN0aW9uU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZy5FU2VsZWN0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuSVNlbGVjdGlvbkxpc3RlbmVyOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uU2VydmljZUltcGwgaW1wbGVtZW50cyBFU2VsZWN0aW9uU2VydmljZSB7CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJQEluamVjdAorCVNlbGVjdGlvblNlcnZpY2VJbXBsKElFY2xpcHNlQ29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pIHsKKwkJY29udGV4dC5zZXQoU2VsZWN0aW9uQWdncmVnYXRvci5PVVRfU0VMRUNUSU9OLCBzZWxlY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFBvc3RTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGlvbikgeworCQljb250ZXh0LnNldChTZWxlY3Rpb25BZ2dyZWdhdG9yLk9VVF9QT1NUX1NFTEVDVElPTiwgc2VsZWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIGdldFNlcnZpY2VBZ2dyZWdhdG9yKCkuZ2V0U2VsZWN0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRTZWxlY3Rpb24oU3RyaW5nIHBhcnRJZCkgeworCQlyZXR1cm4gZ2V0U2VydmljZUFnZ3JlZ2F0b3IoKS5nZXRTZWxlY3Rpb24ocGFydElkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZ2V0U2VydmljZUFnZ3JlZ2F0b3IoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWdldFNlcnZpY2VBZ2dyZWdhdG9yKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBwYXJ0SWQsIElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlnZXRTZXJ2aWNlQWdncmVnYXRvcigpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHBhcnRJZCwgbGlzdGVuZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBwYXJ0SWQsIElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlnZXRTZXJ2aWNlQWdncmVnYXRvcigpLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHBhcnRJZCwgbGlzdGVuZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZ2V0U2VydmljZUFnZ3JlZ2F0b3IoKS5hZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZ2V0U2VydmljZUFnZ3JlZ2F0b3IoKS5yZW1vdmVQb3N0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgcGFydElkLCBJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZ2V0U2VydmljZUFnZ3JlZ2F0b3IoKS5hZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIocGFydElkLCBsaXN0ZW5lcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBwYXJ0SWQsIElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlnZXRTZXJ2aWNlQWdncmVnYXRvcigpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihwYXJ0SWQsIGxpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIFNlbGVjdGlvbkFnZ3JlZ2F0b3IgZ2V0U2VydmljZUFnZ3JlZ2F0b3IoKSB7CisJCVNlbGVjdGlvbkFnZ3JlZ2F0b3IgYWdncmVnYXRvciA9IGNvbnRleHQuZ2V0KFNlbGVjdGlvbkFnZ3JlZ2F0b3IuY2xhc3MpOworCQlpZiAoYWdncmVnYXRvciAhPSBudWxsKQorCQkJcmV0dXJuIGFnZ3JlZ2F0b3I7CisJCU1BcHBsaWNhdGlvbiBhcHAgPSBjb250ZXh0LmdldChNQXBwbGljYXRpb24uY2xhc3MpOworCQlpZiAoYXBwID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTVdpbmRvdyBzZWxlY3RlZFdpbmRvdyA9IGFwcC5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJcmV0dXJuIHNlbGVjdGVkV2luZG93LmdldENvbnRleHQoKS5nZXQoU2VsZWN0aW9uQWdncmVnYXRvci5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Ub3BvbG9naWNhbFNvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVG9wb2xvZ2ljYWxTb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmN2M5MwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVG9wb2xvZ2ljYWxTb3J0LmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFudW1pdHRpbmcgVGVjaG5vbG9naWVzIEluYyBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQnJpYW4gZGUgQWx3aXMgKE1USSkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSB0b3BvbG9naWNhbCBzb3J0LiBUaGUgaW1wbGVtZW50YXRpb24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSBvYmplY3RzIHRvCisgKiBiZSBzb3J0ZWQgZnJvbSB0aGVpciBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaWRlbnRpZmllciwgYW5kIHByb3Blcmx5IHRyYWNrcyB3aGVyZSBtdWx0aXBsZQorICogb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHNvcnRpbmcgRWNsaXBzZSBFeHRlbnNpb24gUmVnaXN0cnkKKyAqIGV4dGVuc2lvbnMgYnkgdGhlaXIgcGx1Zy1pbiBkZXBlbmRlbmNpZXMsIGFzIGEgcGx1Zy1pbiBtYXkgY29udHJpYnV0ZSBtdWx0aXBsZSBzZXRzIG9mCisgKiBleHRlbnNpb25zLgorICoKKyAqIDxwPgorICogVGhlIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYSBkZXBlbmRlbmN5IGdyYXBoIHdoZXJlIHRoZSB2ZXJ0aWNlcyByZXByZXNlbnQgdGhlIG9iamVjdCBpZGVudGlmaWVycworICogYW5kIHRoZSBlZGdlcyByZXByZXNlbnQgdGhlIHJlcXVpcmVkLXJlbGF0aW9uIGJldHdlZW4gdGhlbS4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBvZgorICoge0BsaW5rICNnZXRSZXF1aXJlbWVudHMoT2JqZWN0KX0gYW5kIHtAbGluayAjZ2V0RGVwZW5kZW5jaWVzKE9iamVjdCl9LiBBbHRob3VnaCB0aGVzZSBhcmUKKyAqIG5vcm1hbGx5IHN5bW1ldHJpYyBvcGVyYXRpb25zIChpLmUuLCBpZiA8ZW0+QjwvZW0+IGlzIGEgcmVxdWlyZW1lbnQgb2YgPGVtPkE8L2VtPiwgdGhlbgorICogPGVtPkE8L2VtPiBpcyBhIGRlcGVuZGVudCBvZiA8ZW0+QjwvZW0+KSwgb25lIG1heSBiZSBlYXNpZXIgdG8gY29tcHV0ZSB0aGFuIHRoZSBvdGhlciBpbiBzb21lCisgKiBjb250ZXh0cyBhbmQgc28gdGhpcyBjbGFzcyBjb21iaW5lcyB0aGUgcmVzdWx0cy4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIERlc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG06CisgKiA8L3A+CisgKiA8b2w+CisgKiA8bGk+Q29uc3RydWN0IHRoZSBkZXBlbmRlbmN5IGdyYXBoIHdpdGgge0BsaW5rICNnZXRSZXF1aXJlbWVudHMoT2JqZWN0KX0gYW5kCisgKiB7QGxpbmsgI2dldERlcGVuZGVuY2llcyhPYmplY3QpfS4gVGhlIG91dCBlZGdlcyByZXByZXNlbnQgcmVxdWlyZW1lbnRzLCBhbmQgaW4gZWRnZXMgcmVwcmVzZW50CisgKiBkZXBlbmRlbmNpZXMuIFRoaXMgZ3JhcGggbWF5IGJlIGRpc2Nvbm5lY3RlZCBpZiB0aGVyZSBhcmUgbm9kZXMgd2l0aCBubyBkZXBlbmRlbmNpZXMgYW1vbmdzdCBlYWNoCisgKiBvdGhlci48L2xpPgorICogPGxpPlNvcnQgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgYnkgdGhlaXIgb3V0LWRlZ3JlZSwgYW5kIHRoZW4gYnkgaW4tZGVncmVlLiBJZHMgd2l0aCBvdXQtZGVncmVlCisgKiAwIGFyZSByb290czsgaWYgdGhlcmUgaXMgbm8gaWQgd2l0aCBvdXQtZGVncmVlIDAgdGhlbiB3ZSBoYXZlIGEgY3ljbGUuIFdlIHNvcnQgbm9kZXMgd2l0aCB0aGUKKyAqIHNhbWUgb3V0LWRlZ3JlZSBieSB0aGVpciBpbi1kZWdyZWUgdG8gcHJpdmlsZWdlIG5vZGVzIHdpdGhpbiB0aGUgY3ljbGUgZnJvbSB0aG9zZSB0aGF0IGFyZQorICogZGVwZW5kZW5jaWVzIChlLmcuLCBjb25zaWRlcjogQSAmcmFycjsgQiwgQiAmcmFycjsgQywgQyAmcmFycjsgQSwgRCAmcmFycjsgQTsgYWxsIGhhdmUgb3V0LWRlZ3JlZQorICogMSwgYnV0IEEgaGFzIGluLWRlZ3JlZSAyLCBhbmQgQSBtdXN0IGJlIG91dHB1dCBiZWZvcmUgRCkuPC9saT4KKyAqIDxsaT5XaGlsZSB0aGVyZSBhcmUgaWRzIGxlZnQgdG8gY29uc2lkZXIsIHRha2UgdGhlIGlkIHdpdGggbG93ZXN0IG91dC1kZWdyZWUgYW5kIGFkZCBpdHMgb2JqZWN0cworICogdG8gdGhlIGxpc3QuIFJlbW92ZSB0aGUgaWQgZnJvbSBhbGwgb2YgaXRzIGRlcGVuZGVudHMnIHJlcXVpcmVkIGxpc3RzLiBUaGlzIHJlbW92YWwgY2hhbmdlcyB0aGUKKyAqIG91dC1kZWdyZWUgYW5kIG1heSByZXF1aXJlIHRoYXQgdGhlIGlkIGxpc3QgYmUgcmVzb3J0ZWQgc2luY2Ugc29tZSBvZiB0aGUgZGVwZW5kZW50cyBtYXkgbm93IGJlCisgKiByb290cy4gTm90ZSB0aGF0IHNob3VsZCB3ZSBlbmNvdW50ZXIgYSBjeWNsZSAoaS5lLiwgbm8gbm9kZXMgb2YgZGVncmVlIDApLCB3ZSBwcm9jZXNzIGFsbCB0aGUKKyAqIGJ1bmRsZXMgd2l0aGluIHRoZSBjeWNsZSwgc2luY2UgYW55IGRlcGVuZGVuY2llcyB0byBhbnkgc2luZ2xlIG5kb2Ugd2l0aGluIHRoZSBjeWNsZSBlZmZlY3RpdmVseQorICogZXh0ZW5kcyB0byBhbGwuPC9saT4KKyAqIDwvb2w+CisgKgorICogQHBhcmFtIDxUPgorICogICAgICAgICAgICB0aGUgdHlwZSBvZiBvYmplY3RzIGJlaW5nIHNvcnRlZAorICogQHBhcmFtIDxJRD4KKyAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpZGVudGlmaWVyczsgbXVsdGlwbGUgb2JqZWN0cyBvZiBUIG1heSBjb3JyZXNwb25kIHRvIHRoZSBzYW1lCisgKiAgICAgICAgICAgIElECisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUb3BvbG9naWNhbFNvcnQ8VCwgSUQ+IHsKKwlwcml2YXRlIGZpbmFsIE1hcDxJRCwgQ29sbGVjdGlvbjxUPj4gbWFwcGVkT2JqZWN0cyA9IG5ldyBIYXNoTWFwPElELCBDb2xsZWN0aW9uPFQ+PigpOworCS8vIENhcHR1cmVzIHRoZSBidW5kbGVzIHRoYXQgYXJlIGxpc3RlZCBhcyByZXF1aXJlbWVudHMgZm9yIGEgcGFydGljdWxhciBidW5kbGUuCisJcHJpdmF0ZSBmaW5hbCBNYXA8SUQsIENvbGxlY3Rpb248SUQ+PiByZXF1aXJlcyA9IG5ldyBIYXNoTWFwPElELCBDb2xsZWN0aW9uPElEPj4oKTsKKwkvLyBDYXB0dXJlcyB0aGUgYnVuZGxlcyB0aGF0IGxpc3QgYSBwYXJ0aWN1bGFyIGJ1bmRsZSBhcyBhIHJlcXVpcmVtZW50CisJcHJpdmF0ZSBmaW5hbCBNYXA8SUQsIENvbGxlY3Rpb248SUQ+PiBkZXBlbmRzID0gbmV3IEhhc2hNYXA8SUQsIENvbGxlY3Rpb248SUQ+PigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgaW1wbGVtZW50YXRpb24gcHJvcGVybHkgdHJhY2tzIHdoZXJlIG11bHRpcGxlCisJICogb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIuCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgb2JqZWN0CisJICogQHJldHVybiB0aGUgaWRlbnRpZmllcgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBJRCBnZXRJZChUIG9iamVjdCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgSURzIHJlcXVpcmVkIGJ5IHtAY29kZSBpZH0uIEltcGxlbWVudG9ycyBtYXkgY2hvb3NlIHRvIHJldHVybiB7QGNvZGUgbnVsbH0KKwkgKiBvciBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMgbW9yZSBlYXNpbHkgY29tcHV0ZWQgYnkKKwkgKiB7QGxpbmsgI2dldERlcGVuZGVuY2llcyhPYmplY3QpfS4KKwkgKgorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGlkCisJICogQHJldHVybiB0aGUgSURzIHJlcXVpcmVkIGJ5IHtAY29kZSBpZH07IG1heSBiZSB7QGNvZGUgbnVsbH0KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbjxJRD4gZ2V0UmVxdWlyZW1lbnRzKElEIGlkKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbGlzdCBvZiBJRHMgZGVwZW5kZWQgdXBvbiBieSB7QGNvZGUgaWR9LiBJbXBsZW1lbnRvcnMgbWF5IGNob29zZSB0byByZXR1cm4KKwkgKiB7QGNvZGUgbnVsbH0gb3IgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIG1vcmUgZWFzaWx5IGNvbXB1dGVkIGJ5CisJICoge0BsaW5rICNnZXRSZXF1aXJlbWVudHMoT2JqZWN0KX0uCisJICoKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIHRoZSBpZAorCSAqIEByZXR1cm4gdGhlIElEcyBkZXBlbmRlZCB1cG9uIGJ5IHtAY29kZSBpZH07IG1heSBiZSB7QGNvZGUgbnVsbH0KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbjxJRD4gZ2V0RGVwZW5kZW5jaWVzKElEIGlkKTsKKworCS8qKgorCSAqIFNvcnQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbnMgYnkgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGVpciBjb250cmlidXRvcnMuIE5vdGUgdGhhdCBzb3J0aW5nIGlzCisJICogZG9uZSBpbi1wbGFjZS4KKwkgKgorCSAqIEBwYXJhbSBvYmplY3RzCisJICogICAgICAgICAgICB0aGUgb2JqZWN0cyB0byBiZSBzb3J0ZWQKKwkgKiBAcmV0dXJuIHRoZSBvYmplY3RzIGluIGEgdG9wb2xvZ2ljYWxseS1zb3J0ZWQgb3JkZXIKKwkgKi8KKwlwdWJsaWMgVFtdIHNvcnQoVFtdIG9iamVjdHMpIHsKKwkJaWYgKG9iamVjdHMubGVuZ3RoIDw9IDEpIHsKKwkJCXJldHVybiBvYmplY3RzOworCQl9CisKKwkJYWRkQWxsKG9iamVjdHMpOworCQlyZXR1cm4gcHJvY2VzcyhvYmplY3RzKTsKKwl9CisKKwkvKiogUGxhY2UgcmVzdWx0cyBpbiByZXN1bHRzIGFuZCByZXR1cm4gcmVzdWx0cyAqLworCXByaXZhdGUgVFtdIHByb2Nlc3MoVFtdIHJlc3VsdHMpIHsKKwkJYnVpbGREZXBlbmRlbmN5R3JhcGgoKTsKKworCQkvLyBTb3J0IG5vZGVzIGJ5IG91dC1kZWdyZWUgKHtAY29kZSByZXF1aXJlc30pIGFuZCB0aGVuIGJ5IGluLWRlZ3JlZS4KKwkJLy8gVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zOiB3ZSBoYXZlIGRpc2Nvbm5lY3RlZCBncmFwaHMKKwkJLy8gSW4gY2FzZSBvZiBhIGN5Y2xlLCBvbmUgb2YgdGhlIG5vZGVzIGludm9sdmVkIGluIHRoZSBjeWNsZSBzaG91bGQgaGF2ZQorCQkvLyBoaWdoZXIgaW4tZGVncmVlIGZyb20gc29tZSBvdGhlciBub24tY3ljbGljIG5vZGUKKwkJaW50IHJlc3VsdHNJbmRleCA9IDA7CisJCUxpc3Q8SUQ+IHNvcnRlZEJ5T3V0ZGVncmVlID0gbmV3IEFycmF5TGlzdDxJRD4ocmVxdWlyZXMua2V5U2V0KCkpOworCQlDb21wYXJhdG9yPElEPiBvdXRkZWdyZWVTb3J0ZXIgPSBuZXcgQ29tcGFyYXRvcjxJRD4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShJRCBvMSwgSUQgbzIpIHsKKwkJCQlhc3NlcnQgcmVxdWlyZXMuY29udGFpbnNLZXkobzEpICYmIHJlcXVpcmVzLmNvbnRhaW5zS2V5KG8yKTsKKwkJCQlpbnQgY29tcGFyaXNvbiA9IHJlcXVpcmVzLmdldChvMSkuc2l6ZSgpIC0gcmVxdWlyZXMuZ2V0KG8yKS5zaXplKCk7CisJCQkJaWYgKGNvbXBhcmlzb24gPT0gMCkgeworCQkJCQkvLyBTZWxlY3QgdGhlIG5vZGUgd2hvc2UgcmVtb3ZhbCB3b3VsZCBoYXZlIHRoZSBncmVhdGVzdCBlZmZlY3QKKwkJCQkJcmV0dXJuIGRlcGVuZHMuZ2V0KG8yKS5zaXplKCkgLSBkZXBlbmRzLmdldChvMSkuc2l6ZSgpOworCQkJCX0KKwkJCQlyZXR1cm4gY29tcGFyaXNvbjsKKwkJCX0KKwkJfTsKKwkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRCeU91dGRlZ3JlZSwgb3V0ZGVncmVlU29ydGVyKTsKKworCQl3aGlsZSAoIXNvcnRlZEJ5T3V0ZGVncmVlLmlzRW1wdHkoKSkgeworCQkJLy8gZG9uJ3Qgc29ydCB1bm5lY2Vzc2FyaWx5OiB0aGUgY3VycmVudCBvcmRlcmluZyBpcyBmaW5lIHByb3ZpZGluZworCQkJLy8gaXRlbSAjMCBzdGlsbCBoYXMgbm8gZGVwZW5kZW5jaWVzCisJCQlpZiAoIXJlcXVpcmVzLmdldChzb3J0ZWRCeU91dGRlZ3JlZS5nZXQoMCkpLmlzRW1wdHkoKSkgeworCQkJCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkQnlPdXRkZWdyZWUsIG91dGRlZ3JlZVNvcnRlcik7CisJCQl9CisJCQlMaW5rZWRMaXN0PElEPiBjeWNsZVRvQmVEb25lID0gbmV3IExpbmtlZExpc3Q8SUQ+KCk7CisJCQljeWNsZVRvQmVEb25lLmFkZChzb3J0ZWRCeU91dGRlZ3JlZS5yZW1vdmUoMCkpOworCQkJd2hpbGUgKCFjeWNsZVRvQmVEb25lLmlzRW1wdHkoKSkgeworCQkJCUlEIGJ1bmRsZUlkID0gY3ljbGVUb0JlRG9uZS5yZW1vdmVGaXJzdCgpOworCQkJCWFzc2VydCBkZXBlbmRzLmNvbnRhaW5zS2V5KGJ1bmRsZUlkKSAmJiByZXF1aXJlcy5jb250YWluc0tleShidW5kbGVJZCk7CisJCQkJZm9yIChUIGV4dCA6IG1hcHBlZE9iamVjdHMuZ2V0KGJ1bmRsZUlkKSkgeworCQkJCQlyZXN1bHRzW3Jlc3VsdHNJbmRleCsrXSA9IGV4dDsKKwkJCQl9CisJCQkJLy8gcmVxdWlyZXMuZ2V0KGJ1bmRsZUlkKSBpcyBlbXB0eSB1bmxlc3MgdGhlcmUncyBhIGN5Y2xlOworCQkJCS8vIHdlIHByb2Nlc3MgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY3ljbGUgbm93CisJCQkJZm9yIChJRCByZXFJZCA6IHJlcXVpcmVzLmdldChidW5kbGVJZCkpIHsKKwkJCQkJY3ljbGVUb0JlRG9uZS5hZGQocmVxSWQpOworCQkJCQlzb3J0ZWRCeU91dGRlZ3JlZS5yZW1vdmUocmVxSWQpOworCQkJCQlkZXBlbmRzLmdldChyZXFJZCkucmVtb3ZlKGJ1bmRsZUlkKTsKKwkJCQl9CisJCQkJcmVxdWlyZXMucmVtb3ZlKGJ1bmRsZUlkKTsKKwkJCQlmb3IgKElEIGRlcElkIDogZGVwZW5kcy5nZXQoYnVuZGxlSWQpKSB7CisJCQkJCXJlcXVpcmVzLmdldChkZXBJZCkucmVtb3ZlKGJ1bmRsZUlkKTsKKwkJCQl9CisJCQkJZGVwZW5kcy5yZW1vdmUoYnVuZGxlSWQpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHRzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBvYmplY3RzCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZEFsbChUW10gb2JqZWN0cykgeworCQkvLyBmaXJzdCBidWlsZCB1cCB0aGUgbGlzdCBvZiBvYmplY3QgaWRzIGFjdHVhbGx5IGJlaW5nIGNvbnNpZGVyZWQKKwkJZm9yIChUIG8gOiBvYmplY3RzKSB7CisJCQlJRCBpZCA9IGdldElkKG8pOworCQkJQ29sbGVjdGlvbjxUPiBleHRzID0gbWFwcGVkT2JqZWN0cy5nZXQoaWQpOworCQkJaWYgKGV4dHMgPT0gbnVsbCkgeworCQkJCW1hcHBlZE9iamVjdHMucHV0KGlkLCBleHRzID0gbmV3IEhhc2hTZXQ8VD4oKSk7CisJCQl9CisJCQlleHRzLmFkZChvKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBidWlsZERlcGVuZGVuY3lHcmFwaCgpIHsKKwkJLy8gcmVzZXQKKwkJcmVxdWlyZXMuY2xlYXIoKTsKKwkJZGVwZW5kcy5jbGVhcigpOworCQlmb3IgKElEIGlkIDogbWFwcGVkT2JqZWN0cy5rZXlTZXQoKSkgeworCQkJcmVxdWlyZXMucHV0KGlkLCBuZXcgSGFzaFNldDxJRD4oKSk7CisJCQlkZXBlbmRzLnB1dChpZCwgbmV3IEhhc2hTZXQ8SUQ+KCkpOworCQl9CisKKwkJLy8gbm93IHBvcHVsYXRlIHRoZSBkZXBlbmRlbmN5IGdyYXBoCisJCWZvciAoSUQgc3ViamVjdElkIDogbWFwcGVkT2JqZWN0cy5rZXlTZXQoKSkgeworCQkJYXNzZXJ0IHJlcXVpcmVzLmNvbnRhaW5zS2V5KHN1YmplY3RJZCkgJiYgZGVwZW5kcy5jb250YWluc0tleShzdWJqZWN0SWQpOworCisJCQlDb2xsZWN0aW9uPElEPiByZXF1aXJlbWVudHMgPSBnZXRSZXF1aXJlbWVudHMoc3ViamVjdElkKTsKKwkJCWlmIChyZXF1aXJlbWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoSUQgcmVxdWlyZWRJZCA6IHJlcXVpcmVtZW50cykgeworCQkJCQlhc3NlcnQgIXJlcXVpcmVkSWQuZXF1YWxzKHN1YmplY3RJZCkgOiAic2VsZi1jeWNsZXMgbm90IHN1cHBvcnRlZCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gaWdub3JlIG9iamVjdHMgbm90IGJlaW5nIHNvcnRlZAorCQkJCQlpZiAoIW1hcHBlZE9iamVjdHMuY29udGFpbnNLZXkocmVxdWlyZWRJZCkpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCS8vIFNvIHJlcXVpcmVkSWQgaXMgYSByZXF1aXJlbWVudCBmb3Igc3ViamVjdElkCisJCQkJCS8vIGFuZCBzdWJqZWN0SWQgaXMgYSBkZXBlbmRlbnQgb2YgcmVxdWlyZWRJZAorCQkJCQlkZXBlbmRzLmdldChyZXF1aXJlZElkKS5hZGQoc3ViamVjdElkKTsKKwkJCQkJcmVxdWlyZXMuZ2V0KHN1YmplY3RJZCkuYWRkKHJlcXVpcmVkSWQpOworCQkJCX0KKwkJCX0KKworCQkJQ29sbGVjdGlvbjxJRD4gZGVwZW5kZW5jaWVzID0gZ2V0RGVwZW5kZW5jaWVzKHN1YmplY3RJZCk7CisJCQlpZiAoZGVwZW5kZW5jaWVzICE9IG51bGwpIHsKKwkJCQlmb3IgKElEIGRlcGVuZGVudElkIDogZGVwZW5kZW5jaWVzKSB7CisJCQkJCWFzc2VydCAhZGVwZW5kZW50SWQuZXF1YWxzKHN1YmplY3RJZCkgOiAic2VsZi1jeWNsZXMgbm90IHN1cHBvcnRlZCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gaWdub3JlIG9iamVjdHMgbm90IGJlaW5nIHNvcnRlZAorCQkJCQlpZiAoIW1hcHBlZE9iamVjdHMuY29udGFpbnNLZXkoZGVwZW5kZW50SWQpKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkvLyBTbyBkZXBlbmRlbnRJZCBpcyBhIGRlcGVuZGVuY3kgb2Ygc3ViamVjdElkCisJCQkJCS8vIGFuZCBzdWJqZWN0SWQgaXMgYSByZXF1aXJlbWVudCBvZiBkZXBlbmRlbnRJZAorCQkJCQlyZXF1aXJlcy5nZXQoZGVwZW5kZW50SWQpLmFkZChzdWJqZWN0SWQpOworCQkJCQlkZXBlbmRzLmdldChzdWJqZWN0SWQpLmFkZChkZXBlbmRlbnRJZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9UcmFja2FibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVHJhY2thYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5ZmIxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVHJhY2thYmxlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLlJ1bkFuZFRyYWNrOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhY2thYmxlIGV4dGVuZHMgUnVuQW5kVHJhY2sgeworCXB1YmxpYyBJRWNsaXBzZUNvbnRleHQgdHJhY2tpbmdDb250ZXh0OworCXB1YmxpYyBib29sZWFuIHBhcnRpY2lwYXRpbmcgPSB0cnVlOworCisJcHVibGljIFRyYWNrYWJsZShJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQl0aGlzLnRyYWNraW5nQ29udGV4dCA9IGNvbnRleHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1VJRXZlbnRQdWJsaXNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVUlFdmVudFB1Ymxpc2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTc1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1VJRXZlbnRQdWJsaXNoZXIuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uaW1wbC5TdHJpbmdUb09iamVjdE1hcEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uaW1wbC5TdHJpbmdUb1N0cmluZ01hcEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlVJRXZlbnRzLkV2ZW50VGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHMuRXZlbnRUeXBlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKKworLyoqCisgKiBUcmFuc2Zvcm1zIEU0IE1QYXJ0IGV2ZW50cyBpbnRvIDMueCBsZWdhY3kgZXZlbnRzLgorICovCitwdWJsaWMgY2xhc3MgVUlFdmVudFB1Ymxpc2hlciBleHRlbmRzIEVDb250ZW50QWRhcHRlciB7CisKKwlwcml2YXRlIElFY2xpcHNlQ29udGV4dCBjb250ZXh0OworCisJLyoqCisJICogQHBhcmFtIGU0Q29udGV4dAorCSAqLworCXB1YmxpYyBVSUV2ZW50UHVibGlzaGVyKElFY2xpcHNlQ29udGV4dCBlNENvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gZTRDb250ZXh0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJLy8gSWdub3JlIGV2ZW50cyB0aGF0IGRpZCBub3QgY2hhbmdlIHRoZSBtb2RlbCB2YWx1ZQorCQlpZiAobm90aWZpY2F0aW9uLmlzVG91Y2goKSkKKwkJCXJldHVybjsKKworCQkvLyBGb3JtYXQgdGhlIEVNRiBldmVudCBhcyBhbiBFNCBVSUV2ZW50CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJU3RyaW5nIHRvcGljID0gZm9ybWF0RGF0YShub3RpZmljYXRpb24sIGFyZ01hcCk7CisKKwkJaWYgKHRvcGljICE9IG51bGwpIHsKKwkJCUlFdmVudEJyb2tlciBldmVudE1hbmFnZXIgPSBjb250ZXh0LmdldChJRXZlbnRCcm9rZXIuY2xhc3MpOworCQkJZXZlbnRNYW5hZ2VyLnNlbmQodG9waWMsIGFyZ01hcCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBMYXJnZSBoYWNrIGhlcmUuIE9wZW4gdG8gYmV0dGVyIHN1Z2dlc3Rpb25zCisJICoKKwkgKiBXaGVuIHRoZSBtb2RlbCBTRVQgY2hhbmdlcyBvY2N1ciB0byB0aGUgdmFsdWVzIG9mIG1hcHMsIHRoZSBOT1RJRklFUiBpcyB0aGUgbWFwIGFuZCBub3QgdGhlCisJICogZWxlbWVudCBjb250YWluaW5nIHRoZSBtYXAuIChOb3RlIHRoYXQgbWFwIGFkZGl0aW9uIGFuZCByZW1vdmFsIGV2ZW50cyBETyBjb21lIGluIHdpdGggdGhlCisJICogTk9USUZJRVIgc2V0IHRvIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIG1hcCkKKwkgKgorCSAqIEluIHRoZSBwcm9ibGVtYXRpYyBjYXNlLCB0aGUgY29udGFpbmluZyBtb2RlbCBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgTk9USUZJRVIncworCSAqIGVDb250YWluZXIuIEhvd2V2ZXIsIHRoZSBGRUFUVVJFIChmaWVsZCkgb2YgdGhlIGVDb250YWluZXIgY29udGFpbmluZyB0aGUgbWFwIGlzIG5vdCByZWFkaWx5CisJICogYXZhaWxhYmxlLgorCSAqCisJICogV2UgaGFkIGNvbnNpZGVyZWQgYSBzdHJhdGVneSB3aGVyZSB5b3UgcmVjdXJzaXZlbHkgY2hlY2sgYWxsIGZpZWxkcyBvZiB0aGUgZUNvbnRhaW5lciBmb3IgYW4KKwkgKiBvYmplY3QgdGhhdCBJUyB0aGUgTk9USUZJRVIsIGhvd2V2ZXIgdGhlc2UgZXZlbnRzIGhhcHBlbiBhIGxvdCBhbmQgdGhlIHJlc3VsdGluZyBjb2RlIHdvdWxkCisJICogaGF2ZSB2ZXJ5IHBvb3IgcGVyZm9ybWFuY2UuIEFkZGl0aW9uYWxseSwgYWxsIEkgY291bGQgZ2V0IGZyb20gdGhlIGVDb250YWluZXIgd2FzIGFuIEVNRgorCSAqIERlbGVnYXRpbmdNYXAsIHdoaWxlIHRoZSBOT1RJRklFUiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udGFpbmVkIGRlbGVnYXRlZCBtYXAKKwkgKiAoU3RyaW5nVG9PYmplY3RJbXBsIGZvciBleGFtcGxlKS4gSXQgd291bGQgYXBwZWFyIHNvbWUgcmVmbGVjdGlvbiB0cmlja3MgdG8gcmVhZAorCSAqIHByb3RlY3RlZC9wcml2YXRlIG1ldGhvZHMgd291bGQgYmUgcmVxdWlyZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IG9iamVjdHMgdG8gY29tcGFyZS4KKwkgKgorCSAqIEF0IHRoaXMgdGltZSB0aGVyZSBhcmUgb25seSB0d28gbWFwcyB1c2VkIGluIG91ciBtb2RlbC4gQSBTdHJpbmdUb09iamVjdCBtYXAgdXNlZCBpbgorCSAqIE1BcHBsaWNhdGlvbkVsZW1lbnQudHJhbnNpZW50RGF0YSBhIFN0cmluZ1RvU3RyaW5nIG1hcCB1c2VkIGluCisJICogTUFwcGxpY2F0aW9uRWxlbWVudC5wZXJzaXN0ZW50U3RhdGUuCisJICoKKwkgKiBUaGUgbGFyZ2UgaGFjayBlbXBsb3llZCBpcyB0byB0YWtlIHRoaXMga25vd2xlZGdlIGFuZCBoYXJkIGhhcmQgY29kZSB0aGUgdG9waWMgYmFzZWQgb24gdGhlCisJICogdHlwZSBvZiB0aGUgTk9USUZJRVIuCisJICoKKwkgKiBPbmUgcHJvYmxlbSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgaWYgYSBkZXZlbG9wZXIgbW9kaWZpZXMgdGhlIG1vZGVsIHRvIGNvbnRhaW4gYW5vdGhlciBmaWVsZAorCSAqIHVzaW5nIGEgbWFwIGV2ZW50cyB3b3VsZCBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgd3JvbmcgdG9waWMgaW5mb3JtYXRpb24uIFRoaXMgd2lsbCBsZWFkIHRvCisJICogaGFyZCB0byBpZGVudGlmeSBidWdzLgorCSAqCisJICogVG8gY29tYmF0IHRoaXMgSSBoYXZlIGFkZGVkIGd1YXJkIGNvZGUgdGhhdCBleHBsaWNpdGx5IGNvbmZpcm1zIHRoYXQgYSBTdHJpbmdUb09iamVjdCBjaGFuZ2UKKwkgKiBpcyBiZWluZyBvcmlnaW5hdGVkIGJ5IHRyYW5zaWVudERhdGEgYW5kIGEgU3RyaW5nVG9TdHJpbmcgY2hhbmdlIGlzIGJlaW5nIG9yaWdpbmF0ZWQgYnkKKwkgKiBwZXJzaXN0ZW50U3RhdGUuIElmIHRoZSBndWFyZCBjaGVjayBmYWlscyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duIHdpdGgKKwkgKiBpbnN0cnVjdGlvbnMgdG8gbW9kaWZ5IFVJRXZlbnRQdWJsaXNoZXIuCisJICoKKwkgKiBDbGVhcmx5IHRoaXMgaXMgYSBzdWItb3B0aW1hbCBzb2x1dGlvbiBhbmQgd291bGQgbGlrZSB0byBoZWFyIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudC4KKwkgKiBMaWtlbHkgdGhlcmUgaXMgc29tZSAic2ltcGxlIiBFTUYgd2lzZG9tIHdlIGFyZSBtaXNzaW5nIHRvIG1ha2UgdGhpcyB3b3JrIHdpdGggYSBjb3VwbGUgb2YKKwkgKiBhbm5vdGF0aW9ucywgYSB3aGl0ZSBzd2FuIGFuZCBhIGZ1bGwgbW9vbi4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBmb3JtYXREYXRhKGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJnTWFwKSB7CisJCU1BcHBsaWNhdGlvbkVsZW1lbnQgYXBwRWxlbWVudCA9IG51bGw7CisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKKwkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOworCQlTdHJpbmcgdG9waWMgPSBudWxsOworCisJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQlPYmplY3Qgb2xkVmFsdWUgPSBudWxsOworCQlPYmplY3QgbmV3VmFsdWUgPSBudWxsOworCQlPYmplY3QgcG9zaXRpb24gPSBudWxsOworCisJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbkVsZW1lbnQpIHsKKwkJCS8vIE1vc3QgRU1GIGV2ZW50cyB3aWxsIGJlIHRoZXNlLiBFdmVuIG1hcCBhZGQgYW5kIHJlbW92ZSBldmVudHMKKwkJCWFwcEVsZW1lbnQgPSAoTUFwcGxpY2F0aW9uRWxlbWVudCkgbm90aWZpZXI7CisJCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKKwkJCWF0dHJpYnV0ZU5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKKwkJCXRvcGljID0gZ2V0VG9waWMoZmVhdHVyZSwgZ2V0RXZlbnRUeXBlKG5vdGlmaWNhdGlvbikpOworCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6CisJCQkJLy8gZm9yIE1PVkUsIG9sZFZhbHVlIGlzIGFjdHVhbGx5IHRoZSBzb3VyY2UgcG9zaXRpb24KKwkJCQlvbGRWYWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOworCQkJCW5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7CisJCQkJcG9zaXRpb24gPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgorCQkJCW5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7CisJCQkJcG9zaXRpb24gPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgorCQkJCW9sZFZhbHVlID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7CisJCQkJcG9zaXRpb24gPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKKwkJCQlvbGRWYWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOworCQkJCW5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7CisJCQkJcG9zaXRpb24gPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlVOU0VUOgorCQkJCW9sZFZhbHVlID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7CisJCQkJbmV3VmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQWN0aXZhdG9yLmxvZyhJU3RhdHVzLkVSUk9SLCBnZXRDbGFzcygpLmdldE5hbWUoKQorCQkJCQkJKyAiOiB1bmhhbmRsZWQgRU1GIE5vdGlmaWNhdGlvbiBjb2RlOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChub3RpZmllciBpbnN0YW5jZW9mIFN0cmluZ1RvT2JqZWN0TWFwSW1wbCkgeworCQkJLy8gVGhlc2UgYXJlIFNFVCBldmVudHMgb24gU3RyaW5nVG9PYmplY3RNYXAgb25seQorCQkJLy8gU3RyaW5nVG9PYmplY3RNYXAgaXMgT05MWSB1c2VkIGJ5IE1BcHBsaWNhdGlvbkRhdGEudHJhbnNpZW50RGF0YQorCQkJYXBwRWxlbWVudCA9IChNQXBwbGljYXRpb25FbGVtZW50KSAoKFN0cmluZ1RvT2JqZWN0TWFwSW1wbCkgbm90aWZpZXIpLmVDb250YWluZXIoKTsKKworCQkJLy8gR3VhcmQgY29kZSB0byBkZXRlY3QgaWYgc29tZSBvdGhlciBtb2RlbCBmaWVsZCBpcyB1c2luZyBhIFN0cmluZ1RvT2JqZWN0TWFwCisJCQlmaW5hbCBTdHJpbmcga2V5ID0gKChTdHJpbmdUb09iamVjdE1hcEltcGwpIG5vdGlmaWVyKS5nZXRLZXkoKTsKKwkJCU9iamVjdCBzdG9yZWROZXdWYWx1ZSA9IGFwcEVsZW1lbnQuZ2V0VHJhbnNpZW50RGF0YSgpLmdldChrZXkpOworCQkJT2JqZWN0IG5vdGlmaWNhdGlvbk5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7CisKKwkJCS8vIElkZW50aXR5IGNoZWNrIGJ5IGRlc2lnbi4gSWYgdGhlc2UgYXJlIG5vdCB0aGUgc2FtZSBvYmplY3QgdGhlbiB0aGUgZXZlbnQgY2FtZSBmcm9tCisJCQkvLyBhIGRpZmZlcmVudCBtb2RlbCBvYmplY3QgdGhhbiB3ZSBleHBlY3RlZC4gV2FybiB0aGUgZGV2ZWxvcGVyCisJCQlpZiAobm90aWZpY2F0aW9uTmV3VmFsdWUgIT0gc3RvcmVkTmV3VmFsdWUpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkJIkEgU3RyaW5nVG9PYmplY3RNYXAgdGhhdCB3YXMgTk9UIE1BcHBsaWNhdGlvbkVsZW1lbnQudHJhbnNpZW50RGF0YSBjaGFuZ2VkLiAgWW91IG11c3QgbW9kaWZ5IFVJRXZlbnRQdWJsaXNoZXIgYXBwcm9wcmlhdGVseSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCWF0dHJpYnV0ZU5hbWUgPSBVSUV2ZW50cy5BcHBsaWNhdGlvbkVsZW1lbnQuVFJBTlNJRU5UREFUQTsKKwkJCXRvcGljID0gZ2V0VG9waWMoYXR0cmlidXRlTmFtZSwgZ2V0RXZlbnRUeXBlKG5vdGlmaWNhdGlvbikpOworCisJCQkvLyBXZSBuZWVkIHRvIHNlbmQgTWFwRW50cmllcyBmb3IgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcy4KKwkJCW9sZFZhbHVlID0gY3JlYXRlTWFwRW50cnkoa2V5LCBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7CisJCQluZXdWYWx1ZSA9IGNyZWF0ZU1hcEVudHJ5KGtleSwgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpOworCQl9IGVsc2UgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgU3RyaW5nVG9TdHJpbmdNYXBJbXBsKSB7CisJCQkvLyBUaGVzZSBhcmUgU0VUIGV2ZW50cyBvbiBTdHJpbmdUb1N0cmluZ01hcCBvbmx5CisJCQkvLyBTdHJpbmdUb1N0cmluZ01hcCBpcyBPTkxZIHVzZWQgYnkgTUFwcGxpY2F0aW9uRGF0YS5wZXJzaXN0ZWRTdGF0ZQorCQkJYXBwRWxlbWVudCA9IChNQXBwbGljYXRpb25FbGVtZW50KSAoKFN0cmluZ1RvU3RyaW5nTWFwSW1wbCkgbm90aWZpZXIpLmVDb250YWluZXIoKTsKKworCQkJLy8gR3VhcmQgY29kZSB0byBkZXRlY3QgaWYgc29tZSBvdGhlciBtb2RlbCBmaWVsZCBpcyB1c2luZyBhIFN0cmluZ1RvU3RyaW5nTWFwCisJCQlmaW5hbCBTdHJpbmcga2V5ID0gKChTdHJpbmdUb1N0cmluZ01hcEltcGwpIG5vdGlmaWVyKS5nZXRLZXkoKTsKKwkJCU9iamVjdCBzdG9yZWROZXdWYWx1ZSA9IGFwcEVsZW1lbnQuZ2V0UGVyc2lzdGVkU3RhdGUoKS5nZXQoa2V5KTsKKwkJCU9iamVjdCBub3RpZmljYXRpb25OZXdWYWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOworCisJCQkvLyBJZGVudGl0eSBjaGVjayBieSBkZXNpZ24uIElmIHRoZXNlIGFyZSBub3QgdGhlIHNhbWUgb2JqZWN0IHRoZW4gdGhlIGV2ZW50IGNhbWUgZnJvbQorCQkJLy8gYSBkaWZmZXJlbnQgbW9kZWwgb2JqZWN0IHRoYW4gd2UgZXhwZWN0ZWQuIFdhcm4gdGhlIGRldmVsb3BlcgorCQkJaWYgKG5vdGlmaWNhdGlvbk5ld1ZhbHVlICE9IHN0b3JlZE5ld1ZhbHVlKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCSJBIFN0cmluZ1RvU3RyaW5nTWFwIHRoYXQgd2FzIE5PVCBNQXBwbGljYXRpb25FbGVtZW50LnBlcnNpc3RlZFN0YXRlIGNoYW5nZWQuICBZb3UgbXVzdCBtb2RpZnkgVUlFdmVudFB1Ymxpc2hlciBhcHByb3ByaWF0ZWx5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQkJYXR0cmlidXRlTmFtZSA9IFVJRXZlbnRzLkFwcGxpY2F0aW9uRWxlbWVudC5QRVJTSVNURURTVEFURTsKKwkJCXRvcGljID0gZ2V0VG9waWMoYXR0cmlidXRlTmFtZSwgZ2V0RXZlbnRUeXBlKG5vdGlmaWNhdGlvbikpOworCQkJb2xkVmFsdWUgPSBjcmVhdGVNYXBFbnRyeShrZXksIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKKwkJCW5ld1ZhbHVlID0gY3JlYXRlTWFwRW50cnkoa2V5LCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7CisJCX0gZWxzZSB7CisJCQkvLyBVbmhhbmRsZWQgbm90aWZpY2F0aW9uIHR5cGUuIElnbm9yZSBldmVudAorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlhcmdNYXAucHV0KEV2ZW50VGFncy5UWVBFLCBnZXRFdmVudFR5cGUobm90aWZpY2F0aW9uKSk7CisJCWFyZ01hcC5wdXQoRXZlbnRUYWdzLkVMRU1FTlQsIGFwcEVsZW1lbnQpOworCQlhcmdNYXAucHV0KEV2ZW50VGFncy5BVFROQU1FLCBhdHRyaWJ1dGVOYW1lKTsKKworCQkvLyBubyBuZWVkIHRvIGluY2x1ZGUgVU5TRVQKKwkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCisJCQkJfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5NT1ZFCisJCQkJfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQKKwkJCQl8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZCisJCQkJfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUKKwkJCQl8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7CisJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworCQkJCWFyZ01hcC5wdXQoRXZlbnRUYWdzLk5FV19WQUxVRSwgbmV3VmFsdWUpOworCQkJfQorCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKwkJCQlhcmdNYXAucHV0KEV2ZW50VGFncy5PTERfVkFMVUUsIG9sZFZhbHVlKTsKKwkJCX0KKwkJCWlmIChwb3NpdGlvbiAhPSBudWxsKSB7CisJCQkJYXJnTWFwLnB1dChFdmVudFRhZ3MuUE9TSVRJT04sIHBvc2l0aW9uKTsKKwkJCX0KKwkJfQorCisJCWlmIChhcHBFbGVtZW50IGluc3RhbmNlb2YgTVVJRWxlbWVudCkgeworCQkJYXJnTWFwLnB1dChFdmVudFRhZ3MuV0lER0VULCAoKE1VSUVsZW1lbnQpIGFwcEVsZW1lbnQpLmdldFdpZGdldCgpKTsKKwkJfQorCisJCXJldHVybiB0b3BpYzsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRFdmVudFR5cGUoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgeworCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6CisJCQlyZXR1cm4gRXZlbnRUeXBlcy5BREQ7CisKKwkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6CisJCQlyZXR1cm4gRXZlbnRUeXBlcy5BRERfTUFOWTsKKworCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6CisJCQlyZXR1cm4gRXZlbnRUeXBlcy5SRU1PVkU7CisKKwkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6CisJCQlyZXR1cm4gRXZlbnRUeXBlcy5SRU1PVkVfTUFOWTsKKworCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgorCQkJcmV0dXJuIEV2ZW50VHlwZXMuTU9WRTsKKworCQkJLy8gY2FzZSBOb3RpZmljYXRpb24uVU5TRVQ6IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGdlbmVyYXRlZAorCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6CisJCQlyZXR1cm4gRXZlbnRUeXBlcy5TRVQ7CisJCX0KKworCQlyZXR1cm4gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGNyZWF0ZU1hcEVudHJ5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworCQlyZXR1cm4gbmV3IE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQkJCXJldHVybiBrZXk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUb3BpYyhFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIFN0cmluZyB0eXBlKSB7CisJCUVDbGFzcyBlQ29udGFpbmluZ0NsYXNzID0gZUZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOworCQlyZXR1cm4gVUlFdmVudHMuVUlNb2RlbFRvcGljQmFzZSArIFVJRXZlbnRzLlRPUElDX1NFUAorCQkJCSsgZUNvbnRhaW5pbmdDbGFzcy5nZXRFUGFja2FnZSgpLmdldE5hbWUoKSArIFVJRXZlbnRzLlRPUElDX1NFUAorCQkJCSsgZUNvbnRhaW5pbmdDbGFzcy5nZXROYW1lKCkgKyBVSUV2ZW50cy5UT1BJQ19TRVAgKyBlRmVhdHVyZS5nZXROYW1lKCkKKwkJCQkrIFVJRXZlbnRzLlRPUElDX1NFUCArIHR5cGU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VG9waWMoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyB0eXBlKSB7CisJCVN0cmluZyB0b3BpY0Jhc2UgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vQXBwbGljYXRpb25FbGVtZW50LyI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRvcGljQmFzZSArIGF0dHJpYnV0ZU5hbWUgKyBVSUV2ZW50cy5UT1BJQ19TRVAgKyB0eXBlOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVVJJSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1VSSUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWVkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1VSSUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgUmVuw6kgQnJhbmRzdGV0dGVyIC0gQnVnIDQxOTc0OSAtIFtXb3JrYmVuY2hdIFtlNCBXb3JrYmVuY2hdIC0gUmVtb3ZlIHRoZSBkZXByZWNhdGVkIFBhY2thZ2VBZG1pbgorICogICAgIExhcnMgVm9nZWwgPExhcnMuVm9nZWxAdm9nZWxhLmNvbT4gLSBCdWcgNDQ5ODU5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuc3BpLlJlZ2lzdHJ5Q29udHJpYnV0b3I7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsud2lyaW5nLkJ1bmRsZVJldmlzaW9uOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7CisKKy8qKgorICogQ29sbGVjdGlvbiBvZiBVUkktcmVsYXRlZCB1dGlsaXRpZXMKKyAqLworcHVibGljIGNsYXNzIFVSSUhlbHBlciB7CisKKwkvKioKKwkgKiBUaGUgc2NoZW1hIGlkZW50aWZpZXIgdXNlZCBmb3IgRWNsaXBzZSBwbGF0Zm9ybSByZWZlcmVuY2VzCisJICovCisJZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX1NDSEVNQSA9ICJwbGF0Zm9ybTovIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNjaGVtYSBpZGVudGlmaWVyIHVzZWQgZm9yIEVjbGlwc2UgYnVuZGxlc2NsYXNzIHJlZmVyZW5jZQorCSAqLworCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVDTEFTU19TQ0hFTUEgPSAiYnVuZGxlY2xhc3M6Ly8iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2NoZW1hIGlkZW50aWZpZXIgdXNlZCBmb3IgRU1GIHBsYXRmb3JtIHJlZmVyZW5jZXMKKwkgKi8KKwlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUExBVEZPUk1fU0NIRU1BX0VNRiA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBzZWdtZW50IHVzZWQgdG8gc3BlY2lmeSBsb2NhdGlvbiBpbiBhIHBsdWdpbgorCSAqLworCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBQTFVHSU5fU0VHTUVOVCA9ICJwbHVnaW4vIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNlZ21lbnQgdXNlZCB0byBzcGVjaWZ5IGxvY2F0aW9uIGluIGEgZnJhZ21lbnQKKwkgKi8KKwlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRlJBR01FTlRfU0VHTUVOVCA9ICJmcmFnbWVudC8iOyAvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgcHVibGljIFN0cmluZyBjb25zdHJ1Y3RQbGF0Zm9ybVVSSShCdW5kbGUgYnVuZGxlKSB7CisJCUJ1bmRsZVJldmlzaW9uIGJ1bmRsZVJldmlzaW9uID0gYnVuZGxlLmFkYXB0KEJ1bmRsZVJldmlzaW9uLmNsYXNzKTsKKwkJaWYgKGJ1bmRsZVJldmlzaW9uID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQlTdHJpbmdCdWZmZXIgdG1wID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl0bXAuYXBwZW5kKFBMQVRGT1JNX1NDSEVNQSk7CisJCWlmICgoYnVuZGxlUmV2aXNpb24uZ2V0VHlwZXMoKSAmIEJ1bmRsZVJldmlzaW9uLlRZUEVfRlJBR01FTlQpID09IEJ1bmRsZVJldmlzaW9uLlRZUEVfRlJBR01FTlQpCisJCQl0bXAuYXBwZW5kKEZSQUdNRU5UX1NFR01FTlQpOworCQllbHNlCisJCQl0bXAuYXBwZW5kKFBMVUdJTl9TRUdNRU5UKTsKKwkJdG1wLmFwcGVuZChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOworCQlyZXR1cm4gdG1wLnRvU3RyaW5nKCk7CisJfQorCisJc3RhdGljIHB1YmxpYyBTdHJpbmcgY29uc3RydWN0UGxhdGZvcm1VUkkoSUNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7CisJCS8vIHJlZ2lzdHJ5IGNvbnRyaWJ1dG9ycyBhcmUgc2luZ2xldG9ucworCQlTdHJpbmcgYnVuZGxlTmFtZTsKKwkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgUmVnaXN0cnlDb250cmlidXRvcikKKwkJCWJ1bmRsZU5hbWUgPSAoKFJlZ2lzdHJ5Q29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5nZXRBY3R1YWxOYW1lKCk7CisJCWVsc2UKKwkJCS8vIHNob3VsZCBub3QgaGFwcGVuIGZvciB0aGUgc3RhbmRhcmQgcmVnaXN0cnksIGJ1dCB0cnkgdG8gbWFrZSBhIGJlc3QgZ3Vlc3MKKwkJCWJ1bmRsZU5hbWUgPSBjb250cmlidXRvci5nZXROYW1lKCk7CisJCUJ1bmRsZSBidW5kbGUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZUZvck5hbWUoYnVuZGxlTmFtZSk7CisJCXJldHVybiBjb25zdHJ1Y3RQbGF0Zm9ybVVSSShidW5kbGUpOworCX0KKworCXN0YXRpYyBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgY29udHJpYnV0b3JVUkkpIHsKKwkJVVJJIHVyaTsKKwkJdHJ5IHsKKwkJCXVyaSA9IG5ldyBVUkkoY29udHJpYnV0b3JVUkkpOworCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgIkludmFsaWQgY29udHJpYnV0b3IgVVJJOiAiICsgY29udHJpYnV0b3JVUkkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIVBMQVRGT1JNX1NDSEVNQS5lcXVhbHModXJpLmdldFNjaGVtZSgpKSkKKwkJCXJldHVybiBudWxsOyAvLyBub3QgaW1wbGVtZW50ZWQKKwkJcmV0dXJuIEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlRm9yTmFtZSh1cmkuZ2V0UGF0aCgpKTsKKwl9CisKKwlzdGF0aWMgcHVibGljIFN0cmluZyBFTUZ0b1BsYXRmb3JtKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpKSB7CisJCWlmICghUExBVEZPUk1fU0NIRU1BX0VNRi5lcXVhbHModXJpLnNjaGVtZSgpKSkKKwkJCXJldHVybiBudWxsOworCQkvLyByZW1vdmUgYWxsIHNlZ21lbnRzIGJ1dCBmaXJzdCB0d28gLSBvbmx5IG5lZWQgYnVuZGxlL2ZyYWdtZW50IG5hbWUKKwkJaW50IHNlZ21lbnRzID0gdXJpLnNlZ21lbnRDb3VudCgpOworCQkvLyBzZWdtZW50czogeyAicGx1Z2luIiwgIm9yZy5lY2xpcHNlLnBsYXRmb3JtIiwgIm15RGlyIiwgIm1vZGVsLmU0eG1pIiB9CisJCWlmIChzZWdtZW50cyA+IDIpCisJCQl1cmkgPSB1cmkudHJpbVNlZ21lbnRzKHNlZ21lbnRzIC0gMik7CisJCXJldHVybiB1cmkudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGNoZWNrcyBpZiBnaXZlbiBTdHJpbmcgcmVwcmVzZW50cyBhIFBsYXRmb3JtIFVSSS4KKwkgKgorCSAqIEBwYXJhbSB1cmkKKwkgKiAgICAgICAgICAgIGEgcG9zc2libGUgUGxhdGZvcm0gVVJJCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgbm90IHtAY29kZSBudWxsfSBhbmQgc3RhcnRzIHdpdGgKKwkgKiAgICAgICAgIHtAdmFsdWUgI1BMQVRGT1JNX1NDSEVNQX07IGZhbHNlIG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtVVJJKFN0cmluZyB1cmkpIHsKKwkJcmV0dXJuIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1NDSEVNQSk7CisJfQorCisJLyoqCisJICogSGVscGVyIG1ldGhvZCB3aGljaCBjaGVja3MgaWYgZ2l2ZW4gU3RyaW5nIHJlcHJlc2VudHMgYSBCdW5kbGVjbGFzcyBVUkkuCisJICoKKwkgKiBAcGFyYW0gdXJpCisJICogICAgICAgICAgICBhIHBvc3NpYmxlIEJ1bmRsZWNsYXNzIFVSSQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIG5vdCB7QGNvZGUgbnVsbH0gYW5kIHN0YXJ0cyB3aXRoCisJICogICAgICAgICB7QHZhbHVlICNCVU5ETEVDTEFTU19TQ0hFTUF9OyBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCdW5kbGVDbGFzc1VyaShTdHJpbmcgdXJpKSB7CisJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aChCVU5ETEVDTEFTU19TQ0hFTUEpKSB7CisJCQlTdHJpbmdbXSBzcGxpdCA9IHVyaS5zdWJzdHJpbmcoQlVORExFQ0xBU1NfU0NIRU1BLmxlbmd0aCgpKS5zcGxpdCgiLyIpOyAvLyROT04tTkxTLTEkCisJCQkvLyBzZWdtZW50czogeyAiYnVuZGxlLXN5bWJvbGljLW5hbWUiLCAiZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSJ9CisJCQlpZiAoc3BsaXQubGVuZ3RoID09IDIpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNmVhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1V0aWwuamF2YQpAQCAtMCwwICsxLDQ4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCisvKioKKyAqIDxwPgorICogQSBzdGF0aWMgY2xhc3MgcHJvdmlkaW5nIHV0aWxpdHkgbWV0aG9kcyB0byBhbGwgb2YgSkZhY2UuCisgKiA8L3A+CisgKgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXRpbCB7CisKKwkvKioKKwkgKiBBbiB1bm1vZGlmaWFibGUsIGVtcHR5LCBzb3J0ZWQgc2V0LiBUaGlzIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgY2hhbmdlIGFuZCBuZXZlciBiZQorCSAqIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU29ydGVkU2V0PD8+IEVNUFRZX1NPUlRFRF9TRVQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQobmV3IFRyZWVTZXQ8PigpKTsKKworCS8qKgorCSAqIEEgY29tbW9uIHplcm8tbGVuZ3RoIHN0cmluZy4gSXQgYXZvaWRzIG5lZWRpbmcgd3JpdGUgPGNvZGU+Tk9OLU5MUzwvY29kZT4gbmV4dCB0byBjb2RlCisJICogZnJhZ21lbnRzLiBJdCdzIGFsc28gYSBiaXQgY2xlYXJlciB0byByZWFkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9fTEVOR1RIX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLgorCSAqCisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBjaGVjazsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjCisJICogICAgICAgICAgICBUaGUgY2xhc3Mgd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmU7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhc3NlcnRJbnN0YW5jZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzczw/PiBjKSB7CisJCWFzc2VydEluc3RhbmNlKG9iamVjdCwgYywgZmFsc2UpOworCX0KKworCS8qKgorCSAqIFZlcmlmaWVzIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLiBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5CisJICogd2hldGhlciB0aGUgb2JqZWN0IGlzIHBlcm1pdHRlZCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gY2hlY2s7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYworCSAqICAgICAgICAgICAgVGhlIGNsYXNzIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYWxsb3dOdWxsCisJICogICAgICAgICAgICBXaGV0aGVyIHRoZSBvYmplY3QgaXMgYWxsb3dlZCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFzc2VydEluc3RhbmNlKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzPD8+IGMsCisJCQlmaW5hbCBib29sZWFuIGFsbG93TnVsbCkgeworCQlpZiAob2JqZWN0ID09IG51bGwgJiYgYWxsb3dOdWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAob2JqZWN0ID09IG51bGwgfHwgYyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfSBlbHNlIGlmICghYy5pc0luc3RhbmNlKG9iamVjdCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbXBhcmVzIHR3byBib29sZWFuIHZhbHVlcy4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIGNvbnNpZGVyZWQgdG8gYmUgImxlc3MgdGhhbiIKKwkgKiA8Y29kZT50cnVlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBsZWZ0CisJICogICAgICAgICAgICBUaGUgbGVmdCB2YWx1ZSB0byBjb21wYXJlCisJICogQHBhcmFtIHJpZ2h0CisJICogICAgICAgICAgICBUaGUgcmlnaHQgdmFsdWUgdG8gY29tcGFyZQorCSAqIEByZXR1cm4gPGNvZGU+LTE8L2NvZGU+IGlmIHRoZSBsZWZ0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHJpZ2h0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorCSAqICAgICAgICAgPGNvZGU+MTwvY29kZT4gaWYgdGhlIG9wcG9zaXRlIGlzIHRydWUuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGl0IHJldHVybnMKKwkgKiAgICAgICAgIDxjb2RlPjA8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmUoZmluYWwgYm9vbGVhbiBsZWZ0LCBmaW5hbCBib29sZWFuIHJpZ2h0KSB7CisJCXJldHVybiBsZWZ0ID09IGZhbHNlID8gKHJpZ2h0ID09IHRydWUgPyAtMSA6IDApIDogMTsKKwl9CisKKwkvKioKKwkgKiBDb21wYXJlcyB0d28gaW50ZWdlciB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGxlZnQgdmFsdWUgdG8gY29tcGFyZQorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IHZhbHVlIHRvIGNvbXBhcmUKKwkgKiBAcmV0dXJuIDxjb2RlPmxlZnQgLSByaWdodDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXJlKGZpbmFsIGludCBsZWZ0LCBmaW5hbCBpbnQgcmlnaHQpIHsKKwkJcmV0dXJuIGxlZnQgLSByaWdodDsKKwl9CisKKwkvKioKKwkgKiBDb21wYXJlcyB0byBjb21wYXJhYmxlIG9iamVjdHMgLS0gZGVmZW5kaW5nIGFnYWluc3QgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGxlZnQgb2JqZWN0IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4gPGNvZGU+bnVsbDwvY29kZT4gaXMgY29uc2lkZXJlZCB0byBiZSB0aGUgbGVhc3QKKwkgKiAgICAgICAgIHBvc3NpYmxlIHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBpbnQgY29tcGFyZShmaW5hbCBUIGxlZnQsIGZpbmFsIFQgcmlnaHQpIHsKKwkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsZWZ0ID09IG51bGwpIHsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChyaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb21wYXJlcyB0d28gYXJyYXlzIG9mIGNvbXBhcmFibGUgb2JqZWN0cyAtLSBhY2NvdW50aW5nIGZvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBsZWZ0CisJICogICAgICAgICAgICBUaGUgbGVmdCBhcnJheSB0byBiZSBjb21wYXJlZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IGFycmF5IHRvIGJlIGNvbXBhcmVkOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLiA8Y29kZT5udWxsPC9jb2RlPiBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZSBsZWFzdAorCSAqICAgICAgICAgcG9zc2libGUgdmFsdWUuIEEgc2hvcnRlciBhcnJheSBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiBhIGxvbmdlciBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gaW50IGNvbXBhcmUoZmluYWwgVFtdIGxlZnQsIGZpbmFsIFRbXSByaWdodCkgeworCQlpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxlZnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKHJpZ2h0ID09IG51bGwpIHsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKKwkJCWludCByID0gcmlnaHQubGVuZ3RoOworCisJCQlpZiAobCAhPSByKSB7CisJCQkJcmV0dXJuIGwgLSByOworCQkJfQorCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgeworCQkJCWludCBjb21wYXJlVG8gPSBjb21wYXJlKGxlZnRbaV0sIHJpZ2h0W2ldKTsKKworCQkJCWlmIChjb21wYXJlVG8gIT0gMCkgeworCQkJCQlyZXR1cm4gY29tcGFyZVRvOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb21wYXJlcyB0d28gbGlzdHMgLS0gYWNjb3VudCBmb3IgPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBsaXN0cyBtdXN0IGNvbnRhaW4gY29tcGFyYWJsZQorCSAqIG9iamVjdHMuCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGxlZnQgbGlzdCB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFRoaXMgbGlzdCBtdXN0IG9ubHkgY29udGFpbgorCSAqICAgICAgICAgICAgaW5zdGFuY2VzIG9mIDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+LgorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgVGhlIHJpZ2h0IGxpc3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGxpc3QgbXVzdCBvbmx5IGNvbnRhaW4KKwkgKiAgICAgICAgICAgIGluc3RhbmNlcyBvZiA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPi4KKwkgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24uIDxjb2RlPm51bGw8L2NvZGU+IGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGxlYXN0CisJICogICAgICAgICBwb3NzaWJsZSB2YWx1ZS4gQSBzaG9ydGVyIGxpc3QgaXMgY29uc2lkZXJlZCBsZXNzIHRoYW4gYSBsb25nZXIgbGlzdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gaW50IGNvbXBhcmUoZmluYWwgTGlzdDxUPiBsZWZ0LCBmaW5hbCBMaXN0PFQ+IHJpZ2h0KSB7CisJCWlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGVmdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlpbnQgbCA9IGxlZnQuc2l6ZSgpOworCQkJaW50IHIgPSByaWdodC5zaXplKCk7CisKKwkJCWlmIChsICE9IHIpIHsKKwkJCQlyZXR1cm4gbCAtIHI7CisJCQl9CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7CisJCQkJaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUobGVmdC5nZXQoaSksIHJpZ2h0LmdldChpKSk7CisKKwkJCQlpZiAoY29tcGFyZVRvICE9IDApIHsKKwkJCQkJcmV0dXJuIGNvbXBhcmVUbzsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoqCisJICogVGVzdHMgd2hldGhlciB0aGUgZmlyc3QgYXJyYXkgZW5kcyB3aXRoIHRoZSBzZWNvbmQgYXJyYXkuCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGFycmF5IHRvIGNoZWNrIChsYXJnZXIpOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHJpZ2h0CisJICogICAgICAgICAgICBUaGUgYXJyYXkgdGhhdCBzaG91bGQgYmUgYSBzdWJzZXF1ZW5jZSAoc21hbGxlcik7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZXF1YWxzCisJICogICAgICAgICAgICBXaGV0aGVyIHRoZSB0d28gYXJyYXkgYXJlIGFsbG93ZWQgdG8gYmUgZXF1YWwuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2Vjb25kIGFycmF5IGlzIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIGFycmF5IGxpc3QsIGFuZCB0aGV5CisJICogICAgICAgICBzaGFyZSBlbmQgZWxlbWVudHMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuZHNXaXRoKGZpbmFsIE9iamVjdFtdIGxlZnQsIGZpbmFsIE9iamVjdFtdIHJpZ2h0LAorCQkJZmluYWwgYm9vbGVhbiBlcXVhbHMpIHsKKwkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpbnQgbCA9IGxlZnQubGVuZ3RoOworCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKKworCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKSB7CisJCQlpZiAoIWVxdWFscyhsZWZ0W2wgLSBpIC0gMV0sIHJpZ2h0W3IgLSBpIC0gMV0pKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGFyZSA8Y29kZT5udWxsPC9jb2RlPiAtLSBhbGxvd2luZyBmb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgVGhlIGxlZnQgb2JqZWN0IHRvIGNvbXBhcmU7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBvYmplY3QgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVpdmFsZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IGxlZnQsIGZpbmFsIE9iamVjdCByaWdodCkgeworCQlyZXR1cm4gbGVmdCA9PSBudWxsID8gcmlnaHQgPT0gbnVsbCA6ICgocmlnaHQgIT0gbnVsbCkgJiYgbGVmdC5lcXVhbHMocmlnaHQpKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB3aGV0aGVyIHR3byBhcnJheXMgb2Ygb2JqZWN0cyBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlci4gVGhlIGFycmF5cyBtdXN0IG5vdCBiZQorCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgdGhlaXIgZWxlbWVudHMgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGxlZnRBcnJheQorCSAqICAgICAgICAgICAgVGhlIGxlZnQgYXJyYXkgdG8gY29tcGFyZTsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgbWF5IGJlIGVtcHR5IGFuZCBtYXkKKwkgKiAgICAgICAgICAgIGNvbnRhaW4gPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCisJICogQHBhcmFtIHJpZ2h0QXJyYXkKKwkgKiAgICAgICAgICAgIFRoZSByaWdodCBhcnJheSB0byBjb21wYXJlOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCBtYXkgYmUgZW1wdHkgYW5kIG1heQorCSAqICAgICAgICAgICAgY29udGFpbiA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheXMgYXJlIGVxdWFsIGxlbmd0aCBhbmQgdGhlIGVsZW1lbnRzIGF0IHRoZSBzYW1lCisJICogICAgICAgICBwb3NpdGlvbiBhcmUgZXF1YWw7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3RbXSBsZWZ0QXJyYXksIGZpbmFsIE9iamVjdFtdIHJpZ2h0QXJyYXkpIHsKKwkJaWYgKGxlZnRBcnJheSA9PSByaWdodEFycmF5KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmIChsZWZ0QXJyYXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIChyaWdodEFycmF5ID09IG51bGwpOworCQl9IGVsc2UgaWYgKHJpZ2h0QXJyYXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKGxlZnRBcnJheS5sZW5ndGggIT0gcmlnaHRBcnJheS5sZW5ndGgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVmdEFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlmaW5hbCBPYmplY3QgbGVmdCA9IGxlZnRBcnJheVtpXTsKKwkJCWZpbmFsIE9iamVjdCByaWdodCA9IHJpZ2h0QXJyYXlbaV07CisJCQlmaW5hbCBib29sZWFuIGVxdWFsID0gKGxlZnQgPT0gbnVsbCkgPyAocmlnaHQgPT0gbnVsbCkgOiAobGVmdC5lcXVhbHMocmlnaHQpKTsKKwkJCWlmICghZXF1YWwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBQcm92aWRlcyBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW50ZWdlciB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBpCisJICogICAgICAgICAgICBUaGUgaW50ZWdlciB2YWx1ZQorCSAqIEByZXR1cm4gPGNvZGU+aTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNoQ29kZShmaW5hbCBpbnQgaSkgeworCQlyZXR1cm4gaTsKKwl9CisKKwkvKioKKwkgKiBQcm92aWRlcyBhIGhhc2ggY29kZSBmb3IgdGhlIG9iamVjdCAtLSBkZWZlbmRpbmcgYWdhaW5zdCA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgZm9yIHdoaWNoIGEgaGFzaCBjb2RlIGlzIHJlcXVpcmVkLgorCSAqIEByZXR1cm4gPGNvZGU+b2JqZWN0Lmhhc2hDb2RlPC9jb2RlPiBvciA8Y29kZT4wPC9jb2RlPiBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlmCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNoQ29kZShmaW5hbCBPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvYmplY3QgIT0gbnVsbCA/IG9iamVjdC5oYXNoQ29kZSgpIDogMDsKKwl9CisKKwkvKioKKwkgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIGZvciBhbiBhcnJheSBvZiBvYmplY3RzLCBidXQgd2l0aCBkZWZlbnNlIGFnYWluc3QgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0cworCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIG9iamVjdHMgZm9yIHdoaWNoIGEgaGFzaCBjb2RlIGlzIG5lZWRlZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gVGhlIGhhc2ggY29kZSBmb3IgPGNvZGU+b2JqZWN0czwvY29kZT47IG9yIDxjb2RlPjA8L2NvZGU+IGlmIDxjb2RlPm9iamVjdHM8L2NvZGU+IGlzCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNoQ29kZShmaW5hbCBPYmplY3RbXSBvYmplY3RzKSB7CisJCWlmIChvYmplY3RzID09IG51bGwpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaW50IGhhc2hDb2RlID0gODk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IG9iamVjdHNbaV07CisJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKKwkJCQloYXNoQ29kZSA9IGhhc2hDb2RlICogMzEgKyBvYmplY3QuaGFzaENvZGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBoYXNoQ29kZTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGUgc2Vjb25kIGFycmF5IGlzIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIGZpcnN0IGFycmF5LCBhbmQgdGhhdCB0aGV5IHNoYXJlCisJICogY29tbW9uIHN0YXJ0aW5nIGVsZW1lbnRzLgorCSAqCisJICogQHBhcmFtIGxlZnQKKwkgKiAgICAgICAgICAgIFRoZSBmaXJzdCBhcnJheSB0byBjb21wYXJlIChsYXJnZSk7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIFRoZSBzZWNvbmQgYXJyYXkgdG8gY29tcGFyZSAoc21hbGwpOyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGVxdWFscworCSAqICAgICAgICAgICAgV2hldGhlciBpdCBpcyBhbGxvd2VkIGZvciB0aGUgdHdvIGFycmF5cyB0byBiZSBlcXVpdmFsZW50LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpcnN0IGFycmF5cyBzdGFydHMgd2l0aCB0aGUgc2Vjb25kIGxpc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgICAgICAgb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdGFydHNXaXRoKGZpbmFsIE9iamVjdFtdIGxlZnQsIGZpbmFsIE9iamVjdFtdIHJpZ2h0LAorCQkJZmluYWwgYm9vbGVhbiBlcXVhbHMpIHsKKwkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpbnQgbCA9IGxlZnQubGVuZ3RoOworCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKKworCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKSB7CisJCQlpZiAoIWVxdWFscyhsZWZ0W2ldLCByaWdodFtpXSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBhbiBhcnJheSBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRlYnVnZ2luZy4KKwkgKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgVGhlIGFycmF5IHRvIGNvbnZlcnQ7IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFycmF5OyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhmaW5hbCBPYmplY3RbXSBhcnJheSkgeworCQlpZiAoYXJyYXkgPT0gbnVsbCkgeworCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZCgnWycpOworCisJCWZpbmFsIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpICE9IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKCcsJyk7CisJCQl9CisJCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gYXJyYXlbaV07CisJCQlmaW5hbCBTdHJpbmcgZWxlbWVudCA9IFN0cmluZy52YWx1ZU9mKG9iamVjdCk7CisJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnQpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKworCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogUHJvdmlkZXMgYSB0cmFuc2xhdGlvbiBvZiBhIHBhcnRpY3VsYXIga2V5IGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KKwkgKgorCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQorCSAqICAgICAgICAgICAgVGhlIGtleSB0byBsb29rIHVwIGluIHRoZSByZXNvdXJjZSBidW5kbGU7IHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgVGhlIGtleSB0byBsb29rIHVwIGluIHRoZSByZXNvdXJjZSBidW5kbGU7IHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGRlZmF1bHRTdHJpbmcKKwkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZDsgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGVkIHJlc291cmNlIGF0IDxjb2RlPmtleTwvY29kZT4uIElmIHRoZSBrZXkgY2Fubm90IGJlIGZvdW5kLAorCSAqICAgICAgICAgdGhlbiBpdCBpcyBzaW1wbHkgdGhlIDxjb2RlPmRlZmF1bHRTdHJpbmc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYW5zbGF0ZVN0cmluZyhmaW5hbCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwKKwkJCWZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyBkZWZhdWx0U3RyaW5nKSB7CisJCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsICYmIGtleSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWZpbmFsIFN0cmluZyB0cmFuc2xhdGVkU3RyaW5nID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7CisKKwkJCQlpZiAodHJhbnNsYXRlZFN0cmluZyAhPSBudWxsKSB7CisJCQkJCXJldHVybiB0cmFuc2xhdGVkU3RyaW5nOworCQkJCX0KKwkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlTWlzc2luZ1Jlc291cmNlKSB7CisJCQkJLy8gU3VjaCBpcyBsaWZlLiBXZSdsbCByZXR1cm4gdGhlIGtleQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGRlZmF1bHRTdHJpbmc7CisJfQorCisJLyoqCisJICogRm91bmRhdGlvbiByZXBsYWNlbWVudCBmb3IgPGNvZGU+U3RyaW5nI3JlcGxhY2VBbGwoU3RyaW5nLAorCSAqIFN0cmluZyk8L2NvZGU+LCBidXQgPHN0cm9uZz53aXRob3V0IHN1cHBvcnQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnM8L3N0cm9uZz4uCisJICoKKwkgKiBAcGFyYW0gc3JjCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgc3RyaW5nCisJICogQHBhcmFtIGZpbmQKKwkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZmluZAorCSAqIEBwYXJhbSByZXBsYWNlbWVudAorCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2VtZW50IHN0cmluZworCSAqIEByZXR1cm4gdGhlIG5ldyBzdHJpbmcsIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIDxjb2RlPmZpbmQ8L2NvZGU+IHJlcGxhY2VkIGJ5CisJICogICAgICAgICA8Y29kZT5yZXBsYWNlbWVudDwvY29kZT4gKG5vdCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zKQorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyBzcmMsIFN0cmluZyBmaW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpIHsKKwkJZmluYWwgaW50IGxlbiA9IHNyYy5sZW5ndGgoKTsKKwkJZmluYWwgaW50IGZpbmRMZW4gPSBmaW5kLmxlbmd0aCgpOworCisJCWludCBpZHggPSBzcmMuaW5kZXhPZihmaW5kKTsKKwkJaWYgKGlkeCA8IDApIHsKKwkJCXJldHVybiBzcmM7CisJCX0KKworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpbnQgYmVnaW5JbmRleCA9IDA7CisJCXdoaWxlIChpZHggIT0gLTEgJiYgaWR4IDwgbGVuKSB7CisJCQlidWYuYXBwZW5kKHNyYy5zdWJzdHJpbmcoYmVnaW5JbmRleCwgaWR4KSk7CisJCQlidWYuYXBwZW5kKHJlcGxhY2VtZW50KTsKKworCQkJYmVnaW5JbmRleCA9IGlkeCArIGZpbmRMZW47CisJCQlpZiAoYmVnaW5JbmRleCA8IGxlbikgeworCQkJCWlkeCA9IHNyYy5pbmRleE9mKGZpbmQsIGJlZ2luSW5kZXgpOworCQkJfSBlbHNlIHsKKwkJCQlpZHggPSAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmVnaW5JbmRleCA8IGxlbikgeworCQkJYnVmLmFwcGVuZChzcmMuc3Vic3RyaW5nKGJlZ2luSW5kZXgsIChpZHggPT0gLTEgPyBsZW4gOiBpZHgpKSk7CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5ldmVyIGJlIGNvbnN0cnVjdGVkLgorCSAqLworCXByaXZhdGUgVXRpbCgpIHsKKwkJLy8gTm90IGFsbG93ZWQuCisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9Xb3JrYmVuY2hMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvV29ya2JlbmNoTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlNzZhNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvV29ya2JlbmNoTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubG9nLkZyYW1ld29ya0xvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuRnJhbWV3b3JrTG9nRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdUcmFjZTsKKworLyoqCisgKiBUaGUgd29ya2JlbmNoIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsb2dnZXIgc2VydmljZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdvcmtiZW5jaExvZ2dlciBleHRlbmRzIExvZ2dlciB7CisJcHJvdGVjdGVkIERlYnVnVHJhY2UgdHJhY2U7CisJcHJvdGVjdGVkIEZyYW1ld29ya0xvZyBsb2c7CisJcHJpdmF0ZSBTdHJpbmcgYnVuZGxlTmFtZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgd29ya2JlbmNoIGxvZ2dlcgorCSAqLworCUBJbmplY3QKKwlwdWJsaWMgV29ya2JlbmNoTG9nZ2VyKEBPcHRpb25hbCBATmFtZWQoImxvZ2dlci5idW5kbGVuYW1lIikgU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5idW5kbGVOYW1lID0gYnVuZGxlTmFtZSA9PSBudWxsID8gQWN0aXZhdG9yLlBJX1dPUktCRU5DSCA6IGJ1bmRsZU5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVidWcoVGhyb3dhYmxlIHQpIHsKKwkJZGVidWcodCwgbnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVidWcoVGhyb3dhYmxlIHQsIFN0cmluZyBtZXNzYWdlKSB7CisJCXRyYWNlKHQsIG1lc3NhZ2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVycm9yKFRocm93YWJsZSB0LCBTdHJpbmcgbWVzc2FnZSkgeworCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGVOYW1lLCBtZXNzYWdlLCB0KSk7CisJfQorCisJLyoqCisJICogQ29waWVkIGZyb20gUGxhdGZvcm1Mb2dXcml0ZXIgaW4gY29yZSBydW50aW1lLgorCSAqLworCXByaXZhdGUgc3RhdGljIEZyYW1ld29ya0xvZ0VudHJ5IGdldExvZyhJU3RhdHVzIHN0YXR1cykgeworCQlUaHJvd2FibGUgdCA9IHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKKwkJQXJyYXlMaXN0PEZyYW1ld29ya0xvZ0VudHJ5PiBjaGlsZGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlpbnQgc3RhY2tDb2RlID0gdCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24gPyAxIDogMDsKKwkJLy8gZW5zdXJlIGEgc3Vic3RhdHVzIGluc2lkZSBhIENvcmVFeGNlcHRpb24gaXMgcHJvcGVybHkgbG9nZ2VkCisJCWlmIChzdGFja0NvZGUgPT0gMSkgeworCQkJSVN0YXR1cyBjb3JlU3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKTsKKwkJCWlmIChjb3JlU3RhdHVzICE9IG51bGwpIHsKKwkJCQljaGlsZGxpc3QuYWRkKGdldExvZyhjb3JlU3RhdHVzKSk7CisJCQl9CisJCX0KKworCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgeworCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJY2hpbGRsaXN0LmFkZChnZXRMb2coY2hpbGRyZW5baV0pKTsKKwkJCX0KKwkJfQorCisJCUZyYW1ld29ya0xvZ0VudHJ5W10gY2hpbGRyZW4gPSBjaGlsZGxpc3Quc2l6ZSgpID09IDAgPyBudWxsCisJCQkJOiBjaGlsZGxpc3QudG9BcnJheShuZXcgRnJhbWV3b3JrTG9nRW50cnlbY2hpbGRsaXN0LnNpemUoKV0pOworCisJCXJldHVybiBuZXcgRnJhbWV3b3JrTG9nRW50cnkoc3RhdHVzLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgc3RhdHVzLmdldENvZGUoKSwKKwkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGFja0NvZGUsIHQsIGNoaWxkcmVuKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbmZvKFRocm93YWJsZSB0LCBTdHJpbmcgbWVzc2FnZSkgeworCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIGJ1bmRsZU5hbWUsIG1lc3NhZ2UsIHQpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRXJyb3JFbmFibGVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKKwkJaWYgKGxvZyAhPSBudWxsKSB7CisJCQlsb2cubG9nKGdldExvZyhzdGF0dXMpKTsKKwkJfSBlbHNlIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJCWlmIChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKKwkJCQlzdGF0dXMuZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBkZWJ1ZyBvcHRpb25zIHNlcnZpY2UgZm9yIHRoaXMgbG9nZ2VyLgorCSAqCisJICogQHBhcmFtIG9wdGlvbnMKKwkgKiAgICAgICAgICAgIFRoZSBkZWJ1ZyBvcHRpb25zIHRvIGJlIHVzZWQgYnkgdGhpcyBsb2dnZXIKKwkgKi8KKwlASW5qZWN0CisJcHVibGljIHZvaWQgc2V0RGVidWdPcHRpb25zKERlYnVnT3B0aW9ucyBvcHRpb25zKSB7CisJCWlmIChvcHRpb25zICE9IG51bGwpIHsKKwkJCXRoaXMudHJhY2UgPSBvcHRpb25zLm5ld0RlYnVnVHJhY2UoYnVuZGxlTmFtZSwgV29ya2JlbmNoTG9nZ2VyLmNsYXNzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBsb2cKKwkgKi8KKwlASW5qZWN0CisJcHVibGljIHZvaWQgc2V0RnJhbWV3b3JrTG9nKEZyYW1ld29ya0xvZyBsb2cpIHsKKwkJdGhpcy5sb2cgPSBsb2c7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJhY2UoVGhyb3dhYmxlIHQsIFN0cmluZyBtZXNzYWdlKSB7CisJCWlmICh0cmFjZSAhPSBudWxsKSB7CisJCQl0cmFjZS50cmFjZShudWxsLCBtZXNzYWdlLCB0KTsKKwkJfSBlbHNlIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKwkJCWlmICh0ICE9IG51bGwpCisJCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHdhcm4oVGhyb3dhYmxlIHQsIFN0cmluZyBtZXNzYWdlKSB7CisJCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgYnVuZGxlTmFtZSwgbWVzc2FnZSwgdCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL1hNTE1vZGVsUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9YTUxNb2RlbFJlY29uY2lsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2YyODg4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9YTUxNb2RlbFJlY29uY2lsZXIuamF2YQpAQCAtMCwwICsxLDE5OTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQWRkb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NQmluZGluZ1RhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmNvbW1hbmRzLk1CaW5kaW5nVGFibGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUNvbW1hbmRQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUhhbmRsZXJDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUtleUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLk1QYXJ0RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLk1QYXJ0RGVzY3JpcHRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5TaWRlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltbWVkV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuaW1wbC5VaVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuSXRlbVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NSGFuZGxlZEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1NZW51Q29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTU1lbnVDb250cmlidXRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5NVG9vbEJhckNvbnRyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyQ29udHJpYnV0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1UcmltQ29udHJpYnV0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRyaW1Db250cmlidXRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuaW1wbC5NZW51UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLklEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuTW9kZWxSZWNvbmNpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UuQ2hhbmdlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZS5GZWF0dXJlQ2hhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UudXRpbC5DaGFuZ2VSZWNvcmRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBYTUxNb2RlbFJlY29uY2lsZXIgZXh0ZW5kcyBNb2RlbFJlY29uY2lsZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSUlEX0FUVE5BTUUgPSAieG1pSWQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX0VMRU1FTlRfTkFNRSA9ICJyZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMUkVGRVJFTkNFX0VMRU1FTlRfTkFNRSA9ICJvcmlnaW5hbFJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUTkFNRSA9ICJlNG5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX0NPTlRSSUJVVElPTl9VUklfUFJFRklYID0gInBsYXRmb3JtOi9wbHVnaW4vIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09OVFJJQlVUSU9OX1VSSV9QUkVGSVggPSAiYnVuZGxlY2xhc3M6Ly8iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHRoZSBtb2RlbCBkZWx0YXMgaW4gWE1MIGZvcm0gKHZhbHVlIGlzCisJICogPGNvZGU+Y2hhbmdlczwvY29kZT4pLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VTX0VMRU1FTlRfTkFNRSA9ICJjaGFuZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGRlc2NyaWJlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWwgZGVsdGFzICh2YWx1ZSBpcworCSAqIDxjb2RlPnZlcnNpb248L2NvZGU+KS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9BVFROQU1FID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgdmVyc2lvbiBvZiB0aGUgbW9kZWwgZGVsdGFzLgorCSAqCisJICogPHVsPgorCSAqIDxsaT4xLjEgLSBpbnRyb2R1Y2VkIGRpcmVjdCByZWZlcmVuY2VzIHRvIGJpbmRpbmcgY29udGV4dHMgaW5zdGVhZCBvZiB1c2luZyBzdHJpbmcgaWRzIChzZWUKKwkgKiBidWcgMzIwMTcxIGFuZCBidWcgMzM4NDQ0KTwvbGk+CisJICogPGxpPjEuMCAobm8gY2hhbmdlKSAtIHRoZSBtb2RlbCB3YXMgdXBkYXRlZCB3aXRoIE1BcmVhLCBjb2RlIHdhcyBpbnNlcnRlZCB0byBoYW5kbGUgdGhpcyBjYXNlCisJICogc28gdGhlIHZlcnNpb24gbnVtYmVyIHdhcyBub3QgYWN0dWFsbHkgaW5jcmVhc2VkIChzZWUgYnVnIDMyODM4OCk8L2xpPgorCSAqIDxsaT4xLjAgLSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBtb2RlbCB0aGF0IHdlbnQgb3V0IGZvciA0LjA8L2xpPgorCSAqIDwvdWw+CisJICovCisJLy8gYSBuZXcgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIGJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2FudCB0aGUgdmFsdWUgdG8gYmUgaW5saW5lZAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX05VTUJFUiA9IG5ldyBTdHJpbmcoIjEuMSIpOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBbiBhdHRyaWJ1dGUgZm9yIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpbiBxdWVzdGlvbiAodmFsdWUgaXMgPGNvZGU+dHlwZTwvY29kZT4pLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVE5BTUUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNFVF9BVFROQU1FID0gInVuc2V0IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNFVF9BVFRWQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUllfQVRUVkFMVUVfS0VZID0gImtleSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUllfQVRUVkFMVUVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIENoYW5nZVJlY29yZGVyIGNoYW5nZVJlY29yZGVyOworCisJcHJpdmF0ZSBDaGFuZ2VEZXNjcmlwdGlvbiBjaGFuZ2VEZXNjcmlwdGlvbjsKKworCXByaXZhdGUgRU9iamVjdCByb290T2JqZWN0OworCisJLyoqCisJICogQSBtYXAgb2YgYWxsIHRoZSBvYmplY3RzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRlZmluZWQgaW4gdGhlIG1vZGVsLgorCSAqLworCXByaXZhdGUgV2Vha0hhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4gb3JpZ2luYWxPYmplY3RzID0gbmV3IFdlYWtIYXNoTWFwPEVPYmplY3QsIEVPYmplY3Q+KCk7CisKKwkvKioKKwkgKiBSZWNvcmRzIGFsbCBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgb3JpZ2luYWwgbW9kZWwgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZWxlbWVudAorCSAqIHdhcyBvcmlnaW5hbGx5IGEgcGFydCBvZiB0aGUgZGVmaW5lZCBtb2RlbCBvciBub3QuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlY29yZCgpIHsKKwkJb3JpZ2luYWxPYmplY3RzLmNsZWFyKCk7CisJCW9yaWdpbmFsT2JqZWN0cy5wdXQocm9vdE9iamVjdCwgbnVsbCk7CisJCUl0ZXJhdG9yPEVPYmplY3Q+IGl0ID0gcm9vdE9iamVjdC5lQWxsQ29udGVudHMoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJRU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7CisJCQlvcmlnaW5hbE9iamVjdHMucHV0KG9iamVjdCwgbnVsbCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZWNvcmRDaGFuZ2VzKE9iamVjdCBvYmplY3QpIHsKKwkJQXNzZXJ0LmlzTm90TnVsbChvYmplY3QpOworCQlyb290T2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKKwkJY2hhbmdlUmVjb3JkZXIgPSBuZXcgQ2hhbmdlUmVjb3JkZXIocm9vdE9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZWNvcmQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVPYmplY3QgZU9iamVjdCkgeworCQkJCXJldHVybiAhZmVhdHVyZS5pc1RyYW5zaWVudCgpICYmIHN1cGVyLnNob3VsZFJlY29yZChmZWF0dXJlLCBlT2JqZWN0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZWNvcmQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVSZWZlcmVuY2UgY29udGFpbm1lbnQsCisJCQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIEVPYmplY3QgZU9iamVjdCkgeworCQkJCXJldHVybiAhZmVhdHVyZS5pc1RyYW5zaWVudCgpCisJCQkJCQkmJiBzdXBlci5zaG91bGRSZWNvcmQoZmVhdHVyZSwgY29udGFpbm1lbnQsIG5vdGlmaWNhdGlvbiwgZU9iamVjdCk7CisJCQl9CisJCX07CisJCWNoYW5nZURlc2NyaXB0aW9uID0gbnVsbDsKKwkJcmVjb3JkKCk7CisJfQorCisJc3RhdGljIExpc3Q8T2JqZWN0PiBnZXRSZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKKwkJSXRlcmF0b3I8RU9iamVjdD4gaXQgPSAoKEVPYmplY3QpIG9iamVjdCkuZUFsbENvbnRlbnRzKCk7CisJCUxpc3Q8T2JqZWN0PiByZWZlcmVuY2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlPYmplY3QgcmVmZXJlbmNlID0gaXQubmV4dCgpOworCQkJcmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlKTsKKwkJfQorCQlyZXR1cm4gcmVmZXJlbmNlczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBjb25zdHJ1Y3REZWx0YXMoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHNlcmlhbGl6ZWRTdGF0ZSkgeworCQlyb290T2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKKwkJTGlzdDxPYmplY3Q+IHJlZmVyZW5jZXMgPSBnZXRSZWZlcmVuY2VzKHJvb3RPYmplY3QpOworCisJCURvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KSBzZXJpYWxpemVkU3RhdGU7CisKKwkJQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBkZWx0YXMgPSBuZXcgTGlua2VkTGlzdDxNb2RlbERlbHRhPigpOworCisJCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJU3RyaW5nIHZlcnNpb24gPSByb290RWxlbWVudC5nZXRBdHRyaWJ1dGUoVkVSU0lPTl9BVFROQU1FKTsKKwkJdHJ5IHsKKwkJCWlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi5sZW5ndGgoKSA9PSAwCisJCQkJCXx8IERvdWJsZS5wYXJzZURvdWJsZSh2ZXJzaW9uKSA8IERvdWJsZS5wYXJzZURvdWJsZShWRVJTSU9OX05VTUJFUikpIHsKKwkJCQlyZXR1cm4gZGVsdGFzOworCQkJfQorCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJLy8gc29tZSBjb3JydXB0IHZlcnNpb25pbmcsIGlnbm9yZSB0aGlzIGRlbHRhcyBmaWxlCisJCQlyZXR1cm4gZGVsdGFzOworCQl9CisKKwkJTm9kZUxpc3Qgcm9vdE5vZGVMaXN0ID0gKE5vZGVMaXN0KSByb290RWxlbWVudDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290Tm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBub2RlID0gcm9vdE5vZGVMaXN0Lml0ZW0oaSk7CisJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKwkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKKwkJCQljb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCByb290T2JqZWN0LCBlbGVtZW50LAorCQkJCQkJZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVBQTElDQVRJT05FTEVNRU5UX0VMRU1FTlRJRF9BVFROQU1FKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZGVsdGFzOworCX0KKworCXByaXZhdGUgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZShFT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisJCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIHNmIDogb2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSkgeworCQkJaWYgKHNmLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7CisJCQkJcmV0dXJuIHNmOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgT2JqZWN0IGdldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgZmVhdHVyZVZhbHVlKSB7CisJCUNsYXNzPD8+IGluc3RhbmNlQ2xhc3MgPSBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpOworCQlpZiAoaW5zdGFuY2VDbGFzcyA9PSBTdHJpbmcuY2xhc3MpIHsKKwkJCXJldHVybiBmZWF0dXJlVmFsdWU7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2VDbGFzcyA9PSBpbnQuY2xhc3MpIHsKKwkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZmVhdHVyZVZhbHVlKTsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZUNsYXNzID09IGJvb2xlYW4uY2xhc3MpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZmVhdHVyZVZhbHVlKTsKKwkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVpUGFja2FnZUltcGwuZUlOU1RBTkNFLmdldEdlbmVyaWNUcmltQ29udGFpbmVyX1NpZGUoKSkgeworCQkJcmV0dXJuIFNpZGVWYWx1ZS5nZXRCeU5hbWUoZmVhdHVyZVZhbHVlKTsKKwkJfSBlbHNlIGlmIChmZWF0dXJlID09IE1lbnVQYWNrYWdlSW1wbC5lSU5TVEFOQ0UuZ2V0SXRlbV9UeXBlKCkpIHsKKwkJCXJldHVybiBJdGVtVHlwZS5nZXRCeU5hbWUoZmVhdHVyZVZhbHVlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlzdGF0aWMgT2JqZWN0IGZpbmRSZWZlcmVuY2UoTGlzdDxPYmplY3Q+IHJlZmVyZW5jZXMsIFN0cmluZyBpZCkgeworCQlmb3IgKE9iamVjdCByZWZlcmVuY2UgOiByZWZlcmVuY2VzKSB7CisJCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uRWxlbWVudCAmJiBnZXRMb2NhbElkKHJlZmVyZW5jZSkuZXF1YWxzKGlkKSkgeworCQkJCXJldHVybiByZWZlcmVuY2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29uc3RydWN0RGVsdGFzKENvbGxlY3Rpb248TW9kZWxEZWx0YT4gZGVsdGFzLCBMaXN0PE9iamVjdD4gcmVmZXJlbmNlcywKKwkJCUVPYmplY3Qgb2JqZWN0LCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBpZCkgeworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTUFwcGxpY2F0aW9uRWxlbWVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBNS2V5QmluZGluZykgeworCQkJaWYgKGdldExvY2FsSWQob2JqZWN0KS5lcXVhbHMoaWQpKSB7CisJCQkJY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgb2JqZWN0LCBlbGVtZW50KTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNRWxlbWVudENvbnRhaW5lcjw/PikgeworCQkJZm9yIChPYmplY3QgY2hpbGQgOiAoKE1FbGVtZW50Q29udGFpbmVyPD8+KSBvYmplY3QpLmdldENoaWxkcmVuKCkpIHsKKwkJCQlpZiAoY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgKEVPYmplY3QpIGNoaWxkLCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1QZXJzcGVjdGl2ZSkgeworCQkJZm9yIChNV2luZG93IHdpbmRvdyA6ICgoTVBlcnNwZWN0aXZlKSBvYmplY3QpLmdldFdpbmRvd3MoKSkgeworCQkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgd2luZG93LCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1CaW5kaW5nVGFibGVDb250YWluZXIpIHsKKwkJCWZvciAoTUJpbmRpbmdUYWJsZSBiaW5kaW5nVGFibGUgOiAoKE1CaW5kaW5nVGFibGVDb250YWluZXIpIG9iamVjdCkuZ2V0QmluZGluZ1RhYmxlcygpKSB7CisJCQkJaWYgKGNvbnN0cnVjdERlbHRhcyhkZWx0YXMsIHJlZmVyZW5jZXMsIChFT2JqZWN0KSBiaW5kaW5nVGFibGUsIGVsZW1lbnQsIGlkKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTUJpbmRpbmdUYWJsZSkgeworCQkJZm9yIChNS2V5QmluZGluZyBrZXlCaW5kaW5nIDogKChNQmluZGluZ1RhYmxlKSBvYmplY3QpLmdldEJpbmRpbmdzKCkpIHsKKwkJCQlpZiAoY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgKEVPYmplY3QpIGtleUJpbmRpbmcsIGVsZW1lbnQsIGlkKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTUhhbmRsZXJDb250YWluZXIpIHsKKwkJCWZvciAoTUhhbmRsZXIgaGFuZGxlciA6ICgoTUhhbmRsZXJDb250YWluZXIpIG9iamVjdCkuZ2V0SGFuZGxlcnMoKSkgeworCQkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgaGFuZGxlciwgZWxlbWVudCwgaWQpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCWZvciAoTUNvbW1hbmQgY29tbWFuZCA6ICgoTUFwcGxpY2F0aW9uKSBvYmplY3QpLmdldENvbW1hbmRzKCkpIHsKKwkJCQlpZiAoY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgKEVPYmplY3QpIGNvbW1hbmQsIGVsZW1lbnQsIGlkKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoTUFkZG9uIGFkZG9uIDogKChNQXBwbGljYXRpb24pIG9iamVjdCkuZ2V0QWRkb25zKCkpIHsKKwkJCQlpZiAoY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgKEVPYmplY3QpIGFkZG9uLCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1QYXJ0RGVzY3JpcHRvckNvbnRhaW5lcikgeworCQkJZm9yIChNUGFydERlc2NyaXB0b3IgZGVzY3JpcHRvciA6ICgoTVBhcnREZXNjcmlwdG9yQ29udGFpbmVyKSBvYmplY3QpLmdldERlc2NyaXB0b3JzKCkpIHsKKwkJCQlpZiAoY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgKEVPYmplY3QpIGRlc2NyaXB0b3IsIGVsZW1lbnQsIGlkKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCU1QYXJ0IHBhcnQgPSAoTVBhcnQpIG9iamVjdDsKKworCQkJZm9yIChNTWVudSBtZW51IDogcGFydC5nZXRNZW51cygpKSB7CisJCQkJaWYgKGNvbnN0cnVjdERlbHRhcyhkZWx0YXMsIHJlZmVyZW5jZXMsIChFT2JqZWN0KSBtZW51LCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCisJCQlNVG9vbEJhciB0b29sQmFyID0gcGFydC5nZXRUb29sYmFyKCk7CisJCQlpZiAodG9vbEJhciAhPSBudWxsKSB7CisJCQkJaWYgKGNvbnN0cnVjdERlbHRhcyhkZWx0YXMsIHJlZmVyZW5jZXMsIChFT2JqZWN0KSB0b29sQmFyLCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1NZW51Q29udHJpYnV0aW9ucykgeworCQkJZm9yIChNTWVudUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gOiAoKE1NZW51Q29udHJpYnV0aW9ucykgb2JqZWN0KQorCQkJCQkuZ2V0TWVudUNvbnRyaWJ1dGlvbnMoKSkgeworCQkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgY29udHJpYnV0aW9uLCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1Ub29sQmFyQ29udHJpYnV0aW9ucykgeworCQkJZm9yIChNVG9vbEJhckNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gOiAoKE1Ub29sQmFyQ29udHJpYnV0aW9ucykgb2JqZWN0KQorCQkJCQkuZ2V0VG9vbEJhckNvbnRyaWJ1dGlvbnMoKSkgeworCQkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgY29udHJpYnV0aW9uLCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1UcmltQ29udHJpYnV0aW9ucykgeworCQkJZm9yIChNVHJpbUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gOiAoKE1UcmltQ29udHJpYnV0aW9ucykgb2JqZWN0KQorCQkJCQkuZ2V0VHJpbUNvbnRyaWJ1dGlvbnMoKSkgeworCQkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgY29udHJpYnV0aW9uLCBlbGVtZW50LCBpZCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCU1XaW5kb3cgd2luZG93ID0gKE1XaW5kb3cpIG9iamVjdDsKKwkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgd2luZG93LmdldE1haW5NZW51KCksIGVsZW1lbnQsIGlkKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTVRyaW1tZWRXaW5kb3cpIHsKKwkJCQlNVHJpbW1lZFdpbmRvdyB0cmltbWVkV2luZG93ID0gKE1UcmltbWVkV2luZG93KSBvYmplY3Q7CisJCQkJZm9yIChNVHJpbUJhciB0cmltQmFyIDogdHJpbW1lZFdpbmRvdy5nZXRUcmltQmFycygpKSB7CisJCQkJCWlmIChjb25zdHJ1Y3REZWx0YXMoZGVsdGFzLCByZWZlcmVuY2VzLCAoRU9iamVjdCkgdHJpbUJhciwgZWxlbWVudCwgaWQpKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNSGFuZGxlZEl0ZW0pIHsKKwkJCWZvciAoTVBhcmFtZXRlciBwYXJhbWV0ZXIgOiAoKE1IYW5kbGVkSXRlbSkgb2JqZWN0KS5nZXRQYXJhbWV0ZXJzKCkpIHsKKwkJCQlpZiAoY29uc3RydWN0RGVsdGFzKGRlbHRhcywgcmVmZXJlbmNlcywgKEVPYmplY3QpIHBhcmFtZXRlciwgZWxlbWVudCwgaWQpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29uc3RydWN0RGVsdGFzKENvbGxlY3Rpb248TW9kZWxEZWx0YT4gZGVsdGFzLCBMaXN0PE9iamVjdD4gcmVmZXJlbmNlcywKKwkJCUVPYmplY3Qgb2JqZWN0LCBFbGVtZW50IGVsZW1lbnQpIHsKKwkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOworCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENPTlRFWFRfUFJPUEVSVElFU19BVFROQU1FKSkgeworCQkJY29uc3RydWN0RW50cnlEZWx0YShkZWx0YXMsIFVpUGFja2FnZUltcGwuZUlOU1RBTkNFLmdldENvbnRleHRfUHJvcGVydGllcygpLCBvYmplY3QsCisJCQkJCWVsZW1lbnQpOworCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUFBMSUNBVElPTkVMRU1FTlRfUEVSU0lTVEVEU1RBVEVfQVRUTkFNRSkpIHsKKwkJCWNvbnN0cnVjdEVudHJ5RGVsdGEoZGVsdGFzLAorCQkJCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkVsZW1lbnRfUGVyc2lzdGVkU3RhdGUoKSwKKwkJCQkJb2JqZWN0LCBlbGVtZW50KTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0cnVjdE9iamVjdERlbHRhcyhkZWx0YXMsIHJlZmVyZW5jZXMsIG9iamVjdCwgZWxlbWVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29uc3RydWN0RW50cnlEZWx0YShDb2xsZWN0aW9uPE1vZGVsRGVsdGE+IGRlbHRhcywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCisJCQlFT2JqZWN0IG9iamVjdCwgRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShVTlNFVF9BVFROQU1FKS5lcXVhbHMoVU5TRVRfQVRUVkFMVUVfVFJVRSkpIHsKKwkJCUVNRkRlbHRhRW50cnlTZXQgZGVsdGEgPSBuZXcgRU1GRGVsdGFFbnRyeVNldChvYmplY3QsIGZlYXR1cmUsCisJCQkJCWVsZW1lbnQuZ2V0QXR0cmlidXRlKEVOVFJZX0FUVFZBTFVFX0tFWSksIG51bGwpOworCQkJZGVsdGFzLmFkZChkZWx0YSk7CisJCX0gZWxzZSB7CisJCQlFTUZEZWx0YUVudHJ5U2V0IGRlbHRhID0gbmV3IEVNRkRlbHRhRW50cnlTZXQob2JqZWN0LCBmZWF0dXJlLAorCQkJCQllbGVtZW50LmdldEF0dHJpYnV0ZShFTlRSWV9BVFRWQUxVRV9LRVkpLAorCQkJCQllbGVtZW50LmdldEF0dHJpYnV0ZShFTlRSWV9BVFRWQUxVRV9WQUxVRSkpOworCQkJZGVsdGFzLmFkZChkZWx0YSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29uc3RydWN0T2JqZWN0RGVsdGFzKENvbGxlY3Rpb248TW9kZWxEZWx0YT4gZGVsdGFzLCBMaXN0PE9iamVjdD4gcmVmZXJlbmNlcywKKwkJCUVPYmplY3Qgb2JqZWN0LCBFbGVtZW50IGVsZW1lbnQpIHsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSAoTm9kZUxpc3QpIGVsZW1lbnQ7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKKwkJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlFbGVtZW50IGlubmVyRWxlbWVudCA9IChFbGVtZW50KSBub2RlOworCQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gaW5uZXJFbGVtZW50LmdldE5vZGVOYW1lKCk7CisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldFN0cnVjdHVyYWxGZWF0dXJlKG9iamVjdCwgZmVhdHVyZU5hbWUpOworCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgeworCQkJCWlmIChpc0NoYWluZWRSZWZlcmVuY2UoZmVhdHVyZU5hbWUpKSB7CisJCQkJCU1vZGVsRGVsdGEgZGVsdGEgPSBjcmVhdGVNdWx0aVJlZmVyZW5jZURlbHRhKGRlbHRhcywgcmVmZXJlbmNlcywgb2JqZWN0LAorCQkJCQkJCWZlYXR1cmUsIGlubmVyRWxlbWVudCk7CisJCQkJCWRlbHRhcy5hZGQoZGVsdGEpOworCQkJCX0gZWxzZSBpZiAoaXNVbnNldChpbm5lckVsZW1lbnQpKSB7CisJCQkJCU1vZGVsRGVsdGEgZGVsdGEgPSBuZXcgRU1GTW9kZWxEZWx0YVVuc2V0KG9iamVjdCwgZmVhdHVyZSk7CisJCQkJCWRlbHRhcy5hZGQoZGVsdGEpOworCQkJCX0gZWxzZSBpZiAoaXNEaXJlY3RSZWZlcmVuY2UoZmVhdHVyZU5hbWUpKSB7CisJCQkJCU1vZGVsRGVsdGEgZGVsdGEgPSBjcmVhdGVEaXJlY3RSZWZlcmVuY2VEZWx0YShkZWx0YXMsIHJlZmVyZW5jZXMsIG9iamVjdCwKKwkJCQkJCQlmZWF0dXJlLCBpbm5lckVsZW1lbnQpOworCQkJCQlkZWx0YXMuYWRkKGRlbHRhKTsKKwkJCQl9IGVsc2UgaWYgKGlzSW5kaXJlY3RSZWZlcmVuY2UoZmVhdHVyZU5hbWUpKSB7CisJCQkJCU1vZGVsRGVsdGEgZGVsdGEgPSBjcmVhdGVJbmRpcmVjdFJlZmVyZW5jZURlbHRhKHJlZmVyZW5jZXMsIG9iamVjdCwgZmVhdHVyZSwKKwkJCQkJCQlpbm5lckVsZW1lbnQpOworCQkJCQlkZWx0YXMuYWRkKGRlbHRhKTsKKwkJCQl9IGVsc2UgaWYgKGlzVW5vcmRlcmVkQ2hhaW5lZEF0dHJpYnV0ZShmZWF0dXJlTmFtZSkpIHsKKwkJCQkJTW9kZWxEZWx0YSBkZWx0YSA9IGNyZWF0ZVVub3JkZXJlZENoYWluZWRBdHRyaWJ1dGVEZWx0YShvYmplY3QsIGZlYXR1cmUsCisJCQkJCQkJaW5uZXJFbGVtZW50LCBmZWF0dXJlTmFtZSk7CisJCQkJCWRlbHRhcy5hZGQoZGVsdGEpOworCQkJCX0gZWxzZSBpZiAoaXNTdHJpbmdUb1N0cmluZ01hcChmZWF0dXJlTmFtZSkpIHsKKwkJCQkJTW9kZWxEZWx0YSBkZWx0YSA9IGNyZWF0ZU1hcERlbHRhKG9iamVjdCwgaW5uZXJFbGVtZW50LCBmZWF0dXJlKTsKKwkJCQkJZGVsdGFzLmFkZChkZWx0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJTW9kZWxEZWx0YSBkZWx0YSA9IGNyZWF0ZUF0dHJpYnV0ZURlbHRhKG9iamVjdCwgZmVhdHVyZSwgaW5uZXJFbGVtZW50LAorCQkJCQkJCWZlYXR1cmVOYW1lKTsKKwkJCQkJZGVsdGFzLmFkZChkZWx0YSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBNb2RlbERlbHRhIGNyZWF0ZURpcmVjdFJlZmVyZW5jZURlbHRhKENvbGxlY3Rpb248TW9kZWxEZWx0YT4gZGVsdGFzLAorCQkJTGlzdDxPYmplY3Q+IHJlZmVyZW5jZXMsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnQgbm9kZSkgeworCQlOb2RlTGlzdCByZWZlcmVuY2VkSWRzID0gKE5vZGVMaXN0KSBub2RlOworCQlFbGVtZW50IHJlZmVyZW5jZSA9IGdldEZpcnN0RWxlbWVudChyZWZlcmVuY2VkSWRzKTsKKwkJU3RyaW5nIHJlZmVyZW5jZUlkID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZShBUFBMSUNBVElPTkVMRU1FTlRfRUxFTUVOVElEX0FUVE5BTUUpOworCisJCU9iamVjdCBtYXRjaCA9IGZpbmRSZWZlcmVuY2UocmVmZXJlbmNlcywgcmVmZXJlbmNlSWQpOworCQlpZiAobWF0Y2ggPT0gbnVsbCkgeworCQkJLy8gY291bGRuJ3QgZmluZCBhIHJlZmVyZW5jZSwgbXVzdCBiZSBhIG5ldyBvYmplY3QKKwkJCW1hdGNoID0gY3JlYXRlT2JqZWN0KGRlbHRhcywgcmVmZXJlbmNlLCByZWZlcmVuY2VzKTsKKwkJfQorCisJCXJldHVybiBuZXcgRU1GTW9kZWxEZWx0YVNldChlT2JqZWN0LCBmZWF0dXJlLCBtYXRjaCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBnZXRGaXJzdEVsZW1lbnQoTm9kZUxpc3QgbGlzdCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBpdGVtID0gbGlzdC5pdGVtKGkpOworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQkJcmV0dXJuIChFbGVtZW50KSBpdGVtOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgTW9kZWxEZWx0YSBjcmVhdGVJbmRpcmVjdFJlZmVyZW5jZURlbHRhKExpc3Q8T2JqZWN0PiByZWZlcmVuY2VzLCBFT2JqZWN0IGVPYmplY3QsCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudCBub2RlKSB7CisJCU5vZGVMaXN0IHJlZmVyZW5jZWRJZHMgPSAoTm9kZUxpc3QpIG5vZGU7CisKKwkJRWxlbWVudCByZWZlcmVuY2UgPSBnZXRGaXJzdEVsZW1lbnQocmVmZXJlbmNlZElkcyk7CisJCVN0cmluZyByZWZlcmVuY2VJZCA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoQVBQTElDQVRJT05FTEVNRU5UX0VMRU1FTlRJRF9BVFROQU1FKTsKKworCQlPYmplY3QgbWF0Y2ggPSBmaW5kUmVmZXJlbmNlKHJlZmVyZW5jZXMsIHJlZmVyZW5jZUlkKTsKKwkJaWYgKG1hdGNoID09IG51bGwpIHsKKwkJCXJldHVybiBjcmVhdGVEZWxheWVkRGVsdGEoZU9iamVjdCwgZmVhdHVyZSwgcmVmZXJlbmNlKTsKKwkJfQorCisJCXJldHVybiBuZXcgRU1GTW9kZWxEZWx0YVNldChlT2JqZWN0LCBmZWF0dXJlLCBtYXRjaCk7CisJfQorCisJcHJpdmF0ZSBNb2RlbERlbHRhIGNyZWF0ZU1hcERlbHRhKEVPYmplY3Qgb2JqZWN0LCBFbGVtZW50IGlubmVyRWxlbWVudCwKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZGVsdGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJTm9kZUxpc3QgYXR0cmlidXRlcyA9IChOb2RlTGlzdCkgaW5uZXJFbGVtZW50OworCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGorKykgeworCQkJTm9kZSBlbnRyeSA9IGF0dHJpYnV0ZXMuaXRlbShqKTsKKwkJCWlmIChlbnRyeSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKwkJCQlFbGVtZW50IGtleVZhbHVlID0gKEVsZW1lbnQpIGVudHJ5OworCQkJCVN0cmluZyBrZXkgPSBrZXlWYWx1ZS5nZXRBdHRyaWJ1dGUoRU5UUllfQVRUVkFMVUVfS0VZKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBrZXlWYWx1ZS5nZXRBdHRyaWJ1dGUoRU5UUllfQVRUVkFMVUVfVkFMVUUpOworCQkJCWRlbHRhTWFwLnB1dChrZXksIHZhbHVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV3IEVNRkRlbHRhTWFwU2V0KG9iamVjdCwgZmVhdHVyZSwgZGVsdGFNYXApOworCX0KKworCXByaXZhdGUgTW9kZWxEZWx0YSBjcmVhdGVEZWxheWVkRGVsdGEoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAorCQkJRWxlbWVudCBlbGVtZW50KSB7CisJCVN0cmluZyByZWZlcmVuY2VJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhNSUlEX0FUVE5BTUUpOworCQlyZXR1cm4gbmV3IEVNRk1vZGVsRGVsdGFEZWxheWVkU2V0KG9iamVjdCwgZmVhdHVyZSwgcm9vdE9iamVjdCwgcmVmZXJlbmNlSWQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDw/PiB0aHJlZVdheU1lcmdlKExpc3Q8Pz4gb3JpZ2luYWxSZWZlcmVuY2VzLCBMaXN0PD8+IHVzZXJSZWZlcmVuY2VzLAorCQkJTGlzdDw/PiBjdXJyZW50UmVmZXJlbmNlcykgeworCQlpbnQgdXNlclNpemUgPSB1c2VyUmVmZXJlbmNlcy5zaXplKCk7CisJCWludCBvcmlnaW5hbFNpemUgPSBvcmlnaW5hbFJlZmVyZW5jZXMuc2l6ZSgpOworCisJCWlmICh1c2VyU2l6ZSA9PSAwKSB7CisJCQkvLyB0aGUgdXNlciByZW1vdmVkIGFsbCB0aGUgb3JpZ2luYWwgcGFydHMKKwkJCUxpc3Q8T2JqZWN0PiBjb2xsZWN0ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGN1cnJlbnRSZWZlcmVuY2VzKTsKKwkJCWNvbGxlY3RlZFJlZmVyZW5jZXMucmVtb3ZlQWxsKG9yaWdpbmFsUmVmZXJlbmNlcyk7CisJCQlyZXR1cm4gY29sbGVjdGVkUmVmZXJlbmNlczsKKwkJfSBlbHNlIGlmIChvcmlnaW5hbFNpemUgPT0gMCkgeworCQkJTGlzdDxPYmplY3Q+IGNvbGxlY3RlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4odXNlclJlZmVyZW5jZXMpOworCQkJY29sbGVjdGVkUmVmZXJlbmNlcy5hZGRBbGwoY3VycmVudFJlZmVyZW5jZXMpOworCQkJcmV0dXJuIGNvbGxlY3RlZFJlZmVyZW5jZXM7CisJCX0gZWxzZSBpZiAoY3VycmVudFJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7CisJCQkvLyBjdXJyZW50bHkgbm90IHJlZmVyZW5jaW5nIGFueXRoaW5nLCBzbyBqdXN0IHJldHVybiB3aGF0IHRoZSB1c2VyIGhhZCBleGFjdGx5CisJCQlyZXR1cm4gdXNlclJlZmVyZW5jZXM7CisJCX0gZWxzZSBpZiAoY3VycmVudFJlZmVyZW5jZXMuc2l6ZSgpID09IG9yaWdpbmFsU2l6ZQorCQkJCSYmIGN1cnJlbnRSZWZlcmVuY2VzLmNvbnRhaW5zQWxsKG9yaWdpbmFsUmVmZXJlbmNlcykpIHsKKwkJCS8vIHNpbmNlIGJvdGggdmVyc2lvbnMgY29udGFpbiB0aGUgc2FtZSB0aGluZywganVzdCB1c2Ugd2hhdGV2ZXIgdGhlIHVzZXIgaGFkCisJCQlyZXR1cm4gdXNlclJlZmVyZW5jZXM7CisJCX0KKworCQlpZiAob3JpZ2luYWxSZWZlcmVuY2VzLmNvbnRhaW5zQWxsKHVzZXJSZWZlcmVuY2VzKQorCQkJCSYmICF1c2VyUmVmZXJlbmNlcy5jb250YWluc0FsbChvcmlnaW5hbFJlZmVyZW5jZXMpKSB7CisJCQlMaXN0PE9iamVjdD4gY29sbGVjdGVkUmVmZXJlbmNlczIgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4ob3JpZ2luYWxSZWZlcmVuY2VzKTsKKwkJCWNvbGxlY3RlZFJlZmVyZW5jZXMyLnJlbW92ZUFsbCh1c2VyUmVmZXJlbmNlcyk7CisKKwkJCUxpc3Q8T2JqZWN0PiBjb2xsZWN0ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGN1cnJlbnRSZWZlcmVuY2VzKTsKKwkJCWNvbGxlY3RlZFJlZmVyZW5jZXMucmVtb3ZlQWxsKGNvbGxlY3RlZFJlZmVyZW5jZXMyKTsKKworCQkJcmV0dXJuIGNvbGxlY3RlZFJlZmVyZW5jZXM7CisJCX0KKworCQlMaXN0PFBvc2l0aW9uPiBwb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFBvc2l0aW9uPigpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdXNlclJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKKwkJCU9iamVjdCB1c2VyID0gdXNlclJlZmVyZW5jZXMuZ2V0KGkpOworCisJCQlQb3NpdGlvbiBwID0gZ2V0UG9zaXRpb24ob3JpZ2luYWxSZWZlcmVuY2VzLCB1c2VyUmVmZXJlbmNlcywgY3VycmVudFJlZmVyZW5jZXMsIHVzZXIsIGkpOworCQkJaWYgKHAgIT0gbnVsbCkgeworCQkJCXBvc2l0aW9ucy5hZGQocCk7CisJCQl9CisJCX0KKworCQlMaXN0PE9iamVjdD4gY29sbGVjdGVkUmVmcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihjdXJyZW50UmVmZXJlbmNlcyk7CisKKwkJZm9yIChQb3NpdGlvbiBwb3NpdGlvbiA6IHBvc2l0aW9ucykgeworCQkJT2JqZWN0IGFmdGVyID0gcG9zaXRpb24uZ2V0QWZ0ZXIoKTsKKwkJCWlmIChhZnRlciAhPSBudWxsKSB7CisJCQkJaW50IGluZGV4ID0gY3VycmVudFJlZmVyZW5jZXMuaW5kZXhPZihhZnRlcik7CisJCQkJY29sbGVjdGVkUmVmcy5hZGQoaW5kZXggKyAxLCBwb3NpdGlvbi5nZXRPYmplY3QoKSk7CisJCQl9CisKKwkJCU9iamVjdCBiZWZvcmUgPSBwb3NpdGlvbi5nZXRCZWZvcmUoKTsKKwkJCWlmIChiZWZvcmUgIT0gbnVsbCkgeworCQkJCWludCBpbmRleCA9IGN1cnJlbnRSZWZlcmVuY2VzLmluZGV4T2YoYmVmb3JlKTsKKwkJCQljb2xsZWN0ZWRSZWZzLmFkZChpbmRleCwgcG9zaXRpb24uZ2V0T2JqZWN0KCkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGNvbGxlY3RlZFJlZnM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUG9zaXRpb24gZ2V0UG9zaXRpb24oTGlzdDw/PiBvcmlnaW5hbFJlZmVyZW5jZXMsIExpc3Q8Pz4gdXNlclJlZmVyZW5jZXMsCisJCQlMaXN0PD8+IGN1cnJlbnRSZWZlcmVuY2VzLCBPYmplY3Qgb2JqZWN0LCBpbnQgb3JpZ2luYWxJbmRleCkgeworCQlpbnQgaW5kZXggPSBvcmlnaW5hbFJlZmVyZW5jZXMuaW5kZXhPZihvYmplY3QpOworCQlpZiAoaW5kZXggPT0gLTEpIHsKKwkJCU9iamVjdCBhZnRlciA9IG51bGw7CisJCQlmb3IgKGludCBpID0gb3JpZ2luYWxJbmRleCAtIDE7IGkgPiAtMTsgaS0tKSB7CisJCQkJT2JqZWN0IGFmdGVyQ2FuZGlkYXRlID0gdXNlclJlZmVyZW5jZXMuZ2V0KGkpOworCQkJCWludCBhZnRlckluZGV4ID0gY3VycmVudFJlZmVyZW5jZXMuaW5kZXhPZihhZnRlckNhbmRpZGF0ZSk7CisJCQkJaWYgKGFmdGVySW5kZXggIT0gLTEpIHsKKwkJCQkJYWZ0ZXIgPSBhZnRlckNhbmRpZGF0ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlPYmplY3QgYmVmb3JlID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSBvcmlnaW5hbEluZGV4ICsgMTsgaSA8IHVzZXJSZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7CisJCQkJT2JqZWN0IGJlZm9yZUNhbmRpZGF0ZSA9IHVzZXJSZWZlcmVuY2VzLmdldChpKTsKKwkJCQlpbnQgYmVmb3JlSW5kZXggPSBjdXJyZW50UmVmZXJlbmNlcy5pbmRleE9mKGJlZm9yZUNhbmRpZGF0ZSk7CisJCQkJaWYgKGJlZm9yZUluZGV4ICE9IC0xKSB7CisJCQkJCWJlZm9yZSA9IGJlZm9yZUNhbmRpZGF0ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gbmV3IFBvc2l0aW9uKG9iamVjdCwgYWZ0ZXIsIGJlZm9yZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJc3RhdGljIGNsYXNzIFBvc2l0aW9uIHsKKworCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvYmplY3Q7CisJCXByaXZhdGUgZmluYWwgT2JqZWN0IGFmdGVyOworCQlwcml2YXRlIGZpbmFsIE9iamVjdCBiZWZvcmU7CisKKwkJUG9zaXRpb24oT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFmdGVyLCBPYmplY3QgYmVmb3JlKSB7CisJCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKKwkJCXRoaXMuYWZ0ZXIgPSBhZnRlcjsKKwkJCXRoaXMuYmVmb3JlID0gYmVmb3JlOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7CisJCQlyZXR1cm4gb2JqZWN0OworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRCZWZvcmUoKSB7CisJCQlyZXR1cm4gYmVmb3JlOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRBZnRlcigpIHsKKwkJCXJldHVybiBhZnRlcjsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBNb2RlbERlbHRhIGNyZWF0ZU11bHRpUmVmZXJlbmNlRGVsdGEoQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBkZWx0YXMsCisJCQlMaXN0PE9iamVjdD4gcmVmZXJlbmNlcywgRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudCBub2RlKSB7CisJCU5vZGVMaXN0IHJlZmVyZW5jZWRJZHMgPSAoTm9kZUxpc3QpIG5vZGU7CisJCUxpc3Q8T2JqZWN0PiBvcmlnaW5hbFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJTGlzdDxPYmplY3Q+IHVzZXJSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCUxpc3Q8Pz4gY3VycmVudFJlZmVyZW5jZXMgPSAoTGlzdDw/PikgZU9iamVjdC5lR2V0KGZlYXR1cmUpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZElkcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlOb2RlIGl0ZW0gPSByZWZlcmVuY2VkSWRzLml0ZW0oaSk7CisJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKwkJCQlFbGVtZW50IHJlZmVyZW5jZSA9IChFbGVtZW50KSBpdGVtOworCQkJCWlmIChpc1Vuc2V0KHJlZmVyZW5jZSkpIHsKKwkJCQkJdXNlclJlZmVyZW5jZXMuYWRkKGNyZWF0ZU9iamVjdChkZWx0YXMsIHJlZmVyZW5jZSwgcmVmZXJlbmNlcykpOworCQkJCX0gZWxzZSB7CisJCQkJCVN0cmluZyByZWZlcmVuY2VJZCA9IHJlZmVyZW5jZQorCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQVBQTElDQVRJT05FTEVNRU5UX0VMRU1FTlRJRF9BVFROQU1FKTsKKwkJCQkJT2JqZWN0IG1hdGNoID0gZmluZFJlZmVyZW5jZShyZWZlcmVuY2VzLCByZWZlcmVuY2VJZCk7CisJCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7CisJCQkJCQkvLyBkZXRlcm1pbmUgaWYgdGhpcyB3YXMgYSByZWZlcmVuY2Ugc2V0IGJ5IHRoZSB1c2VyIG9yIGEgcmVmZXJlbmNlIHRoYXQgd2FzCisJCQkJCQkvLyBvcmlnaW5hbGx5IGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uCisJCQkJCQlpZiAocmVmZXJlbmNlLmdldE5vZGVOYW1lKCkuZXF1YWxzKFJFRkVSRU5DRV9FTEVNRU5UX05BTUUpKSB7CisJCQkJCQkJdXNlclJlZmVyZW5jZXMuYWRkKG1hdGNoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJb3JpZ2luYWxSZWZlcmVuY2VzLmFkZChtYXRjaCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gbmV3IEVNRk1vZGVsRGVsdGFUaHJlZVdheURlbGF5ZWRTZXQoZU9iamVjdCwgZmVhdHVyZSwgb3JpZ2luYWxSZWZlcmVuY2VzLAorCQkJCXVzZXJSZWZlcmVuY2VzLCBjdXJyZW50UmVmZXJlbmNlcyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRU9iamVjdCBjcmVhdGVPYmplY3QoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHR5cGUpIHsKKwkJRUZhY3RvcnkgZmFjdG9yeSA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KG5hbWVzcGFjZSk7CisJCWZvciAoRUNsYXNzaWZpZXIgY2xhc3NpZmllciA6IGZhY3RvcnkuZ2V0RVBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKSkgeworCQkJaWYgKGNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCQlFQ2xhc3MgY2xzID0gKEVDbGFzcykgY2xhc3NpZmllcjsKKwkJCQlpZiAoY2xzLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisJCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZShjbHMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIE9iamVjdCBnZXRSZWZlcmVuY2UoQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBkZWx0YXMsIEVsZW1lbnQgZWxlbWVudCwKKwkJCUxpc3Q8T2JqZWN0PiByZWZlcmVuY2VzKSB7CisJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFQUExJQ0FUSU9ORUxFTUVOVF9FTEVNRU5USURfQVRUTkFNRSk7CisJCWlmICghaWQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmluZFJlZmVyZW5jZShyZWZlcmVuY2VzLCBpZCk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZU9iamVjdChkZWx0YXMsIGVsZW1lbnQsIHJlZmVyZW5jZXMpOworCX0KKworCXByaXZhdGUgT2JqZWN0IGNyZWF0ZU9iamVjdChDb2xsZWN0aW9uPE1vZGVsRGVsdGE+IGRlbHRhcywgRWxlbWVudCBlbGVtZW50LAorCQkJTGlzdDxPYmplY3Q+IHJlZmVyZW5jZXMpIHsKKwkJU3RyaW5nIHR5cGVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVFlQRV9BVFROQU1FKTsKKwkJU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKE5BTUVTUEFDRV9BVFROQU1FKTsKKworCQlFT2JqZWN0IG9iamVjdCA9IGNyZWF0ZU9iamVjdChuYW1lc3BhY2UsIHR5cGVOYW1lKTsKKwkJQ29tcG9zaXRlRGVsdGEgY29tcG9zaXRlRGVsdGEgPSBuZXcgQ29tcG9zaXRlRGVsdGEob2JqZWN0KTsKKworCQlFNFhNSVJlc291cmNlIHJlc291cmNlID0gKEU0WE1JUmVzb3VyY2UpIHJvb3RPYmplY3QuZVJlc291cmNlKCk7CisJCXJlc291cmNlLnNldEludGVybmFsSWQob2JqZWN0LCBlbGVtZW50LmdldEF0dHJpYnV0ZShYTUlJRF9BVFROQU1FKSk7CisKKwkJTm9kZUxpc3QgZWxlbWVudEF0dHJpYnV0ZXMgPSAoTm9kZUxpc3QpIGVsZW1lbnQ7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudEF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBub2RlID0gZWxlbWVudEF0dHJpYnV0ZXMuaXRlbShpKTsKKwkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgeworCQkJCUVsZW1lbnQgaXRlbSA9IChFbGVtZW50KSBub2RlOworCQkJCWlmICghaXNVbnNldChpdGVtKSkgeworCQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGl0ZW0uZ2V0Tm9kZU5hbWUoKTsKKwkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGF0dHJpYnV0ZUZlYXR1cmUgPSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZShvYmplY3QsCisJCQkJCQkJYXR0cmlidXRlTmFtZSk7CisJCQkJCWlmIChhdHRyaWJ1dGVGZWF0dXJlICE9IG51bGwpIHsKKwkJCQkJCWlmIChpc0RpcmVjdFJlZmVyZW5jZShhdHRyaWJ1dGVOYW1lKSkgeworCQkJCQkJCVN0cmluZyBpZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworCQkJCQkJCU9iamVjdCBvYmplY3RSZWZlcmVuY2UgPSBmaW5kUmVmZXJlbmNlKHJlZmVyZW5jZXMsIGlkKTsKKwkJCQkJCQlpZiAob2JqZWN0UmVmZXJlbmNlID09IG51bGwpIHsKKwkJCQkJCQkJb2JqZWN0UmVmZXJlbmNlID0gY3JlYXRlT2JqZWN0KGRlbHRhcywKKwkJCQkJCQkJCQlnZXRGaXJzdEVsZW1lbnQoKE5vZGVMaXN0KSBpdGVtKSwgcmVmZXJlbmNlcyk7CisJCQkJCQkJfQorCisJCQkJCQkJSURlbHRhIGRlbHRhID0gbmV3IEVNRk1vZGVsRGVsdGFTZXQob2JqZWN0LCBhdHRyaWJ1dGVGZWF0dXJlLAorCQkJCQkJCQkJb2JqZWN0UmVmZXJlbmNlKTsKKwkJCQkJCQljb21wb3NpdGVEZWx0YS5hZGQoZGVsdGEpOworCQkJCQkJfSBlbHNlIGlmIChpc0luZGlyZWN0UmVmZXJlbmNlKGF0dHJpYnV0ZU5hbWUpKSB7CisJCQkJCQkJU3RyaW5nIGlkID0gaXRlbS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisJCQkJCQkJT2JqZWN0IG9iamVjdFJlZmVyZW5jZSA9IGZpbmRSZWZlcmVuY2UocmVmZXJlbmNlcywgaWQpOworCQkJCQkJCWlmIChvYmplY3RSZWZlcmVuY2UgPT0gbnVsbCkgeworCQkJCQkJCQlOb2RlTGlzdCBsaXN0ID0gKE5vZGVMaXN0KSBpdGVtOworCQkJCQkJCQlFbGVtZW50IHJlZkVsZW1lbnQgPSBnZXRGaXJzdEVsZW1lbnQobGlzdCk7CisJCQkJCQkJCWlmIChyZWZFbGVtZW50ICE9IG51bGwpIHsKKwkJCQkJCQkJCU1vZGVsRGVsdGEgZGVsdGEgPSBjcmVhdGVEZWxheWVkRGVsdGEob2JqZWN0LCBhdHRyaWJ1dGVGZWF0dXJlLAorCQkJCQkJCQkJCQlyZWZFbGVtZW50KTsKKwkJCQkJCQkJCWRlbHRhcy5hZGQoZGVsdGEpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJSURlbHRhIGRlbHRhID0gbmV3IEVNRk1vZGVsRGVsdGFTZXQob2JqZWN0LCBhdHRyaWJ1dGVGZWF0dXJlLAorCQkJCQkJCQkJCW9iamVjdFJlZmVyZW5jZSk7CisJCQkJCQkJCWNvbXBvc2l0ZURlbHRhLmFkZChkZWx0YSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChpc0NoYWluZWRSZWZlcmVuY2UoYXR0cmlidXRlTmFtZSkpIHsKKwkJCQkJCQlMaXN0PE9iamVjdD4gb2JqZWN0UmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCQkJCU5vZGVMaXN0IG9iamVjdFJlZmVyZW5jZU5vZGVzID0gKE5vZGVMaXN0KSBpdGVtOworCisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvYmplY3RSZWZlcmVuY2VOb2Rlcy5nZXRMZW5ndGgoKTsgaisrKSB7CisJCQkJCQkJCU5vZGUgcmVmTm9kZSA9IG9iamVjdFJlZmVyZW5jZU5vZGVzLml0ZW0oaik7CisJCQkJCQkJCWlmIChyZWZOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgeworCQkJCQkJCQkJT2JqZWN0IG9iamVjdFJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZShkZWx0YXMsCisJCQkJCQkJCQkJCShFbGVtZW50KSByZWZOb2RlLCByZWZlcmVuY2VzKTsKKwkJCQkJCQkJCWlmIChvYmplY3RSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCW9iamVjdFJlZmVyZW5jZXMuYWRkKG9iamVjdFJlZmVyZW5jZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlJRGVsdGEgZGVsdGEgPSBuZXcgRU1GTW9kZWxEZWx0YVNldChvYmplY3QsIGF0dHJpYnV0ZUZlYXR1cmUsCisJCQkJCQkJCQlvYmplY3RSZWZlcmVuY2VzKTsKKwkJCQkJCQljb21wb3NpdGVEZWx0YS5hZGQoZGVsdGEpOworCQkJCQkJfSBlbHNlIGlmIChpc1Vub3JkZXJlZENoYWluZWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHsKKwkJCQkJCQlNb2RlbERlbHRhIGRlbHRhID0gY3JlYXRlVW5vcmRlcmVkQ2hhaW5lZEF0dHJpYnV0ZURlbHRhKG9iamVjdCwKKwkJCQkJCQkJCWF0dHJpYnV0ZUZlYXR1cmUsIGl0ZW0sIGF0dHJpYnV0ZU5hbWUpOworCQkJCQkJCWRlbHRhcy5hZGQoZGVsdGEpOworCQkJCQkJfSBlbHNlIGlmIChpc1N0cmluZ1RvU3RyaW5nTWFwKGF0dHJpYnV0ZU5hbWUpKSB7CisJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZShvYmplY3QsIGF0dHJpYnV0ZU5hbWUpOworCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCQkJCUVNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IChFTWFwPFN0cmluZywgU3RyaW5nPikgb2JqZWN0LmVHZXQoZmVhdHVyZSk7CisKKwkJCQkJCQlOb2RlTGlzdCBhdHRyaWJ1dGVzID0gKE5vZGVMaXN0KSBpdGVtOworCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKSB7CisJCQkJCQkJCU5vZGUgZW50cnkgPSBhdHRyaWJ1dGVzLml0ZW0oaik7CisJCQkJCQkJCWlmIChlbnRyeSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKwkJCQkJCQkJCUVsZW1lbnQga2V5VmFsdWUgPSAoRWxlbWVudCkgZW50cnk7CisJCQkJCQkJCQltYXAucHV0KGtleVZhbHVlLmdldEF0dHJpYnV0ZShFTlRSWV9BVFRWQUxVRV9LRVkpLAorCQkJCQkJCQkJCQlrZXlWYWx1ZS5nZXRBdHRyaWJ1dGUoRU5UUllfQVRUVkFMVUVfVkFMVUUpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYXR0cmlidXRlRmVhdHVyZSwKKwkJCQkJCQkJCWl0ZW0uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKTsKKwkJCQkJCQlpZiAoQ09OVFJJQlVUSU9OX1VSSV9BVFROQU1FLmVxdWFscyhhdHRyaWJ1dGVGZWF0dXJlLmdldE5hbWUoKSkpCisJCQkJCQkJCXZhbHVlID0gKChTdHJpbmcpIHZhbHVlKS5yZXBsYWNlRmlyc3QoT0xEX0NPTlRSSUJVVElPTl9VUklfUFJFRklYLAorCQkJCQkJCQkJCU5FV19DT05UUklCVVRJT05fVVJJX1BSRUZJWCk7CisJCQkJCQkJb2JqZWN0LmVTZXQoYXR0cmlidXRlRmVhdHVyZSwgdmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGNvbXBvc2l0ZURlbHRhOworCX0KKworCXByaXZhdGUgTW9kZWxEZWx0YSBjcmVhdGVVbm9yZGVyZWRDaGFpbmVkQXR0cmlidXRlRGVsdGEoRU9iamVjdCBvYmplY3QsCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudCBub2RlLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKKwkJU2V0PE9iamVjdD4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOworCQlOb2RlTGlzdCBhdHRyaWJ1dGVzID0gKE5vZGVMaXN0KSBub2RlOworCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGorKykgeworCQkJTm9kZSBpdGVtID0gYXR0cmlidXRlcy5pdGVtKGopOworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQkJRWxlbWVudCBhdHRyaWJ1dGUgPSAoRWxlbWVudCkgaXRlbTsKKwkJCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShmZWF0dXJlLCBhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlKGZlYXR1cmVOYW1lKSk7CisJCQkJdmFsdWVzLmFkZCh2YWx1ZSk7CisJCQl9CisJCX0KKworCQlMaXN0PD8+IGN1cnJlbnRWYWx1ZXMgPSAoTGlzdDw/Pikgb2JqZWN0LmVHZXQoZmVhdHVyZSk7CisJCXZhbHVlcy5hZGRBbGwoY3VycmVudFZhbHVlcyk7CisKKwkJcmV0dXJuIG5ldyBFTUZNb2RlbERlbHRhU2V0KG9iamVjdCwgZmVhdHVyZSwgbmV3IEFycmF5TGlzdDxPYmplY3Q+KHZhbHVlcykpOworCX0KKworCXByaXZhdGUgTW9kZWxEZWx0YSBjcmVhdGVBdHRyaWJ1dGVEZWx0YShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAorCQkJRWxlbWVudCBub2RlLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKKwkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoZmVhdHVyZSwgbm9kZS5nZXRBdHRyaWJ1dGUoZmVhdHVyZU5hbWUpKTsKKwkJcmV0dXJuIG5ldyBFTUZNb2RlbERlbHRhU2V0KGVPYmplY3QsIGZlYXR1cmUsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgeworCQl0cnkgeworCQkJcmV0dXJuIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIENoYW5nZURlc2NyaXB0aW9uIGNhbGN1bGF0ZURlbHRhcygpIHsKKwkJaWYgKGNoYW5nZURlc2NyaXB0aW9uID09IG51bGwpIHsKKwkJCWNoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlUmVjb3JkZXIuZW5kUmVjb3JkaW5nKCk7CisJCX0KKwkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3Qgc2VyaWFsaXplKCkgeworCQljYWxjdWxhdGVEZWx0YXMoKTsKKworCQkvLyBiZWdpbiBjb25zdHJ1Y3Rpb24gb2YgdGhlIFhNTCBkb2N1bWVudAorCQlEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KCk7CisJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoQ0hBTkdFU19FTEVNRU5UX05BTUUpOworCQlyb290LnNldEF0dHJpYnV0ZShWRVJTSU9OX0FUVE5BTUUsIFZFUlNJT05fTlVNQkVSKTsKKwkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7CisKKwkJRU1hcDxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gb2JqZWN0Q2hhbmdlcyA9IGNoYW5nZURlc2NyaXB0aW9uLmdldE9iamVjdENoYW5nZXMoKTsKKwkJZm9yIChFbnRyeTxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gZW50cnkgOiBvYmplY3RDaGFuZ2VzLmVudHJ5U2V0KCkpIHsKKwkJCUVPYmplY3Qgb2JqZWN0ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkvLyBwZXJzaXN0IGV2ZXJ5IGNoYW5nZQorCQkJRWxlbWVudCBwZXJzaXN0ZWRFbGVtZW50ID0gcGVyc2lzdChkb2N1bWVudCwgZW50cnksIG9iamVjdCk7CisJCQlpZiAocGVyc2lzdGVkRWxlbWVudCAhPSBudWxsKSB7CisJCQkJLy8gYXBwZW5kIHRoZSBjaGFuZ2UgdG8gdGhlIGRvY3VtZW50CisJCQkJcm9vdC5hcHBlbmRDaGlsZChwZXJzaXN0ZWRFbGVtZW50KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBkb2N1bWVudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QuIE9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgY2hhbmdlcyBwZXJ0YWluaW5nIHRvIHRoaXMgb2JqZWN0IHNob3VsZCBub3QgYmUgcGVyc2lzdGVkCisJICoKKwkgKiBAcGFyYW0gZG9jdW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSByb290IFhNTCBkb2N1bWVudAorCSAqIEBwYXJhbSBlbnRyeQorCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHRvIHRoZSBvYmplY3QKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHBlcnNpc3QKKwkgKiBAcmV0dXJuIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhbmdlcyBvZiB0aGUgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdHMKKwkgKiAgICAgICAgIGNoYW5nZXMgc2hvdWxkIGJlIGlnbm9yZWQKKwkgKi8KKwlwcml2YXRlIEVsZW1lbnQgcGVyc2lzdChEb2N1bWVudCBkb2N1bWVudCwgRW50cnk8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IGVudHJ5LAorCQkJRU9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVudHJ5PD8sID8+KSB7CisJCQlyZXR1cm4gcGVyc2lzdEVudHJ5KGRvY3VtZW50LCBvYmplY3QpOworCQl9CisJCXJldHVybiBwZXJzaXN0T2JqZWN0KGRvY3VtZW50LCBlbnRyeSwgb2JqZWN0KTsKKwl9CisKKwlwcml2YXRlIEVsZW1lbnQgcGVyc2lzdE9iamVjdChEb2N1bWVudCBkb2N1bWVudCwgRW50cnk8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IGVudHJ5LAorCQkJRU9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGdldE9yaWdpbmFsSWQob2JqZWN0KSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUVsZW1lbnQgbW9kZWxDaGFuZ2UgPSBudWxsOworCisJCUxpc3Q8RmVhdHVyZUNoYW5nZT4gZmVhdHVyZUNoYW5nZXMgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQlmb3IgKEZlYXR1cmVDaGFuZ2UgZmVhdHVyZUNoYW5nZSA6IGZlYXR1cmVDaGFuZ2VzKSB7CisJCQkvLyB3ZSBvbmx5IHdhbnQgdG8gcGVyc2lzdCBkZWx0YXMgb2Ygbm9uLXRyYW5zaWVudCBmZWF0dXJlcworCQkJaWYgKCFmZWF0dXJlQ2hhbmdlLmdldEZlYXR1cmUoKS5pc1RyYW5zaWVudCgpKSB7CisJCQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZmVhdHVyZUNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpOworCQkJCS8vIGNoZWNrIGlmIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhpcyBwYXJ0aWN1bGFyIGZlYXR1cmUKKwkJCQlpZiAoc2hvdWxkUGVyc2lzdChmZWF0dXJlTmFtZSkpIHsKKwkJCQkJaWYgKG1vZGVsQ2hhbmdlID09IG51bGwpIHsKKwkJCQkJCS8vIGNyZWF0ZSBhbiBlbGVtZW50IHRvIHJlY29yZCB0aGlzIG9iamVjdCdzIGNoYW5nZXMKKwkJCQkJCW1vZGVsQ2hhbmdlID0gY3JlYXRlRWxlbWVudChkb2N1bWVudCwgb2JqZWN0KTsKKwkJCQkJfQorCisJCQkJCS8vIGNyZWF0ZSBhIGRlbHRhIGZvciB0aGlzIHBhcnRpY3VsYXIgY2hhbmdlCisJCQkJCUVsZW1lbnQgZGVsdGFFbGVtZW50ID0gY3JlYXRlRGVsdGFFbGVtZW50KGRvY3VtZW50LCBvYmplY3QsIGZlYXR1cmVDaGFuZ2UsCisJCQkJCQkJZmVhdHVyZU5hbWUpOworCQkJCQltb2RlbENoYW5nZS5hcHBlbmRDaGlsZChkZWx0YUVsZW1lbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBtb2RlbENoYW5nZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRFbnRyeUVsZW1lbnROYW1lKEVPYmplY3Qgb2JqZWN0LCBFbnRyeTw/LCA/PiBlbnRyeSkgeworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTUNvbnRleHQpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5IDogKChNQ29udGV4dCkgb2JqZWN0KS5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKSkgeworCQkJCWlmIChwcm9wZXJ0eSA9PSBlbnRyeSkgeworCQkJCQlyZXR1cm4gQ09OVEVYVF9QUk9QRVJUSUVTX0FUVE5BTUU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1Db250cmlidXRpb24pIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IHN0YXRlIDogKChNQ29udHJpYnV0aW9uKSBvYmplY3QpLmdldFBlcnNpc3RlZFN0YXRlKCkKKwkJCQkJLmVudHJ5U2V0KCkpIHsKKwkJCQlpZiAoc3RhdGUgPT0gZW50cnkpIHsKKwkJCQkJcmV0dXJuIEFQUExJQ0FUSU9ORUxFTUVOVF9QRVJTSVNURURTVEFURV9BVFROQU1FOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgRWxlbWVudCBwZXJzaXN0RW50cnkoRG9jdW1lbnQgZG9jdW1lbnQsIEVPYmplY3Qgb2JqZWN0KSB7CisJCUVPYmplY3QgY29udGFpbmVyID0gb2JqZWN0LmVDb250YWluZXIoKTsKKwkJaWYgKGdldE9yaWdpbmFsSWQoY29udGFpbmVyKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUVudHJ5PD8sID8+IGVudHJ5ID0gKEVudHJ5PD8sID8+KSBvYmplY3Q7CisJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldEVudHJ5RWxlbWVudE5hbWUoY29udGFpbmVyLCBlbnRyeSk7CisJCWlmIChlbGVtZW50TmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGVsZW1lbnROYW1lLCBjb250YWluZXIpOworCQllbGVtZW50LnNldEF0dHJpYnV0ZShFTlRSWV9BVFRWQUxVRV9LRVksIChTdHJpbmcpIGVudHJ5LmdldEtleSgpKTsKKworCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoVU5TRVRfQVRUTkFNRSwgVU5TRVRfQVRUVkFMVUVfVFJVRSk7CisJCX0gZWxzZSB7CisJCQllbGVtZW50LnNldEF0dHJpYnV0ZShFTlRSWV9BVFRWQUxVRV9WQUxVRSwgKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7CisJCX0KKworCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwlwcml2YXRlIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgRU9iamVjdCBvYmplY3QpIHsKKwkJQ2xhc3M8Pz4gcm9vdEludGVyZmFjZSA9IG9iamVjdC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKVswXTsKKwkJLy8gdGhpcyB0ZWNobmljYWxseSBkb2Vzbid0IGhhdmUgdG8gYmUgdGFnZ2VkIHdpdGggdGhpcyBuYW1lLCBpdCdzIG5vdCBwYXJzZWQsIGJ1dCBtYWtlcyB0aGUKKwkJLy8gWE1MIG1vcmUgcmVhZGFibGUKKwkJcmV0dXJuIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIHJvb3RJbnRlcmZhY2UuZ2V0Q2Fub25pY2FsTmFtZSgpLCBvYmplY3QpOworCX0KKworCXByaXZhdGUgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZWxlbWVudE5hbWUsIEVPYmplY3Qgb2JqZWN0KSB7CisJCUVsZW1lbnQgbW9kZWxDaGFuZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnROYW1lKTsKKwkJbW9kZWxDaGFuZ2Uuc2V0QXR0cmlidXRlKEFQUExJQ0FUSU9ORUxFTUVOVF9FTEVNRU5USURfQVRUTkFNRSwgZ2V0T3JpZ2luYWxJZChvYmplY3QpKTsKKwkJcmV0dXJuIG1vZGVsQ2hhbmdlOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgaWQgb2YgdGhlIG9iamVjdCBieSBxdWVyeWluZyBmb3IgaXQgZnJvbSB0aGUgcmVzb3VyY2UuCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBpZCBmb3IKKwkgKiBAcGFyYW0gY29udGFpbmVyCisJICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGUgb2JqZWN0CisJICogQHJldHVybiB0aGUgb2JqZWN0J3MgaWQgYXMgcmVjb3JkZWQgYnkgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2UKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VJZChFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBjb250YWluZXIpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7CisJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7CisJCQlyZXR1cm4gKChYTUxSZXNvdXJjZSkgcmVzb3VyY2UpLmdldElEKG9iamVjdCk7CisJCX0KKworCQlyZXNvdXJjZSA9IGNvbnRhaW5lci5lUmVzb3VyY2UoKTsKKwkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKKwkJCXJldHVybiAoKFhNTFJlc291cmNlKSByZXNvdXJjZSkuZ2V0SUQob2JqZWN0KTsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0ICsgIiBjb3VsZCBub3QgYmUgaWRlbnRpZmllZCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZmluZFJlc291cmNlSWQoRU9iamVjdCBvYmplY3QsIEVPYmplY3QgY29udGFpbmVyKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOworCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgeworCQkJcmV0dXJuICgoWE1MUmVzb3VyY2UpIHJlc291cmNlKS5nZXRJRChvYmplY3QpOworCQl9CisKKwkJcmVzb3VyY2UgPSBjb250YWluZXIuZVJlc291cmNlKCk7CisJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7CisJCQlyZXR1cm4gKChYTUxSZXNvdXJjZSkgcmVzb3VyY2UpLmdldElEKG9iamVjdCk7CisJCX0KKworCQlpZiAob3JpZ2luYWxPYmplY3RzLmNvbnRhaW5zS2V5KG9iamVjdCkpIHsKKwkJCXJlc291cmNlID0gcm9vdE9iamVjdC5lUmVzb3VyY2UoKTsKKwkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7CisJCQkJcmV0dXJuICgoWE1MUmVzb3VyY2UpIHJlc291cmNlKS5nZXRJRChvYmplY3QpOworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QgKyAiIGNvdWxkIG5vdCBiZSBpZGVudGlmaWVkIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxJZChPYmplY3Qgb2JqZWN0KSB7CisJCUVPYmplY3QgcmVmZXJlbmNlID0gKEVPYmplY3QpIG9iamVjdDsKKwkJcmV0dXJuIGdldFJlc291cmNlSWQocmVmZXJlbmNlLCByZWZlcmVuY2UuZUNvbnRhaW5lcigpKTsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIG9yaWdpbmFsIGNvbnRhaW5pbmcgcGFyZW50IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZS4gSWYKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlIG9iamVjdCB3YXMgbm90IGluaXRpYWxseSBrbm93biBieSB0aGUgY2hhbmdlIHJlY29yZGVyLgorCSAqCisJICogQHBhcmFtIHJlZmVyZW5jZQorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBmaW5kIGl0cyBvcmlnaW5hbCBjb250YWluZXIgZm9yCisJICogQHJldHVybiB0aGUgb3JpZ2luYWwgcGFyZW50IGNvbnRhaW5lciBvZiB0aGUgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkaWQgbm90CisJICogICAgICAgICBpbml0aWFsbHkgZXhpc3QKKwkgKi8KKwlwcml2YXRlIEVPYmplY3QgZ2V0T3JpZ2luYWxDb250YWluZXIoRU9iamVjdCByZWZlcmVuY2UpIHsKKwkJaWYgKGNoYW5nZURlc2NyaXB0aW9uID09IG51bGwpIHsKKwkJCS8vIG5vIGNoYW5nZXMgaGF2ZSBiZWVuIHJlY29yZGVkLCBqdXN0IGFzayB0aGUgY29udGFpbmVyIHRocm91Z2ggRU1GIGRpcmVjdGx5CisJCQlyZXR1cm4gcmVmZXJlbmNlLmVDb250YWluZXIoKTsKKwkJfSBlbHNlIGlmICghb3JpZ2luYWxPYmplY3RzLmNvbnRhaW5zS2V5KHJlZmVyZW5jZSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1Db21tYW5kUGFyYW1ldGVyKSB7CisJCQlFTWFwPEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBvYmplY3RDaGFuZ2VzID0gY2hhbmdlRGVzY3JpcHRpb24KKwkJCQkJLmdldE9iamVjdENoYW5nZXMoKTsKKworCQkJYm9vbGVhbiBwYXJhbWV0ZXJzQ2hhbmdlZCA9IGZhbHNlOworCisJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCUVPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSBpbnN0YW5jZW9mIE1Db21tYW5kKSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKENPTU1BTkRfUEFSQU1FVEVSU19BVFROQU1FKSkgeworCQkJCQkJCUxpc3Q8Pz4gcGFyYW1ldGVycyA9IChMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlmb3IgKE9iamVjdCBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7CisJCQkJCQkJCWlmIChwYXJhbWV0ZXIgPT0gcmVmZXJlbmNlKSB7CisJCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcGFyYW1ldGVyc0NoYW5nZWQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHBhcmFtZXRlcnNDaGFuZ2VkID8gbnVsbCA6IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTVBhcmFtZXRlcikgeworCQkJRU1hcDxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gb2JqZWN0Q2hhbmdlcyA9IGNoYW5nZURlc2NyaXB0aW9uCisJCQkJCS5nZXRPYmplY3RDaGFuZ2VzKCk7CisKKwkJCWJvb2xlYW4gcGFyYW1ldGVyc0NoYW5nZWQgPSBmYWxzZTsKKworCQkJZm9yIChFbnRyeTxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gZW50cnkgOiBvYmplY3RDaGFuZ2VzLmVudHJ5U2V0KCkpIHsKKwkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBNSGFuZGxlZEl0ZW0pIHsKKwkJCQkJZm9yIChGZWF0dXJlQ2hhbmdlIGNoYW5nZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJCWlmIChjaGFuZ2UuZ2V0RmVhdHVyZU5hbWUoKS5lcXVhbHMoSEFORExFRElURU1fUEFSQU1FVEVSU19BVFROQU1FKSkgeworCQkJCQkJCUxpc3Q8Pz4gcGFyYW1ldGVycyA9IChMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlmb3IgKE9iamVjdCBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7CisJCQkJCQkJCWlmIChwYXJhbWV0ZXIgPT0gcmVmZXJlbmNlKSB7CisJCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcGFyYW1ldGVyc0NoYW5nZWQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHBhcmFtZXRlcnNDaGFuZ2VkID8gbnVsbCA6IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTUNvbW1hbmQpIHsKKwkJCUVNYXA8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IG9iamVjdENoYW5nZXMgPSBjaGFuZ2VEZXNjcmlwdGlvbgorCQkJCQkuZ2V0T2JqZWN0Q2hhbmdlcygpOworCisJCQlib29sZWFuIGNvbW1hbmRzQ2hhbmdlZCA9IGZhbHNlOworCisJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCUVPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSA9PSByb290T2JqZWN0KSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKEFQUExJQ0FUSU9OX0NPTU1BTkRTX0FUVE5BTUUpKSB7CisJCQkJCQkJTGlzdDw/PiBjb21tYW5kcyA9IChMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlmb3IgKE9iamVjdCBjb21tYW5kIDogY29tbWFuZHMpIHsKKwkJCQkJCQkJaWYgKGNvbW1hbmQgPT0gcmVmZXJlbmNlKSB7CisJCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJY29tbWFuZHNDaGFuZ2VkID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghY29tbWFuZHNDaGFuZ2VkKSB7CisJCQkJcmV0dXJuIHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCQl9CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTU1lbnVDb250cmlidXRpb24pIHsKKwkJCUVNYXA8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IG9iamVjdENoYW5nZXMgPSBjaGFuZ2VEZXNjcmlwdGlvbgorCQkJCQkuZ2V0T2JqZWN0Q2hhbmdlcygpOworCisJCQlib29sZWFuIG1lbnVDb250cmlidXRpb25zQ2hhbmdlZCA9IGZhbHNlOworCisJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCUVPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSA9PSByb290T2JqZWN0KSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKAorCQkJCQkJCQlNRU5VQ09OVFJJQlVUSU9OU19NRU5VQ09OVFJJQlVUSU9OU19BVFROQU1FKSkgeworCQkJCQkJCUxpc3Q8Pz4gY29tbWFuZHMgPSAoTGlzdDw/PikgY2hhbmdlLmdldFZhbHVlKCk7CisJCQkJCQkJZm9yIChPYmplY3QgY29tbWFuZCA6IGNvbW1hbmRzKSB7CisJCQkJCQkJCWlmIChjb21tYW5kID09IHJlZmVyZW5jZSkgeworCQkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCW1lbnVDb250cmlidXRpb25zQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gbWVudUNvbnRyaWJ1dGlvbnNDaGFuZ2VkID8gbnVsbCA6IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTVRvb2xCYXJDb250cmlidXRpb24pIHsKKwkJCUVNYXA8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IG9iamVjdENoYW5nZXMgPSBjaGFuZ2VEZXNjcmlwdGlvbgorCQkJCQkuZ2V0T2JqZWN0Q2hhbmdlcygpOworCisJCQlib29sZWFuIHRvb2xCYXJDb250cmlidXRpb25zQ2hhbmdlZCA9IGZhbHNlOworCisJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCUVPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSA9PSByb290T2JqZWN0KSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKAorCQkJCQkJCQlUT09MQkFSQ09OVFJJQlVUSU9OU19UT09MQkFSQ09OVFJJQlVUSU9OU19BVFROQU1FKSkgeworCQkJCQkJCUxpc3Q8Pz4gY29tbWFuZHMgPSAoTGlzdDw/PikgY2hhbmdlLmdldFZhbHVlKCk7CisJCQkJCQkJZm9yIChPYmplY3QgY29tbWFuZCA6IGNvbW1hbmRzKSB7CisJCQkJCQkJCWlmIChjb21tYW5kID09IHJlZmVyZW5jZSkgeworCQkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXRvb2xCYXJDb250cmlidXRpb25zQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdG9vbEJhckNvbnRyaWJ1dGlvbnNDaGFuZ2VkID8gbnVsbCA6IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTVRyaW1Db250cmlidXRpb24pIHsKKwkJCUVNYXA8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IG9iamVjdENoYW5nZXMgPSBjaGFuZ2VEZXNjcmlwdGlvbgorCQkJCQkuZ2V0T2JqZWN0Q2hhbmdlcygpOworCisJCQlib29sZWFuIHRvb2xCYXJDb250cmlidXRpb25zQ2hhbmdlZCA9IGZhbHNlOworCisJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCUVPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSA9PSByb290T2JqZWN0KSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKAorCQkJCQkJCQlUUklNQ09OVFJJQlVUSU9OU19UUklNQ09OVFJJQlVUSU9OU19BVFROQU1FKSkgeworCQkJCQkJCUxpc3Q8Pz4gY29tbWFuZHMgPSAoTGlzdDw/PikgY2hhbmdlLmdldFZhbHVlKCk7CisJCQkJCQkJZm9yIChPYmplY3QgY29tbWFuZCA6IGNvbW1hbmRzKSB7CisJCQkJCQkJCWlmIChjb21tYW5kID09IHJlZmVyZW5jZSkgeworCQkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXRvb2xCYXJDb250cmlidXRpb25zQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdG9vbEJhckNvbnRyaWJ1dGlvbnNDaGFuZ2VkID8gbnVsbCA6IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTUJpbmRpbmdUYWJsZSkgeworCQkJRU1hcDxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gb2JqZWN0Q2hhbmdlcyA9IGNoYW5nZURlc2NyaXB0aW9uCisJCQkJCS5nZXRPYmplY3RDaGFuZ2VzKCk7CisKKwkJCWJvb2xlYW4gYmluZGluZ1RhYmxlc0NoYW5nZWQgPSBmYWxzZTsKKworCQkJZm9yIChFbnRyeTxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gZW50cnkgOiBvYmplY3RDaGFuZ2VzLmVudHJ5U2V0KCkpIHsKKwkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCWlmIChrZXkgPT0gcm9vdE9iamVjdCkgeworCQkJCQlmb3IgKEZlYXR1cmVDaGFuZ2UgY2hhbmdlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCQkJaWYgKGNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpLmVxdWFscyhCSU5ESU5HQ09OVEFJTkVSX0JJTkRJTkdUQUJMRVNfQVRUTkFNRSkpIHsKKwkJCQkJCQlMaXN0PD8+IGNvbW1hbmRzID0gKExpc3Q8Pz4pIGNoYW5nZS5nZXRWYWx1ZSgpOworCQkJCQkJCWZvciAoT2JqZWN0IGNvbW1hbmQgOiBjb21tYW5kcykgeworCQkJCQkJCQlpZiAoY29tbWFuZCA9PSByZWZlcmVuY2UpIHsKKwkJCQkJCQkJCXJldHVybiBrZXk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQliaW5kaW5nVGFibGVzQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIWJpbmRpbmdUYWJsZXNDaGFuZ2VkKSB7CisJCQkJcmV0dXJuIHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCQl9CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTUhhbmRsZXIpIHsKKwkJCUVNYXA8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IG9iamVjdENoYW5nZXMgPSBjaGFuZ2VEZXNjcmlwdGlvbgorCQkJCQkuZ2V0T2JqZWN0Q2hhbmdlcygpOworCisJCQlib29sZWFuIGhhbmRsZXJzQ2hhbmdlZCA9IGZhbHNlOworCisJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCUVPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSBpbnN0YW5jZW9mIE1IYW5kbGVyQ29udGFpbmVyKSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKEhBTkRMRVJDT05UQUlORVJfSEFORExFUlNfQVRUTkFNRSkpIHsKKwkJCQkJCQlMaXN0PD8+IGNvbW1hbmRzID0gKExpc3Q8Pz4pIGNoYW5nZS5nZXRWYWx1ZSgpOworCQkJCQkJCWZvciAoT2JqZWN0IGNvbW1hbmQgOiBjb21tYW5kcykgeworCQkJCQkJCQlpZiAoY29tbWFuZCA9PSByZWZlcmVuY2UpIHsKKwkJCQkJCQkJCXJldHVybiBrZXk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQloYW5kbGVyc0NoYW5nZWQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoIWhhbmRsZXJzQ2hhbmdlZCkgeworCQkJCXJldHVybiByZWZlcmVuY2UuZUNvbnRhaW5lcigpOworCQkJfQorCQl9CisKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1LZXlCaW5kaW5nKSB7CisJCQlFTWFwPEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBvYmplY3RDaGFuZ2VzID0gY2hhbmdlRGVzY3JpcHRpb24KKwkJCQkJLmdldE9iamVjdENoYW5nZXMoKTsKKworCQkJYm9vbGVhbiBiaW5kaW5nc0NoYW5nZWQgPSBmYWxzZTsKKworCQkJZm9yIChFbnRyeTxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gZW50cnkgOiBvYmplY3RDaGFuZ2VzLmVudHJ5U2V0KCkpIHsKKwkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBNQmluZGluZ1RhYmxlKSB7CisJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKEJJTkRJTkdUQUJMRV9CSU5ESU5HU19BVFROQU1FKSkgeworCQkJCQkJCUxpc3Q8Pz4gY29tbWFuZHMgPSAoTGlzdDw/PikgY2hhbmdlLmdldFZhbHVlKCk7CisJCQkJCQkJZm9yIChPYmplY3QgY29tbWFuZCA6IGNvbW1hbmRzKSB7CisJCQkJCQkJCWlmIChjb21tYW5kID09IHJlZmVyZW5jZSkgeworCQkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWJpbmRpbmdzQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICghYmluZGluZ3NDaGFuZ2VkKSB7CisJCQkJcmV0dXJuIHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCQl9CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTVBhcnREZXNjcmlwdG9yKSB7CisJCQlFTWFwPEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBvYmplY3RDaGFuZ2VzID0gY2hhbmdlRGVzY3JpcHRpb24KKwkJCQkJLmdldE9iamVjdENoYW5nZXMoKTsKKwkJCWJvb2xlYW4gZGVzY3JpcHRvcnNDaGFuZ2VkID0gZmFsc2U7CisKKwkJCWZvciAoRW50cnk8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IGVudHJ5IDogb2JqZWN0Q2hhbmdlcy5lbnRyeVNldCgpKSB7CisJCQkJRU9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlpZiAoa2V5ID09IHJvb3RPYmplY3QpIHsKKwkJCQkJZm9yIChGZWF0dXJlQ2hhbmdlIGNoYW5nZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJCWlmIChjaGFuZ2UuZ2V0RmVhdHVyZU5hbWUoKS5lcXVhbHMoCisJCQkJCQkJCVBBUlRERVNDUklQVE9SQ09OVEFJTkVSX0RFU0NSSVBUT1JTX0FUVE5BTUUpKSB7CisJCQkJCQkJTGlzdDw/PiBkZXNjcmlwdG9ycyA9IChMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgPT0gcmVmZXJlbmNlKSB7CisJCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWRlc2NyaXB0b3JzQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZGVzY3JpcHRvcnNDaGFuZ2VkID8gbnVsbCA6IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTVRyaW1CYXIpIHsKKwkJCUVNYXA8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IG9iamVjdENoYW5nZXMgPSBjaGFuZ2VEZXNjcmlwdGlvbgorCQkJCQkuZ2V0T2JqZWN0Q2hhbmdlcygpOworCQkJYm9vbGVhbiB0cmltQmFyc0NoYW5nZWQgPSBmYWxzZTsKKworCQkJZm9yIChFbnRyeTxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gZW50cnkgOiBvYmplY3RDaGFuZ2VzLmVudHJ5U2V0KCkpIHsKKwkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBNVHJpbW1lZFdpbmRvdykgeworCQkJCQlmb3IgKEZlYXR1cmVDaGFuZ2UgY2hhbmdlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCQkJaWYgKGNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpLmVxdWFscyhUUklNTUVEV0lORE9XX1RSSU1CQVJTX0FUVE5BTUUpKSB7CisJCQkJCQkJTGlzdDw/PiB0cmltQmFycyA9IChMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlmb3IgKE9iamVjdCB0cmltQmFyIDogdHJpbUJhcnMpIHsKKwkJCQkJCQkJaWYgKHRyaW1CYXIgPT0gcmVmZXJlbmNlKSB7CisJCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXRyaW1CYXJzQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAodHJpbUJhcnNDaGFuZ2VkKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKHRyaW1CYXJzQ2hhbmdlZCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlmb3IgKEVPYmplY3Qgcm9vdENoaWxkIDogcm9vdE9iamVjdC5lQ29udGVudHMoKSkgeworCQkJCWlmIChyb290Q2hpbGQgaW5zdGFuY2VvZiBNVHJpbW1lZFdpbmRvdykgeworCQkJCQlpZiAoKChNVHJpbW1lZFdpbmRvdykgcm9vdENoaWxkKS5nZXRUcmltQmFycygpLmNvbnRhaW5zKHJlZmVyZW5jZSkpIHsKKwkJCQkJCXJldHVybiByb290Q2hpbGQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJRU1hcDxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gb2JqZWN0Q2hhbmdlcyA9IGNoYW5nZURlc2NyaXB0aW9uLmdldE9iamVjdENoYW5nZXMoKTsKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1VSUVsZW1lbnQpIHsKKwkJCWZvciAoRW50cnk8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IGVudHJ5IDogb2JqZWN0Q2hhbmdlcy5lbnRyeVNldCgpKSB7CisJCQkJRU9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlpZiAoa2V5ID09IHJlZmVyZW5jZSkgeworCQkJCQlmb3IgKEZlYXR1cmVDaGFuZ2UgY2hhbmdlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCQkJaWYgKGNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpLmVxdWFscyhVSUVMRU1FTlRfUEFSRU5UX0FUVE5BTUUpKSB7CisJCQkJCQkJcmV0dXJuIChFT2JqZWN0KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBNTWVudSkgeworCQkJCWJvb2xlYW4gYXBwZW5kZWRNZW51ID0gZmFsc2U7CisKKwkJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlpZiAoa2V5IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQkJaWYgKGNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpLmVxdWFscyhQQVJUX01FTlVTX0FUVE5BTUUpKSB7CisJCQkJCQkJCUxpc3Q8Pz4gb3JpZ2luYWxNZW51cyA9IChMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQkJaWYgKG9yaWdpbmFsTWVudXMuY29udGFpbnMocmVmZXJlbmNlKSkgeworCQkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmICgoKE1QYXJ0KSBrZXkpLmdldE1lbnVzKCkuY29udGFpbnMocmVmZXJlbmNlKSkgeworCQkJCQkJCQkJYXBwZW5kZWRNZW51ID0gdHJ1ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlib29sZWFuIG1lbnVTZXQgPSBmYWxzZTsKKwkJCQlib29sZWFuIG1lbnVDaGFuZ2VkID0gZmFsc2U7CisKKwkJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlpZiAoa2V5IGluc3RhbmNlb2YgTVdpbmRvdykgeworCQkJCQkJZm9yIChGZWF0dXJlQ2hhbmdlIGNoYW5nZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJCQlpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKFdJTkRPV19NQUlOTUVOVV9BVFROQU1FKSkgeworCQkJCQkJCQlPYmplY3Qgb2xkTWVudSA9IGNoYW5nZS5nZXRWYWx1ZSgpOworCQkJCQkJCQlpZiAob2xkTWVudSA9PSByZWZlcmVuY2UpIHsKKwkJCQkJCQkJCXJldHVybiBrZXk7CisJCQkJCQkJCX0gZWxzZSBpZiAob2xkTWVudSA9PSBudWxsCisJCQkJCQkJCQkJJiYgKChNV2luZG93KSBrZXkpLmdldE1haW5NZW51KCkgPT0gcmVmZXJlbmNlKSB7CisJCQkJCQkJCQltZW51U2V0ID0gdHJ1ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQltZW51Q2hhbmdlZCA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChtZW51Q2hhbmdlZCAmJiBtZW51U2V0KSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gZWxzZSBpZiAoYXBwZW5kZWRNZW51ICYmICFtZW51U2V0ICYmICFtZW51Q2hhbmdlZCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisKKwkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgTU1lbnUpKSB7CisJCQkJCXJldHVybiBjb250YWluZXI7CisJCQkJfQorCQkJfQorCisJCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTVRvb2xCYXIpIHsKKwkJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlpZiAoa2V5IGluc3RhbmNlb2YgTVBhcnQpIHsKKwkJCQkJCWZvciAoRmVhdHVyZUNoYW5nZSBjaGFuZ2UgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCQkJaWYgKGNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpLmVxdWFscyhQQVJUX1RPT0xCQVJfQVRUTkFNRSkpIHsKKwkJCQkJCQkJaWYgKGNoYW5nZS5nZXRWYWx1ZSgpID09IHJlZmVyZW5jZSkgeworCQkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYm9vbGVhbiBuZXdFbGVtZW50ID0gZmFsc2U7CisKKwkJCWZvciAoRW50cnk8RU9iamVjdCwgRUxpc3Q8RmVhdHVyZUNoYW5nZT4+IGVudHJ5IDogb2JqZWN0Q2hhbmdlcy5lbnRyeVNldCgpKSB7CisJCQkJRU9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlpZiAoa2V5ID09IHJlZmVyZW5jZS5lQ29udGFpbmVyKCkpIHsKKwkJCQkJZm9yIChGZWF0dXJlQ2hhbmdlIGNoYW5nZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJCWlmIChjaGFuZ2UuZ2V0RmVhdHVyZU5hbWUoKS5lcXVhbHMoRUxFTUVOVENPTlRBSU5FUl9DSElMRFJFTl9BVFROQU1FKSkgeworCQkJCQkJCUVMaXN0PD8+IHZhbHVlID0gKEVMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlpZiAodmFsdWUuY29udGFpbnMocmVmZXJlbmNlKSkgeworCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCX0KKwkJCQkJCQluZXdFbGVtZW50ID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0gZWxzZSBpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKFBBUlRfVE9PTEJBUl9BVFROQU1FKSkgeworCQkJCQkJCWlmIChyZWZlcmVuY2UuZXF1YWxzKGNoYW5nZS5nZXRWYWx1ZSgpKSkgeworCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCX0KKwkJCQkJCQluZXdFbGVtZW50ID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0gZWxzZSBpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKFdJTkRPV19TSEFSRURFTEVNRU5UU19BVFROQU1FKSkgeworCQkJCQkJCUVMaXN0PD8+IHZhbHVlID0gKEVMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCQlpZiAodmFsdWUuY29udGFpbnMocmVmZXJlbmNlKSkgeworCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCX0KKwkJCQkJCQluZXdFbGVtZW50ID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0gZWxzZSBpZiAoY2hhbmdlLmdldEZlYXR1cmVOYW1lKCkuZXF1YWxzKFBFUlNQRUNUSVZFX1dJTkRPV1NfQVRUTkFNRSkpIHsKKwkJCQkJCQlFTGlzdDw/PiB2YWx1ZSA9IChFTGlzdDw/PikgY2hhbmdlLmdldFZhbHVlKCk7CisJCQkJCQkJaWYgKHZhbHVlLmNvbnRhaW5zKHJlZmVyZW5jZSkpIHsKKwkJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCQl9CisJCQkJCQkJbmV3RWxlbWVudCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZm9yIChGZWF0dXJlQ2hhbmdlIGNoYW5nZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJaWYgKGNoYW5nZS5nZXRGZWF0dXJlTmFtZSgpLmVxdWFscyhXSU5ET1dfU0hBUkVERUxFTUVOVFNfQVRUTkFNRSkpIHsKKwkJCQkJCUVMaXN0PD8+IHZhbHVlID0gKEVMaXN0PD8+KSBjaGFuZ2UuZ2V0VmFsdWUoKTsKKwkJCQkJCWlmICh2YWx1ZS5jb250YWlucyhyZWZlcmVuY2UpKSB7CisJCQkJCQkJcmV0dXJuIGtleTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1XaW5kb3cpIHsKKwkJCQlmb3IgKEVudHJ5PEVPYmplY3QsIEVMaXN0PEZlYXR1cmVDaGFuZ2U+PiBlbnRyeSA6IG9iamVjdENoYW5nZXMuZW50cnlTZXQoKSkgeworCQkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlpZiAoa2V5IGluc3RhbmNlb2YgTVBlcnNwZWN0aXZlKSB7CisJCQkJCQlmb3IgKEZlYXR1cmVDaGFuZ2UgY2hhbmdlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCQkJCWlmIChjaGFuZ2UuZ2V0RmVhdHVyZU5hbWUoKS5lcXVhbHMoUEVSU1BFQ1RJVkVfV0lORE9XU19BVFROQU1FKSkgeworCQkJCQkJCQlFTGlzdDw/PiB2YWx1ZSA9IChFTGlzdDw/PikgY2hhbmdlLmdldFZhbHVlKCk7CisJCQkJCQkJCWlmICh2YWx1ZS5jb250YWlucyhyZWZlcmVuY2UpKSB7CisJCQkJCQkJCQlyZXR1cm4ga2V5OworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKCFuZXdFbGVtZW50KSB7CisJCQkJcmV0dXJuIHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbiA/IGNoYW5nZURlc2NyaXB0aW9uIDogcmVmZXJlbmNlCisJCQkJCQkuZUNvbnRhaW5lcigpOworCQkJfQorCQl9CisKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1BZGRvbikgeworCQkJZm9yIChFbnRyeTxFT2JqZWN0LCBFTGlzdDxGZWF0dXJlQ2hhbmdlPj4gZW50cnkgOiBvYmplY3RDaGFuZ2VzLmVudHJ5U2V0KCkpIHsKKwkJCQlFT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBNQXBwbGljYXRpb24pIHsKKwkJCQkJZm9yIChGZWF0dXJlQ2hhbmdlIGNoYW5nZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJCWlmIChjaGFuZ2UuZ2V0RmVhdHVyZU5hbWUoKS5lcXVhbHMoQVBQTElDQVRJT05fQURET05TX0FUVE5BTUUpKSB7CisJCQkJCQkJRUxpc3Q8Pz4gdmFsdWUgPSAoRUxpc3Q8Pz4pIGNoYW5nZS5nZXRWYWx1ZSgpOworCQkJCQkJCXJldHVybiB2YWx1ZS5jb250YWlucyhyZWZlcmVuY2UpID8ga2V5IDogbnVsbDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgb3JpZ2luYWwgaWQgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZSBtZWFuaW5nIG9mIHRoZSB0ZXJtCisJICogIm9yaWdpbmFsIiBpcyBkZWZpbmVkIGFzIHRoZSBzdGF0ZSBvZiB0aGUgb2JqZWN0IHByaW9yIHRvIGhhdmluZyBpdHMgc3RhdGUgbW9uaXRvcmVkIHZpYQorCSAqIHtAbGluayAjcmVjb3JkQ2hhbmdlcyhPYmplY3QpfS4gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3Qgd2lsbCBiZSBxdWVyaWVkIGZyb20gdGhlCisJICogcmVzb3VyY2UuIElmIHRoZSBvYmplY3QgZGlkIG5vdCBleGlzdCB3YXMgbm90IGtub3duIHdoZW4gY2hhbmdlcyBiZWdhbiByZWNvcmRpbmcsCisJICogPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSByZXR1cm5lZC4KKwkgKgorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcXVlcnkgYW4gaWQgZm9yCisJICogQHJldHVybiBhbiBpZCBzdWl0YWJsZSBmb3IgbG9va2luZyB1cCB0aGUgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGRpZCBub3QKKwkgKiAgICAgICAgIGV4aXN0IG9yIHdhcyBub3Qga25vd24gd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgb3JpZ2luYWxseSBtb25pdG9yZWQgb2JqZWN0CisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0T3JpZ2luYWxJZChPYmplY3Qgb2JqZWN0KSB7CisJCUVPYmplY3QgcmVmZXJlbmNlID0gKEVPYmplY3QpIG9iamVjdDsKKwkJRU9iamVjdCBvcmlnaW5hbENvbnRhaW5lciA9IGdldE9yaWdpbmFsQ29udGFpbmVyKHJlZmVyZW5jZSk7CisKKwkJLy8gZGlkIG5vdCBleGlzdCBpbiB0aGUgbW9kZWwgb3JpZ2luYWxseQorCQlpZiAob3JpZ2luYWxDb250YWluZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAob3JpZ2luYWxDb250YWluZXIgIT0gY2hhbmdlRGVzY3JpcHRpb24pIHsKKwkJCUVPYmplY3QgY29udGFpbmVyID0gb3JpZ2luYWxDb250YWluZXI7CisJCQl3aGlsZSAoY29udGFpbmVyICE9IHJvb3RPYmplY3QpIHsKKwkJCQljb250YWluZXIgPSBnZXRPcmlnaW5hbENvbnRhaW5lcihjb250YWluZXIpOworCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmluZFJlc291cmNlSWQocmVmZXJlbmNlLCBvcmlnaW5hbENvbnRhaW5lcik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBYTUwgZWxlbWVudCB0aGF0IHdpbGwgY2FwdHVyZSB0aGUgZGVsdGEgdGhhdCBvY2N1cnJlZCBpbiB0aGUgb2JqZWN0LgorCSAqCisJICogQHBhcmFtIGRvY3VtZW50CisJICogICAgICAgICAgICB0aGUgcm9vdCBYTUwgZG9jdW1lbnQKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRoYXQgaGFzIGNoYW5nZWQKKwkgKiBAcGFyYW0gZmVhdHVyZUNoYW5nZQorCSAqICAgICAgICAgICAgdGhlIGNhcHR1cmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2UKKwkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRoYXQgaGFzIGNoYW5nZWQKKwkgKiBAcmV0dXJuIHRoZSBYTUwgZWxlbWVudCBhYm91dCB0aGUgY2hhbmdlCisJICovCisJcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZURlbHRhRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgRU9iamVjdCBvYmplY3QsCisJCQlGZWF0dXJlQ2hhbmdlIGZlYXR1cmVDaGFuZ2UsIFN0cmluZyBmZWF0dXJlTmFtZSkgeworCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVDaGFuZ2UuZ2V0RmVhdHVyZSgpOworCQlpZiAob2JqZWN0LmVJc1NldChmZWF0dXJlKSkgeworCQkJcmV0dXJuIGNyZWF0ZVNldERlbHRhRWxlbWVudChkb2N1bWVudCwgb2JqZWN0LCBmZWF0dXJlQ2hhbmdlLCBmZWF0dXJlTmFtZSwgZmVhdHVyZSk7CisJCX0KKworCQlyZXR1cm4gY3JlYXRlVW5zZXREZWx0YUVsZW1lbnQoZG9jdW1lbnQsIGZlYXR1cmVDaGFuZ2UsIGZlYXR1cmVOYW1lKTsKKwl9CisKKwlwcml2YXRlIEVsZW1lbnQgY3JlYXRlU2V0RGVsdGFFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBFT2JqZWN0IG9iamVjdCwKKwkJCUZlYXR1cmVDaGFuZ2UgZmVhdHVyZUNoYW5nZSwgU3RyaW5nIGZlYXR1cmVOYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlFbGVtZW50IGZlYXR1cmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmZWF0dXJlTmFtZSk7CisJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KGZlYXR1cmUpOworCQlpZiAoaXNTaW5nbGVSZWZlcmVuY2UoZmVhdHVyZU5hbWUpKSB7CisJCQkvLyByZWNvcmQgd2hhdCB3ZSdyZSBjdXJyZW50bHkgcmVmZXJlbmNpbmcsIHdlIGNyZWF0ZSBhbiBlbGVtZW50IGluc3RlYWQgb2Ygc2ltcGx5CisJCQkvLyByZWNvcmRpbmcgdGhlIGlkIGJlY2F1c2Ugd2UgbmVlZCB0byBkZXNjcmliZSB0aGUgZW50aXJlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGlzIG5ldywKKwkJCS8vIHNpbXBseSByZWNvcmRpbmcgYW4gaWQgd291bGQgYmUgaW5zdWZmaWNpZW50IGZvciByZWNvcmRpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldworCQkJLy8gb2JqZWN0CisJCQlFbGVtZW50IHJlZmVyZW5jZUVsZW1lbnQgPSBjcmVhdGVSZWZlcmVuY2VFbGVtZW50KGRvY3VtZW50LCAoRU9iamVjdCkgdmFsdWUsCisJCQkJCWZlYXR1cmVOYW1lKTsKKwkJCWZlYXR1cmVFbGVtZW50LmFwcGVuZENoaWxkKHJlZmVyZW5jZUVsZW1lbnQpOworCQl9IGVsc2UgaWYgKGlzQ2hhaW5lZFJlZmVyZW5jZShmZWF0dXJlTmFtZSkpIHsKKwkJCS8vIHJlY29yZCB3aGF0IHdlJ3JlIGN1cnJlbnRseSByZWZlcmVuY2luZworCQkJYXBwZW5kUmVmZXJlbmNlRWxlbWVudHMoZG9jdW1lbnQsIGZlYXR1cmVFbGVtZW50LCAoTGlzdDw/PikgdmFsdWUpOworCQkJLy8gcmVjb3JkIHdoYXQgd2FzIG9yaWdpbmFsbHkgcmVmZXJlbmNlZAorCQkJYXBwZW5kT3JpZ2luYWxSZWZlcmVuY2VFbGVtZW50cyhkb2N1bWVudCwgZmVhdHVyZUVsZW1lbnQsCisJCQkJCShMaXN0PD8+KSBmZWF0dXJlQ2hhbmdlLmdldFZhbHVlKCkpOworCQl9IGVsc2UgaWYgKGlzVW5vcmRlcmVkQ2hhaW5lZEF0dHJpYnV0ZShmZWF0dXJlTmFtZSkpIHsKKwkJCWFwcGVuZFVub3JkZXJlZENoYWluZWRBdHRyaWJ1dGVFbGVtZW50cyhkb2N1bWVudCwgKExpc3Q8Pz4pIHZhbHVlLCBmZWF0dXJlTmFtZSwKKwkJCQkJZmVhdHVyZUVsZW1lbnQpOworCQl9IGVsc2UgaWYgKGlzU3RyaW5nVG9TdHJpbmdNYXAoZmVhdHVyZU5hbWUpKSB7CisJCQlhcHBlbmRTdHJpbmdUb1N0cmluZ01hcEVsZW1lbnRzKGRvY3VtZW50LCBmZWF0dXJlRWxlbWVudCwgb2JqZWN0LCBmZWF0dXJlLCBmZWF0dXJlTmFtZSk7CisJCX0gZWxzZSB7CisJCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoZmVhdHVyZU5hbWUsIFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7CisJCX0KKwkJcmV0dXJuIGZlYXR1cmVFbGVtZW50OworCX0KKworCXByaXZhdGUgRWxlbWVudCBjcmVhdGVVbnNldERlbHRhRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgRmVhdHVyZUNoYW5nZSBmZWF0dXJlQ2hhbmdlLAorCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisJCUVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGZlYXR1cmVOYW1lKTsKKwkJaWYgKGlzQ2hhaW5lZFJlZmVyZW5jZShmZWF0dXJlTmFtZSkpIHsKKwkJCWFwcGVuZE9yaWdpbmFsUmVmZXJlbmNlRWxlbWVudHMoZG9jdW1lbnQsIGZlYXR1cmVFbGVtZW50LAorCQkJCQkoTGlzdDw/PikgZmVhdHVyZUNoYW5nZS5nZXRWYWx1ZSgpKTsKKwkJfSBlbHNlIHsKKwkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShVTlNFVF9BVFROQU1FLCBVTlNFVF9BVFRWQUxVRV9UUlVFKTsKKwkJfQorCQlyZXR1cm4gZmVhdHVyZUVsZW1lbnQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBlbGVtZW50IHRvIGRlc2NyaWJlIHRoYXQgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2FzIGEgcmVmZXJlbmNlIHRoYXQgd2FzIG9yaWdpbmFsbHkKKwkgKiB0aGVyZSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkIHByaW9yIHRvIHRoZSBhcHBseWluZyBvZiBhbnkgZGVsdGFzLiBJdCBzaG91bGQgYmUgbm90ZWQKKwkgKiB0aGF0IGFuIG9iamVjdCB0aGF0IHdhcyBvcmlnaW5hbGx5IHJlZmVyZW5jZWQgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgZGVyZWZlcmVuY2VkIGFmdGVyIGFueQorCSAqIGRlbHRhcyBoYXZlIGJlZW4gYXBwbGllZC4KKwkgKgorCSAqIEBwYXJhbSBkb2N1bWVudAorCSAqICAgICAgICAgICAgdGhlIHJvb3QgWE1MIGRvY3VtZW50CisJICogQHBhcmFtIHJlZmVyZW5jZQorCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZWQgb2JqZWN0CisJICogQHJldHVybiBhbiBYTUwgZWxlbWVudCB0byByZWNvcmQgdGhhdCB0aGUgc3BlY2lmaWVkIG9iamVjdCB3YXMgb3JpZ2luYWxseSByZWZlcmVuY2VkIGJ5CisJICogICAgICAgICBhbm90aGVyIG9iamVjdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkCisJICovCisJcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZU9yaWdpbmFsUmVmZXJlbmNlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IHJlZmVyZW5jZSkgeworCQlFbGVtZW50IHJlZmVyZW5jZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KE9SSUdJTkFMUkVGRVJFTkNFX0VMRU1FTlRfTkFNRSk7CisJCXJlZmVyZW5jZUVsZW1lbnQuc2V0QXR0cmlidXRlKEFQUExJQ0FUSU9ORUxFTUVOVF9FTEVNRU5USURfQVRUTkFNRSwKKwkJCQlnZXRPcmlnaW5hbElkKHJlZmVyZW5jZSkpOworCQlyZXR1cm4gcmVmZXJlbmNlRWxlbWVudDsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXBwZW5kT3JpZ2luYWxSZWZlcmVuY2VFbGVtZW50cyhEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LAorCQkJTGlzdDw/PiByZWZlcmVuY2VzKSB7CisJCWZvciAoT2JqZWN0IHJlZmVyZW5jZSA6IHJlZmVyZW5jZXMpIHsKKwkJCUVsZW1lbnQgcmVmZXJlbmNlRWxlbWVudCA9IGNyZWF0ZU9yaWdpbmFsUmVmZXJlbmNlRWxlbWVudChkb2N1bWVudCwgcmVmZXJlbmNlKTsKKwkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQocmVmZXJlbmNlRWxlbWVudCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgb2JqZWN0LgorCSAqCisJICogQHBhcmFtIGRvY3VtZW50CisJICogICAgICAgICAgICB0aGUgcm9vdCBYTUwgZG9jdW1lbnQKKwkgKiBAcGFyYW0gZU9iamVjdAorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byByZWZlcmVuY2UKKwkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGRlc2NyaWJpbmcgdGhlIHJlZmVyZW5jZSByZWxhdGlvbnNoaXAsIGlmCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgaXMgYXNzdW1lZCB0byBiZSBhIGRpcmVjdCByZWZlcmVuY2UKKwkgKiBAcmV0dXJuIGFuIFhNTCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByb3ZpZGVkIG9iamVjdAorCSAqIEBzZWUgI2lzRGlyZWN0UmVmZXJlbmNlKFN0cmluZykKKwkgKiBAc2VlICNpc0luZGlyZWN0UmVmZXJlbmNlKFN0cmluZykKKwkgKi8KKwlwcml2YXRlIEVsZW1lbnQgY3JlYXRlUmVmZXJlbmNlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKKwkJU3RyaW5nIGlkID0gZ2V0T3JpZ2luYWxJZChlT2JqZWN0KTsKKworCQlpZiAoaWQgPT0gbnVsbCkgeworCQkJaWYgKGZlYXR1cmVOYW1lID09IG51bGwgfHwgaXNEaXJlY3RSZWZlcmVuY2UoZmVhdHVyZU5hbWUpKSB7CisJCQkJLy8gZGlkbid0IGV4aXN0IG9yaWdpbmFsbHksIHdlIG5lZWQgYSBjb21wbGV0ZWx5IG5ldyByZWZlcmVuY2UgdGhhdCBkZXNjcmliZXMgdGhlCisJCQkJLy8gb2JqZWN0IGFuZCBpdHMgYXR0cmlidXRlcworCQkJCXJldHVybiBjcmVhdGVOZXdSZWZlcmVuY2VFbGVtZW50KGRvY3VtZW50LCBlT2JqZWN0KTsKKwkJCX0KKwkJCXJldHVybiBjcmVhdGVVbmlxdWVSZWZlcmVuY2VFbGVtZW50KGRvY3VtZW50LCBlT2JqZWN0KTsKKwkJfQorCisJCUVsZW1lbnQgcmVmZXJlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoUkVGRVJFTkNFX0VMRU1FTlRfTkFNRSk7CisJCXJlZmVyZW5jZUVsZW1lbnQuc2V0QXR0cmlidXRlKEFQUExJQ0FUSU9ORUxFTUVOVF9FTEVNRU5USURfQVRUTkFNRSwgaWQpOworCQlyZXR1cm4gcmVmZXJlbmNlRWxlbWVudDsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXBwZW5kUmVmZXJlbmNlRWxlbWVudHMoRG9jdW1lbnQgZG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgTGlzdDw/PiByZWZlcmVuY2VzKSB7CisJCWZvciAoT2JqZWN0IHJlZmVyZW5jZSA6IHJlZmVyZW5jZXMpIHsKKwkJCUVsZW1lbnQgZWYgPSBjcmVhdGVSZWZlcmVuY2VFbGVtZW50KGRvY3VtZW50LCAoRU9iamVjdCkgcmVmZXJlbmNlLCBudWxsKTsKKwkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZWYpOworCQl9CisJfQorCisJcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZU5ld1JlZmVyZW5jZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIEVPYmplY3QgZU9iamVjdCkgeworCQlFbGVtZW50IHJlZmVyZW5jZUVsZW1lbnQgPSBjcmVhdGVVbmlxdWVSZWZlcmVuY2VFbGVtZW50KGRvY3VtZW50LCBlT2JqZWN0KTsKKworCQkvLyBvYmplY3QgZGlkIG5vdCBleGlzdCwgbWFyayBpdCBhcyBzdWNoIHNvIGl0IGNhbiBiZSBjcmVhdGVkIGR1cmluZyB0aGUKKwkJLy8gd2hlbiB0aGUgZGVsdGFzIGFyZSBhcHBsaWVkCisJCXJlZmVyZW5jZUVsZW1lbnQuc2V0QXR0cmlidXRlKFVOU0VUX0FUVE5BTUUsIFVOU0VUX0FUVFZBTFVFX1RSVUUpOworCQkvLyBub3RlIHdoYXQgd2UgbmVlZCB0byBjcmVhdGUgYnkgc3RvcmluZyB0aGUgdHlwZQorCQlyZWZlcmVuY2VFbGVtZW50LnNldEF0dHJpYnV0ZShUWVBFX0FUVE5BTUUsCisJCQkJZU9iamVjdC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKVswXS5nZXRDYW5vbmljYWxOYW1lKCkpOworCisJCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGNvbGxlY3RlZEZlYXR1cmUgOiBjb2xsZWN0RmVhdHVyZXMoZU9iamVjdCkpIHsKKwkJCVN0cmluZyBmZWF0dXJlTmFtZSA9IGNvbGxlY3RlZEZlYXR1cmUuZ2V0TmFtZSgpOworCQkJLy8gaWdub3JlIHRyYW5zaWVudCBmZWF0dXJlcyBhbmQgZmVhdHVyZXMgdGhhdCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4KKwkJCWlmICghY29sbGVjdGVkRmVhdHVyZS5pc1RyYW5zaWVudCgpICYmIHNob3VsZFBlcnNpc3QoZmVhdHVyZU5hbWUpKSB7CisJCQkJRWxlbWVudCByZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50ID0gY3JlYXRlQXR0cmlidXRlRWxlbWVudChkb2N1bWVudCwgZU9iamVjdCwKKwkJCQkJCWNvbGxlY3RlZEZlYXR1cmUsIGZlYXR1cmVOYW1lKTsKKwkJCQlyZWZlcmVuY2VFbGVtZW50LmFwcGVuZENoaWxkKHJlZmVyZW5jZUF0dHJpYnV0ZUVsZW1lbnQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlZmVyZW5jZUVsZW1lbnQ7CisJfQorCisJcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVVuaXF1ZVJlZmVyZW5jZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIEVPYmplY3QgZU9iamVjdCkgeworCQlFQ2xhc3MgY2xzID0gZU9iamVjdC5lQ2xhc3MoKTsKKwkJRVBhY2thZ2UgcGtnID0gKEVQYWNrYWdlKSBjbHMuZUNvbnRhaW5lcigpOworCisJCUVsZW1lbnQgcmVmZXJlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoUkVGRVJFTkNFX0VMRU1FTlRfTkFNRSk7CisKKwkJRTRYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChFNFhNSVJlc291cmNlKSByb290T2JqZWN0LmVSZXNvdXJjZSgpOworCQlTdHJpbmcgaW50ZXJuYWxJZCA9IHJlc291cmNlLmdldEludGVybmFsSWQoZU9iamVjdCk7CisJCXJlZmVyZW5jZUVsZW1lbnQuc2V0QXR0cmlidXRlKFhNSUlEX0FUVE5BTUUsIGludGVybmFsSWQpOworCQlyZWZlcmVuY2VFbGVtZW50LnNldEF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUTkFNRSwgcGtnLmdldE5zVVJJKCkpOworCisJCXJldHVybiByZWZlcmVuY2VFbGVtZW50OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIGZlYXR1cmUgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCisJICoKKwkgKiBAcGFyYW0gZG9jdW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSByb290IFhNTCBlbGVtZW50IGRvY3VtZW50CisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBkZXNjcmliZQorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogICAgICAgICAgICB0aGUgZmVhdHVyZSBvZiBpbnRlcmVzdAorCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAcmV0dXJuIGFuIFhNTCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHRoZSBmZWF0dXJlJ3MgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIG9iamVjdAorCSAqLworCXByaXZhdGUgRWxlbWVudCBjcmVhdGVBdHRyaWJ1dGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBFT2JqZWN0IG9iamVjdCwKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKKwkJRWxlbWVudCByZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmZWF0dXJlTmFtZSk7CisJCWlmIChvYmplY3QuZUlzU2V0KGZlYXR1cmUpKSB7CisJCQlpZiAoaXNTaW5nbGVSZWZlcmVuY2UoZmVhdHVyZU5hbWUpKSB7CisJCQkJT2JqZWN0IHZhbHVlID0gb2JqZWN0LmVHZXQoZmVhdHVyZSk7CisJCQkJU3RyaW5nIGlkID0gZ2V0T3JpZ2luYWxJZCh2YWx1ZSk7CisJCQkJaWYgKGlkID09IG51bGwpIHsKKwkJCQkJRWxlbWVudCByZWZlcmVuY2VFbGVtZW50ID0gY3JlYXRlUmVmZXJlbmNlRWxlbWVudChkb2N1bWVudCwgKEVPYmplY3QpIHZhbHVlLAorCQkJCQkJCWZlYXR1cmVOYW1lKTsKKwkJCQkJcmVmZXJlbmNlQXR0cmlidXRlRWxlbWVudC5hcHBlbmRDaGlsZChyZWZlcmVuY2VFbGVtZW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50LnNldEF0dHJpYnV0ZShmZWF0dXJlTmFtZSwgaWQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoaXNDaGFpbmVkUmVmZXJlbmNlKGZlYXR1cmVOYW1lKSkgeworCQkJCUxpc3Q8Pz4gcmVmZXJlbmNlcyA9IChMaXN0PD8+KSBvYmplY3QuZUdldChmZWF0dXJlKTsKKwkJCQlhcHBlbmRSZWZlcmVuY2VFbGVtZW50cyhkb2N1bWVudCwgcmVmZXJlbmNlQXR0cmlidXRlRWxlbWVudCwgcmVmZXJlbmNlcyk7CisJCQl9IGVsc2UgaWYgKGlzVW5vcmRlcmVkQ2hhaW5lZEF0dHJpYnV0ZShmZWF0dXJlTmFtZSkpIHsKKwkJCQlhcHBlbmRVbm9yZGVyZWRDaGFpbmVkQXR0cmlidXRlRWxlbWVudHMoZG9jdW1lbnQsIChMaXN0PD8+KSBvYmplY3QuZUdldChmZWF0dXJlKSwKKwkJCQkJCWZlYXR1cmVOYW1lLCByZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50KTsKKwkJCX0gZWxzZSBpZiAoaXNTdHJpbmdUb1N0cmluZ01hcChmZWF0dXJlTmFtZSkpIHsKKwkJCQlhcHBlbmRTdHJpbmdUb1N0cmluZ01hcEVsZW1lbnRzKGRvY3VtZW50LCByZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50LCBvYmplY3QsCisJCQkJCQlmZWF0dXJlLCBmZWF0dXJlTmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXJlZmVyZW5jZUF0dHJpYnV0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKGZlYXR1cmVOYW1lLAorCQkJCQkJU3RyaW5nLnZhbHVlT2Yob2JqZWN0LmVHZXQoZmVhdHVyZSkpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlZmVyZW5jZUF0dHJpYnV0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKFVOU0VUX0FUVE5BTUUsIFVOU0VUX0FUVFZBTFVFX1RSVUUpOworCQl9CisJCXJldHVybiByZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50OworCX0KKworCXByaXZhdGUgdm9pZCBhcHBlbmRVbm9yZGVyZWRDaGFpbmVkQXR0cmlidXRlRWxlbWVudHMoRG9jdW1lbnQgZG9jdW1lbnQsIExpc3Q8Pz4gYXR0cmlidXRlcywKKwkJCVN0cmluZyBmZWF0dXJlTmFtZSwgRWxlbWVudCByZWZlcmVuY2VBdHRyaWJ1dGVFbGVtZW50KSB7CisJCS8vIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIGF0dHJpYnV0ZXMKKwkJZm9yIChPYmplY3QgYXR0cmlidXRlIDogYXR0cmlidXRlcykgeworCQkJLy8gY3JlYXRlIGEgbmV3IGVsZW1lbnQgZm9yIGVhY2ggYXR0cmlidXRlCisJCQlFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGZlYXR1cmVOYW1lKTsKKwkJCS8vIHNldCB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaW50byB0aGUgZWxlbWVudAorCQkJYXR0cmlidXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoZmVhdHVyZU5hbWUsIFN0cmluZy52YWx1ZU9mKGF0dHJpYnV0ZSkpOworCQkJLy8gYXBwZW5kIHRoZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQKKwkJCXJlZmVyZW5jZUF0dHJpYnV0ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoYXR0cmlidXRlRWxlbWVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYXBwZW5kU3RyaW5nVG9TdHJpbmdNYXBFbGVtZW50cyhEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCBwYXJlbnRFbGVtZW50LAorCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKKwkJRU1hcDw/LCA/PiBtYXAgPSAoRU1hcDw/LCA/Pikgb2JqZWN0LmVHZXQoZmVhdHVyZSk7CisJCS8vIGl0ZXJhdGUgb3ZlciB0aGUgbWFwCisJCWZvciAoRW50cnk8PywgPz4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworCQkJLy8gY3JlYXRlIGEgbmV3IGVsZW1lbnQgZm9yIGVhY2ggZW50cnkgaW4gdGhlIG1hcAorCQkJRWxlbWVudCBlbnRyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGZlYXR1cmVOYW1lKTsKKwkJCS8vIHNldCB0aGUgc3RyaW5nIGtleXMgYW5kIHZhbHVlcyBpbnRvIHRoZSBlbGVtZW50CisJCQllbnRyeUVsZW1lbnQuc2V0QXR0cmlidXRlKEVOVFJZX0FUVFZBTFVFX0tFWSwgKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpOworCQkJZW50cnlFbGVtZW50LnNldEF0dHJpYnV0ZShFTlRSWV9BVFRWQUxVRV9WQUxVRSwgKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkvLyBhcHBlbmQgdGhlIGVsZW1lbnQgdG8gdGhlIHBhcmVudAorCQkJcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChlbnRyeUVsZW1lbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N0cmluZ1RvU3RyaW5nTWFwKFN0cmluZyBmZWF0dXJlTmFtZSkgeworCQlyZXR1cm4gZmVhdHVyZU5hbWUuZXF1YWxzKEFQUExJQ0FUSU9ORUxFTUVOVF9QRVJTSVNURURTVEFURV9BVFROQU1FKQorCQkJCXx8IGZlYXR1cmVOYW1lLmVxdWFscyhDT05URVhUX1BST1BFUlRJRVNfQVRUTkFNRSk7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZmVhdHVyZSBpcyBhIGRpcmVjdCByZWZlcmVuY2UgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdC4gVGhhdCBpcywgdGhlCisJICogcmVmZXJlbmNlIGlzIGEgMS0xIHJlbGF0aW9uc2hpcCBhbmQgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGlzIG5vdCByZWZlcnJlZCBieSBvdGhlciBvYmplY3RzCisJICogYW5kIGlzIGEgaGFyZCBjb250YWlubWVudCBmZWF0dXJlLgorCSAqIDxwPgorCSAqIEFuIGV4YW1wbGUgb2YgYSBkaXJlY3QgcmVmZXJlbmNlIHdvdWxkIGJlIGEgd2luZG93J3MgbWFpbiBtZW51LiBUaGUgbWVudSBpcyAib3duZWQiIGJ5IHRoZQorCSAqIHdpbmRvdyBhbmQgY2Fubm90IGJlIG9uZSBvZiB0aGUgbWVudXMgaW4gYSBwYXJ0LgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGludGVyZXN0ZWQgZmVhdHVyZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYXJ0aWN1bGFyIGZlYXR1cmUgZGlyZWN0bHkgcmVmZXJlbmNlcyBhbmQgIm93bnMiIHRoZQorCSAqICAgICAgICAgdGFyZ2V0IG9iamVjdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBzZWUgI2lzSW5kaXJlY3RSZWZlcmVuY2UoU3RyaW5nKQorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaXJlY3RSZWZlcmVuY2UoU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisJCS8vIGEgV2luZG93IGhhcyBhIHNpbmdsZSByZWZlcmVuY2UgdG8gYSBtZW51CisJCXJldHVybiBmZWF0dXJlTmFtZS5lcXVhbHMoV0lORE9XX01BSU5NRU5VX0FUVE5BTUUpIHx8CisJCS8vIGEgUGFydCBoYXMgYSBzaW5nbGUgcmVmZXJlbmNlIHRvIGEgdG9vbCBiYXIKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoUEFSVF9UT09MQkFSX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBVSUVsZW1lbnQgaGFzIGEgc2luZ2xlIHJlZmVyZW5jZSB0byBhIHZpc2libGVXaGVuCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKFVJRUxFTUVOVF9WSVNJQkxFV0hFTl9BVFROQU1FKTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBmZWF0dXJlIGlzIGFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhIHBhcnRpY3VsYXIgb2JqZWN0LiBUaGF0IGlzLCB0aGUKKwkgKiByZWZlcmVuY2UgcmVmZXJzIHRvIGFuIG9iamVjdCBhbmQgdGhpcyByZWZlcmVuY2UgZG9lcyBub3QgbmVjZXNzYXJpbHkgZGVzY3JpYmUgY29udGFpbm1lbnQuCisJICogPHA+CisJICogQW4gZXhhbXBsZSBvZiBhbiBpbmRpcmVjdCByZWZlcmVuY2Ugd291bGQgYmUgYSBoYW5kbGVyJ3MgY29tbWFuZC4gVGhlIGhhbmRsZXIgcG9pbnRzIHRvIGEKKwkgKiBjb21tYW5kIGJ1dCB0aGUgY29tbWFuZCBpcyBhY3R1YWxseSAib3duZWQiIGJ5IGFuIGFwcGxpY2F0aW9uIGluIGl0cyBsaXN0IG9mIGNvbW1hbmRzLiBJbgorCSAqIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8gY29udGFpbm1lbnQgaW52b2x2ZWQgYmV0d2VlbiB0aGUgaGFuZGxlciBhbmQgdGhlIGNvbW1hbmQuCisJICogPC9wPgorCSAqIDxwPgorCSAqIEFub3RoZXIgZXhhbXBsZSBvZiBhbiBpbmRpcmVjdCByZWZlcmVuY2Ugd291bGQgYmUgYSBlbGVtZW50IGNvbnRhaW5lcidzIGFjdGl2ZSBjaGlsZC4gSW4gdGhpcworCSAqIGNhc2UsIHRoZSBlbGVtZW50IGNvbnRhaW5lcidzIGNvbnRhaW5zIHRoZSBhY3RpdmUgY2hpbGQgaW4gaXRzIGxpc3Qgb2YgY2hpbGRyZW4gYW5kIGJvdGggdGhpcworCSAqIGxpc3RpbmcgYW5kIHRoZSBhY3RpdmUgY2hpbGQgcmVmZXJlbmNlIGlzIGEgY29udGFpbm1lbnQgZmVhdHVyZS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmVzdGVkIGZlYXR1cmUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFydGljdWxhciBmZWF0dXJlIGRpcmVjdGx5IHJlZmVyZW5jZXMgYW5kICJvd25zIiB0aGUKKwkgKiAgICAgICAgIHRhcmdldCBvYmplY3QsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAc2VlICNpc0RpcmVjdFJlZmVyZW5jZShTdHJpbmcpCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luZGlyZWN0UmVmZXJlbmNlKFN0cmluZyBmZWF0dXJlTmFtZSkgeworCQkvLyBhbiBFbGVtZW50Q29udGFpbmVyIGhhcyBhIHNpbmdsZSByZWZlcmVuY2UgdG8gaXRzIGFjdGl2ZSBjaGlsZAorCQlyZXR1cm4gZmVhdHVyZU5hbWUuZXF1YWxzKEVMRU1FTlRDT05UQUlORVJfU0VMRUNURURFTEVNRU5UX0FUVE5BTUUpIHx8CisJCS8vIGEgSGFuZGxlciBoYXMgYSBzaW5nbGUgcmVmZXJlbmNlIHRvIGEgY29tbWFuZAorCQkJCWZlYXR1cmVOYW1lLmVxdWFscyhIQU5ETEVSX0NPTU1BTkRfQVRUTkFNRSkgfHwKKwkJCQkvLyBhIEtleUJpbmRpbmcgaGFzIGEgc2luZ2xlIHJlZmVyZW5jZSB0byBhIGNvbW1hbmQKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoS0VZQklORElOR19DT01NQU5EX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBQbGFjZWhvbGRlciBoYXMgYSBzaW5nbGUgcmVmZXJlbmNlIHRvIGEgdWkgZWxlbWVudAorCQkJCWZlYXR1cmVOYW1lLmVxdWFscyhQTEFDRUhPTERFUl9SRUZfTkFNRSkgfHwKKwkJCQkvLyBhIEJpbmRpbmdUYWJsZSBoYXMgYSBzaW5nbGUgcmVmZXJlbmNlIHRvIGEgYmluZGluZ0NvbnRleHQKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoQklORElOR1RBQkxFX0JJTkRJTkdDT05URVhUX0FUVE5BTUUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZmVhdHVyZSBpcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG9iamVjdC4KKwkgKgorCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFydGljdWxhciBmZWF0dXJlIGlzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgb2JqZWN0LAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaW5nbGVSZWZlcmVuY2UoU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisJCXJldHVybiBpc0RpcmVjdFJlZmVyZW5jZShmZWF0dXJlTmFtZSkgfHwgaXNJbmRpcmVjdFJlZmVyZW5jZShmZWF0dXJlTmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIGEgbGlzdCBvZiBvYmplY3QgcmVmZXJlbmNlcy4KKwkgKgorCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFydGljdWxhciBmZWF0dXJlIGlzIHJlZmVycmluZyB0byBhIGxpc3Qgb2Ygb2JqZWN0CisJICogICAgICAgICByZWZlcmVuY2VzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NoYWluZWRSZWZlcmVuY2UoU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisJCS8vIGFuIEVsZW1lbnRDb250YWluZXIgaGFzIG11bHRpcGxlIGNoaWxkcmVuCisJCXJldHVybiBmZWF0dXJlTmFtZS5lcXVhbHMoRUxFTUVOVENPTlRBSU5FUl9DSElMRFJFTl9BVFROQU1FKSB8fAorCQkvLyBhIEJpbmRpbmdDb250YWluZXIgaGFzIG11bHRpcGxlIGJpbmRpbmdzCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKEJJTkRJTkdUQUJMRV9CSU5ESU5HU19BVFROQU1FKSB8fAorCQkJCS8vIGEgUGFydCBoYXMgbXVsdGlwbGUgbWVudXMKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoUEFSVF9NRU5VU19BVFROQU1FKSB8fAorCQkJCS8vIGFuIEFwcGxpY2F0aW9uIGhhcyBtdWx0aXBsZSBjb21tYW5kcworCQkJCWZlYXR1cmVOYW1lLmVxdWFscyhBUFBMSUNBVElPTl9DT01NQU5EU19BVFROQU1FKSB8fAorCQkJCS8vIGEgU25pcHBldENvbnRhaW5lciBoYXMgbXVsdGlwbGUgc25pcHBldHMKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoU05JUFBFVENPTlRBSU5FUl9TTklQUEVUU19BVFROQU1FKSB8fAorCQkJCS8vIGEgSGFuZGxlckNvbnRhaW5lciBoYXMgbXVsdGlwbGUgaGFuZGxlcnMKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoSEFORExFUkNPTlRBSU5FUl9IQU5ETEVSU19BVFROQU1FKSB8fAorCQkJCS8vIGEgQmluZGluZ0NvbnRhaW5lciBoYXMgbXVsdGlwbGUgYmluZGluZyB0YWJsZXMKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoQklORElOR0NPTlRBSU5FUl9CSU5ESU5HVEFCTEVTX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBUcmltbWVkV2luZG93IGhhcyBtdWx0aXBsZSB0cmltIGJhcnMKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoVFJJTU1FRFdJTkRPV19UUklNQkFSU19BVFROQU1FKSB8fAorCQkJCS8vIGEgV2luZG93IGhhcyBtdWx0aXBsZSBzaGFyZWQgZWxlbWVudHMKKwkJCQlmZWF0dXJlTmFtZS5lcXVhbHMoV0lORE9XX1NIQVJFREVMRU1FTlRTX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBNZW51Q29udHJpYnV0aW9ucyBoYXMgbXVsdGlwbGUgbWVudSBjb250cmlidXRpb25zCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKE1FTlVDT05UUklCVVRJT05TX01FTlVDT05UUklCVVRJT05TX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBDb21tYW5kIGhhcyBtdWx0aXBsZSAoY29tbWFuZCkgcGFyYW1ldGVycworCQkJCWZlYXR1cmVOYW1lLmVxdWFscyhDT01NQU5EX1BBUkFNRVRFUlNfQVRUTkFNRSkgfHwKKwkJCQkvLyBhIEhhbmRsZWRJdGVtIGhhcyBtdWx0aXBsZSBwYXJhbWV0ZXJzCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKEhBTkRMRURJVEVNX1BBUkFNRVRFUlNfQVRUTkFNRSkgfHwKKwkJCQkvLyBhIFRvb2xCYXJDb250cmlidXRpb25zIGhhcyBtdWx0aXBsZSB0b29sIGJhciBjb250cmlidXRpb25zCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKFRPT0xCQVJDT05UUklCVVRJT05TX1RPT0xCQVJDT05UUklCVVRJT05TX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBUcmltQ29udHJpYnV0aW9ucyBoYXMgbXVsdGlwbGUgdHJpbSBjb250cmlidXRpb25zCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKFRSSU1DT05UUklCVVRJT05TX1RSSU1DT05UUklCVVRJT05TX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBQZXJzcGVjdGl2ZSBoYXMgbXVsdGlwbGUgd2luZG93cworCQkJCWZlYXR1cmVOYW1lLmVxdWFscyhQRVJTUEVDVElWRV9XSU5ET1dTX0FUVE5BTUUpIHx8CisJCQkJLy8gYSBCaW5kaW5nIGhhcyBtdWx0aXBsZSBiaW5kaW5nIGNvbnRleHRzCisJCQkJZmVhdHVyZU5hbWUuZXF1YWxzKEJJTkRJTkdTX0JJTkRJTkdDT05URVhUU19BVFROQU1FKSB8fAorCQkJCS8vIGEgQmluZGluZ0NvbnRhaW5lciBoYXMgbXVsdGlwbGUgcm9vdCBjb250ZXh0cworCQkJCWZlYXR1cmVOYW1lLmVxdWFscyhCSU5ESU5HQ09OVEFJTkVSX1JPT1RDT05URVhUX0FUVE5BTUUpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbm9yZGVyZWRDaGFpbmVkQXR0cmlidXRlKFN0cmluZyBmZWF0dXJlTmFtZSkgeworCQlyZXR1cm4gZmVhdHVyZU5hbWUuZXF1YWxzKEFQUExJQ0FUSU9ORUxFTUVOVF9UQUdTX0FUVE5BTUUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIHBlcnNpc3RlZC4KKwkgKgorCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFydGljdWxhciBmZWF0dXJlIHNob3VsZCBiZSBwZXJzaXN0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgICAgICAgb3RoZXJ3aXNlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRQZXJzaXN0KFN0cmluZyBmZWF0dXJlTmFtZSkgeworCQkvLyBwYXJlbnQgY2hhbmdlcyBhcmUgY2FwdHVyZWQgYnkgY2hpbGRyZW4gY2hhbmdlcyBhbHJlYWR5CisJCXJldHVybiAhZmVhdHVyZU5hbWUuZXF1YWxzKFVJRUxFTUVOVF9QQVJFTlRfQVRUTkFNRSkKKwkJCQkmJiAhZmVhdHVyZU5hbWUuZXF1YWxzKFBBUlRERVNDUklQVE9SQ09OVEFJTkVSX0RFU0NSSVBUT1JTX0FUVE5BTUUpOworCX0KKworCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBjb2xsZWN0RmVhdHVyZXMoCisJCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMsIEVDbGFzcyBlQ2xhc3MpIHsKKwkJZmVhdHVyZXMuYWRkQWxsKGVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkpOworCQlmb3IgKEVDbGFzcyBzdXBlclR5cGUgOiBlQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKSkgeworCQkJY29sbGVjdEZlYXR1cmVzKGZlYXR1cmVzLCBzdXBlclR5cGUpOworCQl9CisJCXJldHVybiBmZWF0dXJlczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gY29sbGVjdEZlYXR1cmVzKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBjb2xsZWN0RmVhdHVyZXMobmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpLCBvYmplY3QuZUNsYXNzKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbnNldChFbGVtZW50IGVsZW1lbnQpIHsKKwkJcmV0dXJuIFVOU0VUX0FUVFZBTFVFX1RSVUUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFVOU0VUX0FUVE5BTUUpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvYWRkb25zL0NvbnRleHRQcm9jZXNzaW5nQWRkb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvYWRkb25zL0NvbnRleHRQcm9jZXNzaW5nQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk2NWEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9hZGRvbnMvQ29udGV4dFByb2Nlc3NpbmdBZGRvbi5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTGFycyBWb2dlbCA8bGFycy52b2dlbEBnbWFpbC5jb20+IC0gQnVnIDM5NTE2MQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guYWRkb25zOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzLkNvbnRleHRNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmxvZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guUG9saWN5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLkxvY2FsaXphdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uY29tbWFuZHMuTUJpbmRpbmdDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5VSUV2ZW50czsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCisvKioKKyAqIFByb2Nlc3MgY29udGV4dHMgaW4gdGhlIG1vZGVsLCBmZWVkaW5nIHRoZW0gaW50byB0aGUgY29tbWFuZCBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFByb2Nlc3NpbmdBZGRvbiB7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBNQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRXZlbnRCcm9rZXIgYnJva2VyOworCisJQEluamVjdAorCXByaXZhdGUgQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXI7CisKKwlASW5qZWN0CisJTG9nZ2VyIGxvZ2dlcjsKKworCXByaXZhdGUgRXZlbnRIYW5kbGVyIGFkZGl0aW9uSGFuZGxlcjsKKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJZGVmaW5lQ29udGV4dHMoKTsKKwkJcmVnaXN0ZXJNb2RlbExpc3RlbmVycygpOworCX0KKworCXByaXZhdGUgdm9pZCBkZWZpbmVDb250ZXh0cygpIHsKKwkJQWN0aXZhdG9yLnRyYWNlKFBvbGljeS5ERUJVR19DTURTLCAiSW5pdGlhbGl6ZSBjb250ZXh0cyBhbmQgcGFyZW50cyBmcm9tIG1vZGVsIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChNQmluZGluZ0NvbnRleHQgcm9vdCA6IGFwcGxpY2F0aW9uLmdldFJvb3RDb250ZXh0KCkpIHsKKwkJCWRlZmluZUNvbnRleHRzKG51bGwsIHJvb3QpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlZmluZUNvbnRleHRzKE1CaW5kaW5nQ29udGV4dCBwYXJlbnQsIE1CaW5kaW5nQ29udGV4dCBjdXJyZW50KSB7CisJCWlmIChjdXJyZW50LmdldE5hbWUoKSA9PSBudWxsIHx8IGN1cnJlbnQuZ2V0RWxlbWVudElkKCkgPT0gbnVsbCkgeworCQkJbG9nZ2VyLmVycm9yKCJCaW5kaW5nIGNvbnRleHQgbmFtZSBvciBpZCBpcyBudWxsIGZvcjogIiArIGN1cnJlbnQpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChjdXJyZW50LmdldEVsZW1lbnRJZCgpKTsKKwkJaWYgKCFjb250ZXh0LmlzRGVmaW5lZCgpKSB7CisJCQlTdHJpbmcgbG9jYWxpemVkTmFtZSA9IExvY2FsaXphdGlvbkhlbHBlci5nZXRMb2NhbGl6ZWQoY3VycmVudC5nZXROYW1lKCksIGN1cnJlbnQsCisJCQkJCWFwcGxpY2F0aW9uLmdldENvbnRleHQoKSk7CisJCQlTdHJpbmcgbG9jYWxpemVkRGVzY3JpcHRvciA9IExvY2FsaXphdGlvbkhlbHBlci5nZXRMb2NhbGl6ZWQoY3VycmVudC5nZXREZXNjcmlwdGlvbigpLAorCQkJCQljdXJyZW50LCBhcHBsaWNhdGlvbi5nZXRDb250ZXh0KCkpOworCQkJY29udGV4dC5kZWZpbmUobG9jYWxpemVkTmFtZSwgbG9jYWxpemVkRGVzY3JpcHRvciwKKwkJCQkJcGFyZW50ID09IG51bGwgPyBudWxsIDogcGFyZW50LmdldEVsZW1lbnRJZCgpKTsKKwkJfQorCQlmb3IgKE1CaW5kaW5nQ29udGV4dCBjaGlsZCA6IGN1cnJlbnQuZ2V0Q2hpbGRyZW4oKSkgeworCQkJZGVmaW5lQ29udGV4dHMoY3VycmVudCwgY2hpbGQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVuZGVmaW5lQ29udGV4dChNQmluZGluZ0NvbnRleHQgY3VycmVudCkgeworCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KGN1cnJlbnQuZ2V0RWxlbWVudElkKCkpOworCQljb250ZXh0LnVuZGVmaW5lKCk7CisJfQorCisJQFByZURlc3Ryb3kKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl1bnJlZ3NpdGVyTW9kZWxMaXN0ZW5lcnMoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJNb2RlbExpc3RlbmVycygpIHsKKwkJYWRkaXRpb25IYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlPYmplY3QgZWxlbWVudE9iaiA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIE1CaW5kaW5nQ29udGV4dCkgeworCQkJCQlpZiAoVUlFdmVudHMuaXNBREQoZXZlbnQpKSB7CisJCQkJCQlmb3IgKE9iamVjdCBuZXdPYmogOiBVSUV2ZW50cy5hc0l0ZXJhYmxlKGV2ZW50LAorCQkJCQkJCQlVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFKSkgeworCQkJCQkJCWlmIChuZXdPYmogaW5zdGFuY2VvZiBNQmluZGluZ0NvbnRleHQpIHsKKwkJCQkJCQkJTUJpbmRpbmdDb250ZXh0IG5ld0N0eCA9IChNQmluZGluZ0NvbnRleHQpIG5ld09iajsKKwkJCQkJCQkJZGVmaW5lQ29udGV4dHMoKE1CaW5kaW5nQ29udGV4dCkgZWxlbWVudE9iaiwgbmV3Q3R4KTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoVUlFdmVudHMuaXNSRU1PVkUoZXZlbnQpKSB7CisJCQkJCQlmb3IgKE9iamVjdCBvbGRPYmogOiBVSUV2ZW50cy5hc0l0ZXJhYmxlKGV2ZW50LAorCQkJCQkJCQlVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKSkgeworCQkJCQkJCWlmIChvbGRPYmogaW5zdGFuY2VvZiBNQmluZGluZ0NvbnRleHQpIHsKKwkJCQkJCQkJTUJpbmRpbmdDb250ZXh0IG9sZEN0eCA9IChNQmluZGluZ0NvbnRleHQpIG9sZE9iajsKKwkJCQkJCQkJdW5kZWZpbmVDb250ZXh0KG9sZEN0eCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCQlicm9rZXIuc3Vic2NyaWJlKFVJRXZlbnRzLkJpbmRpbmdDb250ZXh0LlRPUElDX0NISUxEUkVOLCBhZGRpdGlvbkhhbmRsZXIpOworCX0KKworCXByaXZhdGUgdm9pZCB1bnJlZ3NpdGVyTW9kZWxMaXN0ZW5lcnMoKSB7CisJCWJyb2tlci51bnN1YnNjcmliZShhZGRpdGlvbkhhbmRsZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvYWRkb25zL0hhbmRsZXJQcm9jZXNzaW5nQWRkb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvYWRkb25zL0hhbmRsZXJQcm9jZXNzaW5nQWRkb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWMzOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9hZGRvbnMvSGFuZGxlclByb2Nlc3NpbmdBZGRvbi5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU29wb3QgQ2VsYSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZml4ZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLmFkZG9uczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuRUhhbmRsZXJTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLkV2ZW50VG9waWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5jb250cmlidXRpb25zLklDb250cmlidXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5jb21tYW5kcy5NSGFuZGxlckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guVUlFdmVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVNb2RlbFNlcnZpY2U7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKKworLyoqCisgKiBQcm9jZXNzIHRoZSBhZGRpdGlvbnMgYW5kIHJlbW92YWxzIG9mIGhhbmRsZXJzIG9uIHRoZSBtb2RlbAorICovCitwdWJsaWMgY2xhc3MgSGFuZGxlclByb2Nlc3NpbmdBZGRvbiB7CisKKwkvKioKKwkgKiBEbyBpbml0aWFsIGNoZWNrIG9mIGhhbmRsZXJzIGFuZCB0aGVpciBjb250ZXh0IHVwb24gY3JlYXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gYXBwbGljYXRpb24KKwkgKiBAcGFyYW0gbW9kZWxTZXJ2aWNlCisJICovCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KE1BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgRU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UpIHsKKwkJTGlzdDxNSGFuZGxlckNvbnRhaW5lcj4gZmluZEVsZW1lbnRzID0gbW9kZWxTZXJ2aWNlLmZpbmRFbGVtZW50cyhhcHBsaWNhdGlvbiwgbnVsbCwKKwkJCQlNSGFuZGxlckNvbnRhaW5lci5jbGFzcywgbnVsbCk7CisJCWZvciAoTUhhbmRsZXJDb250YWluZXIgbUhhbmRsZXJDb250YWluZXIgOiBmaW5kRWxlbWVudHMpIHsKKwkJCWlmIChtSGFuZGxlckNvbnRhaW5lciBpbnN0YW5jZW9mIE1Db250ZXh0KSB7CisJCQkJTUNvbnRleHQgbUNvbnRleHQgPSAoTUNvbnRleHQpIG1IYW5kbGVyQ29udGFpbmVyOworCQkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQuZ2V0Q29udGV4dCgpOworCQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCQkJZm9yIChNSGFuZGxlciBtSGFuZGxlciA6IG1IYW5kbGVyQ29udGFpbmVyLmdldEhhbmRsZXJzKCkpIHsKKwkJCQkJCXByb2Nlc3NBY3RpdmVIYW5kbGVyKG1IYW5kbGVyLCBjb250ZXh0KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJlc3BvbmRzIHRvIHRoZSBjb21pbmcgYW5kIGdvaW5ncyBvZiBoYW5kbGVycyBpbiB0aGUgYXBwbGljYXRpb24gbW9kZWwgYnkgYWN0aXZhdGluZyBhbmQKKwkgKiBkZWFjdGl2YXRpbmcgdGhlbSBhY2NvcmRpbmdseS4KKwkgKiAKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIFRoZSBldmVudCB0aHJvd24gaW4gdGhlIGV2ZW50IGJ1cworCSAqLworCUBJbmplY3QKKwlwdWJsaWMgdm9pZCBoYW5kbGVIYW5kbGVyRXZlbnQoCisJCQlAT3B0aW9uYWwgQEV2ZW50VG9waWMoVUlFdmVudHMuSGFuZGxlckNvbnRhaW5lci5UT1BJQ19IQU5ETEVSUykgRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50ID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmICgoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpIGluc3RhbmNlb2YgTUhhbmRsZXJDb250YWluZXIpCisJCQkJJiYgKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKSBpbnN0YW5jZW9mIE1Db250ZXh0KSkgeworCQkJTUhhbmRsZXJDb250YWluZXIgaGFuZGxlckNvbnRhaW5lciA9IChNSGFuZGxlckNvbnRhaW5lcikgZXZlbnQKKwkJCQkJLmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5FTEVNRU5UKTsKKwkJCWlmIChVSUV2ZW50cy5FdmVudFR5cGVzLkFERC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLlRZUEUpKSkgeworCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuTkVXX1ZBTFVFKSBpbnN0YW5jZW9mIE1IYW5kbGVyKSB7CisJCQkJCU1IYW5kbGVyIGhhbmRsZXIgPSAoTUhhbmRsZXIpIGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQkJCQlNQ29udGV4dCBtQ29udGV4dCA9IChNQ29udGV4dCkgaGFuZGxlckNvbnRhaW5lcjsKKwkJCQkJSUVjbGlwc2VDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dC5nZXRDb250ZXh0KCk7CisJCQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCQkJCXByb2Nlc3NBY3RpdmVIYW5kbGVyKGhhbmRsZXIsIGNvbnRleHQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChVSUV2ZW50cy5FdmVudFR5cGVzLlJFTU9WRQorCQkJCQkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5UWVBFKSkpIHsKKwkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLk9MRF9WQUxVRSkgaW5zdGFuY2VvZiBNSGFuZGxlcikgeworCQkJCQlNSGFuZGxlciBoYW5kbGVyID0gKE1IYW5kbGVyKSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuT0xEX1ZBTFVFKTsKKwkJCQkJTUNvbnRleHQgbUNvbnRleHQgPSAoTUNvbnRleHQpIGhhbmRsZXJDb250YWluZXI7CisJCQkJCUlFY2xpcHNlQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQuZ2V0Q29udGV4dCgpOworCQkJCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQkJCQlNQ29tbWFuZCBjb21tYW5kID0gaGFuZGxlci5nZXRDb21tYW5kKCk7CisJCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7CisJCQkJCQkJU3RyaW5nIGNvbW1hbmRJZCA9IGNvbW1hbmQuZ2V0RWxlbWVudElkKCk7CisJCQkJCQkJRUhhbmRsZXJTZXJ2aWNlIGhhbmRsZXJTZXJ2aWNlID0gKEVIYW5kbGVyU2VydmljZSkgY29udGV4dAorCQkJCQkJCQkJLmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCQkJCQloYW5kbGVyU2VydmljZS5kZWFjdGl2YXRlSGFuZGxlcihjb21tYW5kSWQsIGhhbmRsZXIuZ2V0T2JqZWN0KCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJfQorCisJfQorCisJLyoqCisJICogUmVzcG9uZHMgdG8gdGhlIHNldHRpbmcgb2YgY29udGV4dHMgb2YgaGFuZGxlcnMgaW4gdGhlIGFwcGxpY2F0aW9uIG1vZGVsIGFuZCByZWFjdHMKKwkgKiBhY2NvcmRpbmdseS4KKwkgKgorCSAqIEBwYXJhbSBldmVudAorCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHdoaWNoIHNpZ25hbHMgdGhlIHNldHRpbmcgb2YgdGhlIGNvbnRleHQuCisJICovCisKKwlASW5qZWN0CisJcHVibGljIHZvaWQgaGFuZGxlQ29udGV4dEV2ZW50KEBPcHRpb25hbCBARXZlbnRUb3BpYyhVSUV2ZW50cy5Db250ZXh0LlRPUElDX0NPTlRFWFQpIEV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudCA9PSBudWxsKQorCQkJcmV0dXJuOworCQlPYmplY3Qgb3JpZ2luID0gZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLkVMRU1FTlQpOworCQlPYmplY3QgY29udGV4dCA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5ORVdfVkFMVUUpOworCQlpZiAoKG9yaWdpbiBpbnN0YW5jZW9mIE1IYW5kbGVyQ29udGFpbmVyKQorCQkJCSYmIChVSUV2ZW50cy5FdmVudFR5cGVzLlNFVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoVUlFdmVudHMuRXZlbnRUYWdzLlRZUEUpKSAmJiBjb250ZXh0IGluc3RhbmNlb2YgSUVjbGlwc2VDb250ZXh0KSkgeworCQkJTUhhbmRsZXJDb250YWluZXIgaGFuZGxlckNvbnRhaW5lciA9IChNSGFuZGxlckNvbnRhaW5lcikgb3JpZ2luOworCQkJSUVjbGlwc2VDb250ZXh0IGNhc3RlZENvbnRleHQgPSAoSUVjbGlwc2VDb250ZXh0KSBjb250ZXh0OworCQkJZm9yIChNSGFuZGxlciBtSGFuZGxlciA6IGhhbmRsZXJDb250YWluZXIuZ2V0SGFuZGxlcnMoKSkgeworCQkJCXByb2Nlc3NBY3RpdmVIYW5kbGVyKG1IYW5kbGVyLCBjYXN0ZWRDb250ZXh0KTsKKwkJCX0KKworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGhhbmRsZXIKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzQWN0aXZlSGFuZGxlcihNSGFuZGxlciBoYW5kbGVyLCBJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlNQ29tbWFuZCBjb21tYW5kID0gaGFuZGxlci5nZXRDb21tYW5kKCk7CisJCWlmIChjb21tYW5kICE9IG51bGwpIHsKKwkJCVN0cmluZyBjb21tYW5kSWQgPSBjb21tYW5kLmdldEVsZW1lbnRJZCgpOworCQkJaWYgKGhhbmRsZXIuZ2V0T2JqZWN0KCkgPT0gbnVsbCkgeworCQkJCUlDb250cmlidXRpb25GYWN0b3J5IGNvbnRyaWJ1dGlvbkZhY3RvcnkgPSAoSUNvbnRyaWJ1dGlvbkZhY3RvcnkpIGNvbnRleHQKKwkJCQkJCS5nZXQoSUNvbnRyaWJ1dGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCQloYW5kbGVyLnNldE9iamVjdChjb250cmlidXRpb25GYWN0b3J5LmNyZWF0ZShoYW5kbGVyLmdldENvbnRyaWJ1dGlvblVSSSgpLCBjb250ZXh0KSk7CisJCQl9CisJCQlFSGFuZGxlclNlcnZpY2UgaGFuZGxlclNlcnZpY2UgPSAoRUhhbmRsZXJTZXJ2aWNlKSBjb250ZXh0LmdldChFSGFuZGxlclNlcnZpY2UuY2xhc3MKKwkJCQkJLmdldE5hbWUoKSk7CisJCQloYW5kbGVyU2VydmljZS5hY3RpdmF0ZUhhbmRsZXIoY29tbWFuZElkLCBoYW5kbGVyLmdldE9iamVjdCgpKTsKKwkJfQorCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvaGFuZGxlcnMvRXhpdEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvaGFuZGxlcnMvRXhpdEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzU5ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9oYW5kbGVycy9FeGl0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guaGFuZGxlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklXb3JrYmVuY2g7CisKK3B1YmxpYyBjbGFzcyBFeGl0SGFuZGxlciB7CisJQEV4ZWN1dGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCXdvcmtiZW5jaC5jbG9zZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvaGFuZGxlcnMvU2F2ZUFsbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS9pbnRlcm5hbC93b3JrYmVuY2gvaGFuZGxlcnMvU2F2ZUFsbEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTJhYzNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9oYW5kbGVycy9TYXZlQWxsSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBMYXJzIFZvZ2VsIChMYXJzLlZvZ2VsQGdtYWlsLmNvbSkgLSBCdWcgNDE2MDk5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guaGFuZGxlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkNhbkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5FeGVjdXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKKworcHVibGljIGNsYXNzIFNhdmVBbGxIYW5kbGVyIHsKKworCUBDYW5FeGVjdXRlCisJYm9vbGVhbiBjYW5FeGVjdXRlKEBPcHRpb25hbCBFUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpIHsKKwkJaWYgKHBhcnRTZXJ2aWNlICE9IG51bGwpIHsKKwkJCXJldHVybiAhcGFydFNlcnZpY2UuZ2V0RGlydHlQYXJ0cygpLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQEV4ZWN1dGUKKwl2b2lkIGV4ZWN1dGUoRVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlKSB7CisJCXBhcnRTZXJ2aWNlLnNhdmVBbGwoZmFsc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9oYW5kbGVycy9TYXZlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9oYW5kbGVycy9TYXZlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTJhODEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL2hhbmRsZXJzL1NhdmVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLmhhbmRsZXJzOworCitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuQ2FuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTURpcnR5YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5zZXJ2aWNlcy5JU2VydmljZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmcuRVBhcnRTZXJ2aWNlOworCitwdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXIgeworCisJQENhbkV4ZWN1dGUKKwlib29sZWFuIGNhbkV4ZWN1dGUoQE5hbWVkKElTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9QQVJUKSBNRGlydHlhYmxlIGRpcnR5YWJsZSkgeworCQlyZXR1cm4gZGlydHlhYmxlID09IG51bGwgPyBmYWxzZSA6IGRpcnR5YWJsZS5pc0RpcnR5KCk7CisJfQorCisJQEV4ZWN1dGUKKwl2b2lkIGV4ZWN1dGUoRVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlLCBATmFtZWQoSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1BBUlQpIE1QYXJ0IHBhcnQpIHsKKwkJcGFydFNlcnZpY2Uuc2F2ZVBhcnQocGFydCwgZmFsc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9oYW5kbGVycy9VbmltcGxlbWVudGVkSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL2ludGVybmFsL3dvcmtiZW5jaC9oYW5kbGVycy9VbmltcGxlbWVudGVkSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzJlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvaW50ZXJuYWwvd29ya2JlbmNoL2hhbmRsZXJzL1VuaW1wbGVtZW50ZWRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5oYW5kbGVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVdvcmtiZW5jaDsKKworcHVibGljIGNsYXNzIFVuaW1wbGVtZW50ZWRIYW5kbGVyIHsKKwlARXhlY3V0ZQorCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKKwkJU3lzdGVtLmVyci5wcmludGxuKCJUaGlzIGNvbW1hbmQgaGFuZGxlciBpcyBub3QgaW1wbGVtZW50ZWQuIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL0lFeGNlcHRpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL0lFeGNlcHRpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViZGI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSUV4Y2VwdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoOworCisvKioKKyAqIFRoaXMgaGFuZGxlciBhbGxvd3MgY2xpZW50cyB0byBiZSBub3RpZmllZCB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMKKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VwdGlvbkhhbmRsZXIgeworCisJLyoqCisJICogQ2FsbC1iYWNrIHRvIGhhbmRsZSB0aGUgZ2l2ZW4ge0BsaW5rIFRocm93YWJsZX0KKwkgKgorCSAqIEBwYXJhbSBlCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFRocm93YWJsZX0KKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9JTW9kZWxSZXNvdXJjZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSU1vZGVsUmVzb3VyY2VIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2NDI1MAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSU1vZGVsUmVzb3VyY2VIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFRyaXN0YW4gSHVtZSAtIDx0cmlzaHVtZUBnbWFpbC5jb20+IC0KKyAqICAgICAJCUZpeCBmb3IgQnVnIDIzNjkgW1dvcmtiZW5jaF0gV291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHNhdmUgd29ya3NwYWNlIHdpdGhvdXQgZXhpdGluZworICogICAgIAkJSW1wbGVtZW50ZWQgd29ya2JlbmNoIGF1dG8tc2F2ZSB0byBjb3JyZWN0bHkgcmVzdG9yZSBzdGF0ZSBpbiBjYXNlIG9mIGNyYXNoLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKKy8qKgorICogVGhpcyBoYW5kbGVyIGFsbG93cyBjbGllbnRzIGxvYWQsIGNyZWF0ZSBhbmQgc2F2ZSBtb2RlbCByZXNvdXJjZXMKKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUmVzb3VyY2VIYW5kbGVyIHsKKworCS8qKgorCSAqIExvYWRzIGFuIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IG1vZGVsIHRoYXQgd2FzIHBlcnNpc3RlZAorCSAqCisJICogQHJldHVybiB0aGUgbW9zdCByZWNlbnQgbW9kZWwgc3RhdGUKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2UgbG9hZE1vc3RSZWNlbnRNb2RlbCgpOworCisJLyoqCisJICogQ3JlYXRlcyBhIHJlc291cmNlIHdpdGggYW4gYXBwIE1vZGVsLCB1c2VkIGZvciBzYXZpbmcgY29waWVzIG9mIHRoZSBtYWluIGFwcCBtb2RlbC4KKwkgKgorCSAqIEBwYXJhbSB0aGVBcHAKKwkgKiAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCB0byBhZGQgdG8gdGhlIHJlc291cmNlCisJICogQHJldHVybiBhIHJlc291cmNlIHdpdGggYSBwcm9wZXIgc2F2ZSBwYXRoIHdpdGggdGhlIG1vZGVsIGFzIGNvbnRlbnRzCisJICovCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlV2l0aEFwcChNQXBwbGljYXRpb24gdGhlQXBwKTsKKworCS8qKgorCSAqIFNhdmVzIHRoZSBtb2RlbAorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHN0b3JpbmcgZmFpbHMKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSVByZXNlbnRhdGlvbkVuZ2luZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9JUHJlc2VudGF0aW9uRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3ZGVhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSVByZXNlbnRhdGlvbkVuZ2luZS5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE0IEJlc3RTb2x1dGlvbi5hdCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgVG9tIFNjaGluZGw8dG9tLnNjaGluZGxAYmVzdHNvbHV0aW9uLmF0PiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIElCTSAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworCisvKioKKyAqIFRoZSBwcmVzZW50YXRpb24gZW5naW5lIGlzIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBnZW5lcmljIHdvcmtiZW5jaCBtb2RlbCBpbnRvIHdpZGdldHMuCisgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBzZXJ2aWNlIGFyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgb3IgZGVzdHJveWluZyB3aWRnZXRzIGNvcnJlc3BvbmRpbmcKKyAqIHRvIG1vZGVsIGVsZW1lbnRzLCBhcyB3ZWxsIGFzIGZvciBydW5uaW5nIGFueSBldmVudCBsb29wIHJlcXVpcmVkIGZvciBoYW5kbGluZyB1c2VyIGV2ZW50cyBvbgorICogdGhvc2Ugd2lkZ2V0cy4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVByZXNlbnRhdGlvbkVuZ2luZSB7CisJLyoqCisJICogVGhlIElEIHRvIGFjY2VzcyB0aGUgc2VydmljZSBpbiB0aGUge0BsaW5rIElFY2xpcHNlQ29udGV4dH0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSBJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzLmdldE5hbWUoKTsKKworCS8qKgorCSAqIFdoZW4gYXBwbGllZCBhcyBhIHRhZyB0byBhbiBNVUlMYWJlbCBpbmhpYml0cyB0aGUgZGlzcGxheSBvZiB0aGUgbGFiZWwgdGV4dAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1RJVExFID0gIk5vVGl0bGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBXaGVuIGFwcGxpZWQgYXMgYSB0YWcgdG8gYW4gTVBsYWNlaG9sZGVyIGluaGliaXRzIHRoZSBkaXNwbGF5IG9mIHRoZSBjbG9zZSBhZmZvcmRhbmNlLiBUaGlzCisJICogYWxsb3dzIGEgcGFydCB0byBiZSBjbG9zZWFibGUgaW4gb25lIHBlcnNwZWN0aXZlIGJ1dCBub3QgaW4gYSBkaWZmZXJlbnQgb25lLgorCSAqCisJICogPGI+Tk9URTo8L2I+IElmIHlvdSBhcmUgbm90IHVzaW5nIHBlcnNwZWN0aXZlcyB0aGVuIHVzZSB0aGUgTVBhcnQncyAnaXNDbG9zZWFibGUnIGF0dHJpYnV0ZQorCSAqIHRvIGNvbnRyb2wgdGhlIGFmZm9yZGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ0xPU0UgPSAiTm9DbG9zZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIERlY2xhcmUgdGhlIHN0YWNrIGFzIGNvbnRhaW5pbmcgYSBzaW5nZSAnc3RhbmRhbG9uZScgdmlldy4gVGhlc2Ugc3RhY2tzIHdpbGwgbm90IGFsbG93IGVpdGhlcgorCSAqIGRyYWdnaW5nIHRoZSB2aWV3IG91dCBvZiB0aGUgc3RhY2sgbm9yIGRyYWdnaW5nIG90aGVyIHZpZXdzIGluLgorCSAqCisJICogQHNpbmNlIDEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQUxPTkUgPSAiU3RhbmRhbG9uZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIERvbid0IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBkaXNwbGF5IGV2ZW4gaWYgaXQgaGFzIG5vIGRpc3BsYXlhYmxlIGNoaWxkcmVuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQVVUT19DT0xMQVBTRSA9ICJOb0F1dG9Db2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFdoZW4gYXBwbGllZCBhcyBhIHRhZyB0byBhbiBNVUlFbGVtZW50IGluaGliaXRzIG1vdmluZyB0aGUgZWxlbWVudCAoaWUuIHRocm91Z2ggRG5ELi4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fTU9WRSA9ICJOb01vdmUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIHRhZyBjYW4gYmUgdXNlZCBieSB0aGUgcmVuZGVyZXIgaW1wbGVtZW50YXRpb24gdG8gZGVjaWRlIHRoYXQgdGhlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnQKKwkgKiBoYXMgYmVlbiBoaWRkZW4uCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOX0VYUExJQ0lUTFkgPSAiSElEREVOX0VYUExJQ0lUTFkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGtleSBpcyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGluIHRoZSAncGVyc2lzdGVudERhdGEnIG1hcCB3aGljaCB3aWxsIGJlIHVzZWQgdG8KKwkgKiBvdmVycmlkZSB0aGUgaW5pdGlhbCBzdHlsZSBvZiBhbiBlbGVtZW50IGF0IHJlbmRlcmluZyB0aW1lLiBGb3IgZXhhbXBsZSB0aGUgU1dUIHJlbmRlcmVyIHdpbGwKKwkgKiBleHBlY3QgdG8gc2VlIGFuIGludGVnZXIgKGFzIGEgc3RyaW5nKSB3aGljaCBkZWZpbmVzIHRoZSBpbml0aWFsIFNXVCBzdHlsZSBiaXRzLgorCSAqCisJICogQHNpbmNlIDEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNUWUxFX09WRVJSSURFX0tFWSA9ICJzdHlsZU92ZXJyaWRlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogV2hlbiBhcHBsaWVkIHRvIGFuIE1XaW5kb3cgY2F1c2VzIHRoZSByZW5kZXJlciB0byBtaW5pbWl6ZSB0aGUgcmVzdWx0aW5nIGNvbnRyb2wuCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgV0lORE9XX01JTklNSVpFRF9UQUcgPSAic2hlbGxNaW5pbWl6ZWQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBXaGVuIGFwcGxpZWQgdG8gYW4gTVdpbmRvdyBjYXVzZXMgdGhlIHJlbmRlcmVyIHRvIG1heGltaXplIHRoZSByZXN1bHRpbmcgY29udHJvbC4KKwkgKgorCSAqIEBzaW5jZSAxLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBXSU5ET1dfTUFYSU1JWkVEX1RBRyA9ICJzaGVsbE1heGltaXplZCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFdoZW4gYXBwbGllZCB0byBhbiBNV2luZG93IGNhdXNlcyB0aGUgcmVuZGVyZXIgdG8gcmVuZGVyIHRoZSByZXN1bHRpbmcgY29udHJvbCBhcyBhIHRvcCBsZXZlbAorCSAqIHdpbmRvdworCSAqCisJICogQHNpbmNlIDEuMworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdJTkRPV19UT1BfTEVWRUwgPSAic2hlbGxUb3BMZXZlbCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFdoZW4gYWRkZWQgdG8gYW4gZWxlbWVudCdzICd0YWdzJyB0aGlzIHNob3VsZCBjYXVzZSB0aGUgcHJlc2VudGF0aW9uIHRvIG1vdmUgdGhhdCBlbGVtZW50IHRvCisJICogdGhlIHRyaW0uIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHlvdSBjYW4gb25seSBhcHBseSB0aGlzIHRhZyB0byBhbiBNUGFydFN0YWNrIG9yIHRoZQorCSAqIE1QbGFjZWhvbGRlciBvZiB0aGUgTUFyZWEuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTUlOSU1JWkVEID0gIk1pbmltaXplZCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFdoZW4gYWRkZWQgdG8gYW4gZWxlbWVudCdzICd0YWdzJyB0aGlzIHNob3VsZCBjYXVzZSB0aGUgcHJlc2VudGF0aW9uIHRvIG1pbmltaXplIGFsbCBvdGhlcgorCSAqIHByZXNlbnRhdGlvbiBlbGVtZW50cy4gSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24geW91IGNhbiBvbmx5IGFwcGx5IHRoaXMgdGFnIHRvIGFuCisJICogTVBhcnRTdGFjayBvciB0aGUgTVBsYWNlaG9sZGVyIG9mIHRoZSBNQXJlYS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVhJTUlaRUQgPSAiTWF4aW1pemVkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyB0YWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYW55IGVsZW1lbnQgdGhhdCBoYWQgaXRzIE1JTklNSVpFRCB0YWcgc2V0IGR1ZSB0byBhIGRpZmZlcmVudAorCSAqIGVsZW1lbnQgZ29pbmcgbWF4aW1pemVkLiBUaGlzIGFsbG93cyB0aGUgcmVzdG9yZSBvcGVyYXRpb24gdG8gb25seSByZXN0b3JlIGVsZW1lbnRzIHRoYXQgdGhlCisJICogdXNlciBkaWQgbm90IGV4cGxpY2l0bHkgbWluaW1pemUuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTUlOSU1JWkVEX0JZX1pPT00gPSAiTWluaW1pemVkQnlab29tIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyB0YWcgY2FuIGJlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCBhcyBhIGhpbnQgdG8gdGhlIHJlbmRlcmVycyB0aGF0IHRoZSBlbGVtZW50IHdvdWxkCisJICogcHJlZmVyIHRvIGJlIGhvcml6b250YWwuIEZvciBhbiBNUGFydCB0aGlzIGNvdWxkIGJlIHVzZWQgYm90aCBhcyBhIGhpbnQgdG8gaG93IHRvIHNob3cgdGhlCisJICogdmlldyB3aGVuIGl0J3MgaW4gdGhlIHRyaW0gYnV0IGNvdWxkIGFsc28gYmUgdXNlZCB3aGVuIHBpY2tpbmcgYSBzdGFjayB0byBhZGQgYSBuZXdseSBvcGVuaW5nCisJICogcGFydCB0by4gSXQgY291bGQgYWxzbyBiZSB1c2VkIGZvciBleGFtcGxlIHRvIGNvbnRyb2wgd2hlcmUgdGhlIHRhYnMgYXBwZWFyIG9uIGFuIE1QYXJ0U3RhY2suCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgT1JJRU5UQVRJT05fSE9SSVpPTlRBTCA9ICJIb3Jpem9udGFsIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyB0YWcgY2FuIGJlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCBhcyBhIGhpbnQgdG8gdGhlIHJlbmRlcmVycyB0aGF0IHRoZSBlbGVtZW50IHdvdWxkCisJICogcHJlZmVyIHRvIGJlIHZlcnRpY2FsLiBGb3IgYW4gTVBhcnQgdGhpcyBjb3VsZCBiZSB1c2VkIGJvdGggYXMgYSBoaW50IHRvIGhvdyB0byBzaG93IHRoZSB2aWV3CisJICogd2hlbiBpdCdzIGluIHRoZSB0cmltIGJ1dCBjb3VsZCBhbHNvIGJlIHVzZWQgd2hlbiBwaWNraW5nIGEgc3RhY2sgdG8gYWRkIGEgbmV3bHkgb3BlbmluZyBwYXJ0CisJICogdG8uIEl0IGNvdWxkIGFsc28gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBjb250cm9sIHdoZXJlIHRoZSB0YWJzIGFwcGVhciBvbiBhbiBNUGFydFN0YWNrLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9SSUVOVEFUSU9OX1ZFUlRJQ0FMID0gIlZlcnRpY2FsIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyB0YWcgY2FuIGJlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCAodXN1YWxseSBhbiBNUGFydCkgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZWxlbWVudCBzaG91bGQKKwkgKiBiZSBzcGxpdCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgc2lkZSBieSBzaWRlLgorCSAqCisJICogQHNpbmNlIDEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQTElUX0hPUklaT05UQUwgPSAiU3BsaXQgSG9yaXpvbnRhbCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgdGFnIGNhbiBiZSBhcHBsaWVkIHRvIGFuIGVsZW1lbnQgKHVzdWFsbHkgYW4gTVBhcnQpIHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQgc2hvdWxkCisJICogYmUgc3BsaXQgd2l0aCB0aGUgcmVzdWx0IGJlaW5nIG9uZSBhYm92ZSB0aGUgb3RoZXIuCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU1BMSVRfVkVSVElDQUwgPSAiU3BsaXQgVmVydGljYWwiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGtleSBzaG91bGQgYmUgdXNlZCB0byBhZGQgYW4gb3B0aW9uYWwgU3RyaW5nIHRvIGFuIGVsZW1lbnQgdGhhdCBpcyBhIFVSSSB0byB0aGUgZWxlbWVudHMKKwkgKiBkaXNhYmxlZCBpY29uLiBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSBUb29sYmFyIEl0ZW1zIHdoaWNoLCBpbiBFY2xpcHNlIFNESywgcHJvdmlkZSBhCisJICogdW5pcXVlIGljb24gZm9yIGRpc2FibGVkIHRvb2wgaXRlbXMgdGhhdCBsb29rIGJldHRlciB0aGFuIHRoZSBPUyBkZWZhdWx0IGdyYXlpbmcgb24gdGhlCisJICogZGVmYXVsdCBpY29uLgorCSAqCisJICogVGhlcmUgaXMgYSBzdHJvbmcgYXJndW1lbnQgdG8gYmUgbWFkZSB0aGF0IHRoaXMgZGlzYWJsZWRJY29uVVJJIGFjdHVhbGx5IGJlIHBhcnQgb2YgdGhlIG1vZGVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSUNPTl9JTUFHRV9LRVkgPSAiZTRfZGlzYWJsZWRfaWNvbl9pbWFnZV9rZXkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGtleSBzaG91bGQgYmUgdXNlZCB0byBhZGQgYW4gb3B0aW9uYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIHRvIGFuIGVsZW1lbnRzCisJICogVFJBTlNJRU5UREFUQS4gSWYgcHJlc2VudCwgdGhlIGltYWdlIHdpbGwgYmUgdXNlZCB0byBvdmVycmlkZSB0aGF0IGVsZW1lbnRzIGljb25VUkkuIEFuCisJICogZXhhbXBsZSBpcyBkcmF3aW5nIHRoZSBlcnJvciBpY29uIG9uIGEgbWluaW1pemVkIHByb2JsZW1zIHZpZXcgc3RhY2suCisJICoKKwkgKiBOT1RFOiBUaGlzIGltYWdlIG11c3QgYmUgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCBpdCBoYXNuJ3QgYmVlbiBkaXNwb3NlZCBvbiByZXRyaWV2YWwuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlJJREVfSUNPTl9JTUFHRV9LRVkgPSAiZTRfb3ZlcnJpZGVfaWNvbl9pbWFnZV9rZXkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGtleSBzaG91bGQgYmUgdXNlZCB0byBhZGQgYW4gb3B0aW9uYWwgU3RyaW5nIHRvIGFuIGVsZW1lbnRzIFRSQU5TSUVOVERBVEEuIElmIHByZXNlbnQsCisJICogdGhlIHN0cmluZyB3aWxsIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGVsZW1lbnRzIFRpdGxlVG9vbFRpcC4gQW4gZXhhbXBsZSBpcyBzZXR0aW5nIHRoZQorCSAqIFRvb2xUaXAgb2YgYSBtaW5pbWl6ZWQgcHJvYmxlbXMgdmlldyBzdGFjayB0byB0aGUgbnVtYmVyIG9mIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIHZpZXcuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlJJREVfVElUTEVfVE9PTF9USVBfS0VZID0gImU0X292ZXJyaWRlX3RpdGxlX3Rvb2xfdGlwX2tleSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgYSBUYWcgdGhhdCB3aGVuIGFwcGxpZWQgdG8gYW4gTVVJTGFiZWwgZWxlbWVudCB3aWxsIGNhdXNlIHdoYXRldmVyIEltYWdlIGlzIHRvIGJlCisJICogc2hvd24gdG8gYmUgYWRvcm5lZCB3aXRoIHRoZSAncGlubmVkJyBhZmZvcmRhbmNlLgorCSAqCisJICogQHNpbmNlIDEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFET1JOTUVOVF9QSU4gPSAiUGluIEFkb3JubWVudCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgYSA8Yj5Cb29sZWFuPC9iPiBwcmVmZXJlbmNlIHVzZWQgdG8gY29udHJvbCBhbmltYXRpb25zIGluIHRoZSBhcHBsaWNhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOSU1BVElPTlNfRU5BQkxFRCA9ICJBbmltYXRpb25zIEVuYWJsZWQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGlzIGEgcGVyc2lzdGVkU3RhdGUgJ2tleScgd2hvc2UgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIFVSSSBvZiBhIHN1YmNsYXNzIG9mCisJICogQUJzdHJhY3RQYXJ0UmVuZGVyZXIgdGhhdCBpcyB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9SRU5ERVJFUl9LRVkgPSAiQ3VzdG9tIFJlbmRlcmVyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgdGFnIG5hbWUgdGhhdCBlbmFibGVzIHRoZSBETkQgc3VwcG9ydCBmb3IgdGhlIGVsZW1lbnQuIFRoZSBlbGVtZW50J3MgdGFncyBsaXN0CisJICogaGFzIHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgdGFnIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgRE5EIHByb2Nlc3NpbmcuCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBR0dBQkxFID0gIkRyYWdnYWJsZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHRhZyBuYW1lIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZGVsIGVsZW1lbnQgaXMgYWN0aXZlLgorCSAqCisJICogQHNpbmNlIDEuMworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRSA9ICJhY3RpdmUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBVSSBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gbW9kZWwgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICB0aGUgbW9kZWwgZWxlbWVudAorCSAqIEBwYXJhbSBwYXJlbnRXaWRnZXQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQKKwkgKiBAcGFyYW0gcGFyZW50Q29udGV4dAorCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBiZWluZyByZW5kZXJlZAorCSAqCisJICogQHJldHVybiB0aGUgY3JlYXRlZCBVSSBlbGVtZW50CisJICovCisJcHVibGljIE9iamVjdCBjcmVhdGVHdWkoTVVJRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcGFyZW50V2lkZ2V0LCBJRWNsaXBzZUNvbnRleHQgcGFyZW50Q29udGV4dCk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBVSSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQuIFRoZSByZXN1bHRpbmcgVUkKKwkgKiBlbGVtZW50IHNpdHMgYXQgdGhlIHRvcCBvZiBhIHdpZGdldCBoaWVyYXJjaHkKKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICB0aGUgbW9kZWwgZWxlbWVudAorCSAqIEByZXR1cm4gdGhlIGNyZWF0ZSBVSSBlbGVtZW50CisJICovCisJcHVibGljIE9iamVjdCBjcmVhdGVHdWkoTVVJRWxlbWVudCBlbGVtZW50KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgVUkgZWxlbWVudCBjcmVhdGVkIGZvciB0aGlzIG1vZGVsIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgdGhlIG1vZGVsIGVsZW1lbnQgd2hvc2UgVUkgZWxlbWVudCBzaG91bGQgcmVtb3ZlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUd1aShNVUlFbGVtZW50IGVsZW1lbnQpOworCisJLyoqCisJICogQXR0ZW1wdHMgdG8gc2V0IHRoZSBVSSBmb2N1cyBvbnRvIHRoZSBnaXZlbiBlbGVtZW50LiBCeSBkZWZhdWx0IHdlIGRlbGVnYXRlIHRoaXMgdG8gdGhlCisJICogZWxlbWVudHMgaW1wbGVtZW50YXRpb24ncyBARm9jdXMgbWV0aG9kIChpZiBhbnkpLiBJZiBubyBzdWNoIG1ldGhvZCBleGlzdHMgd2UgZGVsZWdhdGUgdGhlCisJICogdGhlIHJlbmRlcmVyJ3MgJ2ZvcmNlRm9jdXMnIG1ldGhvZC4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICovCisJcHVibGljIHZvaWQgZm9jdXNHdWkoTVVJRWxlbWVudCBlbGVtZW50KTsKKworCS8qKgorCSAqIFJ1biB0aGUgVUkuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgaW5pdGlhbCBVSSBhbmQgKGlmIG5lY2Vzc2FyeSkKKwkgKiBzcGlubmluZyB0aGUgZXZlbnQgbG9vcCBmb3IgdGhlIGxpZmUgb2YgdGhlIGFwcGxpY2F0aW9uLgorCSAqCisJICogQHBhcmFtIHVpUm9vdAorCSAqIEBwYXJhbSBhcHBDb250ZXh0CisJICoKKwkgKiBAcmV0dXJuIFRoZSBhcHBsaWNhdGlvbidzIHJldHVybiB2YWx1ZQorCSAqLworCXB1YmxpYyBPYmplY3QgcnVuKE1BcHBsaWNhdGlvbkVsZW1lbnQgdWlSb290LCBJRWNsaXBzZUNvbnRleHQgYXBwQ29udGV4dCk7CisKKwkvKioKKwkgKiBTaHV0cyBkb3duIHRoZSBwcmVzZW50YXRpb24gZW5naW5lCisJICovCisJcHVibGljIHZvaWQgc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9JUmVzb3VyY2VVdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSVJlc291cmNlVXRpbGl0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYWRiYQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvSVJlc291cmNlVXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIHV0aWxpdHkgdGhhdCBpcyB1c2VkIHRvIGxvYWQgSW1hZ2VEZXNjJ3MgZnJvbSB7QGxpbmsgVVJJfXMKKyAqCisgKiBAcGFyYW0gPEltYWdlRGVzYz4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlVXRpbGl0aWVzPEltYWdlRGVzYz4geworCisJLyoqCisJICogTG9hZHMgYW4gSW1hZ2VEZXNjIGZyb20gdGhlIGdpdmVuIHtAbGluayBVUkl9LgorCSAqCisJICogQHBhcmFtIGljb25QYXRoCisJICogQHJldHVybiB0aGUgSW1hZ2VEZXNjIGZyb20gdGhlIGdpdmVuIFVSSSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBJbWFnZURlc2MgaW1hZ2VEZXNjcmlwdG9yRnJvbVVSSShVUkkgaWNvblBhdGgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9JV29ya2JlbmNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL0lXb3JrYmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmYwMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9JV29ya2JlbmNoLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTMgQmVzdFNvbHV0aW9uLmF0IGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBUb20gU2NoaW5kbCA8dG9tLnNjaGluZGxAYmVzdHNvbHV0aW9uLmF0PiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKKworLyoqCisgKiBBIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4KKyAqCisgKiBUaGlzIGluc3RhbmNlIGlzIHB1Ymxpc2hlZCB0aHJvdWdoOgorICogPHVsPgorICogPGxpPnRoZSB7QGxpbmsgSUVjbGlwc2VDb250ZXh0fSBvZiB0aGUgYXBwbGljYXRpb248L2xpPgorICogPGxpPnRoZSBPU0dpLVNlcnZpY2UtUmVnaXN0cnk8L2xJPgorICogPC91bD4KKyAqIDxiPkl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIGFjdGl2ZSB7QGxpbmsgSVdvcmtiZW5jaH0gaW5zdGFuY2VzIGluIG9uZQorICogT1NHaS1JbnN0YW5jZTwvYj4KKyAqCisgKiBAc2luY2UgMS4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVdvcmtiZW5jaCB7CisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciB3aGV0aGVyIHRoZSBwZXJzaXN0ZWQgc3RhdGUgc2hvdWxkIGJlIGNsZWFyZWQgb24gc3RhcnR1cCA8YnI+CisJICogPGJyPgorCSAqIFZhbHVlIGlzOiA8Y29kZT5jbGVhclBlcnNpc3RlZFN0YXRlPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX1BFUlNJU1RFRF9TVEFURSA9ICJjbGVhclBlcnNpc3RlZFN0YXRlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBhcmd1bWVudCBmb3IgdGhlIHtAbGluayBVUkl9IG9mIHRoZSByZXNvdXJjZXMgcmVmZXJlbmNlZCBmcm9tIHRoZQorCSAqIGFwcGxpY2F0aW9uIENTUyBmaWxlIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPmFwcGxpY2F0aW9uQ1NTUmVzb3VyY2VzPC9jb2RlPgorCSAqCisJICogQHNpbmNlIDAuMTIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19SRVNPVVJDRV9VUklfQVJHID0gImFwcGxpY2F0aW9uQ1NTUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBhcmd1bWVudCBmb3IgdGhlIHtAbGluayBVUkl9IG9mIHRoZSBhcHBsaWNhdGlvbiBDU1MgZmlsZSA8YnI+CisJICogPGJyPgorCSAqIFZhbHVlIGlzOiA8Y29kZT5hcHBsaWNhdGlvbkNTUzwvY29kZT4KKwkgKgorCSAqIEBzaW5jZSAwLjEyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVVJJX0FSRyA9ICJhcHBsaWNhdGlvbkNTUyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBUaGUgYXJndW1lbnQgZm9yIHRoZSB7QGxpbmsgVVJJfSBvZiB0aGUgbGlmZS1jeWNsZSBtYW5hZ2VyIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPmxpZmVDeWNsZVVSSTwvY29kZT4KKwkgKgorCSAqIEBzaW5jZSAwLjEyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUZFX0NZQ0xFX1VSSV9BUkcgPSAibGlmZUN5Y2xlVVJJIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBhcmd1bWVudCBmb3IgdGhlIHJlc291cmNlIGhhbmRsZXIgdG8gdXNlIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPm1vZGVsUmVzb3VyY2VIYW5kbGVyPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX1JFU09VUkNFX0hBTkRMRVIgPSAibW9kZWxSZXNvdXJjZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciB3aGV0aGVyIHRoZSB3b3JrYmVuY2ggc2hvdWxkIHNhdmUgYW5kIHJlc3RvcmUgaXRzIHN0YXRlIDxicj4KKwkgKiA8PGJyPgorCSAqIFZhbHVlIGlzOiA8Y29kZT5wZXJzaXN0U3RhdGU8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVF9TVEFURSA9ICJwZXJzaXN0U3RhdGUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGFyZ3VtZW50IGZvciB0aGUge0BsaW5rIFVSSX0gb2YgdGhlIGFwcGxpY2F0aW9uIHByZXNlbnRhdGlvbiA8YnI+CisJICogPGJyPgorCSAqIFZhbHVlIGlzOiA8Y29kZT5wcmVzZW50YXRpb25VUkk8L2NvZGU+CisJICoKKwkgKiBAc2luY2UgMC4xMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEFUSU9OX1VSSV9BUkcgPSAicHJlc2VudGF0aW9uVVJJIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBhcmd1bWVudCBmb3IgdGhlIHtAbGluayBVUkl9IG9mIHRoZSBhcHBsaWNhdG9uLnhtaSBmaWxlIDxicj4KKwkgKiA8YnI+CisJICogVmFsdWUgaXM6IDxjb2RlPmFwcGxpY2F0aW9uWE1JPC9jb2RlPgorCSAqCisJICogQHNpbmNlIDAuMTIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9VUklfQVJHID0gImFwcGxpY2F0aW9uWE1JIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ2xvc2UgdGhlIHdvcmtiZW5jaCBpbnN0YW5jZQorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2h1dGRvd24gc3VjY2VlZHMKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgYXBwbGljYXRpb24gbW9kZWwgZHJpdmluZyB0aGUgd29ya2JlbmNoCisJICovCisJcHVibGljIE1BcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpOworCisJLyoqCisJICogQHJldHVybiB1bmlxdWUgaWQgb2YgdGhlIGluc3RhbmNlCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogcmVzdGFydCB0aGUgd29ya2JlbmNoCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgcmVzdGFydCBpcyBhYm9ydGVkCisJICovCisJcHVibGljIGJvb2xlYW4gcmVzdGFydCgpOworCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL1NlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4ZTUzZAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEJlc3RTb2x1dGlvbi5hdCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgVG9tIFNjaGluZGwgPHRvbS5zY2hpbmRsQGJlc3Rzb2x1dGlvbi5hdD4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CisKKy8qKgorICogU2VsZWN0b3IgdG8gZmluZCBlbGVtZW50CisgKgorICogQHNpbmNlIDEuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdG9yIHsKKwkvKioKKwkgKiBDYWxsIGZvciBlYWNoIGVsZW1lbnQgdG8gZmluZCBtYXRjaGluZyBlbGVtZW50cworCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtYXRjaGVzIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gc2VsZWN0KE1BcHBsaWNhdGlvbkVsZW1lbnQgZWxlbWVudCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9VSUV2ZW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9VSUV2ZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2VkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL1VJRXZlbnRzLmphdmEKQEAgLTAsMCArMSwxNDAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5pbnRlcm5hbC5Nb2RlbFV0aWxzOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CisKKy8qKgorICogRTQgVUkgZXZlbnRzIGFuZCBldmVudCB0b3BpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZ2VuZXJhdGVkIGFuZCBoYW5kIGNyYWZ0ZWQgZXZlbnQgdG9waWMgY29uc3RhbnRzLiBUaGVyZSBhcmUgYWxzbyBoYW5kIGNyYWZ0ZWQKKyAqIHV0aWxpdHkgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIHRvcGljIHN0cmluZ3MgYW5kIHB1Ymxpc2hpbmcgZXZlbnRzLgorICoKKyAqIFdoZW4gdGhlIFVJIG1vZGVsIGNoYW5nZXMgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5HZW5Ub3BpYyBzaG91bGQgYmUgcnVuIGFzIGFuCisgKiBFY2xpcHNlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29uc29sZSByZXN1bHRzIHNob3VsZCBiZSBwYXN0ZWQgaW50byB0aGlzIGZpbGUgcmVwbGFjaW5nIHRoZSBjb2RlCisgKiBiZWxvdyB0aGUgIlBsYWNlIEdlbmVyYXRlZCBDb2RlIEhlcmUiIGNvbW1lbnQKKyAqCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBVSUV2ZW50cyB7CisKKwkvKioKKwkgKiBUb3BpYyBzZXBhcmF0b3IgY2hhcmFjdGVyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfU0VQID0gIi8iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBXaWxkIGNhcmQgY2hhcmFjdGVyIGZvciBtYXRjaGluZyBhbGwgc3ViIHRvcGljcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9TVUJfVE9QSUNTID0gIioiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBCYXNlIG5hbWUgb2YgYWxsIEU0IFVJIGV2ZW50cworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJVG9waWNCYXNlID0gIm9yZy9lY2xpcHNlL2U0L3VpIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogTmFtZSBlbGVtZW50IGZvciBhbGwgRTQgVUkgbW9kZWwgZXZlbnRzICh0aGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IEdlblRvcGljKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJTW9kZWxUb3BpY0Jhc2UgPSBVSVRvcGljQmFzZSArICIvbW9kZWwiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBOYW1lIGVsZW1lbnQgZm9yIEU0IFJlbmRlcmVyIGV2ZW50cworCSAqCisJICogQHNpbmNlIDEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJUmVuZGVyZXJUb3BpY0Jhc2UgPSBVSVRvcGljQmFzZSArICIvcmVuZGVyZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBFdmVudCBzZW50IHdoZW4gYSBlbmFibGVkIHVwZGF0ZSBpcyByZXF1ZXN0ZWQgZm9yIHRvb2wtaXRlbXMuCisJICogPHA+CisJICogQXMgYSB2YWx1ZSB5b3UgbWF5IHBhc3MgaW4gdG8gdGhlIHtAbGluayBJRXZlbnRCcm9rZXIjREFUQX06CisJICogPHVsPgorCSAqIDxsaT50aGUgc3BlY2lhbCB2YWx1ZSB7QGxpbmsgI0FMTF9FTEVNRU5UX0lEfSB0byByZXF1ZXN0IGNoYW5nZXMgb2YgYWxsCisJICogYXBwbGljYWJsZSBlbGVtZW50cyAodGhlIGRlZmF1bHQpPC9saT4KKwkgKiA8bGk+dGhlIHtAbGluayBNQXBwbGljYXRpb25FbGVtZW50I2dldEVsZW1lbnRJZCgpfSBvZiB0aGUgZWxlbWVudCB0bworCSAqIGNoZWNrPC9saT4KKwkgKiA8bGk+aW5zdGFuY2Ugb2Yge0BsaW5rIFNlbGVjdG9yfTwvbGk+CisJICogPC91bD4KKwkgKiA8L3A+CisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9FTkFCTEVNRU5UX1VQREFURV9UT1BJQyA9IFVJUmVuZGVyZXJUb3BpY0Jhc2UKKwkJCSsgIi9yZXF1ZXN0RW5hYmxlbWVudFVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFNwZWNpYWwgaWQgcGFzc2VkIHRvIGZvcmNlIGFsbCBlbGVtZW50cyB0byBiZSBjaGVja2VkCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0VMRU1FTlRfSUQgPSAiQUxMIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogRTQgVUkgRXZlbnQgVHlwZXMuIEFkZCBhcHByb3ByaWF0ZSB1dGlsaXR5IGlzPFRlc3Q+IG1ldGhvZCBiZWxvdyBpZiBuZXcgdHlwZXMgYWRkZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFdmVudFR5cGVzIHsKKwkJLyoqCisJCSAqIENyZWF0aW9uIGV2ZW50CisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEUgPSAiQ1JFQVRFIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogU2V0IGV2ZW50CisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVQgPSAiU0VUIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQWRkIGV2ZW50OiB2YWx1ZSBhZGRlZCBpcyB7QGxpbmsgRXZlbnRUYWdzI05FV19WQUxVRX0uCisJCSAqCisJCSAqIEBzZWUgVUlFdmVudHMjaXNBREQoRXZlbnQpCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQWRkIG1hbnkgaXRlbXM6IHZhbHVlcyBhZGRlZCBhcmUge0BsaW5rIEV2ZW50VGFncyNORVdfVkFMVUV9CisJCSAqCisJCSAqIEBzZWUgVUlFdmVudHMjaXNBREQoRXZlbnQpCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTUFOWSA9ICJBRERfTUFOWSI7Ly8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogUmVtb3ZlIGV2ZW50OiB2YWx1ZSByZW1vdmVkIGlzIHtAbGluayBFdmVudFRhZ3MjT0xEX1ZBTFVFfQorCQkgKgorCQkgKiBAc2VlIFVJRXZlbnRzI2lzUkVNT1ZFKEV2ZW50KQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gIlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKKwkJLyoqCisJCSAqIFJlbW92ZSBtYW55IGV2ZW50OiB0aGUgdmFsdWVzIHJlbW92ZWQgYXJlIHRoZSB7QGxpbmsgRXZlbnRUYWdzI09MRF9WQUxVRX0gKGEgY29sbGVjdGlvbikuCisJCSAqIFRoZSBmb3JtZXIgcG9zaXRpb25zIG9mIHRoZSByZW1vdmVkIHZhbHVlcyBhcmUgcHJvdmlkZWQgYXMgYW4gaW50ZWdlciBhcnJheSBpbgorCQkgKiB7QGxpbmsgRXZlbnRUYWdzI1BPU0lUSU9OfS4KKwkJICoKKwkJICogQHNlZSBVSUV2ZW50cyNpc1JFTU9WRShFdmVudCkKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9NQU5ZID0gIlJFTU9WRV9NQU5ZIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogVmFsdWUgbW92ZWQ6IHRoZSB2YWx1ZSBtb3ZlZCBpcyB0aGUge0BsaW5rIEV2ZW50VGFncyNORVdfVkFMVUV9LCB0aGUgb2xkIHBvc2l0aW9uIGlzCisJCSAqIHtAbGluayBFdmVudFRhZ3MjT0xEX1ZBTFVFfSwgYW5kIHRoZSBuZXcgcG9zaXRpb24gaW4ge0BsaW5rIEV2ZW50VGFncyNQT1NJVElPTn0uCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIk1PVkUiOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQHBhcmFtIGV2ZW50CisJICogICAgICAgICAgICBBbiBPU0dJIGV2ZW50IHJlcHJlc2VudGluZyBhIFVJRXZlbnQKKwkgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgYW4gYWRkIGV2ZW50IChpLmUuLCB7QGxpbmsgRXZlbnRUeXBlcyNBRER9IG9yCisJICogICAgICAgICB7QGxpbmsgRXZlbnRUeXBlcyNBRERfTUFOWX0pLCBvciBmYWxzZSBvdGhlcndpc2UuCisJICogQHNlZSBVSUV2ZW50cy5FdmVudFRhZ3MjTkVXX1ZBTFVFCisJICogQHNlZSAjYXNJdGVyYWJsZShFdmVudCwgU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FERChFdmVudCBldmVudCkgeworCQlPYmplY3QgdHlwZSA9IGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5UWVBFKTsKKwkJcmV0dXJuIFVJRXZlbnRzLkV2ZW50VHlwZXMuQURELmVxdWFscyh0eXBlKSB8fCBVSUV2ZW50cy5FdmVudFR5cGVzLkFERF9NQU5ZLmVxdWFscyh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIEFuIE9TR0kgZXZlbnQgcmVwcmVzZW50aW5nIGEgVUlFdmVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIHJlbW92ZSBldmVudCAoaS5lLiwge0BsaW5rIEV2ZW50VHlwZXMjUkVNT1ZFfSBvcgorCSAqICAgICAgICAge0BsaW5rIEV2ZW50VHlwZXMjUkVNT1ZFX01BTll9KSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIEBzZWUgVUlFdmVudHMuRXZlbnRUYWdzI09MRF9WQUxVRQorCSAqIEBzZWUgI2FzSXRlcmFibGUoRXZlbnQsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSRU1PVkUoRXZlbnQgZXZlbnQpIHsKKwkJT2JqZWN0IHR5cGUgPSBldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuVFlQRSk7CisJCXJldHVybiBVSUV2ZW50cy5FdmVudFR5cGVzLlJFTU9WRS5lcXVhbHModHlwZSkKKwkJCQl8fCBVSUV2ZW50cy5FdmVudFR5cGVzLlJFTU9WRV9NQU5ZLmVxdWFscyh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIEFuIE9TR0kgZXZlbnQgcmVwcmVzZW50aW5nIGEgVUlFdmVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIHNldCBldmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NFVChFdmVudCBldmVudCkgeworCQlyZXR1cm4gVUlFdmVudHMuRXZlbnRUeXBlcy5TRVQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KFVJRXZlbnRzLkV2ZW50VGFncy5UWVBFKSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGV2ZW50CisJICogICAgICAgICAgICBBbiBPU0dJIGV2ZW50IHJlcHJlc2VudGluZyBhIFVJRXZlbnQKKwkgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgYSBjcmVhdGUgZXZlbnQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDUkVBVEUoRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIFVJRXZlbnRzLkV2ZW50VHlwZXMuQ1JFQVRFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eShVSUV2ZW50cy5FdmVudFRhZ3MuVFlQRSkpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgY29udGFpbnMge0Bjb2RlIG99LiBJbnRlbmRlZCBhcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IKKwkgKiB7QGxpbmsgRXZlbnRUeXBlcyNBRER9LCB7QGxpbmsgRXZlbnRUeXBlcyNBRERfTUFOWX0sIHtAbGluayBFdmVudFR5cGVzI1JFTU9WRX0sIGFuZAorCSAqIHtAbGluayBFdmVudFR5cGVzI1JFTU9WRV9NQU5ZfS4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBhIGNvbnRhaW5lciAoZS5nLiwgYSBjb2xsZWN0aW9uIG9yCisJICogYXJyYXkpLCB0aGVuIHJldHVybiB0cnVlIHRoZW4gaWYge0Bjb2RlIGNvbnRhaW5lcn0gaXMgZXF1YWwgdG8ge0Bjb2RlIG99LgorCSAqCisJICogQHBhcmFtIGV2ZW50CisJICogICAgICAgICAgICB0aGUgZXZlbnQKKwkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQorCSAqIEBwYXJhbSBvCisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciBjb250YWlubWVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgdmFsdWUgY29udGFpbnMge0Bjb2RlIG99IG9yIGlzIGVxdWFsIHRvIHtAY29kZSBvfQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhFdmVudCBldmVudCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG8pIHsKKwkJT2JqZWN0IGNvbnRhaW5lciA9IGV2ZW50LmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4gJiYgKChDb2xsZWN0aW9uPD8+KSBjb250YWluZXIpLmNvbnRhaW5zKG8pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IChPYmplY3RbXSkgY29udGFpbmVyKSB7CisJCQkJaWYgKG8uZXF1YWxzKGVsZW1lbnQpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gby5lcXVhbHMoY29udGFpbmVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHByb3ZpZGVkIGV2ZW50IHByb3BlcnR5IGFzIGFuIGl0ZXJhYmxlLiBJZiBhbHJlYWR5IGEgY29sbGVjdGlvbiwgcmV0dXJuIHRoZQorCSAqIGNvbGxlY3Rpb24uCisJICoKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIHRoZSBldmVudCBvYmplY3QKKwkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIGNvbGxlY3Rpb24gb3ZlciB0aGUgcHJvcGVydHkgZWxlbWVudHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPD8+IGFzSXRlcmFibGUoRXZlbnQgZXZlbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJT2JqZWN0IG8gPSBldmVudC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworCQlyZXR1cm4gbyBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4gPyAoQ29sbGVjdGlvbjw/PikgbyA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihvKTsKKwl9CisKKwkvKioKKwkgKiBFNCBVSSBFdmVudCBhcmd1bWVudCBhdHRyaWJ1dGUga2V5cy4gVGhlc2UgYXJlIHVzZWQgYXMga2V5cyBmb3IgdGhlIGV2ZW50IGFyZ3VtZW50cyBtYXAuIEVhY2gKKwkgKiBldmVudCBtYXkgaGF2ZSBub25lLCBzb21lLCBvciBhbGwgYXJndW1lbnRzIHNldC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFdmVudFRhZ3MgeworCQkvKioKKwkJICogVGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhlIGV2ZW50IHRvIGJlIHB1Ymxpc2hlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVCA9ICJDaGFuZ2VkRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKKwkJLyoqCisJCSAqIFRoZSB3aWRnZXQgdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50CisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSURHRVQgPSAiV2lkZ2V0IjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogVGhlIGV2ZW50IHR5cGUgQHNlZSBVSUV2ZW50cy5FdmVudFR5cGVzCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gIkV2ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJLyoqCisJCSAqIFRoZSBhdHRyaWJ1dGUgbmFtZQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUTkFNRSA9ICJBdHROYW1lIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogVGhlIG9sZCB2YWx1ZQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1ZBTFVFID0gIk9sZFZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogVGhlIG5ldyB2YWx1ZQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1ZBTFVFID0gIk5ld1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogVGhlIHBvc2l0aW9uIChpZiBhcHBsaWNhYmxlKSBvZiB0aGUgY2hhbmdlIHdpdGhpbiB0aGUgbGlzdC4KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU0lUSU9OID0gIlBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEU0IFVJIGxpZmUgY3ljbGUgZXZlbnRzLiBUaGVzZSBldmVudHMgYXJlIGV4cGxpY2l0bHkgcHVibGlzaGVkIGJ5IHNwZWNpZmljIG9wZXJhdGlvbnMuIFRoZXkKKwkgKiBhcmUgbm90IGRpcmVjdGx5IGdlbmVyYXRlZCBieSBVSSBtb2RlbCBjaGFuZ2VzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFVJTGlmZUN5Y2xlIHsKKwkJLyoqCisJCSAqIEJhc2UgbmFtZSBmb3IgYWxsIFVJIGxpZmUgY3ljbGUgZXZlbnRzCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9IFVJVG9waWNCYXNlICsgIi9MaWZlQ3ljbGUiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIFNlbnQgd2hlbiBhIFVJRWxlbWVudCBpcyBicm91Z2h0IHRvIHRvcAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJTkdUT1RPUCA9IFRPUElDICsgVE9QSUNfU0VQICsgImJyaW5nVG9Ub3AiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIFNlbnQgd2hlbiBhbiBNUGFydCBpcyBhY3RpdmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRFID0gVE9QSUMgKyBUT1BJQ19TRVAgKyAiYWN0aXZhdGUiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIFNlbnQgd2hlbiBhIHBlcnNwZWN0aXZlIGlzIHNhdmVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRV9TQVZFRCA9IFRPUElDICsgVE9QSUNfU0VQICsgInBlcnBTYXZlZCI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogU2VudCB3aGVuIGEgcGVyc3BlY3RpdmUgaXMgb3BlbmVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRV9PUEVORUQgPSBUT1BJQyArIFRPUElDX1NFUCArICJwZXJzcE9wZW5lZCI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogU2VudCB3aGVuIGEgcGVyc3BlY3RpdmUgaXMgcmVzZXQKKwkJICoKKwkJICogQHNpbmNlIDEuMgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfUkVTRVQgPSBUT1BJQyArIFRPUElDX1NFUCArICJwZXJzcFJlc2V0IjsgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBTZW50IHdoZW4gYXBwbGljYXRpb24gc3RhcnR1cCBpcyBjb21wbGV0ZQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1NUQVJUVVBfQ09NUExFVEUgPSBUT1BJQyArIFRPUElDX1NFUCArICJhcHBTdGFydHVwQ29tcGxldGUiOyAvLyROT04tTkxTLTEkCisJCS8qKgorCQkgKiBTZW50IHdoZW4gYXBwbGljYXRpb24gc2h1dGRvd24gaXMgc3RhcnRpbmcKKwkJICoKKwkJICogQHNpbmNlIDEuMQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1NIVVRET1dOX1NUQVJURUQgPSBUT1BJQyArIFRPUElDX1NFUCArICJhcHBTaHV0ZG93blN0YXJ0ZWQiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIFNlbnQgd2hlbiB0aGUgdGhlbWUgaXMgY2hhbmdlZAorCQkgKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVNRV9DSEFOR0VEID0gVE9QSUMgKyBUT1BJQ19TRVAgKyAidGhlbWVDaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBTZW50IHdoZW4gdGhlIHRoZW1lIGRlZmluaXRpb24gaXMgY2hhbmdlZAorCQkgKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVNRV9ERUZJTklUSU9OX0NIQU5HRUQgPSBUT1BJQyArIFRPUElDX1NFUAorCQkJCSsgInRoZW1lRGVmaW5pdGlvbkNoYW5nZWQiOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogUHVibGlzaCB0aGUgdG9waWMgdG8gdGhlIGNoYW5nZWRFbGVtZW50cyBnbG9iYWwgZXZlbnQgYnVzLiBUaGUgY2hhbmdlZEVsZW1lbnQgaXMgYWRkZWQgdGhlCisJICogdGhlIEV2ZW50VGFncy5FTEVNRU5UIHRhZy4KKwkgKgorCSAqIEBwYXJhbSB0b3BpYworCSAqICAgICAgICAgICAgdG8gYnJvYWRjYXN0CisJICogQHBhcmFtIGNoYW5nZWRFbGVtZW50CisJICogICAgICAgICAgICB0aGUgZWxlbWVudCB0aGF0IGNoYW5nZWQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IGlzIHB1Ymxpc2hlZCBjb3JyZWN0bHksIGZhbHNlIG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwdWJsaXNoRXZlbnQoU3RyaW5nIHRvcGljLCBNVUlFbGVtZW50IGNoYW5nZWRFbGVtZW50KSB7CisJCWlmICh0b3BpYyA9PSBudWxsIHx8IHRvcGljLmxlbmd0aCgpID09IDAgfHwgY2hhbmdlZEVsZW1lbnQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigxKTsKKwkJYXJnTWFwLnB1dChFdmVudFRhZ3MuRUxFTUVOVCwgY2hhbmdlZEVsZW1lbnQpOworCQlyZXR1cm4gcHVibGlzaEV2ZW50KHRvcGljLCBhcmdNYXApOworCX0KKworCS8qKgorCSAqIFB1Ymxpc2ggdGhlIHRvcGljIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyB0byB0aGUgZ2xvYmFsIGV2ZW50IGJ1cy4gYXJnTWFwIE1VU1QgY29udGFpbiBhbgorCSAqIEV2ZW50VGFncy5FTEVNRU5UIGFyZ3VtZW50IHRoYXQgaXMgYW4gTVVJRWxlbWVudC4gdGhlIGNvbnRhaW5lZCBNVUlFbGVtZW50IHdpbGwgYmUgdXNlZCB0bworCSAqIGRldGVybWluZSB0aGUgZXZlbnQgYnVzIHRvIHB1Ymxpc2ggdG8uCisJICoKKwkgKiBAcGFyYW0gdG9waWMKKwkgKiAgICAgICAgICAgIHRvIGJyb2FkY2FzdAorCSAqIEBwYXJhbSBhcmdNYXAKKwkgKiAgICAgICAgICAgIGFyZ3VtZW50cyBtYXAgd2l0aCBhIG1pbmltdW0gb2YgYSBjaGFuZ2VkRWxlbWVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgcHVibGlzaGVkIGNvcnJlY3RseSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHB1Ymxpc2hFdmVudChTdHJpbmcgdG9waWMsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJnTWFwKSB7CisJCWlmICh0b3BpYyA9PSBudWxsIHx8IHRvcGljLmxlbmd0aCgpID09IDAgfHwgYXJnTWFwID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJT2JqZWN0IHVpRWxlbWVudCA9IGFyZ01hcC5nZXQoRXZlbnRUYWdzLkVMRU1FTlQpOworCQlpZiAodWlFbGVtZW50ID09IG51bGwgfHwgISh1aUVsZW1lbnQgaW5zdGFuY2VvZiBNVUlFbGVtZW50KSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlJRWNsaXBzZUNvbnRleHQgY29udGV4dCA9IHVpRWxlbWVudCBpbnN0YW5jZW9mIE1BcHBsaWNhdGlvbiA/ICgoTUFwcGxpY2F0aW9uKSB1aUVsZW1lbnQpCisJCQkJLmdldENvbnRleHQoKSA6IE1vZGVsVXRpbHMuZ2V0Q29udGFpbmluZ0NvbnRleHQoKE1VSUVsZW1lbnQpIHVpRWxlbWVudCk7CisJCWlmIChjb250ZXh0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJSUV2ZW50QnJva2VyIGV2ZW50QnJva2VyID0gY29udGV4dC5nZXQoSUV2ZW50QnJva2VyLmNsYXNzKTsKKwkJaWYgKGV2ZW50QnJva2VyID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcmV0dXJuIGV2ZW50QnJva2VyLnNlbmQodG9waWMsIGFyZ01hcCk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCUBEZXByZWNhdGVkCisJLyoqCisJICogQGRlcHJlY2F0ZWQgU3Vic2NyaWJlIHRvIGFuIGFsbCBhdHRyaWJ1dGUgZXZlbnRzIG9uIGEgdG9waWMgdXNpbmcgdGhlIFRPUElDX0FMTCBjb25zdGFudCBkaXJlY3RseQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9waWMoU3RyaW5nIHRvcGljKSB7CisJCXJldHVybiB0b3BpYyArIFRPUElDX1NFUCArIEFMTF9TVUJfVE9QSUNTOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlARGVwcmVjYXRlZAorCS8qKgorCSAqIEBkZXByZWNhdGVkIFN1YnNjcmliZSB0byBhbiBhdHRyaWJ1dGUgZXZlbnQgYnkgdXNpbmcgdGhlIFRPUElDXzxhdHRyaWJ1dGU+IGNvbnN0YW50IGRpcmVjdGx5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb3BpYyhTdHJpbmcgdG9waWMsIFN0cmluZyBhdHRyTmFtZSkgeworCQlyZXR1cm4gdG9waWMgKyBUT1BJQ19TRVAgKyBhdHRyTmFtZSArIFRPUElDX1NFUCArIEFMTF9TVUJfVE9QSUNTOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlARGVwcmVjYXRlZAorCS8qKgorCSAqIEBkZXByZWNhdGVkIFN1YnNjcmliaW5nIHRvIGEgcGFydGljdWxhciBldmVudCB0eXBlIG9uIGEgdG9waWMgYXR0cmlidXRlIGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb3BpYyhTdHJpbmcgdG9waWMsIFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGV2ZW50VHlwZSkgeworCQlyZXR1cm4gdG9waWMgKyBUT1BJQ19TRVAgKyBhdHRyTmFtZSArIFRPUElDX1NFUCArIGV2ZW50VHlwZTsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFTkVSQVRFRCBDT0RFISEKKwkgKgorCSAqIE5PVEU6ICpBbGwqIG5vbi1nZW5lcmF0ZWQgY29kZSBtdXN0IGJlIGFib3ZlIHRoaXMgY29tbWVudC4KKwkgKgorCSAqIFJlcGxhY2UgdGhlIGdlbmVyYXRlZCBjb2RlIGJlbG93IHRoaXMgY29tbWVudCB3aXRoIHRoZSBvdXRwdXQgb2YgR2VuVG9waWMuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBCaW5kaW5nQ29udGV4dCB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQmluZGluZ0NvbnRleHQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ0hJTERSRU4gPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQmluZGluZ0NvbnRleHQvY2hpbGRyZW4vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfREVTQ1JJUFRJT04gPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQmluZGluZ0NvbnRleHQvZGVzY3JpcHRpb24vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfTkFNRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nQ29udGV4dC9uYW1lLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU4gPSAiY2hpbGRyZW4iOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEJpbmRpbmdUYWJsZSB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nVGFibGUiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0JpbmRpbmdUYWJsZS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19CSU5ESU5HQ09OVEVYVCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nVGFibGUvYmluZGluZ0NvbnRleHQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQklORElOR1MgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQmluZGluZ1RhYmxlL2JpbmRpbmdzLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR0NPTlRFWFQgPSAiYmluZGluZ0NvbnRleHQiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdTID0gImJpbmRpbmdzIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBCaW5kaW5nVGFibGVDb250YWluZXIgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQmluZGluZ1RhYmxlQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nVGFibGVDb250YWluZXIvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQklORElOR1RBQkxFUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nVGFibGVDb250YWluZXIvYmluZGluZ1RhYmxlcy8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19ST09UQ09OVEVYVCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5nVGFibGVDb250YWluZXIvcm9vdENvbnRleHQvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HVEFCTEVTID0gImJpbmRpbmdUYWJsZXMiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RDT05URVhUID0gInJvb3RDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBCaW5kaW5ncyB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9CaW5kaW5ncyI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQmluZGluZ3MvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQklORElOR0NPTlRFWFRTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0JpbmRpbmdzL2JpbmRpbmdDb250ZXh0cy8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdDT05URVhUUyA9ICJiaW5kaW5nQ29udGV4dHMiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENhdGVnb3J5IHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9DYXRlZ29yeS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19ERVNDUklQVElPTiA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9DYXRlZ29yeS9kZXNjcmlwdGlvbi8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19OQU1FID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NhdGVnb3J5L25hbWUvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogQHNpbmNlIDEuMQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfTE9DQUxJWkVEX05BTUUgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQ2F0ZWdvcnkvbG9jYWxpemVkTmFtZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpFRF9OQU1FID0gImxvY2FsaXplZE5hbWUiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvbW1hbmQgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQ29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQ29tbWFuZC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19DQVRFR09SWSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9Db21tYW5kL2NhdGVnb3J5LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTU1BTkROQU1FID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NvbW1hbmQvY29tbWFuZE5hbWUvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfREVTQ1JJUFRJT04gPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQ29tbWFuZC9kZXNjcmlwdGlvbi8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19QQVJBTUVURVJTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NvbW1hbmQvcGFyYW1ldGVycy8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19MT0NBTElaRURfQ09NTUFORE5BTUUgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQ29tbWFuZC9sb2NhbGl6ZWRDb21tYW5kTmFtZS8qIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQHNpbmNlIDEuMQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfTE9DQUxJWkVEX0RFU0NSSVBUSU9OID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NvbW1hbmQvbG9jYWxpemVkRGVzY3JpcHRpb24vKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORE5BTUUgPSAiY29tbWFuZE5hbWUiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJTID0gInBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpFRF9DT01NQU5ETkFNRSA9ICJsb2NhbGl6ZWRDb21tYW5kTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpFRF9ERVNDUklQVElPTiA9ICJsb2NhbGl6ZWREZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ29tbWFuZFBhcmFtZXRlciB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9Db21tYW5kUGFyYW1ldGVyIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9Db21tYW5kUGFyYW1ldGVyLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX05BTUUgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvQ29tbWFuZFBhcmFtZXRlci9uYW1lLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX09QVElPTkFMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NvbW1hbmRQYXJhbWV0ZXIvb3B0aW9uYWwvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfVFlQRUlEID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0NvbW1hbmRQYXJhbWV0ZXIvdHlwZUlkLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTCA9ICJvcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRUlEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSGFuZGxlciB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9IYW5kbGVyLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTU1BTkQgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvSGFuZGxlci9jb21tYW5kLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORCA9ICJjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBIYW5kbGVyQ29udGFpbmVyIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0hhbmRsZXJDb250YWluZXIiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0hhbmRsZXJDb250YWluZXIvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfSEFORExFUlMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvSGFuZGxlckNvbnRhaW5lci9oYW5kbGVycy8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJTID0gImhhbmRsZXJzIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBLZXlCaW5kaW5nIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0tleUJpbmRpbmciOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0tleUJpbmRpbmcvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ09NTUFORCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9LZXlCaW5kaW5nL2NvbW1hbmQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfUEFSQU1FVEVSUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9LZXlCaW5kaW5nL3BhcmFtZXRlcnMvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EID0gImNvbW1hbmQiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUlMgPSAicGFyYW1ldGVycyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgS2V5U2VxdWVuY2UgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvY29tbWFuZHMvS2V5U2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0tleVNlcXVlbmNlLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0tFWVNFUVVFTkNFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL0tleVNlcXVlbmNlL2tleVNlcXVlbmNlLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU0VRVUVOQ0UgPSAia2V5U2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFBhcmFtZXRlciB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9jb21tYW5kcy9QYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL1BhcmFtZXRlci8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19OQU1FID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL1BhcmFtZXRlci9uYW1lLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1ZBTFVFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2NvbW1hbmRzL1BhcmFtZXRlci92YWx1ZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFBhcnREZXNjcmlwdG9yIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnREZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0RGVzY3JpcHRvci8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTExPV01VTFRJUExFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnREZXNjcmlwdG9yL2FsbG93TXVsdGlwbGUvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ0FURUdPUlkgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYmFzaWMvUGFydERlc2NyaXB0b3IvY2F0ZWdvcnkvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ0xPU0VBQkxFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnREZXNjcmlwdG9yL2Nsb3NlYWJsZS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19DT05UUklCVVRJT05VUkkgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYmFzaWMvUGFydERlc2NyaXB0b3IvY29udHJpYnV0aW9uVVJJLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0RFU0NSSVBUSU9OID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnREZXNjcmlwdG9yL2Rlc2NyaXB0aW9uLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0RJUlRZQUJMRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0RGVzY3JpcHRvci9kaXJ0eWFibGUvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfTUVOVVMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYmFzaWMvUGFydERlc2NyaXB0b3IvbWVudXMvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfVE9PTEJBUiA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0RGVzY3JpcHRvci90b29sYmFyLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0xPQ0FMSVpFRF9ERVNDUklQVElPTiA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0RGVzY3JpcHRvci9sb2NhbGl6ZWREZXNjcmlwdGlvbi8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XTVVMVElQTEUgPSAiYWxsb3dNdWx0aXBsZSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFQUJMRSA9ICJjbG9zZWFibGUiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTlVSSSA9ICJjb250cmlidXRpb25VUkkiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJUWUFCTEUgPSAiZGlydHlhYmxlIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VUyA9ICJtZW51cyI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUiA9ICJ0b29sYmFyIjsgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTElaRURfREVTQ1JJUFRJT04gPSAibG9jYWxpemVkRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFBhcnREZXNjcmlwdG9yQ29udGFpbmVyIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnREZXNjcmlwdG9yQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0RGVzY3JpcHRvckNvbnRhaW5lci8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19ERVNDUklQVE9SUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0RGVzY3JpcHRvckNvbnRhaW5lci9kZXNjcmlwdG9ycy8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JTID0gImRlc2NyaXB0b3JzIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEBzaW5jZSAxLjEKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQXBwbGljYXRpb24geworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vQXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FERE9OUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi9hZGRvbnMvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ0FURUdPUklFUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi9jYXRlZ29yaWVzLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTU1BTkRTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uL2NvbW1hbmRzLyoiOyAvLyROT04tTkxTLTEkCisJCS8qKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19ESUFMT0dTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uL2RpYWxvZ3MvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERPTlMgPSAiYWRkb25zIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTID0gImNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRTID0gImNvbW1hbmRzIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQHNpbmNlIDEuMQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HUyA9ICJkaWFsb2dzIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vQXBwbGljYXRpb25FbGVtZW50IjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkVsZW1lbnQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ09OVFJJQlVUT1JVUkkgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vQXBwbGljYXRpb25FbGVtZW50L2NvbnRyaWJ1dG9yVVJJLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0VMRU1FTlRJRCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkVsZW1lbnQvZWxlbWVudElkLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1BFUlNJU1RFRFNUQVRFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRWxlbWVudC9wZXJzaXN0ZWRTdGF0ZS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19UQUdTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRWxlbWVudC90YWdzLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1RSQU5TSUVOVERBVEEgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vQXBwbGljYXRpb25FbGVtZW50L3RyYW5zaWVudERhdGEvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRPUlVSSSA9ICJjb250cmlidXRvclVSSSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElEID0gImVsZW1lbnRJZCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVEU1RBVEUgPSAicGVyc2lzdGVkU3RhdGUiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR1MgPSAidGFncyI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJRU5UREFUQSA9ICJ0cmFuc2llbnREYXRhIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDb250cmlidXRpb24geworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9Db250cmlidXRpb24vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ09OVFJJQlVUSU9OVVJJID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0NvbnRyaWJ1dGlvbi9jb250cmlidXRpb25VUkkvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfT0JKRUNUID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL0NvbnRyaWJ1dGlvbi9vYmplY3QvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRJT05VUkkgPSAiY29udHJpYnV0aW9uVVJJIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1QgPSAib2JqZWN0IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTdHJpbmdUb09iamVjdE1hcCB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9TdHJpbmdUb09iamVjdE1hcCI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vU3RyaW5nVG9PYmplY3RNYXAvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfS0VZID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL1N0cmluZ1RvT2JqZWN0TWFwL2tleS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19WQUxVRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9TdHJpbmdUb09iamVjdE1hcC92YWx1ZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTdHJpbmdUb1N0cmluZ01hcCB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9TdHJpbmdUb1N0cmluZ01hcCI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYXBwbGljYXRpb24vU3RyaW5nVG9TdHJpbmdNYXAvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfS0VZID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FwcGxpY2F0aW9uL1N0cmluZ1RvU3RyaW5nTWFwL2tleS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19WQUxVRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hcHBsaWNhdGlvbi9TdHJpbmdUb1N0cmluZ01hcC92YWx1ZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZSB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hZHZhbmNlZC9QZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYWR2YW5jZWQvUGVyc3BlY3RpdmUvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfV0lORE9XUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hZHZhbmNlZC9QZXJzcGVjdGl2ZS93aW5kb3dzLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XUyA9ICJ3aW5kb3dzIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQbGFjZWhvbGRlciB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9hZHZhbmNlZC9QbGFjZWhvbGRlciI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYWR2YW5jZWQvUGxhY2Vob2xkZXIvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ0xPU0VBQkxFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2FkdmFuY2VkL1BsYWNlaG9sZGVyL2Nsb3NlYWJsZS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19SRUYgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYWR2YW5jZWQvUGxhY2Vob2xkZXIvcmVmLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VBQkxFID0gImNsb3NlYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGID0gInJlZiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUGFydCB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0IjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NMT1NFQUJMRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0L2Nsb3NlYWJsZS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19ERVNDUklQVElPTiA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0L2Rlc2NyaXB0aW9uLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX01FTlVTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnQvbWVudXMvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfVE9PTEJBUiA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9QYXJ0L3Rvb2xiYXIvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogQHNpbmNlIDEuMQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfTE9DQUxJWkVEX0RFU0NSSVBUSU9OID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1BhcnQvbG9jYWxpemVkRGVzY3JpcHRpb24vKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRUFCTEUgPSAiY2xvc2VhYmxlIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVVMgPSAibWVudXMiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xCQVIgPSAidG9vbGJhciI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogQHNpbmNlIDEuMQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxJWkVEX0RFU0NSSVBUSU9OID0gImxvY2FsaXplZERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEBzaW5jZSAxLjEKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVHJpbUJhciB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9UcmltQmFyIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9UcmltQmFyLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1BFTkRJTkdDTEVBTlVQID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1RyaW1CYXIvcGVuZGluZ0NsZWFudXAvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRU5ESU5HQ0xFQU5VUCA9ICJwZW5kaW5nQ2xlYW51cCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVHJpbW1lZFdpbmRvdyB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9UcmltbWVkV2luZG93IjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9UcmltbWVkV2luZG93LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1RSSU1CQVJTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1RyaW1tZWRXaW5kb3cvdHJpbUJhcnMvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUklNQkFSUyA9ICJ0cmltQmFycyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgV2luZG93IHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1dpbmRvdyI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYmFzaWMvV2luZG93LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0hFSUdIVCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9XaW5kb3cvaGVpZ2h0LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX01BSU5NRU5VID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1dpbmRvdy9tYWluTWVudS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19TSEFSRURFTEVNRU5UUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9XaW5kb3cvc2hhcmVkRWxlbWVudHMvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfV0lEVEggPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYmFzaWMvV2luZG93L3dpZHRoLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1dJTkRPV1MgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvYmFzaWMvV2luZG93L3dpbmRvd3MvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfWCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9iYXNpYy9XaW5kb3cveC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19ZID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL2Jhc2ljL1dpbmRvdy95LyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTk1FTlUgPSAibWFpbk1lbnUiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFREVMRU1FTlRTID0gInNoYXJlZEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XUyA9ICJ3aW5kb3dzIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYID0gIngiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFkgPSAieSI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ29udGV4dCB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9Db250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9Db250ZXh0LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTlRFWFQgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvQ29udGV4dC9jb250ZXh0LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1BST1BFUlRJRVMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvQ29udGV4dC9wcm9wZXJ0aWVzLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1ZBUklBQkxFUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9Db250ZXh0L3ZhcmlhYmxlcy8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJMRVMgPSAidmFyaWFibGVzIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDb3JlRXhwcmVzc2lvbiB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9Db3JlRXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvQ29yZUV4cHJlc3Npb24vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ09SRUVYUFJFU1NJT04gPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvQ29yZUV4cHJlc3Npb24vY29yZUV4cHJlc3Npb24vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ09SRUVYUFJFU1NJT05JRCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9Db3JlRXhwcmVzc2lvbi9jb3JlRXhwcmVzc2lvbklkLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRUVYUFJFU1NJT04gPSAiY29yZUV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVFWFBSRVNTSU9OSUQgPSAiY29yZUV4cHJlc3Npb25JZCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRGlydHlhYmxlIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0RpcnR5YWJsZSI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvRGlydHlhYmxlLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0RJUlRZID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0RpcnR5YWJsZS9kaXJ0eS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUlRZID0gImRpcnR5IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50Q29udGFpbmVyIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0VsZW1lbnRDb250YWluZXIiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0VsZW1lbnRDb250YWluZXIvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ0hJTERSRU4gPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvRWxlbWVudENvbnRhaW5lci9jaGlsZHJlbi8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19TRUxFQ1RFREVMRU1FTlQgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvRWxlbWVudENvbnRhaW5lci9zZWxlY3RlZEVsZW1lbnQvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTiA9ICJjaGlsZHJlbiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURURFTEVNRU5UID0gInNlbGVjdGVkRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgR2VuZXJpY1RpbGUgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvR2VuZXJpY1RpbGUiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0dlbmVyaWNUaWxlLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0hPUklaT05UQUwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvR2VuZXJpY1RpbGUvaG9yaXpvbnRhbC8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPUklaT05UQUwgPSAiaG9yaXpvbnRhbCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgR2VuZXJpY1RyaW1Db250YWluZXIgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvR2VuZXJpY1RyaW1Db250YWluZXIiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0dlbmVyaWNUcmltQ29udGFpbmVyLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1NJREUgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvR2VuZXJpY1RyaW1Db250YWluZXIvc2lkZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJREUgPSAic2lkZSI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSW5wdXQgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvSW5wdXQiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0lucHV0LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0lOUFVUVVJJID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL0lucHV0L2lucHV0VVJJLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRVUkkgPSAiaW5wdXRVUkkiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFNuaXBwZXRDb250YWluZXIgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvU25pcHBldENvbnRhaW5lciI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvU25pcHBldENvbnRhaW5lci8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19TTklQUEVUUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9TbmlwcGV0Q29udGFpbmVyL3NuaXBwZXRzLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05JUFBFVFMgPSAic25pcHBldHMiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFVJRWxlbWVudCB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9VSUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJRWxlbWVudC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BQ0NFU1NJQklMSVRZUEhSQVNFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJRWxlbWVudC9hY2Nlc3NpYmlsaXR5UGhyYXNlLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTlRBSU5FUkRBVEEgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlFbGVtZW50L2NvbnRhaW5lckRhdGEvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ1VSU0hBUkVEUkVGID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJRWxlbWVudC9jdXJTaGFyZWRSZWYvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfT05UT1AgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlFbGVtZW50L29uVG9wLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1BBUkVOVCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9VSUVsZW1lbnQvcGFyZW50LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1JFTkRFUkVSID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJRWxlbWVudC9yZW5kZXJlci8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19UT0JFUkVOREVSRUQgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlFbGVtZW50L3RvQmVSZW5kZXJlZC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19WSVNJQkxFID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJRWxlbWVudC92aXNpYmxlLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1ZJU0lCTEVXSEVOID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJRWxlbWVudC92aXNpYmxlV2hlbi8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19XSURHRVQgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlFbGVtZW50L3dpZGdldC8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19MT0NBTElaRURfQUNDRVNTSUJJTElUWVBIUkFTRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9VSUVsZW1lbnQvbG9jYWxpemVkQWNjZXNzaWJpbGl0eVBocmFzZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU0lCSUxJVFlQSFJBU0UgPSAiYWNjZXNzaWJpbGl0eVBocmFzZSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSREFUQSA9ICJjb250YWluZXJEYXRhIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJTSEFSRURSRUYgPSAiY3VyU2hhcmVkUmVmIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTlRPUCA9ICJvblRvcCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UID0gInBhcmVudCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOREVSRVIgPSAicmVuZGVyZXIiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPQkVSRU5ERVJFRCA9ICJ0b0JlUmVuZGVyZWQiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lCTEUgPSAidmlzaWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSUJMRVdIRU4gPSAidmlzaWJsZVdoZW4iOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJREdFVCA9ICJ3aWRnZXQiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpFRF9BQ0NFU1NJQklMSVRZUEhSQVNFID0gImxvY2FsaXplZEFjY2Vzc2liaWxpdHlQaHJhc2UiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFVJTGFiZWwgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlMYWJlbCI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlMYWJlbC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19JQ09OVVJJID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL3VpL1VJTGFiZWwvaWNvblVSSS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19MQUJFTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9VSUxhYmVsL2xhYmVsLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1RPT0xUSVAgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvdWkvVUlMYWJlbC90b29sdGlwLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0xPQ0FMSVpFRF9MQUJFTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9VSUxhYmVsL2xvY2FsaXplZExhYmVsLyoiOyAvLyROT04tTkxTLTEkCisJCS8qKgorCQkgKiBAc2luY2UgMS4xCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19MT0NBTElaRURfVE9PTFRJUCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC91aS9VSUxhYmVsL2xvY2FsaXplZFRvb2x0aXAvKiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBpbiBldmVudCBoYW5kbGVycworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OVVJJID0gImljb25VUkkiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MVElQID0gInRvb2x0aXAiOyAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpFRF9MQUJFTCA9ICJsb2NhbGl6ZWRMYWJlbCI7IC8vJE5PTi1OTFMtMSQKKwkJLyoqCisJCSAqIEBzaW5jZSAxLjEKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpFRF9UT09MVElQID0gImxvY2FsaXplZFRvb2x0aXAiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEhhbmRsZWRJdGVtIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvSGFuZGxlZEl0ZW0iOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvSGFuZGxlZEl0ZW0vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQ09NTUFORCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L0hhbmRsZWRJdGVtL2NvbW1hbmQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfUEFSQU1FVEVSUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L0hhbmRsZWRJdGVtL3BhcmFtZXRlcnMvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfV0JDT01NQU5EID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvSGFuZGxlZEl0ZW0vd2JDb21tYW5kLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORCA9ICJjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJTID0gInBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdCQ09NTUFORCA9ICJ3YkNvbW1hbmQiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEl0ZW0geworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9JdGVtIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L0l0ZW0vKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfRU5BQkxFRCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L0l0ZW0vZW5hYmxlZC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19TRUxFQ1RFRCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L0l0ZW0vc2VsZWN0ZWQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfVFlQRSA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L0l0ZW0vdHlwZS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURUQgPSAic2VsZWN0ZWQiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTWVudSB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L01lbnUiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19FTkFCTEVEID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudS9lbmFibGVkLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNZW51Q29udHJpYnV0aW9uIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudUNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9NZW51Q29udHJpYnV0aW9uLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1BBUkVOVElEID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudUNvbnRyaWJ1dGlvbi9wYXJlbnRJZC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19QT1NJVElPTklOUEFSRU5UID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudUNvbnRyaWJ1dGlvbi9wb3NpdGlvbkluUGFyZW50LyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5USUQgPSAicGFyZW50SWQiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU0lUSU9OSU5QQVJFTlQgPSAicG9zaXRpb25JblBhcmVudCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTWVudUNvbnRyaWJ1dGlvbnMgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9NZW51Q29udHJpYnV0aW9ucyI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9NZW51Q29udHJpYnV0aW9ucy8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19NRU5VQ09OVFJJQlVUSU9OUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L01lbnVDb250cmlidXRpb25zL21lbnVDb250cmlidXRpb25zLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVUNPTlRSSUJVVElPTlMgPSAibWVudUNvbnRyaWJ1dGlvbnMiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1lbnVFbGVtZW50IHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudUVsZW1lbnQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfTU5FTU9OSUNTID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvTWVudUVsZW1lbnQvbW5lbW9uaWNzLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU5FTU9OSUNTID0gIm1uZW1vbmljcyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT3BhcXVlTWVudUl0ZW0geworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9PcGFxdWVNZW51SXRlbSI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9PcGFxdWVNZW51SXRlbS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19PUEFRVUVJVEVNID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvT3BhcXVlTWVudUl0ZW0vb3BhcXVlSXRlbS8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QQVFVRUlURU0gPSAib3BhcXVlSXRlbSI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT3BhcXVlTWVudVNlcGFyYXRvciB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L09wYXF1ZU1lbnVTZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvT3BhcXVlTWVudVNlcGFyYXRvci8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19PUEFRVUVJVEVNID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvT3BhcXVlTWVudVNlcGFyYXRvci9vcGFxdWVJdGVtLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BBUVVFSVRFTSA9ICJvcGFxdWVJdGVtIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPcGFxdWVUb29sSXRlbSB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L09wYXF1ZVRvb2xJdGVtIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L09wYXF1ZVRvb2xJdGVtLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX09QQVFVRUlURU0gPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9PcGFxdWVUb29sSXRlbS9vcGFxdWVJdGVtLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BBUVVFSVRFTSA9ICJvcGFxdWVJdGVtIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBSZW5kZXJlZE1lbnUgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9SZW5kZXJlZE1lbnUiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvUmVuZGVyZWRNZW51LyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTlRSSUJVVElPTk1BTkFHRVIgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9SZW5kZXJlZE1lbnUvY29udHJpYnV0aW9uTWFuYWdlci8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTk1BTkFHRVIgPSAiY29udHJpYnV0aW9uTWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVuZGVyZWRNZW51SXRlbSB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1JlbmRlcmVkTWVudUl0ZW0iOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvUmVuZGVyZWRNZW51SXRlbS8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19DT05UUklCVVRJT05JVEVNID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvUmVuZGVyZWRNZW51SXRlbS9jb250cmlidXRpb25JdGVtLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVUSU9OSVRFTSA9ICJjb250cmlidXRpb25JdGVtIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBSZW5kZXJlZFRvb2xCYXIgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9SZW5kZXJlZFRvb2xCYXIiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvUmVuZGVyZWRUb29sQmFyLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0NPTlRSSUJVVElPTk1BTkFHRVIgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9SZW5kZXJlZFRvb2xCYXIvY29udHJpYnV0aW9uTWFuYWdlci8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTk1BTkFHRVIgPSAiY29udHJpYnV0aW9uTWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVG9vbEJhckNvbnRyaWJ1dGlvbiB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1Rvb2xCYXJDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvVG9vbEJhckNvbnRyaWJ1dGlvbi8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19QQVJFTlRJRCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1Rvb2xCYXJDb250cmlidXRpb24vcGFyZW50SWQvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfUE9TSVRJT05JTlBBUkVOVCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1Rvb2xCYXJDb250cmlidXRpb24vcG9zaXRpb25JblBhcmVudC8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVElEID0gInBhcmVudElkIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NJVElPTklOUEFSRU5UID0gInBvc2l0aW9uSW5QYXJlbnQiOyAvLyROT04tTkxTLTEkCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQorCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFRvb2xCYXJDb250cmlidXRpb25zIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvVG9vbEJhckNvbnRyaWJ1dGlvbnMiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfQUxMID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvVG9vbEJhckNvbnRyaWJ1dGlvbnMvKiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUNfVE9PTEJBUkNPTlRSSUJVVElPTlMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9Ub29sQmFyQ29udHJpYnV0aW9ucy90b29sQmFyQ29udHJpYnV0aW9ucy8qIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGluIGV2ZW50IGhhbmRsZXJzCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xCQVJDT05UUklCVVRJT05TID0gInRvb2xCYXJDb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBUb29sSXRlbSB7CisKKwkJLy8gVG9waWNzIHRoYXQgY2FuIGJlIHN1YnNjcmliZWQgdG8KKworCQlARGVwcmVjYXRlZAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1Rvb2xJdGVtIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX0FMTCA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1Rvb2xJdGVtLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX01FTlUgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9Ub29sSXRlbS9tZW51LyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBUcmltQ29udHJpYnV0aW9uIHsKKworCQkvLyBUb3BpY3MgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0bworCisJCUBEZXByZWNhdGVkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvVHJpbUNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9UcmltQ29udHJpYnV0aW9uLyoiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDX1BBUkVOVElEID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvVHJpbUNvbnRyaWJ1dGlvbi9wYXJlbnRJZC8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19QT1NJVElPTklOUEFSRU5UID0gIm9yZy9lY2xpcHNlL2U0L3VpL21vZGVsL21lbnUvVHJpbUNvbnRyaWJ1dGlvbi9wb3NpdGlvbkluUGFyZW50LyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5USUQgPSAicGFyZW50SWQiOyAvLyROT04tTkxTLTEkCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU0lUSU9OSU5QQVJFTlQgPSAicG9zaXRpb25JblBhcmVudCI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVHJpbUNvbnRyaWJ1dGlvbnMgeworCisJCS8vIFRvcGljcyB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvCisKKwkJQERlcHJlY2F0ZWQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QSUMgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9UcmltQ29udHJpYnV0aW9ucyI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19BTEwgPSAib3JnL2VjbGlwc2UvZTQvdWkvbW9kZWwvbWVudS9UcmltQ29udHJpYnV0aW9ucy8qIjsgLy8kTk9OLU5MUy0xJAorCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19UUklNQ09OVFJJQlVUSU9OUyA9ICJvcmcvZWNsaXBzZS9lNC91aS9tb2RlbC9tZW51L1RyaW1Db250cmlidXRpb25zL3RyaW1Db250cmlidXRpb25zLyoiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaW4gZXZlbnQgaGFuZGxlcnMKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTUNPTlRSSUJVVElPTlMgPSAidHJpbUNvbnRyaWJ1dGlvbnMiOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9saWZlY3ljbGUvUG9zdENvbnRleHRDcmVhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbGlmZWN5Y2xlL1Bvc3RDb250ZXh0Q3JlYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkZjc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbGlmZWN5Y2xlL1Bvc3RDb250ZXh0Q3JlYXRlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIFVzZSB0aGlzIGFubm90YXRpb24gdG8gZGVzY3JpYmUgbWV0aG9kcyB0aGF0IHdpbGwgcGFydGljaXBhdGUgaW4gdGhlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZS4gVGhpcworICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFwcGxpY2F0aW9uIGNvbnRleHQgaXMgY3JlYXRlZC4KKyAqLworQERvY3VtZW50ZWQKK0BUYXJnZXQoeyBFbGVtZW50VHlwZS5NRVRIT0QgfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBQb3N0Q29udGV4dENyZWF0ZSB7CisJLy8gaW50ZW50aW9uYWxseSBsZWZ0IGVtcHR5Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2xpZmVjeWNsZS9QcmVTYXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2xpZmVjeWNsZS9QcmVTYXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2NWNiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbGlmZWN5Y2xlL1ByZVNhdmUuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmxpZmVjeWNsZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVXNlIHRoaXMgYW5ub3RhdGlvbiB0byBkZXNjcmliZSBtZXRob2RzIHRoYXQgd2lsbCBwYXJ0aWNpcGF0ZSBpbiB0aGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlLiBUaGlzCisgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBtb2RlbCBpcyBwZXJzaXN0ZWQuCisgKi8KK0BEb2N1bWVudGVkCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgUHJlU2F2ZSB7CisJLy8gaW50ZW50aW9uYWxseSBsZWZ0IGVtcHR5Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2xpZmVjeWNsZS9Qcm9jZXNzQWRkaXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2xpZmVjeWNsZS9Qcm9jZXNzQWRkaXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjNWQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbGlmZWN5Y2xlL1Byb2Nlc3NBZGRpdGlvbnMuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmxpZmVjeWNsZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVXNlIHRoaXMgYW5ub3RhdGlvbiB0byBkZXNjcmliZSBtZXRob2RzIHRoYXQgd2lsbCBwYXJ0aWNpcGF0ZSBpbiB0aGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlLiBUaGlzCisgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb25jZSB0aGUgbW9kZWwgaXMgbG9hZGVkLgorICovCitARG9jdW1lbnRlZAorQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCB9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFByb2Nlc3NBZGRpdGlvbnMgeworCS8vIGludGVudGlvbmFsbHkgbGVmdCBlbXB0eQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9saWZlY3ljbGUvUHJvY2Vzc1JlbW92YWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL2xpZmVjeWNsZS9Qcm9jZXNzUmVtb3ZhbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU4YzExCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9saWZlY3ljbGUvUHJvY2Vzc1JlbW92YWxzLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIFVzZSB0aGlzIGFubm90YXRpb24gdG8gZGVzY3JpYmUgbWV0aG9kcyB0aGF0IHdpbGwgcGFydGljaXBhdGUgaW4gdGhlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZS4gVGhpcworICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSB7QGxpbmsgUHJvY2Vzc0FkZGl0aW9uc30gY2FsbHMgYXJlIGRvbmUuCisgKi8KK0BEb2N1bWVudGVkCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgUHJvY2Vzc1JlbW92YWxzIHsKKwkvLyBpbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvRU1vZGVsU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FTW9kZWxTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZjgzZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvRU1vZGVsU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5NUGFydERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTUVsZW1lbnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVNuaXBwZXRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5TaWRlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QbGFjZWhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXJFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1UcmltbWVkV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlNlbGVjdG9yOworCisvKioKKyAqIFRoaXMgc2VydmljZSBpcyB1c2VkIHRvIGZpbmQsIGNyZWF0ZSBhbmQgaGFuZGxlIG1vZGVsIGVsZW1lbnRzCisgKgorICogQHNpbmNlIDEuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVNb2RlbFNlcnZpY2UgeworCS8vIEluc2VydGlvbiBjb25zdGFudHMKKworCS8qKiBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IGFib3ZlIHRoZSBleGlzdGluZyBvbmUgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQk9WRSA9IDA7CisKKwkvKiogSW5zZXJ0IHRoZSBuZXcgZWxlbWVudCBiZWxvdyB0aGUgZXhpc3Rpbmcgb25lICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVMT1cgPSAxOworCisJLyoqIEluc2VydCB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlIGxlZnQgb2YgdGhlIGV4aXN0aW5nIG9uZSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfT0YgPSAyOworCisJLyoqIEluc2VydCB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBleGlzdGluZyBvbmUgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9PRiA9IDM7CisKKwkvLyBTZWFyY2ggbW9kaWZpZXJzIC8gTG9jYXRpb24gQ29uc3RhbnRzCisKKwkvKiogUmV0dXJuZWQgTG9jYXRpb24gaWYgdGhlIGVsZW1lbnQncyBwYXJlbnQgY2hhaW4gZG9lcyBub3QgcmVsYXRlIHRvIHRoZSBNQXBwbGljYXRpb24ncyBtb2RlbCAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9JTl9VSSA9IDB4MDA7CisKKwkvKiogUmV0dXJuZWQgTG9jYXRpb24gaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIFVJIGJ1dCBub3QgaW4gYW4gTVBlcnNwZWN0aXZlICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUU0lERV9QRVJTUEVDVElWRSA9IDB4MDE7CisKKwkvKiogUmV0dXJuZWQgTG9jYXRpb24gaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9BQ1RJVkVfUEVSU1BFQ1RJVkUgPSAweDAyOworCisJLyoqIFJldHVybmVkIExvY2F0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGluIGEgbm9uLWFjdGl2ZSBwZXJzcGVjdGl2ZSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0FOWV9QRVJTUEVDVElWRSA9IDB4MDQ7CisKKwkvKiogUmV0dXJuZWQgTG9jYXRpb24gaWYgdGhlIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIGFuIE1BcmVhICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fU0hBUkVEX0FSRUEgPSAweDA4OworCisJLyoqIFJldHVybmVkIExvY2F0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGluIGFuIE1UcmltQmFyICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fVFJJTSA9IDB4MTA7CisKKwkvKioKKwkgKiBSZXR1cm5lZCBMb2NhdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBpbiBhIG1haW4gbWVudSBvZiBhbiBNV2luZG93CisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fTUFJTl9NRU5VID0gMHgyMDsKKworCS8qKgorCSAqIFJldHVybmVkIExvY2F0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGluIGFuIE1QYXJ0CisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUEFSVCA9IDB4NDA7CisKKwkvLyAnU3RhbmRhcmQnIHNlYXJjaGVzCisKKwkvKiogU2VhcmNoZXMgZm9yIGVsZW1lbnRzIGluIHRoZSBVSSB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZWVpbmcgKGV4Y2x1ZGluZyB0cmltKSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFTlRBVElPTiA9IE9VVFNJREVfUEVSU1BFQ1RJVkUgfCBJTl9BQ1RJVkVfUEVSU1BFQ1RJVkUKKwkJCXwgSU5fU0hBUkVEX0FSRUE7CisKKwkvKiogU2VhcmNoZXMgZm9yIGVsZW1lbnRzIGluIHRoZSBVSSBwcmVzZW50YXRpb24sIGluY2x1ZGluZyBhbGwgcGVyc3BlY3RpdmVzICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZV0hFUkUgPSBPVVRTSURFX1BFUlNQRUNUSVZFIHwgSU5fQU5ZX1BFUlNQRUNUSVZFIHwgSU5fU0hBUkVEX0FSRUEKKwkJCXwgSU5fVFJJTTsKKworCS8qKgorCSAqIFNlYXJjaGVzIGZvciBlbGVtZW50cyBpbiB0aGUgVUkgdGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgc2VlaW5nIHRoYXQgYXJlIE9VVFNJREUgdGhlCisJICogcGVyc3BlY3RpdmUgKGkuZS4gdmlzaWJsZSByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTCA9IE9VVFNJREVfUEVSU1BFQ1RJVkUgfCBJTl9TSEFSRURfQVJFQTsKKworCS8qKgorCSAqIFdoZW4gaW52b2tpbmcgdGhlICdjbG9uZUVsZW1lbnQnIG1ldGhvZCB0aGUgbmV3bHkgY2xvbmVkIGVsZW1lbnQncyAndHJhbnNpZW50RGF0YScgbWFwIHdpbGwKKwkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIHRoaXMgYXMgYSBrZXkuCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ0xPTkVEX0ZST01fS0VZID0gIkNsb25lZCBGcm9tIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ3JlYXRlcyBpbnN0YW5jZXMgb2YgbW9kZWwgZWxlbWVudHMuIFRoZSBtZXRob2Qgc3VwcG9ydHMgYW55IHR5cGUgZXh0ZW5kaW5nCisJICoge0BsaW5rIE1BcHBsaWNhdGlvbkVsZW1lbnR9LCBib3RoIGluIHRoZSBzdGFuZGFyZCBlNCBVSSBtb2RlbCBhbmQgaW4gYW4gZXh0ZW5zaW9uIG1vZGVscy4KKwkgKgorCSAqIDxwPgorCSAqIDxiPkNhdXRpb246PC9iPiBUbyBjcmVhdGUgbW9kZWwgZWxlbWVudCBpbnN0YW5jZXMgb2YgZXh0ZW5zaW9uIG1vZGVscyB5b3UgbmVlZCB0byByZWdpc3RlcgorCSAqIHRoZW0gd2l0aCB0aGUgPGNvZGU+dGhlIG9yZy5lY2xpcHNlLmU0LndvcmtiZW5jaC5tb2RlbC5kZWZpbml0aW9uLmVucmljaG1lbnQ8L2NvZGU+CisJICogRXh0ZW5zaW9uUG9pbnQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGVsZW1lbnRUeXBlCisJICogICAgICAgICAgICB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuIENhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2UKKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHBhc3NlZCBjbGFzcyBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHBhc3NlZCBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIE1BcHBsaWNhdGlvbkVsZW1lbnQ+IFQgY3JlYXRlTW9kZWxFbGVtZW50KENsYXNzPFQ+IGVsZW1lbnRUeXBlKTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjb25zdHJ1Y3RzIGEgbmV3IFNlbGVjdG9yIGJhc2VkIG9uIHtAbGluayBFbGVtZW50TWF0Y2hlcn0KKwkgKiBhbmQgZm9yd2FyZHMgdGhlIGNhbGwgb24gdG8gdGhlIGJhc2UgQVBJCisJICoge0BsaW5rIEVNb2RlbFNlcnZpY2UjZmluZEVsZW1lbnRzKE1BcHBsaWNhdGlvbkVsZW1lbnQsIENsYXNzLCBpbnQsIFNlbGVjdG9yKX0uCisJICoKKwkgKiBAc2VlIEVNb2RlbFNlcnZpY2UjZmluZEVsZW1lbnRzKE1BcHBsaWNhdGlvbkVsZW1lbnQsIENsYXNzLCBpbnQsIFNlbGVjdG9yKQorCSAqLworCXB1YmxpYyA8VD4gTGlzdDxUPiBmaW5kRWxlbWVudHMoTVVJRWxlbWVudCBzZWFyY2hSb290LCBTdHJpbmcgaWQsIENsYXNzPFQ+IGNsYXp6LAorCQkJTGlzdDxTdHJpbmc+IHRhZ3NUb01hdGNoLCBpbnQgc2VhcmNoRmxhZ3MpOworCisJLyoqCisJICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGZvcndhcmRzIHRoZSBwYXJhbWV0ZXJzIG9uIHRvCisJICoge0BsaW5rIEVNb2RlbFNlcnZpY2UjZmluZEVsZW1lbnRzKE1VSUVsZW1lbnQsIFN0cmluZywgQ2xhc3MsIExpc3QsIGludCl9LCBwYXNzaW5nCisJICoge0BsaW5rIEVNb2RlbFNlcnZpY2UjQU5ZV0hFUkV9IGFzIHRoZSAnc2VhcmNoRmxhZ3MnLgorCSAqCisJICovCisJcHVibGljIDxUPiBMaXN0PFQ+IGZpbmRFbGVtZW50cyhNVUlFbGVtZW50IHNlYXJjaFJvb3QsIFN0cmluZyBpZCwgQ2xhc3M8VD4gY2xhenosCisJCQlMaXN0PFN0cmluZz4gdGFnc1RvTWF0Y2gpOworCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBvZiBhbnkgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gc2VhcmNoIGNyaXRlcmlhLiBUaGUgc2VhcmNoIGlzIHJlY3Vyc2l2ZQorCSAqIGFuZCBpbmNsdWRlcyB0aGUgc3BlY2lmaWVkIHNlYXJjaCByb290LiBBbnkgb2YgdGhlIHNlYXJjaCBwYXJhbWV0ZXJzIG1heSBiZSBzcGVjaWZpZWQgYXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbiB3aGljaCBjYXNlIHRoYXQgZmllbGQgd2lsbCBhbHdheXMgJ21hdGNoJy4KKwkgKiA8cD4KKwkgKiBOT1RFOiBUaGlzIGlzIGEgZ2VuZXJpY2FsbHkgdHlwZWQgbWV0aG9kIHdpdGggdGhlIExpc3QncyBnZW5lcmljIHR5cGUgZXhwZWN0ZWQgdG8gYmUgdGhlCisJICogdmFsdWUgb2YgdGhlICdjbGF6eicgcGFyYW1ldGVyLiBJZiB0aGUgJ2NsYXp6JyBwYXJhbWV0ZXIgaXMgbnVsbCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzCisJICogdW50eXBlZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gPFQ+CisJICogICAgICAgICAgICBUaGUgZ2VuZXJpYyB0eXBlIG9mIHRoZSByZXR1cm5lZCBsaXN0CisJICogQHBhcmFtIHNlYXJjaFJvb3QKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBzZWFyY2guIFRoaXMgZWxlbWVudCBtdXN0IGJlIG5vbi1udWxsIGFuZCBpcworCSAqICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4KKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gYmUgc2VhcmNoZWQgZm9yLiBJZiBub24tbnVsbCB0aGlzIGFsc28gZGVmaW5lcyB0aGUgcmV0dXJuCisJICogICAgICAgICAgICB0eXBlIG9mIHRoZSBMaXN0LgorCSAqIEBwYXJhbSBzZWFyY2hGbGFncworCSAqICAgICAgICAgICAgQSBiaXR3aXNlIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorCSAqICAgICAgICAgICAgPHVsPgorCSAqICAgICAgICAgICAgPGxpPjxiPk9VVFNJREVfUEVSU1BFQ1RJVkU8L2I+IEluY2x1ZGUgdGhlIGVsZW1lbnRzIGluIHRoZSB3aW5kb3cncyBtb2RlbCB0aGF0IGFyZQorCSAqICAgICAgICAgICAgbm90IGluIGEgcGVyc3BlY3RpdmU8LztpPgorCSAqICAgICAgICAgICAgPGxpPjxiPklOX0FOWV9QRVJTUEVDVElWRTwvYj4gSW5jbHVkZSB0aGUgZWxlbWVudHMgaW4gYWxsIHBlcnNwZWN0aXZlczwvO2k+CisJICogICAgICAgICAgICA8bGk+PGI+SU5fQUNUSVZFX1BFUlNQRUNUSVZFPC9iPiBJbmNsdWRlIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZQorCSAqICAgICAgICAgICAgcGVyc3BlY3RpdmUgb25seTwvO2k+CisJICogICAgICAgICAgICA8bGk+PGI+SU5fTUFJTl9NRU5VPC9iPiBJbmNsdWRlIGVsZW1lbnRzIGluIGFuIE1XaW5kb3cncyBtYWluIG1lbnU8LztpPgorCSAqICAgICAgICAgICAgPGxpPjxiPklOX1BBUlQ8L2I+IEluY2x1ZGUgTU1lbnUgYW5kIE1Ub29sYmFyIGVsZW1lbnRzIG93bmVkIGJ5IHBhcnRzPC87aT4KKwkgKiAgICAgICAgICAgIDxsaT48Yj5JTl9BQ1RJVkVfUEVSU1BFQ1RJVkU8L2I+IEluY2x1ZGUgdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlCisJICogICAgICAgICAgICBwZXJzcGVjdGl2ZSBvbmx5PC87aT4KKwkgKiAgICAgICAgICAgIDxsaT48Yj5JTl9TSEFSRURfQVJFQTwvYj4gSW5jbHVkZSB0aGUgZWxlbWVudHMgaW4gdGhlIHNoYXJlZCBhcmVhPC87aT4KKwkgKiAgICAgICAgICAgIDxsaT48Yj5JTl9UUklNPC9iPiBJbmNsdWRlIHRoZSBlbGVtZW50cyBpbiB0aGUgd2luZG93J3MgdHJpbTwvO2k+CisJICogICAgICAgICAgICA8L3VsPgorCSAqICAgICAgICAgICAgTm90ZSB0aGF0IHlvdSBtYXkgb21pdCBib3RoIHBlcnNwZWN0aXZlIGZsYWdzIGJ1dCBzdGlsbCBkZWZpbmUKKwkgKiAgICAgICAgICAgIDxiPklOX1NIQVJFRF9BUkVBPC9iPjsgdGhlIGZsYWdzIDxiPk9VVFNJREVfUEVSU1BFQ1RJVkUgfCBJTl9TSEFSRURfQVJFQTwvYj4gZm9yCisJICogICAgICAgICAgICBleGFtcGxlIHdpbGwgc2VhcmNoIHRoZSBwcmVzZW50YXRpb24gPGk+ZXhjbHVkaW5nPC9pPiB0aGUgZWxlbWVudHMgaW4gcGVyc3BlY3RpdmUKKwkgKiAgICAgICAgICAgIHN0YWNrcy4KKwkgKiBAcGFyYW0gbWF0Y2hlcgorCSAqICAgICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgYSBTZWxlY3RvciB0aGF0IHdpbGwgcmV0dXJuIHRydWUgZm9yIGVsZW1lbnRzIHRoYXQgaXQgd2FudHMKKwkgKiAgICAgICAgICAgIGluIHRoZSByZXR1cm5lZCBsaXN0LgorCSAqIEByZXR1cm4gVGhlIGdlbmVyaWNhbGx5IHR5cGVkIGxpc3Qgb2YgbWF0Y2hpbmcgZWxlbWVudHMuCisJICoKKwkgKiBAc2luY2UgMS4xCisJICovCisJcHVibGljIDxUPiBMaXN0PFQ+IGZpbmRFbGVtZW50cyhNQXBwbGljYXRpb25FbGVtZW50IHNlYXJjaFJvb3QsIENsYXNzPFQ+IGNsYXp6LAorCQkJaW50IHNlYXJjaEZsYWdzLCBTZWxlY3RvciBtYXRjaGVyKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQsIHJlY3Vyc2l2ZWx5IHNlYXJjaGluZyB1bmRlciB0aGUgc3BlY2lmaWVkIHNlYXJjaCByb290IChpbmNsdXNpdmUpCisJICoKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBpZCB0byBzZWFyY2ggZm9yLCBtdXN0IG5vdCBiZSBudWxsCisJICogQHBhcmFtIHNlYXJjaFJvb3QKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBzZWFyY2gsIG11c3Qgbm90IGJlIG51bGwKKwkgKiBAcmV0dXJuIFRoZSBmaXJzdCBlbGVtZW50IHdpdGggYSBtYXRjaGluZyBpZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBvbmUgaXMgbm90IGZvdW5kCisJICovCisJcHVibGljIE1VSUVsZW1lbnQgZmluZChTdHJpbmcgaWQsIE1VSUVsZW1lbnQgc2VhcmNoUm9vdCk7CisKKwkvKioKKwkgKiBMb2NhdGUgdGhlIGNvbnRleHQgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBwYXJlbnQgaGllcmFyY2h5LiBJdCBkb2VzIG5vdAorCSAqIGluY2x1ZGUgdGhlIGNvbnRleHQgb2YgdGhlIHN1cHBsaWVkIGVsZW1lbnQgKHNob3VsZCBpdCBoYXZlIG9uZSkuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gbG9jYXRlIHBhcmVudCBjb250ZXh0IGZvcgorCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5pbmcgY29udGV4dCBmb3IgdGhpcyBlbGVtZW50CisJICovCisJcHVibGljIElFY2xpcHNlQ29udGV4dCBnZXRDb250YWluaW5nQ29udGV4dChNVUlFbGVtZW50IGVsZW1lbnQpOworCisJLyoqCisJICogQnJpbmdzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgdG9wIG9mIGl0cyBjb250YWlubWVudCBzdHJ1Y3R1cmUuIElmIHRoZSBzcGVjaWZpZWQKKwkgKiBlbGVtZW50IGlzIGEgdG9wLWxldmVsIHdpbmRvdywgdGhlbiBpdCB3aWxsIGJlIHNlbGVjdGVkIGFzIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnRseSBhY3RpdmUKKwkgKiB3aW5kb3cuIE90aGVyd2lzZSwgdGhlIGVsZW1lbnQgbWF5IG1lcmVseSBiZSBicm91Z2h0IHVwIHRvIGJlIHNlZW4gYnkgdGhlIHVzZXIgYnV0IG5vdAorCSAqIG5lY2Vzc2FyaWx5IGhhdmUgaXRzIGNvbnRhaW5pbmcgd2luZG93IGJlY29tZSB0aGUgYXBwbGljYXRpb24ncyBhY3RpdmUgd2luZG93LgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGJyaW5nIHRvIHRoZSB0b3AKKwkgKi8KKwlwdWJsaWMgdm9pZCBicmluZ1RvVG9wKE1VSUVsZW1lbnQgZWxlbWVudCk7CisKKwkvKioKKwkgKiBDbG9uZXMgdGhlIGVsZW1lbnQsIGNyZWF0aW5nIGEgZGVlcCBjb3B5IG9mIGl0cyBzdHJ1Y3R1cmUuCisJICoKKwkgKiBOT1RFOiBUaGUgY2xvbmVkIGVsZW1lbnQgZ2V0cyB0aGUgb3JpZ2luYWwgZWxlbWVudCBhZGRlZCBpbnRvIGl0cyAndHJhbnNpZW50RGF0YScgbWFwIHVzaW5nCisJICogdGhlIENMT05FRF9GUk9NX0tFWSBrZXkuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIHRoZXJlIG1heSBiZSBvdGhlciBpbmZvcm1hdGlvbiB0aGUKKwkgKiBuZXdseSBjbG9uZWQgZWxlbWVudCBuZWVkcyBmcm9tIHRoZSBvcmlnaW5hbC4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBjbG9uZQorCSAqIEBwYXJhbSBzbmlwcGV0Q29udGFpbmVyCisJICogICAgICAgICAgICBBbiBvcHRpb25hbCBNVUlFbGVtZW50IHdoZXJlIHRoZSBjbG9uZWQgc25pcHBldCBpcyB0byBiZSBzYXZlZC4gbnVsbCBpZiB0aGUgY2xvbmUKKwkgKiAgICAgICAgICAgIG5lZWQgbm90IGJlIHNhdmVkCisJICogQHJldHVybiBUaGUgbmV3bHkgY2xvbmVkIGVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgTVVJRWxlbWVudCBjbG9uZUVsZW1lbnQoTVVJRWxlbWVudCBlbGVtZW50LCBNU25pcHBldENvbnRhaW5lciBzbmlwcGV0Q29udGFpbmVyKTsKKworCS8qKgorCSAqIElmIGEgc25pcHBldCB3aXRoIHRoZSBnaXZlbiBpZCBleGlzdHMgYSBjbG9uZSBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gcmV0dXJucworCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHNuaXBwZXQgY2FuIGJlIGZvdW5kLgorCSAqCisJICogQHBhcmFtIHNuaXBwZXRDb250YWluZXIKKwkgKiAgICAgICAgICAgIFRoZSBjb250YWluZXIgb2YgdGhlIHNuaXBwZXQgdG8gY2xvbmUgdXNlZAorCSAqIEBwYXJhbSBzbmlwcGV0SWQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGlkIG9mIHRoZSBzbmlwcGV0IHRvIGNsb25lCisJICogQHBhcmFtIHJlZldpbgorCSAqICAgICAgICAgICAgVGhlIHdpbmRvdyB0aGF0IFBsYWNlaG9sZGVyIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHJlc29sdmVkIHVzaW5nCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjbG9uZWQgc25pcHBldCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzbmlwcGV0IHdpdGggdGhlIGdpdmVuIGlkIGNhbiBiZSBmb3VuZAorCSAqLworCXB1YmxpYyBNVUlFbGVtZW50IGNsb25lU25pcHBldChNU25pcHBldENvbnRhaW5lciBzbmlwcGV0Q29udGFpbmVyLCBTdHJpbmcgc25pcHBldElkLAorCQkJTVdpbmRvdyByZWZXaW4pOworCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGZpbmQgYSBzbmlwcGV0IGJ5IGlkIGluIGEgcGFydGljdWxhciBjb250YWluZXIKKwkgKgorCSAqIEBwYXJhbSBzbmlwcGV0Q29udGFpbmVyCisJICogICAgICAgICAgICBUaGUgY29udGFpbmVyIHRvIGxvb2sgaW4KKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzbmlwcGV0CisJICogQHJldHVybiBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzbmlwcGV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQKKwkgKi8KKwlwdWJsaWMgTVVJRWxlbWVudCBmaW5kU25pcHBldChNU25pcHBldENvbnRhaW5lciBzbmlwcGV0Q29udGFpbmVyLCBTdHJpbmcgaWQpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBjb3VudCBvZiB0aGUgY2hpbGRyZW4gd2hvc2UgJ3RvQmVSZW5kZXJlZCcgZmxhZyBpcyB0cnVlCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdG8gdGVzdAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB3aXRoICd0b0JlUmVuZGVyZWQnID09IHRydWUKKwkgKi8KKwlwdWJsaWMgaW50IGNvdW50UmVuZGVyYWJsZUNoaWxkcmVuKE1VSUVsZW1lbnQgZWxlbWVudCk7CisKKwkvKioKKwkgKiBHaXZlbiBhIGNvbnRhaW5pbmcgTVdpbmRvdyBmaW5kIHRoZSBNUGxhY2Vob2xkZXIgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCB0byBob3N0IHRoZQorCSAqIGdpdmVuIGVsZW1lbnQgKGlmIGFueSkKKwkgKgorCSAqIEBwYXJhbSB3aW5kb3cKKwkgKiAgICAgICAgICAgIFRoZSBjb250YWluaW5nIHdpbmRvdworCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBmaW5kIHRoZSBNUGxhY2Vob2xkZXIgZm9yCisJICogQHJldHVybiB0aGUgTVBsYWNlaG9sZGVyIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZAorCSAqLworCXB1YmxpYyBNUGxhY2Vob2xkZXIgZmluZFBsYWNlaG9sZGVyRm9yKE1XaW5kb3cgd2luZG93LCBNVUlFbGVtZW50IGVsZW1lbnQpOworCisJLyoqCisJICogTW92ZSB0aGUgZWxlbWVudCB0byBhIG5ldyBsb2NhdGlvbi4gVGhlIGVsZW1lbnQgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbmV3IHBhcmVudCdzCisJICogbGlzdCBvZiBjaGlsZHJlbi4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBtb3ZlCisJICogQHBhcmFtIG5ld1BhcmVudAorCSAqICAgICAgICAgICAgVGhlIG5ldyBwYXJlbnQgZm9yIHRoZSBlbGVtZW50LgorCSAqLworCXB1YmxpYyB2b2lkIG1vdmUoTVVJRWxlbWVudCBlbGVtZW50LCBNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBuZXdQYXJlbnQpOworCisJLyoqCisJICogTW92ZSB0aGUgZWxlbWVudCB0byBhIG5ldyBsb2NhdGlvbi4gVGhlIGVsZW1lbnQgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbmV3IHBhcmVudCdzCisJICogbGlzdCBvZiBjaGlsZHJlbi4gSWYgJ2xlYXZlUGxhY2Vob2xkZXIgaXMgdHJ1ZSB0aGVuIGFuIGluc3RhbmNlIG9mIE1QbGFjZWhvbGRlciB3aWxsIGJlCisJICogaW5zZXJ0ZWQgaW50byB0aGUgbW9kZWwgYXQgdGhlIGVsZW1lbnQncyBvcmlnaW5hbCBsb2NhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBtb3ZlCisJICogQHBhcmFtIG5ld1BhcmVudAorCSAqICAgICAgICAgICAgVGhlIG5ldyBwYXJlbnQgZm9yIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSBsZWF2ZVBsYWNlaG9sZGVyCisJICogICAgICAgICAgICB0cnVlIGlmIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhZGRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1vdmUoTVVJRWxlbWVudCBlbGVtZW50LCBNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBuZXdQYXJlbnQsCisJCQlib29sZWFuIGxlYXZlUGxhY2Vob2xkZXIpOworCisJLyoqCisJICogTW92ZSB0aGUgZWxlbWVudCB0byBhIG5ldyBsb2NhdGlvbi4gVGhlIGVsZW1lbnQgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUKKwkgKiBuZXcgcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlbi4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBtb3ZlCisJICogQHBhcmFtIG5ld1BhcmVudAorCSAqICAgICAgICAgICAgVGhlIG5ldyBwYXJlbnQgZm9yIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgVGhlIGluZGV4IHRvIGluc2VydCB0aGUgZWxlbWVudCBhdDsgLTEgbWVhbnMgYXQgdGhlIGVuZAorCSAqLworCXB1YmxpYyB2b2lkIG1vdmUoTVVJRWxlbWVudCBlbGVtZW50LCBNRWxlbWVudENvbnRhaW5lcjxNVUlFbGVtZW50PiBuZXdQYXJlbnQsIGludCBpbmRleCk7CisKKwkvKioKKwkgKiBNb3ZlIHRoZSBlbGVtZW50IHRvIGEgbmV3IGxvY2F0aW9uLiBUaGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBuZXcgcGFyZW50J3MKKwkgKiBsaXN0IG9mIGNoaWxkcmVuLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIG1vdmUKKwkgKiBAcGFyYW0gbmV3UGFyZW50CisJICogICAgICAgICAgICBUaGUgbmV3IHBhcmVudCBmb3IgdGhlIGVsZW1lbnQuCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGF0OyAtMSBtZWFucyBhdCB0aGUgZW5kCisJICogQHBhcmFtIGxlYXZlUGxhY2Vob2xkZXIKKwkgKiAgICAgICAgICAgIHRydWUgaWYgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGFkZGVkCisJICovCisJcHVibGljIHZvaWQgbW92ZShNVUlFbGVtZW50IGVsZW1lbnQsIE1FbGVtZW50Q29udGFpbmVyPE1VSUVsZW1lbnQ+IG5ld1BhcmVudCwgaW50IGluZGV4LAorCQkJYm9vbGVhbiBsZWF2ZVBsYWNlaG9sZGVyKTsKKworCS8qKgorCSAqIEluc2VydHMgdGhlIGdpdmVuIGVsZW1lbnQgaW50byB0aGUgVUkgTW9kZWwgYnkgZWl0aGVyIGNyZWF0aW5nIGEgbmV3IHNhc2ggb3IgYXVnbWVudGluZyBhbgorCSAqIGV4aXN0aW5nIHNhc2ggaWYgdGhlIG9yaWVudGF0aW9uIHBlcm1pdHMuCisJICoKKwkgKiBAcGFyYW0gdG9JbnNlcnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGluc2VydAorCSAqIEBwYXJhbSByZWxUbworCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB0aGUgbmV3IG9uZSBpcyB0byBiZSByZWxhdGl2ZSB0bworCSAqIEBwYXJhbSB3aGVyZQorCSAqICAgICAgICAgICAgQW4gU1dUIGNvbnN0YW50IGluZGljYXRpbmcgd2hlcmUgdGhlIGluc2VydGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZAorCSAqIEBwYXJhbSByYXRpbworCSAqICAgICAgICAgICAgVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFyZWEgdG8gYmUgb2NjdXBpZWQgYnkgdGhlIGluc2VydGVkIGVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnNlcnQoTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCB0b0luc2VydCwgTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCByZWxUbywKKwkJCWludCB3aGVyZSwgZmxvYXQgcmF0aW8pOworCisJLyoqCisJICogQ3JlYXRlZCBhIHNlcGFyYXRlIChkZXRhY2hlZCkgd2luZG93IGNvbnRhaW5pbmcgdGhlIGdpdmVuIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gbVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudAorCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdG8gZGV0YWNoCisJICogQHBhcmFtIHgKKwkgKiAgICAgICAgICAgIFRoZSBYIHBvc2l0aW9uIG9mIHRoZSBuZXcgd2luZG93CisJICogQHBhcmFtIHkKKwkgKiAgICAgICAgICAgIFRoZSBZIHBvc2l0aW9uIG9mIHRoZSBuZXcgd2luZG93CisJICogQHBhcmFtIHdpZHRoCisJICogICAgICAgICAgICBUaGUgV2lkdGggb2YgdGhlIG5ldyB3aW5kb3cKKwkgKiBAcGFyYW0gaGVpZ2h0CisJICogICAgICAgICAgICBUaGUgSGVpZ2h0IG9mIHRoZSBuZXcgd2luZG93CisJICovCisJcHVibGljIHZvaWQgZGV0YWNoKE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQgbVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCwgaW50IHgsIGludCB5LAorCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworCS8qKgorCSAqIEdldCB0aGUgdG9wLWxldmVsIHdpbmRvdyBjb250YWluaW5nIHRoaXMgVUkgZWxlbWVudC4gQSA8Y29kZT5udWxsPC9jb2RlPiByZXR1cm4gdmFsdWUKKwkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZWxlbWVudCBpcyBub3QgZGlyZWN0bHkgY29udGFpbmVkIGluIHRoZSBVSSBtb2RlbCAoYnV0IG1heSwgZm9yIGV4YW1wbGUsCisJICogYmUgYSBtb2RlbCBzbmlwcGV0IGhvc3RlZCBpbiBhIERpYWxvZy4uLikKKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBnZXQgdGhlIHdpbmRvdyBmb3IKKwkgKgorCSAqIEByZXR1cm4gdGhlIHRvcC1sZXZlbCB3aW5kb3cgY29udGFpbmluZyB0aGlzIFVJIGVsZW1lbnQuIEEgPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJuIHZhbHVlCisJICogICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZWxlbWVudCBpcyBub3QgZGlyZWN0bHkgY29udGFpbmVkIGluIHRoZSBVSSBtb2RlbCAoYnV0IG1heSwgZm9yCisJICogICAgICAgICBleGFtcGxlLCBiZSBhIG1vZGVsIHNuaXBwZXQgaG9zdGVkIGluIGEgRGlhbG9nLi4uKQorCSAqLworCXB1YmxpYyBNV2luZG93IGdldFRvcExldmVsV2luZG93Rm9yKE1VSUVsZW1lbnQgZWxlbWVudCk7CisKKwkvKioKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBwZXJzcGVjdGl2ZSBmb3IKKwkgKiBAcmV0dXJuIFRoZSBNUGVyc3BlY3RpdmUgY29udGFpbmluZyB0aGlzIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaXMgbm90CisJICogICAgICAgICBpbiBhIHBlcnNwZWN0aXZlCisJICovCisJcHVibGljIE1QZXJzcGVjdGl2ZSBnZXRQZXJzcGVjdGl2ZUZvcihNVUlFbGVtZW50IGVsZW1lbnQpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgd2luZG93J3MgTVRyaW1CYXIgZm9yIHRoZSBzcGVjaWZpZWQgc2lkZS4gSWYgbmVjZXNzYXJ5IHRoZSBiYXIgd2lsbCBiZSBjcmVhdGVkLgorCSAqCisJICogQHBhcmFtIHdpbmRvdworCSAqICAgICAgICAgICAgVGhlIHdpbmRvdyB0byBnZXQgdGhlIHRyaW0gYmFyIGZvcgorCSAqIEBwYXJhbSBzdgorCSAqICAgICAgICAgICAgVGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHNpZGUKKwkgKgorCSAqIEByZXR1cm4gVGhlIGFwcHJvcHJpYXRlIHRyaW0gYmFyCisJICovCisJcHVibGljIE1UcmltQmFyIGdldFRyaW0oTVRyaW1tZWRXaW5kb3cgd2luZG93LCBTaWRlVmFsdWUgc3YpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBhY3RpdmUgcGVyc3BlY3RpdmUgZm9yIHRoZSBnaXZlbiB3aW5kb3cuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBqdXN0CisJICogcmV0dXJucyB0aGUgTVBlcnNwZWN0aXZlU3RhY2sncyBzZWxlY3RlZEVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gd2luZG93CisJICogICAgICAgICAgICBUaGUgd2luZG93IHRvIGRldGVybWluZSB0aGUgYWN0aXZlIHBlcnNwZWN0aXZlIGZvci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjdGl2ZSBwZXJzcGVjdGl2ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBNUGVyc3BlY3RpdmVTdGFjaywgaXQncworCSAqICAgICAgICAgZW1wdHkgb3IgaGFzIG5vIHNlbGVjdGVkIGVsZW1lbnQuCisJICovCisJcHVibGljIE1QZXJzcGVjdGl2ZSBnZXRBY3RpdmVQZXJzcGVjdGl2ZShNV2luZG93IHdpbmRvdyk7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgd2lsbCBjbGVhbiB0aGUgbW9kZWwgb2YgYWxsIHRyYWNlcyBvZiBhIGdpdmVuIHBlcnNwZWN0aXZlLgorCSAqIFRoZXJlIG1heSBiZSBlbGVtZW50cyAoaS5lLiBtaW5pbWl6ZWQgc3RhY2tzLi4uKSBpbiB0aGUgd2luZG93J3MgdHJpbSB0aGF0IGFyZSBhc3NvY2lhdGVkCisJICogd2l0aCBhIHBlcnNwZWN0aXZlIGFzIHdlbGwgYXMgdGhlIG5lZWQgdG8gcHJvcGVybHkgY2xlYW4gdXAgYW55IGRldGFjaGVkIHdpbmRvd3MgYXNzb2NpYXRlZAorCSAqIHdpdGggdGhlIHBlcnNwZWN0aXZlLgorCSAqCisJICogQHBhcmFtIHBlcnNwCisJICogICAgICAgICAgICB0aGUgcGVyc3BlY3RpdmUgdG8gcmVtb3ZlCisJICogQHBhcmFtIHdpbmRvdworCSAqICAgICAgICAgICAgdGhlIHdpbmRvdyB0byByZW1vdmUgaXQgZnJvbQorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0UGVyc3BlY3RpdmVNb2RlbChNUGVyc3BlY3RpdmUgcGVyc3AsIE1XaW5kb3cgd2luZG93KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gcGVyc3BlY3RpdmUgY29tcGxldGVseSBmcm9tIHRoZSBtb2RlbC4KKwkgKgorCSAqIEBwYXJhbSBwZXJzcAorCSAqICAgICAgICAgICAgdGhlIHBlcnNwZWN0aXZlIHRvIHJlbW92ZQorCSAqIEBwYXJhbSB3aW5kb3cKKwkgKiAgICAgICAgICAgIHRoZSB3aW5kb3cgdG8gcmVtb3ZlIGl0IGZyb20KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVQZXJzcGVjdGl2ZU1vZGVsKE1QZXJzcGVjdGl2ZSBwZXJzcCwgTVdpbmRvdyB3aW5kb3cpOworCisJLyoqCisJICogQ291bnQgdGhlIG51bWJlciBvZiAndG9CZVJlbmRlcmVkJyBjaGlsZHJlbgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lcgorCSAqICAgICAgICAgICAgVGhlIGNvbnRhaW5lciB0byBjaGVjaworCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaGlsZHJlbiB3aG9zZSB0b0JlUmVuZGVyZWQgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPgorCSAqCisJICovCisJcHVibGljIGludCB0b0JlUmVuZGVyZWRDb3VudChNRWxlbWVudENvbnRhaW5lcjw/PiBjb250YWluZXIpOworCisJLyoqCisJICogR2V0IHRoZSBjb250YWluZXIgb2YgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCB3aWxsIGFsd2F5cyByZXR1cm4KKwkgKiB0aGUgYWN0dWFsIGNvbnRhaW5lciBmb3IgdGhlIGVsZW1lbnQsIGV2ZW4gd2hlcmUgdGhlIGVsZW1lbnQncyAnZ2V0UGFyZW50JyBtaWdodCByZXR1cm4gbnVsbAorCSAqICh0cmltLCBkZXRhY2hlZCB3aW5kb3dzLi4uKQorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGdldCB0aGUgY29udGFpbmVyIGZvcgorCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQncyBjb250YWluZXIuIFRoaXMgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGJlaW5nIGNoZWNrZWQKKwkgKiAgICAgICAgIGlzIGEgc25pcHBldCB1bmF0dGFjaGVkIHRvIHRoZSBVSSBNb2RlbCBpdHNlbGYuCisJICovCisJcHVibGljIE1VSUVsZW1lbnQgZ2V0Q29udGFpbmVyKE1VSUVsZW1lbnQgZWxlbWVudCk7CisKKwkvKioKKwkgKiBHaXZlbiBhbiBlbGVtZW50IHRoaXMgbWV0aG9kIHJlc3BvbmRzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdGhlIGVsZW1lbnQgZXhpc3RzIHdpdGhpbgorCSAqIHRoZSBjdXJyZW50IFVJIE1vZGVsLiBUaGlzIGlzIHVzZWQgaW4gY2FzZXMgd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgaWYgYW4gZWxlbWVudCBpcyBpbgorCSAqIHRoZSAnc2hhcmVkIGFyZWEnIG9yIG91dHNpZGUgb2YgYW55IHBlcnNwZWN0aXZlLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgVUksIHdpbGwgYmUgb25lIG9mOgorCSAqICAgICAgICAgPHVsPgorCSAqICAgICAgICAgPGxpPjxiPk5PVF9JTl9VSTo8L2I+IFRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUgVUkgbW9kZWwgYXQgYWxsPC9saT4KKwkgKiAgICAgICAgIDxsaT48Yj5PVVRTSURFX1BFUlNQRUNUSVZFOjwvYj4gVGhlIGVsZW1lbnQgbm90IHdpdGhpbiBhIHBlcnNwZWN0aXZlIHN0YWNrPC9saT4KKwkgKiAgICAgICAgIDxsaT48Yj5JTl9BQ1RJVkVfUEVSU1BFQ1RJVkU6PC9iPiBUaGUgZWxlbWVudCBpcyB3aXRoaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUKKwkgKiAgICAgICAgIHBlcnNwZWN0aXZlPC9saT4KKwkgKiAgICAgICAgIDxsaT48Yj5JTl9BTllfUEVSU1BFQ1RJVkU6PC9iPiBUaGUgZWxlbWVudCBpcyB3aXRoaW4gYSBwZXJzcGVjdGl2ZSBidXQgbm90IHRoZSBhY3RpdmUKKwkgKiAgICAgICAgIG9uZTwvbGk+CisJICogICAgICAgICA8bGk+PGI+SU5fU0hBUkVEX0FSRUE6PC9iPiBUaGUgZWxlbWVudCBpcyB3aXRoaW4gYW4gYXJlYSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuCisJICogICAgICAgICBkaWZmZXJlbnQgcGVyc3BlY3RpdmVzPC9saT4KKwkgKiAgICAgICAgIDwvdWw+CisJICovCisJcHVibGljIGludCBnZXRFbGVtZW50TG9jYXRpb24oTVVJRWxlbWVudCBlbGVtZW50KTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwYXJ0IGlkLgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBJbiBvcmRlciB0byBzdXBwb3J0IG11bHRpcGxlIGluc3RhbmNlIHBhcnRzIHRoZXJlIGlzIGEgY29udmVudGlvbiB3aGVyZSB0aGUKKwkgKiBwYXJ0J3MgaWQgbWF5IGJlIGluIHRoZSBmb3JtICdwYXJ0SWQ6c2Vjb25kYXJ5SWQnLiBJZiB0aGUgZ2l2ZW4gaWQgY29udGFpbnMgYSAnOicgdGhlbiBvbmx5CisJICogdGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlICc6JyB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgZGVzY3JpcHRvci4KKwkgKiA8L3A+CisJICogPHA+CisJICogSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIGNvbnZlbnRpb24gaXQncyByZXF1aXJlZCB0aGF0IG5vIGRlc2NyaXB0b3IgY29udGFpbiBhICc6JyBpbiBpdHMgaWQKKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZGVzY3JpcHRvciB0byByZXR1cm4KKwkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdG9yIG1hdGNoaW5nIHRoZSBpZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0cworCSAqLworCXB1YmxpYyBNUGFydERlc2NyaXB0b3IgZ2V0UGFydERlc2NyaXB0b3IoU3RyaW5nIGlkKTsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGVyZSB3aWxsIG5ldmVyIGJlIHR3byBwbGFjZWhvbGRlcnMgZm9yIHRoZSBzYW1lIHJlZmVyZW5jZWQgZWxlbWVudAorCSAqIHZpc2libGUgaW4gdGhlIHByZXNlbnRhdGlvbiBhdCB0aGUgc2FtZSB0aW1lLiBJdCBkb2VzIHRoaXMgYnkgaGlkaW5nIHBsYWNlaG9sZGVycyB3aGljaCBhcmUKKwkgKiBjb250YWluZWQgaW4gYW55IE1QZXJzcGVjdGl2ZSBpZiB0aGVyZSBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgZWxlbWVudCBpbiBhbnkgJ3NoYXJlZCcgYXJlYQorCSAqIChpLmUuIHZpc2libGUgcmVnYXJkbGVzcyBvZiB3aGljaCBwZXJzcGVjdGl2ZSBpcyB2aXNpYmxlKSBieSBzZXR0aW5nIGl0cyAndG9CZVJlbmRlcmVkJyBzdGF0ZQorCSAqIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSB3aW5kb3cKKwkgKiAgICAgICAgICAgIFRoZSB3aW5kb3cgdG8gbW9kaWZ5CisJICogQHBhcmFtIHBlcnNwZWN0aXZlCisJICogICAgICAgICAgICBpZiBub24tbnVsbCBzcGVjaWZpZXMgdGhlIHNwZWNpZmljIHBlcnNwZWN0aXZlIHRvIG1vZGlmeSwgb3RoZXJ3aXNlIGFsbAorCSAqICAgICAgICAgICAgcGVyc3BlY3RpdmVzIGluIHRoZSB3aW5kb3cgYXJlIGNoZWNrZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBoaWRlTG9jYWxQbGFjZWhvbGRlcnMoTVdpbmRvdyB3aW5kb3csIE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgc3VwcGxpZWQgZWxlbWVudCByZXByZXNlbnRzIHRoZSBzaW5nbGUgdmlzaWJsZSBlbGVtZW50IGluCisJICogdGhlIHNoYXJlZCBhcmVhLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHRlc3QgZm9yIHRoaXMgY29uZGl0aW9uIHNpbmNlIChieSBjb252ZW50aW9uKSB0aGVyZQorCSAqIG11c3QgYmUgYXQgbGVhc3Qgb25lIHN0YWNrIGluIHRoZSBzaGFyZWQgYXJlYSBhdCBhbGwgdGltZXMuCisJICoKKwkgKiBAcGFyYW0gc3RhY2sKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIHRlc3QKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgZWxlbWVudCBpcyB0aGUgbGFzdCB2aXNpYmxlIHN0YWNrCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMYXN0RWRpdG9yU3RhY2soTVVJRWxlbWVudCBzdGFjayk7CisKKwkvKioKKwkgKiBBbGxvd3MgYW4gZWxlbWVudCB0byBiZSByZW5kZXJlZCBpbiBhbiBhcmJpdHJhcnkgVUkgY29udGFpbmVyIChJLmUuIFNXVCBDb21wb3NpdGUpLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHRvIGJlIHJlbmRlcmVkLgorCSAqIEBwYXJhbSBob3N0V2luZG93CisJICogICAgICAgICAgICBUaGUgTVdpbmRvdyB0aGUgZWxlbWVudCBpcyBiZWluZyBob3N0ZWQgdW5kZXIuIE11c3QgYmUgbm9uLW51bGxhbmQgcmVuZGVyZWQuCisJICogQHBhcmFtIHVpQ29udGFpbmVyCisJICogICAgICAgICAgICBUaGUgVUkgY29udGFpbmVyIGFjdGluZyBhcyB0aGUgcmVuZGVyZWQgZWxlbWVudCdzIHBhcmVudC4gTXVzdCBiZSBub24tbnVsbC4KKwkgKiBAcGFyYW0gaG9zdENvbnRleHQKKwkgKiAgICAgICAgICAgIFRoZSBJRWNsaXBzZUNvbnRleHQgdG8gdXNlIGZvciBob3N0aW5nIHRoZSBlbGVtZW50LiBNdXN0IGJlIG5vbi1udWxsLgorCSAqLworCXB1YmxpYyB2b2lkIGhvc3RFbGVtZW50KE1VSUVsZW1lbnQgZWxlbWVudCwgTVdpbmRvdyBob3N0V2luZG93LCBPYmplY3QgdWlDb250YWluZXIsCisJCQlJRWNsaXBzZUNvbnRleHQgaG9zdENvbnRleHQpOworCisJLyoqCisJICogVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBiZWluZyAnaG9zdGVkJy4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhbGxvdyBVSSBFbGVtZW50cworCSAqIHRvIGFjdCBhcyBpZiB0aGV5IGFyZSBjb250YWluZWQgd2l0aGluIGEgZ2l2ZW4gTVdpbmRvdyBldmVuIHRob3VnaCB0aGUgZWxlbWVudCBpcyBub3QKKwkgKiBhY3R1YWxseSBzdHJ1Y3R1cmFsbHkgY29udGFpbmVkIGluIHRoYXQgd2luZG93J3MgVUkgTW9kZWwuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdG8gdGVzdC4gTXVzdCBiZSBub24tbnVsbC4KKwkgKiBAcGFyYW0gaG9zdFdpbmRvdworCSAqICAgICAgICAgICAgVGhlIHdpbmRvdyB0byB0ZXN0IHRoZSBlbGVtZW50IGFnYWluc3QuIE11c3QgYmUgbm9uLW51bGwuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgZ2l2ZW4gZWxlbWVudCBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBpcyBjdXJyZW50bHkgYmVpbmcKKwkgKiAgICAgICAgIGhvc3RlZCBpbiB0aGUgZ2l2ZW4gTVdpbmRvdy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0hvc3RlZEVsZW1lbnQoTVVJRWxlbWVudCBlbGVtZW50LCBNV2luZG93IGhvc3RXaW5kb3cpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FT2JqTW9kZWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0VPYmpNb2RlbEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2MyZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FT2JqTW9kZWxIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFNpbW9uIFNjaG9seiA8c2ltb24uc2Nob2x6QHZvZ2VsbGEuY29tPiAtIEJ1ZyA0NjA0MDUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKKworLyoqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgRU9iak1vZGVsSGFuZGxlciBleHRlbmRzIE1vZGVsSGFuZGxlckJhc2UgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgeworCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBUIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3M8VD4gYWRhcHRlclR5cGUpIHsKKwkJaWYgKGFkYXB0ZXJUeXBlLmlzSW5zdGFuY2UodGhpcykpIHsKKwkJCXJldHVybiBhZGFwdGVyVHlwZS5jYXN0KHRoaXMpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gbmV3IENsYXNzW10geyBNb2RlbEhhbmRsZXJCYXNlLmNsYXNzIH07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgaWQpIHsKKwkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVsZW1lbnQ7CisJCXJldHVybiBlT2JqLmVDb250ZW50cygpLnRvQXJyYXkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgaWQpIHsKKwkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVsZW1lbnQ7CisJCWlmIChlT2JqID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSBlT2JqLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShpZCk7CisJCWlmIChlRmVhdHVyZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIGVPYmouZUdldChlRmVhdHVyZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZ1tdIGdldFByb3BJZHMoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgU3RyaW5nWzBdOworCisJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbGVtZW50OworCQlFTGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gZU9iai5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7CisJCVN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbZmVhdHVyZXMuc2l6ZSgpXTsKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCVN0cmluZyBmZWF0dXJlTmFtZSA9IHN0cnVjdHVyYWxGZWF0dXJlLmdldE5hbWUoKTsKKwkJCWlkc1tjb3VudCsrXSA9IGZlYXR1cmVOYW1lOworCQl9CisKKwkJcmV0dXJuIGlkczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIGlkLCBPYmplY3QgdmFsdWUpIHsKKwkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVsZW1lbnQ7CisJCWlmIChlT2JqID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gZU9iai5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoaWQpOworCQlpZiAoZUZlYXR1cmUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQllT2JqLmVTZXQoZUZlYXR1cmUsIHZhbHVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0VQYXJ0U2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FUGFydFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI0OTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FUGFydFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFNpbW9uIFNjaG9seiA8c2ltb24uc2Nob2x6QHZvZ2VsbGEuY29tPiAtIEJ1ZyA0NTA0MTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QbGFjZWhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NSW5wdXRQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworCisvKioKKyAqIFRoZSBwYXJ0IHNlcnZpY2UgcHJvdmlkZXMgY2xpZW50cyB3aXRoIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2Ygc2hvd2luZyBhbmQgaGlkaW5nIHBhcnRzLiBQYXJ0CisgKiBldmVudHMgY2FuIGFsc28gYmUgdHJhY2tlZCB2aWEgdGhlIHBhcnQgc2VydmljZS4KKyAqIDxwPgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCBhbnkgbWV0aG9kcyB0aGF0IGFyZSBleHBvc2VkIGJ5IHRoaXMgc2VydmljZSB0aGF0IHRha2VzIGFuIDxjb2RlPk1QYXJ0PC9jb2RlPgorICogYXMgYW4gYXJndW1lbnQgYmUgYSBwYXJ0IHRoYXQgaXMgYWN0dWFsbHkgYmVpbmcgbWFuYWdlZCBieSB0aGlzIHNlcnZpY2UuCisgKiA8L3A+CisgKgorICogQHNpbmNlIDEuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVQYXJ0U2VydmljZSB7CisKKwkvKioKKwkgKiBVc2VkIHRvIHRhZyB0aGUgY3VycmVudGx5IGFjdGl2ZSBwYXJ0IGluIGEgcHJlc2VudGF0aW9uIGZvciBzdWJzZXF1ZW50IGFjdGl2YXRpb24gb24gc2Vzc2lvbgorCSAqIHN0YXJ0dXAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkVfT05fQ0xPU0VfVEFHID0gImFjdGl2ZU9uQ2xvc2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBcHBsaWNhYmxlIHN0YXRlcyB0aGF0IGEgcGFydCBjYW4gYmUgaW4uIFRoaXMgd2lsbCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKwkgKiB7QGxpbmsgRVBhcnRTZXJ2aWNlI3Nob3dQYXJ0KFN0cmluZywgUGFydFN0YXRlKX0uCisJICovCisJcHVibGljIGVudW0gUGFydFN0YXRlIHsKKworCQkvKioKKwkJICogUGFydCBzdGF0ZSB0aGF0IGluZGljYXRlcyB0aGUgcGFydCBzaG91bGQgYmUgbWFkZSB2aXNpYmxlIGFuZCBhY3RpdmF0ZWQuCisJCSAqLworCQlBQ1RJVkFURSwKKworCQkvKioKKwkJICogUGFydCBzdGF0ZSB0aGF0IGluZGljYXRlcyB0aGUgcGFydCBzaG91bGQgYmUgbWFkZSB2aXNpYmxlIHRob3VnaCBpdCBtYXkgbm90IG5lY2Vzc2FyaWx5CisJCSAqIGJlIGdyYW50ZWQgZm9jdXMuIElmIHRoZSBwYXJ0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIHN0YWNrIGFzIHRoZSBjdXJyZW50bHkgYWN0aXZlCisJCSAqIHBhcnQsIHRoZW4gdGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIDxjb2RlPkFDVElWQVRFPC9jb2RlPi4KKwkJICovCisJCVZJU0lCTEUsCisKKwkJLyoqCisJCSAqIFBhcnQgc3RhdGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHBhcnQgc2hvdWxkIGJlIGNyZWF0ZWQgYnV0IG5vdCBuZWNlc3NhcmlseSBtYWRlIHZpc2libGUuCisJCSAqLworCQlDUkVBVEUKKwl9CisKKwkvKioKKwkgKiBBIHRhZyBvbiBhIHBhcnQgdG8gaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbCB3aGVuIGl0IGlzIGhpZGRlbi4KKwkgKgorCSAqIEBzZWUgI2hpZGVQYXJ0KE1QYXJ0KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9PTl9ISURFX1RBRyA9ICJyZW1vdmVPbkhpZGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBZGRzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3IgcGFydCBsaWZlY3ljbGUgZXZlbnRzLiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBoYXMKKwkgKiBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4KKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gTGlzdGVuZXJzIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBhdHRhY2gKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQYXJ0TGlzdGVuZXIoSVBhcnRMaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBzbyB0aGF0IGl0IHdpbGwgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIG9mIHBhcnQgbGlmZWN5Y2xlIGV2ZW50cy4KKwkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KKwkgKgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVBhcnRMaXN0ZW5lcihJUGFydExpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gcGFydC4gVGhlIHBhcnQgd2lsbCBiZSBicm91Z2h0IHRvIHRvcCAoaWYgbmVjZXNzYXJ5KSBhbmQgZ3JhbnRlZCBmb2N1cy4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBhY3RpdmF0ZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY3RpdmF0ZShNUGFydCBwYXJ0KTsKKworCS8qKgorCSAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gcGFydC4gVGhlIHBhcnQgd2lsbCBiZSBicm91Z2h0IHRvIHRvcCAoaWYgbmVjZXNzYXJ5KSBhbmQsIGlmCisJICoge0Bjb2RlIHJlcXVpcmVzRm9jdXN9IGlzIHRydWUsIHRoZW4gZ3JhbnRlZCBmb2N1cy4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBhY3RpdmF0ZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gcmVxdWlyZXNGb2N1cworCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlbiBhbHNvIGNhdXNlIHRoZSBwYXJ0IHRvIGFjcXVpcmUgZm9jdXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY3RpdmF0ZShNUGFydCBwYXJ0LCBib29sZWFuIHJlcXVpcmVzRm9jdXMpOworCisJLyoqCisJICogQXNrIHRoZSBzZXJ2aWNlIHRvIGFzc2lnbiBhY3RpdmF0aW9uIHRvIGEgdmFsaWQgcGFydCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwcmVzZW50YXRpb24uCisJICovCisJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKTsKKworCS8qKgorCSAqIEJyaW5ncyB0aGlzIHBhcnQgdG8gdGhlIHRvcCBzbyB0aGF0IGl0IHdpbGwgYmVjb21lIHZpc2libGUgdG8gdGhlIGVuZCB1c2VyLiBUaGlzIGRvZXMgbm90CisJICogaW1wbHkgdGhhdCB0aGUgcGFydCB3aWxsIGJlIGdyYW50ZWQgZm9jdXMuCisJICoKKwkgKiBAcGFyYW0gcGFydAorCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gYnJpbmcgdG8gdG9wCisJICovCisJcHVibGljIHZvaWQgYnJpbmdUb1RvcChNUGFydCBwYXJ0KTsKKworCS8qKgorCSAqIEZpbmRzIGFuZCByZXR1cm5zIGEgcGFydCB3aXRoIHRoZSBnaXZlbiBpZC4KKwkgKgorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwYXJ0IHRvIHNlYXJjaCBmb3IsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiB0aGUgcGFydCB3aXRoIHRoZSBzcGVjaWZpZWQgaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggcGFydCBjb3VsZCBiZSBmb3VuZAorCSAqLworCXB1YmxpYyBNUGFydCBmaW5kUGFydChTdHJpbmcgaWQpOworCisJLyoqCisJICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIHRoZSBwYXJ0cyB0aGF0IGFyZSBiZWluZyBtYW5hZ2VkIGJ5IHRoaXMgcGFydCBzZXJ2aWNlLgorCSAqCisJICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcGFydHMgdGhhdCBhcmUgYmVpbmcgbWFuYWdlZCBieSB0aGlzIHNlcnZpY2UsIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIENvbGxlY3Rpb248TVBhcnQ+IGdldFBhcnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgcGFydC4KKwkgKgorCSAqIEByZXR1cm4gYW4gYWN0aXZlIHBhcnQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGlzIHNlcnZpY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcnQgaXMKKwkgKiAgICAgICAgIGN1cnJlbnRseSBhY3RpdmUKKwkgKi8KKwlwdWJsaWMgTVBhcnQgZ2V0QWN0aXZlUGFydCgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGFydCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgZW5kIHVzZXIuCisJICoKKwkgKiBAcGFyYW0gcGFydAorCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXJ0IGlzIGN1cnJlbnRseSB2aXNpYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQYXJ0VmlzaWJsZShNUGFydCBwYXJ0KTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgcGFydCBvZiB0aGUgZ2l2ZW4gaWQuCisJICoKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJ0LCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gYSBuZXcgcGFydCBvZiB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcnQgZGVzY3JpcHRvcnMgY2FuIGJlIGZvdW5kCisJICogICAgICAgICB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgaWQKKwkgKi8KKwlwdWJsaWMgTVBhcnQgY3JlYXRlUGFydChTdHJpbmcgaWQpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBwbGFjZWhvbGRlciBmb3IgYSBwYXJ0IG9mIHRoZSBnaXZlbiBpZC4KKwkgKgorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcnQsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiBhIG5ldyBwYXJ0IG9mIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFydCBkZXNjcmlwdG9ycyBjYW4gYmUgZm91bmQKKwkgKiAgICAgICAgIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBpZAorCSAqLworCXB1YmxpYyBNUGxhY2Vob2xkZXIgY3JlYXRlU2hhcmVkUGFydChTdHJpbmcgaWQpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBwbGFjZWhvbGRlciBmb3IgYSBwYXJ0IG9mIHRoZSBnaXZlbiBpZC4KKwkgKgorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcnQsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIGZvcmNlCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5ldyBwYXJ0IHNob3VsZCBiZSBjcmVhdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlCisJICogICAgICAgICAgICB3aW5kb3cgc2hvdWxkIGJlIHF1ZXJpZWQgZm9yIGEgc2hhcmVkIHBhcnQgZmlyc3QKKwkgKiBAcmV0dXJuIGEgbmV3IHBhcnQgb2YgdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJ0IGRlc2NyaXB0b3JzIGNhbiBiZSBmb3VuZAorCSAqICAgICAgICAgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGlkCisJICovCisJcHVibGljIE1QbGFjZWhvbGRlciBjcmVhdGVTaGFyZWRQYXJ0KFN0cmluZyBpZCwgYm9vbGVhbiBmb3JjZSk7CisKKwkvKioKKwkgKiBTaG93cyBhIHBhcnQgd2l0aCB0aGUgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQuIEluIHRoZSBldmVudCB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSBwYXJ0cworCSAqIHdpdGggdGhlIHNwZWNpZmllZCBpZCwgdGhlIGNsaWVudCBpcyByZWNvbW1lbmRlZCB0byB1c2Uge0BsaW5rICNnZXRQYXJ0cygpfSBhbmQgaXRlcmF0ZSBvdmVyCisJICogdGhlIGNvbGxlY3Rpb24gdG8gZmluZCB0aGUgaW50ZXJlc3RlZCBwYXJ0IGFuZCBpbnZva2Uge0BsaW5rICNzaG93UGFydChNUGFydCwgUGFydFN0YXRlKX0gb24KKwkgKiBpdC4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIGRpY3RhdGVkIGJ5IHRoZSBzdXBwbGllZCBzdGF0ZS4KKwkgKiA8dWw+CisJICogPGxpPklmIDxjb2RlPkFDVElWQVRFPC9jb2RlPiBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcGFydCBpcyBtYWRlIHZpc2libGUgYW5kIGdyYW50ZWQgZm9jdXMuCisJICogPC9saT4KKwkgKiA8bGk+SWYgPGNvZGU+VklTSUJMRTwvY29kZT4gaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHBhcnQgd2lsbCBiZSBtYWRlIHZpc2libGUgYW5kIHBvc3NpYmx5IGJlCisJICogZ3JhbnRlZCBmb2N1cyBkZXBlbmRpbmcgb24gd2hlcmUgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGFjdGl2ZSBwYXJ0LiBJZiBpdCBpcyBpbiB0aGUgc2FtZQorCSAqIHN0YWNrIGFzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBhcnQsIHRoZW4gaXQgd2lsbCBiZSBncmFudGVkIGZvY3VzLjwvbGk+CisJICogPGxpPklmIDxjb2RlPkNSRUFURTwvY29kZT4gaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHBhcnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgdGhvdWdoIGl0cworCSAqIGNvbnRlbnRzIG1heSBub3QgbmVjZXNzYXJpbHkgYmUgdmlzaWJsZSB0byB0aGUgZW5kIHVzZXIuIHZpc2libGUgdG8gdGhlIGVuZCB1c2VyLjwvbGk+CisJICogPC91bD4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJ0LCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJ0U3RhdGUKKwkgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIHN0YXRlIG9mIHRoZSBzaG93biBwYXJ0IHRvIGJlIGluCisJICogQHJldHVybiB0aGUgc2hvd24gcGFydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFydHMgb3IgcGFydCBkZXNjcmlwdG9ycyBjYW4gYmUgZm91bmQKKwkgKiAgICAgICAgIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBpZAorCSAqLworCXB1YmxpYyBNUGFydCBzaG93UGFydChTdHJpbmcgaWQsIFBhcnRTdGF0ZSBwYXJ0U3RhdGUpOworCisJLyoqCisJICogU2hvd3MgdGhlIGdpdmVuIHBhcnQuCisJICogPHA+CisJICogPHVsPgorCSAqIDxsaT5JZiB0aGVyZSBjYW5ub3QgYmUgbXVsdGlwbGUgcGFydHMgb2YgdGhpcyB0eXBlIGFuZCBhIHBhcnQgYWxyZWFkeSBleGlzdHMsIHRoZSBhbHJlYWR5CisJICogZXhpc3RpbmcgcGFydCB3aWxsIGJlIHNob3duIGFuZCByZXR1cm5lZC48L2xpPgorCSAqIDxsaT5JZiBtdWx0aXBsZSBwYXJ0cyBvZiB0aGlzIHR5cGUgaXMgYWxsb3dlZCwgdGhlbiB0aGUgcHJvdmlkZWQgcGFydCB3aWxsIGJlIHNob3duIGFuZAorCSAqIHJldHVybmVkPC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgZGljdGF0ZWQgYnkgdGhlIHN1cHBsaWVkIHN0YXRlLgorCSAqIDx1bD4KKwkgKiA8bGk+SWYgPGNvZGU+QUNUSVZBVEU8L2NvZGU+IGlzIHN1cHBsaWVkLCB0aGVuIHRoZSBwYXJ0IGlzIG1hZGUgdmlzaWJsZSBhbmQgZ3JhbnRlZCBmb2N1cy4KKwkgKiA8L2xpPgorCSAqIDxsaT5JZiA8Y29kZT5WSVNJQkxFPC9jb2RlPiBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcGFydCB3aWxsIGJlIG1hZGUgdmlzaWJsZSBhbmQgcG9zc2libHkgYmUKKwkgKiBncmFudGVkIGZvY3VzIGRlcGVuZGluZyBvbiB3aGVyZSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgYWN0aXZlIHBhcnQuIElmIGl0IGlzIGluIHRoZSBzYW1lCisJICogc3RhY2sgYXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFydCwgdGhlbiBpdCB3aWxsIGJlIGdyYW50ZWQgZm9jdXMuPC9saT4KKwkgKiA8bGk+SWYgPGNvZGU+Q1JFQVRFPC9jb2RlPiBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcGFydCB3aWxsIGJlIGluc3RhbnRpYXRlZCB0aG91Z2ggaXRzCisJICogY29udGVudHMgbWF5IG5vdCBuZWNlc3NhcmlseSBiZSB2aXNpYmxlIHRvIHRoZSBlbmQgdXNlci4gdmlzaWJsZSB0byB0aGUgZW5kIHVzZXIuPC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0CisJICogICAgICAgICAgICB0aGUgcGFydCB0byBzaG93CisJICogQHBhcmFtIHBhcnRTdGF0ZQorCSAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIHNob3duIHBhcnQgdG8gYmUgaW4KKwkgKiBAcmV0dXJuIHRoZSBzaG93biBwYXJ0CisJICovCisJcHVibGljIE1QYXJ0IHNob3dQYXJ0KE1QYXJ0IHBhcnQsIFBhcnRTdGF0ZSBwYXJ0U3RhdGUpOworCisJLyoqCisJICogSGlkZXMgdGhlIGdpdmVuIHBhcnQuIFRoZSBwYXJ0IG11c3QgYmUgYSBwYXJ0IG1hbmFnZWQgYnkgdGhpcyBzZXJ2aWNlLgorCSAqIDxwPgorCSAqIElmIHRoZSBwYXJ0IGhhcyBiZWVuIHRhZ2dlZCB3aXRoIHRoZSB7QGxpbmsgI1JFTU9WRV9PTl9ISURFX1RBR30gdGFnLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbQorCSAqIHRoZSBtb2RlbCB3aGVuIHRoZSBzZXJ2aWNlIGhpZGVzIGl0LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUbyBzYXZlIHRoZSBwYXJ0IGJlZm9yZSBoaWRpbmcsIHVzZSB7QGxpbmsgI3NhdmVQYXJ0KE1QYXJ0LCBib29sZWFuKX06CisJICogPC9wPgorCSAqCisJICogPHByZT4KKwkgKiBpZiAocGFydFNlcnZpY2Uuc2F2ZVBhcnQocGFydCwgdHJ1ZSkpIHsKKwkgKiAJcGFydFNlcnZpY2UuaGlkZVBhcnQocGFydCk7CisJICogfQorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIHBhcnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHRvIGhpZGUKKwkgKiBAc2VlICNzYXZlUGFydChNUGFydCwgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBoaWRlUGFydChNUGFydCBwYXJ0KTsKKworCS8qKgorCSAqIEhpZGVzIHRoZSBnaXZlbiBwYXJ0LiBUaGUgcGFydCBtdXN0IGJlIGEgcGFydCBtYW5hZ2VkIGJ5IHRoaXMgc2VydmljZS4KKwkgKiA8cD4KKwkgKiBJZiA8Y29kZT5mb3JjZTwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgdGhlIHBhcnQgaGFzIGJlZW4gdGFnZ2VkIHdpdGggdGhlCisJICoge0BsaW5rICNSRU1PVkVfT05fSElERV9UQUd9IHRhZywgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1vZGVsIHdoZW4gdGhlIHNlcnZpY2UgaGlkZXMgaXQuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRvIHNhdmUgdGhlIHBhcnQgYmVmb3JlIGhpZGluZywgdXNlIHtAbGluayAjc2F2ZVBhcnQoTVBhcnQsIGJvb2xlYW4pfToKKwkgKiA8L3A+CisJICoKKwkgKiA8cHJlPgorCSAqIGlmIChwYXJ0U2VydmljZS5zYXZlUGFydChwYXJ0LCB0cnVlKSkgeworCSAqIAlwYXJ0U2VydmljZS5oaWRlUGFydChwYXJ0KTsKKwkgKiB9CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gcGFydAorCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gaGlkZQorCSAqIEBwYXJhbSBmb3JjZQorCSAqICAgICAgICAgICAgaWYgdGhlIHBhcnQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwgcmVnYXJkbGVzcyBvZiBpdHMKKwkgKiAgICAgICAgICAgIHtAbGluayAjUkVNT1ZFX09OX0hJREVfVEFHfSB0YWcKKwkgKiBAc2VlICNzYXZlUGFydChNUGFydCwgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBoaWRlUGFydChNUGFydCBwYXJ0LCBib29sZWFuIGZvcmNlKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgZGlydHkgcGFydHMgdGhhdCBhcmUgYmVpbmcgbWFuYWdlZCBieSB0aGlzIHNlcnZpY2UuCisJICoKKwkgKgorCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGRpcnR5IHBhcnRzIHRoYXQgYXJlIGJlaW5nIG1hbmFnZWQgYnkgdGhpcyBzZXJ2aWNlLCBuZXZlcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgQ29sbGVjdGlvbjxNUGFydD4gZ2V0RGlydHlQYXJ0cygpOworCisJLyoqCisJICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXJ0IGlmIGl0IGlzIGRpcnR5IGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQuCisJICoKKwkgKiBAcGFyYW0gcGFydAorCSAqICAgICAgICAgICAgdGhlIHBhcnQgdG8gc2F2ZQorCSAqIEBwYXJhbSBjb25maXJtCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgcHJpb3IgdG8gc2F2aW5nIHRoZSBjaGFuZ2VzLCBhbmQKKwkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBzYXZlIGNoYW5nZXMgd2l0aG91dCBhc2tpbmcKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZQorCSAqICAgICAgICAgdXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgY2hhbmdlcworCSAqIEBzZWUgI2hpZGVQYXJ0KE1QYXJ0LCBib29sZWFuKQorCSAqLworCXB1YmxpYyBib29sZWFuIHNhdmVQYXJ0KE1QYXJ0IHBhcnQsIGJvb2xlYW4gY29uZmlybSk7CisKKwkvKioKKwkgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgYWxsIGRpcnR5IHBhcnRzIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQuCisJICoKKwkgKiBAcGFyYW0gY29uZmlybQorCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHByaW9yIHRvIHNhdmluZyB0aGUgY2hhbmdlcywgYW5kCisJICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc2F2ZSBjaGFuZ2VzIHdpdGhvdXQgYXNraW5nCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUKKwkgKiAgICAgICAgIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbiBvciBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGNoYW5nZXMKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYXZlQWxsKGJvb2xlYW4gY29uZmlybSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwge0BsaW5rIE1JbnB1dFBhcnR9IHdpdGggdGhlIGlucHV0VVJJLUF0dHJpYnV0ZSBzZXQgdG8gdGhlIGdpdmVuCisJICogdmFsdWUKKwkgKgorCSAqIEBwYXJhbSBpbnB1dFVyaQorCSAqICAgICAgICAgICAgdGhlIGlucHV0IHVyaSB0byBzZWFyY2ggZm9yLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gbGlzdCBvZiBwYXJ0cyBvciBhbiBlbXB0eSBjb2xsZWN0aW9uCisJICogQHRocm93cyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBudWxsIHBhc3NlZCBhcyBhcmd1bWVudAorCSAqLworCXB1YmxpYyBDb2xsZWN0aW9uPE1JbnB1dFBhcnQ+IGdldElucHV0UGFydHMoU3RyaW5nIGlucHV0VXJpKTsKKworCS8qKgorCSAqIFN3aXRjaCB0byB0aGUgc3BlY2lmaWVkIHBlcnNwZWN0aXZlLiBJdCB3aWxsIGJlIHNlbGVjdGVkIGFuZCBicm91Z2h0IHRvIHRvcCAoaWYgbmVjZXNzYXJ5KS4KKwkgKiBJdCBtYXkgbm90IG5lY2Vzc2FyaWx5IGJlIGdyYW50ZWQgZm9jdXMgaWYgdGhlcmUgaXMgYW5vdGhlciBhY3RpdmUgd2luZG93IHByZXNlbnQuCisJICoKKwkgKiBAcGFyYW0gcGVyc3BlY3RpdmUKKwkgKiAgICAgICAgICAgIHRoZSBwZXJzcGVjdGl2ZSB0byBzd2l0Y2ggdG8sIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpdCBtdXN0IGJlIGEKKwkgKiAgICAgICAgICAgIHBlcnNwZWN0aXZlIHRoYXQncyBiZWluZyBtYW5hZ2VkIGJ5IHRoaXMgc2VydmljZQorCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorCSAqLworCXB1YmxpYyB2b2lkIHN3aXRjaFBlcnNwZWN0aXZlKE1QZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSk7CisKKwkvKioKKwkgKiBJbmRpY2F0ZXMgd2hldGhlciBhIHBhcnQgd2l0aCBhIGNlcnRhaW4gZWxlbWVudElkIGlzIGN1cnJlbnRseSByZW5kZXJlZCBpbiBhIGNlcnRhaW4KKwkgKiBwZXJzcGVjdGl2ZSBvciBub3QuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudElkCisJICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHBhcnQsIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkCisJICogQHBhcmFtIHBlcnNwZWN0aXZlCisJICogICAgICAgICAgICB0aGUgcGVyc3BlY3RpdmUsIHdoaWNoIG1heSBjb250YWluIHRoZSBwYXJ0IHdpdGggdGhlIGdpdmVuIGVsZW1lbnRJZAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhcnQgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudElkIGlzIHJlbmRlcmVkIGluIHRoZSBnaXZlbgorCSAqICAgICAgICAgcGVyc3BlY3RpdmUgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAc2luY2UgMS4zCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQYXJ0T3JQbGFjZWhvbGRlckluUGVyc3BlY3RpdmUoU3RyaW5nIGVsZW1lbnRJZCwgTVBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0VQbGFjZWhvbGRlclJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0VQbGFjZWhvbGRlclJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0YjVhYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvRVBsYWNlaG9sZGVyUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGxhY2Vob2xkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1XaW5kb3c7DQorDQorLyoqDQorICogVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIGZyb20gTVBsYWNlaG9sZGVycy4NCisgKg0KKyAqIFRoZSBpc3N1ZSBpcyB0aGF0IHdlIG1heSBiZSBzdG9yaW5nIGEgY2xvbmVkIHNuaXBwZXQgd2hpY2ggY29udGFpbnMgcmVmZXJlbmNlcyB0byAnc2hhcmVkDQorICogZWxlbWVudHMnIGJ1dCBpbnN0YW50aWF0aW5nIHRoZSBzbmlwcGV0IGluIGEgbmV3IHdpbmRvdyByZXF1aXJlcyB0aGF0IHRoZSBzaGFyZWQgZWxlbWVudHMgbGlzdCBiZQ0KKyAqIHVwZGF0ZWQuDQorICoNCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4NCisgKiBAc2luY2UgMS4wDQorICovDQorcHVibGljIGludGVyZmFjZSBFUGxhY2Vob2xkZXJSZXNvbHZlciB7DQorCS8qKg0KKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlLXJlc29sdmUgYSBwbGFjZWhvbGRlcidzIHJlZmVyZW5jZSB0byBhICdzaGFyZWQgcGFydCcgd2l0aGluIHRoZQ0KKwkgKiBjb250ZXh0IG9mIGEgcGFydGljdWxhciB3aW5kb3cuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgcGxhY2Vob2xkZXJzIG11c3QgYmUgcmVmZXJlbmNpbmcgYW4NCisJICogZWxlbWVudCBpbiB0aGF0IHdpbmRvdydzICdzaGFyZWRQYXJ0cycgbGlzdC4NCisJICogPHA+DQorCSAqIEltcGxlbWVudG9ycyBtYXkgcHJlc3VtZSB0aGF0IHRoZSBpZiB0aGUgcGxhY2Vob2xkZXIncyByZWZlcmVuY2UgaXMgYWxyZWFkeSBub24tbnVsbCB0aGVuIGl0DQorCSAqIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuDQorCSAqIDwvcD4NCisJICoNCisJICogQHBhcmFtIHBoDQorCSAqICAgICAgICAgICAgVGhlIHBsYWNlaG9sZGVyIHRvIHNldCB0aGUgcmVmZXJlbmNlIGZvciAoaWYgbmVjZXNzYXJ5KQ0KKwkgKiBAcGFyYW0gcmVmV2luDQorCSAqICAgICAgICAgICAgVGhlIHdpbmRvdyB0aGUgd2hvc2Ugc2hhcmVkIHBhcnRzIGFyZSB0byBiZSByZWZlcmVuY2VkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZXNvbHZlUGxhY2Vob2xkZXJSZWYoTVBsYWNlaG9sZGVyIHBoLCBNV2luZG93IHJlZldpbik7DQorfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvRVNlbGVjdGlvblNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvRVNlbGVjdGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EyMzFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FU2VsZWN0aW9uU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLklTZXJ2aWNlQ29uc3RhbnRzOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyB0aGUgd29ya2JlbmNoIHNlbGVjdGlvbiBzZXJ2aWNlCisgKgorICogQHNpbmNlIDEuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVTZWxlY3Rpb25TZXJ2aWNlIHsKKworCS8qKgorCSAqIER1ZSB0byB0aGUgcG9zc2libHkgbWlzbGVhZGluZyBuYXR1cmUgb2YgdGhpcyBmaWVsZCdzIG5hbWUsIGl0IGhhcyBiZWVuIHJlcGxhY2VkIHdpdGgKKwkgKiB7QGxpbmsgSVNlcnZpY2VDb25zdGFudHMjQUNUSVZFX1NFTEVDVElPTn0uIEFsbCBjbGllbnRzIG9mIHRoaXMgQVBJIHNob3VsZCBjaGFuZ2UgdGhlaXIKKwkgKiByZWZlcmVuY2VzIHRvIDxjb2RlPklTZXJ2aWNlQ29uc3RhbnRzLkFDVElWRV9TRUxFQ1RJT048L2NvZGU+LgorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0gSVNlcnZpY2VDb25zdGFudHMuQUNUSVZFX1NFTEVDVElPTjsgLy8gImluLnNlbGVjdGlvbiI7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBnaXZlbiBzZWxlY3Rpb24gaW4gdGhlIGFjdGl2ZSBjb250ZXh0CisJICoKKwkgKiBAcGFyYW0gc2VsZWN0aW9uCisJICogICAgICAgICAgICB0aGUgbmV3IHNlbGVjdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3Qgc2VsZWN0aW9uKTsKKworCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIHNlbGVjdGlvbiBhcyB0aGUgcG9zdCBzZWxlY3Rpb24gZm9yIHRoZSBhY3RpdmUgY29udGV4dAorCSAqCisJICogQHBhcmFtIHNlbGVjdGlvbgorCSAqICAgICAgICAgICAgdGhlIG5ldyBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb3N0U2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pOworCisJLyoqCisJICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZnJvbSB0aGUgYWN0aXZlIGNvbnRleHQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlzIG5vdGhpbmcKKwkgKiBzZWxlY3RlZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIE9iamVjdCBnZXRTZWxlY3Rpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIHRoZSBwYXJ0IHdpdGggdGhlIGdpdmVuIGlkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uIG9yIHRoZSBwYXJ0IGRvZXMgbm90IGV4aXN0LgorCSAqCisJICogQHBhcmFtIHBhcnRJZAorCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwYXJ0IHRvIGdldCB0aGUgc2VsZWN0aW9uIGZyb20KKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgcGFydCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0aW9uKFN0cmluZyBwYXJ0SWQpOworCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4ge0BsaW5rIElTZWxlY3Rpb25MaXN0ZW5lcn0gdG8gdGhlIHNlcnZpY2UKKwkgKgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlZ2lzdGVyCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHtAbGluayBJU2VsZWN0aW9uTGlzdGVuZXJ9IGZyb20gdGhlIHNlcnZpY2UKKwkgKgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHVucmVnaXN0ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOworCisJLyoqCisJICogQWRkcyB0aGUge0BsaW5rIElTZWxlY3Rpb25MaXN0ZW5lcn0gdG8gdGhlIHNlcnZpY2UgZm9yIHRoZSBwYXJ0IHdpdGggdGhlIGdpdmVuIGlkLgorCSAqCisJICogQHBhcmFtIHBhcnRJZAorCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwYXJ0IHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yCisJICogQHBhcmFtIGxpc3RlbmVyCisJICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgcGFydElkLCBJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOworCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIElTZWxlY3Rpb25MaXN0ZW5lcn0gZnJvbSB0aGUgc2VydmljZSBmb3IgdGhlIGdpdmVuIHBhcnQgaWQuCisJICoKKwkgKiBAcGFyYW0gcGFydElkCisJICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHBhcnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmb3IKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byB1bnJlZ2lzdGVyCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU3RyaW5nIHBhcnRJZCwgSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIEFkZHMgdGhlIHtAbGluayBJU2VsZWN0aW9uTGlzdGVuZXJ9IGFzIGEgcG9zdCBzZWxlY3Rpb24gbGlzdGVuZXIgZm9yIHRoZSBzZXJ2aWNlLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyCisJICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBJU2VsZWN0aW9uTGlzdGVuZXJ9IGFzIGEgcG9zdCBzZWxlY3Rpb24gbGlzdGVuZXIgZm9yIHRoZSBzZXJ2aWNlLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyCisJICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gdW5yZWdpc3RlcgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOworCisJLyoqCisJICogQWRkcyB0aGUge0BsaW5rIElTZWxlY3Rpb25MaXN0ZW5lcn0gYXMgYSBwb3N0IHNlbGVjdGlvbiBsaXN0ZW5lciBmb3IgdGhlIHBhcnQgd2l0aCB0aGUgZ2l2ZW4KKwkgKiBpZC4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0SWQKKwkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcGFydCB0byBhZGQgdGhlIGxpc3RlbmVyIGZvcgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlZ2lzdGVyCisJICovCisJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBwYXJ0SWQsIElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgSVNlbGVjdGlvbkxpc3RlbmVyfSBhcyBhIHBvc3Qgc2VsZWN0aW9uIGxpc3RlbmVyIGZvciB0aGUgcGFydCB3aXRoIHRoZQorCSAqIGdpdmVuIGlkLgorCSAqCisJICogQHBhcmFtIHBhcnRJZAorCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwYXJ0IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZm9yCisJICogQHBhcmFtIGxpc3RlbmVyCisJICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gdW5yZWdpc3RlcgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgcGFydElkLCBJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FbGVtZW50TWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9FbGVtZW50TWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTU4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0VsZW1lbnRNYXRjaGVyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLlNlbGVjdG9yOworCisvKioKKyAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBTZWxlY3RvciB0aGF0IGltcGxlbWVudHMgdGhlIGV4aXN0aW5nICdmaW5kRWxlbWVudHMnLiBDbGllbnRzIG1heQorICogc3ViY2xhc3MgdGhpcyBhbmQgb3ZlcnJpZGUgdGhlICdzZWxlY3QnIG1ldGhvZCBpbiBvcmRlciB0byBkZWZpbmUgY3VzdG9tIGZpbHRlcnMuCisgKgorICogQHNpbmNlIDEuMQorICoKKyAqLworcHVibGljIGNsYXNzIEVsZW1lbnRNYXRjaGVyIGltcGxlbWVudHMgU2VsZWN0b3IgeworCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKKwlwcml2YXRlIENsYXNzPD8+IGNsYXp6ID0gbnVsbDsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiB0YWdzVG9NYXRjaCA9IG51bGw7CisKKwkvKioKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50SWQgb2YgdGhlIGRlc2lyZWQgZWxlbWVudAorCSAqIEBwYXJhbSBjbGF6egorCSAqICAgICAgICAgICAgVGhlIGNsYXNzIHNwZWNpZmljYXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudAorCSAqIEBwYXJhbSB0YWcKKwkgKiAgICAgICAgICAgIEEgdGFnIHdoaWNoIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkgKgorCSAqLworCXB1YmxpYyBFbGVtZW50TWF0Y2hlcihTdHJpbmcgaWQsIENsYXNzPD8+IGNsYXp6LCBTdHJpbmcgdGFnKSB7CisJCXRoaXMuaWQgPSBpZDsKKwkJdGhpcy5jbGF6eiA9IGNsYXp6OworCisJCWlmICh0YWcgIT0gbnVsbCkgeworCQkJdGFnc1RvTWF0Y2ggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCXRhZ3NUb01hdGNoLmFkZCh0YWcpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGlkCisJICogICAgICAgICAgICBUaGUgZWxlbWVudElkIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIFRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkgKiBAcGFyYW0gdGFnc1RvTWF0Y2gKKwkgKiAgICAgICAgICAgIEEgbGlzdCBvZiB0YWdzIHdoaWNoIG11c3QgPGI+YWxsPC9iPiBiZSBzcGVjaWZpZWQgb24gdGhlIGRlc2lyZWQgZWxlbWVudAorCSAqCisJICovCisJcHVibGljIEVsZW1lbnRNYXRjaGVyKFN0cmluZyBpZCwgQ2xhc3M8Pz4gY2xhenosIExpc3Q8U3RyaW5nPiB0YWdzVG9NYXRjaCkgeworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuY2xhenogPSBjbGF6ejsKKwkJdGhpcy50YWdzVG9NYXRjaCA9IHRhZ3NUb01hdGNoOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdChNQXBwbGljYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscyhlbGVtZW50LmdldEVsZW1lbnRJZCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKGNsYXp6ICE9IG51bGwgJiYgIShjbGF6ei5pc0luc3RhbmNlKGVsZW1lbnQpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKHRhZ3NUb01hdGNoICE9IG51bGwpIHsKKwkJCUxpc3Q8U3RyaW5nPiBlbGVtZW50VGFncyA9IGVsZW1lbnQuZ2V0VGFncygpOworCQkJZm9yIChTdHJpbmcgdGFnIDogdGFnc1RvTWF0Y2gpIHsKKwkJCQlpZiAoIWVsZW1lbnRUYWdzLmNvbnRhaW5zKHRhZykpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSURlbHRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lEZWx0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzljNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lEZWx0YS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKKy8qKgorICogQG5vcmVmZXJlbmNlIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURlbHRhIHsKKworCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCk7CisKKwlwdWJsaWMgSVN0YXR1cyBhcHBseSgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSU1vZGVsUmVjb25jaWxpbmdTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5ZDE3NwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSU1vZGVsUmVjb25jaWxpbmdTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKKworLyoqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJTW9kZWxSZWNvbmNpbGluZ1NlcnZpY2UgeworCisJLyoqCisJICogQ3JlYXRlcyBhIG1vZGVsIHJlY29uY2lsZXIgdGhhdCBpcyBjYXBhYmxlIG9mIHRyYWNraW5nIGRlbHRhIGNoYW5nZXMgb2YgYSBtb2RlbCBhbmQgYXBwbHlpbmcKKwkgKiBzYWlkIGNoYW5nZXMgdG8gYSBtb2RlbC4KKwkgKgorCSAqIEByZXR1cm4gYSByZWNvbmNpbGVyIGZvciB0cmFja2luZyBhbmQgYXBwbHlpbmcgbW9kZWwgY2hhbmdlcworCSAqLworCXB1YmxpYyBNb2RlbFJlY29uY2lsZXIgY3JlYXRlTW9kZWxSZWNvbmNpbGVyKCk7CisKKwkvKioKKwkgKiBBcHBsaWVzIGFsbCBvZiB0aGUgZGVsdGFzIHRvIHRoZSBtb2RlbCBhbmQgcmV0dXJucyBhIHN0YXR1cyByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUKKwkgKiBtZXJnaW5nIG9wZXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvIDxjb2RlPmFwcGx5RGVsdGFzKGRlbHRhcywgbnVsbCk8L2NvZGU+LgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBkZWx0YXMKKwkgKiAgICAgICAgICAgIHRoZSBkZWx0YXMgdG8gYXBwbHkgdG8gdGhlIG1vZGVsCisJICogQHJldHVybiB0aGUgcmVzdWx0aW5nIG91dGNvbWUgb2YgdGhlIG1lcmdlCisJICovCisJcHVibGljIElTdGF0dXMgYXBwbHlEZWx0YXMoQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBkZWx0YXMpOworCisJLyoqCisJICogQXBwbGllcyBhbGwgb2YgdGhlIGRlbHRhcyB0byB0aGUgbW9kZWwgYW5kIHJldHVybnMgYSBzdGF0dXMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgdGhlCisJICogbWVyZ2luZyBvcGVyYXRpb24uCisJICoKKwkgKiBAcGFyYW0gZGVsdGFzCisJICogICAgICAgICAgICB0aGUgZGVsdGFzIHRvIGFwcGx5IHRvIHRoZSBtb2RlbAorCSAqIEBwYXJhbSBmaWx0ZXJzCisJICogICAgICAgICAgICBhIGxpc3Qgb2YgZmlsdGVycyBmb3IgcHJldmVudGluZyB0aGUgYXBwbGljYXRpb24gb2YgYSBjZXJ0YWluIGRlbHRhLCB2YWxpZAorCSAqICAgICAgICAgICAgY2FuZGlkYXRlcyBhcmUgbGlzdGVkIGluIHtAbGluayBNb2RlbFJlY29uY2lsZXJ9CisJICogQHJldHVybiB0aGUgcmVzdWx0aW5nIG91dGNvbWUgb2YgdGhlIG1lcmdlCisJICovCisJcHVibGljIElTdGF0dXMgYXBwbHlEZWx0YXMoQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBkZWx0YXMsIFN0cmluZ1tdIGZpbHRlcnMpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JUGFydExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lQYXJ0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzI4NmNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JUGFydExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKKworLyoqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJUGFydExpc3RlbmVyIHsKKworCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoTVBhcnQgcGFydCk7CisKKwlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKE1QYXJ0IHBhcnQpOworCisJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKE1QYXJ0IHBhcnQpOworCisJcHVibGljIHZvaWQgcGFydEhpZGRlbihNUGFydCBwYXJ0KTsKKworCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKE1QYXJ0IHBhcnQpOworCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lTYXZlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JU2F2ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDhmNzEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JU2F2ZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworCisvKioKKyAqIEBub3JlZmVyZW5jZSBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElTYXZlSGFuZGxlciB7CisKKwlwdWJsaWMgZW51bSBTYXZlIHsKKwkJWUVTLCBOTywgQ0FOQ0VMCisJfQorCisJcHVibGljIGJvb2xlYW4gc2F2ZShNUGFydCBkaXJ0eVBhcnQsIGJvb2xlYW4gY29uZmlybSk7CisKKwlwdWJsaWMgYm9vbGVhbiBzYXZlUGFydHMoQ29sbGVjdGlvbjxNUGFydD4gZGlydHlQYXJ0cywgYm9vbGVhbiBjb25maXJtKTsKKworCXB1YmxpYyBTYXZlIHByb21wdFRvU2F2ZShNUGFydCBkaXJ0eVBhcnQpOworCisJcHVibGljIFNhdmVbXSBwcm9tcHRUb1NhdmUoQ29sbGVjdGlvbjxNUGFydD4gZGlydHlQYXJ0cyk7CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSVNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGQwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL0lTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQ7CisKKy8qKgorICogQG5vcmVmZXJlbmNlIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbkxpc3RlbmVyIHsKKworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoTVBhcnQgcGFydCwgT2JqZWN0IHNlbGVjdGlvbik7CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSVdpbmRvd0Nsb3NlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9JV2luZG93Q2xvc2VIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5N2UyYwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvSVdpbmRvd0Nsb3NlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVdpbmRvdzsKKworLyoqCisgKiBBIGhhbmRsZXIgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gb3IgYSBwYXJ0aWN1bGFyIHdpbmRvdyB0bworICogZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgY2xvc2VkIG9yIG5vdC4KKyAqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJV2luZG93Q2xvc2VIYW5kbGVyIHsKKworCXB1YmxpYyBib29sZWFuIGNsb3NlKE1XaW5kb3cgd2luZG93KTsKKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9Nb2RlbERlbHRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL01vZGVsRGVsdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVlMTFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9Nb2RlbERlbHRhLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubW9kZWxpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CisKKy8qKgorICogQG5vcmVmZXJlbmNlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsRGVsdGEgaW1wbGVtZW50cyBJRGVsdGEgeworCisJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2JqZWN0OworCXByaXZhdGUgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7CisJcHJpdmF0ZSBmaW5hbCBPYmplY3QgYXR0cmlidXRlVmFsdWU7CisKKwlwdWJsaWMgTW9kZWxEZWx0YShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgT2JqZWN0IGF0dHJpYnV0ZVZhbHVlKSB7CisJCUFzc2VydC5pc05vdE51bGwob2JqZWN0KTsKKwkJQXNzZXJ0LmlzTm90TnVsbChhdHRyaWJ1dGVOYW1lKTsKKworCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKKwkJdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKKwkJdGhpcy5hdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgeworCQlyZXR1cm4gb2JqZWN0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJcmV0dXJuIGF0dHJpYnV0ZU5hbWU7CisJfQorCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0KE9iamVjdCB2YWx1ZSkgeworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJRGVsdGEpIHsKKwkJCUlEZWx0YSBkZWx0YSA9IChJRGVsdGEpIHZhbHVlOworCQkJZGVsdGEuYXBwbHkoKTsKKwkJCXJldHVybiBkZWx0YS5nZXRPYmplY3QoKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3Q8Pz4pIHsKKwkJCUxpc3Q8Pz4gdmFsdWVzID0gKExpc3Q8Pz4pIHZhbHVlOworCQkJTGlzdDxPYmplY3Q+IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4odmFsdWVzLnNpemUoKSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykgeworCQkJCU9iamVjdCBvYmplY3QgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJRGVsdGEpIHsKKwkJCQkJSURlbHRhIGRlbHRhID0gKElEZWx0YSkgb2JqZWN0OworCQkJCQlkZWx0YS5hcHBseSgpOworCQkJCQlvYmplY3QgPSBkZWx0YS5nZXRPYmplY3QoKTsKKwkJCQl9CisJCQkJb2JqZWN0cy5hZGQob2JqZWN0KTsKKwkJCX0KKworCQkJcmV0dXJuIG9iamVjdHM7CisJCX0KKworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKKwkJcmV0dXJuIGNvbnZlcnQoYXR0cmlidXRlVmFsdWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9Nb2RlbEhhbmRsZXJCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL01vZGVsSGFuZGxlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFkMjllCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9Nb2RlbEhhbmRsZXJCYXNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZzsKKworLyoqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyQmFzZSB7CisJcHJvdGVjdGVkIE1vZGVsSGFuZGxlckJhc2UoKSB7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIGlkKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgaWQsIE9iamVjdCB2YWx1ZSkgeworCX0KKworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCwgU3RyaW5nIGlkKSB7CisJCXJldHVybiBuZXcgT2JqZWN0WzBdOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wSWRzKE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBuZXcgU3RyaW5nWzBdOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvTW9kZWxSZWNvbmNpbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL01vZGVsUmVjb25jaWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzJjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL21vZGVsaW5nL01vZGVsUmVjb25jaWxlci5qYXZhCkBAIC0wLDAgKzEsNDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5tb2RlbGluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLmNvbW1hbmRzLmltcGwuQ29tbWFuZHNQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuaW1wbC5BZHZhbmNlZFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLmltcGwuQmFzaWNQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5pbXBsLlVpUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkubWVudS5pbXBsLk1lbnVQYWNrYWdlSW1wbDsKKworLyoqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kZWxSZWNvbmNpbGVyIHsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1BcHBsaWNhdGlvbkVsZW1lbnRzICh2YWx1ZSBpcyA8Y29kZT5lbGVtZW50SWQ8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTkVMRU1FTlRfRUxFTUVOVElEX0FUVE5BTUUgPSBBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEFwcGxpY2F0aW9uRWxlbWVudF9FbGVtZW50SWQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQXBwbGljYXRpb25FbGVtZW50cyAodmFsdWUgaXMgPGNvZGU+dGFnczwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9ORUxFTUVOVF9UQUdTX0FUVE5BTUUgPSBBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEFwcGxpY2F0aW9uRWxlbWVudF9UYWdzKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUFwcGxpY2F0aW9uRWxlbWVudHMgKHZhbHVlIGlzIDxjb2RlPmNsb25hYmxlU25pcHBldHM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTklQUEVUQ09OVEFJTkVSX1NOSVBQRVRTX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFNuaXBwZXRDb250YWluZXJfU25pcHBldHMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQXBwbGljYXRpb25zICh2YWx1ZSBpcyA8Y29kZT5jb21tYW5kczwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0NPTU1BTkRTX0FUVE5BTUUgPSBBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEFwcGxpY2F0aW9uX0NvbW1hbmRzKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUFwcGxpY2F0aW9ucyAodmFsdWUgaXMgPGNvZGU+YWRkb25zPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQURET05TX0FUVE5BTUUgPSBBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEFwcGxpY2F0aW9uX0FkZG9ucygpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1Db250ZXh0cyAodmFsdWUgaXMgPGNvZGU+cHJvcGVydGllczwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUFJPUEVSVElFU19BVFROQU1FID0gVWlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRDb250ZXh0X1Byb3BlcnRpZXMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQXBwbGljYXRpb25FbGVtZW50cyAodmFsdWUgaXMgPGNvZGU+cGVyc2lzdGVkU3RhdGU8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTkVMRU1FTlRfUEVSU0lTVEVEU1RBVEVfQVRUTkFNRSA9IEFwcGxpY2F0aW9uUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0QXBwbGljYXRpb25FbGVtZW50X1BlcnNpc3RlZFN0YXRlKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUNvbnRyaWJ1dGlvbnMgKHZhbHVlIGlzIDxjb2RlPmNvbnRyaWJ1dGlvblVSSTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTl9VUklfQVRUTkFNRSA9IEFwcGxpY2F0aW9uUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0Q29udHJpYnV0aW9uX0NvbnRyaWJ1dGlvblVSSSgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1IYW5kbGVyQ29udGFpbmVycyAodmFsdWUgaXMgPGNvZGU+aGFuZGxlcnM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSQ09OVEFJTkVSX0hBTkRMRVJTX0FUVE5BTUUgPSBDb21tYW5kc1BhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEhhbmRsZXJDb250YWluZXJfSGFuZGxlcnMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNVUlMYWJlbHMgKHZhbHVlIGlzIDxjb2RlPmxhYmVsPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlMQUJFTF9MQUJFTF9BVFROQU1FID0gVWlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UuZ2V0VUlMYWJlbF9MYWJlbCgpCisJCQkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVVJTGFiZWxzICh2YWx1ZSBpcyA8Y29kZT50b29sdGlwPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlMQUJFTF9UT09MVElQX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFVJTGFiZWxfVG9vbHRpcCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1VSUxhYmVscyAodmFsdWUgaXMgPGNvZGU+aWNvblVSSTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJTEFCRUxfSUNPTlVSSV9BVFROQU1FID0gVWlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRVSUxhYmVsX0ljb25VUkkoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNVUlFbGVtZW50cyAodmFsdWUgaXMgPGNvZGU+dG9CZVJlbmRlcmVkPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlFTEVNRU5UX1RPQkVSRU5ERVJFRF9BVFROQU1FID0gVWlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRVSUVsZW1lbnRfVG9CZVJlbmRlcmVkKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVVJRWxlbWVudHMgKHZhbHVlIGlzIDxjb2RlPnZpc2libGU8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSUVMRU1FTlRfVklTSUJMRV9BVFROQU1FID0gVWlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRVSUVsZW1lbnRfVmlzaWJsZSgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1VSUVsZW1lbnRzICh2YWx1ZSBpcyA8Y29kZT5wYXJlbnQ8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSUVMRU1FTlRfUEFSRU5UX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFVJRWxlbWVudF9QYXJlbnQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNVUlFbGVtZW50cyAodmFsdWUgaXMgPGNvZGU+Y29udGFpbmVyRGF0YTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJRUxFTUVOVF9DT05UQUlORVJEQVRBX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFVJRWxlbWVudF9Db250YWluZXJEYXRhKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVVJRWxlbWVudHMgKHZhbHVlIGlzIDxjb2RlPnZpc2libGVXaGVuPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlFTEVNRU5UX1ZJU0lCTEVXSEVOX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFVJRWxlbWVudF9WaXNpYmxlV2hlbigpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1FbGVtZW50Q29udGFpbmVycyAodmFsdWUgaXMgPGNvZGU+Y2hpbGRyZW48L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UQ09OVEFJTkVSX0NISUxEUkVOX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEVsZW1lbnRDb250YWluZXJfQ2hpbGRyZW4oKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNRWxlbWVudENvbnRhaW5lcnMgKHZhbHVlIGlzIDxjb2RlPnNlbGVjdGVkRWxlbWVudDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRDT05UQUlORVJfU0VMRUNURURFTEVNRU5UX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEVsZW1lbnRDb250YWluZXJfU2VsZWN0ZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVdpbmRvd3MgKHZhbHVlIGlzIDxjb2RlPng8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfWF9BVFROQU1FID0gQmFzaWNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UuZ2V0V2luZG93X1goKQorCQkJLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1XaW5kb3dzICh2YWx1ZSBpcyA8Y29kZT55PC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX1lfQVRUTkFNRSA9IEJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFLmdldFdpbmRvd19ZKCkKKwkJCS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNV2luZG93cyAodmFsdWUgaXMgPGNvZGU+d2lkdGg8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfV0lEVEhfQVRUTkFNRSA9IEJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFLmdldFdpbmRvd19XaWR0aCgpCisJCQkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVdpbmRvd3MgKHZhbHVlIGlzIDxjb2RlPmhlaWdodDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19IRUlHSFRfQVRUTkFNRSA9IEJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0V2luZG93X0hlaWdodCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1XaW5kb3dzICh2YWx1ZSBpcyA8Y29kZT5tYWluTWVudTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19NQUlOTUVOVV9BVFROQU1FID0gQmFzaWNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRXaW5kb3dfTWFpbk1lbnUoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNV2luZG93cyAodmFsdWUgaXMgPGNvZGU+c2hhcmVkRWxlbWVudHM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfU0hBUkVERUxFTUVOVFNfQVRUTkFNRSA9IEJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0V2luZG93X1NoYXJlZEVsZW1lbnRzKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVRyaW1tZWRXaW5kb3dzICh2YWx1ZSBpcyA8Y29kZT50cmltQmFyczwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU1NRURXSU5ET1dfVFJJTUJBUlNfQVRUTkFNRSA9IEJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0VHJpbW1lZFdpbmRvd19UcmltQmFycygpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1Db21tYW5kcyAodmFsdWUgaXMgPGNvZGU+Y29tbWFuZE5hbWU8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0NPTU1BTkROQU1FX0FUVE5BTUUgPSBDb21tYW5kc1BhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldENvbW1hbmRfQ29tbWFuZE5hbWUoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQ29tbWFuZHMgKHZhbHVlIGlzIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9ERVNDUklQVElPTl9BVFROQU1FID0gQ29tbWFuZHNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRDb21tYW5kX0Rlc2NyaXB0aW9uKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUNvbW1hbmRzICh2YWx1ZSBpcyA8Y29kZT5wYXJhbWV0ZXJzPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9QQVJBTUVURVJTX0FUVE5BTUUgPSBDb21tYW5kc1BhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldENvbW1hbmRfUGFyYW1ldGVycygpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1LZXlTZXF1ZW5jZXMgKHZhbHVlIGlzIDxjb2RlPmtleVNlcXVlbmNlPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU0VRVUVOQ0VfS0VZU0VRVUVOQ0VfQVRUTkFNRSA9IENvbW1hbmRzUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0S2V5U2VxdWVuY2VfS2V5U2VxdWVuY2UoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNUGFydHMgKHZhbHVlIGlzIDxjb2RlPmNsb3NlYWJsZTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfQ0xPU0VBQkxFX0FUVE5BTUUgPSBCYXNpY1BhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFBhcnRfQ2xvc2VhYmxlKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVBhcnRzICh2YWx1ZSBpcyA8Y29kZT5tZW51czwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTUVOVVNfQVRUTkFNRSA9IEJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFLmdldFBhcnRfTWVudXMoKQorCQkJLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1QYXJ0cyAodmFsdWUgaXMgPGNvZGU+dG9vbGJhcjwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfVE9PTEJBUl9BVFROQU1FID0gQmFzaWNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UuZ2V0UGFydF9Ub29sYmFyKCkKKwkJCS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNSW5wdXRzICh2YWx1ZSBpcyA8Y29kZT5pbnB1dFVSSTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0lOUFVUVVJJX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRS5nZXRJbnB1dF9JbnB1dFVSSSgpCisJCQkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUdlbmVyaWNUaWxlcyAodmFsdWUgaXMgPGNvZGU+aG9yaXpvbnRhbDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNUSUxFX0hPUklaT05UQUxfQVRUTkFNRSA9IFVpUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0R2VuZXJpY1RpbGVfSG9yaXpvbnRhbCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1HZW5lcmljVHJpbUNvbnRhaW5lcnMgKHZhbHVlIGlzIDxjb2RlPnNpZGU8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDVFJJTUNPTlRBSU5FUl9TSURFX0FUVE5BTUUgPSBVaVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEdlbmVyaWNUcmltQ29udGFpbmVyX1NpZGUoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQmluZGluZ0NvbnRhaW5lcnMgKHZhbHVlIGlzIDxjb2RlPnJvb3RDb250ZXh0PC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR0NPTlRBSU5FUl9ST09UQ09OVEVYVF9BVFROQU1FID0gQ29tbWFuZHNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRCaW5kaW5nVGFibGVDb250YWluZXJfUm9vdENvbnRleHQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQmluZGluZ0NvbnRhaW5lcnMgKHZhbHVlIGlzIDxjb2RlPmJpbmRpbmdUYWJsZXM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HQ09OVEFJTkVSX0JJTkRJTkdUQUJMRVNfQVRUTkFNRSA9IENvbW1hbmRzUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0QmluZGluZ1RhYmxlQ29udGFpbmVyX0JpbmRpbmdUYWJsZXMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQmluZGluZ1RhYmxlcyAodmFsdWUgaXMgPGNvZGU+YmluZGluZ3M8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HVEFCTEVfQklORElOR1NfQVRUTkFNRSA9IENvbW1hbmRzUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0QmluZGluZ1RhYmxlX0JpbmRpbmdzKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUJpbmRpbmdUYWJsZXMgKHZhbHVlIGlzIDxjb2RlPmJpbmRpbmdDb250ZXh0PC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR1RBQkxFX0JJTkRJTkdDT05URVhUX0FUVE5BTUUgPSBDb21tYW5kc1BhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEJpbmRpbmdUYWJsZV9CaW5kaW5nQ29udGV4dCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1CaW5kaW5ncyAodmFsdWUgaXMgPGNvZGU+YmluZGluZ0NvbnRleHRzPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR1NfQklORElOR0NPTlRFWFRTX0FUVE5BTUUgPSBDb21tYW5kc1BhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEJpbmRpbmdzX0JpbmRpbmdDb250ZXh0cygpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1IYW5kbGVycyAodmFsdWUgaXMgPGNvZGU+Y29tbWFuZDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ09NTUFORF9BVFROQU1FID0gQ29tbWFuZHNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRIYW5kbGVyX0NvbW1hbmQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNSGFuZGxlZEl0ZW1zICh2YWx1ZSBpcyA8Y29kZT5jb21tYW5kPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFRElURU1fQ09NTUFORF9BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEhhbmRsZWRJdGVtX0NvbW1hbmQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNSGFuZGxlZEl0ZW1zICh2YWx1ZSBpcyA8Y29kZT5wYXJhbWV0ZXJzPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFRElURU1fUEFSQU1FVEVSU19BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldEhhbmRsZWRJdGVtX1BhcmFtZXRlcnMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNS2V5QmluZGluZ3MgKHZhbHVlIGlzIDxjb2RlPmNvbW1hbmQ8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlCSU5ESU5HX0NPTU1BTkRfQVRUTkFNRSA9IENvbW1hbmRzUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0S2V5QmluZGluZ19Db21tYW5kKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUl0ZW1zICh2YWx1ZSBpcyA8Y29kZT5lbmFibGVkPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9FTkFCTEVEX0FUVE5BTUUgPSBNZW51UGFja2FnZUltcGwuZUlOU1RBTkNFLmdldEl0ZW1fRW5hYmxlZCgpCisJCQkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUl0ZW1zICh2YWx1ZSBpcyA8Y29kZT5zZWxlY3RlZDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fU0VMRUNURURfQVRUTkFNRSA9IE1lbnVQYWNrYWdlSW1wbC5lSU5TVEFOQ0UuZ2V0SXRlbV9TZWxlY3RlZCgpCisJCQkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTUl0ZW1zICh2YWx1ZSBpcyA8Y29kZT50eXBlPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9UWVBFX0FUVE5BTUUgPSBNZW51UGFja2FnZUltcGwuZUlOU1RBTkNFLmdldEl0ZW1fVHlwZSgpCisJCQkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTU1lbnVJdGVtcyAodmFsdWUgaXMgPGNvZGU+bW5lbW9uaWNzPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVUlURU1fTU5FTU9OSUNTX0FUVE5BTUUgPSBNZW51UGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0TWVudUVsZW1lbnRfTW5lbW9uaWNzKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVRyaW1Db250cmlidXRpb24gKHZhbHVlIGlzIDxjb2RlPnBhcmVudElkPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTUNPTlRSSUJVVElPTl9QQVJFTlRJRF9BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFRyaW1Db250cmlidXRpb25fUGFyZW50SWQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNVHJpbUNvbnRyaWJ1dGlvbiAodmFsdWUgaXMgPGNvZGU+cG9zaXRpb25JblBhcmVudDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU1DT05UUklCVVRJT05fUE9TSVRJT05JTlBBUkVOVF9BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFRyaW1Db250cmlidXRpb25fUG9zaXRpb25JblBhcmVudCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1UcmltQ29udHJpYnV0aW9ucyAodmFsdWUgaXMgPGNvZGU+dHJpbUNvbnRyaWJ1dGlvbnM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUklNQ09OVFJJQlVUSU9OU19UUklNQ09OVFJJQlVUSU9OU19BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFRyaW1Db250cmlidXRpb25zX1RyaW1Db250cmlidXRpb25zKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVRvb2xCYXJDb250cmlidXRpb24gKHZhbHVlIGlzIDxjb2RlPnBhcmVudElkPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUkNPTlRSSUJVVElPTl9QQVJFTlRJRF9BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFRvb2xCYXJDb250cmlidXRpb25fUGFyZW50SWQoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNVG9vbEJhckNvbnRyaWJ1dGlvbiAodmFsdWUgaXMgPGNvZGU+cG9zaXRpb25JblBhcmVudDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xCQVJDT05UUklCVVRJT05fUE9TSVRJT05JTlBBUkVOVF9BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFRvb2xCYXJDb250cmlidXRpb25fUG9zaXRpb25JblBhcmVudCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1Ub29sQmFyQ29udHJpYnV0aW9ucyAodmFsdWUgaXMgPGNvZGU+dG9vbEJhckNvbnRyaWJ1dGlvbnM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MQkFSQ09OVFJJQlVUSU9OU19UT09MQkFSQ09OVFJJQlVUSU9OU19BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldFRvb2xCYXJDb250cmlidXRpb25zX1Rvb2xCYXJDb250cmlidXRpb25zKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTU1lbnVDb250cmlidXRpb25zICh2YWx1ZSBpcyA8Y29kZT5tZW51Q29udHJpYnV0aW9uczwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVDT05UUklCVVRJT05TX01FTlVDT05UUklCVVRJT05TX0FUVE5BTUUgPSBNZW51UGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0TWVudUNvbnRyaWJ1dGlvbnNfTWVudUNvbnRyaWJ1dGlvbnMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNTWVudUNvbnRyaWJ1dGlvbiAodmFsdWUgaXMgPGNvZGU+cG9zaXRpb25JblBhcmVudDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVDT05UUklCVVRJT05fUE9TSVRJT05JTlBBUkVOVF9BVFROQU1FID0gTWVudVBhY2thZ2VJbXBsLmVJTlNUQU5DRQorCQkJLmdldE1lbnVDb250cmlidXRpb25fUG9zaXRpb25JblBhcmVudCgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1NZW51Q29udHJpYnV0aW9uICh2YWx1ZSBpcyA8Y29kZT5wYXJlbnRJRDwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVDT05UUklCVVRJT05fUEFSRU5USURfQVRUTkFNRSA9IE1lbnVQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRNZW51Q29udHJpYnV0aW9uX1BhcmVudElkKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVBhcnREZXNjcmlwdG9yICh2YWx1ZSBpcyA8Y29kZT5hbGxvd011bHRpcGxlPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVERFU0NSSVBUT1JfQUxMT1dNVUxUSVBMRV9BVFROQU1FID0gb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5pbXBsLkJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0UGFydERlc2NyaXB0b3JfQWxsb3dNdWx0aXBsZSgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1QYXJ0RGVzY3JpcHRvciAodmFsdWUgaXMgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUREVTQ1JJUFRPUl9DQVRFR09SWV9BVFROQU1FID0gb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5pbXBsLkJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0UGFydERlc2NyaXB0b3JfQ2F0ZWdvcnkoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNUGFydERlc2NyaXB0b3JDb250YWluZXJzICh2YWx1ZSBpcyA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRERVNDUklQVE9SQ09OVEFJTkVSX0RFU0NSSVBUT1JTX0FUVE5BTUUgPSBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5kZXNjcmlwdG9yLmJhc2ljLmltcGwuQmFzaWNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRQYXJ0RGVzY3JpcHRvckNvbnRhaW5lcl9EZXNjcmlwdG9ycygpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1QYXJ0RGVzY3JpcHRvciAodmFsdWUgaXMgPGNvZGU+bWVudXM8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUREVTQ1JJUFRPUl9NRU5VU19BVFROQU1FID0gb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uZGVzY3JpcHRvci5iYXNpYy5pbXBsLkJhc2ljUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0UGFydERlc2NyaXB0b3JfTWVudXMoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNUGxhY2Vob2xkZXJzICh2YWx1ZSBpcyA8Y29kZT5yZWY8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFDRUhPTERFUl9SRUZfTkFNRSA9IEFkdmFuY2VkUGFja2FnZUltcGwuZUlOU1RBTkNFCisJCQkuZ2V0UGxhY2Vob2xkZXJfUmVmKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVBhcmFtZXRlcnMgKHZhbHVlIGlzIDxjb2RlPm5hbWU8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTkFNRV9BVFROQU1FID0gQ29tbWFuZHNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRQYXJhbWV0ZXJfTmFtZSgpLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEF0dHJpYnV0ZSBkZWZpbmVkIGJ5IE1QYXJhbWV0ZXJzICh2YWx1ZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9WQUxVRV9BVFROQU1FID0gQ29tbWFuZHNQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRQYXJhbWV0ZXJfVmFsdWUoKS5nZXROYW1lKCk7CisKKwkvKioKKwkgKiBBdHRyaWJ1dGUgZGVmaW5lZCBieSBNQ29yZUV4cHJlc3Npb25zICh2YWx1ZSBpcyA8Y29kZT5jb3JlRXhwcmVzc2lvbklkPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRUVYUFJFU1NJT05fQ09SRUVYUFJFU1NJT05JRF9BVFROQU1FID0gVWlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRDb3JlRXhwcmVzc2lvbl9Db3JlRXhwcmVzc2lvbklkKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQXR0cmlidXRlIGRlZmluZWQgYnkgTVBlcnNwZWN0aXZlICh2YWx1ZSBpcyA8Y29kZT53aW5kb3dzPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfV0lORE9XU19BVFROQU1FID0gQWR2YW5jZWRQYWNrYWdlSW1wbC5lSU5TVEFOQ0UKKwkJCS5nZXRQZXJzcGVjdGl2ZV9XaW5kb3dzKCkuZ2V0TmFtZSgpOworCisJLyoqCisJICogQmVnaW4gcmVjb3JkaW5nIGNoYW5nZXMgb24gdGhlIHNwZWNpZmllZCBvYmplY3QuIEFsbCBjaGFuZ2VzIGNvbnRhaW5lZCB3aXRoaW4gY2hpbGQgZWxlbWVudHMKKwkgKiBvZiB0aGUgb2JqZWN0IHdpbGwgYWxzbyBiZSByZWNvcmRlZC4gV2hlbiB0aGUgZGVzaXJlZCBjaGFuZ2VzIGhhdmUgYmVlbiBjYXB0dXJlZCwKKwkgKiB7QGxpbmsgI3NlcmlhbGl6ZSgpfSBzaG91bGQgYmUgY2FsbGVkLgorCSAqCisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBtb25pdG9yIGNoYW5nZXMgZm9yLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlY29yZENoYW5nZXMoT2JqZWN0IG9iamVjdCk7CisKKwkvKioKKwkgKiBTZXJpYWxpemVzIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBjYXB0dXJlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisJICoge0BsaW5rICNyZWNvcmRDaGFuZ2VzKE9iamVjdCl9IGFuZCByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGxhdGVyIHdpdGgKKwkgKiB7QGxpbmsgI2NvbnN0cnVjdERlbHRhcyhPYmplY3QsIE9iamVjdCl9LgorCSAqCisJICogQHJldHVybiBhIHNlcmlhbGl6YXRpb24gb2YgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIG1vZGVsIHNpbmNlIHRoZSBsYXN0CisJICogICAgICAgICBjYWxsIHRvIDxjb2RlPnJlY29yZENoYW5nZXMoT2JqZWN0KTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHNlcmlhbGl6ZSgpOworCisJLyoqCisJICogQW5hbHl6ZXMgdGhlIG1vZGVsIGFuZCBpdHMgc2VyaWFsaXplZCBzdGF0ZSBhbmQgY29uc3RydWN0cyBhIGNvbGxlY3Rpb24gb2YgZGVsdGFzIGJldHdlZW4gdGhlCisJICogdHdvLgorCSAqCisJICogQHBhcmFtIG1vZGVsCisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGFwcGx5IGNoYW5nZXMgdG8KKwkgKiBAcGFyYW0gc2VyaWFsaXplZFN0YXRlCisJICogICAgICAgICAgICBhbiBvYmplY3QgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI3NlcmlhbGl6ZSgpfQorCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhbHRlciB0aGUgbW9kZWwgdG8gdGhlIHN0YXRlIGl0IHdhcworCSAqICAgICAgICAgaW4gZHVlIHRvIHRoZSBzZXJpYWxpemVkIGRlbHRhIGNoYW5nZXMKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjxNb2RlbERlbHRhPiBjb25zdHJ1Y3REZWx0YXMoT2JqZWN0IG1vZGVsLCBPYmplY3Qgc2VyaWFsaXplZFN0YXRlKTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvc3JjL29yZy9lY2xpcHNlL2U0L3VpL3dvcmtiZW5jaC9tb2RlbGluZy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMmRhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvbW9kZWxpbmcvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorQXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyBkZXNjcmliaW5nIHRoZSBFY2xpcHNlIDQgbW9kZWwgc2VydmljZXMuCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorPHA+CitUaGUgcGFja2FnZSBwcm92aWRlcyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHRoYXQgZGVzY3JpYmUgdGhlIEVjbGlwc2UgNCBtb2RlbCBzZXJ2aWNlcy4gVGhlc2UgZWxlbWVudHMgaW5jbHVkZSBpbXBsZW1lbnRhdGlvbnMKK29mIG1vZGVsLCBzZWxlY3Rpb24gYW5kIHBhcnQgc2VydmljZXMgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgb2YgbGlzdGVuZXJzIGFuZCBkZWx0YXMuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL3NyYy9vcmcvZWNsaXBzZS9lNC91aS93b3JrYmVuY2gvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjA0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9zcmMvb3JnL2VjbGlwc2UvZTQvdWkvd29ya2JlbmNoL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK0FwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMgZGVzY3JpYmluZyBFY2xpcHNlIDQgaGFuZGxlcnMgYW5kIHRoZSB3b3JrYmVuY2guCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorPHA+CitUaGUgcGFja2FnZSBwcm92aWRlcyBpbnRlcmZhY2VzIGRlc2NyaWJpbmcgRWNsaXBzZSA0IGhhbmRsZXJzLCB0aGUgd29ya2JlbmNoIGFuZCB0aGUgZXZlbnQgc2V0cyBmb3IgdGhlIHdvcmtiZW5jaC4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS42Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzNzFmYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0Ly5wcm9qZWN0CkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnJhcC5lNDwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmRzLmNvcmUuYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTM3YjYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNyBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS42CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmZjAyOAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjggQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IEU0CitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5yYXAuZTQKK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5yYXAucnd0LAorIG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Q7YnVuZGxlLXZlcnNpb249IjAuMTIuMTAwIiwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cywKKyBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC53b3JrYmVuY2gsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaTtidW5kbGUtdmVyc2lvbj0iMS40LjAiLAorIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLAorIG9yZy5lY2xpcHNlLm9zZ2k7YnVuZGxlLXZlcnNpb249IjMuMTAuMCIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcywKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCisgb3JnLmVjbGlwc2UuZTQudWkuZGksCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zO2J1bmRsZS12ZXJzaW9uPSIwLjEyLjAiLAorIG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IjMuNi4yMDAiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucmFwLmU0LAorIG9yZy5lY2xpcHNlLnJhcC5lNC5wcmVmZXJlbmNlcworSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFubm90YXRpb247dmVyc2lvbj0iMS4yLjAiLAorIGphdmF4LmluamVjdDt2ZXJzaW9uPSIxLjAuMCIKK1NlcnZpY2UtQ29tcG9uZW50OiBPU0dJLUlORi9yYXBldmVudGJyb2tlci54bWwsT1NHSS1JTkYvcmFwZXZlbnRvYmplY3RzdXBwbGllci54bWwsT1NHSS1JTkYvcmFwdWlldmVudG9iamVjdHN1cHBsaWVyLnhtbCxPU0dJLUlORi9yYXBwcmVmZXJlbmNlb2JqZWN0c3VwcGxpZXIueG1sLAorIE9TR0ktSU5GL3ByZWZlcmVuY2VzZXJ2aWNlQ0YueG1sCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucmFwLmU0LmludGVybmFsLkFjdGl2YXRvcgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3ByZWZlcmVuY2VzZXJ2aWNlQ0YueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvT1NHSS1JTkYvcHJlZmVyZW5jZXNlcnZpY2VDRi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4MjI4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3ByZWZlcmVuY2VzZXJ2aWNlQ0YueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5yYXAuZTQucHJlZmVyZW5jZXNlcnZpY2VDRiI+CisgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnJhcC5lNC5wcmVmZXJlbmNlcy5pbnRlcm5hbC5QcmVmZXJlbmNlU2VydmljZUNvbnRleHRGdW5jdGlvbiIvPgorICAgPHNlcnZpY2U+CisgICAgICA8cHJvdmlkZSBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUNvbnRleHRGdW5jdGlvbiIvPgorICAgPC9zZXJ2aWNlPgorICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UuY29udGV4dC5rZXkiIHR5cGU9IlN0cmluZyIgdmFsdWU9Im9yZy5lY2xpcHNlLnJhcC5lNC5wcmVmZXJlbmNlcy5FUHJlZmVyZW5jZVNlcnZpY2UiLz4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnJhbmtpbmciIHR5cGU9IkludGVnZXIiIHZhbHVlPSIxMDAiLz4KKzwvc2NyOmNvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcGV2ZW50YnJva2VyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcGV2ZW50YnJva2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFkYmExCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvT1NHSS1JTkYvcmFwZXZlbnRicm9rZXIueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5yYXAuZTQuZXZlbnRicm9rZXIiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5yYXAuZTQuaW50ZXJuYWwuUkFQRXZlbnRCcm9rZXJDb250ZXh0RnVuY3Rpb24iLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklDb250ZXh0RnVuY3Rpb24iLz4KKyAgIDwvc2VydmljZT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLmNvbnRleHQua2V5IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXIiLz4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnJhbmtpbmciIHR5cGU9IkludGVnZXIiIHZhbHVlPSIxMDAiLz4KKzwvc2NyOmNvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcGV2ZW50b2JqZWN0c3VwcGxpZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvT1NHSS1JTkYvcmFwZXZlbnRvYmplY3RzdXBwbGllci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkMmNiZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcGV2ZW50b2JqZWN0c3VwcGxpZXIueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5yYXAuZTQucmFwZXZlbnRvYmplY3RzdXBwbGllciI+CisgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnJhcC5lNC5pbnRlcm5hbC5SQVBFdmVudE9iamVjdFN1cHBsaWVyRGlzcGF0Y2hlciIvPgorICAgPHNlcnZpY2U+CisgICAgICA8cHJvdmlkZSBpbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuc3VwcGxpZXJzLkV4dGVuZGVkT2JqZWN0U3VwcGxpZXIiLz4KKyAgIDwvc2VydmljZT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJkZXBlbmRlbmN5LmluamVjdGlvbi5hbm5vdGF0aW9uIiB0eXBlPSJTdHJpbmciIHZhbHVlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMuRXZlbnRUb3BpYyIvPgorICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UucmFua2luZyIgdHlwZT0iSW50ZWdlciIgdmFsdWU9IjEwMCIvPgorPC9zY3I6Y29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvT1NHSS1JTkYvcmFwcHJlZmVyZW5jZW9iamVjdHN1cHBsaWVyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcHByZWZlcmVuY2VvYmplY3RzdXBwbGllci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzODljYQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcHByZWZlcmVuY2VvYmplY3RzdXBwbGllci54bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIG5hbWU9Im9yZy5lY2xpcHNlLnJhcC5lNC5yYXBwcmVmZXJlbmNlb2JqZWN0c3VwcGxpZXIiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5yYXAuZTQuaW50ZXJuYWwuUkFQUHJlZmVyZW5jZXNPYmplY3RTdXBwbGllckRpc3BhdGNoZXIiLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLnN1cHBsaWVycy5FeHRlbmRlZE9iamVjdFN1cHBsaWVyIi8+CisgICA8L3NlcnZpY2U+CisgICA8cHJvcGVydHkgbmFtZT0iZGVwZW5kZW5jeS5pbmplY3Rpb24uYW5ub3RhdGlvbiIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLlByZWZlcmVuY2UiLz4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnJhbmtpbmciIHR5cGU9IkludGVnZXIiIHZhbHVlPSIxMDAiLz4KKzwvc2NyOmNvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L09TR0ktSU5GL3JhcHVpZXZlbnRvYmplY3RzdXBwbGllci54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9PU0dJLUlORi9yYXB1aWV2ZW50b2JqZWN0c3VwcGxpZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTc2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9PU0dJLUlORi9yYXB1aWV2ZW50b2JqZWN0c3VwcGxpZXIueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5yYXAuZTQucmFwdWlldmVudG9iamVjdHN1cHBsaWVyIj4KKyAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UucmFwLmU0LmludGVybmFsLlJBUFVJRXZlbnRPYmplY3RTdXBwbGllckRpc3BhdGNoZXIiLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLnN1cHBsaWVycy5FeHRlbmRlZE9iamVjdFN1cHBsaWVyIi8+CisgICA8L3NlcnZpY2U+CisgICA8cHJvcGVydHkgbmFtZT0iZGVwZW5kZW5jeS5pbmplY3Rpb24uYW5ub3RhdGlvbiIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkuZGkuVUlFdmVudFRvcGljIi8+CisgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5yYW5raW5nIiB0eXBlPSJJbnRlZ2VyIiB2YWx1ZT0iMTAwIi8+Cis8L3Njcjpjb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGY1NmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDcgQEAKK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgT1NHSS1JTkYvLFwKKyAgICAgICAgICAgICAgIE9TR0ktSU5GL3JhcHByZWZlcmVuY2VvYmplY3RzdXBwbGllci54bWwsXAorICAgICAgICAgICAgICAgT1NHSS1JTkYvcHJlZmVyZW5jZXNlcnZpY2VDRi54bWwKK3NvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvcG9tLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmNWZmOAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3BvbS54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucmFwLmU0PC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UucmFwLmU0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQtcmVsZW5nPC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcmVsZW5nL3JlbGVuZy10YXJnZXQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDwhLS0gdG8gZW5zdXJlIHRoYXQgdGhlIGZlYXR1cmUgbG9va3VwIG9mIHRoZSB1aSB0ZXN0IHdvcmtzIC0tPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GLzwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHljaG8tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9FNEFwcGxpY2F0aW9uQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L0U0QXBwbGljYXRpb25Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhjNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9FNEFwcGxpY2F0aW9uQ29uZmlnLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQ7CisKK3B1YmxpYyBjbGFzcyBFNEFwcGxpY2F0aW9uQ29uZmlnIHsKKwlwcml2YXRlIFN0cmluZyB4bWlVUkk7CisJcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RTdGF0ZTsKKwlwcml2YXRlIGJvb2xlYW4gY2xlYXJQZXJzaXN0ZWRTdGF0ZTsKKwlwcml2YXRlIFN0cmluZyBsaWZlY3ljbGVVUkk7CisJcHJpdmF0ZSBTdHJpbmcgcHJlc2VudGF0aW9uVVJJOworCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0UHVzaDsKKwkKKwlwdWJsaWMgRTRBcHBsaWNhdGlvbkNvbmZpZyhTdHJpbmcgeG1pVVJJLCBTdHJpbmcgbGlmZWN5Y2xlVVJJLCBTdHJpbmcgcHJlc2VudGF0aW9uVVJJLCBib29sZWFuIHBlcnNpc3RTdGF0ZSwgYm9vbGVhbiBjbGVhclBlcnNpc3RlZFN0YXRlLCBib29sZWFuIGRlZmF1bHRQdXNoKSB7CisJCXRoaXMueG1pVVJJID0geG1pVVJJOworCQl0aGlzLmxpZmVjeWNsZVVSSSA9IGxpZmVjeWNsZVVSSTsKKwkJdGhpcy5wcmVzZW50YXRpb25VUkkgPSBwcmVzZW50YXRpb25VUkk7CisJCXRoaXMucGVyc2lzdFN0YXRlID0gcGVyc2lzdFN0YXRlOworCQl0aGlzLmNsZWFyUGVyc2lzdGVkU3RhdGUgPSBjbGVhclBlcnNpc3RlZFN0YXRlOworCQl0aGlzLmRlZmF1bHRQdXNoID0gZGVmYXVsdFB1c2g7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlmZWN5Y2xlVVJJKCkgeworCQlyZXR1cm4gbGlmZWN5Y2xlVVJJOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RTdGF0ZSgpIHsKKwkJcmV0dXJuIHBlcnNpc3RTdGF0ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNDbGVhclBlcnNpc3RlZFN0YXRlKCkgeworCQlyZXR1cm4gY2xlYXJQZXJzaXN0ZWRTdGF0ZTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25VUkkoKSB7CisJCXJldHVybiBwcmVzZW50YXRpb25VUkk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0WG1pVVJJKCkgeworCQlyZXR1cm4geG1pVVJJOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRQdXNoKCkgeworCQlyZXR1cm4gZGVmYXVsdFB1c2g7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgRTRBcHBsaWNhdGlvbkNvbmZpZyBjcmVhdGUoU3RyaW5nIHhtaVVSSSkgeworCQlyZXR1cm4gbmV3IEU0QXBwbGljYXRpb25Db25maWcoeG1pVVJJLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgRTRBcHBsaWNhdGlvbkNvbmZpZyBjcmVhdGUoU3RyaW5nIHhtaVVSSSwgU3RyaW5nIGxpZmVjeWNsZVVSSSkgeworCQlyZXR1cm4gbmV3IEU0QXBwbGljYXRpb25Db25maWcoeG1pVVJJLCBsaWZlY3ljbGVVUkksIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBFNEFwcGxpY2F0aW9uQ29uZmlnIGNyZWF0ZShTdHJpbmcgeG1pVVJJLCBib29sZWFuIGRlZmF1bHRQdXNoKSB7CisJCXJldHVybiBuZXcgRTRBcHBsaWNhdGlvbkNvbmZpZyh4bWlVUkksIG51bGwsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBFNEFwcGxpY2F0aW9uQ29uZmlnIGNyZWF0ZShTdHJpbmcgeG1pVVJJLCBTdHJpbmcgbGlmZWN5Y2xlVVJJLCBib29sZWFuIGRlZmF1bHRQdXNoKSB7CisJCXJldHVybiBuZXcgRTRBcHBsaWNhdGlvbkNvbmZpZyh4bWlVUkksIGxpZmVjeWNsZVVSSSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvRTRFbnRyeVBvaW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9FNEVudHJ5UG9pbnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5NjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvRTRFbnRyeVBvaW50RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE3IEVjbGlwc2VTb3VyY2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgUmFsZiBTdGVybmJlcmcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEVjbGlwc2VTb3VyY2UgLSBvbmdvaW5nIGRldmVsb3BtZW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuQ29udGV4dEluamVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkU0V29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5zd3QuRTRBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gubGlmZWN5Y2xlLlByZVNhdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLnJ3dC5hcHBsaWNhdGlvbi5FbnRyeVBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3QuYXBwbGljYXRpb24uRW50cnlQb2ludEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLnJ3dC5zZXJ2aWNlLlNlcnZlclB1c2hTZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgRTRFbnRyeVBvaW50RmFjdG9yeSBpbXBsZW1lbnRzIEVudHJ5UG9pbnRGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJhcCI7CisKKwlwcml2YXRlIFN0cmluZyBwcm9kdWN0TmFtZTsKKworCXByaXZhdGUgRTRBcHBsaWNhdGlvbkNvbmZpZyBjb25maWc7CisKKwlwdWJsaWMgRTRFbnRyeVBvaW50RmFjdG9yeShFNEFwcGxpY2F0aW9uQ29uZmlnIGNvbmZpZykgeworCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKwl9CisKKwlwdWJsaWMgRW50cnlQb2ludCBjcmVhdGUoKSB7CisJCXJldHVybiBuZXcgRW50cnlQb2ludCgpIHsKKworCQkJcHVibGljIGludCBjcmVhdGVVSSgpIHsKKwkJCQl0cnkgeworCQkJCQkvLyBFNFN0YXJ0ZXIuY3JlYXRlQW5kUnVuQXBwbGljYXRpb24ocHJvZHVjdE5hbWUpOworCQkJCQljcmVhdGVXb3JrYmVuY2goKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCWxvZ1Byb2JsZW0oZXhjZXB0aW9uKTsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBpbnQgY3JlYXRlV29ya2JlbmNoKCkgeworCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOworCQlFNEFwcGxpY2F0aW9uIGU0QXBwID0gbmV3IEU0QXBwbGljYXRpb24oKTsKKwkJRTRXb3JrYmVuY2ggd29ya2JlbmNoID0gZTRBcHAuY3JlYXRlRTRXb3JrYmVuY2goZ2V0QXBwbGljYXRpb25Db250ZXh0KGNvbmZpZyksCisJCQkJZGlzcGxheSk7CisKKwkJaWYoIGNvbmZpZy5pc0RlZmF1bHRQdXNoKCkgKSB7CisJCQlTZXJ2ZXJQdXNoU2Vzc2lvbiBzZXNzaW9uID0gbmV3IFNlcnZlclB1c2hTZXNzaW9uKCk7CisJCQlzZXNzaW9uLnN0YXJ0KCk7CisJCX0KKworLy8JCWluc3RhbmNlTG9jYXRpb24gPSAoTG9jYXRpb24pIHdvcmtiZW5jaC5nZXRDb250ZXh0KCkuZ2V0KAorLy8JCQkJRTRXb3JrYmVuY2guSU5TVEFOQ0VfTE9DQVRJT04pOworCQlTaGVsbCBzaGVsbCA9IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJaWYgKHNoZWxsID09IG51bGwpIHsKKwkJCXNoZWxsID0gbmV3IFNoZWxsKCk7CisJCQkvLyBwbGFjZSBpdCBvZmYgc28gaXQncyBub3QgdmlzaWJsZQorCQkJc2hlbGwuc2V0TG9jYXRpb24oMCwgMTAwMDApOworCQl9CisvLwkJaWYgKCFjaGVja0luc3RhbmNlTG9jYXRpb24oaW5zdGFuY2VMb2NhdGlvbiwgc2hlbGwsCisvLwkJCQl3b3JrYmVuY2guZ2V0Q29udGV4dCgpKSkKKy8vCQkJcmV0dXJuIEVYSVRfT0s7CisKKwkJaWYoIHdvcmtiZW5jaCAhPSBudWxsICkgeworCQkJSUVjbGlwc2VDb250ZXh0IHdvcmtiZW5jaENvbnRleHQgPSB3b3JrYmVuY2guZ2V0Q29udGV4dCgpOworCQkJSUVjbGlwc2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gd29ya2JlbmNoQ29udGV4dC5nZXRQYXJlbnQoKTsKKworCQkJLy8gQ3JlYXRlIGFuZCBydW4gdGhlIFVJIChpZiBhbnkpCisJCQl0cnkgeworCQkJICAgIHdvcmtiZW5jaC5jcmVhdGVBbmRSdW5VSSh3b3JrYmVuY2guZ2V0QXBwbGljYXRpb24oKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWU0QXBwLnNhdmVNb2RlbCgpOworCQkJCXdvcmtiZW5jaC5jbG9zZSgpOworCQkJCXNlcnZpY2VDb250ZXh0LmRpc3Bvc2UoKTsKKwkJCX0KKworCQkJaWYgKHdvcmtiZW5jaC5pc1Jlc3RhcnQoKSkgeworCQkJCXJldHVybiBJQXBwbGljYXRpb24uRVhJVF9SRVNUQVJUOworCQkJfQorCQl9CisKKwkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOworCX0KKworCXByaXZhdGUgSUFwcGxpY2F0aW9uQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoZmluYWwgRTRBcHBsaWNhdGlvbkNvbmZpZyBjb25maWcpIHsKKwkJcmV0dXJuIG5ldyBJQXBwbGljYXRpb25Db250ZXh0KCkgeworCisJCQlwdWJsaWMgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZSBnZXRCcmFuZGluZ0J1bmRsZSgpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoT2JqZWN0IHJlc3VsdCwgSUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBnZXRCcmFuZGluZ1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKKwkJCQlpZiggSVdvcmtiZW5jaC5YTUlfVVJJX0FSRy5lcXVhbHMoa2V5KSApIHsKKwkJCQkJcmV0dXJuIGNvbmZpZy5nZXRYbWlVUkkoKTsKKwkJCQl9IGVsc2UgaWYoIElXb3JrYmVuY2guTElGRV9DWUNMRV9VUklfQVJHLmVxdWFscyhrZXkpICkgeworCQkJCQlyZXR1cm4gY29uZmlnLmdldExpZmVjeWNsZVVSSSgpOworCQkJCX0gZWxzZSBpZiggSVdvcmtiZW5jaC5QUkVTRU5UQVRJT05fVVJJX0FSRyAuZXF1YWxzKGtleSkpIHsKKwkJCQkJcmV0dXJuIGNvbmZpZy5nZXRQcmVzZW50YXRpb25VUkkoKTsKKwkJCQl9IGVsc2UgaWYoIElXb3JrYmVuY2guQ0xFQVJfUEVSU0lTVEVEX1NUQVRFLmVxdWFscyhrZXkpICkgeworCQkJCQlyZXR1cm4gY29uZmlnLmlzQ2xlYXJQZXJzaXN0ZWRTdGF0ZSgpICsgIiI7CisJCQkJfSBlbHNlIGlmKCBJV29ya2JlbmNoLlBFUlNJU1RfU1RBVEUuZXF1YWxzKGtleSkgKSB7CisJCQkJCXJldHVybiBjb25maWcuaXNQZXJzaXN0U3RhdGUoKSArICIiOworCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldEJyYW5kaW5nTmFtZSgpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBnZXRCcmFuZGluZ0lkKCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldEJyYW5kaW5nRGVzY3JpcHRpb24oKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0QnJhbmRpbmdBcHBsaWNhdGlvbigpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE1hcCBnZXRBcmd1bWVudHMoKSB7CisJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBydiA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQkJCXJ2LnB1dChJQXBwbGljYXRpb25Db250ZXh0LkFQUExJQ0FUSU9OX0FSR1MsIG5ldyBTdHJpbmdbMF0pOworCQkJCXJldHVybiBydjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBsaWNhdGlvblJ1bm5pbmcoKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZ1Byb2JsZW0oVGhyb3dhYmxlIHByb2JsZW0pIHsKKy8vCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciB3aGVuIHN0YXJ0aW5nIGFwcGxpY2F0aW9uLCBwcm9kdWN0TmFtZT0iCisvLwkJCQkrIHByb2R1Y3ROYW1lOworLy8JCUxvZ2dlciBsb2dnZXIgPSBuZXcgV29ya2JlbmNoTG9nZ2VyKFBMVUdJTl9JRCk7CisvLwkJbG9nZ2VyLmVycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UsIHByb2JsZW0pKTsKKwkJU3lzdGVtLmVyci5wcmludGxuKCJQcm9ibGVtIik7CisJCXByb2JsZW0ucHJpbnRTdGFja1RyYWNlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMzNTFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDYzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWdpc3RyYXRpb247CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEFkbWluOworaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKKworcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7CisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHNpbmdsZXRvbjsKKwkKKwlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gY29udGV4dFNlcnZpY2VSZWc7IAorCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBoYW5kbGVyU2VydmljZVJlZzsKKwkKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIGV2ZW50QWRtaW5UcmFja2VyOworCXByaXZhdGUgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OworCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gZm9yIHRoaXMgQWN0aXZhdG9yLiBDYWxsZXJzIHNob3VsZCBiZSBhd2FyZSB0aGF0CisJICogdGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBidW5kbGUgaXMgbm90IGFjdGl2ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gc2luZ2xldG9uOworCX0KKworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OworCQlzaW5nbGV0b24gPSB0aGlzOworCX0KKwkKKwkvKgorCSAqIFJldHVybiB0aGUgZGVidWcgb3B0aW9ucyBzZXJ2aWNlLCBpZiBhdmFpbGFibGUuCisJICovCisJcHVibGljIEV2ZW50QWRtaW4gZ2V0RXZlbnRBZG1pbigpIHsKKwkJaWYgKGV2ZW50QWRtaW5UcmFja2VyID09IG51bGwpIHsKKwkJCWV2ZW50QWRtaW5UcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGJ1bmRsZUNvbnRleHQsIEV2ZW50QWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKKwkJCWV2ZW50QWRtaW5UcmFja2VyLm9wZW4oKTsKKwkJfQorCQlyZXR1cm4gKEV2ZW50QWRtaW4pIGV2ZW50QWRtaW5UcmFja2VyLmdldFNlcnZpY2UoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0U2VydmljZVJlZyAhPSBudWxsKSB7CisJCQljb250ZXh0U2VydmljZVJlZy51bnJlZ2lzdGVyKCk7CisJCQljb250ZXh0U2VydmljZVJlZyA9IG51bGw7CisJCX0KKwkJaWYgKGhhbmRsZXJTZXJ2aWNlUmVnICE9IG51bGwpIHsKKwkJCWhhbmRsZXJTZXJ2aWNlUmVnLnVucmVnaXN0ZXIoKTsKKwkJCWhhbmRsZXJTZXJ2aWNlUmVnID0gbnVsbDsKKwkJfQorCQkKKwkJaWYgKGV2ZW50QWRtaW5UcmFja2VyICE9IG51bGwpIHsKKwkJCWV2ZW50QWRtaW5UcmFja2VyLmNsb3NlKCk7CisJCQlldmVudEFkbWluVHJhY2tlciA9IG51bGw7CisJCX0KKwkJYnVuZGxlQ29udGV4dCA9IG51bGw7CisJCXNpbmdsZXRvbiA9IG51bGw7CisJfQorCQorCXB1YmxpYyBCdW5kbGVDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7CisJCXJldHVybiBidW5kbGVDb250ZXh0OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUEFic3RyYWN0T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUEFic3RyYWN0T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMTllZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQQWJzdHJhY3RPYmplY3RTdXBwbGllckRpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5Db250ZXh0SW5qZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLklJbmplY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLnN1cHBsaWVycy5FeHRlbmRlZE9iamVjdFN1cHBsaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuc3VwcGxpZXJzLklPYmplY3REZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuc3VwcGxpZXJzLklSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5pbnRlcm5hbC5jb250ZXh0cy5Db250ZXh0T2JqZWN0U3VwcGxpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5pbnRlcm5hbC5jb250ZXh0cy5FY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmludGVybmFsLmNvbnRleHRzLklDb250ZXh0RGlzcG9zYWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmludGVybmFsLmRpLlJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LkU0QXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzLkVQcmVmZXJlbmNlU2VydmljZTsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSQVBBYnN0cmFjdE9iamVjdFN1cHBsaWVyRGlzcGF0Y2hlcjxTIGV4dGVuZHMgRXh0ZW5kZWRPYmplY3RTdXBwbGllcj4gZXh0ZW5kcyBFeHRlbmRlZE9iamVjdFN1cHBsaWVyIHsKKwlwcml2YXRlIE1hcDxJRWNsaXBzZUNvbnRleHQsIEV4dGVuZGVkT2JqZWN0U3VwcGxpZXI+IHN1cHBsaWVyQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8SUVjbGlwc2VDb250ZXh0LCBFeHRlbmRlZE9iamVjdFN1cHBsaWVyPigpKTsKKwlwcml2YXRlIE1hcDxJRWNsaXBzZUNvbnRleHQsIElFY2xpcHNlQ29udGV4dD4gcm9vdENvbnRleHRNYXAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8SUVjbGlwc2VDb250ZXh0LCBJRWNsaXBzZUNvbnRleHQ+KCkpOworCQorCXByaXZhdGUgSUNvbnRleHREaXNwb3NhbExpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lciA9IG5ldyBJQ29udGV4dERpc3Bvc2FsTGlzdGVuZXIoKSB7CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgZGlzcG9zZWQoSUVjbGlwc2VDb250ZXh0IGNvbnRleHQpIHsKKwkJCUlFY2xpcHNlQ29udGV4dCByb290Q29udGV4dCA9IHJvb3RDb250ZXh0TWFwLnJlbW92ZShjb250ZXh0KTsKKwkJCWlmIChyb290Q29udGV4dCAhPSBudWxsKSB7CisJCQkJc3VwcGxpZXJDYWNoZS5yZW1vdmUocm9vdENvbnRleHQpOworCQkJfQorCQl9CisJfTsKKwkKKwlwcml2YXRlIGZpbmFsIENsYXNzPFM+IHN1cHBsaWVyVHlwZTsKKwkKKwlwdWJsaWMgUkFQQWJzdHJhY3RPYmplY3RTdXBwbGllckRpc3BhdGNoZXIoQ2xhc3M8Uz4gc3VwcGxpZXJUeXBlKSB7CisJCXRoaXMuc3VwcGxpZXJUeXBlID0gc3VwcGxpZXJUeXBlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldChJT2JqZWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJCWJvb2xlYW4gdHJhY2ssIGJvb2xlYW4gZ3JvdXApIHsKKwkJSUVjbGlwc2VDb250ZXh0IGMgPSBnZXRDb250ZXh0KHJlcXVlc3Rvcik7CisJCQorCQlJRWNsaXBzZUNvbnRleHQgYXBwQ29udGV4dCA9IHJvb3RDb250ZXh0TWFwLmdldChjKTsKKwkJCisJCWlmKCBhcHBDb250ZXh0ID09IG51bGwgKSB7CisJCQlJRWNsaXBzZUNvbnRleHQgdG1wID0gYzsKKwkJCXdoaWxlKCB0bXAgIT0gbnVsbCAmJiB0bXAuZ2V0TG9jYWwoRTRBcHBsaWNhdGlvbi5JTlNUQU5DRUlEKSA9PSBudWxsICkgeworCQkJCXRtcCA9IHRtcC5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJCQorCQkJaWYoIHRtcCA9PSBudWxsICkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRkFUQUw6IFRoZSBpbmplY3Rpb24gaXMgcmVxdWVzdGVkIG9uIGEgY29udGV4dCB3aGljaCBoYXMgbm8gd29ya2JlbmNoIGNvbnRleHQiKTsKKwkJCQlyZXR1cm4gSUluamVjdG9yLk5PVF9BX1ZBTFVFOworCQkJfQorCQkJCisJCQkoKEVjbGlwc2VDb250ZXh0KWMpLm5vdGlmeU9uRGlzcG9zYWwoZGlzcG9zZUxpc3RlbmVyKTsKKwkJCWFwcENvbnRleHQgPSB0bXA7CisJCQlyb290Q29udGV4dE1hcC5wdXQoYywgYXBwQ29udGV4dCk7CisJCX0KKwkJCisJCUV4dGVuZGVkT2JqZWN0U3VwcGxpZXIgc3VwcGxpZXIgPSBzdXBwbGllckNhY2hlLmdldChhcHBDb250ZXh0KTsKKwkJaWYoIHN1cHBsaWVyID09IG51bGwgKSB7CisJCQlzdXBwbGllciA9IENvbnRleHRJbmplY3Rpb25GYWN0b3J5Lm1ha2Uoc3VwcGxpZXJUeXBlLCBhcHBDb250ZXh0KTsKKwkJCXN1cHBsaWVyQ2FjaGUucHV0KGFwcENvbnRleHQsIHN1cHBsaWVyKTsKKwkJfQorCQkKKwkJcmV0dXJuIHN1cHBsaWVyLmdldChkZXNjcmlwdG9yLCByZXF1ZXN0b3IsIHRyYWNrLCBncm91cCk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIElFY2xpcHNlQ29udGV4dCBnZXRDb250ZXh0KElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJCVJlcXVlc3RvciByZXF1ZXN0b3JJbXBsID0gKFJlcXVlc3RvcikgcmVxdWVzdG9yOworCQlyZXR1cm4gKChDb250ZXh0T2JqZWN0U3VwcGxpZXIpcmVxdWVzdG9ySW1wbC5nZXRQcmltYXJ5U3VwcGxpZXIoKSkuZ2V0Q29udGV4dCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQRXZlbnRCcm9rZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQRXZlbnRCcm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRmZTFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudEJyb2tlci5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5sb2cuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLlVJU3luY2hyb25pemU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5FNEFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRBZG1pbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50Q29uc3RhbnRzOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCitwdWJsaWMgY2xhc3MgUkFQRXZlbnRCcm9rZXIgaW1wbGVtZW50cyBJRXZlbnRCcm9rZXIgeworCSAgICAvLyBUQkQgc3luY2hyb25pemF0aW9uCisKKwkgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCUFTWU5DX0VWRU5UID0gInJhcC5hc3luYy5ldmVudCI7CisKKwkJcHJpdmF0ZSBNYXA8RXZlbnRIYW5kbGVyLCBDb2xsZWN0aW9uPFNlcnZpY2VSZWdpc3RyYXRpb248Pz4+PiByZWdpc3RyYXRpb25zID0gbmV3IEhhc2hNYXA8RXZlbnRIYW5kbGVyLCBDb2xsZWN0aW9uPFNlcnZpY2VSZWdpc3RyYXRpb248Pz4+PigpOworCisJCUBJbmplY3QKKwkJTG9nZ2VyIGxvZ2dlcjsKKworCQlASW5qZWN0CisJCUBPcHRpb25hbAorCQlVSVN5bmNocm9uaXplIHVpU3luYzsKKworCQlASW5qZWN0CisJCUBOYW1lZChFNEFwcGxpY2F0aW9uLklOU1RBTkNFSUQpCisJCVN0cmluZyBpbnN0YW5jZUlkOworCisJCS8vIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY29kZSB0byBlbnN1cmUgdGhhdCBidW5kbGUgY29udGFpbmluZworCQkvLyBFdmVudEFkbWluIGltcGxlbWVudGF0aW9uIGlzIHN0YXJ0ZWQuIFRoaXMgY29kZSBpdCB0byBiZSByZW1vdmVkIG9uY2UKKwkJLy8gdGhlIHByb3BlciBtZXRob2QgdG8gc3RhcnQgRXZlbnRBZG1pbiBpcyBhZGRlZC4KKwkJc3RhdGljIHsKKwkJCUV2ZW50QWRtaW4gZXZlbnRBZG1pbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0RXZlbnRBZG1pbigpOworCQkJaWYgKGV2ZW50QWRtaW4gPT0gbnVsbCkgeworCQkJCUJ1bmRsZVtdIGJ1bmRsZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZUNvbnRleHQoKS5nZXRCdW5kbGVzKCk7CisJCQkJZm9yIChCdW5kbGUgYnVuZGxlIDogYnVuZGxlcykgeworCQkJCQlpZiAoISJvcmcuZWNsaXBzZS5lcXVpbm94LmV2ZW50Ii5lcXVhbHMoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl0cnkgeworCQkJCQkJYnVuZGxlLnN0YXJ0KEJ1bmRsZS5TVEFSVF9UUkFOU0lFTlQpOworCQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgeworCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwdWJsaWMgUkFQRXZlbnRCcm9rZXIoKSB7CisJCQkvLyBwbGFjZWhvbGRlcgorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gc2VuZChTdHJpbmcgdG9waWMsIE9iamVjdCBkYXRhKSB7CisJCQlFdmVudCBldmVudCA9IGNvbnN0cnVjdEV2ZW50KHRvcGljLCBkYXRhLCBmYWxzZSk7CisJCQlFdmVudEFkbWluIGV2ZW50QWRtaW4gPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEV2ZW50QWRtaW4oKTsKKwkJCWlmIChldmVudEFkbWluID09IG51bGwpIHsKKwkJCQlsb2dnZXIuZXJyb3IoTkxTLmJpbmQoIk5vIEV2ZW50QWRtaW4iLCBldmVudC50b1N0cmluZygpKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZXZlbnRBZG1pbi5zZW5kRXZlbnQoZXZlbnQpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBwb3N0KFN0cmluZyB0b3BpYywgT2JqZWN0IGRhdGEpIHsKKwkJCUV2ZW50IGV2ZW50ID0gY29uc3RydWN0RXZlbnQodG9waWMsIGRhdGEsIHRydWUpOworCQkJRXZlbnRBZG1pbiBldmVudEFkbWluID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRFdmVudEFkbWluKCk7CisJCQlpZiAoZXZlbnRBZG1pbiA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLmVycm9yKE5MUy5iaW5kKCJObyBFdmVudEFkbWluIiwgZXZlbnQudG9TdHJpbmcoKSkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWV2ZW50QWRtaW4ucG9zdEV2ZW50KGV2ZW50KTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCXByaXZhdGUgRXZlbnQgY29uc3RydWN0RXZlbnQoU3RyaW5nIHRvcGljLCBPYmplY3QgZGF0YSwgYm9vbGVhbiBhc3luYykgeworCQkJdG9waWMgPSByYXBpZnlUb3BpYyhpbnN0YW5jZUlkLCB0b3BpYyk7CisJCQlFdmVudCBldmVudDsKKwkJCWlmIChkYXRhIGluc3RhbmNlb2YgRGljdGlvbmFyeTw/LD8+KSB7CisJCQkJRGljdGlvbmFyeTxTdHJpbmcsT2JqZWN0PiBwcm9wZXJ0aWVzID0gKERpY3Rpb25hcnk8U3RyaW5nLE9iamVjdD4pZGF0YTsKKwkJCQlpZiAoYXN5bmMpCisJCQkJCXByb3BlcnRpZXMucHV0KEFTWU5DX0VWRU5ULCBCb29sZWFuLlRSVUUpOworCQkJCWV2ZW50ID0gbmV3IEV2ZW50KHRvcGljLCBwcm9wZXJ0aWVzKTsKKwkJCX0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIE1hcDw/LD8+KSB7CisJCQkJTWFwPFN0cmluZyxPYmplY3Q+IHByb3BlcnRpZXMgPSAoTWFwPFN0cmluZyxPYmplY3Q+KWRhdGE7CisJCQkJaWYgKGFzeW5jKQorCQkJCQlwcm9wZXJ0aWVzLnB1dChBU1lOQ19FVkVOVCwgQm9vbGVhbi5UUlVFKTsKKwkJCQlldmVudCA9IG5ldyBFdmVudCh0b3BpYywgcHJvcGVydGllcyk7CisJCQl9IGVsc2UgeworCQkJCURpY3Rpb25hcnk8U3RyaW5nLCBPYmplY3Q+IGQgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigzKTsKKwkJCQlkLnB1dChFdmVudENvbnN0YW50cy5FVkVOVF9UT1BJQywgdG9waWMpOworCQkJCWlmIChkYXRhICE9IG51bGwpCisJCQkJCWQucHV0KElFdmVudEJyb2tlci5EQVRBLCBkYXRhKTsKKwkJCQlpZiAoYXN5bmMpCisJCQkJCWQucHV0KEFTWU5DX0VWRU5ULCBCb29sZWFuLlRSVUUpOworCQkJCWV2ZW50ID0gbmV3IEV2ZW50KHRvcGljLCBkKTsKKwkJCX0KKwkJCXJldHVybiBldmVudDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHN1YnNjcmliZShTdHJpbmcgdG9waWMsIEV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpIHsKKwkJCXJldHVybiBzdWJzY3JpYmUodG9waWMsIG51bGwsIGV2ZW50SGFuZGxlciwgZmFsc2UpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gc3Vic2NyaWJlKFN0cmluZyB0b3BpYywgU3RyaW5nIGZpbHRlciwgRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlciwgYm9vbGVhbiBoZWFkbGVzcykgeworCQkJdG9waWMgPSByYXBpZnlUb3BpYyhpbnN0YW5jZUlkLCB0b3BpYyk7CisJCQlCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZUNvbnRleHQoKTsKKwkJCWlmIChidW5kbGVDb250ZXh0ID09IG51bGwpIHsKKwkJCQlsb2dnZXIuZXJyb3IoTkxTLmJpbmQoIk5vIEV2ZW50QWRtaW4iLCB0b3BpYykpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCVN0cmluZ1tdIHRvcGljcyA9IG5ldyBTdHJpbmdbXSB7dG9waWN9OworCQkJRGljdGlvbmFyeTxTdHJpbmcsIE9iamVjdD4gZCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlkLnB1dChFdmVudENvbnN0YW50cy5FVkVOVF9UT1BJQywgdG9waWNzKTsKKwkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKKwkJCQlkLnB1dChFdmVudENvbnN0YW50cy5FVkVOVF9GSUxURVIsIGZpbHRlcik7CisJCQlFdmVudEhhbmRsZXIgd3JhcHBlZEhhbmRsZXIgPSBuZXcgUkFQVUlFdmVudEhhbmRsZXIoZXZlbnRIYW5kbGVyLCBoZWFkbGVzcyA/IG51bGwgOiB1aVN5bmMpOworCQkJU2VydmljZVJlZ2lzdHJhdGlvbjw/PiByZWdpc3RyYXRpb24gPSBidW5kbGVDb250ZXh0LnJlZ2lzdGVyU2VydmljZSgKKwkJCQkJRXZlbnRIYW5kbGVyLmNsYXNzLmdldE5hbWUoKSwgd3JhcHBlZEhhbmRsZXIsIGQpOworCQkJQ29sbGVjdGlvbjxTZXJ2aWNlUmVnaXN0cmF0aW9uPD8+PiBoYW5kbGVkID0gcmVnaXN0cmF0aW9ucworCQkJCQkuZ2V0KGV2ZW50SGFuZGxlcik7CisJCQlpZiAoaGFuZGxlZCA9PSBudWxsKSB7CisJCQkJcmVnaXN0cmF0aW9ucy5wdXQoZXZlbnRIYW5kbGVyLAorCQkJCQkJaGFuZGxlZCA9IG5ldyBBcnJheUxpc3Q8U2VydmljZVJlZ2lzdHJhdGlvbjw/Pj4oKSk7CisJCQl9CisJCQloYW5kbGVkLmFkZChyZWdpc3RyYXRpb24pOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiB1bnN1YnNjcmliZShFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKSB7CisJCQlDb2xsZWN0aW9uPFNlcnZpY2VSZWdpc3RyYXRpb248Pz4+IGhhbmRsZWQgPSByZWdpc3RyYXRpb25zCisJCQkJCS5yZW1vdmUoZXZlbnRIYW5kbGVyKTsKKwkJCWlmIChoYW5kbGVkID09IG51bGwgfHwgaGFuZGxlZC5pc0VtcHR5KCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJZm9yIChTZXJ2aWNlUmVnaXN0cmF0aW9uPD8+IHIgOiBoYW5kbGVkKSB7CisJCQkJci51bnJlZ2lzdGVyKCk7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCUBQcmVEZXN0cm95CisJCXZvaWQgZGlzcG9zZSgpIHsKKwkJCUNvbGxlY3Rpb248Q29sbGVjdGlvbjxTZXJ2aWNlUmVnaXN0cmF0aW9uPD8+Pj4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uPFNlcnZpY2VSZWdpc3RyYXRpb248Pz4+PigKKwkJCQkJcmVnaXN0cmF0aW9ucy52YWx1ZXMoKSk7CisJCQlyZWdpc3RyYXRpb25zLmNsZWFyKCk7CisJCQlmb3IgKENvbGxlY3Rpb248U2VydmljZVJlZ2lzdHJhdGlvbjw/Pj4gaGFuZGxlZCA6IHZhbHVlcykgeworCQkJCWZvciAoU2VydmljZVJlZ2lzdHJhdGlvbjw/PiByZWdpc3RyYXRpb24gOiBoYW5kbGVkKSB7CisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXZlbnRCcm9rZXIgZGlzcG9zZToiICsgcmVnaXN0cmF0aW9uW2ldICsKKwkJCQkJLy8gIikiKTsKKwkJCQkJcmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwdWJsaWMgc3RhdGljIFN0cmluZyByYXBpZnlUb3BpYyhTdHJpbmcgaW5zdGFuY2VJZCwgU3RyaW5nIHRvcGljKSB7CisJCQlTdHJpbmcgcnYgPSBpbnN0YW5jZUlkICsgIi8iICsgdG9waWM7CisvLwkJCVN5c3RlbS5lcnIucHJpbnRsbigiT3JpZ2luYWw6ICIgKyB0b3BpYyArICIsIFJBUGlmaWVkOiAiICsgcnYpOworCQkJcmV0dXJuIHJ2OworCQl9CisKKwkJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXN5bmNFdmVudChFdmVudCBldmVudCkgeworCQkJcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoQVNZTkNfRVZFTlQpKTsKKwkJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudEJyb2tlckNvbnRleHRGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudEJyb2tlckNvbnRleHRGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWIwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUEV2ZW50QnJva2VyQ29udGV4dEZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworCitwdWJsaWMgY2xhc3MgUkFQRXZlbnRCcm9rZXJDb250ZXh0RnVuY3Rpb24gZXh0ZW5kcyBDb250ZXh0RnVuY3Rpb24geworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29tcHV0ZShJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlSQVBFdmVudEJyb2tlciBicm9rZXIgPSBjb250ZXh0LmdldExvY2FsKFJBUEV2ZW50QnJva2VyLmNsYXNzKTsKKwkJaWYgKGJyb2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICBicm9rZXIgPSBDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5tYWtlKFJBUEV2ZW50QnJva2VyLmNsYXNzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0KFJBUEV2ZW50QnJva2VyLmNsYXNzLCBicm9rZXIpOworCQl9CisJCXJldHVybiBicm9rZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudE9iamVjdFN1cHBsaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUEV2ZW50T2JqZWN0U3VwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhNTliCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudE9iamVjdFN1cHBsaWVyLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLklJbmplY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLkluamVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMuRXZlbnRUb3BpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMuRXZlbnRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLnN1cHBsaWVycy5FeHRlbmRlZE9iamVjdFN1cHBsaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuc3VwcGxpZXJzLklPYmplY3REZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuc3VwcGxpZXJzLklSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLnN3dC5FNEFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRBZG1pbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50Q29uc3RhbnRzOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIFJBUEV2ZW50T2JqZWN0U3VwcGxpZXIgZXh0ZW5kcyBFeHRlbmRlZE9iamVjdFN1cHBsaWVyIHsKKworCS8vIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY29kZSB0byBlbnN1cmUgdGhhdCBidW5kbGUgY29udGFpbmluZworCS8vIEV2ZW50QWRtaW4gaW1wbGVtZW50YXRpb24gaXMgc3RhcnRlZC4gVGhpcyBjb2RlIGl0IHRvIGJlIHJlbW92ZWQgb25jZQorCS8vIHRoZSBwcm9wZXIgbWV0aG9kIHRvIHN0YXJ0IEV2ZW50QWRtaW4gaXMgYWRkZWQuCisJc3RhdGljIHsKKwkJaWYgKGdldEV2ZW50QWRtaW4oKSA9PSBudWxsKSB7CisJCQlCdW5kbGVbXSBidW5kbGVzID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlcygpOworCQkJZm9yIChCdW5kbGUgYnVuZGxlIDogYnVuZGxlcykgeworCQkJCWlmICghIm9yZy5lY2xpcHNlLmVxdWlub3guZXZlbnQiLmVxdWFscyhidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpKSAvLyROT04tTkxTLTEkCisJCQkJCWNvbnRpbnVlOworCQkJCXRyeSB7CisJCQkJCWJ1bmRsZS5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsKKwkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBFdmVudD4gY3VycmVudEV2ZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRXZlbnQ+KCk7CisKKwljbGFzcyBESUV2ZW50SGFuZGxlciBpbXBsZW1lbnRzIEV2ZW50SGFuZGxlciB7CisKKwkJZmluYWwgcHJpdmF0ZSBJUmVxdWVzdG9yIHJlcXVlc3RvcjsKKwkJZmluYWwgcHJpdmF0ZSBTdHJpbmcgdG9waWM7CisKKwkJcHVibGljIERJRXZlbnRIYW5kbGVyKFN0cmluZyB0b3BpYywgSVJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJCXRoaXMudG9waWMgPSB0b3BpYzsKKwkJCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOworCQl9CisKKwkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCWlmICghcmVxdWVzdG9yLmlzVmFsaWQoKSkgeworCQkJCXVuc3Vic2NyaWJlKHJlcXVlc3Rvcik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlhZGRDdXJyZW50RXZlbnQodG9waWMsIGV2ZW50KTsKKwkJCXJlcXVlc3Rvci5yZXNvbHZlQXJndW1lbnRzKGZhbHNlKTsKKwkJCXJlbW92ZUN1cnJlbnRFdmVudCh0b3BpYyk7CisKKwkJCXJlcXVlc3Rvci5leGVjdXRlKCk7CisJCX0KKwl9CisKKwkvLyBBIGNvbWJvIG9mIHsgSVJlcXVlc3RvciArIHRvcGljIH0gdXNlZCBpbiBNYXAgbG9va3VwcworCXN0YXRpYyBwcml2YXRlIGNsYXNzIFN1YnNjcmliZXIgeworCQlwcml2YXRlIElSZXF1ZXN0b3IgcmVxdWVzdG9yOworCQlwcml2YXRlIFN0cmluZyB0b3BpYzsKKworCQlwdWJsaWMgU3Vic2NyaWJlcihJUmVxdWVzdG9yIHJlcXVlc3RvciwgU3RyaW5nIHRvcGljKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJCQl0aGlzLnRvcGljID0gdG9waWM7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQkJaW50IHJlc3VsdCA9IDE7CisJCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocmVxdWVzdG9yID09IG51bGwpID8gMCA6IHJlcXVlc3Rvci5oYXNoQ29kZSgpKTsKKwkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0b3BpYyA9PSBudWxsKSA/IDAgOiB0b3BpYy5oYXNoQ29kZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgSVJlcXVlc3RvciBnZXRSZXF1ZXN0b3IoKSB7CisJCQlyZXR1cm4gcmVxdWVzdG9yOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQlpZiAodGhpcyA9PSBvYmopCisJCQkJcmV0dXJuIHRydWU7CisJCQlpZiAob2JqID09IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJU3Vic2NyaWJlciBvdGhlciA9IChTdWJzY3JpYmVyKSBvYmo7CisJCQlpZiAocmVxdWVzdG9yID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXIucmVxdWVzdG9yICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoIXJlcXVlc3Rvci5lcXVhbHMob3RoZXIucmVxdWVzdG9yKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAodG9waWMgPT0gbnVsbCkgeworCQkJCWlmIChvdGhlci50b3BpYyAhPSBudWxsKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKCF0b3BpYy5lcXVhbHMob3RoZXIudG9waWMpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwl9CisKKwlwcml2YXRlIE1hcDxTdWJzY3JpYmVyLCBTZXJ2aWNlUmVnaXN0cmF0aW9uPiByZWdpc3RyYXRpb25zID0gbmV3IEhhc2hNYXA8U3Vic2NyaWJlciwgU2VydmljZVJlZ2lzdHJhdGlvbj4oKTsKKworCUBJbmplY3QKKwlATmFtZWQoRTRBcHBsaWNhdGlvbi5JTlNUQU5DRUlEKQorCXByb3RlY3RlZCBTdHJpbmcgaW5zdGFuY2VJZDsKKworCXByb3RlY3RlZCB2b2lkIGFkZEN1cnJlbnRFdmVudChTdHJpbmcgdG9waWMsIEV2ZW50IGV2ZW50KSB7CisJCXN5bmNocm9uaXplZCAoY3VycmVudEV2ZW50cykgeworCQkJY3VycmVudEV2ZW50cy5wdXQodG9waWMsIGV2ZW50KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUN1cnJlbnRFdmVudChTdHJpbmcgdG9waWMpIHsKKwkJc3luY2hyb25pemVkIChjdXJyZW50RXZlbnRzKSB7CisJCQljdXJyZW50RXZlbnRzLnJlbW92ZSh0b3BpYyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldChJT2JqZWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJUmVxdWVzdG9yIHJlcXVlc3RvciwgYm9vbGVhbiB0cmFjaywgYm9vbGVhbiBncm91cCkgeworCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyB0b3BpYyA9IGdldFRvcGljKGRlc2NyaXB0b3IpOworCQlFdmVudEFkbWluIGV2ZW50QWRtaW4gPSBnZXRFdmVudEFkbWluKCk7CisJCWlmICh0b3BpYyA9PSBudWxsIHx8IGV2ZW50QWRtaW4gPT0gbnVsbCB8fCB0b3BpYy5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIElJbmplY3Rvci5OT1RfQV9WQUxVRTsKKworCQlpZiAodHJhY2spCisJCQlzdWJzY3JpYmUodG9waWMsIGV2ZW50QWRtaW4sIHJlcXVlc3Rvcik7CisJCWVsc2UKKwkJCXVuc3Vic2NyaWJlKHJlcXVlc3Rvcik7CisKKwkJaWYgKCFjdXJyZW50RXZlbnRzLmNvbnRhaW5zS2V5KHRvcGljKSkKKwkJCXJldHVybiBJSW5qZWN0b3IuTk9UX0FfVkFMVUU7CisKKwkJLy8gY29udmVydCB0byBmaXQgZGVzdGluYXRpb24KKwkJQ2xhc3M8Pz4gZGVzY3JpcHRvcnNDbGFzcyA9IGdldERlc2lyZWRDbGFzcyhkZXNjcmlwdG9yLmdldERlc2lyZWRUeXBlKCkpOworCQlpZiAoZGVzY3JpcHRvcnNDbGFzcy5lcXVhbHMoRXZlbnQuY2xhc3MpKQorCQkJcmV0dXJuIGN1cnJlbnRFdmVudHMuZ2V0KHRvcGljKTsKKwkJcmV0dXJuIGN1cnJlbnRFdmVudHMuZ2V0KHRvcGljKS5nZXRQcm9wZXJ0eShFdmVudFV0aWxzLkRBVEEpOworCX0KKworCXByaXZhdGUgdm9pZCBzdWJzY3JpYmUoU3RyaW5nIHRvcGljLCBFdmVudEFkbWluIGV2ZW50QWRtaW4sIElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJCVN1YnNjcmliZXIgc3Vic2NyaWJlciA9IG5ldyBTdWJzY3JpYmVyKHJlcXVlc3RvciwgdG9waWMpOworCQlzeW5jaHJvbml6ZWQgKHJlZ2lzdHJhdGlvbnMpIHsKKwkJCWlmIChyZWdpc3RyYXRpb25zLmNvbnRhaW5zS2V5KHN1YnNjcmliZXIpKQorCQkJCXJldHVybjsKKwkJfQorCQlCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZUNvbnRleHQoKTsKKwkJaWYgKGJ1bmRsZUNvbnRleHQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbmplY3Rpb25FeGNlcHRpb24oIlVuYWJsZSB0byBzdWJzY3JpYmUgdG8gZXZlbnRzOiBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMgYnVuZGxlIGlzIG5vdCBhY3RpdmF0ZWQiKTsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZ1tdIHRvcGljcyA9IG5ldyBTdHJpbmdbXSB7dG9waWN9OworCQlEaWN0aW9uYXJ5PFN0cmluZywgT2JqZWN0PiBkID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKwkJZC5wdXQoRXZlbnRDb25zdGFudHMuRVZFTlRfVE9QSUMsIHRvcGljcyk7CisJCUV2ZW50SGFuZGxlciB3cmFwcGVkSGFuZGxlciA9IG1ha2VIYW5kbGVyKHRvcGljLCByZXF1ZXN0b3IpOworCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IGJ1bmRsZUNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKEV2ZW50SGFuZGxlci5jbGFzcy5nZXROYW1lKCksIHdyYXBwZWRIYW5kbGVyLCBkKTsKKwkJLy8gZHVlIHRvIHRoZSB3YXkgcmVxdWVzdG9ycyBhcmUgY29uc3RydWN0ZWQgdGhpcyBsaW1pdGVkIHN5bmNoIHNob3VsZCBiZSBPSworCQlzeW5jaHJvbml6ZWQgKHJlZ2lzdHJhdGlvbnMpIHsKKwkJCXJlZ2lzdHJhdGlvbnMucHV0KHN1YnNjcmliZXIsIHJlZ2lzdHJhdGlvbik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgRXZlbnRIYW5kbGVyIG1ha2VIYW5kbGVyKFN0cmluZyB0b3BpYywgSVJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJcmV0dXJuIG5ldyBESUV2ZW50SGFuZGxlcih0b3BpYywgcmVxdWVzdG9yKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRvcGljKElPYmplY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlFdmVudFRvcGljIHF1YWxpZmllciA9IGRlc2NyaXB0b3IuZ2V0UXVhbGlmaWVyKEV2ZW50VG9waWMuY2xhc3MpOworCQlTdHJpbmcgdG9waWMgPSBxdWFsaWZpZXIudmFsdWUoKTsKKwkJdG9waWMgPSBSQVBFdmVudEJyb2tlci5yYXBpZnlUb3BpYyhpbnN0YW5jZUlkLCB0b3BpYyk7CisJCXJldHVybiB0b3BpYzsKKwl9CisKKwlzdGF0aWMgcHJpdmF0ZSBFdmVudEFkbWluIGdldEV2ZW50QWRtaW4oKSB7CisJCXJldHVybiBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEV2ZW50QWRtaW4oKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1bnN1YnNjcmliZShJUmVxdWVzdG9yIHJlcXVlc3RvcikgeworCQlpZiAocmVxdWVzdG9yID09IG51bGwpCisJCQlyZXR1cm47CisJCXN5bmNocm9uaXplZCAocmVnaXN0cmF0aW9ucykgeworCQkJSXRlcmF0b3I8RW50cnk8U3Vic2NyaWJlciwgU2VydmljZVJlZ2lzdHJhdGlvbj4+IGkgPSByZWdpc3RyYXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpLmhhc05leHQoKSkgeworCQkJCUVudHJ5PFN1YnNjcmliZXIsIFNlcnZpY2VSZWdpc3RyYXRpb24+IGVudHJ5ID0gaS5uZXh0KCk7CisJCQkJU3Vic2NyaWJlciBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlpZiAoIXJlcXVlc3Rvci5lcXVhbHMoa2V5LmdldFJlcXVlc3RvcigpKSkKKwkJCQkJY29udGludWU7CisJCQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCXJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7CisJCQkJaS5yZW1vdmUoKTsKKwkJCX0KKwkJfQorCX0KKworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJU2VydmljZVJlZ2lzdHJhdGlvbltdIGFycmF5OworCQlzeW5jaHJvbml6ZWQgKHJlZ2lzdHJhdGlvbnMpIHsKKwkJCUNvbGxlY3Rpb248U2VydmljZVJlZ2lzdHJhdGlvbj4gdmFsdWVzID0gcmVnaXN0cmF0aW9ucy52YWx1ZXMoKTsKKwkJCWFycmF5ID0gdmFsdWVzLnRvQXJyYXkobmV3IFNlcnZpY2VSZWdpc3RyYXRpb25bdmFsdWVzLnNpemUoKV0pOworCQkJcmVnaXN0cmF0aW9ucy5jbGVhcigpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWFycmF5W2ldLnVucmVnaXN0ZXIoKTsKKwkJfQorCX0KKworCXByaXZhdGUgQ2xhc3M8Pz4gZ2V0RGVzaXJlZENsYXNzKFR5cGUgZGVzaXJlZFR5cGUpIHsKKwkJaWYgKGRlc2lyZWRUeXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pCisJCQlyZXR1cm4gKENsYXNzPD8+KSBkZXNpcmVkVHlwZTsKKwkJaWYgKGRlc2lyZWRUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKwkJCVR5cGUgcmF3VHlwZSA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIGRlc2lyZWRUeXBlKS5nZXRSYXdUeXBlKCk7CisJCQlpZiAocmF3VHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KQorCQkJCXJldHVybiAoQ2xhc3M8Pz4pIHJhd1R5cGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudE9iamVjdFN1cHBsaWVyRGlzcGF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBFdmVudE9iamVjdFN1cHBsaWVyRGlzcGF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzYwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUEV2ZW50T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5pbnRlcm5hbDsKKworcHVibGljIGNsYXNzIFJBUEV2ZW50T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyIGV4dGVuZHMgUkFQQWJzdHJhY3RPYmplY3RTdXBwbGllckRpc3BhdGNoZXI8UkFQRXZlbnRPYmplY3RTdXBwbGllcj4geworCisJcHVibGljIFJBUEV2ZW50T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyKCkgeworCQlzdXBlcihSQVBFdmVudE9iamVjdFN1cHBsaWVyLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBQcmVmZXJlbmNlc09iamVjdFN1cHBsaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUFByZWZlcmVuY2VzT2JqZWN0U3VwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2E5MTFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBQcmVmZXJlbmNlc09iamVjdFN1cHBsaWVyLmphdmEKQEAgLTAsMCArMSwzOTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZU5vZGVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuSUluamVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucy5QcmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuc3VwcGxpZXJzLkV4dGVuZGVkT2JqZWN0U3VwcGxpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5zdXBwbGllcnMuSU9iamVjdERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5zdXBwbGllcnMuSVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAuZTQucHJlZmVyZW5jZXMuRVByZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzLkVQcmVmZXJlbmNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzLkVQcmVmZXJlbmNlU2VydmljZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuRnJhbWV3b3JrVXRpbDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOworCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIFJBUFByZWZlcmVuY2VzT2JqZWN0U3VwcGxpZXIgZXh0ZW5kcyBFeHRlbmRlZE9iamVjdFN1cHBsaWVyIHsKKworCXN0YXRpYyBwcml2YXRlIGNsYXNzIFByZWZJbmplY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEVQcmVmZXJlbmNlTGlzdGVuZXIgeworCisJCWZpbmFsIHByaXZhdGUgSVJlcXVlc3RvciByZXF1ZXN0b3I7CisJCWZpbmFsIHByaXZhdGUgRVByZWZlcmVuY2Ugbm9kZTsKKworCQlwdWJsaWMgUHJlZkluamVjdGlvbkxpc3RlbmVyKEVQcmVmZXJlbmNlIG5vZGUsIElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJCQl0aGlzLm5vZGUgPSBub2RlOworCQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZSgpIHsKKwkJCWlmICghcmVxdWVzdG9yLmlzVmFsaWQoKSkgeworCQkJCW5vZGUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcmVxdWVzdG9yLnJlc29sdmVBcmd1bWVudHMoZmFsc2UpOworCQkJcmVxdWVzdG9yLmV4ZWN1dGUoKTsKKwkJfQorCisJCXB1YmxpYyBJUmVxdWVzdG9yIGdldFJlcXVlc3RvcigpIHsKKwkJCXJldHVybiByZXF1ZXN0b3I7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKCkgeworCQkJbm9kZS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwkJfQorCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxQcmVmSW5qZWN0aW9uTGlzdGVuZXI+PiBsaXN0ZW5lckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByZWZJbmplY3Rpb25MaXN0ZW5lcj4+KCk7CisKKwlASW5qZWN0CisJRVByZWZlcmVuY2VTZXJ2aWNlIHByZWZlcmVuY2VTZXJ2aWNlOworCQorCXB1YmxpYyBSQVBQcmVmZXJlbmNlc09iamVjdFN1cHBsaWVyKCkgeworLy8JCURJRUFjdGl2YXRvci5nZXREZWZhdWx0KCkucmVnaXN0ZXJQcmVmZXJlbmNlc1N1cHBsaWVyKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0KElPYmplY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElSZXF1ZXN0b3IgcmVxdWVzdG9yLCBib29sZWFuIHRyYWNrLCBib29sZWFuIGdyb3VwKSB7CisJCWlmIChkZXNjcmlwdG9yID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJQ2xhc3M8Pz4gZGVzY3JpcHRvcnNDbGFzcyA9IGdldERlc2lyZWRDbGFzcyhkZXNjcmlwdG9yLmdldERlc2lyZWRUeXBlKCkpOworCQlTdHJpbmcgbm9kZVBhdGggPSBnZXROb2RlUGF0aChkZXNjcmlwdG9yLCByZXF1ZXN0b3IuZ2V0UmVxdWVzdGluZ09iamVjdENsYXNzKCkpOworCQlpZiAoSUVjbGlwc2VQcmVmZXJlbmNlcy5jbGFzcy5lcXVhbHMoZGVzY3JpcHRvcnNDbGFzcykpIHsKKwkJCXJldHVybiBuZXcgV3JhcHBlZFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Tm9kZShub2RlUGF0aCkpOworLy8JCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Tm9kZShub2RlUGF0aCk7CisJCX0gZWxzZSBpZiggRVByZWZlcmVuY2UuY2xhc3MuZXF1YWxzKGRlc2NyaXB0b3JzQ2xhc3MpICkgeworCQkJcmV0dXJuIGdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldE5vZGUobm9kZVBhdGgpOworCQl9CisKKwkJU3RyaW5nIGtleSA9IGdldEtleShkZXNjcmlwdG9yKTsKKwkJaWYgKGtleSA9PSBudWxsIHx8IG5vZGVQYXRoID09IG51bGwgfHwga2V5Lmxlbmd0aCgpID09IDAgfHwgbm9kZVBhdGgubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiBJSW5qZWN0b3IuTk9UX0FfVkFMVUU7CisJCWlmICh0cmFjaykKKwkJCWFkZExpc3RlbmVyKG5vZGVQYXRoLCByZXF1ZXN0b3IpOworCisJCWlmIChkZXNjcmlwdG9yc0NsYXNzLmlzUHJpbWl0aXZlKCkpIHsKKwkJCWlmIChkZXNjcmlwdG9yc0NsYXNzLmVxdWFscyhib29sZWFuLmNsYXNzKSkKKwkJCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Qm9vbGVhbihub2RlUGF0aCwga2V5LCBmYWxzZSk7CisJCQllbHNlIGlmIChkZXNjcmlwdG9yc0NsYXNzLmVxdWFscyhpbnQuY2xhc3MpKQorCQkJCXJldHVybiBnZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRJbnQobm9kZVBhdGgsIGtleSwgMCk7CisJCQllbHNlIGlmIChkZXNjcmlwdG9yc0NsYXNzLmVxdWFscyhkb3VibGUuY2xhc3MpKQorCQkJCXJldHVybiBnZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXREb3VibGUobm9kZVBhdGgsIGtleSwgMC4wZCk7CisJCQllbHNlIGlmIChkZXNjcmlwdG9yc0NsYXNzLmVxdWFscyhmbG9hdC5jbGFzcykpCisJCQkJcmV0dXJuIGdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldEZsb2F0KG5vZGVQYXRoLCBrZXksIDAuMGYpOworCQkJZWxzZSBpZiAoZGVzY3JpcHRvcnNDbGFzcy5lcXVhbHMobG9uZy5jbGFzcykpCisJCQkJcmV0dXJuIGdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldExvbmcobm9kZVBhdGgsIGtleSwgMEwpOworCQl9CisKKwkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoZGVzY3JpcHRvcnNDbGFzcykpCisJCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKG5vZGVQYXRoLCBrZXkpOworCQllbHNlIGlmIChCb29sZWFuLmNsYXNzLmVxdWFscyhkZXNjcmlwdG9yc0NsYXNzKSkKKwkJCXJldHVybiBnZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRCb29sZWFuKG5vZGVQYXRoLCBrZXksIGZhbHNlKTsKKwkJZWxzZSBpZiAoSW50ZWdlci5jbGFzcy5lcXVhbHMoZGVzY3JpcHRvcnNDbGFzcykpCisJCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0SW50KG5vZGVQYXRoLCBrZXksIDApOworCQllbHNlIGlmIChEb3VibGUuY2xhc3MuZXF1YWxzKGRlc2NyaXB0b3JzQ2xhc3MpKQorCQkJcmV0dXJuIGdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldERvdWJsZShub2RlUGF0aCwga2V5LCAwLjBkKTsKKwkJZWxzZSBpZiAoRmxvYXQuY2xhc3MuZXF1YWxzKGRlc2NyaXB0b3JzQ2xhc3MpKQorCQkJcmV0dXJuIGdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldEZsb2F0KG5vZGVQYXRoLCBrZXksIDAuMGYpOworCQllbHNlIGlmIChMb25nLmNsYXNzLmVxdWFscyhkZXNjcmlwdG9yc0NsYXNzKSkKKwkJCXJldHVybiBnZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRMb25nKG5vZGVQYXRoLCBrZXksIDBMKTsKKworCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKG5vZGVQYXRoLCBrZXkpOworCX0KKworCXByaXZhdGUgQ2xhc3M8Pz4gZ2V0RGVzaXJlZENsYXNzKFR5cGUgZGVzaXJlZFR5cGUpIHsKKwkJaWYgKGRlc2lyZWRUeXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pCisJCQlyZXR1cm4gKENsYXNzPD8+KSBkZXNpcmVkVHlwZTsKKwkJaWYgKGRlc2lyZWRUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKwkJCVR5cGUgcmF3VHlwZSA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIGRlc2lyZWRUeXBlKS5nZXRSYXdUeXBlKCk7CisJCQlpZiAocmF3VHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KQorCQkJCXJldHVybiAoQ2xhc3M8Pz4pIHJhd1R5cGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KElPYmplY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlQcmVmZXJlbmNlIHF1YWxpZmllciA9IGRlc2NyaXB0b3IuZ2V0UXVhbGlmaWVyKFByZWZlcmVuY2UuY2xhc3MpOworCQlyZXR1cm4gcXVhbGlmaWVyLnZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9kZVBhdGgoSU9iamVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ2xhc3M8Pz4gcmVxdWVzdGluZ09iamVjdCkgeworCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVByZWZlcmVuY2UgcXVhbGlmaWVyID0gZGVzY3JpcHRvci5nZXRRdWFsaWZpZXIoUHJlZmVyZW5jZS5jbGFzcyk7CisJCVN0cmluZyBub2RlUGF0aCA9IHF1YWxpZmllci5ub2RlUGF0aCgpOworCisJCWlmIChub2RlUGF0aCA9PSBudWxsIHx8IG5vZGVQYXRoLmxlbmd0aCgpID09IDApIHsKKwkJCWlmIChyZXF1ZXN0aW5nT2JqZWN0ID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQlub2RlUGF0aCA9IEZyYW1ld29ya1V0aWwuZ2V0QnVuZGxlKHJlcXVlc3RpbmdPYmplY3QpLmdldFN5bWJvbGljTmFtZSgpOworCQl9CisJCXJldHVybiBub2RlUGF0aDsKKwl9CisKKwlwcml2YXRlIEVQcmVmZXJlbmNlU2VydmljZSBnZXRQcmVmZXJlbmNlc1NlcnZpY2UoKSB7CisvLwkJcmV0dXJuIERJRUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7CisJCXJldHVybiBwcmVmZXJlbmNlU2VydmljZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXIoU3RyaW5nIG5vZGVQYXRoLCBmaW5hbCBJUmVxdWVzdG9yIHJlcXVlc3RvcikgeworCQlpZiAocmVxdWVzdG9yID09IG51bGwpCisJCQlyZXR1cm47CisJCXN5bmNocm9uaXplZCAobGlzdGVuZXJDYWNoZSkgeworCQkJaWYgKGxpc3RlbmVyQ2FjaGUuY29udGFpbnNLZXkobm9kZVBhdGgpKSB7CisJCQkJZm9yIChQcmVmSW5qZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lckNhY2hlLmdldChub2RlUGF0aCkpIHsKKwkJCQkJSVJlcXVlc3RvciBwcmV2aW91c1JlcXVlc3RvciA9IGxpc3RlbmVyLmdldFJlcXVlc3RvcigpOworCQkJCQlpZiAocHJldmlvdXNSZXF1ZXN0b3IuZXF1YWxzKHJlcXVlc3RvcikpCisJCQkJCQlyZXR1cm47IC8vIGF2b2lkIGFkZGluZyBkdXBsaWNhdGUgbGlzdGVuZXJzCisJCQkJfQorCQkJfQorCQl9CisJCWZpbmFsIEVQcmVmZXJlbmNlIG5vZGUgPSBnZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXROb2RlKG5vZGVQYXRoKTsKKwkJUHJlZkluamVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByZWZJbmplY3Rpb25MaXN0ZW5lcihub2RlLCByZXF1ZXN0b3IpOworCQlub2RlLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyQ2FjaGUpIHsKKwkJCWlmIChsaXN0ZW5lckNhY2hlLmNvbnRhaW5zS2V5KG5vZGVQYXRoKSkKKwkJCQlsaXN0ZW5lckNhY2hlLmdldChub2RlUGF0aCkuYWRkKGxpc3RlbmVyKTsKKwkJCWVsc2UgeworCQkJCUxpc3Q8UHJlZkluamVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5pbmdSZXF1ZXN0b3JzID0gbmV3IEFycmF5TGlzdDxQcmVmSW5qZWN0aW9uTGlzdGVuZXI+KCk7CisJCQkJbGlzdGVuaW5nUmVxdWVzdG9ycy5hZGQobGlzdGVuZXIpOworCQkJCWxpc3RlbmVyQ2FjaGUucHV0KG5vZGVQYXRoLCBsaXN0ZW5pbmdSZXF1ZXN0b3JzKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUFsbExpc3RlbmVycygpIHsKKwkJc3luY2hyb25pemVkIChsaXN0ZW5lckNhY2hlKSB7CisJCQlmb3IgKExpc3Q8UHJlZkluamVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMgOiBsaXN0ZW5lckNhY2hlLnZhbHVlcygpKSB7CisJCQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQorCQkJCQljb250aW51ZTsKKwkJCQlmb3IgKFByZWZJbmplY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworCQkJCQlsaXN0ZW5lci5zdG9wTGlzdGVuaW5nKCk7CisJCQkJfQorCQkJfQorCQkJbGlzdGVuZXJDYWNoZS5jbGVhcigpOworCQl9CisJfQorCQorCUBQcmVEZXN0cm95CisJdm9pZCBzaHV0ZG93bigpIHsKKwkJcmVtb3ZlQWxsTGlzdGVuZXJzKCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgV3JhcHBlZFByZWZlcmVuY2UgaW1wbGVtZW50cyBJRWNsaXBzZVByZWZlcmVuY2VzIHsKKwkJcHJpdmF0ZSBFUHJlZmVyZW5jZSBub2RlOworCQkKKwkJcHVibGljIFdyYXBwZWRQcmVmZXJlbmNlKEVQcmVmZXJlbmNlIG5vZGUpIHsKKwkJCXRoaXMubm9kZSA9IG5vZGU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBhYnNvbHV0ZVBhdGgoKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nW10gY2hpbGRyZW5OYW1lcygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xlYXIoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGFyZzAsIGJvb2xlYW4gYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5KFN0cmluZyBhcmcwLCBieXRlW10gYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIGFyZzAsIGRvdWJsZSBhcmcxKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGFyZzAsIGZsb2F0IGFyZzEpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiAwOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBhcmcwLCBpbnQgYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIDA7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgYXJnMCwgbG9uZyBhcmcxKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nW10ga2V5cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBuYW1lKCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gbm9kZUV4aXN0cyhTdHJpbmcgYXJnMCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFByZWZlcmVuY2VzIHBhcmVudCgpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGFyZzAsIGJvb2xlYW4gYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcHV0Qnl0ZUFycmF5KFN0cmluZyBhcmcwLCBieXRlW10gYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcHV0RG91YmxlKFN0cmluZyBhcmcwLCBkb3VibGUgYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcHV0RmxvYXQoU3RyaW5nIGFyZzAsIGZsb2F0IGFyZzEpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHB1dEludChTdHJpbmcgYXJnMCwgaW50IGFyZzEpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHB1dExvbmcoU3RyaW5nIGFyZzAsIGxvbmcgYXJnMSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBhcmcwKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzeW5jKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBhY2NlcHQoSVByZWZlcmVuY2VOb2RlVmlzaXRvciBhcmcwKQorCQkJCXRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYWRkTm9kZUNoYW5nZUxpc3RlbmVyKElOb2RlQ2hhbmdlTGlzdGVuZXIgYXJnMCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKElQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYXJnMCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFByZWZlcmVuY2VzIG5vZGUoU3RyaW5nIGFyZzApIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGVDaGFuZ2VMaXN0ZW5lcihJTm9kZUNoYW5nZUxpc3RlbmVyIGFyZzApIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigKKwkJCQlJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGFyZzApIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisJCQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQUHJlZmVyZW5jZXNPYmplY3RTdXBwbGllckRpc3BhdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQUHJlZmVyZW5jZXNPYmplY3RTdXBwbGllckRpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY5NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBQcmVmZXJlbmNlc09iamVjdFN1cHBsaWVyRGlzcGF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuaW50ZXJuYWw7CisKK3B1YmxpYyBjbGFzcyBSQVBQcmVmZXJlbmNlc09iamVjdFN1cHBsaWVyRGlzcGF0Y2hlciBleHRlbmRzIFJBUEFic3RyYWN0T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyPFJBUFByZWZlcmVuY2VzT2JqZWN0U3VwcGxpZXI+IHsKKwlwdWJsaWMgUkFQUHJlZmVyZW5jZXNPYmplY3RTdXBwbGllckRpc3BhdGNoZXIoKSB7CisJCXN1cGVyKFJBUFByZWZlcmVuY2VzT2JqZWN0U3VwcGxpZXIuY2xhc3MpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBUcmFuc2xhdGlvblN1cHBsaWVyRGlzcGF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBUcmFuc2xhdGlvblN1cHBsaWVyRGlzcGF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODA4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUFRyYW5zbGF0aW9uU3VwcGxpZXJEaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmludGVybmFsLnNlcnZpY2VzLlRyYW5zbGF0aW9uT2JqZWN0U3VwcGxpZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgUkFQVHJhbnNsYXRpb25TdXBwbGllckRpc3BhdGNoZXIgZXh0ZW5kcyBSQVBBYnN0cmFjdE9iamVjdFN1cHBsaWVyRGlzcGF0Y2hlcjxUcmFuc2xhdGlvbk9iamVjdFN1cHBsaWVyPiB7CisKKwlwdWJsaWMgUkFQVHJhbnNsYXRpb25TdXBwbGllckRpc3BhdGNoZXIoKSB7CisJCXN1cGVyKFRyYW5zbGF0aW9uT2JqZWN0U3VwcGxpZXIuY2xhc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQVUlFdmVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQVUlFdmVudEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjJkOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBVSUV2ZW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5VSVN5bmNocm9uaXplOworCitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKKworLyoqCisgKiBUaGUgaGVscGVyIHdpbGwgcHJvcGVybHkgcGxhY2UgVUktYXdhcmUgY29uc3VtZXJzIG9uIHRoZSBtYWluIHRocmVhZC4KKyAqLworcHVibGljIGNsYXNzIFJBUFVJRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgRXZlbnRIYW5kbGVyIHsKKworCWZpbmFsIHByaXZhdGUgRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcjsKKwlmaW5hbCBwcml2YXRlIFVJU3luY2hyb25pemUgdWlTeW5jOworCisJcHVibGljIFJBUFVJRXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIsIFVJU3luY2hyb25pemUgdWlTeW5jKSB7CisJCXRoaXMuZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyOworCQl0aGlzLnVpU3luYyA9IHVpU3luYzsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlciNoYW5kbGVFdmVudChvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGV2ZW50KSB7CisJCWlmICh1aVN5bmMgPT0gbnVsbCkKKwkJCWV2ZW50SGFuZGxlci5oYW5kbGVFdmVudChldmVudCk7CisJCWVsc2UgeworCQkJaWYoUkFQRXZlbnRCcm9rZXIuaXNBc3luY0V2ZW50KGV2ZW50KSkgeworCQkJCXVpU3luYy5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlldmVudEhhbmRsZXIuaGFuZGxlRXZlbnQoZXZlbnQpOworCQkJCQl9CisJCQkJfSk7CisJCQl9IGVsc2UgeworCQkJCXVpU3luYy5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCWV2ZW50SGFuZGxlci5oYW5kbGVFdmVudChldmVudCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvaW50ZXJuYWwvUkFQVUlFdmVudE9iamVjdFN1cHBsaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUFVJRXZlbnRPYmplY3RTdXBwbGllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWIyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUFVJRXZlbnRPYmplY3RTdXBwbGllci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5zdXBwbGllcnMuSU9iamVjdERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5zdXBwbGllcnMuSVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5kaS5VSUV2ZW50VG9waWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlTeW5jaHJvbml6ZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBSQVBVSUV2ZW50T2JqZWN0U3VwcGxpZXIgZXh0ZW5kcyBSQVBFdmVudE9iamVjdFN1cHBsaWVyIHsKKworCWNsYXNzIFVJRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgRXZlbnRIYW5kbGVyIHsKKworCQlmaW5hbCBwcm90ZWN0ZWQgSVJlcXVlc3RvciByZXF1ZXN0b3I7CisJCWZpbmFsIHByaXZhdGUgU3RyaW5nIHRvcGljOworCisJCXB1YmxpYyBVSUV2ZW50SGFuZGxlcihTdHJpbmcgdG9waWMsIElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJCQl0aGlzLnRvcGljID0gdG9waWM7CisJCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQgZXZlbnQpIHsKKwkJCWFkZEN1cnJlbnRFdmVudCh0b3BpYywgZXZlbnQpOworCQkJcmVxdWVzdG9yLnJlc29sdmVBcmd1bWVudHMoZmFsc2UpOworCQkJcmVtb3ZlQ3VycmVudEV2ZW50KHRvcGljKTsKKwkJCWlmKCB1aVN5bmMgPT0gbnVsbCApIHsKKwkJCQlpZiAobG9nZ2VyICE9IG51bGwpCisJCQkJCWxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywgIk5vIHJlYWxtIGZvdW5kIHRvIHByb2Nlc3MgVUkgZXZlbnQgIiArIGV2ZW50KTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWlmKFJBUEV2ZW50QnJva2VyLmlzQXN5bmNFdmVudChldmVudCkpIHsKKwkJCQkJdWlTeW5jLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJcmVxdWVzdG9yLmV4ZWN1dGUoKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdWlTeW5jLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlyZXF1ZXN0b3IuZXhlY3V0ZSgpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlASW5qZWN0CisJcHJvdGVjdGVkIFVJU3luY2hyb25pemUgdWlTeW5jOworCisJQEluamVjdCBAT3B0aW9uYWwKKwlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKKworCXByb3RlY3RlZCBFdmVudEhhbmRsZXIgbWFrZUhhbmRsZXIoU3RyaW5nIHRvcGljLCBJUmVxdWVzdG9yIHJlcXVlc3RvcikgeworCQlyZXR1cm4gbmV3IFVJRXZlbnRIYW5kbGVyKHRvcGljLCByZXF1ZXN0b3IpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0VG9waWMoSU9iamVjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVVJRXZlbnRUb3BpYyBxdWFsaWZpZXIgPSBkZXNjcmlwdG9yLmdldFF1YWxpZmllcihVSUV2ZW50VG9waWMuY2xhc3MpOworCQlyZXR1cm4gUkFQRXZlbnRCcm9rZXIucmFwaWZ5VG9waWMoaW5zdGFuY2VJZCwgcXVhbGlmaWVyLnZhbHVlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBVSUV2ZW50T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2ludGVybmFsL1JBUFVJRXZlbnRPYmplY3RTdXBwbGllckRpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzA2YTAzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9pbnRlcm5hbC9SQVBVSUV2ZW50T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5pbnRlcm5hbDsKKworcHVibGljIGNsYXNzIFJBUFVJRXZlbnRPYmplY3RTdXBwbGllckRpc3BhdGNoZXIgZXh0ZW5kcyBSQVBBYnN0cmFjdE9iamVjdFN1cHBsaWVyRGlzcGF0Y2hlcjxSQVBVSUV2ZW50T2JqZWN0U3VwcGxpZXI+IHsKKworCXB1YmxpYyBSQVBVSUV2ZW50T2JqZWN0U3VwcGxpZXJEaXNwYXRjaGVyKCkgeworCQlzdXBlcihSQVBVSUV2ZW50T2JqZWN0U3VwcGxpZXIuY2xhc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvcHJlZmVyZW5jZXMvRVByZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvcHJlZmVyZW5jZXMvRVByZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkzMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9wcmVmZXJlbmNlcy9FUHJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgRVByZWZlcmVuY2UgeworCisJdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihFUHJlZmVyZW5jZUxpc3RlbmVyIGxpc3RlbmVyKTsKKwl2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKEVQcmVmZXJlbmNlTGlzdGVuZXIgbGlzdGVuZXIpOworCQorCWJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSk7CisJaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmYXVsdFZhbHVlKTsKKwlkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpOworCWZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IGRlZmF1bHRWYWx1ZSk7CisJbG9uZyBnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgZGVmYXVsdFZhbHVlKTsKKwlTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOworCQorCUlTdGF0dXMgc2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKKwlJU3RhdHVzIHNldEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpOworCUlTdGF0dXMgc2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSk7CisJSVN0YXR1cyBzZXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCB2YWx1ZSk7CisJSVN0YXR1cyBzZXRMb25nKFN0cmluZyBrZXksIGxvbmcgdmFsdWUpOworCUlTdGF0dXMgc2V0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L3ByZWZlcmVuY2VzL0VQcmVmZXJlbmNlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvcHJlZmVyZW5jZXMvRVByZWZlcmVuY2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L3ByZWZlcmVuY2VzL0VQcmVmZXJlbmNlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzOworCitwdWJsaWMgaW50ZXJmYWNlIEVQcmVmZXJlbmNlTGlzdGVuZXIgeworCisJdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKCk7CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmFwLmU0L3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvcHJlZmVyZW5jZXMvRVByZWZlcmVuY2VTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L3ByZWZlcmVuY2VzL0VQcmVmZXJlbmNlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2ZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L3ByZWZlcmVuY2VzL0VQcmVmZXJlbmNlU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKKworcHVibGljIGludGVyZmFjZSBFUHJlZmVyZW5jZVNlcnZpY2UgeworCXB1YmxpYyBFUHJlZmVyZW5jZSBnZXROb2RlKFN0cmluZyBub2RlUGF0aCk7CisKKwlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgYm9vbGVhbiBiKTsKKworCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgaW50IGkpOworCisJcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBkb3VibGUgZCk7CisKKwlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBmbG9hdCBmKTsKKworCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBsb25nIGwpOworCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5KTsKKwkKKwlwdWJsaWMgSVN0YXR1cyBzZXRCb29sZWFuKFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7CisJCisJcHVibGljIElTdGF0dXMgc2V0RG91YmxlKFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgZG91YmxlIHZhbHVlKTsKKwkKKwlwdWJsaWMgSVN0YXR1cyBzZXRGbG9hdChTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKTsKKwkKKwlwdWJsaWMgSVN0YXR1cyBzZXRJbnQoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBpbnQgdmFsdWUpOworCQorCXB1YmxpYyBJU3RhdHVzIHNldExvbmcoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBsb25nIHZhbHVlKTsKKwkKKwlwdWJsaWMgSVN0YXR1cyBzZXRTdHJpbmcoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9wcmVmZXJlbmNlcy9pbnRlcm5hbC9QcmVmZXJlbmNlU2VydmljZUNvbnRleHRGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9wcmVmZXJlbmNlcy9pbnRlcm5hbC9QcmVmZXJlbmNlU2VydmljZUNvbnRleHRGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjcwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L3ByZWZlcmVuY2VzL2ludGVybmFsL1ByZWZlcmVuY2VTZXJ2aWNlQ29udGV4dEZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQucHJlZmVyZW5jZXMuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLkNvbnRleHRJbmplY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVNlcnZpY2VDb250ZXh0RnVuY3Rpb24gZXh0ZW5kcyBDb250ZXh0RnVuY3Rpb24geworCQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29tcHV0ZShJRWNsaXBzZUNvbnRleHQgY29udGV4dCkgeworCQlyZXR1cm4gQ29udGV4dEluamVjdGlvbkZhY3RvcnkubWFrZShSQVBQcmVmZXJlbmNlU2VydmljZS5jbGFzcywgY29udGV4dCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9wcmVmZXJlbmNlcy9pbnRlcm5hbC9SQVBQcmVmZXJlbmNlU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQvc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9wcmVmZXJlbmNlcy9pbnRlcm5hbC9SQVBQcmVmZXJlbmNlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjU2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJhcC5lNC9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L3ByZWZlcmVuY2VzL2ludGVybmFsL1JBUFByZWZlcmVuY2VTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5lNC5wcmVmZXJlbmNlcy5FUHJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAuZTQucHJlZmVyZW5jZXMuRVByZWZlcmVuY2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAuZTQucHJlZmVyZW5jZXMuRVByZWZlcmVuY2VTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3Quc2VydmljZS5TZXR0aW5nU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLnJ3dC5zZXJ2aWNlLlNldHRpbmdTdG9yZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3Quc2VydmljZS5TZXR0aW5nU3RvcmVMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIFJBUFByZWZlcmVuY2VTZXJ2aWNlIGltcGxlbWVudHMgRVByZWZlcmVuY2VTZXJ2aWNlIHsKKwkKKwlwcml2YXRlIGZpbmFsIFNldHRpbmdTdG9yZSBzZXR0aW5nU3RvcmU7CisJCisJcHJpdmF0ZSBNYXA8UHJlZmVyZW5jZUltcGwsIEJvb2xlYW4+IHRyYWNrZWRQcmVmZXJlbmNlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgV2Vha0hhc2hNYXA8UkFQUHJlZmVyZW5jZVNlcnZpY2UuUHJlZmVyZW5jZUltcGwsIEJvb2xlYW4+KCkpOworCQorCXByaXZhdGUgZmluYWwgU2V0dGluZ1N0b3JlTGlzdGVuZXIgbGlzdGVuZXI7CisJCisJQEluamVjdAorCXB1YmxpYyBSQVBQcmVmZXJlbmNlU2VydmljZShTZXR0aW5nU3RvcmUgc2V0dGluZ1N0b3JlKSB7CisJCXRoaXMuc2V0dGluZ1N0b3JlID0gc2V0dGluZ1N0b3JlOworCQl0aGlzLmxpc3RlbmVyID0gbmV3IFNldHRpbmdTdG9yZUxpc3RlbmVyKCkgeworCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHNldHRpbmdDaGFuZ2VkKFNldHRpbmdTdG9yZUV2ZW50IGV2ZW50KSB7CisJCQkJaWYoIGV2ZW50LmdldEF0dHJpYnV0ZU5hbWUoKS5jb250YWlucygiIyIpICkgeworCQkJCQlTdHJpbmcgbm9kZVBhdGggPSBldmVudC5nZXRBdHRyaWJ1dGVOYW1lKCkuc3Vic3RyaW5nKDAsZXZlbnQuZ2V0QXR0cmlidXRlTmFtZSgpLmluZGV4T2YoJyMnKSk7CisJCQkJCVByZWZlcmVuY2VJbXBsW10gYXJyYXkgPSBuZXcgUHJlZmVyZW5jZUltcGxbdHJhY2tlZFByZWZlcmVuY2VzLnNpemUoKV07CisJCQkJCXN5bmNocm9uaXplZCAodHJhY2tlZFByZWZlcmVuY2VzKSB7CisJCQkJCQlJdGVyYXRvcjxFbnRyeTxQcmVmZXJlbmNlSW1wbCwgQm9vbGVhbj4+IGl0ZXJhdG9yID0gdHJhY2tlZFByZWZlcmVuY2VzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCQkJCWludCBpbmRleCA9IDA7CisJCQkJCQl3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkgeworCQkJCQkJCUVudHJ5PFByZWZlcmVuY2VJbXBsLCBCb29sZWFuPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCQlpZiggZW50cnkuZ2V0S2V5KCkgPT0gbnVsbCApIHsKKwkJCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7CisJCQkJCQkJfSBlbHNlIGlmKCBlbnRyeS5nZXRLZXkoKS5ub2RlUGF0aC5lcXVhbHMobm9kZVBhdGgpICkgeworCQkJCQkJCQlhcnJheVtpbmRleCsrXSA9IGVudHJ5LmdldEtleSgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKyApIHsKKwkJCQkJCWlmKCBhcnJheVtpXSA9PSBudWxsICkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJYXJyYXlbaV0uZmlyZUNoYW5nZSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCQl0aGlzLnNldHRpbmdTdG9yZS5hZGRTZXR0aW5nU3RvcmVMaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHRyYWNrKFByZWZlcmVuY2VJbXBsIGltcGwpIHsKKwkJdHJhY2tlZFByZWZlcmVuY2VzLnB1dChpbXBsLCBCb29sZWFuLlRSVUUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnRyYWNrKFByZWZlcmVuY2VJbXBsIGltcGwpIHsKKwkJdHJhY2tlZFByZWZlcmVuY2VzLnJlbW92ZShpbXBsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKwkJU3RyaW5nIHYgPSBzZXR0aW5nU3RvcmUuZ2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUobm9kZVBhdGgsa2V5KSk7CisJCWlmKCB2ID09IG51bGwgKSB7CisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQl9CisJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yodik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBpbnQgZGVmYXVsdFZhbHVlKSB7CisJCVN0cmluZyB2ID0gc2V0dGluZ1N0b3JlLmdldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKG5vZGVQYXRoLGtleSkpOworCQlpZiggdiA9PSBudWxsICkgeworCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKwkJfQorCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIHsKKwkJU3RyaW5nIHYgPSBzZXR0aW5nU3RvcmUuZ2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUobm9kZVBhdGgsa2V5KSk7CisJCWlmKCB2ID09IG51bGwgKSB7CisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQl9CisJCXJldHVybiBEb3VibGUucGFyc2VEb3VibGUodik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgZmxvYXQgZGVmYXVsdFZhbHVlKSB7CisJCVN0cmluZyB2ID0gc2V0dGluZ1N0b3JlLmdldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKG5vZGVQYXRoLGtleSkpOworCQlpZiggdiA9PSBudWxsICkgeworCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKwkJfQorCQlyZXR1cm4gRmxvYXQucGFyc2VGbG9hdCh2KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgbG9uZyBkZWZhdWx0VmFsdWUpIHsKKwkJU3RyaW5nIHYgPSBzZXR0aW5nU3RvcmUuZ2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUobm9kZVBhdGgsa2V5KSk7CisJCWlmKCB2ID09IG51bGwgKSB7CisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQl9CisJCXJldHVybiBMb25nLnBhcnNlTG9uZyh2KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIHNldHRpbmdTdG9yZS5nZXRBdHRyaWJ1dGUoZ2V0QXR0cmlidXRlTmFtZShub2RlUGF0aCxrZXkpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRVByZWZlcmVuY2UgZ2V0Tm9kZShTdHJpbmcgbm9kZVBhdGgpIHsKKwkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlSW1wbChub2RlUGF0aCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHNldEJvb2xlYW4oU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CisJCXJldHVybiBzZXRTdHJpbmcobm9kZVBhdGgsIGtleSwgdmFsdWUrIiIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyBzZXREb3VibGUoU3RyaW5nIG5vZGVQYXRoLCBTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpIHsKKwkJcmV0dXJuIHNldFN0cmluZyhub2RlUGF0aCwga2V5LCB2YWx1ZSsiIik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHNldEZsb2F0KFN0cmluZyBub2RlUGF0aCwgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKKwkJcmV0dXJuIHNldFN0cmluZyhub2RlUGF0aCwga2V5LCB2YWx1ZSsiIik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHNldEludChTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXksIGludCB2YWx1ZSkgeworCQlyZXR1cm4gc2V0U3RyaW5nKG5vZGVQYXRoLCBrZXksIHZhbHVlKyIiKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgc2V0TG9uZyhTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKKwkJcmV0dXJuIHNldFN0cmluZyhub2RlUGF0aCwga2V5LCB2YWx1ZSsiIik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHNldFN0cmluZyhTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQl0cnkgeworCQkJc2V0dGluZ1N0b3JlLnNldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKG5vZGVQYXRoLCBrZXkpLCB2YWx1ZSk7CisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLnJhcC5lNCIsICJVbmFibGUgdG8gc3RvcmUgcHJlZmVyZW5jZSIsIGUpOworCQl9CisJfQorCQorCXN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZShTdHJpbmcgbm9kZVBhdGgsIFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIG5vZGVQYXRoKyIjIitrZXk7CisJfQorCQorCWNsYXNzIFByZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgRVByZWZlcmVuY2UgeworCQlwcml2YXRlIFN0cmluZyBub2RlUGF0aDsKKwkJcHJpdmF0ZSBMaXN0PEVQcmVmZXJlbmNlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RVByZWZlcmVuY2VMaXN0ZW5lcj4oKTsKKwkJCisJCXB1YmxpYyBQcmVmZXJlbmNlSW1wbChTdHJpbmcgbm9kZVBhdGgpIHsKKwkJCXRoaXMubm9kZVBhdGggPSBub2RlUGF0aDsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKwkJCXJldHVybiBSQVBQcmVmZXJlbmNlU2VydmljZS50aGlzLmdldEJvb2xlYW4obm9kZVBhdGgsIGtleSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmYXVsdFZhbHVlKSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5nZXRJbnQobm9kZVBhdGgsIGtleSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5nZXREb3VibGUobm9kZVBhdGgsIGtleSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgZGVmYXVsdFZhbHVlKSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5nZXRGbG9hdChub2RlUGF0aCwga2V5LCBkZWZhdWx0VmFsdWUpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIGtleSwgbG9uZyBkZWZhdWx0VmFsdWUpIHsKKwkJCXJldHVybiBSQVBQcmVmZXJlbmNlU2VydmljZS50aGlzLmdldExvbmcobm9kZVBhdGgsIGtleSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5nZXRTdHJpbmcobm9kZVBhdGgsIGtleSk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSVN0YXR1cyBzZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKKwkJCXJldHVybiBSQVBQcmVmZXJlbmNlU2VydmljZS50aGlzLnNldEJvb2xlYW4obm9kZVBhdGgsIGtleSwgdmFsdWUpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIElTdGF0dXMgc2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSkgeworCQkJcmV0dXJuIFJBUFByZWZlcmVuY2VTZXJ2aWNlLnRoaXMuc2V0RG91YmxlKG5vZGVQYXRoLCBrZXksIHZhbHVlKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJU3RhdHVzIHNldEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5zZXRGbG9hdChub2RlUGF0aCwga2V5LCB2YWx1ZSk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSVN0YXR1cyBzZXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5zZXRJbnQobm9kZVBhdGgsIGtleSwgdmFsdWUpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIElTdGF0dXMgc2V0TG9uZyhTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisJCQlyZXR1cm4gUkFQUHJlZmVyZW5jZVNlcnZpY2UudGhpcy5zZXRMb25nKG5vZGVQYXRoLCBrZXksIHZhbHVlKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJU3RhdHVzIHNldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJCXJldHVybiBSQVBQcmVmZXJlbmNlU2VydmljZS50aGlzLnNldFN0cmluZyhub2RlUGF0aCwga2V5LCB2YWx1ZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoRVByZWZlcmVuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7CisJCQlpZiggbGlzdGVuZXJMaXN0LnNpemUoKSA9PSAxICkgeworCQkJCVJBUFByZWZlcmVuY2VTZXJ2aWNlLnRoaXMudHJhY2sodGhpcyk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoRVByZWZlcmVuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7CisJCQlpZiggbGlzdGVuZXJMaXN0LmlzRW1wdHkoKSApIHsKKwkJCQlSQVBQcmVmZXJlbmNlU2VydmljZS50aGlzLnVudHJhY2sodGhpcyk7CisJCQl9CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGZpcmVDaGFuZ2UoKSB7CisJCQlpZiggISBsaXN0ZW5lckxpc3QuaXNFbXB0eSgpICkgeworCQkJCUVQcmVmZXJlbmNlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QudG9BcnJheShuZXcgRVByZWZlcmVuY2VMaXN0ZW5lcltsaXN0ZW5lckxpc3Quc2l6ZSgpXSk7CisJCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKysgKSB7CisJCQkJCWxpc3RlbmVyc1tpXS5wcmVmZXJlbmNlQ2hhbmdlKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhM2U2OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQ2ZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UucmFwLmU0LmRlbW88L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vQXBwbGljYXRpb24uZTR4bWkgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9BcHBsaWNhdGlvbi5lNHhtaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU5NWJjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vQXBwbGljYXRpb24uZTR4bWkKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxhcHBsaWNhdGlvbjpBcHBsaWNhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFkdmFuY2VkPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi91aS9hZHZhbmNlZCIgeG1sbnM6YXBwbGljYXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdWkvMjAxMC9VSU1vZGVsL2FwcGxpY2F0aW9uIiB4bWxuczpiYXNpYz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24vdWkvYmFzaWMiIHhtbG5zOm1lbnU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdWkvMjAxMC9VSU1vZGVsL2FwcGxpY2F0aW9uL3VpL21lbnUiIHhtaTppZD0iXy1qLUdnS0JORWVPREVzNy1iV3FJeEEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQuaWRlLmFwcGxpY2F0aW9uIiBiaW5kaW5nQ29udGV4dHM9Il8tai10a0tCTkVlT0RFczctYldxSXhBIj4KKyAgPGNoaWxkcmVuIHhzaTp0eXBlPSJiYXNpYzpUcmltbWVkV2luZG93IiB4bWk6aWQ9Il8tai1HZ2FCTkVlT0RFczctYldxSXhBIiBsYWJlbD0iJXRyaW1tZWR3aW5kb3cubGFiZWwuMSIgd2lkdGg9IjUwMCIgaGVpZ2h0PSI0MDAiPgorICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0iYWR2YW5jZWQ6UGVyc3BlY3RpdmVTdGFjayIgeG1pOmlkPSJfWDZtOWNCcWZFZVc1YzZta2lpemxkZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wZXJzcGVjdGl2ZXN0YWNrLjAiPgorICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJhZHZhbmNlZDpQZXJzcGVjdGl2ZSIgeG1pOmlkPSJfWVpMSXdCcWZFZVc1YzZta2lpemxkZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wZXJzcGVjdGl2ZS4wIiBsYWJlbD0iIj4KKyAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJiYXNpYzpQYXJ0U2FzaENvbnRhaW5lciIgeG1pOmlkPSJfNWZBYzBLTGdFZVNHVWZ0c0pUUENCUSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0c2FzaGNvbnRhaW5lci4yIj4KKyAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImJhc2ljOlBhcnRTYXNoQ29udGFpbmVyIiB4bWk6aWQ9Il9GUHZ2UUtDQUVlT0NKNXU3NG8wMnJnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzYXNoY29udGFpbmVyLjAiIGNvbnRhaW5lckRhdGE9IjEwMCIgaG9yaXpvbnRhbD0idHJ1ZSI+CisgICAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImJhc2ljOlBhcnRTdGFjayIgeG1pOmlkPSJfOGVLbXdLSktFZVNaRnREd2RvMDdSZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0c3RhY2suMSIgY29udGFpbmVyRGF0YT0iMTAwIj4KKyAgICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJiYXNpYzpQYXJ0IiB4bWk6aWQ9Il9GemFkQUtDQUVlT0NKNXU3NG8wMnJnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnQuMCIgY29udGFpbmVyRGF0YT0iMTAwIiBsYWJlbD0iRW1wdHkgTGVmdCIgaWNvblVSST0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy9mb2xkZXJfdXNlci5wbmciLz4KKyAgICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJhZHZhbmNlZDpQbGFjZWhvbGRlciIgeG1pOmlkPSJfdzB5akVCcWZFZVc1YzZta2lpemxkZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wbGFjZWhvbGRlci4wIiByZWY9Il9oaXhLZ0JxZkVlVzVjNm1raWl6bGRnIi8+CisgICAgICAgICAgICA8L2NoaWxkcmVuPgorICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJiYXNpYzpQYXJ0U3RhY2siIHhtaTppZD0iX00tdU5JS0NBRWVPQ0o1dTc0bzAycmciIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydHN0YWNrLjAiIGNvbnRhaW5lckRhdGE9IjMwMCI+CisgICAgICAgICAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0iYmFzaWM6UGFydCIgeG1pOmlkPSJfR3d4ZElLQ0FFZU9DSjV1NzRvMDJyZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0LjEiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0cy5FdmVudFNhbXBsZVBhcnQiIGxhYmVsPSIlcGFydC5sYWJlbC4xIiBpY29uVVJJPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL2ljb25zL3VzZXJfZGVsZXRlLnBuZyI+CisgICAgICAgICAgICAgICAgPHRvb2xiYXIgeG1pOmlkPSJfSEhqQWNPR1JFZU9icUpwLV8wczV1QSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby50b29sYmFyLjEiPgorICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJtZW51OkRpcmVjdFRvb2xJdGVtIiB4bWk6aWQ9Il9IaDlFZ09HUkVlT2JxSnAtXzBzNXVBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmRpcmVjdHRvb2xpdGVtLjEiIGxhYmVsPSIlZGlyZWN0dG9vbGl0ZW0ubGFiZWwuMSIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmhhbmRsZXJzLkhlbGxvV29ybGRIYW5kbGVyIi8+CisgICAgICAgICAgICAgICAgPC90b29sYmFyPgorICAgICAgICAgICAgICA8L2NoaWxkcmVuPgorICAgICAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImJhc2ljOlBhcnQiIHhtaTppZD0iX3JrNmwwS2hBRWVPMEhhajN6Nm8zUFEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydC4yIiBjb250cmlidXRpb25VUkk9ImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydHMuUHJlZmVyZW5jZVNhbXBsZVBhcnQiIGxhYmVsPSIlcGFydC5sYWJlbC4yIiBpY29uVVJJPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL2ljb25zL3VzZXJfYWRkLnBuZyI+CisgICAgICAgICAgICAgICAgPG1lbnVzIHhtaTppZD0iX0VJZzhJT0dVRWVPYnFKcC1fMHM1dUEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ubWVudS4yIj4KKyAgICAgICAgICAgICAgICAgIDx0YWdzPlZpZXdNZW51PC90YWdzPgorICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJtZW51OkRpcmVjdE1lbnVJdGVtIiB4bWk6aWQ9Il9IQXQ0VU9HVUVlT2JxSnAtXzBzNXVBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmRpcmVjdG1lbnVpdGVtLjEiIGxhYmVsPSIlZGlyZWN0bWVudWl0ZW0ubGFiZWwuMiIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmhhbmRsZXJzLkhlbGxvV29ybGRIYW5kbGVyIi8+CisgICAgICAgICAgICAgICAgPC9tZW51cz4KKyAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KKyAgICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJiYXNpYzpQYXJ0IiB4bWk6aWQ9Il9KQlVLc0toSEVlTzBIYWozejZvM1BRIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnQuMyIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzLk5MU1NhbXBsZVBhcnQiIGxhYmVsPSIlcGFydC5sYWJlbC4zIiBpY29uVVJJPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL2ljb25zL3JlcG9ydF91c2VyLnBuZyI+CisgICAgICAgICAgICAgICAgPG1lbnVzIHhtaTppZD0iXzRFdXJFT0djRWVPYnFKcC1fMHM1dUEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ubWVudS4zIj4KKyAgICAgICAgICAgICAgICAgIDx0YWdzPlZpZXdNZW51PC90YWdzPgorICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJtZW51OkRpcmVjdE1lbnVJdGVtIiB4bWk6aWQ9Il80bkdfWU9HY0VlT2JxSnAtXzBzNXVBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmRpcmVjdG1lbnVpdGVtLjIiIGxhYmVsPSIlZGlyZWN0bWVudWl0ZW0ubGFiZWwuMyIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmhhbmRsZXJzLkhlbGxvV29ybGRIYW5kbGVyIi8+CisgICAgICAgICAgICAgICAgPC9tZW51cz4KKyAgICAgICAgICAgICAgICA8dG9vbGJhciB4bWk6aWQ9Il82TzRtd09HaUVlT2JxSnAtXzBzNXVBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnRvb2xiYXIuMiI+CisgICAgICAgICAgICAgICAgICA8dGFncz5Db250ZW50QXJlYTwvdGFncz4KKyAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0ibWVudTpEaXJlY3RUb29sSXRlbSIgeG1pOmlkPSJfN3BtNFVPR2lFZU9icUpwLV8wczV1QSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5kaXJlY3R0b29saXRlbS4yIiBsYWJlbD0iJWRpcmVjdHRvb2xpdGVtLmxhYmVsLjIiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVycy5IZWxsb1dvcmxkSGFuZGxlciIvPgorICAgICAgICAgICAgICAgIDwvdG9vbGJhcj4KKyAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KKyAgICAgICAgICAgIDwvY2hpbGRyZW4+CisgICAgICAgICAgPC9jaGlsZHJlbj4KKyAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImJhc2ljOlBhcnRTYXNoQ29udGFpbmVyIiB4bWk6aWQ9Il9nWUJLUUtMZ0VlU0dVZnRzSlRQQ0JRIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzYXNoY29udGFpbmVyLjEiIGNvbnRhaW5lckRhdGE9IjEwMCIgaG9yaXpvbnRhbD0idHJ1ZSI+CisgICAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImJhc2ljOlBhcnQiIHhtaTppZD0iX2lPUHNFS0xnRWVTR1VmdHNKVFBDQlEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydC40IiBjb250YWluZXJEYXRhPSIyMDAiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0cy5TaW1wbGVUZXN0IiBsYWJlbD0iU2ltcGxlIExvd2VyIFBhcnQgUmlnaHQiIGljb25VUkk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZG9vcl9pbi5wbmciLz4KKyAgICAgICAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0iYmFzaWM6UGFydFN0YWNrIiB4bWk6aWQ9Il9pekJORUtMZ0VlU0dVZnRzSlRQQ0JRIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzdGFjay4yIiBjb250YWluZXJEYXRhPSI0MDAiPgorICAgICAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImJhc2ljOlBhcnQiIHhtaTppZD0iXzE2SW40S0xnRWVTR1VmdHNKVFBDQlEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydC41IiBjb250cmlidXRpb25VUkk9ImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydHMuU2ltcGxlVGVzdCIgbGFiZWw9IlNpbXBsZSBMb3dlciBSaWdodCIgaWNvblVSST0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy9kaXNrLnBuZyIvPgorICAgICAgICAgICAgPC9jaGlsZHJlbj4KKyAgICAgICAgICA8L2NoaWxkcmVuPgorICAgICAgICA8L2NoaWxkcmVuPgorICAgICAgPC9jaGlsZHJlbj4KKyAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0iYWR2YW5jZWQ6UGVyc3BlY3RpdmUiIHhtaTppZD0iX2ZmUm93QnFmRWVXNWM2bWtpaXpsZGciIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGVyc3BlY3RpdmUuMSI+CisgICAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0iYmFzaWM6UGFydFN0YWNrIiB4bWk6aWQ9Il92VnBya0JxZkVlVzVjNm1raWl6bGRnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzdGFjay4zIj4KKyAgICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9ImFkdmFuY2VkOlBsYWNlaG9sZGVyIiB4bWk6aWQ9Il96aFlGSUJxZkVlVzVjNm1raWl6bGRnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBsYWNlaG9sZGVyLjEiIHJlZj0iX2hpeEtnQnFmRWVXNWM2bWtpaXpsZGciLz4KKyAgICAgICAgPC9jaGlsZHJlbj4KKyAgICAgIDwvY2hpbGRyZW4+CisgICAgPC9jaGlsZHJlbj4KKyAgICA8bWFpbk1lbnUgeG1pOmlkPSJfd2s2dFFLaEdFZU8wSGFqM3o2bzNQUSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5tZW51LjAiPgorICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJtZW51Ok1lbnUiIHhtaTppZD0iX3hYSG1RS2hHRWVPMEhhajN6Nm8zUFEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ubWVudS4xIiBsYWJlbD0iJW1lbnUubGFiZWwuMSI+CisgICAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0ibWVudTpEaXJlY3RNZW51SXRlbSIgeG1pOmlkPSJfeTVkaXdLaEdFZU8wSGFqM3o2bzNQUSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5kaXJlY3RtZW51aXRlbS4wIiBsYWJlbD0iJWRpcmVjdG1lbnVpdGVtLmxhYmVsLjEiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVycy5IZWxsb1dvcmxkSGFuZGxlciIvPgorICAgICAgICA8Y2hpbGRyZW4geHNpOnR5cGU9Im1lbnU6SGFuZGxlZE1lbnVJdGVtIiB4bWk6aWQ9Il9nRDMwa0tKREVlU3FTcGFHTGVGTy1nIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmhhbmRsZWRtZW51aXRlbS4wIiBsYWJlbD0iJWhhbmRsZWRtZW51aXRlbS5sYWJlbC4xIiBjb21tYW5kPSJfWnMtajhLSkRFZVNxU3BhR0xlRk8tZyIvPgorICAgICAgPC9jaGlsZHJlbj4KKyAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0ibWVudTpNZW51IiB4bWk6aWQ9Il8tY0std0JxZkVlVzVjNm1raWl6bGRnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLm1lbnUucGVyc3BlY3RpdmVzIiBsYWJlbD0iUGVyc3BlY3RpdmVzIj4KKyAgICAgICAgPGNoaWxkcmVuIHhzaTp0eXBlPSJtZW51OkRpcmVjdE1lbnVJdGVtIiB4bWk6aWQ9Il9BSHZ2d0JxZ0VlVzVjNm1raWl6bGRnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmRpcmVjdG1lbnVpdGVtLnRvZ2dsZXBlcnNwZWN0aXZlcyIgbGFiZWw9IlRvZ2dsZSBQZXJzcGVjdGl2ZXMiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVycy5Td2l0Y2hQZXJzcGVjdGl2ZXMiLz4KKyAgICAgIDwvY2hpbGRyZW4+CisgICAgPC9tYWluTWVudT4KKyAgICA8c2hhcmVkRWxlbWVudHMgeHNpOnR5cGU9ImJhc2ljOlBhcnQiIHhtaTppZD0iX2hpeEtnQnFmRWVXNWM2bWtpaXpsZGciIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ucGFydC5hc2hhcmVkcGFydCIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzLlNoYXJlZFBhcnQiIGxhYmVsPSJBIHNoYXJlZCBwYXJ0Ii8+CisgICAgPHRyaW1CYXJzIHhtaTppZD0iX3N2Z0FBTmRiRWVPQUthQmhyekRnRWciIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UucmFwLmU0LmRlbW8udHJpbWJhci4wIj4KKyAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0ibWVudTpUb29sQmFyIiB4bWk6aWQ9Il91T25DVU5kYkVlT0FLYUJocnpEZ0VnIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnRvb2xiYXIuMCI+CisgICAgICAgIDxjaGlsZHJlbiB4c2k6dHlwZT0ibWVudTpEaXJlY3RUb29sSXRlbSIgeG1pOmlkPSJfd3FKUW9OZGJFZU9BS2FCaHJ6RGdFZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5kaXJlY3R0b29saXRlbS4wIiBsYWJlbD0iJWRpcmVjdG1lbnVpdGVtLmxhYmVsLjEiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVycy5IZWxsb1dvcmxkSGFuZGxlciIvPgorICAgICAgPC9jaGlsZHJlbj4KKyAgICA8L3RyaW1CYXJzPgorICA8L2NoaWxkcmVuPgorICA8aGFuZGxlcnMgeG1pOmlkPSJfYmJ3WjhLSkRFZVNxU3BhR0xlRk8tZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVyLjAiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVycy5IZWxsb1dvcmxkSGFuZGxlciIgY29tbWFuZD0iX1pzLWo4S0pERWVTcVNwYUdMZUZPLWciLz4KKyAgPHJvb3RDb250ZXh0IHhtaTppZD0iXy1qLXRrS0JORWVPREVzNy1iV3FJeEEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IiBuYW1lPSJJbiBEaWFsb2cgYW5kIFdpbmRvd3MiPgorICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tai10a2FCTkVlT0RFczctYldxSXhBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpbmRvdyIgbmFtZT0iSW4gV2luZG93cyIvPgorICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tai10a3FCTkVlT0RFczctYldxSXhBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLmRpYWxvZyIgbmFtZT0iSW4gRGlhbG9ncyIvPgorICA8L3Jvb3RDb250ZXh0PgorICA8Y29tbWFuZHMgeG1pOmlkPSJfWnMtajhLSkRFZVNxU3BhR0xlRk8tZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5jb21tYW5kLjAiIGNvbW1hbmROYW1lPSIlY29tbWFuZC5jb21tYW5kbmFtZS4xIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfLWotR2dxQk5FZU9ERXM3LWJXcUl4QSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLnNlcnZpY2UiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuQ29tbWFuZFNlcnZpY2VBZGRvbiIvPgorICA8YWRkb25zIHhtaTppZD0iXy1qLUdnNkJORWVPREVzNy1iV3FJeEEiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQudWkuY29udGV4dHMuc2VydmljZSIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzL29yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLkNvbnRleHRTZXJ2aWNlQWRkb24iLz4KKyAgPGFkZG9ucyB4bWk6aWQ9Il8tai1HaEtCTkVlT0RFczctYldxSXhBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLnNlcnZpY2UiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5CaW5kaW5nU2VydmljZUFkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfLWotR2hhQk5FZU9ERXM3LWJXcUl4QSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guY29tbWFuZHMubW9kZWwiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLmFkZG9ucy5Db21tYW5kUHJvY2Vzc2luZ0FkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfLWotR2hxQk5FZU9ERXM3LWJXcUl4QSIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guaGFuZGxlci5tb2RlbCIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9vcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guYWRkb25zLkhhbmRsZXJQcm9jZXNzaW5nQWRkb24iLz4KKyAgPGFkZG9ucyB4bWk6aWQ9Il8tai1HaDZCTkVlT0RFczctYldxSXhBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5jb250ZXh0cy5tb2RlbCIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC9vcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guYWRkb25zLkNvbnRleHRQcm9jZXNzaW5nQWRkb24iLz4KKyAgPGFkZG9ucyB4bWk6aWQ9Il8tai1HaUtCTkVlT0RFczctYldxSXhBIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5iaW5kaW5ncy5tb2RlbCIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC51dGlsLkJpbmRpbmdQcm9jZXNzaW5nQWRkb24iLz4KKzwvYXBwbGljYXRpb246QXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzBkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE4IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLU5hbWU6IERlbW8NCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtbw0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UucmFwLnJ3dDtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsDQorIG9yZy5lY2xpcHNlLnJhcC5lNDtidW5kbGUtdmVyc2lvbj0iMC45LjAiLA0KKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLA0KKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMsDQorIG9yZy5lY2xpcHNlLnJhcC5qZmFjZSwNCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcywNCisgb3JnLmVjbGlwc2UuZTQudWkuZGksDQorIG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLA0KKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjEuMS4wIiwNCisgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoDQorU2VydmljZS1Db21wb25lbnQ6IE9TR0ktSU5GL2NvbnRyaWJ1dGlvbi54bWwNCitJbXBvcnQtUGFja2FnZTogamF2YXguYW5ub3RhdGlvbjt2ZXJzaW9uPSIxLjIuMCIsDQorIGphdmF4LmluamVjdDt2ZXJzaW9uPSIxLjAuMCINCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9PU0dJLUlORi9jb250cmlidXRpb24ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vT1NHSS1JTkYvY29udHJpYnV0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODlmZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vT1NHSS1JTkYvY29udHJpYnV0aW9uLnhtbApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2NyOmNvbXBvbmVudCB4bWxuczpzY3I9Imh0dHA6Ly93d3cub3NnaS5vcmcveG1sbnMvc2NyL3YxLjEuMCIgbmFtZT0iQmFzaWNBcHBsaWNhdGlvbiI+CisgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLkJhc2ljQXBwbGljYXRpb24iLz4KKyAgIDxzZXJ2aWNlPgorICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5yYXAucnd0LmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbiIvPgorICAgPC9zZXJ2aWNlPgorPC9zY3I6Y29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0OGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAordHJpbW1lZHdpbmRvdy5sYWJlbC4xID0gUkFQIG9uIEVjbGlwc2UgNAorcGFydC5sYWJlbC4xID0gRXZlbnQgVGVzdHMKK3BhcnQubGFiZWwuMiA9IFByZWZlcmVuY2UgVGVzdAorcGFydC5sYWJlbC4zID0gTkxTIFRlc3QKK21lbnUubGFiZWwuMSA9IEZpbGUKK2RpcmVjdG1lbnVpdGVtLmxhYmVsLjEgPSBIZWxsbyBXb3JsZAorCitOTFNTYW1wbGVQYXJ0X2N1cnJlbnRMYW5nTGFiZWwgPSBDdXJyZW50IExhbmd1YWdlOgorTkxTU2FtcGxlUGFydF91cGRhdGVMYW5nTGFiZWwgPSBOZXcgbGFuZ3VhZ2U6CitOTFNTYW1wbGVQYXJ0X3VwZGF0ZUxhbmdCdXR0b24gPSBBcHBseQorCitkaXJlY3R0b29saXRlbS5sYWJlbC4xID0gVEItSXRlbQorZGlyZWN0bWVudWl0ZW0ubGFiZWwuMiA9IEhlbGxvIFdvcmxkCitkaXJlY3RtZW51aXRlbS5sYWJlbC4zID0gSGVsbG8gZXh0cmEKK2RpcmVjdHRvb2xpdGVtLmxhYmVsLjIgPSBIZWxsbyBXb3JsZAoraGFuZGxlZG1lbnVpdGVtLmxhYmVsLjEgPSBIZWxsbyBXb3JsZCBDb21tYW5kCitjb21tYW5kLmNvbW1hbmRuYW1lLjEgPSBIZWxsbyBXb3JsZCBDb21tYW5kCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9PU0dJLUlORi9sMTBuL2J1bmRsZV9kZS5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vT1NHSS1JTkYvbDEwbi9idW5kbGVfZGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzI5ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vT1NHSS1JTkYvbDEwbi9idW5kbGVfZGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE3IEBACit0cmltbWVkd2luZG93LmxhYmVsLjEgPSBSQVAgYXVmIEVjbGlwc2UgNAorcGFydC5sYWJlbC4xID0gRXJlaWduaXMgVGVzdHMKK3BhcnQubGFiZWwuMiA9IFBy5GZlcmVuemVuIFRlc3QKK3BhcnQubGFiZWwuMyA9INxiZXJzZXR6dW5ncyBUZXN0CittZW51LmxhYmVsLjEgPSBEYXRlaQorZGlyZWN0bWVudWl0ZW0ubGFiZWwuMSA9IEhhbGxvIFdlbHQKKworTkxTU2FtcGxlUGFydF9jdXJyZW50TGFuZ0xhYmVsID0gQWt0dWVsbGUgU3ByYWNoZToKK05MU1NhbXBsZVBhcnRfdXBkYXRlTGFuZ0xhYmVsID0gTmV1ZSBTcHJhY2hlOgorTkxTU2FtcGxlUGFydF91cGRhdGVMYW5nQnV0dG9uID0gQW53ZW5kZW4KKworZGlyZWN0dG9vbGl0ZW0ubGFiZWwuMSA9IFRCLUVsZW1lbnQKK2RpcmVjdG1lbnVpdGVtLmxhYmVsLjIgPSBIYWxsbyBXZWx0CitkaXJlY3RtZW51aXRlbS5sYWJlbC4zID0gSGFsbG8gRXh0cmEKK2RpcmVjdHRvb2xpdGVtLmxhYmVsLjIgPSBIYWxsbyBXZWx0CitoYW5kbGVkbWVudWl0ZW0ubGFiZWwuMSA9IEhhbGxvIFdlbHQgS29tbWFuZG8KK2NvbW1hbmQuY29tbWFuZG5hbWUuMSA9IEhhbGxvIFdlbHQgS29tbWFuZG8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL09TR0ktSU5GL2wxMG4vYnVuZGxlX2VuLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9PU0dJLUlORi9sMTBuL2J1bmRsZV9lbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzIzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9PU0dJLUlORi9sMTBuL2J1bmRsZV9lbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTAgQEAKK3RyaW1tZWR3aW5kb3cubGFiZWwuMSA9IFJBUCBvbiBFY2xpcHNlIDQKK3BhcnQubGFiZWwuMSA9IEV2ZW50IFRlc3RzCitwYXJ0LmxhYmVsLjIgPSBQcmVmZXJlbmNlIFRlc3QKK3BhcnQubGFiZWwuMyA9IE5MUyBUZXN0CittZW51LmxhYmVsLjEgPSBGaWxlCitkaXJlY3RtZW51aXRlbS5sYWJlbC4xID0gSGVsbG8gV29ybGQKKworTkxTU2FtcGxlUGFydF9jdXJyZW50TGFuZ0xhYmVsID0gQ3VycmVudCBMYW5ndWFnZToKK05MU1NhbXBsZVBhcnRfdXBkYXRlTGFuZ0xhYmVsID0gTmV3IGxhbmd1YWdlOgorTkxTU2FtcGxlUGFydF91cGRhdGVMYW5nQnV0dG9uID0gQXBwbHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKK3NvdXJjZS4uID0gc3JjLw0KK291dHB1dC4uID0gYmluLw0KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQorICAgICAgICAgICAgICAgT1NHSS1JTkYvLFwNCisgICAgICAgICAgICAgICAuXA0KKyAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uLmU0eG1pDQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vZGV2X29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmxhdW5jaCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL2Rldl9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5OWYzYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL2Rldl9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5sYXVuY2gKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5yYXAudWkubGF1bmNoLlJBUExhdW5jaGVyIj4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJ0cnVlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvZGV2X29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9InRydWUiLz4KKzxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFUVFJfVVNFX1NUQVJUX09OX0ZJUlNUX1RIUkVBRCIgdmFsdWU9InRydWUiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0phdmFTRS0xLjciLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0gLWNvbnNvbGUgLWNvbnNvbGVsb2ciLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTV9BUkdVTUVOVFMiIHZhbHVlPSItRGVjbGlwc2UuaWdub3JlQXBwPXRydWUgLURvc2dpLm5vU2h1dGRvd249dHJ1ZSAtRG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eS5sb2cuc3RkZXJyLnRocmVzaG9sZD1pbmZvIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UucmFwLmxhdW5jaC5icm93c2VyTW9kZSIgdmFsdWU9IkVYVEVSTkFMIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UucmFwLmxhdW5jaC5jb250ZXh0cGF0aCIgdmFsdWU9Ii8iLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLmRhdGFMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnJhcC50b29scy5sYXVuY2gvZGV2X29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2guZGV2ZWxvcG1lbnRNb2RlIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLm9wZW5Ccm93c2VyIiB2YWx1ZT0idHJ1ZSIvPgorPGludEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2gucG9ydCIgdmFsdWU9IjEwMDgwIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UucmFwLmxhdW5jaC5zZXJ2bGV0UGF0aCIgdmFsdWU9Ii9oZWxsbyIvPgorPGludEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2guc2Vzc2lvblRpbWVvdXQiIHZhbHVlPSIwIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2gudGVybWluYXRlUHJldmlvdXMiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2gudXNlRGVmYXVsdERhdGFMb2NhdGlvbiIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UucmFwLmxhdW5jaC51c2VNYW51YWxDb250ZXh0UGF0aCIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2gudXNlTWFudWFsUG9ydCIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2gudXNlU2Vzc2lvblRpbWVvdXQiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0idGFyZ2V0X2J1bmRsZXMiIHZhbHVlPSJjb20uaWJtLmljdUBkZWZhdWx0OmRlZmF1bHQsamF2YXguYW5ub3RhdGlvbkBkZWZhdWx0OmRlZmF1bHQsamF2YXguaW5qZWN0QGRlZmF1bHQ6ZGVmYXVsdCxqYXZheC5zZXJ2bGV0QGRlZmF1bHQ6ZGVmYXVsdCxqYXZheC54bWxAZGVmYXVsdDpkZWZhdWx0LG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGhAZGVmYXVsdDpkZWZhdWx0LG9yZy5hcGFjaGUuZmVsaXguZ29nby5jb21tYW5kQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLmZlbGl4LmdvZ28ucnVudGltZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmFwYWNoZS5mZWxpeC5nb2dvLnNoZWxsQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLm9ic2VydmFibGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcucHJvcGVydHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LmNvcmUuZGlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LmVtZi54cGF0aEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkuZGlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLndvcmtiZW5jaEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5lY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQDI6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbnNvbGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZHNAMTp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guZXZlbnRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gudXRpbEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkuY29udGludWF0aW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5qZXR0eS5odHRwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5qZXR0eS5pb0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkuc2VjdXJpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkudXRpbEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaUAtMTp0cnVlLG9yZy5lY2xpcHNlLnJhcC5qZmFjZS5kYXRhYmluZGluZ0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UucmFwLmpmYWNlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5yYXAucnd0Lm9zZ2lAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnJhcC5yd3RAZGVmYXVsdDpkZWZhdWx0Ii8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VDdXN0b21GZWF0dXJlcyIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3NAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5hZGRvbnMuc3d0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5yYXAuZTQuZGVtb0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UucmFwLmU0QGRlZmF1bHQ6ZGVmYXVsdCIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZGlzay5wbmcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy9kaXNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ1MzJlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZGlzay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZG9vcl9pbi5wbmcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy9kb29yX2luLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTY3NmEwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZG9vcl9pbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZm9sZGVyX3VzZXIucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvZm9sZGVyX3VzZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjFjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy9mb2xkZXJfdXNlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvcmVwb3J0X3VzZXIucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvcmVwb3J0X3VzZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjZlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy9yZXBvcnRfdXNlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvdXNlcl9hZGQucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvdXNlcl9hZGQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWU5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy91c2VyX2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvdXNlcl9kZWxldGUucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vaWNvbnMvdXNlcl9kZWxldGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmI1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9pY29ucy91c2VyX2RlbGV0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ubGF1bmNoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8ubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2Q1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5sYXVuY2gKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5yYXAudWkubGF1bmNoLlJBUExhdW5jaGVyIj4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJ0cnVlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0idHJ1ZSIvPgorPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQVRUUl9VU0VfU1RBUlRfT05fRklSU1RfVEhSRUFEIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSmF2YVNFLTEuOCIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3MgJHt0YXJnZXQub3N9IC13cyAke3RhcmdldC53c30gLWFyY2ggJHt0YXJnZXQuYXJjaH0gLW5sICR7dGFyZ2V0Lm5sfSAtY29uc29sZSAtY29uc29sZWxvZyIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1EZWNsaXBzZS5pZ25vcmVBcHA9dHJ1ZSAtRG9zZ2kubm9TaHV0ZG93bj10cnVlIC1Eb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5LmxvZy5zdGRlcnIudGhyZXNob2xkPWluZm8iLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLmJyb3dzZXJNb2RlIiB2YWx1ZT0iRVhURVJOQUwiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLmNvbnRleHRwYXRoIiB2YWx1ZT0iLyIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2guZGF0YUxvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucmFwLnRvb2xzLmxhdW5jaC9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtbyIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLmRldmVsb3BtZW50TW9kZSIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UucmFwLmxhdW5jaC5vcGVuQnJvd3NlciIgdmFsdWU9InRydWUiLz4KKzxpbnRBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLnBvcnQiIHZhbHVlPSIxMDA4MCIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2guc2VydmxldFBhdGgiIHZhbHVlPSIvaGVsbG8iLz4KKzxpbnRBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLnNlc3Npb25UaW1lb3V0IiB2YWx1ZT0iMCIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLnRlcm1pbmF0ZVByZXZpb3VzIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLnVzZURlZmF1bHREYXRhTG9jYXRpb24iIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnJhcC5sYXVuY2gudXNlTWFudWFsQ29udGV4dFBhdGgiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLnVzZU1hbnVhbFBvcnQiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5yYXAubGF1bmNoLnVzZVNlc3Npb25UaW1lb3V0IiB2YWx1ZT0iZmFsc2UiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0iY29tLmlibS5pY3VAZGVmYXVsdDpkZWZhdWx0LGphdmF4LmFubm90YXRpb25AZGVmYXVsdDpkZWZhdWx0LGphdmF4LmluamVjdEBkZWZhdWx0OmRlZmF1bHQsamF2YXguc2VydmxldEBkZWZhdWx0OmRlZmF1bHQsamF2YXgueG1sQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLmZlbGl4LmdvZ28uY29tbWFuZEBkZWZhdWx0OmRlZmF1bHQsb3JnLmFwYWNoZS5mZWxpeC5nb2dvLnJ1bnRpbWVAZGVmYXVsdDpkZWZhdWx0LG9yZy5hcGFjaGUuZmVsaXguZ29nby5zaGVsbEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLnByb3BlcnR5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZUBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZTQuY29yZS5jb21tYW5kc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0c0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9uc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC5jb3JlLmRpQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC5lbWYueHBhdGhAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC51aS5kaUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC51aS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3RAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2hAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVtZi5lY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQDI6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbnNvbGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZHNAMTp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guZXZlbnRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gudXRpbEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkuY29udGludWF0aW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5qZXR0eS5odHRwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5qZXR0eS5pb0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkuc2VjdXJpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuamV0dHkudXRpbEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaUAtMTp0cnVlLG9yZy5lY2xpcHNlLnJhcC5lNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UucmFwLmpmYWNlLmRhdGFiaW5kaW5nQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5yYXAuamZhY2VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnJhcC5yd3Qub3NnaUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UucmFwLnJ3dEBkZWZhdWx0OmRlZmF1bHQiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZUN1c3RvbUZlYXR1cmVzIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5yYXAuZTQuZGVtbyIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL0Jhc2ljQXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9CYXNpY0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhYjQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9CYXNpY0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtbzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAuZTQuRTRBcHBsaWNhdGlvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAuZTQuRTRFbnRyeVBvaW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAucnd0LmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3QuYXBwbGljYXRpb24uQXBwbGljYXRpb25Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnJhcC5yd3QuYXBwbGljYXRpb24uQXBwbGljYXRpb24uT3BlcmF0aW9uTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5yYXAucnd0LmNsaWVudC5XZWJDbGllbnQ7CisKKworcHVibGljIGNsYXNzIEJhc2ljQXBwbGljYXRpb24gaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24geworCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChXZWJDbGllbnQuUEFHRV9USVRMRSwgIkhlbGxvIGU0IFJBUCIpOworICAgICAgICBhcHBsaWNhdGlvbi5hZGRFbnRyeVBvaW50KCIvaGVsbG8iLCBuZXcgRTRFbnRyeVBvaW50RmFjdG9yeSgKKyAgICAgICAgCQlFNEFwcGxpY2F0aW9uQ29uZmlnLmNyZWF0ZSgKKyAgICAgICAgCQkJCSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL0FwcGxpY2F0aW9uLmU0eG1pIiwKKyAgICAgICAgCQkJCSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLmxpZmVjeWNsZS5Mb2dpbkxpZmNlY3ljbGUiCisgICAgICAgIAkJCSkKKyAgICAgICAgCQkpLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgYXBwbGljYXRpb24uc2V0T3BlcmF0aW9uTW9kZSggT3BlcmF0aW9uTW9kZS5TV1RfQ09NUEFUSUJJTElUWSApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL2hhbmRsZXJzL0hlbGxvV29ybGRIYW5kbGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vaGFuZGxlcnMvSGVsbG9Xb3JsZEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjZlY2UxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL2hhbmRsZXJzL0hlbGxvV29ybGRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkSGFuZGxlciB7CisJQEV4ZWN1dGUKKwlwdWJsaWMgdm9pZCBoZWxsbyhTaGVsbCBzKSB7CisJCU1lc3NhZ2VCb3ggYiA9IG5ldyBNZXNzYWdlQm94KHMsU1dULklDT05fSU5GT1JNQVRJT04pOworCQliLnNldFRleHQoIkhlbGxvIGU0Iik7CisJCWIuc2V0TWVzc2FnZSgiZTQgYW5kIFJBUCBhcmUgYSBwZXJmZWN0IG1hdGNoISEiKTsKKwkJYi5vcGVuKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL2hhbmRsZXJzL1N3aXRjaFBlcnNwZWN0aXZlcy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL2hhbmRsZXJzL1N3aXRjaFBlcnNwZWN0aXZlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vaGFuZGxlcnMvU3dpdGNoUGVyc3BlY3RpdmVzLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5oYW5kbGVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLm1vZGVsaW5nLkVQYXJ0U2VydmljZTsKKworcHVibGljIGNsYXNzIFN3aXRjaFBlcnNwZWN0aXZlcyB7CisJQEV4ZWN1dGUKKwl2b2lkIHN3aXRjaFBlcnNwZWN0aXZlKEVQYXJ0U2VydmljZSBwYXJ0U2VydmljZSwgTVBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlKSB7CisJCWlmKCBwZXJzcGVjdGl2ZS5nZXRFbGVtZW50SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBlcnNwZWN0aXZlLjAiKSApIHsKKwkJCXBhcnRTZXJ2aWNlLnN3aXRjaFBlcnNwZWN0aXZlKChNUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlLmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuZ2V0KDEpKTsKKwkJfSBlbHNlIHsKKwkJCXBhcnRTZXJ2aWNlLnN3aXRjaFBlcnNwZWN0aXZlKChNUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlLmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuZ2V0KDApKTsKKwkJfQkJCisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL2xpZmVjeWNsZS9Mb2dpbkxpZmNlY3ljbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9saWZlY3ljbGUvTG9naW5MaWZjZWN5Y2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhM2NiYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9saWZlY3ljbGUvTG9naW5MaWZjZWN5Y2xlLmphdmEKQEAgLTAsMCArMSw5MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5saWZlY3ljbGUuUG9zdENvbnRleHRDcmVhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBMb2dpbkxpZmNlY3ljbGUgeworCUBQb3N0Q29udGV4dENyZWF0ZQorCWJvb2xlYW4gbG9naW4oRGlzcGxheSBkKSB7CisJCWZpbmFsIEF0b21pY0Jvb2xlYW4gcnYgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisJCWZpbmFsIFNoZWxsIHMgPSBuZXcgU2hlbGwoZCk7CisJCXMuc2V0VGV4dCgiTG9naW4iKTsKKwkJcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKKwkJCisJCXsKKwkJCUxhYmVsIGwgPSBuZXcgTGFiZWwocywgU1dULk5PTkUpOworCQkJbC5zZXRUZXh0KCJVc2VybmFtZSIpOworCQkJCisJCQlUZXh0IHQgPSBuZXcgVGV4dChzLCBTV1QuQk9SREVSKTsKKwkJCXQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCX0KKwkJCisJCXsKKwkJCUxhYmVsIGwgPSBuZXcgTGFiZWwocywgU1dULk5PTkUpOworCQkJbC5zZXRUZXh0KCJQYXNzd29yZCIpOworCQkJCisJCQlUZXh0IHQgPSBuZXcgVGV4dChzLCBTV1QuQk9SREVSKTsKKwkJCXQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCX0KKwkJCisJCXsKKwkJCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHMsIFNXVC5OT05FKTsKKwkJCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOworCQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5UUkFJTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7CisKKwkJCXsKKwkJCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCQkJYi5zZXRUZXh0KCJBYm9ydCIpOworCQkJCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQlydi5zZXQoZmFsc2UpOworCQkJCQkJcy5kaXNwb3NlKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKworCQkJeworCQkJCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJCQliLnNldFRleHQoIkxvZ2luIik7CisJCQkJYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCXJ2LnNldCh0cnVlKTsKKwkJCQkJCXMuZGlzcG9zZSgpOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCX0KKwkJcy5wYWNrKCk7CisJCXMuc2V0U2l6ZSgzMDAsIHMuZ2V0U2l6ZSgpLnkgKyAxMCk7CisJCVJlY3RhbmdsZSBib3VuZHMgPSBkLmdldFByaW1hcnlNb25pdG9yKCkuZ2V0Qm91bmRzKCk7CisJCQorCQlQb2ludCBzaXplID0gcy5nZXRTaXplKCk7CisJCXMuc2V0TG9jYXRpb24oYm91bmRzLndpZHRoIC8gMiAtIHNpemUueCAvIDIsIGJvdW5kcy5oZWlnaHQgLyAyIC0gc2l6ZS55IC8gMik7CisJCQorCQlzLm9wZW4oKTsKKwkJd2hpbGUoICFzLmlzRGlzcG9zZWQoKSAmJiAhIGQuaXNEaXNwb3NlZCgpICkgeworCQkJaWYoICEgZC5yZWFkQW5kRGlzcGF0Y2goKSApIHsKKwkJCQlkLnNsZWVwKCk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBydi5nZXQoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL0V2ZW50U2FtcGxlUGFydC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL0V2ZW50U2FtcGxlUGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjEwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vcGFydHMvRXZlbnRTYW1wbGVQYXJ0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0czsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMuRXZlbnRUb3BpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkuZGkuVUlFdmVudFRvcGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLmRpLlVJU3luY2hyb25pemU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBFdmVudFNhbXBsZVBhcnQgeworCUBJbmplY3QKKwlJRXZlbnRCcm9rZXIgYnJva2VyOworCQorCUBJbmplY3QKKwlVSVN5bmNocm9uaXplIHVpU3luYzsKKwkKKwlwcml2YXRlIExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsKKwkKKwlAUG9zdENvbnN0cnVjdAorCXZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisKKwkJbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCk7CisJCWxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoCisJCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQkKKwkJY3JlYXRlU2VuZEdyb3VwKHBhcmVudCwgIkV2ZW50VG9waWMiKTsKKwkJY3JlYXRlU2VuZEdyb3VwKHBhcmVudCwgIlVJRXZlbnRUb3BpYyIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVTZW5kR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgU3RyaW5nIHRvcGljVHlwZSkgeworCQlHcm91cCBnID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOworCQlnLnNldFRleHQoIkAiICsgdG9waWNUeXBlKTsKKwkJZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOworCQlnLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQkKKwkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGcsIFNXVC5QVVNIKTsKKwkJYi5zZXRUZXh0KCJTeW5jIHNlbmRpbmciKTsKKwkJYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWJyb2tlci5zZW5kKCJyYXBlNC8iICsgdG9waWNUeXBlLCAiQCIrdG9waWNUeXBlKyIgLSBFdmVudCBhdCAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQkJfQorCQl9KTsKKwkJYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJCisJCWIgPSBuZXcgQnV0dG9uKGcsIFNXVC5QVVNIKTsKKwkJYi5zZXRUZXh0KCJBc3luYyBzZW5kaW5nIik7CisJCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlicm9rZXIucG9zdCgicmFwZTQvIiArIHRvcGljVHlwZSwgIkAiK3RvcGljVHlwZSsiIC0gRXZlbnQgYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJCX0KKwkJfSk7CisJCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJfQorCQorCUBJbmplY3QKKwlAT3B0aW9uYWwKKwl2b2lkIHJlY2VpdmVFdmVudChARXZlbnRUb3BpYygicmFwZTQvRXZlbnRUb3BpYyIpIGZpbmFsIFN0cmluZyBldmVudERhdGEpIHsKKwkJaWYoIGxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpICkgeworCQkJbGlzdFZpZXdlci5hZGQoZXZlbnREYXRhKTsKKwkJfSBlbHNlIHsKKwkJCXVpU3luYy5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlsaXN0Vmlld2VyLmFkZChldmVudERhdGEpOyAKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKwkKKwlASW5qZWN0CisJQE9wdGlvbmFsCisJdm9pZCByZWNlaXZlVUlFdmVudChAVUlFdmVudFRvcGljKCJyYXBlNC9VSUV2ZW50VG9waWMiKSBmaW5hbCBTdHJpbmcgZXZlbnREYXRhKSB7CisJCWxpc3RWaWV3ZXIuYWRkKGV2ZW50RGF0YSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL05MU01lc3NhZ2VzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vcGFydHMvTkxTTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmNjNzIwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL05MU01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMubmxzLk1lc3NhZ2U7CisKK0BNZXNzYWdlCitwdWJsaWMgY2xhc3MgTkxTTWVzc2FnZXMgeworCXB1YmxpYyBTdHJpbmcgTkxTU2FtcGxlUGFydF9jdXJyZW50TGFuZ0xhYmVsOworCXB1YmxpYyBTdHJpbmcgTkxTU2FtcGxlUGFydF91cGRhdGVMYW5nTGFiZWw7CisJcHVibGljIFN0cmluZyBOTFNTYW1wbGVQYXJ0X3VwZGF0ZUxhbmdCdXR0b247Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vcGFydHMvTkxTU2FtcGxlUGFydC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL05MU1NhbXBsZVBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk2YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL05MU1NhbXBsZVBhcnQuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ubHMuSUxvY2FsZUNoYW5nZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ubHMuVHJhbnNsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy50cmFuc2xhdGlvbi5UcmFuc2xhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBOTFNTYW1wbGVQYXJ0IHsKKwlwcml2YXRlIExhYmVsIGN1cnJlbnRMYW5nTGFiZWw7CisJcHJpdmF0ZSBMYWJlbCBjdXJyZW50TGFuZ1ZhbHVlOworCXByaXZhdGUgTGFiZWwgdXBkYXRlTGFuZ0xhYmVsOworCXByaXZhdGUgVGV4dCB1cGRhdGVMYW5nVmFsdWU7CisJcHJpdmF0ZSBCdXR0b24gdXBkYXRlTGFuZ0J1dHRvbjsKKwkKKwlASW5qZWN0CisJSUxvY2FsZUNoYW5nZVNlcnZpY2UgbG9jYWxlU2VydmljZTsKKworCUBJbmplY3QKKwlwdWJsaWMgTkxTU2FtcGxlUGFydChDb21wb3NpdGUgcGFyZW50KSB7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKKwkJCisJCWN1cnJlbnRMYW5nTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWN1cnJlbnRMYW5nVmFsdWUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWN1cnJlbnRMYW5nVmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSwyLDEpKTsKKwkJCisJCXVwZGF0ZUxhbmdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJdXBkYXRlTGFuZ1ZhbHVlID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKKwkJdXBkYXRlTGFuZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7CisJCXVwZGF0ZUxhbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlsb2NhbGVTZXJ2aWNlLmNoYW5nZUFwcGxpY2F0aW9uTG9jYWxlKHVwZGF0ZUxhbmdWYWx1ZS5nZXRUZXh0KCkpOworCQkJfQorCQl9KTsKKwl9CisJCisJQEluamVjdAorCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VzKEBUcmFuc2xhdGlvbiBOTFNNZXNzYWdlcyBtZXNzYWdlcywgQE5hbWVkKFRyYW5zbGF0aW9uU2VydmljZS5MT0NBTEUpIExvY2FsZSBsb2NhbGUpIHsKKwkJY3VycmVudExhbmdMYWJlbC5zZXRUZXh0KG1lc3NhZ2VzLk5MU1NhbXBsZVBhcnRfY3VycmVudExhbmdMYWJlbCk7CisJCWN1cnJlbnRMYW5nVmFsdWUuc2V0VGV4dChsb2NhbGUudG9TdHJpbmcoKSk7CisJCQorCQl1cGRhdGVMYW5nTGFiZWwuc2V0VGV4dChtZXNzYWdlcy5OTFNTYW1wbGVQYXJ0X3VwZGF0ZUxhbmdMYWJlbCk7CisJCXVwZGF0ZUxhbmdWYWx1ZS5zZXRUZXh0KGxvY2FsZS50b1N0cmluZygpKTsKKwkJdXBkYXRlTGFuZ0J1dHRvbi5zZXRUZXh0KG1lc3NhZ2VzLk5MU1NhbXBsZVBhcnRfdXBkYXRlTGFuZ0J1dHRvbik7CisJCQorCQljdXJyZW50TGFuZ0xhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vcGFydHMvUHJlZmVyZW5jZVNhbXBsZVBhcnQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9wYXJ0cy9QcmVmZXJlbmNlU2FtcGxlUGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDA4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5yYXAuZTQuZGVtby9zcmMvb3JnL2VjbGlwc2UvcmFwL2U0L2RlbW8vcGFydHMvUHJlZmVyZW5jZVNhbXBsZVBhcnQuamF2YQpAQCAtMCwwICsxLDkxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnJhcC5lNC5kZW1vLnBhcnRzOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLlByZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UucmFwLmU0LnByZWZlcmVuY2VzLkVQcmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsgInJlc3RyaWN0aW9uIiwgInNlcmlhbCIgfSkKK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlU2FtcGxlUGFydCB7CisKKwlwcml2YXRlIExhYmVsIGNvbG9yTGFiZWw7CisJcHJpdmF0ZSBDb2xvciBjdXJyZW50Q29sb3I7CisKKwlAT3B0aW9uYWwKKwlASW5qZWN0CisJQFByZWZlcmVuY2UKKwlFUHJlZmVyZW5jZSBwcmVmczsKKworCUBJbmplY3QKKwlwdWJsaWMgUHJlZmVyZW5jZVNhbXBsZVBhcnQoQ29tcG9zaXRlIHBhcmVudCkgeworCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CisKKwkJTGFiZWwgbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWwxLnNldFRleHQoIkN1cnJlbnQgVmFsdWU6Iik7CisKKwkJY29sb3JMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJY29sb3JMYWJlbC5zZXRUZXh0KCItIik7CisKKwkJTGFiZWwgbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWwyLnNldFRleHQoIkNvbG9yOiIpOworCisJCWZpbmFsIFRleHQgdCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7CisJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCXByZWZzLnNldFN0cmluZygiY29sb3JQcmVmIiwgdC5nZXRUZXh0KCkpOworCQkJfQorCQl9OworCQl0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBsaXN0ZW5lcik7CisJCXQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBsaXN0ZW5lcik7CisJCXQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJfQorCisJQEluamVjdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVByZWZlcmVuY2UoQE9wdGlvbmFsIEBQcmVmZXJlbmNlKCJjb2xvclByZWYiKSBTdHJpbmcgdikgeworCQlpZiAodiA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJY29sb3JMYWJlbC5zZXRUZXh0KHYpOworCQlSR0IgcmdiID0gdG9SR0Iodik7CisJCUNvbG9yIGMgPSByZ2IgIT0gbnVsbCA/IG5ldyBDb2xvcihjb2xvckxhYmVsLmdldERpc3BsYXkoKSwgcmdiKSA6IG51bGw7CisJCWNvbG9yTGFiZWwuc2V0QmFja2dyb3VuZChjKTsKKwkJaWYgKGN1cnJlbnRDb2xvciAhPSBudWxsKSB7CisJCQljdXJyZW50Q29sb3IuZGlzcG9zZSgpOworCQl9CisJCWN1cnJlbnRDb2xvciA9IGM7CisKKwkJY29sb3JMYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUkdCIHRvUkdCKFN0cmluZyBoZXhjb2xvcikgeworCQl0cnkgeworCQkJaWYgKGhleGNvbG9yLmxlbmd0aCgpID09IDMpIHsKKwkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQoaGV4Y29sb3Iuc3Vic3RyaW5nKDAsIDEpLCAxNikgKiAxNzsKKwkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQoaGV4Y29sb3Iuc3Vic3RyaW5nKDEsIDIpLCAxNikgKiAxNzsKKwkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQoaGV4Y29sb3Iuc3Vic3RyaW5nKDIsIDMpLCAxNikgKiAxNzsKKwkJCQlyZXR1cm4gbmV3IFJHQihyLCBnLCBiKTsKKwkJCX0KKwkJCWlmIChoZXhjb2xvci5sZW5ndGgoKSA9PSA2KSB7CisJCQkJaW50IHIgPSBJbnRlZ2VyLnBhcnNlSW50KGhleGNvbG9yLnN1YnN0cmluZygwLCAyKSwgMTYpOworCQkJCWludCBnID0gSW50ZWdlci5wYXJzZUludChoZXhjb2xvci5zdWJzdHJpbmcoMiwgNCksIDE2KTsKKwkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQoaGV4Y29sb3Iuc3Vic3RyaW5nKDQsIDYpLCAxNik7CisJCQkJcmV0dXJuIG5ldyBSR0IociwgZywgYik7CisJCQl9CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkvLyByZXR1cm4gZmFsbCBiYWNrCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL1NoYXJlZFBhcnQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9wYXJ0cy9TaGFyZWRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNzc1OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9wYXJ0cy9TaGFyZWRQYXJ0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0czsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBTaGFyZWRQYXJ0IHsKKwlAUG9zdENvbnN0cnVjdAorCXZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKKwkJbGFiZWwuc2V0VGV4dCgiQSBzYW1wbGUiKTsKKwkJCisJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5MRUFEIHwgU1dULkJPUkRFUik7CisJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2UucmFwLmU0LmRlbW8vc3JjL29yZy9lY2xpcHNlL3JhcC9lNC9kZW1vL3BhcnRzL1NpbXBsZVRlc3QuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9wYXJ0cy9TaW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5NDlhZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnJhcC5lNC5kZW1vL3NyYy9vcmcvZWNsaXBzZS9yYXAvZTQvZGVtby9wYXJ0cy9TaW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5yYXAuZTQuZGVtby5wYXJ0czsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworcHVibGljIGNsYXNzIFNpbXBsZVRlc3QgeworCUBQb3N0Q29uc3RydWN0CisJdm9pZCBpbml0KE1QYXJ0IHBhcnQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKKwkJTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsU1dULk5PTkUpOworCQlsLnNldFRleHQocGFydC5nZXRMYWJlbCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThmYmViCi0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZS8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjkzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJhcC5lNC5iYXNlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODMzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMzkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlIgorICAgICAgbGFiZWw9IkZlYXR1cmUiCisgICAgICB2ZXJzaW9uPSIwLjkuMC5xdWFsaWZpZXIiPgorCisgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KKyAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KKyAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgorICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2xpY2Vuc2U+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorICAgICAgICAgCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkuc2VydmljZXMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAuamZhY2UuZGF0YWJpbmRpbmciCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAuamZhY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAucnd0Lm9zZ2kiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAucnd0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkuZGkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJjb20uaWJtLmljdSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9ImphdmF4LmFubm90YXRpb24iCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJqYXZheC5pbmplY3QiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJqYXZheC5zZXJ2bGV0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0iamF2YXgueG1sIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmFwYWNoZS5mZWxpeC5nb2dvLmNvbW1hbmQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmZlbGl4LmdvZ28ucnVudGltZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuZmVsaXguZ29nby5zaGVsbCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5wcm9wZXJ0eSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmciCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29uc29sZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmV2ZW50IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gudXRpbCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNvbnRpbnVhdGlvbiIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpldHR5Lmh0dHAiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5pbyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlY3VyaXR5IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmVyIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmxldCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnV0aWwiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKyAgICAgICAgIAorCTxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5lbWYueHBhdGgiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKwk8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKyAgICAgICAgIAorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZS9wb20ueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTgzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQuYmFzZS5mZWF0dXJlL3BvbS54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucmFwLmU0LmJhc2UuZmVhdHVyZTwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+ZWNsaXBzZS1mZWF0dXJlPC9wYWNrYWdpbmc+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5yYXAuZTQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucmFwLmU0LmJhc2UtcmVsZW5nPC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcmVsZW5nL3JlbGVuZy1iYXNlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQuZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFlZGQzCi0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC5mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQuZmVhdHVyZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmOTNhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK2Jpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQudGFyZ2V0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQudGFyZ2V0LmZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxY2VkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDM1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICAgICBpZD0ib3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC5mZWF0dXJlIgorICAgICAgbGFiZWw9IkZlYXR1cmUiCisgICAgICB2ZXJzaW9uPSIwLjkuMC5xdWFsaWZpZXIiPgorCisgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KKyAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KKyAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgorICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2xpY2Vuc2U+CisKKyAgIDxyZXF1aXJlcz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucmFwLmVxdWlub3gudGFyZ2V0LmZlYXR1cmUiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgorICAgPC9yZXF1aXJlcz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucy5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuY29yZS5kaS5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmFubm90YXRpb25zIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucy5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS5zZXJ2aWNlcyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmRpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkuZGkuc291cmNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0iamF2YXguYW5ub3RhdGlvbiIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9ImphdmF4LmFubm90YXRpb24uc291cmNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0iamF2YXguaW5qZWN0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0iamF2YXguaW5qZWN0LnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLndvcmtiZW5jaCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLndvcmtiZW5jaC5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZS5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc291cmNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkuYmluZGluZ3Muc291cmNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2giCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc291cmNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3QiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAuZTQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yYXAuZTQuc291cmNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuZW1mLnhwYXRoIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQuZW1mLnhwYXRoLnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC5mZWF0dXJlL3BvbS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yYXAuZTQudGFyZ2V0LmZlYXR1cmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZhOWVkCi0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC5mZWF0dXJlL3BvbS54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5lY2xpcHNlLnJhcC5lNDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucmFwLmU0LnRhcmdldC5mZWF0dXJlPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPmVjbGlwc2UtZmVhdHVyZTwvcGFja2FnaW5nPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UucmFwLmU0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnJhcC5lNC50YXJnZXQtcmVsZW5nPC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcmVsZW5nL3JlbGVuZy10YXJnZXQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworPC9wcm9qZWN0Pgo=