ZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU3Y2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyOWNjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyMGU1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBcHIgMTYgMTc6NTY6MDUgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmZjVjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gSnVuIDAzIDAxOjE5OjQ5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2NmQ1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jU3VuIEFwciAxNiAxNzo1NTowMiBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQ3ZDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMy4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWVlYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGIzN2Q4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Ij4KLSAgPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2ltYWdlcy9qYXZhLWZhY2V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvaW1hZ2VzL2phdmEtZmFjZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2NiNGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvaW1hZ2VzL2phdmEtZmFjZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9pbWFnZXMvc3RhbmRhcmQtanJlLWNvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2ltYWdlcy9zdGFuZGFyZC1qcmUtY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NWUzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2ltYWdlcy9zdGFuZGFyZC1qcmUtY29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGI1ZGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBsdWdpbk5hbWUgPSBQcm9qZWN0IEZhY2V0IENvcmUgKEphdmEgU3VwcG9ydCkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1qc3RKYXZhRmFjZXRMYWJlbCA9IEphdmEKLWpzdEphdmFGYWNldERlc2NyaXB0aW9uID0gQWRkcyBzdXBwb3J0IGZvciB3cml0aW5nIGFwcGxpY2F0aW9ucyB1c2luZyBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotamF2YVZlcnNpb25NaXNtYXRjaE1hcmtlck5hbWUgPSBGYWNldGVkIFByb2plY3QgUHJvYmxlbSAoSmF2YSBWZXJzaW9uIE1pc21hdGNoKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM2MmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVCcmlkZ2VzIj4KLSAgICA8YnJpZGdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YVJ1bnRpbWVCcmlkZ2UiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YVJ1bnRpbWVCcmlkZ2UiLz4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gIAotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlIGlkPSJzdGFuZGFyZC5qcmUiLz4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbiB0eXBlPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249IjEuMyIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uIHR5cGU9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iMS40Ii8+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24gdHlwZT0ic3RhbmRhcmQuanJlIiB2ZXJzaW9uPSI1LjAiLz4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbiB0eXBlPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249IjYuMCIvPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxmYWNldCBpZD0ianN0LmphdmEiIHZlcnNpb249IjEuMyIvPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249IlsxLjMiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSIxLjQiLz4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ic3RhbmRhcmQuanJlIiB2ZXJzaW9uPSJbMS40Ii8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPGZhY2V0IGlkPSJqc3QuamF2YSIgdmVyc2lvbj0iNS4wIi8+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iWzUuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxmYWNldCBpZD0ianN0LmphdmEiIHZlcnNpb249IjYuMCIvPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249Ils2LjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgICAKLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ic3RhbmRhcmQuanJlIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9InN0YW5kYXJkLmpyZSIvPgotICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLlN0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLQotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ic3RhbmRhcmQuanJlIgotICAgICAgIHBhdGg9ImltYWdlcy9zdGFuZGFyZC1qcmUtY29tcG9uZW50LmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJqc3QuamF2YSI+Ci0gICAgICA8bGFiZWw+JWpzdEphdmFGYWNldExhYmVsPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj4lanN0SmF2YUZhY2V0RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0RGVmYXVsdFZlcnNpb25Qcm92aWRlciIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSIxLjMiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZmFjZXQ9IndzdC53ZWIiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSIxLjQiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZmFjZXQ9IndzdC53ZWIiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZmFjZXQ9IndzdC53ZWIiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI2LjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZmFjZXQ9IndzdC53ZWIiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC5qYXZhIiB0eXBlPSJpbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkphdmFGYWNldEluc3RhbGxDb25maWdGYWN0b3J5Ii8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgICA8YWN0aW9uIGZhY2V0PSJqc3QuamF2YSIgdHlwZT0idmVyc2lvbi1jaGFuZ2UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBmYWNldD0ianN0LmphdmEiIHBhdGg9ImltYWdlcy9qYXZhLWZhY2V0LmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVycyI+Ci0gICAgIDxsaXN0ZW5lcgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZExpc3RlbmVyIgotICAgICAgIGV2ZW50VHlwZXM9IlBSSU1BUllfUlVOVElNRV9DSEFOR0VEIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudmFsaWRhdG9ycyI+Ci0gICAgPHZhbGlkYXRvciBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0VmFsaWRhdG9yIj4KLSAgICAgIDxmYWNldCBpZD0ianN0LmphdmEiLz4KLSAgICA8L3ZhbGlkYXRvcj4KLSAgPC9leHRlbnNpb24+ICAgIAotCi0gIDxleHRlbnNpb24gCi0gICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0gICAgaWQ9ImphdmFWZXJzaW9uTWlzbWF0Y2giCi0gICAgbmFtZT0iJWphdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJOYW1lIj4KLSAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudmFsaWRhdGlvbi5tYXJrZXIiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0VmVyc2lvbiIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcGlsZXJMZXZlbCIvPgotICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0JPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmphdmFWZXJzaW9uTWlzbWF0Y2giCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zIj4KLSAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0NsYXNzcGF0aEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvQ2xhc3NwYXRoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODYwNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvQ2xhc3NwYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiA8cD5BIHV0aWxpdHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIElDbGFzc3BhdGhQcm92aWRlciBpbiBvcmRlciB0byBtYW5hZ2UKLSAqIHRoZSBib29ra2VlcGluZyB3aGVuIHByb2plY3QgZmFjZXRzIGFyZSBpbnN0YWxsZWQgYW5kIHVuaW5zdGFsbGVkLCBhbmQgd2hlbgotICogdGhlIGJvdW5kIHJ1bnRpbWUgY2hhbmdlcy4gVGhpcyB1dGlsaXR5IHRyYWNrcyB3aGljaCBjbGFzc3BhdGggZW50cmllcyB3ZXJlCi0gKiBhZGRlZCB0byB0aGUgcHJvamVjdCBieSB3aGljaCBmYWNldCBhbmQgc3RvcmVzIHRoaXMgaW5mb3JtYXRpb24gaW4gYSBwcm9qZWN0Ci0gKiBtZXRhZGF0YSBmaWxlLiBUaGlzIGVuYWJsZXMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRvIGJlIHJlbW92ZWQgd2l0aG91dAotICoga25vd2luZyB3aGF0IHRoZXkgYXJlLiBJdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBrbm93IHdoaWNoIGZhY2V0IGFkZGVkIHRoZW0uCi0gKiBUaGlzIHV0aWxpdHkgc3VwcG9ydHMgdGhlIGNhc2Ugd2hlcmUgdGhlIHNhbWUgY2xhc3NwYXRoIGVudHJ5IGlzIGFkZGVkIGJ5Ci0gKiBtdWx0aXBsZSBwcm9qZWN0IGZhY2V0cy4gSW4gdGhpcyBzaXR1YXRpb24sIGEgY2xhc3NwYXRoIGVudHJ5IGlzIG9ubHkKLSAqIHJlbW92ZWQgd2hlbiB0aGUgcmVtb3ZhbCBoYXMgYmVlbiByZXF1ZXN0ZWQgZm9yIGFsbCBvZiB0aGUgZmFjZXRzIHRoYXQgYWRkZWQKLSAqIGl0LjwvcD4KLSAqIAotICogPHA+VHlwaWNhbGx5IHRoZSBwcm9qZWN0IGZhY2V0IGF1dGhvciB3aWxsIHdyaXRlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhlCi0gKiBpbnN0YWxsIGRlbGVnYXRlOjwvcD4KLSAqIAotICogPHByZT4KLSAqIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApCi0gKiB7Ci0gKiAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gYm91bmQgcnVudGltZSBvciB3aGVuIHRoZSBib3VuZAotICogICAgIC8vIHJ1bnRpbWUgY2Fubm90IHByb3ZpZGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoaXMgZmFjZXQuCi0gKiAgICAgCi0gKiAgICAgZmluYWwgTGlzdCBhbHRlcm5hdGUgPSAuLi47Ci0gKiAgICAgQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCBhbHRlcm5hdGUgKTsKLSAqIH0KLSAqIDwvcHJlPgotICogCi0gKiA8cD5BbmQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbiB0aGUgdW5pbnN0YWxsIGRlbGVnYXRlOjwvcD4KLSAqIAotICogPHByZT4KLSAqIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApOwotICogPC9wcmU+Ci0gKiAKLSAqIDxwPkFuZCBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHRoZSBydW50aW1lIGNoYW5nZWQgZGVsZWdhdGU6PC9wPgotICogCi0gKiA8cHJlPgotICogQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2ICk7Ci0gKiAKLSAqIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApCi0gKiB7Ci0gKiAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gYm91bmQgcnVudGltZSBvciB3aGVuIHRoZSBib3VuZAotICogICAgIC8vIHJ1bnRpbWUgY2Fubm90IHByb3ZpZGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoaXMgZmFjZXQuCi0gKiAgICAgCi0gKiAgICAgZmluYWwgTGlzdCBhbHRlcm5hdGUgPSAuLi47Ci0gKiAgICAgQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCBhbHRlcm5hdGUgKTsKLSAqIH0KLSAqIDwvcHJlPgotICogCi0gKiA8cD5BbmQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbiB0aGUgdmVyc2lvbiBjaGFuZ2UgZGVsZWdhdGU6PC9wPgotICogCi0gKiA8cHJlPgotICogZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gb2xkdmVyCi0gKiAgID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAqIAotICogQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIG9sZHZlciApOwotICogCi0gKiBpZiggISBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYgKQotICogewotICogICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIGJvdW5kIHJ1bnRpbWUgb3Igd2hlbiB0aGUgYm91bmQKLSAqICAgICAvLyBydW50aW1lIGNhbm5vdCBwcm92aWRlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGlzIGZhY2V0LgotICogICAgIAotICogICAgIGZpbmFsIExpc3QgYWx0ZXJuYXRlID0gLi4uOwotICogICAgIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgYWx0ZXJuYXRlICk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzcGF0aEhlbHBlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBTWVNURU1fT1dORVIgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc3BhdGhIZWxwZXIoKSB7fQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYWRkaW5nIHRvIHRoZSBwcm9qZWN0IHRoZSBjbGFzc3BhdGggZW50cmllcwotICAgICAqIHByb3ZpZGVkIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgYnkgdGhlIHJ1bnRpbWUgYm91bmQgdG8gdGhlCi0gICAgICogcHJvamVjdC4gVGhlIGVudHJpZXMgYXJlIG1hcmtlZCBhcyBiZWxvbmdpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0gICAgICogZmFjZXQuCi0gICAgICogICAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSBmdiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIHRoYXQgd2lsbCBvd24gdGhlc2UgZW50cmllcwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2xhc3NwYXRoIGVudHJpZXMgd2VyZSBhZGRlZCwgb3IKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBydW50aW1lIGJvdW5kIHRvIHRoZSBwcm9qZWN0IG9yIGlmCi0gICAgICogICBpdCBjYW5ub3QgcHJvdmlkZSBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIHNwZWNpZmllZCBmYWNldAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgYWRkaW5nIHRoZSBjbGFzc3BhdGggZW50cmllcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRDbGFzc3BhdGhFbnRyaWVzKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QgKTsKLSAgICAKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggcnVudGltZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aFByb3ZpZGVyIGNwcHJvdiAKLSAgICAgICAgICAgICAgICA9IChJQ2xhc3NwYXRoUHJvdmlkZXIpIHJ1bnRpbWUuZ2V0QWRhcHRlciggSUNsYXNzcGF0aFByb3ZpZGVyLmNsYXNzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIExpc3QgY3BlbnRyaWVzID0gY3Bwcm92LmdldENsYXNzcGF0aEVudHJpZXMoIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjcGVudHJpZXMgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIGNwZW50cmllcyApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCB0aGUgcHJvdmlkZWQgY2xhc3NwYXRoIGVudHJpZXMgdG8gcHJvamVjdCBhbmQgbWFya3MgdGhlbSBhcyBiZWxvbmdpbmcKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHdpbGwgb3duIHRoZXNlIGVudHJpZXMKLSAgICAgKiBAcGFyYW0gY3BlbnRyaWVzIHRoZSBjbGFzc3BhdGggZW50cmllcyAoZWxlbWVudCB0eXBlOiAKLSAgICAgKiAgIHtAc2VlIElDbGFzc3BhdGhFbnRyeX0pCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSBhZGRpbmcgdGhlIGNsYXNzcGF0aCBlbnRyaWVzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENsYXNzcGF0aEVudHJpZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGNwZW50cmllcyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICAgICAgZmluYWwgTGlzdCBjcCA9IGdldENsYXNzcGF0aCgganByb2ogKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY3BjaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1hcCBwcmVmcyA9IHJlYWRQcmVmZXJlbmNlcyggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IGNwZW50cmllcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGggPSBjcGVudHJ5LmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNvbnRhaW5zID0gY3AuY29udGFpbnMoIGNwZW50cnkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTZXQgb3duZXJzID0gKFNldCkgcHJlZnMuZ2V0KCBwYXRoICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG93bmVycyA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG93bmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvbnRhaW5zICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzLmFkZCggU1lTVEVNX09XTkVSICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHByZWZzLnB1dCggcGF0aCwgb3duZXJzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG93bmVycy5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgY29udGFpbnMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3AuYWRkKCBjcGVudHJ5ICk7Ci0gICAgICAgICAgICAgICAgICAgIGNwY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY3BjaGFuZ2VkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRDbGFzc3BhdGgoIGpwcm9qLCBjcCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3cml0ZVByZWZlcmVuY2VzKCBwcm9qZWN0LCBwcmVmcyApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBCYWNraW5nU3RvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QKLSAgICAgICAgICAgICAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzLCBlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBzdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGJlbG9uZ2luZyB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQuCi0gICAgICogQW55IGVudHJpZXMgdGhhdCBhbHNvIGJlbG9uZyB0byBhbm90aGVyIGZhY2V0IGFyZSBsZWZ0IGluIHBsYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGZ2IHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgb3ducyB0aGUgZW50cmllcyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSByZW1vdmluZyBjbGFzc3BhdGggZW50cmllcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICAgICAgZmluYWwgTGlzdCBjcCA9IGdldENsYXNzcGF0aCgganByb2ogKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY3BjaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1hcCBwcmVmcyA9IHJlYWRQcmVmZXJlbmNlcyggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjEgPSBwcmVmcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0cjEuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyMS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcGF0aCA9IChJUGF0aCkgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0IG93bmVycyA9IChTZXQpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG93bmVycy5jb250YWlucyggZnYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvd25lcnMucmVtb3ZlKCBmdiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIG93bmVycy5zaXplKCkgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0cjEucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMiA9IGNwLml0ZXJhdG9yKCk7IGl0cjIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZW50cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoSUNsYXNzcGF0aEVudHJ5KSBpdHIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3BlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKCBwYXRoICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRyMi5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggY3BjaGFuZ2VkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRDbGFzc3BhdGgoIGpwcm9qLCBjcCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3cml0ZVByZWZlcmVuY2VzKCBwcm9qZWN0LCBwcmVmcyApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBCYWNraW5nU3RvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QKLSAgICAgICAgICAgICAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzLCBlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBzdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0Q2xhc3NwYXRoKCBmaW5hbCBJSmF2YVByb2plY3QganByb2ogKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKCBjcFsgaSBdICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldENsYXNzcGF0aCggZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGNwICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdjcAotICAgICAgICAgICAgPSAoSUNsYXNzcGF0aEVudHJ5W10pIGNwLnRvQXJyYXkoIG5ldyBJQ2xhc3NwYXRoRW50cnlbIGNwLnNpemUoKSBdICk7Ci0gICAgICAgIAotICAgICAgICBqcHJvai5zZXRSYXdDbGFzc3BhdGgoIG5ld2NwLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIE1hcCByZWFkUHJlZmVyZW5jZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZXMgcm9vdCA9IGdldFByZWZlcmVuY2VzTm9kZSggcHJvamVjdCApOwotICAgICAgICBmaW5hbCBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGtleXMgPSByb290LmNoaWxkcmVuTmFtZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBrZXlzWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyBub2RlID0gcm9vdC5ub2RlKCBrZXkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG93bmVycyA9IG5vZGUuZ2V0KCAib3duZXJzIiwgbnVsbCApOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc3BsaXQgPSBvd25lcnMuc3BsaXQoICI7IiApOwotICAgICAgICAgICAgZmluYWwgU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgc3BsaXQubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWdtZW50ID0gc3BsaXRbIGogXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc2VnbWVudC5lcXVhbHMoICIjc3lzdGVtIyIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKCBTWVNURU1fT1dORVIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IHBhcnNlRmVhdHVyZVZlcnNpb24oIHNlZ21lbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQucHV0KCBkZWNvZGUoIGtleSApLCBzZXQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVByZWZlcmVuY2VzKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwIHByZWZzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIHJvb3QgPSBnZXRQcmVmZXJlbmNlc05vZGUoIHByb2plY3QgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gY2hpbGRyZW4gPSByb290LmNoaWxkcmVuTmFtZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICByb290Lm5vZGUoIGNoaWxkcmVuWyBpIF0gKS5yZW1vdmVOb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IHByZWZzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyMS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyMS5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gKElQYXRoKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIFNldCBvd25lcnMgPSAoU2V0KSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjIgPSBvd25lcnMuaXRlcmF0b3IoKTsgaXRyMi5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb3duZXIgPSBpdHIyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBidWYubGVuZ3RoKCkgPiAwICkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnOycgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG93bmVyID09IFNZU1RFTV9PV05FUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiI3N5c3RlbSMiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIG93bmVyOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnOicgKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyBub2RlID0gcm9vdC5ub2RlKCBlbmNvZGUoIHBhdGggKSApOwotICAgICAgICAgICAgbm9kZS5wdXQoICJvd25lcnMiLCBidWYudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByb290LmZsdXNoKCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzTm9kZSggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICBmaW5hbCBQcm9qZWN0U2NvcGUgc2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKCBwcm9qZWN0ICk7Ci0gICAgICAgIGZpbmFsIElFY2xpcHNlUHJlZmVyZW5jZXMgcGx1Z2luUm9vdCA9IHNjb3BlLmdldE5vZGUoIFBMVUdJTl9JRCApOwotICAgICAgICByZXR1cm4gcGx1Z2luUm9vdC5ub2RlKCAiY2xhc3NwYXRoLmhlbHBlciIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gcGFyc2VGZWF0dXJlVmVyc2lvbiggZmluYWwgU3RyaW5nIHN0ciApCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgY29sb24gPSBzdHIuaW5kZXhPZiggJzonICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IHN0ci5zdWJzdHJpbmcoIDAsIGNvbG9uICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2ZXIgPSBzdHIuc3Vic3RyaW5nKCBjb2xvbiArIDEgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGlkICkuZ2V0VmVyc2lvbiggdmVyICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGUoIGZpbmFsIElQYXRoIHBhdGggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCAiLyIsICI6OiIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVBhdGggZGVjb2RlKCBmaW5hbCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFBhdGgoIHBhdGgucmVwbGFjZUFsbCggIjo6IiwgIi8iICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggQ2xhc3NwYXRoSGVscGVyLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9DbGFzc3BhdGhIZWxwZXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0NsYXNzcGF0aEhlbHBlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVhZWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0NsYXNzcGF0aEhlbHBlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzID0gRmFpbGVkIHdoaWxlIHdyaXRpbmcgcHJlZmVyZW5jZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNsYXNzcGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwMmRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGEgcnVudGltZSBjb21wb25lbnQgYWRhcHRlciBpbiBvcmRlciB0byBwcm92aWRlCi0gKiBjbGFzc3BhdGggZW50cmllcyBmb3IgcHJvamVjdCBmYWNldHMuIEZvciBjb252ZW5pZW5jZSwgdGhlIHJ1bnRpbWUgY2FuIGFsc28KLSAqIGJlIGFkYXB0ZWQgdG8gdGhpcyBpbnRlcmZhY2UuIFRoYXQgYWRhcHRlciB3aWxsIGRlbGVnYXRlIHRvIHRoZSBydW50aW1lIAotICogY29tcG9uZW50cyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIHJ1bnRpbWUuIFRoZSBmaXJzdCBvbmUgCi0gKiB0aGF0IGNhbiBwcm92aWRlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgd2lucy4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aFByb3ZpZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldCwgb3IKLSAgICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcHJvdmlkZXIgZG9lcyBub3QgcHJvdmlkZSBjbGFzc3BhdGggZW50cmllcwotICAgICAqICAgZm9yIHRoZSBnaXZlbiBwcm9qZWN0IGZhY2V0Ci0gICAgICovCi0gICAgCi0gICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGdldENsYXNzcGF0aEVudHJpZXMoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9KYXZhRmFjZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQyZGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRmFjZXQgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAianN0LmphdmEiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEZBQ0VUIAotICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggSUQgKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfMTMKLSAgICAgICAgPSBGQUNFVC5nZXRWZXJzaW9uKCAiMS4zIiApOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzE0Ci0gICAgICAgID0gRkFDRVQuZ2V0VmVyc2lvbiggIjEuNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gSkFWQV81MAotICAgICAgICA9IEZBQ0VULmdldFZlcnNpb24oICI1LjAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfNjAKLSAgICAgICAgPSBGQUNFVC5nZXRWZXJzaW9uKCAiNi4wIiApOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQoIHByb2plY3QsIElEICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldEluc3RhbGxDb25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldEluc3RhbGxDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MWQwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLkV2ZW50TGlzdGVuZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklFdmVudExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RfUFJPUF9TT1VSQ0VfRk9MREVSID0gImRlZmF1bHRKYXZhU291cmNlRm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EX1BST1BfU09VUkNFX0ZPTERFUl9MRUdBQ1kgPSAiZGVmYXVsdFNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfRk9MREVSID0gInNyYyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EX1BST1BfT1VUUFVUX0ZPTERFUiA9ICJkZWZhdWx0SmF2YU91dHB1dEZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRF9QUk9QX09VVFBVVF9GT0xERVJfTEVHQUNZID0gIm91dHB1dEZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PVVRQVVRfRk9MREVSID0gImJ1aWxkL2NsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGFuZ2VFdmVudAotICAgIHsKLSAgICAgICAgcHVibGljIGVudW0gVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBTT1VSQ0VfRk9MREVSU19DSEFOR0VELAotICAgICAgICAgICAgREVGQVVMVF9PVVRQVVRfRk9MREVSX0NIQU5HRUQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBpbnN0YWxsQ29uZmlnOwotICAgICAgICAKLSAgICAgICAgQ2hhbmdlRXZlbnQoIGZpbmFsIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEphdmFGYWNldEluc3RhbGxDb25maWcgaW5zdGFsbENvbmZpZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmluc3RhbGxDb25maWcgPSBpbnN0YWxsQ29uZmlnOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGdldEphdmFGYWNldEluc3RhbGxDb25maWcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWxsQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRXZlbnRMaXN0ZW5lclJlZ2lzdHJ5PENoYW5nZUV2ZW50LlR5cGUsQ2hhbmdlRXZlbnQ+IGxpc3RlbmVyczsKLSAgICBwcml2YXRlIExpc3Q8SVBhdGg+IHNvdXJjZUZvbGRlcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJzUmVhZE9ubHk7Ci0gICAgcHJpdmF0ZSBJUGF0aCBkZWZhdWx0T3V0cHV0Rm9sZGVyOwotICAgIAotICAgIHB1YmxpYyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEV2ZW50TGlzdGVuZXJSZWdpc3RyeTxDaGFuZ2VFdmVudC5UeXBlLENoYW5nZUV2ZW50PiggQ2hhbmdlRXZlbnQuVHlwZS5jbGFzcyApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zb3VyY2VGb2xkZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElQYXRoPigpOwotICAgICAgICB0aGlzLnNvdXJjZUZvbGRlcnNSZWFkT25seSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHRoaXMuc291cmNlRm9sZGVycyApOwotICAgICAgICB0aGlzLmRlZmF1bHRPdXRwdXRGb2xkZXIgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNvdXJjZUZvbGRlciA9IGdldFByb2R1Y3RQcm9wZXJ0eSggUFJPRF9QUk9QX1NPVVJDRV9GT0xERVIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzb3VyY2VGb2xkZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvdXJjZUZvbGRlciA9IGdldFByb2R1Y3RQcm9wZXJ0eSggUFJPRF9QUk9QX1NPVVJDRV9GT0xERVJfTEVHQUNZICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBzb3VyY2VGb2xkZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvdXJjZUZvbGRlciA9IERFRkFVTFRfU09VUkNFX0ZPTERFUjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5zb3VyY2VGb2xkZXJzLmFkZCggbmV3IFBhdGgoIHNvdXJjZUZvbGRlciApICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgb3V0cHV0Rm9sZGVyID0gZ2V0UHJvZHVjdFByb3BlcnR5KCBQUk9EX1BST1BfT1VUUFVUX0ZPTERFUiApOwotICAgICAgICAKLSAgICAgICAgaWYoIG91dHB1dEZvbGRlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gZ2V0UHJvZHVjdFByb3BlcnR5KCBQUk9EX1BST1BfT1VUUFVUX0ZPTERFUl9MRUdBQ1kgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIG91dHB1dEZvbGRlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gREVGQVVMVF9PVVRQVVRfRk9MREVSOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmRlZmF1bHRPdXRwdXRGb2xkZXIgPSBuZXcgUGF0aCggb3V0cHV0Rm9sZGVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElQYXRoPiBnZXRTb3VyY2VGb2xkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUZvbGRlcnNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlRm9sZGVycyggZmluYWwgTGlzdDxJUGF0aD4gcGF0aHMgKQotICAgIHsKLSAgICAgICAgaWYoICEgdGhpcy5zb3VyY2VGb2xkZXJzLmVxdWFscyggcGF0aHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc291cmNlRm9sZGVycy5jbGVhcigpOwotICAgICAgICAgICAgdGhpcy5zb3VyY2VGb2xkZXJzLmFkZEFsbCggcGF0aHMgKTsKLQotICAgICAgICAgICAgZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgQ2hhbmdlRXZlbnQoIENoYW5nZUV2ZW50LlR5cGUuU09VUkNFX0ZPTERFUlNfQ0hBTkdFRCwgdGhpcyApOwotICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMubm90aWZ5TGlzdGVuZXJzKCBDaGFuZ2VFdmVudC5UeXBlLlNPVVJDRV9GT0xERVJTX0NIQU5HRUQsIGV2ZW50ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlRm9sZGVyKCBmaW5hbCBJUGF0aCBwYXRoICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SVBhdGg+IG5ld1NvdXJjZUZvbGRlcnM7Ci0gICAgICAgIAotICAgICAgICBpZiggcGF0aCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3U291cmNlRm9sZGVycyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbmV3U291cmNlRm9sZGVycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIHBhdGggKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2V0U291cmNlRm9sZGVycyggbmV3U291cmNlRm9sZGVycyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2VGb2xkZXIoIGZpbmFsIElQYXRoIHBhdGggKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gbmV3U291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3Q8SVBhdGg+KCBnZXRTb3VyY2VGb2xkZXJzKCkgKTsKLSAgICAgICAgbmV3U291cmNlRm9sZGVycy5hZGQoIHBhdGggKTsKLSAgICAgICAgc2V0U291cmNlRm9sZGVycyggbmV3U291cmNlRm9sZGVycyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTb3VyY2VGb2xkZXIoIGZpbmFsIElQYXRoIHBhdGggKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gbmV3U291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3Q8SVBhdGg+KCBnZXRTb3VyY2VGb2xkZXJzKCkgKTsKLSAgICAgICAgbmV3U291cmNlRm9sZGVycy5yZW1vdmUoIHBhdGggKTsKLSAgICAgICAgc2V0U291cmNlRm9sZGVycyggbmV3U291cmNlRm9sZGVycyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVBhdGggZ2V0RGVmYXVsdE91dHB1dEZvbGRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0T3V0cHV0Rm9sZGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCBmaW5hbCBJUGF0aCBkZWZhdWx0T3V0cHV0Rm9sZGVyICkKLSAgICB7Ci0gICAgICAgIGlmKCAhIGVxdWFsKCB0aGlzLmRlZmF1bHRPdXRwdXRGb2xkZXIsIGRlZmF1bHRPdXRwdXRGb2xkZXIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE91dHB1dEZvbGRlciA9IGRlZmF1bHRPdXRwdXRGb2xkZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IENoYW5nZUV2ZW50KCBDaGFuZ2VFdmVudC5UeXBlLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9DSEFOR0VELCB0aGlzICk7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5ub3RpZnlMaXN0ZW5lcnMoIENoYW5nZUV2ZW50LlR5cGUuREVGQVVMVF9PVVRQVVRfRk9MREVSX0NIQU5HRUQsIGV2ZW50ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElFdmVudExpc3RlbmVyPENoYW5nZUV2ZW50PiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2hhbmdlRXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRXZlbnRMaXN0ZW5lcjxDaGFuZ2VFdmVudD4gbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbCggZmluYWwgT2JqZWN0IG9iajEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iajIgKQotICAgIHsKLSAgICAgICAgaWYoIG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqMS5lcXVhbHMoIG9iajIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvZHVjdFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldFByb3BlcnR5KCBwcm9wTmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9TdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYTM2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9TdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50IAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAic3RhbmRhcmQuanJlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRUeXBlIFRZUEUgCi0gICAgICAgID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoIFRZUEVfSUQgKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBWRVJTSU9OXzFfMwotICAgICAgICA9IFRZUEUuZ2V0VmVyc2lvbiggIjEuMyIgKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIFZFUlNJT05fMV80Ci0gICAgICAgID0gVFlQRS5nZXRWZXJzaW9uKCAiMS40IiApOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBWRVJTSU9OXzVfMAotICAgICAgICA9IFRZUEUuZ2V0VmVyc2lvbiggIjUuMCIgKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIFZFUlNJT05fNl8wCi0gICAgICAgID0gVFlQRS5nZXRWZXJzaW9uKCAiNi4wIiApOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX1RZUEUgPSAidm0taW5zdGFsbC10eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9JRCA9ICJ2bS1pbnN0YWxsLWlkIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVDb21wb25lbnQgY3JlYXRlKCBmaW5hbCBJVk1JbnN0YWxsIHZtSW5zdGFsbCApCi0gICAgewotICAgICAgICBTdHJpbmcganZtdmVyID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElWTUluc3RhbGwyIHZtSW5zdGFsbDIgPSAoSVZNSW5zdGFsbDIpIHZtSW5zdGFsbDsKLSAgICAgICAgICAgIGp2bXZlciA9IHZtSW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdjsKLSAgICAgICAgCi0gICAgICAgIGlmKCBqdm12ZXIgPT0gbnVsbCApIAotICAgICAgICB7Ci0gICAgICAgICAgICByY3YgPSBTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuVkVSU0lPTl82XzA7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYoIGp2bXZlci5zdGFydHNXaXRoKCAiMS4zIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmN2ID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlZFUlNJT05fMV8zOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGp2bXZlci5zdGFydHNXaXRoKCAiMS40IiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmN2ID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlZFUlNJT05fMV80OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGp2bXZlci5zdGFydHNXaXRoKCAiMS41IiApIHx8IGp2bXZlci5zdGFydHNXaXRoKCAiNS4wIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmN2ID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlZFUlNJT05fNV8wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGp2bXZlci5zdGFydHNXaXRoKCAiMS42IiApIHx8IGp2bXZlci5zdGFydHNXaXRoKCAiNi4wIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmN2ID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlZFUlNJT05fNl8wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdiA9IFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5WRVJTSU9OXzZfMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotICAgICAgICAKLSAgICAgICAgaWYoIHZtSW5zdGFsbCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoIFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5QUk9QX1ZNX0lOU1RBTExfVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KCBTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuUFJPUF9WTV9JTlNUQUxMX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0SWQoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gUnVudGltZU1hbmFnZXIuY3JlYXRlUnVudGltZUNvbXBvbmVudCggcmN2LCBwcm9wZXJ0aWVzICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtKYXZhUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlMTY3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtKYXZhUGx1Z2luIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvZyBwbGF0Zm9ybUxvZwotICAgICAgICA9IFBsYXRmb3JtLmdldExvZyggUGxhdGZvcm0uZ2V0QnVuZGxlKCBQTFVHSU5fSUQgKSApOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSArICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIElTdGF0dXMgc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIHBsYXRmb3JtTG9nLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0RGVmYXVsdFZlcnNpb25Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0RGVmYXVsdFZlcnNpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgwYTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldERlZmF1bHRWZXJzaW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVmYXVsdFZlcnNpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBEZWZhdWx0cyB0aGUgamF2YSBmYWNldCB2ZXJzaW9uIHRvIGFsaWduIHdpdGggd29ya3NwYWNlIGphdmEgY29tcGlsZXIKLSAqIGxldmVsIHNldHRpbmdzLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0RGVmYXVsdFZlcnNpb25Qcm92aWRlcgotCi0gICAgaW1wbGVtZW50cyBJRGVmYXVsdFZlcnNpb25Qcm92aWRlcgotICAgIAotewotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcGlsZXJMZXZlbCA9IEphdmFGYWNldFV0aWwuZ2V0Q29tcGlsZXJMZXZlbCgpOwotICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5jb21waWxlckxldmVsVG9GYWNldCggY29tcGlsZXJMZXZlbCApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FkNmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0ZhY3RvcnkKLQotICAgIGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkKLSAgICAKLXsKLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzhjYjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldEluc3RhbGxEZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlIAotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY2ZnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEphdmFGYWNldEluc3RhbGxDb25maWcgY29uZmlnID0gY2FzdFRvQ29uZmlnKCBjZmcgKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHNvdXJjZSBhbmQgdGhlIG91dHB1dCBkaXJlY3Rvcmllcy4KLQotICAgICAgICBJSmF2YVByb2plY3QganByb2plY3QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoIHByb2plY3QuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBqcHJvamVjdC5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBjcCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQYXRoIHNyY0ZvbGRlclBhdGggOiBjb25maWcuZ2V0U291cmNlRm9sZGVycygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCBzcmNGb2xkZXJQYXRoICk7Ci0gICAgICAgICAgICAgICAgbWtkaXJzKCBmb2xkZXIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjcC5hZGQoIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElGb2xkZXIgZGVmT3V0cHV0Rm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIGNvbmZpZy5nZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCkgKTsKLSAgICAgICAgICAgIG1rZGlycyggZGVmT3V0cHV0Rm9sZGVyICk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgamF2YSBuYXR1cmUuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgYnVpbGRlci4KLQotICAgICAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gY3VycmVudCA9IGRlc2MuZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXBsYWNlbWVudCA9IG5ldyBTdHJpbmdbIGN1cnJlbnQubGVuZ3RoICsgMSBdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggY3VycmVudCwgMCwgcmVwbGFjZW1lbnQsIDAsIGN1cnJlbnQubGVuZ3RoICk7Ci0gICAgICAgICAgICByZXBsYWNlbWVudFsgY3VycmVudC5sZW5ndGggXSA9IEphdmFDb3JlLk5BVFVSRV9JRDsKLSAgICAgICAgICAgIGRlc2Muc2V0TmF0dXJlSWRzKCByZXBsYWNlbWVudCApOwotICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbiggZGVzYywgbnVsbCApOwotCi0gICAgICAgICAgICAvLyBTZXR1cCB0aGUgY2xhc3NwYXRoLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBqcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoIGNwLnRvQXJyYXkoIG5ldyBJQ2xhc3NwYXRoRW50cnlbIGNwLnNpemUoKSBdICksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPdXRwdXRGb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCApOwotCi0gICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnJlc2V0Q2xhc3NwYXRoKCBwcm9qZWN0LCBudWxsLCBmdiApOwotICAgICAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBmdiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBjb21waWxlciBjb21wbGlhbmNlIGxldmVsIGZvciB0aGUgcHJvamVjdC4gSWdub3JlIHdoZXRoZXIKLSAgICAgICAgICAgIC8vIHRoaXMgbWlnaHQgYWxyZWFkeSBiZSBzZXQgc28gYXQgdGhlIHdvcmtzcGFjZSBsZXZlbCBpbiBjYXNlCi0gICAgICAgICAgICAvLyB3b3Jrc3BhY2Ugc2V0dGluZ3MgY2hhbmdlIGxhdGVyIG9yIHRoZSBwcm9qZWN0IGlzIGluY2x1ZGVkIGluIGEKLSAgICAgICAgICAgIC8vIGRpZmZlcmVudCB3b3Jrc3BhY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBvbGRDb21waWxlckxldmVsID0gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnNldENvbXBpbGVyTGV2ZWwoIHByb2plY3QsIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuZXdDb21waWxlckxldmVsID0gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZnVsbCBidWlsZCBvZiB0aGUgcHJvamVjdCBpZiB0aGUgY29tcGlsZXIgbGV2ZWwgY2hhbmdlZAotICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IGNsYXNzZXMgaW4gdGhlIHByb2plY3QgdG8gYmUgcmVjb21waWxlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG5ld0NvbXBpbGVyTGV2ZWwgIT0gbnVsbCAmJiAhIG5ld0NvbXBpbGVyTGV2ZWwuZXF1YWxzKCBvbGRDb21waWxlckxldmVsICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEphdmFGYWNldFV0aWwuc2NoZWR1bGVGdWxsQnVpbGQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGNhc3RUb0NvbmZpZyggZmluYWwgT2JqZWN0IGNmZyApCi0gICAgewotICAgICAgICBpZiggY2ZnIGluc3RhbmNlb2YgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgY2ZnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotICAgICAgICAgICAgcmV0dXJuIChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBtYW5hZ2VyLmdldEFkYXB0ZXIoIGNmZywgSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWtkaXJzKCBmaW5hbCBJRm9sZGVyIGZvbGRlciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoICEgZm9sZGVyLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbnRhaW5lciBwYXJlbnQgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBwYXJlbnQgaW5zdGFuY2VvZiBJRm9sZGVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBta2RpcnMoIChJRm9sZGVyKSBwYXJlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9sZGVyLmNyZWF0ZSggdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmIxNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0UnVudGltZUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0UnVudGltZUNoYW5nZWRMaXN0ZW5lciAKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gZXZlbnQuZ2V0UHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIGZwcm9qLmhhc1Byb2plY3RGYWNldCggSmF2YUZhY2V0LkZBQ0VUICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIEphdmFGYWNldC5GQUNFVCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnJlc2V0Q2xhc3NwYXRoKCBmcHJvai5nZXRQcm9qZWN0KCksIGZ2LCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtKYXZhUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDkyYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQ2xhc3NwYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRmFjZXRVdGlsCi17Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJMZXZlbCgpCi0gICAgewotICAgICAgICBmaW5hbCBJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgSW5zdGFuY2VTY29wZSgpOwotICAgICAgICBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gY29udGV4dC5nZXROb2RlKCBKYXZhQ29yZS5QTFVHSU5fSUQgKTsKLSAgICAgICAgU3RyaW5nIGxldmVsID0gcHJlZnMuZ2V0KCBKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBpZiggbGV2ZWwgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEhhc2h0YWJsZSBkZWZhdWx0cyA9IEphdmFDb3JlLmdldERlZmF1bHRPcHRpb25zKCk7Ci0gICAgICAgICAgICBsZXZlbCA9IChTdHJpbmcpIGRlZmF1bHRzLmdldCggSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGV2ZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICBmaW5hbCBJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKCBwcm9qZWN0ICk7Ci0gICAgICAgIGZpbmFsIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBjb250ZXh0LmdldE5vZGUoIEphdmFDb3JlLlBMVUdJTl9JRCApOwotICAgICAgICBTdHJpbmcgbGV2ZWwgPSBwcmVmcy5nZXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBsZXZlbCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbGV2ZWwgPSBnZXRDb21waWxlckxldmVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsZXZlbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyTGV2ZWwoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBzZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBmYWNldFRvQ29tcGlsZXJMZXZlbCggZnYgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGV2ZWwgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9qZWN0U2NvcGUoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgCi0gICAgICAgICAgICA9IGNvbnRleHQuZ2V0Tm9kZSggSmF2YUNvcmUuUExVR0lOX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggbGV2ZWwuZXF1YWxzKCBKYXZhQ29yZS5WRVJTSU9OXzFfMyApICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfMyApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzEgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfMyApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9BU1NFUlRfSURFTlRJRklFUiwgSmF2YUNvcmUuSUdOT1JFICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0VOVU1fSURFTlRJRklFUiwgSmF2YUNvcmUuSUdOT1JFICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggbGV2ZWwuZXF1YWxzKCBKYXZhQ29yZS5WRVJTSU9OXzFfNCApICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzIgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfMyApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9BU1NFUlRfSURFTlRJRklFUiwgSmF2YUNvcmUuV0FSTklORyApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9FTlVNX0lERU5USUZJRVIsIEphdmFDb3JlLldBUk5JTkcgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBsZXZlbC5lcXVhbHMoIEphdmFDb3JlLlZFUlNJT05fMV81ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV81ICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV81ICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUiApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9FTlVNX0lERU5USUZJRVIsIEphdmFDb3JlLkVSUk9SICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggbGV2ZWwuZXF1YWxzKCBKYXZhQ29yZS5WRVJTSU9OXzFfNiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNiApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzYgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNiApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9BU1NFUlRfSURFTlRJRklFUiwgSmF2YUNvcmUuRVJST1IgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZzLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIHRoaXMuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNjaGVkdWxlRnVsbEJ1aWxkKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIC8vIFRoaXMgY29kZSBpcyBtb2RlbGVkIGFmdGVyIHRoZSBjb2RlIGluIAotICAgICAgICAvLyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5Db3JlVXRpbGl0eS5nZXRCdWlsZEpvYigpIG1ldGhvZC4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmJ1aWxkaW5nTXNnLCBwcm9qZWN0LmdldE5hbWUoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSm9iIGJ1aWxkSm9iID0gbmV3IEpvYiggbXNnICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIG1zZywgMiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5idWlsZCggSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHdzLmJ1aWxkKCBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIG1vbml0b3IsIDEgKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oIGZpbmFsIE9iamVjdCBmYW1pbHkgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5ID09IFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxEOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAgCi0gICAgICAgIGJ1aWxkSm9iLnNldFJ1bGUoIHdzLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCkgKTsKLSAgICAgICAgYnVpbGRKb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q2xhc3NwYXRoKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gb2xkdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gbmV3dmVyICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggb2xkdmVyICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgb2xkdmVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoaXMgd2FzIGEgamF2YSBwcm9qZWN0IGJlZm9yZSBpdCBiZWNhbWUgYSBmYWNldGVkIHByb2plY3Qgb3IKLSAgICAgICAgLy8gdGhlIEpSRSBjb250YWluZXIgaGFzIGJlZW4gYWRkZWQgbWFudWFsbHksIHRoZSBhYm92ZSBtZXRob2Qgd2lsbCBub3QKLSAgICAgICAgLy8gZGVsZXRlIHRoZSBvbGQgSlJFIGNvbnRhaW5lci4gRG8gaXQgbWFudWFsbHkuCi0gICAgICAgIAotICAgICAgICByZW1vdmVKcmVDb250YWluZXIoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBuZXd2ZXIgKSApIAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJVk1JbnN0YWxsIHZtID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdm0gIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKCBKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSICk7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKCB2bS5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmFwcGVuZCggdm0uZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSAKLSAgICAgICAgICAgICAgICAgICAgPSBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSggcGF0aCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIExpc3QgZW50cmllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGNwZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBuZXd2ZXIsIGVudHJpZXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUpyZUNvbnRhaW5lciggZmluYWwgSVByb2plY3QgcHJvaiApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSggcHJvaiApOwotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAKLSAgICAgICAgaW50IHBvcyA9IC0xOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcFsgaSBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmCi0gICAgICAgICAgICAgICAgY3BlLmdldFBhdGgoKS5zZWdtZW50KCAwICkuZXF1YWxzKCBKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcyA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBpZiggcG9zID09IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdjcCAKLSAgICAgICAgICAgID0gbmV3IElDbGFzc3BhdGhFbnRyeVsgY3AubGVuZ3RoIC0gMSBdOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggY3AsIDAsIG5ld2NwLCAwLCBwb3MgKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggY3AsIHBvcyArIDEsIG5ld2NwLCBwb3MsIG5ld2NwLmxlbmd0aCAtIHBvcyApOwotICAgICAgICAKLSAgICAgICAganByb2ouc2V0UmF3Q2xhc3NwYXRoKCBuZXdjcCwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGNvbXBpbGVyTGV2ZWxUb0ZhY2V0KCBmaW5hbCBTdHJpbmcgdmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCB2ZXIuZXF1YWxzKCAiMS41IiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YUZhY2V0LkpBVkFfNTA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdmVyLmVxdWFscyggICIxLjYiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhRmFjZXQuSkFWQV82MDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhRmFjZXQuRkFDRVQuZ2V0VmVyc2lvbiggdmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFRvQ29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgaWYoIGZ2ID09IEphdmFGYWNldC5KQVZBXzUwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLlZFUlNJT05fMV81OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGZ2ID09IEphdmFGYWNldC5KQVZBXzYwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLlZFUlNJT05fMV82OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZGluZ01zZzsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEphdmFGYWNldFV0aWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVdGlsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVdGlsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTAwZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VXRpbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGRpbmdNc2cgPSBCdWlsZGluZyBQcm9qZWN0IHswfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyODM1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFZhbGlkYXRvcgotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IKLSAgICAKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuamF2YVZlcnNpb25NaXNtYXRjaCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBQ0VUX1ZFUlNJT04gPSAiZmFjZXRWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09NUElMRVJfTEVWRUwgPSAiY29tcGlsZXJMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbGV2ZWwgCi0gICAgICAgICAgICA9IEphdmFGYWNldFV0aWwuZ2V0Q29tcGlsZXJMZXZlbCggZnByb2ouZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIEphdmFGYWNldC5GQUNFVCApOwotICAgICAgICAKLSAgICAgICAgaWYoIEphdmFGYWNldFV0aWwuY29tcGlsZXJMZXZlbFRvRmFjZXQoIGxldmVsICkgIT0gZnYgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJTWFya2VyIG1hcmtlcgotICAgICAgICAgICAgICAgID0gZnByb2ouY3JlYXRlRXJyb3JNYXJrZXIoIE1BUktFUl9JRCwgUmVzb3VyY2VzLnZlcnNpb25zRG9udE1hdGNoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoIEFUVFJfRkFDRVRfVkVSU0lPTiwgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKCBBVFRSX0NPTVBJTEVSX0xFVkVMLCBsZXZlbCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25zRG9udE1hdGNoOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggSmF2YUZhY2V0VmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWYWxpZGF0b3IucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzFlODcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZhbGlkYXRvci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmVyc2lvbnNEb250TWF0Y2ggPSBKYXZhIGNvbXBpbGVyIGxldmVsIGRvZXMgbm90IG1hdGNoIHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnN0YWxsZWQgSmF2YSBwcm9qZWN0IGZhY2V0LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljZGQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUgCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIHZlcnNpb24gdGhhdCdzIGN1cnJlbnRseSBpbnN0YWxsZWQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvagotICAgICAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIG9sZHZlcgotICAgICAgICAgICAgICAgID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNsYXNzcGF0aC4gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEphdmFGYWNldFV0aWwucmVzZXRDbGFzc3BhdGgoIHByb2plY3QsIG9sZHZlciwgZnYgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNvbXBpbGVyIGxldmVsLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnNldENvbXBpbGVyTGV2ZWwoIHByb2plY3QsIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZnVsbCBidWlsZCBvZiB0aGUgcHJvamVjdC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgSmF2YUZhY2V0VXRpbC5zY2hlZHVsZUZ1bGxCdWlsZCggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFSdW50aW1lQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhUnVudGltZUJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY3YmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFSdW50aW1lQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVJ1bnRpbWVCcmlkZ2UKLQotICAgIGltcGxlbWVudHMgSVJ1bnRpbWVCcmlkZ2UKLSAgICAKLXsKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhwb3J0ZWRSdW50aW1lTmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJVk1JbnN0YWxsVHlwZSB2bUluc3RhbGxUeXBlIDogSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVZNSW5zdGFsbCB2bUluc3RhbGwgOiB2bUluc3RhbGxUeXBlLmdldFZNSW5zdGFsbHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggdm1JbnN0YWxsLmdldE5hbWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgSVN0dWIgYnJpZGdlKCBmaW5hbCBTdHJpbmcgbmFtZSApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgOiBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdm1JbnN0YWxsID0gdm1JbnN0YWxsVHlwZS5maW5kVk1JbnN0YWxsQnlOYW1lKCBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB2bUluc3RhbGwgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgU3R1Yiggdm1JbnN0YWxsICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3R1YgotICAgIAotICAgICAgICBleHRlbmRzIElSdW50aW1lQnJpZGdlLlN0dWIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIElWTUluc3RhbGwgdm1JbnN0YWxsOwotCi0gICAgICAgIHB1YmxpYyBTdHViKCBmaW5hbCBJVk1JbnN0YWxsIHZtSW5zdGFsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudm1JbnN0YWxsID0gdm1JbnN0YWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgPSBTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuY3JlYXRlKCB0aGlzLnZtSW5zdGFsbCApOwotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIHJjICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhVmVyc2lvbk1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODU5NjRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucwotCi0gICAgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgotICAgIAotewotICAgIHB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10gCi0gICAgICAgIHsgCi0gICAgICAgICAgICBuZXcgUmVzb2x1dGlvbjEoIG1hcmtlciApLCAKLSAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uMiggbWFya2VyICkgCi0gICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc29sdXRpb24xCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIElNYXJrZXIgbWFya2VyOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFJlc29sdXRpb24xKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWFya2VyID0gbWFya2VyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy5jaGFuZ2VGYWNldFZlcnNpb24sIGZ2ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElNYXJrZXIgbWFya2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbgotICAgICAgICAgICAgICAgID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLCBudWxsICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSB0aGlzLm1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZwcm9qLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKCBudWxsLCBSZXNvdXJjZXMuZXJyb3JEaWFsb2dUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5lcnJvckRpYWxvZ01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCAKLSAgICAgICAgICAgICAgICA9IHRoaXMubWFya2VyLmdldEF0dHJpYnV0ZSggSmF2YUZhY2V0VmFsaWRhdG9yLkFUVFJfQ09NUElMRVJfTEVWRUwsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEphdmFGYWNldFV0aWwuY29tcGlsZXJMZXZlbFRvRmFjZXQoIGxldmVsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvbHV0aW9uMgotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJTWFya2VyIG1hcmtlcjsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBSZXNvbHV0aW9uMiggZmluYWwgSU1hcmtlciBtYXJrZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1hcmtlciA9IG1hcmtlcjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCA9IGdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLmNoYW5nZUNvbXBpbGVyTGV2ZWwsIGxldmVsICk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLm1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCA9IGdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBsZXZlbCApOwotICAgICAgICAgICAgICAgIEphdmFGYWNldFV0aWwuc2NoZWR1bGVGdWxsQnVpbGQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvciggbnVsbCwgUmVzb3VyY2VzLmVycm9yRGlhbG9nVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZXJyb3JEaWFsb2dNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRDb21waWxlckxldmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ2c3RyCi0gICAgICAgICAgICAgICAgPSB0aGlzLm1hcmtlci5nZXRBdHRyaWJ1dGUoIEphdmFGYWNldFZhbGlkYXRvci5BVFRSX0ZBQ0VUX1ZFUlNJT04sIG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IEphdmFGYWNldC5GQUNFVC5nZXRWZXJzaW9uKCBmdnN0ciApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5mYWNldFRvQ29tcGlsZXJMZXZlbCggZnYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VGYWNldFZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZUNvbXBpbGVyTGV2ZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nTWVzc2FnZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEphdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2NhMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWNoYW5nZUZhY2V0VmVyc2lvbiA9IENoYW5nZSBKYXZhIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0byB7MH0KLWNoYW5nZUNvbXBpbGVyTGV2ZWwgPUNoYW5nZSBKYXZhIGNvbXBpbGVyIGxldmVsIHRvIHswfQotZXJyb3JEaWFsb2dUaXRsZSA9IEVycm9yCi1lcnJvckRpYWxvZ01lc3NhZ2UgPSBGYWlsZWQgd2hpbGUgYXBwbHlpbmcgdGhlIHF1aWNrIGZpeC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDAwOTUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0KLSAgICBpbXBsZW1lbnRzIElDbGFzc3BhdGhQcm92aWRlcgotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWUgcjsKLSAgICAKLSAgICBwdWJsaWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKCBmaW5hbCBJUnVudGltZSByICkKLSAgICB7Ci0gICAgICAgIHRoaXMuciA9IHI7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0Q2xhc3NwYXRoRW50cmllcyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIgPSB0aGlzLnIuZ2V0UnVudGltZUNvbXBvbmVudHMoKS5pdGVyYXRvcigpOyAKLSAgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjID0gKElSdW50aW1lQ29tcG9uZW50KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoUHJvdmlkZXIgY3Bwcm92IAotICAgICAgICAgICAgICAgID0gKElDbGFzc3BhdGhQcm92aWRlcikgcmMuZ2V0QWRhcHRlciggSUNsYXNzcGF0aFByb3ZpZGVyLmNsYXNzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjcHByb3YgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdCBjcCA9IGNwcHJvdi5nZXRDbGFzc3BhdGhFbnRyaWVzKCBmdiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjcCAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElDbGFzc3BhdGhQcm92aWRlci5jbGFzcyB9OwotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBJQ2xhc3NwYXRoUHJvdmlkZXIuY2xhc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKCAoSVJ1bnRpbWUpIGFkYXB0YWJsZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFUzsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQzOWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1N0YW5kYXJkSnJlQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFN0YW5kYXJkSnJlQ2xhc3NwYXRoUHJvdmlkZXIgCi0KLSAgICBpbXBsZW1lbnRzIElDbGFzc3BhdGhQcm92aWRlciAKLSAgICAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEpBVkFfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5qYXZhIik7Ci0KLQlwcml2YXRlIElSdW50aW1lQ29tcG9uZW50IHJjOwotCi0JcHVibGljIFN0YW5kYXJkSnJlQ2xhc3NwYXRoUHJvdmlkZXIoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjICkgCi0JewotCQl0aGlzLnJjID0gcmM7Ci0JfQotCi0JcHVibGljIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBnZXRDbGFzc3BhdGhFbnRyaWVzKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApIAotCXsKLQkJaWYoIGZ2LmdldFByb2plY3RGYWNldCgpID09IEpBVkFfRkFDRVQgKSAKLQkJewotCQkgICAgZmluYWwgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBnZXRWTUluc3RhbGwoKTsKLQkJICAgIAotCQkgICAgaWYoIHZtSW5zdGFsbCAhPSBudWxsICkKLQkJICAgIHsKLQkJICAgICAgICBmaW5hbCBJUGF0aCBjcEVudHJ5UGF0aCA9IEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoIHZtSW5zdGFsbCApOwotCQkgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoIGNwRW50cnlQYXRoICk7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGNwRW50cnkgKTsKLQkJICAgIH0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKQotCXsKLQkgICAgZmluYWwgU3RyaW5nIHZtSW5zdGFsbFR5cGVJZCAKLQkgICAgICAgID0gdGhpcy5yYy5nZXRQcm9wZXJ0eSggU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlBST1BfVk1fSU5TVEFMTF9UWVBFICk7Ci0JICAgIAotCSAgICBmaW5hbCBTdHJpbmcgdm1JbnN0YWxsSWQKLQkgICAgICAgID0gdGhpcy5yYy5nZXRQcm9wZXJ0eSggU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlBST1BfVk1fSU5TVEFMTF9JRCApOwotCSAgICAKLQkgICAgaWYoIHZtSW5zdGFsbFR5cGVJZCA9PSBudWxsIHx8IHZtSW5zdGFsbElkID09IG51bGwgKQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotCSAgICAKLQkgICAgZmluYWwgSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoIHZtSW5zdGFsbFR5cGVJZCApOwotCSAgICAKLQkgICAgaWYoIHZtSW5zdGFsbFR5cGUgPT0gbnVsbCApCi0JICAgIHsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gdm1JbnN0YWxsVHlwZS5maW5kVk1JbnN0YWxsKCB2bUluc3RhbGxJZCApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotCQotCSAgICBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSAKLQkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSUNsYXNzcGF0aFByb3ZpZGVyLmNsYXNzIH07Ci0KLQkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSAKLQkJewotICAgICAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkgCi0JCXsKLQkJCUlSdW50aW1lQ29tcG9uZW50IHJjID0gKElSdW50aW1lQ29tcG9uZW50KSBhZGFwdGFibGU7Ci0JCQlyZXR1cm4gbmV3IFN0YW5kYXJkSnJlQ2xhc3NwYXRoUHJvdmlkZXIocmMpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1N0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvU3RhbmRhcmRKcmVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDY4NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvU3RhbmRhcmRKcmVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFN0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlciAKLQotICAgIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmM7Ci0KLSAgICBwdWJsaWMgU3RhbmRhcmRKcmVDb21wb25lbnRMYWJlbFByb3ZpZGVyKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyApIAotICAgIHsKLSAgICAgICAgdGhpcy5yYyA9IHJjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgPSB0aGlzLnJjLmdldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCk7Ci0gICAgICAgIHJldHVybiAiSmF2YSBSdW50aW1lIEVudmlyb25tZW50IHYiICsgcmN2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuY2xhc3MgfTsKLQotICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhbmRhcmRKcmVDb21wb25lbnRMYWJlbFByb3ZpZGVyKCAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZU9iamVjdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmZiMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotZmFjZXQtY29yZS5qYXIKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MjEyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9kZWxlZ2F0ZS9jYWxscyA9IGZhbHNlCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hY3Rpb25Tb3J0aW5nID0gZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2FjdGl2YXRpb24gPSBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTllNWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MyNmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1dlZCBKYW4gMzEgMTU6MzI6MTIgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2MzgwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWksb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSxvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cyIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhlNTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFlNGVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Ij4KLSAgPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MGExYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wbHVnaW5OYW1lID0gRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBDb3JlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotYnVpbGRlck5hbWUgPSBGYWNldGVkIFByb2plY3QgVmFsaWRhdGlvbiBCdWlsZGVyCi12YWxpZGF0aW9uTWFya2VyTmFtZSA9IEZhY2V0ZWQgUHJvamVjdCBQcm9ibGVtCi1leHRQb2ludExpc3RlbmVycyA9IEZhY2V0ZWQgUHJvamVjdCBMaXN0ZW5lcnMgRXh0ZW5zaW9uIFBvaW50Ci1leHRQb2ludFByZXNldHMgPSBGYWNldGVkIFByb2plY3QgUHJlc2V0cwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFmN2Y4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbi1wb2ludCAKLSAgICBpZD0iZmFjZXRzIgotICAgIG5hbWU9IlByb2plY3QgRmFjZXRzIEV4dGVuc2lvbiBQb2ludCIKLSAgICBzY2hlbWE9InNjaGVtYXMvZmFjZXRzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJydW50aW1lcyIKLSAgICBuYW1lPSJSdW50aW1lcyBFeHRlbnNpb24gUG9pbnQiCi0gICAgc2NoZW1hPSJzY2hlbWFzL3J1bnRpbWVzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJydW50aW1lQnJpZGdlcyIKLSAgICBuYW1lPSJSdW50aW1lIEJyaWRnZXMgRXh0ZW5zaW9uIFBvaW50IgotICAgIHNjaGVtYT0ic2NoZW1hcy9ydW50aW1lQnJpZGdlcy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbi1wb2ludCAKLSAgICBpZD0iZGVmYXVsdEZhY2V0cyIKLSAgICBuYW1lPSJEZWZhdWx0IEZhY2V0cyBFeHRlbnNpb24gUG9pbnQiCi0gICAgc2NoZW1hPSJzY2hlbWFzL2RlZmF1bHRGYWNldHMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24tcG9pbnQgCi0gICAgaWQ9InZhbGlkYXRvcnMiCi0gICAgbmFtZT0iRmFjZXRlZCBQcm9qZWN0IFZhbGlkYXRvcnMgRXh0ZW5zaW9uIFBvaW50IgotICAgIHNjaGVtYT0ic2NoZW1hcy92YWxpZGF0b3JzLmV4c2QiLz4KLSAgICAKLSAgPGV4dGVuc2lvbi1wb2ludCAKLSAgICBpZD0ibGlzdGVuZXJzIiAKLSAgICBuYW1lPSIlZXh0UG9pbnRMaXN0ZW5lcnMiIAotICAgIHNjaGVtYT0ic2NoZW1hcy9saXN0ZW5lcnMuZXhzZCIvPgotICAgIAotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJwcmVzZXRzIiAKLSAgICBuYW1lPSIlZXh0UG9pbnRQcmVzZXRzIiAKLSAgICBzY2hlbWE9InNjaGVtYXMvcHJlc2V0cy5leHNkIi8+Ci0gIAotICA8ZXh0ZW5zaW9uCi0gICAgaWQ9Im5hdHVyZSIKLSAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+Ci0gICAgPHJ1bnRpbWU+Ci0gICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdE5hdHVyZSIvPgotICAgIDwvcnVudGltZT4KLSAgICA8YnVpbGRlciBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuYnVpbGRlciIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICBpZD0iYnVpbGRlciIKLSAgICBuYW1lPSIlYnVpbGRlck5hbWUiCi0gICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICA8YnVpbGRlciBoYXNOYXR1cmU9InRydWUiPgotICAgICAgPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlciIvPgotICAgIDwvYnVpbGRlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIAotICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIgotICAgIGlkPSJ2YWxpZGF0aW9uLm1hcmtlciIKLSAgICBuYW1lPSIldmFsaWRhdGlvbk1hcmtlck5hbWUiPgotICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+Ci0gICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5IAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0QWRhcHRlciIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIKLSAgICAgIHByb3BlcnRpZXM9InByb2plY3RGYWNldCIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMiPgotICAgIDxkeW5hbWljLXByZXNldCBpZD0iZGVmYXVsdC5jb25maWd1cmF0aW9uIj4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkiLz4KLSAgICA8L2R5bmFtaWMtcHJlc2V0PgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzIj4KLSAgICA8ZHluYW1pYy1wcmVzZXQgaWQ9Im1pbmltYWwuY29uZmlndXJhdGlvbiI+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuTWluaW1hbENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5Ii8+Ci0gICAgPC9keW5hbWljLXByZXNldD4KLSAgPC9leHRlbnNpb24+Ci0gIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvZGVmYXVsdEZhY2V0cy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL2RlZmF1bHRGYWNldHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3NDRlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvZGVmYXVsdEZhY2V0cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgaWQ9ImRlZmF1bHRGYWNldHMiIG5hbWU9IkRlZmF1bHQgRmFjZXRzIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2VkIHRvIHNwZWNpZnkgd2hpY2ggZmFjZXRzIChhbmQgd2hpY2ggdmVyc2lvbnMgb2YgdGhvc2UgZmFjZXRzKSBzaG91bGQgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGEgcHJvamVjdC4gVGhlIG9wdGlvbmFsIGNvbnRleHQgZWxlbWVudCBhbGxvd3MgdGhlIGV4dGVuZGVyIHRvIGNvbnRyb2wgdGhlIHNpdHVhdGlvbnMgd2hlbiB0aGUgcHJvdmlkZWQgZmFjZXRzIHNob3VsZCBiZSBjb250cmlidXRlZCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBUaGUgY29udGV4dCBjYW4gcmVzdHJpY3QgYXBwbGljYWJpbGl0eSB0byBzcGVjaWZpYyBydW50aW1lIHR5cGVzIGFuZC9vciBzcGVjaWZpYyBmaXhlZCBmYWNldHMuIElmIG11bHRpcGxlIGV4dGVuc2lvbnMgYXJlIGFwcGxpY2FibGUgaW4gYSBnaXZlbiBzaXR1YXRpb25zLCB0aGUgZmFjZXRzIHNwZWNpZmllZCBpbiB0aGVzZSBleHRlbnNpb25zIHdpbGwgYmUgbWVyZ2VkIHRvIGZvcm0gYSB1bmlmaWVkIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVmYXVsdC1mYWNldHMiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVmYXVsdC1mYWNldHMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIGV4dGVuc2lvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGV4dCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZS1jb21wb25lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjZXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lLWNvbXBvbmVudCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSB0aGUgcHJpbWFyeSB0YXJnZXRlZCBydW50aW1lIGZvciB0aGUgcHJvamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIGEgcnVudGltZSBjb21wb25lbnQgb2Ygc3BlY2lmaWVkIHR5cGUgaW4gb3JkZXIgZm9yIHRoZXNlIGRlZmF1bHQgZmFjZXRzIHRvIGFwcGx5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBSdW50aW1lIGNvbXBvbmVudCB0eXBlIGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXRjaCBleHByZXNzaW9uIGZvciB0aGUgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbi4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLiBJZiB0aGUgdmVyc2lvbiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgYW55IHZlcnNpb24gd2lsbCBzYXRpc2Z5IHRoZSBjb25kaXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgcHJvamVjdCBmYWNldCBpZCBhbmQgdmVyc2lvbgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJvamVjdCBmYWNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRleHQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlc2NyaWJlcyB0aGUgc2l0dWF0aW9uIHdoZW4gdGhlIHNwZWNpZmllZCBmYWNldHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0IHNldC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZS1jb21wb25lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZml4ZWQtZmFjZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaXhlZC1mYWNldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIHNwZWNpZmllZCBmYWNldCBuZWVkcyB0byBiZSBvbmUgb2YgdGhlIHByb2plY3QmYXBvcztzIGZpeGVkIGZhY2V0cyBpbiBvcmRlciBmb3IgdGhlc2UgZGVmYXVsdCBmYWNldHMgdG8gYXBwbHkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZml4ZWQgZmFjZXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7VGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmVzIGZhY2V0MSAodmVyc2lvbiAxLjMpIGFuZCBmYWNldDIgKHZlcnNpb24gNS4wKSBhcyBkZWZhdWx0IGZhY2V0cyBmb3IgcnVudGltZSBjb21wb25lbnQgTXlSdW50aW1lQ29tcG9uZW50LiZsdDsvcCZndDsgCi0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHMmcXVvdDsmZ3Q7Ci0gICZsdDtkZWZhdWx0LWZhY2V0cyZndDsKLSAgICAmbHQ7Y29udGV4dCZndDsKLSAgICAgICZsdDtydW50aW1lLWNvbXBvbmVudCBpZD0mcXVvdDtNeVJ1bnRpbWVDb21wb25lbnQmcXVvdDsvJmd0OwotICAgICZsdDsvY29udGV4dCZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7ZmFjZXQxJnF1b3Q7IHZlcnNpb249JnF1b3Q7MS4zJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7ZmFjZXQyJnF1b3Q7IHZlcnNpb249JnF1b3Q7NS4wJnF1b3Q7LyZndDsKLSAgJmx0Oy9kZWZhdWx0LWZhY2V0cyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0KLSZsdDtwJmd0O011bHRpcGxlIHBsdWdpbnMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNldCBvZiB0aGUgZGVmYXVsdCBmYWNldHMgZm9yIGEgZ2l2ZW4gcnVudGltZSBjb21wb25lbnQuIElmIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBjb21iaW5lZCB3aXRoIHRoZSBmaXJzdCBvbmUsIHRoZXJlIHdpbGwgYmUgdGhyZWUgZGVmYXVsdCBmYWNldHMgYXNzb2NpYXRlZCB3aXRoIE15UnVudGltZUNvbXBvbmVudC4mbHQ7L3AmZ3Q7Ci0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHMmcXVvdDsmZ3Q7Ci0gICZsdDtkZWZhdWx0LWZhY2V0cyZndDsKLSAgICAmbHQ7Y29udGV4dCZndDsKLSAgICAgICZsdDtydW50aW1lLWNvbXBvbmVudCBpZD0mcXVvdDtNeVJ1bnRpbWVDb21wb25lbnQmcXVvdDsvJmd0OwotICAgICZsdDsvY29udGV4dCZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7ZmFjZXQzJnF1b3Q7IHZlcnNpb249JnF1b3Q7MS4yJnF1b3Q7LyZndDsKLSAgJmx0Oy9kZWZhdWx0LWZhY2V0cyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0KLSZsdDtwJmd0O0Z1cnRoZXIgY29udGV4dCBpbmZvcm1hdGlvbiBjYW4gYmUgc3BlY2lmaWVkIHRvIGNvbnRyb2wgd2hlbiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgZmFjZXRzIHNob3VsZCBiZSB1c2VkLiBDb25zaWRlciB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgcGFydGljdWxhciBmYWNldCBzaG91bGQgb25seSBiZSBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlIChhcyByZXByZXNlbnRlZCBieSBmaXhlZCBmYWNldHMpLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGZhY2V0NCB3aWxsIGJlIG9ubHkgZW5hYmxlZCBieSBkZWZhdWx0IGlmIG9uZSBvZiB0aGUgcHJvamVjdCZhcG9zO3MgZml4ZWQgZmFjZXRzIGlzIGZpeGVkLmZhY2V0MS4mbHQ7L3AmZ3Q7Ci0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHMmcXVvdDsmZ3Q7Ci0gICZsdDtkZWZhdWx0LWZhY2V0cyZndDsKLSAgICAmbHQ7Y29udGV4dCZndDsKLSAgICAgICZsdDtydW50aW1lLWNvbXBvbmVudCBpZD0mcXVvdDtNeVJ1bnRpbWVDb21wb25lbnQmcXVvdDsvJmd0OwotICAgICAgJmx0O2ZpeGVkLWZhY2V0IGlkPSZxdW90O2ZpeGVkLmZhY2V0MSZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9jb250ZXh0Jmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldDQmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsvJmd0OwotICAmbHQ7L2RlZmF1bHQtZmFjZXRzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvZmFjZXRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvZmFjZXRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTc1NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL2ZhY2V0cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBpZD0iZmFjZXRzIiBuYW1lPSJQcm9qZWN0IEZhY2V0cyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyB0aGUgbWFpbiBleHRlbnNpb24gcG9pbnQgaW4gdGhlIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmsuIEl0IGlzIHVzZWQgZm9yIGRlZmluaW5nIHByb2plY3QgZmFjZXRzLiBBIHByb2plY3QgZmFjZXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgdXNlciBjYW4gYWRkIHRvIHRoZSBwcm9qZWN0IHdoZW4gdGhlIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9qZWN0LWZhY2V0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3QtZmFjZXQtdmVyc2lvbiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcmVzZXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGVtcGxhdGUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWN0aW9uIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV2ZW50LWhhbmRsZXIiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZ3JvdXAiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgbG9jYWxpemFibGUgbmFtZSB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlci4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGlkIHdpbGwgYmUgdXNlZCBmb3IgYSBsYWJlbC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHRleHQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFuZCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBmYWNldCBjb25zdHJhaW50IG9wZXJhdG9yIHRoYXQgcGVyZm9ybXMgYSBjb25qdW5jdGlvbiBvdmVyIHRoZSByZXN1bHRzIG9mIGV2YWx1YXRpb24gb2YgdHdvIG9yIG1vcmUgc3ViLWV4cHJlc3Npb25zLiBUaGlzIG9wZXJhdG9yIHdpbGwgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgYWxsIHN1Yi1leHByZXNzaW9ucyBldmFsdWF0ZSB0byB0cnVlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlcXVpcmVzIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbmZsaWN0cyIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBmYWNldCBjb25zdHJhaW50IG9wZXJhdG9yIHRoYXQgcGVyZm9ybXMgYSBkaXNqdW5jdGlvbiBvdmVyIHRoZSByZXN1bHRzIG9mIGV2YWx1YXRpb24gb2YgdHdvIG9yIG1vcmUgc3ViLWV4cHJlc3Npb25zLiBUaGlzIG9wZXJhdG9yIHdpbGwgcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBzdWItZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8gdHJ1ZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXF1aXJlcyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb25mbGljdHMiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVxdWlyZXMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgZmFjZXQgY29uc3RyYWludCBvcGVyYXRvciB0aGF0IGlzIHVzZWQgdG8gZGVjbGFyZSBhIGRlcGVuZGVuY3kgb2Ygb25lIGZhY2V0IG9uIGFub3RoZXIgZmFjZXQgb3IgYW55IG1lbWJlciBvZiBhIGdyb3VwIG9mIGZhY2V0cy4gVGhpcyBvcGVyYXRvciB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBkZXBlbmRlbmN5IGlzIHNhdGlzZmllZC4gTm90ZSB0aGF0IHRoZSBncm91cCBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIGZhY2V0IGFuZCB2ZXJzaW9uIGF0dHJpYnV0ZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZmFjZXQgZ3JvdXAgdGhhdCB0aGlzIGZhY2V0IGlzIGRlY2xhcmluZyBhIGRlcGVuZGVuY3kgb24uIEFueSBtZW1iZXIgb2YgdGhlIGdyb3VwIHdpbGwgc2F0aXNmeSB0aGUgZGVwZW5kZW5jeS4gVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGZhY2V0IGFuZCB2ZXJzaW9uIGF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBmYWNldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbWF0Y2ggZXhwcmVzc2lvbiBmb3IgdGhlIGZhY2V0IHZlcnNpb24uIFRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBvZiB0aGUgZm9ybSAmcXVvdDsyLjIsMi41LFszLjAtNS4zXSwoNy4zJnF1b3Q7LCB3aGVyZSB0aGUgY29tYXMgZnVuY3Rpb24gYXMgYW4gT1IuIEJyYWNrZXRzIGFuZCBwYXJlbnRoZXNpcyBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSByYW5nZSBub3RhdGlvbi4gQSBicmFja2V0IG1lYW5zIGluY2x1c2l2ZSB3aGlsZSBhIHBhcmVudGhlc2lzIG1lYW5zIGV4Y2x1c2l2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb2Z0IiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gdHJ1ZSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgc29mdCBkZXBlbmRlbmN5LiBBIHNvZnQgZGVwZW5kZW5jeSB3aWxsIG5vdCBwcmV2ZW50IHRoZSBmYWNldCBmcm9tIGJlaW5nIGluc3RhbGxlZCBpZiBpdCBpcyBub3QgbWV0LiBUaGUgcHVycG9zZSBvZiBzcGVjaWZ5aW5nIGEgc29mdCBkZXBlbmRlbmN5IGlzIHRvIGNvbnRyb2wgZmFjZXQgaW5zdGFsbGF0aW9uIG9yZGVyLiBJZiBmYWNldCBBIGRlY2xhcmVzIGEgc29mdCBkZXBlbmRlbmN5IG9uIGZhY2V0IEIsIGZhY2V0IEEgaXMgZ3VhcmFudGVlZCB0byBiZSBpbnN0YWxsZWQgYWZ0ZXIgQiBoYXMgYmVlbiBpbnN0YWxsZWQgKGFzc3VtaW5nIEIgaXMgc2VsZWN0ZWQpLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb25mbGljdHMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgZmFjZXQgY29uc3RyYWludCBvcGVyYXRvciB0aGF0IGlzIHVzZWQgdG8gZGVjbGFyZSBhIGNvbmZsaWN0IGJldHdlZW4gdGhpcyBmYWNldCBhbmQgYW5vdGhlciBmYWNldCBvciB0aGlzIGZhY2V0IGFuZCBhIGdyb3VwIG9mIGZhY2V0cy4gVGhpcyBvcGVyYXRvciB3aWxsIHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBjb25mbGljdCBpcyBub3QgcHJlc2VudC4gTm90ZSB0aGF0IHRoZSBncm91cCBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIGZhY2V0IGFuZCB2ZXJzaW9uIGF0dHJpYnV0ZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZmFjZXQgZ3JvdXAgdGhhdCB0aGlzIGZhY2V0IGNvbmZsaWN0cyB3aXRoLiBOb3RlIHRoYXQgaXQgaXMgc2FmZSBmb3IgdGhlIGRlY2xhcmluZyBmYWNldCB0byBiZSBhIG1lbWJlciBvZiB0aGlzIGdyb3VwLiBDb25mbGljdHMgYmV0d2VlbiB0aGUgZmFjZXQgYW5kIGl0c2VsZiBhcmUgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGZhY2V0IGFuZCB2ZXJzaW9uIGF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBmYWNldCB0aGF0IHRoaXMgZmFjZXQgY29uZmxpY3RzIHdpdGguIElmIHRoZSB2ZXJzaW9uIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBjb25mbGljdCBkZWNsYXJhdGlvbiB3aWxsIGJlIGxpbWl0ZWQgdG8gdGhvc2UgdmVyc2lvbnMgY292ZXJlZCBieSB0aGUgdmVyc2lvbiBleHByZXNzaW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBmYWNldCBhdHRyaWJ1dGUgdG8gbGltaXQgdGhlIHZlcnNpb25zIGNvdmVyZWQgYnkgdGhlIGNvbmZsaWN0IGRlY2xhcmF0aW9uLiBUaGUgdmVyc2lvbiBleHByZXNzaW9uIHNob3VsZCBiZSBvZiB0aGUgZm9ybSAmcXVvdDsyLjIsMi41LFszLjAtNS4zXSwoNy4zJnF1b3Q7LCB3aGVyZSB0aGUgY29tYXMgZnVuY3Rpb24gYXMgYW4gT1IuIEJyYWNrZXRzIGFuZCBwYXJlbnRoZXNpcyBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSByYW5nZSBub3RhdGlvbi4gQSBicmFja2V0IG1lYW5zIGluY2x1c2l2ZSB3aGlsZSBhIHBhcmVudGhlc2lzIG1lYW5zIGV4Y2x1c2l2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29uc3RyYWludCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjb25zdHJhaW50IHRoYXQgaGFzIHRvIGJlIHNhdGlzZmllZCBiZWZvcmUgdGhpcyBmYWNldCBjYW4gYmUgaW5zdGFsbGVkIGluIGEgcHJvamVjdC4gQSBjb25zdHJhaW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGZhY2V0cyBhcyB3ZWxsIGFzIGNvbmZsaWN0cy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXF1aXJlcyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb25mbGljdHMiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZ3JvdXAtbWVtYmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBNYWtlcyB0aGlzIGZhY2V0IGEgbWVtYmVyIG9mIHRoZSBncm91cCBzcGVjaWZpZWQgaW4gdGhlIGlkIGF0dHJpYnV0ZS4gQSBmYWNldCBjYW4gYmUgYSBtZW1iZXIgb2YgYW55IG51bWJlciBvZiBncm91cHMuIEdyb3VwcyBhcmUgYXV0by1jcmVhdGVkIHdoZW4gcmVmZXJlbmNlZCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludC4gVGhlIGZhY2V0IGdyb3VwcyBhcmUgcHJpbWFyaWx5IHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGNvbmZsaWN0IGNvbnN0cmFpbnRzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGZhY2V0IGdyb3VwIHRvIGFkZCB0aGlzIGZhY2V0IHRvLiBHcm91cHMgYXJlIGF1dG8tY3JlYXRlZCB3aGVuIHJlZmVyZW5jZWQgYnkgdGhpcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3QtZmFjZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgcHJvamVjdCBmYWNldC4gQSBwcm9qZWN0IGZhY2V0IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgdW5pdCBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgdGhlIHVzZXIgY2FuIGFkZCB0byB0aGUgcHJvamVjdCB3aGVuIHRoZSBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZC4gTm90ZSB0aGF0IGEgZmFjZXQgbmVlZCB0byBoYXZlIGEgbGVhc3Qgb25lIHZlcnNpb24gZGVjbGFyZWQgaW4gb3JkZXIgdG8gYmUgdXNlZnVsLiBTZWUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhYmVsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmVyc2lvbi1jb21wYXJhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZWZhdWx0LXZlcnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1lbWJlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFByb2plY3QgZmFjZXQgaWRlbnRpZmllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvamVjdC1mYWNldC12ZXJzaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIHByb2plY3QgZmFjZXQgdmVyc2lvbi4gRWFjaCBmYWNldCBuZWVkcyB0byBoYXZlIGF0IGxlYXMgb25lIHZlcnNpb24gZGVjbGFyZWQgaW4gb3JkZXIgdG8gYmUgdXNlZnVsLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJncm91cC1tZW1iZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV2ZW50LWhhbmRsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgaXMgYSB2ZXJzaW9uIG9mLiBUaGUgZmFjZXQgaXRzZWxmIG5lZWRzIHRvIGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBwcm9qZWN0LWZhY2V0IGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmVyc2lvbiBzdHJpbmcuIEhhcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gY29tcGFyYXRvciBzcGVjaWZpZWQgZm9yIHRoaXMgZmFjZXQgb3IgdXNlIHRoZSBzdGFuZGFyZCBkZWNpbWFsIHZlcnNpb24gbm90YXRpb24gKGkuZS4gMS4yMy4wMDUpIGlmIHRoZSBmYWNldCBkb2VzIG5vdCBzcGVjaWZ5IGEgY3VzdG9tIHZlcnNpb24gY29tcGFyYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmVyc2lvbi1jb21wYXJhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHZlcnNpb24gY29tcGFyYXRvciBmb3IgdGhpcyBwcm9qZWN0IGZhY2V0LiBJZiBubyB2ZXJzaW9uIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3Igd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgY2FuIGhhbmRsZSB2ZXJzaW9ucyB0aGF0IGFyZSB3cml0dGVuIGluIHN0YW5kYXJkIGRlY2ltYWwgbm90YXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2ZXJzaW9uIGNvbXBhcmF0b3IgY2xhc3MgbmFtZS4gSGFzIHRvIGltcGxlbWVudCBqYXZhLnV0aWwuQ29tcGFyYXRvciZhbXA7bHQ7U3RyaW5nJmFtcDtndDsgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iamF2YS51dGlsLkNvbXBhcmF0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgcHJvamVjdCBmYWNldHMgY2F0ZWdvcnkuIENhdGVnb3JpZXMgYXJlIGdyb3VwcyBvZiBmYWNldHMgdGhhdCB0aGUgdXNlciB3aWxsIHR5cGljYWxseSB3YW50IHRvIGFkZCBvciByZW1vdmUgYXMgYSBzZXQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhYmVsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjYXRlZ29yeSBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJlc2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBwcmVzZXQuIEEgcHJlc2V0IHJlcHJlc2VudHMgYSBjb21tb24gY29uZmlndXJhdGlvbiBvZiBmYWNldHMgYW5kIHRoZWlyIHZlcnNpb25zIHRoYXQgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gdXRpbGl6ZSBvbiBzZXZlcmFsIHByb2plY3RzLiBQcmVzZXRzIGNhbiBiZSBzdXBwbGllZCB2aWEgdGhpcyBleHRlbnNpb24gcG9pbnQgb3IgY3JlYXRlZCBieSB0aGUgdXNlci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGFiZWwiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJlc2V0IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0ZW1wbGF0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSB0ZW1wbGF0ZS4gQSB0ZW1wbGF0ZSBpcyBzaW1wbHkgYSBjb21iaW5hdGlvbiBvZiBmaXhlZCBmYWNldHMgYW5kIGFuIG9wdGlvbmFsIHByZXNldC4gVGVtcGxhdGVzIGFyZSB1c2VkIGFzIGEgZ3VpZGUgd2hlbiBjcmVhdGlvbiBwcm9qZWN0cy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGFiZWwiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZml4ZWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJlc2V0Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdGVtcGxhdGUgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpeGVkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgYW4gYWN0aW9uLCBzdWNoIGFzIGluc3RhbGwgb3IgdW5pbnN0YWxsLCB0aGF0IGEgdXNlciBjYW4gdGFrZSBvbiBhIHByb2plY3QgZmFjZXQuIEFueSBhY3Rpb24gdGhhdCZhcG9zO3Mgbm90IGltcGxlbWVudGVkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci4gVGhlIGFjdGlvbiBlbGVtZW50IGNhbiBiZSB1c2VkIHN0YW5kYWxvbmUgb3IgZW1iZWRlZCBpbnNpZGUgdGhlIHByb2plY3QtZmFjZXQtdmVyc2lvbiBlbGVtZW50LiBJZiB1c2VkIGluc2lkZSB0aGUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGVsZW1lbnQsIHRoZSBmYWNldCBhbmQgdmVyc2lvbiBhdHRyaWJ1dGVzIGFyZSBpbXBsaWVkIGFuZCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29uZmlnLWZhY3RvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlbGVnYXRlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBY3Rpb24gdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imluc3RhbGwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0idW5pbnN0YWxsIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InZlcnNpb24tY2hhbmdlIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJ1bnRpbWUtY2hhbmdlZCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlNUQUxMIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlVOSU5TVEFMTCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NIQU5HRSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHByb2plY3QgZmFjZXQgdGhhdCB0aGlzIGFjdGlvbiBhcHBsaWVzIHRvLiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBlbWJlZGluZyB0aGUgYWN0aW9uIGVsZW1lbnQgaW5zaWRlIHRoZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBhY3Rpb24gYXBwbGllcyB0by4gTXVsdGlwbGUgdmVyc2lvbnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB2ZXJzaW9uIGV4cHJlc3Npb24gc3ludGF4LiBUaGUgdmVyc2lvbiBleHByZXNzaW9uIHNob3VsZCBiZSBvZiB0aGUgZm9ybSAmcXVvdDsyLjIsMi41LFszLjAtNS4zXSwoNy4zJnF1b3Q7LCB3aGVyZSB0aGUgY29tYXMgZnVuY3Rpb24gYXMgYW4gT1IuIEJyYWNrZXRzIGFuZCBwYXJlbnRoZXNpcyBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSByYW5nZSBub3RhdGlvbi4gQSBicmFja2V0IG1lYW5zIGluY2x1c2l2ZSB3aGlsZSBhIHBhcmVudGhlc2lzIG1lYW5zIGV4Y2x1c2l2ZS4gVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZW1iZWRpbmcgdGhlIGFjdGlvbiBlbGVtZW50IGluc2lkZSB0aGUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGFjdGlvbiBpZC4gSWYgbm90IHNwZWNpZmllZCwgYSBkZWZhdWx0IGlkIHdpbGwgYmUgYXNzaWduZWQgdXNpbmcgdGhlICZxdW90O1tmYWNldC1pZF0jW3ZlcnNpb24tZXhwcmVzc2lvbl0jW2FjdGlvbi10eXBlXSZxdW90OyBwYXR0ZXJuLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb25maWctZmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmYWN0b3J5IHRoYXQgd2lsbCBjb25zdHJ1Y3QgYSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBiZSB1c2VkIGZvciBwYXJhbWV0ZXJpemluZyB0aGUgYWN0aW9uIGRlbGVnYXRlLiBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIG5vdCBuZWNlc3NhcnkgaWYgdGhlIGRlbGVnYXRlIGRvZXMgbm90IHJlcXVpcmUgcGFyYW1ldGVyaXphdGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNvbmZpZyBmYWN0b3J5IGNsYXNzIG5hbWUuIEhhcyB0byBpbXBsZW1lbnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVsZWdhdGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZGVsZWdhdGUgdGhhdCBzaG91bGQgYmUgaW52b2tlZCB3aGVuIGFuIGFjdGlvbiBvciBhbiBldmVudCBoYXBwZW5zLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVsZWdhdGUgY2xhc3MgbmFtZS4gSGFzIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGUgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV2ZW50LWhhbmRsZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBZGRzIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG9uZSBvZiB0aGUgZXZlbnRzIGluIHRoZSBmYWNldGVkIHByb2plY3QgbGlmZSBjeWNsZS4gVGhlIGV2ZW50LWhhbmRsZXIgZWxlbWVudCBjYW4gYmUgdXNlZCBzdGFuZGFsb25lIG9yIGVtYmVkZWQgaW5zaWRlIHRoZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZWxlbWVudC4gSWYgdXNlZCBpbnNpZGUgdGhlIHByb2plY3QtZmFjZXQtdmVyc2lvbiBlbGVtZW50LCB0aGUgZmFjZXQgYW5kIHZlcnNpb24gYXR0cmlidXRlcyBhcmUgaW1wbGllZCBhbmQgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuJmx0O2JyLyZndDsmbHQ7YnIvJmd0OwotCi0mbHQ7YiZndDtEZXByZWNhdGlvbiBOb3RlczombHQ7L2ImZ3Q7IFRoaXMgcGFydCBvZiB0aGUgZmFjZXRzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLiBUaGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlzdGVuZXJzIGV4dGVuc2lvbiBwb2ludCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZWxlZ2F0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIGV2ZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUFJFX0lOU1RBTEwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVF9JTlNUQUxMIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBSRV9VTklOU1RBTEwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVF9VTklOU1RBTEwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUFJFX1ZFUlNJT05fQ0hBTkdFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBPU1RfVkVSU0lPTl9DSEFOR0UiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUlVOVElNRV9DSEFOR0VEIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgZXZlbnQgaGFuZGxlciBhcHBsaWVzIHRvLiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBlbWJlZGluZyB0aGUgZXZlbnQtaGFuZGxlciBlbGVtZW50IGluc2lkZSB0aGUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgZXZlbnQgaGFuZGxlciBhcHBsaWVzIHRvLiBNdWx0aXBsZSB2ZXJzaW9ucyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHZlcnNpb24gZXhwcmVzc2lvbiBzeW50YXguIFRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBlbWJlZGluZyB0aGUgZXZlbnQtaGFuZGxlciBlbGVtZW50IGluc2lkZSB0aGUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3BlcnR5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTZXRzIGEgcHJvcGVydHkgb24gdGhlIGNvbnRhaW5pbmcgY29udGV4dC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVmYXVsdC12ZXJzaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBVc2VkIHRvIHByb3ZpZGUgdGhlIGZhY2V0IHZlcnNpb24gdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gSWYgYSBkZWZhdWx0IHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGxhdGVzdCB2ZXJzaW9uIHdpbGwgYmUgdXNlZC4gTm90ZSB0aGF0IGlmIGEgcnVudGltZSBpcyBzZWxlY3RlZCwgdGhlIHJ1bnRpbWUgY2FuIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCB3aXRoIGEgdmVyc2lvbiBiZXN0IHN1aXRlZCBmb3IgdGhhdCBydW50aW1lLiBUaGUgZGVmYXVsdCBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBzdGF0aWNhbGx5IGJ5IHVzaW5nIHRoZSAmbHQ7Y29kZSZndDt2ZXJzaW9uJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgb3IgZHluYW1pY2FsbHkgYnkgaW1wbGVtZW50aW5nIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVmYXVsdFZlcnNpb25Qcm92aWRlciZsdDsvY29kZSZndDsgaW50ZXJmYWNlIGFuZCB1c2luZyB0aGUgJmx0O2NvZGUmZ3Q7cHJvdmlkZXImbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHZlcnNpb24gdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdC4gVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZiB0aGUgJmx0O2NvZGUmZ3Q7cHJvdmlkZXImbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB2ZXJzaW9uIHByb3ZpZGVyIHRoYXQgd2lsbCBiZSBjb25zdWx0ZWQgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHZlcnNpb24uIElmIHRoaXMgYXR0cmlidXRlIGlzIHVzZWQsIHRoZSAmbHQ7Y29kZSZndDt2ZXJzaW9uJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGlmIHByZXNlbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVmYXVsdFZlcnNpb25Qcm92aWRlciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJncm91cCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVzY3JpYmVzIGEgcHJvamVjdCBmYWNldCBncm91cC4gQSBncm91cCBpcyBhIG5hbWVkIGNvbGxlY3Rpb24gb2YgcHJvamVjdCBmYWNldCB2ZXJzaW9ucy4gSXQgaXMgdXNlZCBwcmltYXJpbHkgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlICZxdW90O3JlcXVpcmVzJnF1b3Q7IGFuZCAmcXVvdDtjb25mbGljdHMmcXVvdDsgY29uc3RyYWludHMgYW5kIGFsbG93cyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIHdoZXJlIGEgZmFjZXQgZG9lcyBub3QgbmVlZCB0byBrbm93IGFib3V0IGFsbCB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEEgZ2l2ZW4gcHJvamVjdCBmYWNldCB2ZXJzaW9uIGNhbiBiZWxvbmcgdG8gc2V2ZXJhbCBncm91cHMuIEdyb3VwcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdXNlZCBpbiB0aGUgJnF1b3Q7Z3JvdXAtbWVtYmVyJnF1b3Q7IGVsZW1lbnQsIHNvIGFuIGV4cGxpY2l0IGdyb3VwIGRlY2xhcmF0aW9uIGlzIG9wdGlvbmFsLiBIb3dldmVyLCBpdCBkb2VzIGFsbG93IGEgbGFiZWwgYW5kIGEgZGVzY3JpcHRpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBncm91cC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGFiZWwiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBHcm91cCBpZGVudGlmaWVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtZW1iZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFkZHMgdGhlIHByb2plY3QgZmFjZXQgYXMgYSBtZW1iZXIgb2YgYSBjYXRlZ29yeS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNhdGVnb3J5IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgdmFyaW91cyBmYWNpbGl0aWVzIGV4cG9zZWQgYnkgdGhpcyBleHRlbnNpb24gcG9pbnQuIFRoaXMgZXhhbXBsZSBpcyB0YWtlbiBmcm9tIHRoZSAmbHQ7aSZndDtCdWlsZGluZyBQcm9qZWN0IEZhY2V0cyZsdDsvaSZndDsgdHV0b3JpYWwuJmx0Oy9wJmd0OwotCi0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMmcXVvdDsmZ3Q7Ci0KLSAgJmx0O2NhdGVnb3J5IGlkPSZxdW90O2Zvcm1nZW4uY2F0ZWdvcnkmcXVvdDsmZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0O0Zvcm1HZW4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDtFbmFibGVzIGdlbmVyYXRpb24gb2YgSFRNTCBmb3JtcyBiYXNlZCBvbiBYTUwgZGVmaW5pdGlvbiBmaWxlcy4mbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAmbHQ7L2NhdGVnb3J5Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0IGlkPSZxdW90O2Zvcm1nZW4uY29yZSZxdW90OyZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7Rm9ybUdlbiBDb3JlJmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICBFbmFibGVzIGdlbmVyYXRpb24gb2YgSFRNTCBmb3JtcyBiYXNlZCBvbiBYTUwgZGVmaW5pdGlvbiBmaWxlcy4KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAgICZsdDtjYXRlZ29yeSZndDtmb3JtZ2VuLmNhdGVnb3J5Jmx0Oy9jYXRlZ29yeSZndDsKLSAgJmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9JnF1b3Q7Zm9ybWdlbi5jb3JlJnF1b3Q7IHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7Jmd0OwotICAgICZsdDtjb25zdHJhaW50Jmd0OwotICAgICAgJmx0O3JlcXVpcmVzIGZhY2V0PSZxdW90O2pzdC53ZWImcXVvdDsgdmVyc2lvbj0mcXVvdDsyLjIsMi4zLDIuNCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9jb25zdHJhaW50Jmd0OwotICAgICZsdDthY3Rpb24gdHlwZT0mcXVvdDtJTlNUQUxMJnF1b3Q7IGlkPSZxdW90O2Zvcm1nZW4uY29yZS5pbnN0YWxsJnF1b3Q7Jmd0OwotICAgICAgJmx0O2NvbmZpZy1mYWN0b3J5IGNsYXNzPSZxdW90O2NvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWckRmFjdG9yeSZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7ZGVsZWdhdGUgY2xhc3M9JnF1b3Q7Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2FjdGlvbiZndDsKLSAgJmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQgaWQ9JnF1b3Q7Zm9ybWdlbi5leHQmcXVvdDsmZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0O0Zvcm1HZW4gRXh0ZW5zaW9ucyZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgRW5hYmxlcyBhZGRpdGlvbmFsIEZvcm1HZW4gd2lkZ2V0cy4KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAgICZsdDtjYXRlZ29yeSZndDtmb3JtZ2VuLmNhdGVnb3J5Jmx0Oy9jYXRlZ29yeSZndDsKLSAgJmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9JnF1b3Q7Zm9ybWdlbi5leHQmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsmZ3Q7Ci0gICAgJmx0O2NvbnN0cmFpbnQmZ3Q7Ci0gICAgICAmbHQ7cmVxdWlyZXMgZmFjZXQ9JnF1b3Q7Zm9ybWdlbi5jb3JlJnF1b3Q7IHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gICAgJmx0O2FjdGlvbiB0eXBlPSZxdW90O0lOU1RBTEwmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZGVsZWdhdGUgY2xhc3M9JnF1b3Q7Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuRXh0RmFjZXRJbnN0YWxsRGVsZWdhdGUmcXVvdDsvJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDsKLQotICAmbHQ7cHJlc2V0IGlkPSZxdW90O2Zvcm1nZW4ucHJlc2V0JnF1b3Q7Jmd0OwotICAgICZsdDtsYWJlbCZndDtGb3JtR2VuIFdlYiBQcm9qZWN0Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Q3JlYXRlcyBhIHdlYiBwcm9qZWN0IHdpdGggRm9ybUdlbiBmdW5jdGlvbmFsaXR5LiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2pzdC5qYXZhJnF1b3Q7IHZlcnNpb249JnF1b3Q7NS4wJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7anN0LndlYiZxdW90OyB2ZXJzaW9uPSZxdW90OzIuMiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2Zvcm1nZW4uY29yZSZxdW90OyB2ZXJzaW9uPSZxdW90OzEuMCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2Zvcm1nZW4uZXh0JnF1b3Q7IHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7LyZndDsKLSAgJmx0Oy9wcmVzZXQmZ3Q7Ci0gIAotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL2xpc3RlbmVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL2xpc3RlbmVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc4OWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9saXN0ZW5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIGlkPSJsaXN0ZW5lcnMiIG5hbWU9IkZhY2V0ZWQgUHJvamVjdCBMaXN0ZW5lcnMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBmb3IgcmVnaXN0cmF0aW9uIG9mIGxpc3RlbmVycyB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgbWV0YWRhdGEgb2YgZmFjZXRlZCBwcm9qZWN0cy4gVGhlIGZvbGxvd2luZyBldmVudCB0eXBlcyBhcmUgc3VwcG9ydGVkOiAKLQotJmx0O3AmZ3Q7Ci0mbHQ7Y29kZSZndDsKLVBST0pFQ1RfTU9ESUZJRUQmbHQ7YnIvJmd0OwotUFJFX0lOU1RBTEwmbHQ7YnIvJmd0OwotUE9TVF9JTlNUQUxMJmx0O2JyLyZndDsKLVBSRV9VTklOU1RBTEwmbHQ7YnIvJmd0OwotUE9TVF9VTklOU1RBTEwmbHQ7YnIvJmd0OwotUFJFX1ZFUlNJT05fQ0hBTkdFJmx0O2JyLyZndDsKLVBPU1RfVkVSU0lPTl9DSEFOR0UmbHQ7YnIvJmd0OwotRklYRURfRkFDRVRTX0NIQU5HRUQmbHQ7YnIvJmd0OwotVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCZsdDtici8mZ3Q7Ci1QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRAotJmx0Oy9jb2RlJmd0OwotJmx0Oy9wJmd0OwotCi0mbHQ7cCZndDtTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudC5UeXBlJmx0Oy9jb2RlJmd0OyBlbnVtIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZWFjaCBldmVudCB0eXBlLiZsdDsvcCZndDsKLQotJmx0O3AmZ3Q7SXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWdpc3RlciBsaXN0ZW5lcnMgaW4gY29kZSB1c2luZyBlaXRoZXIgJmx0O2NvZGUmZ3Q7RmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoKSZsdDsvY29kZSZndDsgb3IgJmx0O2NvZGUmZ3Q7SUZhY2V0ZWRQcm9qZWN0LmFkZExpc3RlbmVyKCkmbHQ7L2NvZGUmZ3Q7IG1ldGhvZHMuJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaXN0ZW5lciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgUmVnaXN0ZXJzIG9uZSBsaXN0ZW5lci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxpc3RlbmVyIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXZlbnRUeXBlcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IHR5cGVzIHRoYXQgdGhlIGxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZCBhYm91dC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVycyZxdW90OyZndDsKLSAgJmx0OyEtLSBMaXN0ZW4gdG8gYWxsIGV2ZW50cy4gLS0mZ3Q7Ci0gICZsdDtsaXN0ZW5lciBjbGFzcz0mcXVvdDtjb20ubXljb21wYW55Lm15cHJvZHVjdC5NeUxpc3RlbmVyMSZxdW90Oy8mZ3Q7Ci0gICZsdDshLS0gTGlzdGVuIHRvIHNwZWNpZmljIGV2ZW50cy4gLS0mZ3Q7Ci0gICZsdDtsaXN0ZW5lciBjbGFzcz0mcXVvdDtjb20ubXljb21wYW55Lm15cHJvZHVjdC5NeUxpc3RlbmVyMiZxdW90OyBldmVudFR5cGVzPSZxdW90O1BST0pFQ1RfTU9ESUZJRUQmcXVvdDsvJmd0OwotICAmbHQ7bGlzdGVuZXIgY2xhc3M9JnF1b3Q7Y29tLm15Y29tcGFueS5teXByb2R1Y3QuTXlMaXN0ZW5lcjImcXVvdDsgZXZlbnRUeXBlcz0mcXVvdDtQUkVfSU5TVEFMTCxGSVhFRF9GQUNFVFNfQ0hBTkdFRCZxdW90Oy8mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLiZsdDtici8mZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvcHJlc2V0cy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3ByZXNldHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjODM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvcHJlc2V0cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBpZD0icHJlc2V0cyIgbmFtZT0iRmFjZXRlZCBQcm9qZWN0IFByZXNldHMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQSBwcmVzZXQgcmVwcmVzZW50cyBhIGNvbW1vbiBjb25maWd1cmF0aW9uIG9mIGZhY2V0cyBhbmQgdGhlaXIgdmVyc2lvbnMgdGhhdCBnaXZlIGEgdXNlciBhIHN0YXJ0aW5nIHBvaW50IHdoZW4gY29uZmlndXJpbmcgYSBwcm9qZWN0LiBQcmVzZXRzIGNhbiBlaXRoZXIgYmUgc3RhdGljIG9yIGR5bmFtaWMuIFN0YXRpYyBwcmVzZXRzIGFyZSBmdWxseSBzcGVjaWZpZWQgaW4gdGhpcyBleHRlbnNpb24gcG9pbnQuIER5bmFtaWMgcHJlc2V0cyBhcmUgY3JlYXRlZCB1c2luZyBhbiBleHRlbmRlci1zdXBwbGllZCBmYWN0b3J5IHRoYXQgY2FuIHRha2UgaW50byBhY2NvdW50IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcmVzZXQgd2lsbCBiZSB1c2VkIGluLiBTdGF0aWMgcHJlc2V0cyBjYW4gYWxzbyBleHRlbmQgb3RoZXIgcHJlc2V0cy4KLQotJmx0O3AmZ3Q7VG8gcHJvZ3JhbW1hdGljYWxseSBkZWZpbmUgYSBwcmVzZXQsIHVzZSB0aGUgJmx0O2NvZGUmZ3Q7UHJvamVjdEZhY2V0c01hbmFnZXIuZGVmaW5lUHJlc2V0KCkmbHQ7L2NvZGUmZ3Q7IG1ldGhvZHMuJmx0Oy9jb2RlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdGF0aWMtcHJlc2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImR5bmFtaWMtcHJlc2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0YXRpYy1wcmVzZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSBzdGF0aWMgcHJlc2V0LiBBIHN0YXRpYyBwcmVzZXQgaXMgZnVsbHkgc3BlY2lmaWVkIGluIHRoZSBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhYmVsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwcmVzZXQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5kcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHByZXNldCB0aGF0IHRoaXMgcHJlc2V0IGlzIGV4dGVuZGluZy4gSWYgdGhlIGJhc2UgcHJlc2V0IGluY2x1ZGVzIGEgZmFjZXQgdGhhdCZhcG9zO3MgYWxzbyBzcGVjaWZpZWQgYnkgdGhpcyBwcmVzZXQgKGRlcml2ZWQpLCB0aGUgdmVyc2lvbiBvZiB0aGUgZmFjZXQgc3BlY2lmaWVkIGluIHRoZSBkZXJpdmVkIHByZXNldCB3aW5zLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgbG9jYWxpemFibGUgbmFtZSB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlci4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGlkIHdpbGwgYmUgdXNlZCBmb3IgYSBsYWJlbC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHRleHQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZhY2V0IHRoYXQgaXMgcGFydCBvZiB0aGlzIHByZXNldC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByb2plY3QgZmFjZXQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZmFjZXQgdmVyc2lvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZHluYW1pYy1wcmVzZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSBkeW5hbWljIHByZXNldC4gQSBkeW5hbWljIHByZXNldCB1c2VzIGEgZmFjdG9yeSB0byBzeW50aGVzaXplIHRoZSBwcmVzZXQgZGVmaW5pdGlvbiBvbiB0aGUgZmx5IGJhc2VkIG9uIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByZXNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmYWN0b3J5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXRGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzJnF1b3Q7Jmd0OwotCi0gICZsdDshLS0gRGVmaW5lcyBhIGR5bmFtaWMgcHJlc2V0IHdoaWNoIHdpbGwgYmUgc3ludGhlc2l6ZWQgYnkgdGhlIHByb3ZpZGVkIGZhY3RvcnkuIFRoaXMgcGFydGljdWxhciBwcmVzZXQKLSAgICAgICBpcyBhY3R1YWxseSBzdXBwbGllZCBieSB0aGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yay4gV2hhdCBpdCByZXNvbHZlcyB0byBkZXBlbmRzIG9uIHRoZSBjb250ZXh0LgotICAgICAgIElmIHByb2plY3QgZG9lcyBub3QgdGFyZ2V0IGEgcnVudGltZSwgaXQgd2lsbCBjb250YWluIG9ubHkgdGhlIGZpeGVkIGZhY2V0cyB3aXRoIHRoZWlyIGRlZmF1bHQKLSAgICAgICB2ZXJzaW9ucy4gSWYgcHJvamVjdCB0YXJnZXRzIG9uZSBvciBtb3JlIHJ1bnRpbWUsIHRoaXMgcHJlc2V0IHdpbGwgY29udGFpbiBmYWNldHMgdGhhdCBhcmUgc3BlY2lmaWVkCi0gICAgICAgdG8gYmUgdGhlIGRlZmF1bHQgZm9yIHRoZSBwcmltYXJ5IHJ1bnRpbWUuIC0tJmd0OwotICAgICAgIAotICAmbHQ7ZHluYW1pYy1wcmVzZXQgaWQ9JnF1b3Q7ZGVmYXVsdC5jb25maWd1cmF0aW9uJnF1b3Q7Jmd0OwotICAgICZsdDtmYWN0b3J5IGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkRlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZHluYW1pYy1wcmVzZXQmZ3Q7Ci0KLSAgJmx0OyEtLSBDcmVhdGVzIGEgcHJlc2V0IHdoaWNoIGV4dGVuZHMgdGhlICZxdW90O2RlZmF1bHQuY29uZmlndXJhdGlvbiZxdW90OyBwcmVzZXQgYW5kIGFkZHMgdHdvIGZhY2V0cy4gLS0mZ3Q7IAotICAgICAgIAotICAmbHQ7c3RhdGljLXByZXNldCBpZD0mcXVvdDtteS5mYXZvcml0ZS5wcmVzZXQmcXVvdDsgZXh0ZW5kcz0mcXVvdDtkZWZhdWx0LmNvbmZpZ3VyYXRpb24mcXVvdDsmZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0O015IEZhdm9yaXRlIENvbmZpZ3VyYXRpb24mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDtIZXJlIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBteSBmYXZvcml0ZSBjb25maWd1cmF0aW9uLiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2ZhY2V0X2EmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjImcXVvdDsvJmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldF9iJnF1b3Q7IHZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7LyZndDsKLSAgJmx0Oy9zdGF0aWMtcHJlc2V0Jmd0OwotICAKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLiZsdDtici8mZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvcnVudGltZUJyaWRnZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9ydW50aW1lQnJpZGdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTEwNDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9ydW50aW1lQnJpZGdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgaWQ9InJ1bnRpbWVCcmlkZ2VzIiBuYW1lPSJSdW50aW1lIEJyaWRnZXMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJicmlkZ2UiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYnJpZGdlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVCcmlkZ2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvcnVudGltZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9ydW50aW1lcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjc0NWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9ydW50aW1lcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgaWQ9InJ1bnRpbWVzIiBuYW1lPSJSdW50aW1lcyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWUtY29tcG9uZW50LXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZS1jb21wb25lbnQtdmVyc2lvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN1cHBvcnRlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWUtY29tcG9uZW50LXR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSBydW50aW1lIGNvbXBvbmVudCB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2ZXJzaW9uLWNvbXBhcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmVyc2lvbi1jb21wYXJhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHZlcnNpb24gY29tcGFyYXRvci4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmVyc2lvbiBjb21wYXJhdG9yIHdpbGwgYmUgdXNlZC4gVGhlIGRlZmF1bHQgdmVyc2lvbiBjb21wYXJhdG9yIGlzIGNhcGFibGUgb2YgaGFuZGluZyBudW1lcmljYWwgdmVyc2lvbnMgdGhhdCB1c2UgZGVjaW1hbCBub3RhdGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIG5hbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZhLnV0aWwuQ29tcGFyYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGEgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgdGhhdCB0aGlzIGlzIGEgdmVyc2lvbiBvZi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2ZXJzaW9uIHN0cmluZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWRhcHRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIHNvbWUgc2V0IG9mIHJ1bnRpbWUgY29tcG9uZW50IHR5cGVzIGFuZCB2ZXJzaW9ucy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZS1jb21wb25lbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0eXBlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZS1jb21wb25lbnQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFVzZWQgdG8gcmVmZXJlbmNlIG11bHRpcGxlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGVzIGFuZCB2ZXJzaW9ucy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIGlkLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyB1c2VkLCB0aGUgJmx0O2NvZGUmZ3Q7YW55Jmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXRjaCBleHByZXNzaW9uIGZvciB0aGUgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbi4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFueSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBVc2VkIHRvIGluZGljYXRlIHRoYXQgYWxsIHJ1bnRpbWUgY29tcG9uZW50IHR5cGVzIGFuZCB2ZXJzaW9ucyBzaG91bGQgYmUgbWF0Y2hlZC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCwgdGhlICZsdDtjb2RlJmd0O2lkJmx0Oy9jb2RlJmd0OyBhbmQgJmx0O2NvZGUmZ3Q7dmVyc2lvbiZsdDsvY29kZSZndDsgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIHVzZWQuIE5vdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlICZsdDtjb2RlJmd0O3J1bnRpbWUtY29tcG9uZW50Jmx0Oy9jb2RlJmd0OyBlbGVtZW50IGFwcGVhcnMgYmVuZWF0aCB0aGUgJmx0O2NvZGUmZ3Q7c3VwcG9ydGVkJmx0Oy9jb2RlJmd0OyBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGFkYXB0ZXIgZmFjdG9yeS4gVGhlIGZhY3RvcnkgaGFzIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIG5hbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSB0aGF0IHRoaXMgYWRhcHRlciB3aWxsIGJlIGFkYXB0aW5nIHRvLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGVzZSBwcm9qZWN0IGZhY2V0cyBhcmUgc3VwcG9ydGVkIGJ5IHRoZXNlIHJ1bnRpbWVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWNldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lLWNvbXBvbmVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBVc2VkIHRvIHJlZmVyZW5jZSBvbmUgb3IgbW9yZSB2ZXJzaW9uIG9mIGEgcHJvamVjdCBmYWNldC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcm9qZWN0IGZhY2V0IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXRjaCBleHByZXNzaW9uIGZvciB0aGUgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbi4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy92YWxpZGF0b3JzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvdmFsaWRhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ0OWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy92YWxpZGF0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBpZD0idmFsaWRhdG9ycyIgbmFtZT0iRmFjZXRlZCBQcm9qZWN0IFZhbGlkYXRvcnMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFVzZWQgZm9yIGRlY2xhcmluZyBmYWNldGVkIHByb2plY3QgdmFsaWRhdG9ycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsaWRhdG9yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFVzZWQgdG8gcmVmZXJlbmNlIG9uZSBvciBtb3JlIHZlcnNpb24gb2YgYSBwcm9qZWN0IGZhY2V0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHByb2plY3QgZmFjZXQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1hdGNoIGV4cHJlc3Npb24gZm9yIHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uLiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gJnF1b3Q7Mi4yLDIuNSxbMy4wLTUuM10sKDcuMyZxdW90Oywgd2hlcmUgdGhlIGNvbWFzIGZ1bmN0aW9uIGFzIGFuIE9SLiBCcmFja2V0cyBhbmQgcGFyZW50aGVzaXMgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcmFuZ2Ugbm90YXRpb24uIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUgd2hpbGUgYSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBmYWNldGVkIHByb2plY3QgdmFsaWRhdG9yLiBUaGUgdmFsaWRhdG9yIGNhbiBiZSByZXN0cmljdGVkIHRvIHByb2plY3RzIGNvbnRhaW5pbmcgc3BlY2lmaWMgZmFjZXRzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsaWRhdG9yIGNsYXNzIG5hbWUuIEhhcyB0byBpbXBsZW1lbnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFZhbGlkYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7VGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmVzIGEgdmFsaWRhdG9yIHRoYXQgYXBwbGllcyB0byBwcm9qZWN0cyB0aGF0IGhhdmUgZmFjZXQxICh2ZXJzaW9uIDEuMyBvciAyLjUpIGFuZCBmYWNldDIgKGFueSB2ZXJzaW9uKSBpbnN0YWxsZWQuJmx0Oy9wJmd0OwotCi0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS52YWxpZGF0b3JzJnF1b3Q7Jmd0OwotICAmbHQ7dmFsaWRhdG9yIGNsYXNzPSZxdW90O2NvbS5teWNvcnAuTXlWYWxpZGF0b3IxJnF1b3Q7Jmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldDEmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjMsMi41JnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7ZmFjZXQyJnF1b3Q7LyZndDsKLSAgJmx0Oy92YWxpZGF0b3ImZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotCi0mbHQ7cCZndDtUaGUgc2Vjb25kIGV4YW1wbGUgZGVjbGFyZXMgYSB2YWxpZGF0b3IgdGhhdCBhcHBsaWVzIHRvIGFsbCBmYWNldGVkIHByb2plY3RzLiZsdDsvcCZndDsKLQotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudmFsaWRhdG9ycyZxdW90OyZndDsKLSAgJmx0O3ZhbGlkYXRvciBjbGFzcz0mcXVvdDtjb20ubXljb3JwLk15VmFsaWRhdG9yMiZxdW90Oy8mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9BY3Rpb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0FjdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWYzZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0FjdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNvbmZpZwotewotICAgIHByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBudWxsOwotICAgIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZwandjOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyApCi0gICAgewotICAgICAgICB0aGlzLmZwandjID0gZnBqd2M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZ2OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICB0aGlzLmZ2ID0gZnY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0RlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmJkODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5EZWZhdWx0RmFjZXRzRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBQcmVzZXQgZmFjdG9yeSBmb3IgdGhlIDxjb2RlPmRlZmF1bHQuY29uZmlndXJhdGlvbjwvY29kZT4gcHJlc2V0LiBUaGUgY29udGVudHMgb2YgdGhpcyBwcmVzZXQKLSAqIGFyZSBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6Ci0gKiAKLSAqIDxvbD4KLSAqICAgPGxpPklmIGEgcnVudGltZSBpcyBzZWxlY3RlZCwgdGhpcyBwcmVzZXQgd2lsbCBjb250YWluIGRlZmF1bHQgZmFjZXRzIGFzIHNwZWNpZmllZCBieQotICogICAgIHtAc2VlIElSdW50aW1lLmdldERlZmF1bHRGYWNldHMoU2V0KX0uPC9saT4KLSAqICAgPGxpPklmIG5vIHJ1bnRpbWUgaXMgc2VsZWN0ZWQsIHRoaXMgcHJlc2V0IHdpbGwgY29udGFpbiBkZWZhdWx0IHZlcnNpb25zIGZvciBhbGwgb2YgdGhlIAotICogICAgIGZpeGVkIGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkge0BzZWUgSVByb2plY3RGYWNldC5nZXREZWZhdWx0VmVyc2lvbigpfS4KLSAqIDwvb2w+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkKLQotICAgIGltcGxlbWVudHMgSVByZXNldEZhY3RvcnkKLSAgICAKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVRfSUQgPSAiZGVmYXVsdC5jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBQcmVzZXREZWZpbml0aW9uIGNyZWF0ZVByZXNldCggZmluYWwgU3RyaW5nIHByZXNldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RCYXNlIGZwcm9qIAotICAgICAgICAgICAgPSAoSUZhY2V0ZWRQcm9qZWN0QmFzZSkgY29udGV4dC5nZXQoIElEeW5hbWljUHJlc2V0LkNPTlRFWFRfS0VZX0ZBQ0VURURfUFJPSkVDVCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCk7IAotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgICAgIAotICAgICAgICBpZiggcnVudGltZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFiZWwgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnByZXNldExhYmVsLCBydW50aW1lLmdldExvY2FsaXplZE5hbWUoKSApOwotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnByZXNldERlc2NyaXB0aW9uLCBydW50aW1lLmdldExvY2FsaXplZE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGFiZWwgPSBSZXNvdXJjZXMucHJlc2V0TGFiZWxOb1J1bnRpbWU7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IFJlc291cmNlcy5wcmVzZXREZXNjcmlwdGlvbk5vUnVudGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzIAotICAgICAgICAgICAgPSBEZWZhdWx0RmFjZXRzRXh0ZW5zaW9uUG9pbnQuZ2V0RGVmYXVsdEZhY2V0cyggZnByb2ogKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgUHJlc2V0RGVmaW5pdGlvbiggbGFiZWwsIGRlc2NyaXB0aW9uLCBmYWNldHMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlc2V0TGFiZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldERlc2NyaXB0aW9uOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXRMYWJlbE5vUnVudGltZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlc2V0RGVzY3JpcHRpb25Ob1J1bnRpbWU7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBEZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9EZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0RlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWRlZWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0RlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wcmVzZXRMYWJlbCA9IERlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgezB9Ci1wcmVzZXREZXNjcmlwdGlvbiA9IEEgZ29vZCBzdGFydGluZyBwb2ludCBmb3Igd29ya2luZyB3aXRoIHswfSBydW50aW1lLiBBZGRpdGlvbmFsIGZhY2V0cyBjYW4gbGF0ZXIgYmUgaW5zdGFsbGVkIHRvIGFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0byB0aGUgcHJvamVjdC4KLXByZXNldExhYmVsTm9SdW50aW1lID0gRGVmYXVsdCBDb25maWd1cmF0aW9uCi1wcmVzZXREZXNjcmlwdGlvbk5vUnVudGltZSA9IFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBBZGRpdGlvbmFsIGZhY2V0cyBjYW4gbGF0ZXIgYmUgaW5zdGFsbGVkIHRvIGFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0byB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0RlZmF1bHRWZXJzaW9uQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTZlOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBvbmUgaXMgbm90IGV4cGxpY2l0bHkgCi0gKiBzcGVjaWZpZWQuIFRoZSBkZWZhdWx0IHZlcnNpb24gY29tcGFyYXRvciBjYW4gaGFuZGxlIHZlcnNpb24gc3RyaW5ncyB1c2luZyAKLSAqIHRoZSBzdGFuZGFyZCBkZWNpbWFsIG5vdGF0aW9uLiBJdCBjYW4gYWxzbyBiZSBzdWJjbGFzc2VkIHRvIG1vZGlmeSB0aGUgCi0gKiBzZXBhcmF0b3JzIHRoYXQgYXJlIHVzZWQgb3IgdG8gcHJvdmlkZSBjdXN0b20gcGFyc2luZyBmb3IgYSB2ZXJzaW9uIHNlZ21lbnQuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IKLQotICAgIGltcGxlbWVudHMgQ29tcGFyYXRvcjxTdHJpbmc+Ci0gICAgCi17Ci0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlKCBmaW5hbCBTdHJpbmcgb2JqMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvYmoyICkKLSAgICAKLSAgICAgICAgdGhyb3dzIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBDb21wYXJhYmxlPE9iamVjdD5bXSBwYXJzZWQxID0gcGFyc2UoIG9iajEgKTsKLSAgICAgICAgZmluYWwgQ29tcGFyYWJsZTxPYmplY3Q+W10gcGFyc2VkMiA9IHBhcnNlKCBvYmoyICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHBhcnNlZDEubGVuZ3RoICYmIGkgPCBwYXJzZWQyLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgaW50IHJlcyA9IHBhcnNlZDFbIGkgXS5jb21wYXJlVG8oIHBhcnNlZDJbIGkgXSApOwotICAgICAgICAgICAgaWYoIHJlcyAhPSAwICkgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHBhcnNlZDEubGVuZ3RoID4gcGFyc2VkMi5sZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwYXJzZWQxLmxlbmd0aCA8IHBhcnNlZDIubGVuZ3RoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlCi0gICAgICogdXNlZCB3aGVuIGJyZWFraW5nIHRoZSB2ZXJzaW9uIHN0cmluZyBpbnRvIHNlZ21lbnRzLiBUaGUgZGVmYXVsdAotICAgICAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgIi4iLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVycwotICAgICAqLwotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VwYXJhdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHNlZ21lbnQgb2YgdGhlIHZlcnNpb24gc3RyaW5nLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwYXJzZXMKLSAgICAgKiB0aGUgZmlyc3Qgc2VnbWVudCBhcyBhbiBpbnRlZ2VyIChsZWFkaW5nIHplcm9lcyBhcmUgaWdub3JlZCkgYW5kIHRoZQotICAgICAqIHJlc3Qgb2YgdGhlIHNlZ21lbnRzIGFzIGRlY2ltYWxzIChsZWFkaW5nIHplcm9lcyBhcmUga2VwdCkuIFN1YmNsYXNzZXMgCi0gICAgICogY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgY3VzdG9tIHBhcnNpbmcgZm9yIGFueSBudW1iZXIgb2YgCi0gICAgICogc2VnbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgdmVyc2lvbiBzZWdtZW50Ci0gICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VnbWVudCBpbiB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlZ21lbnQgYXMgYSB7QHNlZSBDb21wYXJhYmxlfQotICAgICAqIEB0aHJvd3MgVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiBpZiBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBwYXJzaW5nCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIENvbXBhcmFibGU8PyBleHRlbmRzIE9iamVjdD4gcGFyc2UoIGZpbmFsIFN0cmluZyB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uICkKLSAgICAKLSAgICAgICAgdGhyb3dzIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBvc2l0aW9uID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlciggc2VnbWVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCggIi4iICsgc2VnbWVudCApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25Gb3JtYXRFeGNlcHRpb24oIHRoaXMsIHZlcnNpb24gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHZlcnNpb24gc3RyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2ZXIgdGhlIHZlcnNpb24gc3RyaW5nCi0gICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlcnNpb24KLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHByaXZhdGUgQ29tcGFyYWJsZTxPYmplY3Q+W10gcGFyc2UoIGZpbmFsIFN0cmluZyB2ZXIgKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHNlZ21lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIFN0cmluZ1Rva2VuaXplciB0ID0gbmV3IFN0cmluZ1Rva2VuaXplciggdmVyLCBnZXRTZXBhcmF0b3JzKCkgKTsKLSAgICAgICAgICAgICB0Lmhhc01vcmVUb2tlbnMoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZWdtZW50cy5hZGQoIHQubmV4dFRva2VuKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgQ29tcGFyYWJsZVtdIHBhcnNlZCA9IG5ldyBDb21wYXJhYmxlWyBzZWdtZW50cy5zaXplKCkgXTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gc2VnbWVudHMuc2l6ZSgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2VkWyBpIF0gPSBwYXJzZSggdmVyLCBzZWdtZW50cy5nZXQoIGkgKSwgaSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFyc2VkOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9GYWNldGVkUHJvamVjdEZyYW1ld29yay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk4ZjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3ROYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgYSBidWlsdC1pbiBwcmVzZXQgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIFRoZSBjb250ZW50cyBvZiB0aGlzIHByZXNldAotICAgICAqIGFyZSBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6Ci0gICAgICogCi0gICAgICogPG9sPgotICAgICAqICAgPGxpPklmIGEgcnVudGltZSBpcyBzZWxlY3RlZCwgdGhpcyBwcmVzZXQgd2lsbCBjb250YWluIGRlZmF1bHQgZmFjZXRzIGFzIHNwZWNpZmllZCBieQotICAgICAqICAgICB7QHNlZSBJUnVudGltZS5nZXREZWZhdWx0RmFjZXRzKFNldCl9LjwvbGk+Ci0gICAgICogICA8bGk+SWYgbm8gcnVudGltZSBpcyBzZWxlY3RlZCwgdGhpcyBwcmVzZXQgd2lsbCBjb250YWluIGRlZmF1bHQgdmVyc2lvbnMgZm9yIGFsbCBvZiB0aGUgCi0gICAgICogICAgIGZpeGVkIGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkge0BzZWUgSVByb2plY3RGYWNldC5nZXREZWZhdWx0VmVyc2lvbigpfS4KLSAgICAgKiA8L29sPgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTkZJR1VSQVRJT05fUFJFU0VUX0lEIAotICAgICAgICA9ICJkZWZhdWx0LmNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsIGltcGwgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsoKSB7IH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGNyZWF0ZU5ld1Byb2plY3QoKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICByZXR1cm4gaW1wbC5jcmVhdGVOZXdQcm9qZWN0KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPkRldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgaXMgaW5zdGFsbGVkIGluIHRoZQotICAgICAqIHByb3ZpZGVkIHByb2plY3QuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIG5vdCAKLSAgICAgKiBhY2Nlc3NpYmxlLCB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZCBvciB0aGUgZmFjZXQgaWQgaXMgdW5yZWNvZ25pemVkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGF2b2lkIGFjdGl2YXRpb24gb2YgdGhlIEZhY2V0ZWQKLSAgICAgKiBQcm9qZWN0IEZyYW1ld29yayBpZiB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZC4gRm9yIHRoZSBjb2RlIHRoYXQKLSAgICAgKiBvcGVyYXRlcyBpbiB0aGUgY29udGV4dCB3aGVyZSBpdCBjYW4gYmUgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgaGFzCi0gICAgICogc3RhcnRlZCBhbHJlYWR5LCBiZXR0ZXIgcGVyZm9ybWFuY2UgY2FuIGJlIGFjaGlldmVkIGJ5IHN0b3JpbmcgCi0gICAgICoge0BzZWUgSVByb2plY3RGYWNldH0gYW5kIHtAc2VlIElQcm9qZWN0RmFjZXRWZXJzaW9ufSBpbnN0YW5jZXMgdXNpbmcgdGhlCi0gICAgICogc2luZ2xldG9uIHBhdHRlcm4gYW5kIHVzaW5nIHRoZQotICAgICAqIHtAc2VlIElGYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoSVByb2plY3RGYWNldCl9IG9yCi0gICAgICoge0BzZWUgSUZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChJUHJvamVjdEZhY2V0VmVyc2lvbil9IG1ldGhvZHMuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAKLSAgICAgKiB7QHNlZSBoYXNQcm9qZWN0RmFjZXQoSVByb2plY3QsU3RyaW5nLFN0cmluZyl9IHdpdGggPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiB2ZXJzaW9uIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byBjaGVjayBmb3IgdGhlIGZhY2V0IHByZXNlbmNlCi0gICAgICogQHBhcmFtIGZpZCB0aGUgcHJvamVjdCBmYWNldCBpZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgcmVhZGluZyBmYWNldGVkIHByb2plY3QgbWV0YWRhdGEKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGhhc1Byb2plY3RGYWNldCggcHJvamVjdCwgZmlkLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPkRldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgaXMgaW5zdGFsbGVkIGluIHRoZQotICAgICAqIHByb3ZpZGVkIHByb2plY3QuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIG5vdCAKLSAgICAgKiBhY2Nlc3NpYmxlLCB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZCBvciB0aGUgZmFjZXQgaWQgaXMgdW5yZWNvZ25pemVkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGF2b2lkIGFjdGl2YXRpb24gb2YgdGhlIEZhY2V0ZWQKLSAgICAgKiBQcm9qZWN0IEZyYW1ld29yayBpZiB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZC4gRm9yIHRoZSBjb2RlIHRoYXQKLSAgICAgKiBvcGVyYXRlcyBpbiB0aGUgY29udGV4dCB3aGVyZSBpdCBjYW4gYmUgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgaGFzCi0gICAgICogc3RhcnRlZCBhbHJlYWR5LCBiZXR0ZXIgcGVyZm9ybWFuY2UgY2FuIGJlIGFjaGlldmVkIGJ5IHN0b3JpbmcgCi0gICAgICoge0BzZWUgSVByb2plY3RGYWNldH0gYW5kIHtAc2VlIElQcm9qZWN0RmFjZXRWZXJzaW9ufSBpbnN0YW5jZXMgdXNpbmcgdGhlCi0gICAgICogc2luZ2xldG9uIHBhdHRlcm4gYW5kIHVzaW5nIHRoZQotICAgICAqIHtAc2VlIElGYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoSVByb2plY3RGYWNldCl9IG9yCi0gICAgICoge0BzZWUgSUZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChJUHJvamVjdEZhY2V0VmVyc2lvbil9IG1ldGhvZHMuPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGNoZWNrIGZvciB0aGUgZmFjZXQgcHJlc2VuY2UKLSAgICAgKiBAcGFyYW0gZmlkIHRoZSBwcm9qZWN0IGZhY2V0IGlkCi0gICAgICogQHBhcmFtIHZleHByIHRoZSB2ZXJzaW9uIG1hdGNoIGV4cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAgICogICBtYXRjaCBhbnkgdmVyc2lvbgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgcmVhZGluZyBmYWNldGVkIHByb2plY3QgbWV0YWRhdGE7Ci0gICAgICogICBpZiB0aGUgdmVyc2lvbiBleHByZXNzaW9uIGlzIGludmFsaWQKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmV4cHIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmCi0gICAgICAgICAgICBwcm9qZWN0LmlzTmF0dXJlRW5hYmxlZCggRmFjZXRlZFByb2plY3ROYXR1cmUuTkFUVVJFX0lEICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZnByb2ogIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmlkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBmaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwciA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZwcm9qLmhhc1Byb2plY3RGYWNldCggZiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmcHJvai5nZXRJbnN0YWxsZWRWZXJzaW9uKCBmICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmdiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5nZXRWZXJzaW9ucyggdmV4cHIgKS5jb250YWlucyggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmFjZXRlZCBwcm9qZWN0IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3RlZCBldmVudHMgaW4gdGhlIGZhY2V0ZWQKLSAgICAgKiBwcm9qZWN0IGxpZmUgY3ljbGUgb2NjdXIuIFRoZSBsaXN0ZW5lciB3aWxsIGFwcGx5IHRvIGFsbCBmYWNldGVkIHByb2plY3RzIHRoYXQgZXhpc3QgaW4gdGhlCi0gICAgICogd29ya3NwYWNlIG5vdyBhbmQgaW4gdGhlIGZ1dHVyZSAodW50aWwgdGhlIGxpc3RlbmVyIGlzIHJlbW92ZWQgb3IgdGhlIHdvcmtzcGFjZSBpcyBjbG9zZWQpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgZmFjZXRlZCBwcm9qZWN0IGxpc3RlbmVyCi0gICAgICogQHBhcmFtIHR5cGVzIHRoZSB0eXBlcyBvZiB0aGUgZXZlbnRzIHRvIGxpc3RlbiBmb3IKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yCi0gICAgICogICB0aGUgPGNvZGU+dHlwZXM8L2NvZGU+IHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eS4KLSAgICAgKiBAc2VlIHJlbW92ZUxpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyKQotICAgICAqIEBzZWUgSUZhY2V0ZWRQcm9qZWN0LmFkZExpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyLElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSkKLSAgICAgKiBAc2VlIElGYWNldGVkUHJvamVjdC5yZW1vdmVMaXN0ZW5lcihJRmFjZXRlZFByb2plY3RMaXN0ZW5lcikKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgIGltcGwuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgIGltcGwuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHVzaW5nIHRoZQotICAgICAqIHtAc2VlIGFkZExpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyLElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSl9IG1ldGhvZC4gSWYgdGhlCi0gICAgICogc3BlY2lmaWVkIGxpc3RlbmVyIGlzIG5vdCBwcmVzZW50IGluIHRoZSBsaXN0ZW5lciByZWdpc3RyeSwgdGhpcyBjYWxsIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAc2VlIGFkZExpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyLElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSkKLSAgICAgKiBAc2VlIElGYWNldGVkUHJvamVjdC5hZGRMaXN0ZW5lcihJRmFjZXRlZFByb2plY3RMaXN0ZW5lcixJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlW10pCi0gICAgICogQHNlZSBJRmFjZXRlZFByb2plY3QucmVtb3ZlTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgIGltcGwucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICBpbXBsLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKCkKLSAgICB7Ci0gICAgICAgIGlmKCBpbXBsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbXBsID0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQWN0aW9uQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQWN0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGY5MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUFjdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkNvbmZpZwotewotICAgIHZvaWQgc2V0VmVyc2lvbiggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICB2b2lkIHNldFByb2plY3ROYW1lKCBTdHJpbmcgcGpuYW1lICk7Ci0gICAgSVN0YXR1cyB2YWxpZGF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lBY3Rpb25Db25maWdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTFjZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBwcm92aWRlIGEgbWV0aG9kIGZvciBjcmVhdGluZyAKLSAqIGEgY29uZmlnIG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgcGFyYW1ldGVyaXppbmcgdGhlIGZhY2V0IGFjdGlvbgotICogZGVsZWdhdGUuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZhY2V0IGFjdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdC4gVGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICogb2JqZWN0IHNob3VsZCBpZGVhbGx5IGJlIHBvcHVsYXRlZCB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBmYWNldCBhY3Rpb24gY29uZmlndXJhdGlvbiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIGNyZWF0aW5nIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqLwotICAgIAotICAgIE9iamVjdCBjcmVhdGUoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lBY3Rpb25EZWZpbml0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQWN0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE3YjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lBY3Rpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotCi0vKioKLSAqIEFuIGFjdGlvbiBpcyBhbiBvcGVyYXRpb24gb24gYSBzaW5nbGUgZmFjZXQgd2l0aGluIGEgZmFjZXRlZCBwcm9qZWN0IHRvCi0gKiBpbnN0YWxsLCB1bmluc3RhbGwsIG9yIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiB0aGUgZmFjZXQuIEFuIGFjdGlvbiBkZWZpbml0aW9uCi0gKiByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBieSB0aGUgZmFjZXQgYXV0aG9yIHJlZ2FyZGluZyB0aGUKLSAqIGltcGxlbWVudGF0aW9uIG9mIGFuIGFjdGlvbi4gQSBzaW5nbGUgYWN0aW9uIGRlZmluaXRpb24gY2FuIGFwcGx5IHRvIG11bHRpcGxlCi0gKiBmYWNldCB2ZXJzaW9ucy4gRm9yIGluc3RhbmNlLCB0aGUgZmFjZXQgYXV0aG9yIG1heSBjaG9vc2UgdG8gc3VwcGx5IG9uZQotICogYWN0aW9uIGRlZmluaXRpb24gZm9yIGFsbCB2ZXJzaW9ucyBvZiBoaXMgZmFjZXQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25EZWZpbml0aW9uCi17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQncyB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgc3RhcnRpbmcgdmVyc2lvbgotICAgICAqIG9mIHRoZSBWRVJTSU9OX0NIQU5HRSBhY3Rpb24gZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJPTV9WRVJTSU9OUyA9ICJmcm9tLnZlcnNpb25zIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBhY3Rpb24gZGVmaW5pdGlvbi4gSWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBhCi0gICAgICogZGVmYXVsdCBhY3Rpb24gaWQgaXMgZ2VuZXJhdGVkIHRoYXQgdGFrZXMgdGhlIGZvbGxvd2luZyBmb3JtOgotICAgICAqIFtmYWNldC1pZF0jW3ZlcnNpb24tZXhwcmVzc2lvbl0jW2FjdGlvbi10eXBlXSgjW3Byb3AubmFtZV09W3Byb3AudmFsdWVdKSouCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIGFjdGlvbiBkZWZpbml0aW9uCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldElkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgYWN0aW9uIGRlZmluaXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgZmFjZXQgdGhhdCB0aGlzIGFjdGlvbiBkZWZpbml0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aAotICAgICAqLwotICAgIAotICAgIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBleHByZXNzaW9uIHRoYXQgY29udHJvbHMgd2hpY2ggZmFjZXQgdmVyc2lvbnMgdGhpcwotICAgICAqIGFjdGlvbiBkZWZpbml0aW9uIGFwcGxpZXMgdG8uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBleHByZXNzaW9uIHRoYXQgY29udHJvbHMgd2hpY2ggZmFjZXQgdmVyc2lvbnMgdGhpcwotICAgICAqICAgYWN0aW9uIGRlZmluaXRpb24gYXBwbGllcyB0bwotICAgICAqLwotICAgIAotICAgIElWZXJzaW9uRXhwciBnZXRWZXJzaW9uRXhwcigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGlvbiB0eXBlLCBzdWNoIGFzIDxjb2RlPklOU1RBTEw8L2NvZGU+LCA8Y29kZT5VTklOU1RBTEw8L2NvZGU+LAotICAgICAqIG9yIDxjb2RlPlZFUlNJT05fQ0hBTkdFPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb24gdHlwZQotICAgICAqLwotICAgIAotICAgIEFjdGlvbi5UeXBlIGdldEFjdGlvblR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIHRoYXQgZnVydGhlciBzcGVjaWZ5IGFjdGlvbiBiZWhhdmlvciBhbmQgCi0gICAgICogYXBwbGljYWJpbGl0eS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgYWN0aW9uIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICAKLSAgICBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICovCi0gICAgCi0gICAgT2JqZWN0IGdldFByb3BlcnR5KCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29uZmlnIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXJpemluZyB0aGUKLSAgICAgKiBleGVjdXRpb24gb2YgdGhpcyBhY3Rpb24uIElmIHRoaXMgYWN0aW9uIGRlZmluaXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhCi0gICAgICogY29uZmlnIG9iamVjdCBmYWN0b3J5LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29uZmlnIG9iamVjdAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgaW5zdGFudGlhdGluZyB0aGUgY29uZmlnIG9iamVjdAotICAgICAqICAgZmFjdG9yeSBvciBjcmVhdGluZyB0aGUgY29uZmlnIG9iamVjdAotICAgICAqLwotCi0gICAgT2JqZWN0IGNyZWF0ZUNvbmZpZ09iamVjdCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29uZmlnIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXJpemluZyB0aGUKLSAgICAgKiBleGVjdXRpb24gb2YgdGhpcyBhY3Rpb24uIElmIHRoaXMgYWN0aW9uIGRlZmluaXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhCi0gICAgICogY29uZmlnIG9iamVjdCBmYWN0b3J5LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIGFjdHVhbCBmYWNldCB2ZXJzaW9uIHRoYXQgdGhpcyBjb25maWcgb2JqZWN0IHdpbGwgYmUgdXNlZAotICAgICAqICAgd2l0aDsgc2hvdWxkIGJlIG9uZSBvZiB0aGUgdmVyc2lvbnMgbWF0Y2hlZCBieSB0aGUgdmVyc2lvbiBleHByZXNzaW9uCi0gICAgICogICBzcGVjaWZpZWQgZm9yIHRoaXMgYWN0aW9uIGRlZmluaXRpb24KLSAgICAgKiBAcGFyYW0gcGpuYW1lIHRoZSBwcm9qZWN0IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29uZmlnIG9iamVjdAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgaW5zdGFudGlhdGluZyB0aGUgY29uZmlnIG9iamVjdAotICAgICAqICAgZmFjdG9yeSBvciBjcmVhdGluZyB0aGUgY29uZmlnIG9iamVjdAotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgT2JqZWN0IGNyZWF0ZUNvbmZpZ09iamVjdCggSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBqbmFtZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lDYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlM2ZjYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi0vKioKLSAqIE1vZGVscyBhIGdyb3VwaW5nIG9mIHByb2plY3QgZmFjZXRzIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHNlbGVjdGVkIGFuZCAKLSAqIGRlc2VsZWN0ZWQgYXMgYSBzZXQuIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSAKLSAqIGNsaWVudHMuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGVnb3J5Ci0KLSAgICBleHRlbmRzIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLSAgICBTdHJpbmcgZ2V0TGFiZWwoKTsKLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0cyB0aGF0IGNvbXBvc2UgdGhpcyBjYXRlZ29yeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgcHJvamVjdCBmYWNldHMKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldD4gZ2V0UHJvamVjdEZhY2V0cygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDkwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbmdsZSBjb25zdHJhaW50IGluIHRoZSBjb25zdHJhaW50IGV4cHJlc3Npb24uIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJhaW50IAotewotICAgIC8qKgotICAgICAqIFRoZSBlbnVtZXJhdGlvbiBvZiBvcGVyYXRvciB0eXBlcy4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZyxUeXBlPiBpdGVtcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxUeXBlPigpOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQU5EID0gbmV3IFR5cGUoICJhbmQiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIE9SID0gbmV3IFR5cGUoICJvciIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgUkVRVUlSRVMgPSBuZXcgVHlwZSggInJlcXVpcmVzIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBDT05GTElDVFMgPSBuZXcgVHlwZSggImNvbmZsaWN0cyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgVHlwZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgaXRlbXMucHV0KCBuYW1lLCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB2YWx1ZU9mKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVtcy5nZXQoIG5hbWUudG9Mb3dlckNhc2UoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcGVyYXRvciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0b3IgdHlwZQotICAgICAqLwotICAgIAotICAgIFR5cGUgZ2V0VHlwZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb3BlcmFuZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBvcGVyYW5kcwotICAgICAqLwotICAgIAotICAgIExpc3Q8T2JqZWN0PiBnZXRPcGVyYW5kcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9wZXJhbmQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHBvc2l0aW9uIG9mIHRoZSBvcGVyYW5kIGluIHRoZSBsaXN0IG9mIG9wZXJhbmRzCi0gICAgICogQHJldHVybiB0aGUgb3BlcmFuZAotICAgICAqLwotICAgIAotICAgIE9iamVjdCBnZXRPcGVyYW5kKCBpbnQgaW5kZXggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhpcyBjb25zdHJhaW50IGFnYWluc3QgdGhlIGdpdmVuIHNldCBvZiBwcm9qZWN0IGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXRzIGEgc2V0IG9mIHByb2plY3QgZmFjZXRzCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBvZiB7QHNlZSBJU3RhdHVzI09LfSBpZiB0aGUKLSAgICAgKiAgIGNvbnN0cmFpbnQgd2FzIHNhdGlzZmllZCBvciBvdGhlcndpc2UgYSB7QHNlZSBNdWx0aVN0YXR1c30gY29tcG9zZWQgb2YKLSAgICAgKiAgIHtAc2VlIFZhbGlkYXRpb25Qcm9ibGVtfSBzdGF0dXMgb2JqZWN0cwotICAgICAqLwotICAgIAotICAgIElTdGF0dXMgY2hlY2soIENvbGxlY3Rpb248SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGlzIGNvbnN0cmFpbnQgYWdhaW5zdCB0aGUgZ2l2ZW4gc2V0IG9mIHByb2plY3QgZmFjZXRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNldHMgYSBzZXQgb2YgcHJvamVjdCBmYWNldHMKLSAgICAgKiBAcGFyYW0gdmFsaWRhdGVTb2Z0RGVwZW5kZW5jaWVzIGlmIDxjb2RlPnRydWU8L2NvZGU+IHNvZnQgZGVwZW5kZW5jaWVzCi0gICAgICogICB3aWxsIGJlIHRyZWF0ZWQgYXMgcmVxdWlyZWQKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IG9mIHtAc2VlIElTdGF0dXMjT0t9IGlmIHRoZQotICAgICAqICAgY29uc3RyYWludCB3YXMgc2F0aXNmaWVkIG9yIG90aGVyd2lzZSBhIHtAc2VlIE11bHRpU3RhdHVzfSBjb21wb3NlZCBvZgotICAgICAqICAge0BzZWUgVmFsaWRhdGlvblByb2JsZW19IHN0YXR1cyBvYmplY3RzCi0gICAgICovCi0KLSAgICBJU3RhdHVzIGNoZWNrKCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMsCi0gICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZVNvZnREZXBlbmRlbmNpZXMgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lEZWZhdWx0VmVyc2lvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRGVmYXVsdFZlcnNpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWU4OTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lEZWZhdWx0VmVyc2lvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBmYWNldCB2ZXJzaW9uIHRoYXQKLSAqIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIElmIGEgdmVyc2lvbiBwcm92aWRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbGF0ZXN0Ci0gKiB2ZXJzaW9uIHdpbGwgYmUgdXNlZC4gTm90ZSB0aGF0IGlmIGEgcnVudGltZSBpcyBzZWxlY3RlZCwgdGhlIHJ1bnRpbWUgY2FuIAotICogb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggYSB2ZXJzaW9uIGJlc3Qgc3VpdGVkIGZvciB0aGF0IHJ1bnRpbWUuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZhY2V0IHZlcnNpb24gdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdAotICAgICAqLwotICAgIAotICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBsb2dpYyBhc3NvY2lhdGVkIHdpdGgKLSAqIGEgcGFydGljdWxhciBldmVudCBpbiBwcm9qZWN0IGZhY2V0J3MgbGlmZSBjeWNsZSwgc3VjaCBhcyBpbnN0YWxsIG9yIAotICogdW5pbnN0YWxsLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZWxlZ2F0ZSAKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIHRoYXQncyBjYWxsZWQgdG8gZXhlY3V0ZSB0aGUgZGVsZWdhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHdvcmtzcGFjZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGZ2IHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gdGhhdCB0aGlzIGRlbGVnYXRlIGlzIGhhbmRsaW5nOyB0aGlzCi0gICAgICogICBpcyB1c2VmdWwgd2hlbiBzaGFyaW5nIHRoZSBkZWxlZ2F0ZSBhbW9uZyBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSBzYW1lCi0gICAgICogICBwcm9qZWN0IGZhY2V0IG9yIGV2ZW4gZGlmZmVyZW50IHByb2plY3QgZmFjZXRzCi0gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGRlZmF1bHRzCi0gICAgICogICBzaG91bGQgYmUgdXNlZAotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBkZWxlZ2F0ZSBmYWlscyBmb3IgYW55IHJlYXNvbgotICAgICAqLwotICAgIAotICAgIHZvaWQgZXhlY3V0ZSggSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUR5bmFtaWNQcmVzZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lEeW5hbWljUHJlc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzQ1YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUR5bmFtaWNQcmVzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZHluYW1pYyBwcmVzZXQgaXMgdHlwZSBvZiBwcmVzZXQgdGhhdCBuZWVkcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuIFRoZSByZXNvbHZlCi0gKiBvcGVyYXRpb24gcmVsaWVzIHRoZSB7QHNlZSBJUHJlc2V0RmFjdG9yeX0gc3BlY2lmaWVkIHdoZW4gdGhlIGR5bmFtaWMgcHJlc2V0IGlzIHJlZ2lzdGVyZWQgdmlhCi0gKiB0aGUgPGNvZGU+cHJlc2V0czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGFuZCBjYW4gdGFrZSBpbnRvIGFjY291bnQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIAotICogcHJlc2V0IHdpbGwgYmUgdXNlZC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUR5bmFtaWNQcmVzZXQKLQotICAgIGV4dGVuZHMgSVByZXNldAotICAgIAotewotICAgIC8qKgotICAgICAqIFRoZSBrZXkgb2YgdGhlIGNvbnRleHQgbWFwIGVudHJ5IHdob3NlIHZhbHVlIGlzIGFuIHtAc2VlIElGYWNldGVkUHJvamVjdEJhc2V9IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0tFWV9GQUNFVEVEX1BST0pFQ1QgPSAiQ09OVEVYVF9LRVlfRkFDRVRFRF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBrZXkgb2YgdGhlIGNvbnRleHQgbWFwIGVudHJ5IHdob3NlIHZhbHVlIGlzIGEgc2V0IG9mIHtAc2VlIElQcm9qZWN0RmFjZXR9IG9iamVjdHMKLSAgICAgKiByZXByZXNlbnRpbmcgdGhlIGZpeGVkIGZhY2V0cy4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX0ZJWEVEX0ZBQ0VUUyA9ICJDT05URVhUX0tFWV9GSVhFRF9GQUNFVFMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGtleSBvZiB0aGUgY29udGV4dCBtYXAgZW50cnkgd2hvc2UgdmFsdWUgaXMgdGhlIHByaW1hcnkgcnVudGltZSAoe0BzZWUgSVJ1bnRpbWV9KSBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHJ1bnRpbWUgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICovCi0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0tFWV9QUklNQVJZX1JVTlRJTUUgPSAiQ09OVEVYVF9LRVlfUFJJTUFSWV9SVU5USU1FIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyB0aGUgZHluYW1pYyBwcmVzZXQgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbnRleHQgaW5mb3JtYXRpb24uIElmIHRoaXMgcHJlc2V0IGlzIG5vdAotICAgICAqIGFwcGxpY2FibGUgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCBjb250ZXh0IHRoYXQgdGhpcyBwcmVzZXQgd2lsbCBiZSB1c2VkIGluCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgcHJlc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAKLSAgICBJUHJlc2V0IHJlc29sdmUoIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRmN2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbWFuaXB1bGF0aW5nIHRoZSBzZXQgb2YgZmFjZXRzIGluc3RhbGxlZCBvbiBhCi0gKiBwcm9qZWN0LiBVc2Uge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIjY3JlYXRlKElQcm9qZWN0KX0gdG8gZ2V0IGFuIGluc3RhbmNlIAotICogb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0ZWRQcm9qZWN0IAotCi0gICAgZXh0ZW5kcyBJRmFjZXRlZFByb2plY3RCYXNlCi0gICAgCi17Ci0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIHNpbmdsZSBhY3Rpb24gc3VjaCBhcyBpbnN0YWxsaW5nIG9yIHVuaW5zdGFsbGluZyBhIHByb2plY3QKLSAgICAgKiBmYWNldC4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aW9uCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGFjdGlvbiB0eXBlIGVudW1lcmF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLFR5cGU+IGl0ZW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLFR5cGU+KCk7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgSU5TVEFMTCA9IG5ldyBUeXBlKCAiSU5TVEFMTCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIFVOSU5TVEFMTCA9IG5ldyBUeXBlKCAiVU5JTlNUQUxMIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgVkVSU0lPTl9DSEFOR0UgPSBuZXcgVHlwZSggIlZFUlNJT05fQ0hBTkdFIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0YXRpYwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGl0ZW1zLnB1dCggImluc3RhbGwiLCBJTlNUQUxMICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpdGVtcy5wdXQoICJ1bmluc3RhbGwiLCBVTklOU1RBTEwgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGl0ZW1zLnB1dCggInZlcnNpb24tY2hhbmdlIiwgVkVSU0lPTl9DSEFOR0UgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcml2YXRlIFR5cGUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIGl0ZW1zLnB1dCggbmFtZSwgdGhpcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgdmFsdWVPZiggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcy5nZXQoIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgY29uZmlnOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHR5cGUgYWN0aW9uIHR5cGUKLSAgICAgICAgICogQHBhcmFtIGZ2IHRoZSB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uCi0gICAgICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBBY3Rpb24oIGZpbmFsIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdHlwZSA9PSBudWxsIHx8IGZ2ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZnYgPSBmdjsKLSAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgYWN0aW9uIHR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiB0eXBlCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIHRoYXQgdGhpcyAKLSAgICAgICAgICogYWN0aW9uIHdpbGwgYmUgbWFuaXB1bGF0aW5nLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHRoaXMgYWN0aW9uIAotICAgICAgICAgKiAgIHdpbGwgYmUgbWFuaXB1bGF0aW5nCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mdjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbiwgaWYgYW55LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWN0aW9uLCBvcgotICAgICAgICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb25maWcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhICggb2JqIGluc3RhbmNlb2YgQWN0aW9uICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgb2JqOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gYWN0aW9uLnR5cGUgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnYuZXF1YWxzKCBhY3Rpb24uZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuaGFzaENvZGUoKSBeIHRoaXMuZnYuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMudHlwZS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAnWycgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMuZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggJyAnICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggJ10nICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRJbnN0YWxsZWRWZXJzaW9uKCBJUHJvamVjdEZhY2V0IGYgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5JbnN0YWxscyBhIHByb2plY3QgZmFjZXQgb24gdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAqIGNhbGxpbmcgdGhlIHtAc2VlICNtb2RpZnkoU2V0LCBJUHJvZ3Jlc3NNb25pdG9yKX0gbWV0aG9kIHdpdGggYSBzaW5nbGUgCi0gICAgICogaW5zdGFsbCBhY3Rpb24uPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSAKLSAgICAgKiAgIGluc3RhbGxlZAotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIHJlcG9ydGluZyBhbmQgCi0gICAgICogICBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGluc3RhbGwKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGluc3RhbGxQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VW5pbnN0YWxscyBhIHByb2plY3QgZmFjZXQgZnJvbSB0aGlzIHByb2plY3QuIFRoaXMgbWV0aG9kIGlzIAotICAgICAqIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUge0BzZWUgI21vZGlmeShTZXQsIElQcm9ncmVzc01vbml0b3IpfSBtZXRob2QgCi0gICAgICogd2l0aCBhIHNpbmdsZSB1bmluc3RhbGwgYWN0aW9uLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgYXMgaXQgaXMgbG9uZy0KLSAgICAgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLiBBbHRob3VnaCB0aGlzIGZyYW1ld29yawotICAgICAqIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUgYW5kIHRoZQotICAgICAqIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGZ2IHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gdGhhdCBzaG91bGQgYmUgCi0gICAgICogICB1bmluc3RhbGxlZAotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIHJlcG9ydGluZyBhbmQgCi0gICAgICogICBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHVuaW5zdGFsbAotICAgICAqLwotICAgIAotICAgIHZvaWQgdW5pbnN0YWxsUHJvamVjdEZhY2V0KCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+TW9kaWZpZXMgdGhlIHNldCBvZiBwcm9qZWN0IGZhY2V0cyBpbnN0YWxsZWQgb24gdGhpcyBwcm9qZWN0IGJ5IAotICAgICAqIHBlcmZvcm1pbmcgYSBzZXJpZXMgb2YgYWN0aW9ucyBzdWNoIGFzIGluc3RhbGwgYW5kIHVuaW5zdGFsbC48L3A+Ci0gICAgICogCi0gICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkIGFzIGl0IGlzIGxvbmctCi0gICAgICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cy4gQWx0aG91Z2ggdGhpcyBmcmFtZXdvcmsKLSAgICAgKiBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlIGFuZCB0aGUKLSAgICAgKiByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb25zIHRoZSBzZXQgb2YgYWN0aW9ucyB0byBhcHBseSB0byB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbCBpZiBwcm9ncmVzcyByZXBvcnRpbmcgYW5kIAotICAgICAqICAgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nIHdoaWxlIGFwcGx5aW5nIGFjdGlvbnMKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIG1vZGlmeSggU2V0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGZpeGVkIHByb2plY3QgZmFjZXRzIGZvciB0aGlzIHByb2plY3QuIEZpeGVkIGZhY2V0cyAKLSAgICAgKiBjYW5ub3QgYmUgdW5pbnN0YWxsZWQsIGJ1dCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gY2FuIGJlIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2V0cyB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIHRvIG1hcmsgYXMgZml4ZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIHVwZGF0aW5nIHRoZSBzZXQgb2YgZml4ZWQgcHJvamVjdAotICAgICAqICAgZmFjZXRzCi0gICAgICovCi0KLSAgICB2b2lkIHNldEZpeGVkUHJvamVjdEZhY2V0cyggU2V0PElQcm9qZWN0RmFjZXQ+IGZhY2V0cyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRUYXJnZXRSdW50aW1lcygpIGFuZCBnZXRQcmltYXJ5UnVudGltZSgpIGluc3RlYWQKLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXRSdW50aW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkIGFzIGl0IGlzIGxvbmctCi0gICAgICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cy4gQWx0aG91Z2ggdGhpcyBmcmFtZXdvcmsKLSAgICAgKiBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlIGFuZCB0aGUKLSAgICAgKiByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbCBpZiBwcm9ncmVzcyByZXBvcnRpbmcgYW5kIAotICAgICAqICAgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRUYXJnZXRSdW50aW1lcygpIGFuZCBzZXRQcmltYXJ5UnVudGltZSgpIGluc3RlYWQKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIHNldFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5TZXRzIHRoZSBydW50aW1lcyB0aGF0IHRoaXMgcHJvamVjdCB3aWxsIHRhcmdldC4gV2hlbiBhIHByb2plY3QgCi0gICAgICogdGFyZ2V0cyBhIHJ1bnRpbWUsIHRoZSBzZXQgb2YgZmFjZXRzIHRoYXQgY2FuIGJlIGluc3RhbGxlZCBpcyBsaW1pdGVkIHRvIAotICAgICAqIHRob3NlIHN1cHBvcnRlZCBieSB0aGF0IHJ1bnRpbWUuIFdoZW4gYSBwcm9qZWN0IHRhcmdldHMgbXVsdGlwbGUgCi0gICAgICogcnVudGltZXMsIHRoZSBzZXQgb2YgYXBwbGljYWJsZSBmYWNldHMgaXMgbGltaXRlZCB0byB0aG9zZSBzdXBwb3J0ZWQgYnkgCi0gICAgICogYWxsIHRhcmdldGVkIHJ1bnRpbWVzLjxwPgotICAgICAqIAotICAgICAqIDxwPklmIHRoZSBleGlzdGluZyBwcmltYXJ5IHJ1bnRpbWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgaXMgbm90IHBhcnQgb2YgCi0gICAgICogdGhlIG5ldyBzZXQgb2YgdGFyZ2V0ZWQgcnVudGltZXMsIHRoZSBwcmltYXJ5IHJ1bnRpbWUgd2lsbCBiZSByZXNldCB0byAKLSAgICAgKiBvbmUgcGlja2VkIGF0IHJhbmRvbSBmcm9tIHRoZSBuZXcgc2V0LiBJZiB0aGUgbmV3IHNldCBpcyBlbXB0eSwgdGhlIAotICAgICAqIHByaW1hcnkgcnVudGltZSB3aWxsIGJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi48L3A+Ci0gICAgICogCi0gICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkIGFzIGl0IGlzIGxvbmctCi0gICAgICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cy4gQWx0aG91Z2ggdGhpcyBmcmFtZXdvcmsKLSAgICAgKiBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlIGFuZCB0aGUKLSAgICAgKiByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lcyB0aGUgbmV3IHNldCBvZiBydW50aW1lcyB0byB0YXJnZXQKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0gICAgICogICByZXBvcnRpbmcgYW5kIGNhbmNlbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgcHJvamVjdCBjb250YWlucyBvbmUgb3IgbW9yZSBmYWNldHMgdGhhdAotICAgICAqICAgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIG9mIHRoZSBuZXcgcnVudGltZXM7IGlmIGZhaWxlZCBmb3IgYW55IG90aGVyIAotICAgICAqICAgcmVhc29uCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBTZXQ8SVJ1bnRpbWU+IHJ1bnRpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+QWRkcyBhIG5ldyBydW50aW1lIHRvIHRoZSBzZXQgb2YgcnVudGltZXMgdGFyZ2V0ZWQgYnkgdGhpcyBwcm9qZWN0LgotICAgICAqIElmIHRoZSBzZXQgb2YgdGFyZ2V0ZWQgcnVudGltZXMgaGFzIGJlZW4gZW1wdHkgcHJpb3IgdG8gdGhpcyBjYWxsLCB0aGlzCi0gICAgICogcnVudGltZSB3aWxsIGJlY29tZSB0aGUgcHJpbWFyeSBydW50aW1lPC9wPgotICAgICAqICAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgYXMgaXQgaXMgbG9uZy0KLSAgICAgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLiBBbHRob3VnaCB0aGlzIGZyYW1ld29yawotICAgICAqIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUgYW5kIHRoZQotICAgICAqIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0gICAgICogICByZXBvcnRpbmcgYW5kIGNhbmNlbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgcHJvamVjdCBjb250YWlucyBvbmUgb3IgbW9yZSBmYWNldHMgdGhhdAotICAgICAqICAgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lOyBpZiBmYWlsZWQgZm9yIGFueSBvdGhlciByZWFzb24KLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGFkZFRhcmdldGVkUnVudGltZSggSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+UmVtb3ZlcyBhIHJ1bnRpbWUgZnJvbSB0aGUgc2V0IG9mIHJ1bnRpbWVzIHRhcmdldGVkIGJ5IHRoaXMgcHJvamVjdC4KLSAgICAgKiBJZiB0aGlzIHJ1bnRpbWUgaGFzIGJlZW4gdGhlIHByaW1hcnkgcnVudGltZSBwcmlvciB0byB0aGlzIGNhbGwsIGEgbmV3Ci0gICAgICogcHJpbWFyeSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgKHVubGVzcyB0aGUgbGlzdCBvZiB0YXJnZXQKLSAgICAgKiBydW50aW1lcyBiZWNvbWVzIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZSBwcmltYXJ5IHJ1bnRpbWUgd2lsbCBiZSBzZXQKLSAgICAgKiB0byA8Y29kZT5udWxsPC9jb2RlPikuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZW1vdmUKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0gICAgICogICByZXBvcnRpbmcgYW5kIGNhbmNlbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgZm9yIGFueSByZWFzb24KLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIHJlbW92ZVRhcmdldGVkUnVudGltZSggSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiA8cD5TZXRzIHRoZSBwcmltYXJ5IHRhcmdldCBydW50aW1lIGZvciB0aGlzIHByb2plY3QuIFRoZSBuZXcgcHJpbWFyeSBoYXMKLSAgICAgKiB0byBiZSBvbmUgb2YgdGhlIHJ1bnRpbWVzIGN1cnJlbnRseSB0YXJnZXRlZCBieSB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgYXMgaXQgaXMgbG9uZy0KLSAgICAgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLiBBbHRob3VnaCB0aGlzIGZyYW1ld29yawotICAgICAqIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUgYW5kIHRoZQotICAgICAqIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHJ1bnRpbWUgdGhlIG5ldyBwcmltYXJ5IHJ1bnRpbWUKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0gICAgICogICByZXBvcnRpbmcgYW5kIGNhbmNlbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgcHJpbWFyeSBydW50aW1lIGlzIG5vdCBvbmUgb2YgdGhlIHJ1bnRpbWVzCi0gICAgICogICBjdXJyZW50bHkgdGFyZ2V0ZWQgYnkgdGhlIHByb2plY3Q7IGlmIGZhaWxlZCBmb3IgYW55IG90aGVyIHJlYXNvbgotICAgICAqLwotCi0gICAgdm9pZCBzZXRQcmltYXJ5UnVudGltZSggSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpOwotICAgIAotICAgIElNYXJrZXIgY3JlYXRlRXJyb3JNYXJrZXIoIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgSU1hcmtlciBjcmVhdGVFcnJvck1hcmtlciggU3RyaW5nIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICBJTWFya2VyIGNyZWF0ZVdhcm5pbmdNYXJrZXIoIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgSU1hcmtlciBjcmVhdGVXYXJuaW5nTWFya2VyKCBTdHJpbmcgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGFkZExpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApOwotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgdm9pZCByZW1vdmVMaXN0ZW5lciggb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdEJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlOGE3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbWFuaXB1bGF0aW5nIHRoZSBzZXQgb2YgZmFjZXRzIGluc3RhbGxlZCBvbiBhCi0gKiBwcm9qZWN0LiBVc2Uge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIjY3JlYXRlKElQcm9qZWN0KX0gdG8gZ2V0IGFuIGluc3RhbmNlIAotICogb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0ZWRQcm9qZWN0QmFzZQotewotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJPQkxFTV9QUk9KRUNUX05BTUUgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJPQkxFTV9PVEhFUiA9IC0xOwotICAgIAotICAgIElQcm9qZWN0IGdldFByb2plY3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZml4ZWQgcHJvamVjdCBmYWNldHMgZm9yIHRoaXMgcHJvamVjdC4gRml4ZWQgZmFjZXRzIAotICAgICAqIGNhbm5vdCBiZSB1bmluc3RhbGxlZCwgYnV0IHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBjYW4gYmUgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgZml4ZWQgcHJvamVjdCBmYWNldHMgZm9yIHRoaXMgcHJvamVjdAotICAgICAqLwotICAgIAotICAgIFNldDxJUHJvamVjdEZhY2V0PiBnZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLSAgICAKLSAgICBib29sZWFuIGlzRml4ZWRQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXQgZmFjZXQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgY3VycmVudGx5IGluc3RhbGxlZCBvbiB0aGlzIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIGN1cnJlbnRseSBpbnN0YWxsZWQgb24gdGhpcyBwcm9qZWN0IAotICAgICAqLwotICAgIAotICAgIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cygpOwotICAgIAotICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhbnkgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgaXMgCi0gICAgICogaW5zdGFsbGVkIG9uIHRoaXMgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZiB0aGUgcHJvamVjdCBmYWNldCBkZXNjcmlwdG9yCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgCi0gICAgICogICBpcyBpbnN0YWxsZWQgb24gdGhpcyBwcm9qZWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2ZpZWQgcHJvamVjdCBmYWNldCB2ZXJzaW9uIGlzIGluc3RhbGxlZCBvbiAKLSAgICAgKiB0aGlzIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZ2IHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gZGVzY3JpcHRvcgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZhY2V0IHZlcnNpb24gaXMgCi0gICAgICogICBpbnN0YWxsZWQgb24gdGhpcyBwcm9qZWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcHJvamVjdCAoaW4gaXQncyBjdXJyZW50IHN0YXRlKSBjYW4gYmUgdGFyZ2V0ZWQgdG8gdGhlIHByb3ZpZGVkCi0gICAgICogcnVudGltZS4gVGhpcyBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgYnkgbG9va2luZyBhdCB0aGUgZmFjZXRzIHRoYXQgYXJlIGN1cnJlbnRseSBpbnN0YWxsZWQKLSAgICAgKiBhbmQgY2hlY2tpbmcgdGhlbSBhZ2FpbnN0IHRoZSBzZXQgb2YgZmFjZXRzIGtub3duIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgcHJvdmlkZWQgcnVudGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byBjaGVjawotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwcm9qZWN0IGNhbiB0YXJnZXQgdGhlIHByb3ZpZGVkIHJ1bnRpbWUgYW5kCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHNpbmNlIFdUUCAyLjAKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGlzVGFyZ2V0YWJsZSggSVJ1bnRpbWUgcnVudGltZSApOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgcHJvamVjdCBjdXJyZW50bHkgdGFyZ2V0cyB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb2plY3QgY3VycmVudGx5IHRhcmdldHMgdGhlIHNwZWNpZmllZCBydW50aW1lIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEBzaW5jZSBXVFAgMi4wCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBpc1RhcmdldGVkKCBJUnVudGltZSBydW50aW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgc2V0IG9mIGFsbCBydW50aW1lcyB0aGF0IHRoaXMgcHJvamVjdCBpcyB0YXJnZXRpbmcuIFdoZW4gYQotICAgICAqIHByb2plY3QgdGFyZ2V0cyBhIHJ1bnRpbWUsIHRoZSBzZXQgb2YgZmFjZXRzIHRoYXQgY2FuIGJlIGluc3RhbGxlZCBpcwotICAgICAqIGxpbWl0ZWQgdG8gdGhvc2Ugc3VwcG9ydGVkIGJ5IHRoYXQgcnVudGltZS4gV2hlbiBhIHByb2plY3QgdGFyZ2V0cwotICAgICAqIG11bHRpcGxlIHJ1bnRpbWVzLCB0aGUgc2V0IG9mIGFwcGxpY2FibGUgZmFjZXRzIGlzIGxpbWl0ZWQgdG8gdGhvc2UKLSAgICAgKiBzdXBwb3J0ZWQgYnkgYWxsIHRhcmdldGVkIHJ1bnRpbWVzLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgdGFyZ2V0ZWQgcnVudGltZXMKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVJ1bnRpbWU+IGdldFRhcmdldGVkUnVudGltZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBwcmltYXJ5IHRhcmdldCBydW50aW1lIGZvciB0aGlzIHByb2plY3QuIFRoZXJlIGlzIGFsd2F5cwotICAgICAqIGEgcHJpbWFyeSBydW50aW1lIHVubGVzcyB0aGUgbGlzdCBvZiB0YXJnZXQgcnVudGltZXMgaXMgZW1wdHkuPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByaW1hcnkgcnVudGltZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXRQcmltYXJ5UnVudGltZSgpOwotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSB2YXJpZXR5IG9mIGNvbnNpc3RlbmN5IGNoZWNrcyBvdmVyIHRoZSBmYWNldGVkIHByb2plY3QuIFRoZQotICAgICAqIHJlc3VsdCBvZiB0aGUgdmFsaWRhdGlvbiBpcyByZXR1cm5lZCBhcyBhIHN0YXR1cyBvYmplY3QuIAotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotICAgICAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0gICAgICogICBmYWNldGVkIHByb2plY3QgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIAotICAgICAqICAgd3Jvbmcgd2l0aCBpdAotICAgICAqLwotICAgIAotICAgIElTdGF0dXMgdmFsaWRhdGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSB2YXJpZXR5IG9mIGNvbnNpc3RlbmN5IGNoZWNrcyBvdmVyIHRoZSBmYWNldGVkIHByb2plY3QuIFRoZQotICAgICAqIHJlc3VsdCBvZiB0aGUgdmFsaWRhdGlvbiBpcyByZXR1cm5lZCBhcyBhIHN0YXR1cyBvYmplY3QuIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZXF1aXZhbGVudCB0byBjYWxsaW5nIHZhbGlkYXRlIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBwcm9ncmVzcyBtb25pdG9yLiAKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0gICAgICogICBmYWNldGVkIHByb2plY3QgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIAotICAgICAqICAgd3Jvbmcgd2l0aCBpdAotICAgICAqLwotICAgIAotICAgIElTdGF0dXMgdmFsaWRhdGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmFjZXRlZCBwcm9qZWN0IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3RlZCBldmVudHMgaW4gdGhlIGZhY2V0ZWQKLSAgICAgKiBwcm9qZWN0IGxpZmUgY3ljbGUgb2NjdXIuIFRoZSBsaXN0ZW5lciB3aWxsIGFwcGx5IG9ubHkgdG8gdGhpcyBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgZmFjZXRlZCBwcm9qZWN0IGxpc3RlbmVyCi0gICAgICogQHBhcmFtIHR5cGVzIHRoZSB0eXBlcyBvZiB0aGUgZXZlbnRzIHRvIGxpc3RlbiBmb3IKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yCi0gICAgICogICB0aGUgPGNvZGU+dHlwZXM8L2NvZGU+IHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eS4KLSAgICAgKiBAc2VlIHJlbW92ZUxpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBhZGRMaXN0ZW5lciggSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiB0eXBlcyApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdXNpbmcgdGhlCi0gICAgICoge0BzZWUgYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKX0gbWV0aG9kLiBJZiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgbGlzdGVuZXIgaXMgbm90IHByZXNlbnQgaW4gdGhlIGxpc3RlbmVyIHJlZ2lzdHJ5LCB0aGlzIGNhbGwgd2lsbCBiZSBpZ25vcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgZmFjZXRlZCBwcm9qZWN0IGxpc3RlbmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBzZWUgYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpCi0gICAgICovCi0gICAgCi0gICAgdm9pZCByZW1vdmVMaXN0ZW5lciggSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQwMmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBjbGFzcyBmcm9tIHRoZSBmYWNldC5jb3JlLmV2ZW50cyBwYWNrYWdlCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgotewotICAgIHZvaWQgcHJvamVjdENoYW5nZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdFRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI3ZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdFRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldGVkUHJvamVjdFRlbXBsYXRlCi17Ci0gICAgU3RyaW5nIGdldElkKCk7Ci0gICAgU3RyaW5nIGdldExhYmVsKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGZpeGVkIHByb2plY3QgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXQ+IGdldEZpeGVkUHJvamVjdEZhY2V0cygpOwotICAgIElQcmVzZXQgZ2V0SW5pdGlhbFByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyYTk3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgbWFya2VyIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgYWxsIG1hcmtlcnMgcmVwb3J0ZWQKLSAgICAgKiBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IHZhbGlkYXRvci4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTUFSS0VSX0lECi0gICAgICAgID0gRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIudmFsaWRhdGlvbi5tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgdm9pZCB2YWxpZGF0ZSggSUZhY2V0ZWRQcm9qZWN0IGZwcm9qICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MmY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weQotCi0gICAgZXh0ZW5kcyBJRmFjZXRlZFByb2plY3RCYXNlCi0gICAgCi17Ci0gICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0gICAgCi0gICAgLy8gT25seSB3b3JrcyBpZiB0aGUgbW9kZWwgd2Fzbid0IGNyZWF0ZWQgYmFzZWQgb24gYW4gZXhpc3RpbmcgcHJvamVjdC4KLSAgICB2b2lkIHNldFByb2plY3ROYW1lKCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIElQYXRoIGdldFByb2plY3RMb2NhdGlvbigpOwotICAgIHZvaWQgc2V0UHJvamVjdExvY2F0aW9uKCBJUGF0aCBsb2NhdGlvbiApOwotICAgIAotICAgIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdCgpOwotICAgIAotICAgIE1hcDxJUHJvamVjdEZhY2V0LFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4+IGdldEF2YWlsYWJsZUZhY2V0cygpOwotCi0gICAgYm9vbGVhbiBpc0ZhY2V0QXZhaWxhYmxlKCBJUHJvamVjdEZhY2V0IGYgKTsKLSAgICAKLSAgICBib29sZWFuIGlzRmFjZXRBdmFpbGFibGUoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRBdmFpbGFibGVWZXJzaW9ucyggSVByb2plY3RGYWNldCBmICk7Ci0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SGlnaGVzdEF2YWlsYWJsZVZlcnNpb24oIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIHZvaWQgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKTsKLSAgICAKLSAgICB2b2lkIHNldFByb2plY3RGYWNldHMoIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICk7Ci0gICAgCi0gICAgdm9pZCBhZGRQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgdm9pZCByZW1vdmVQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIHZvaWQgcmVtb3ZlUHJvamVjdEZhY2V0KCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotICAgIAotICAgIHZvaWQgY2hhbmdlUHJvamVjdEZhY2V0VmVyc2lvbiggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICAKLSAgICBTZXQ8SVByZXNldD4gZ2V0QXZhaWxhYmxlUHJlc2V0cygpOwotICAgIAotICAgIElQcmVzZXQgZ2V0U2VsZWN0ZWRQcmVzZXQoKTsKLSAgICAKLSAgICB2b2lkIHNldFNlbGVjdGVkUHJlc2V0KCBTdHJpbmcgcHJlc2V0SWQgKTsKLSAgICAKLSAgICBJUHJlc2V0IGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0gICAgCi0gICAgSVByZXNldCBnZXRNaW5pbWFsQ29uZmlndXJhdGlvbigpOwotCi0gICAgU2V0PElSdW50aW1lPiBnZXRUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAKLSAgICB2b2lkIHJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAKLSAgICB2b2lkIHNldFRhcmdldGVkUnVudGltZXMoIFNldDxJUnVudGltZT4gcnVudGltZXMgKTsKLSAgICAKLSAgICB2b2lkIGFkZFRhcmdldGVkUnVudGltZSggSVJ1bnRpbWUgcnVudGltZSApOwotICAgIAotICAgIHZvaWQgcmVtb3ZlVGFyZ2V0ZWRSdW50aW1lKCBJUnVudGltZSBydW50aW1lICk7Ci0gICAgCi0gICAgdm9pZCBzZXRQcmltYXJ5UnVudGltZSggSVJ1bnRpbWUgcnVudGltZSApOwotICAgIAotICAgIFNldDxBY3Rpb24+IGdldFByb2plY3RGYWNldEFjdGlvbnMoKTsKLSAgICAKLSAgICBBY3Rpb24gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBJUHJvamVjdEZhY2V0IGZhY2V0ICk7Ci0gICAgCi0gICAgdm9pZCBzZXRQcm9qZWN0RmFjZXRBY3Rpb25Db25maWcoIElQcm9qZWN0RmFjZXQgZmFjZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdBY3Rpb25Db25maWcgKTsgICAgCi0gICAgCi0gICAgdm9pZCBjb21taXRDaGFuZ2VzKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICB2b2lkIG1lcmdlQ2hhbmdlcyggSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgKTsKLSAgICAKLSAgICB2b2lkIHJldmVydENoYW5nZXMoKTsKLSAgICAKLSAgICBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjbG9uZSgpOwotICAgIAotICAgIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTJhYjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSBncm91cCBpcyBhIG5hbWVkIGNvbGxlY3Rpb24gb2Yge0BzZWUgSVByb2plY3RGYWNldFZlcnNpb259ICBvYmplY3RzLiBJdCBpcyAKLSAqIHVzZWQgcHJpbWFyaWx5IGFzIGEgcGFyYW1ldGVyIHRvIHRoZSAicmVxdWlyZXMiIGFuZCAiY29uZmxpY3RzIiBjb25zdHJhaW50cyAKLSAqIGFuZCBhbGxvd3MgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiB3aGVyZSBhIGZhY2V0IGRvZXMgbm90IG5lZWQgdG8ga25vdyBhYm91dCAKLSAqIGFsbCB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEEgZ2l2ZW4gcHJvamVjdCBmYWNldCB2ZXJzaW9uIGNhbiBiZWxvbmcgdG8gCi0gKiBzZXZlcmFsIGdyb3Vwcy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJR3JvdXAgCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGlzIGdyb3VwCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldElkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JvdXAgbGFiZWwuIFRoZSBsYWJlbCBzaG91bGQgYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlCi0gICAgICogZ3JvdXAgdG8gdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZ3JvdXAgbGFiZWwKLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyb3VwIGRlc2NyaXB0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdyb3VwIGRlc2NyaXB0aW9uCi0gICAgICovCi0KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgbWVtYmVyIHByb2plY3QgZmFjZXRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBtZW1iZXIgcHJvamVjdCBmYWNldHMKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldE1lbWJlcnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3MDNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTGlzdGVuZXIKLXsKLSAgICB2b2lkIGhhbmRsZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByZXNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByZXNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzI1NTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcmVzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIHByZXNldCBpcyBhIHVzZXIgY29udmVuaWVuY2UgbWVjaGFuaXNtIGZvciBxdWlja2x5IHNlbGVjdGluZyBhIHByZWRlZmluZWQgc2V0IG9mIHByb2plY3QgCi0gKiBmYWNldHMuIFByZXNldHMgY2FuIGJlIGRlZmluZWQgYnkgcGx1Z2luIHdyaXRlcnMgdGhyb3VnaCB0aGUgc3VwcGxpZWQgPGNvZGU+cHJlc2V0czwvY29kZT4gCi0gKiBleHRlbnNpb24gcG9pbnQgYXMgd2VsbCBhcyBieSBlbmQgdXNlcnMuIFVzZXItZGVmaW5lZCBwcmVzZXRzIGFyZSBzdG9yZWQgaW4gdGhlIHdvcmtzcGFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJlc2V0Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIGVudW1iZXJhdGlvbiBvZiBwcmVzZXQgdHlwZXMuCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIAotICAgIGVudW0gVHlwZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXRpYyBwcmVzZXRzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSA8Y29kZT5wcmVzZXRzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgYW5kIGFyZSBmdWxseQotICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludC4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgU1RBVElDLAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIER5bmFtaWMgcHJlc2V0cyBhcmUgY3JlYXRlZCBieSByZWdpc3RlcmluZyBhIGZhY3RvcnkgaW4gdGhlIDxjb2RlPnByZXNldHM8L2NvZGU+Ci0gICAgICAgICAqIGV4dGVuc2lvbiBwb2ludCBhbmQgYXJlIG5vdCBmdWxseSBzcGVjaWZpZWQgdW50aWwgdGhleSBhcmUgcmVzb2x2ZWQgd2l0aGluIHRoZSBjb250ZXh0Ci0gICAgICAgICAqIG9mIHVzZS4gVG8gcmVzb2x2ZSBhIGR5bmFtaWMgcHJlc2V0LCBjYXN0IHRoZSBwcmVzZXQgb2JqZWN0IHRvIHtAc2VlIElEeW5hbWljUHJlc2V0fSBhbmQKLSAgICAgICAgICogdGhlbiB1c2UgdGhlIHtAc2VlIElEeW5hbWljUHJlc2V0LnJlc29sdmUoamF2YS51dGlsLk1hcCl9IG1ldGhvZC4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgRFlOQU1JQywKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VyIHByZXNldHMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIDxjb2RlPlByb2plY3RGYWNldHNNYW5hZ2VyLmRlZmluZVByZXNldCgpPC9jb2RlPgotICAgICAgICAgKiBtZXRob2RzIGFuZCBhcmUgc3RvcmVkIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgVVNFUl9ERUZJTkVECi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBwcmVzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHByZXNldAotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHByZXNldC4gSWYgdGhlIHByZXNldCB0eXBlIGlzIHtAc2VlIFR5cGUuRFlOQU1JQ30sIHRoZW4gdGhlIHByZXNldAotICAgICAqIG9iamVjdCBjYW4gYmUgY2FzdCB0byB7QHNlZSBJRHluYW1pY1ByZXNldH0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgcHJlc2V0Ci0gICAgICogQHNpbmNlIDIuMAotICAgICAqLwotICAgIAotICAgIFR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIHByZXNldCB0byB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVzZXQgbGFiZWwKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0TGFiZWwoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVzZXQKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgcHJlc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gcHJvamVjdCBmYWNldHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHByZXNldAotICAgICAqLwotCi0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByZXNldCBpcyB1c2VyIGRlZmluZWQuIEEgdXNlci1kZWZpbmVkIHByZXNldCBpcwotICAgICAqIHN0b3JlZCBpbiB0aGUgd29ya3NwYWNlIGFuZCBjYW4gYmUgZGVsZXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVzZXQgaXMgdXNlci1kZWZpbmVkLAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BzZWUgZ2V0VHlwZSgpfSBtZXRob2QgaW5zdGVhZAotICAgICAqLwotICAgIAotICAgIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByZXNldEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcmVzZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWJiN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByZXNldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQSBwcmVzZXQgZmFjdG9yeSBpcyB1c2VkIGZvciBjcmVhdGluZyBhIGR5bmFtaWMgcHJlc2V0LiBVbmxpa2UgYSBzdGF0aWMgcHJlc2V0LCB3aGljaCBpcyBmdWxseQotICogc3BlY2lmaWVkIGZyb20gdGhlIHN0YXJ0LCBhIGR5bmFtaWMgcHJlc2V0IHVzZXMgYSBmYWN0b3J5IHRvIHN5bnRoZXNpemUgdGhlIHByZXNldCBkZWZpbml0aW9uIG9uIAotICogdGhlIGZseSBiYXNlZCBvbiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCB3aWxsIGJlIHVzZWQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcmVzZXRGYWN0b3J5Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIGZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIHByZXNldCBkZWZpbml0aW9uLiBUaGUgZGVmaW5pdGlvbiBjb250YWlucyBhbGwgb2YgdGhlIAotICAgICAqIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgdGhlIHN5c3RlbSB0byBjcmVhdGUgYSBwcmVzZXQuIFRoZSBmYWN0b3J5IGNhbiB0YWtlIGludG8gYWNjb3VudCAKLSAgICAgKiB0aGUgY29udGV4dCB0aGF0IHRoZSBwcmVzZXQgd2lsbCBiZSB1c2VkIGluIHdoZW4gY3JlYXRpbmcgYSBwcmVzZXQgZGVmaW5pdGlvbi4gU2VlCi0gICAgICoge0BzZWUgSUR5bmFtaWNQcmVzZXR9IGZvciBkb2N1bWVudGF0aW9uIG9uIHdoYXQgdHlwZSBvZiBpbmZvcm1hdGlvbiB0aGUgY29udGV4dCBjYW4gY29udGFpbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVzZXRJZCB0aGUgaWQgb2YgdGhlIHByZXNldAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCBjb250ZXh0IHRoYXQgdGhpcyBwcmVzZXQgd2lsbCBiZSB1c2VkIGluCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBwcmVzZXQgZGVmaW5pdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGZhY3RvcnkgaXMgbm90IGFwcGxpY2FibGUgCi0gICAgICogICB0byB0aGUgcHJvdmlkZWQgY29udGV4dAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgY3JlYXRpbmcgdGhlIHByZXNldCBkZWZpbml0aW9uCi0gICAgICovCi0gICAgCi0gICAgUHJlc2V0RGVmaW5pdGlvbiBjcmVhdGVQcmVzZXQoIFN0cmluZyBwcmVzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcm9qZWN0RmFjZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcm9qZWN0RmFjZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2YTJhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUHJvamVjdEZhY2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogQ29udGFpbnMgbWV0YWRhdGEgdGhhdCBkZXNjcmliZXMgYSBwcm9qZWN0IGZhY2V0LiBUaGlzIGludGVyZmFjZSBpcyBub3QgCi0gKiBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0RmFjZXQKLQotICAgIGV4dGVuZHMgSUFkYXB0YWJsZQotICAgIAotewotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0J3MgdXNlZCBmb3Igc3VnZ2VzdGluZyB0byB0aGUgZnJhbWV3b3JrIHRoYXQgdGhpcyBmYWNldCdzCi0gICAgICogdmVyc2lvbiBkb2VzIG5vdCBjb252ZXkgYSBzcGVjaWFsIG1lYW5pbmcgYW5kIHNob3VsZCBiZSBoaWRkZW4gd2hlcmUgcG9zc2libGUuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ISURFX1ZFUlNJT04gPSAiaGlkZS52ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgZmFjZXQgaWRlbnRpZmllci4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCBpZGVudGlmaWVyCi0gICAgICovCi0KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgZGVmaW5lcyB0aGlzIHByb2plY3QgZmFjZXQuIFRoaXMgbWV0aG9kCi0gICAgICogd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBmYWNldCBpcyBub3QgZGVmaW5lZC4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGRlZmluZXMgdGhpcyBwcm9qZWN0IGZhY2V0LCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0IGxhYmVsLiBUaGUgbGFiZWwgc2hvdWxkIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nCi0gICAgICogdGhlIHByb2plY3QgZmFjZXQgdG8gdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCBsYWJlbAotICAgICAqLwotCi0gICAgU3RyaW5nIGdldExhYmVsKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCBmYWNldCBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGZhY2V0IGRlc2NyaXB0aW9uCi0gICAgICovCi0KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSwgaWYgYW55LCB0aGF0IHRoaXMgcHJvamVjdCBmYWNldCBiZWxvbmdzIHRvLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNhdGVnb3J5IHRoYXQgdGhpcyBwcm9qZWN0IGZhY2V0IGJlbG9uZ3MgdG8sIG9yIAotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9ycyBvZiBhbGwgdmVyc2lvbnMgb2YgdGhpcyBwcm9qZWN0IGZhY2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3JzIG9mIGFsbCB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QgZmFjZXQKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFZlcnNpb25zKCk7Ci0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRWZXJzaW9ucyggU3RyaW5nIGV4cHIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZhY2V0IHZlcnNpb24gZXhpc3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzb24gc3RyaW5nCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgdmVyc2lvbiBleGlzdHMsCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBoYXNWZXJzaW9uKCBTdHJpbmcgdmVyc2lvbiApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIHByb2plY3QgZmFjZXQgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiBwcm9qZWN0IGZhY2V0IHZlcnNpb24sIG9yIAotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAgICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0VmVyc2lvbiggU3RyaW5nIHZlcnNpb24gKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0Ci0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbigpCi0gICAgCi0gICAgCXRocm93cyBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHByb2plY3QgZmFjZXQgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCi0gICAgICogZ2l2ZW4gcnVudGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZQotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHByb2plY3QgZmFjZXQgdGhhdCBpcyBzdXBwb3J0ZWQKLSAgICAgKiAgIGJ5IHRoZSBnaXZlbiBydW50aW1lCi0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0TGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiggSVJ1bnRpbWUgcnVudGltZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZhY2V0IHZlcnNpb24gdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gSWYgdGhlCi0gICAgICogZGVmYXVsdCB2ZXJzaW9uIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgZmFjZXQgZGVmaW5pdGlvbiwgdGhlCi0gICAgICogbGF0ZXN0IHZlcnNpb24gKGFzIHNwZWNpZmllZCBieSB7QHNlZSBnZXRMYXRlc3RWZXJzaW9uKCl9IG1ldGhvZCkgd2lsbAotICAgICAqIGJlIHJldHVybmVkLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmYWNldCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLSAgICAgKi8KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNvcnRlZCBsaXN0IGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0b3JzIG9mIGFsbCB2ZXJzaW9ucyBvZiB0aGlzIAotICAgICAqIHByb2plY3QgZmFjZXQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgd2hldGhlciB2ZXJzaW9uIGRlc2NyaXB0b3JzIHNob3VsZCBiZSBzb3J0ZWQgaW4gCi0gICAgICogICBhc2NlbmRpbmcgb3JkZXIKLSAgICAgKiBAcmV0dXJuIGEgc29ydGVkIGxpc3QgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvcnMgb2YgYWxsIHZlcnNpb25zIG9mIHRoaXMgCi0gICAgICogICBwcm9qZWN0IGZhY2V0Ci0gICAgICovCi0gICAgCi0gICAgTGlzdDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0U29ydGVkVmVyc2lvbnMoIGJvb2xlYW4gYXNjZW5kaW5nICkKLSAgICAKLSAgICAgICAgdGhyb3dzIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBjb21wYXJhdG9yIHNwZWNpZmllZCBmb3IgdGhpcyBwcm9qZWN0IGZhY2V0LiBJZiBubyAKLSAgICAgKiB2ZXJzaW9uIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiAKLSAgICAgKiB0aGUge0BzZWUgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGZvciB0aGlzIHByb2plY3QgZmFjZXQKLSAgICAgKi8KLSAgICAKLSAgICBDb21wYXJhdG9yPFN0cmluZz4gZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIGZhY2V0LiBTb21lIG9mCi0gICAgICogdGhlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHByb2Nlc3NlZCBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IGZyYW1ld29yaywgd2hpbGUgb3RoZXJzCi0gICAgICogYXJlIHRoZXJlIGZvciB0aGUgYmVuZWZpdCBvZiBmcmFtZXdvcmsncyB1c2Vycy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcHJvamVjdCBmYWNldAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIG5hbWUuIFByb3BlcnRpZXMgc3BlY2lmeSBhZGRpdGlvbmFsCi0gICAgICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgZmFjZXQuIFNvbWUgb2YgdGhlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHByb2Nlc3NlZCBieSB0aGUKLSAgICAgKiBmYWNldGVkIHByb2plY3QgZnJhbWV3b3JrLCB3aGlsZSBvdGhlcnMgYXJlIHRoZXJlIGZvciB0aGUgYmVuZWZpdCBvZiBmcmFtZXdvcmsncyB1c2Vycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgCi0gICAgT2JqZWN0IGdldFByb3BlcnR5KCBTdHJpbmcgbmFtZSApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByb2plY3RGYWNldFZlcnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcm9qZWN0RmFjZXRWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWMyOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByb2plY3RGYWNldFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLQotLyoqCi0gKiBDb250YWlucyBtZXRhZGF0YSB0aGF0IGRlc2NyaWJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBwcm9qZWN0IGZhY2V0LiBUaGlzIAotICogaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBieSBjbGllbnRzLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0RmFjZXRWZXJzaW9uCi0KLSAgICBleHRlbmRzIENvbXBhcmFibGUsIElWZXJzaW9uCi0gICAgCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCBmYWNldCBkZXNjcmlwdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgZmFjZXQgZGVzY3JpcHRvcgotICAgICAqLwotICAgIAotICAgIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhhdCBkZWZpbmVzIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uLiAKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZlcnNpb24gaXMgbm90IGRlZmluZWQuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhhdCBkZWZpbmVzIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uLCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb25zdHJhaW50IHRoYXQgaGFzIHRvIGJlIHNhdGlzZmllZCBwcmlvciB0byBpbnN0YWxsaW5nIHRoaXMKLSAgICAgKiBwcm9qZWN0IGZhY2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cmFpbnQgdGhhdCBoYXMgdG8gYmUgc2F0aXNmaWVkIHByaW9yIHRvIGluc3RhbGxpbmcgdGhpcyAKLSAgICAgKiAgIHByb2plY3QgZmFjZXQKLSAgICAgKi8KLSAgICAKLSAgICBJQ29uc3RyYWludCBnZXRDb25zdHJhaW50KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uIHN1cHBvcnRzIGEgcGFydGljdWxhciAKLSAgICAgKiBhY3Rpb24gdHlwZS4gRm9yIGluc3RhbmNlLCBzb21lIHByb2plY3QgZmFjZXRzIG1heSBub3QgYmUgdW5pbnN0YWxsYWJsZSwgCi0gICAgICogaW4gd2hpY2ggY2FzZSB0aGV5IHdpbGwgbm90IHN1cHBvcnQgPGNvZGU+QWN0aW9uLlR5cGUuVU5JTlNUQUxMPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIHRoZSBwcm9qZWN0IHRoYXQKLSAgICAgKiAgIHRoZSBkZXNpcmVkIGFjdGlvbiB0eXBlIHdvdWxkIGJlIGV4ZWN1dGVkIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gdHlwZSBhY3Rpb24gdHlwZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhpcyBwcm9qZWN0IGZhY2V0IHN1cHBvcnRzIHRoZSAKLSAgICAgKiAgIHByb3ZpZGVkIGFjdGlvbiB0eXBlCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBzdXBwb3J0cyggU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbi5UeXBlIHR5cGUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24gc3VwcG9ydHMgYSBwYXJ0aWN1bGFyIAotICAgICAqIGFjdGlvbiB0eXBlLiBGb3IgaW5zdGFuY2UsIHNvbWUgcHJvamVjdCBmYWNldHMgbWF5IG5vdCBiZSB1bmluc3RhbGxhYmxlLCAKLSAgICAgKiBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBub3Qgc3VwcG9ydCA8Y29kZT5BY3Rpb24uVHlwZS5VTklOU1RBTEw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIGFjdGlvbiB0eXBlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb2plY3QgZmFjZXQgc3VwcG9ydHMgdGhlIHByb3ZpZGVkIAotICAgICAqICAgYWN0aW9uIHR5cGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIHN1cHBvcnRzKCBTZXQsIEFjdGlvbi5UeXBlKX0gaW5zdGVhZAotICAgICAqLwotICAgIAotICAgIGJvb2xlYW4gc3VwcG9ydHMoIEFjdGlvbi5UeXBlIHR5cGUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgYWN0aW9uIGRlZmluaXRpb25zIGZvciB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUgYWN0aW9uIGRlZmluaXRpb25zIGZvciB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbgotICAgICAqLwotICAgIAotICAgIFNldDxJQWN0aW9uRGVmaW5pdGlvbj4gZ2V0QWN0aW9uRGVmaW5pdGlvbnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gZGVmaW5pdGlvbnMgY29ycmVzcG9uZGluZyB0byBhIHBhcnRpY3VsYXIgYWN0aW9uIHR5cGUKLSAgICAgKiBvdmVyIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uLiBGb3IgPGNvZGU+SU5TVEFMTDwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+VU5JTlNUQUxMPC9jb2RlPiBhY3Rpb24gdHlwZXMsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgc2V0IG9mCi0gICAgICogbGVuZ3RoIDAgb3IgMS4gRm9yIDxjb2RlPlZFUlNJT05fQ0hBTkdFPC9jb2RlPiBhY3Rpb24gdHlwZSwgdGhlIHJldHVybmVkCi0gICAgICogc2V0IG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgaXRlbSBhcyB0aGVyZSBtYXkgZXhpc3QgbXVsdGlwbGUgYWN0aW9uCi0gICAgICogZGVmaW5pdGlvbnMgZm9yIGNvbnZlcnRpbmcgZnJvbSB2YXJpb3VzIHZlcnNpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIGFjdGlvbiB0eXBlCi0gICAgICogQHJldHVybiBhIHNldCBjb250YWluaW5nIGFjdGlvbiBkZWZpbml0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhcgotICAgICAqICAgYWN0aW9uIHR5cGUgb3ZlciB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbiAKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIGRlZmluaXRpb24gY29ycmVzcG9uZGluZyB0byBhIHBhcnRpY3VsYXIgYWN0aW9uIHR5cGUKLSAgICAgKiBvdmVyIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uLiBUaGUge0BsaW5rIHN1cHBvcnRzKCBTZXQsIEFjdGlvbi5UeXBlICl9IAotICAgICAqIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBhY3Rpb24gaXMgc3VwcG9ydGVkIHByaW9yIHRvCi0gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIHRoZSBwcm9qZWN0IHRoYXQKLSAgICAgKiAgIHRoZSBkZXNpcmVkIGFjdGlvbiB0eXBlIHdvdWxkIGJlIGV4ZWN1dGVkIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gdHlwZSBhY3Rpb24gdHlwZQotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIGFjdGlvbiB0eXBlCi0gICAgICogICBvdmVyIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gICAgICogICBwcm92aWRlZCBhY3Rpb24gdHlwZQotICAgICAqLwotICAgIAotICAgIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29uZmlnIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGFjdGlvbiBvbiB0aGlzIGZhY2V0LiBXaWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYWN0aW9uIAotICAgICAqIHJlcXVpcmVzIG5vIGNvbmZpZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgYWN0aW9uLgotICAgICAqIEBwYXJhbSBwam5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkCi0gICAgICogICBvbgotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBjb25maWcgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICAgICAqICAgc3BlY2lmaWVkIGFjdGlvbiB0eXBlIG9yIGlmIGZhaWxlZCB3aGlsZSBjcmVhdGluZyB0aGUgYWN0aW9uIGNvbmZpZwotICAgICAqICAgb2JqZWN0Ci0gICAgICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2Qgd2lsbCBub3QgYmVoYXZlIGNvcnJlY3RseSBpbiBwcmVzZW5jZSBvZiBtdWx0aXBsZQotICAgICAqIGFjdGlvbiBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIGFzIGNhbiBiZSB0aGUgY2FzZSB3aXRoIFZFUlNJT05fQ0hBTkdFCi0gICAgICogYWN0aW9uczsgaW5zdGVhZCB1c2UgSUFjdGlvbkRlZmluaXRpb24uY3JlYXRlQ29uZmlnT2JqZWN0KCkKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgY3JlYXRlQWN0aW9uQ29uZmlnKCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwam5hbWUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZWhhdmUgY29ycmVjdGx5IGluIHByZXNlbmNlIG9mIG11bHRpcGxlCi0gICAgICogYWN0aW9uIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHR5cGUgYXMgY2FuIGJlIHRoZSBjYXNlIHdpdGggVkVSU0lPTl9DSEFOR0UKLSAgICAgKiBhY3Rpb25zOyBpbnN0ZWFkIGNvbXBhcmUgYXBwcm9wcmlhdGUgSUFjdGlvbkRlZmluaXRpb24gb2JqZWN0cyBkaXJlY3RseSAKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGlzU2FtZUFjdGlvbkNvbmZpZyggQWN0aW9uLlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBmYWNldCB2ZXJzaW9uIGlzIHZhbGlkIGZvciBwcm9qZWN0cyB0aGF0IGhhdmUKLSAgICAgKiB0aGUgcHJvdmlkZWQgc2V0IG9mIGZpeGVkIGZhY2V0cy4gVGhlIGRldGVybWluYXRpb24gaXMgZG9uZSBieSBjaGVja2luZyAKLSAgICAgKiB0byBzZWUgd2hldGhlciB0aGlzIGZhY2V0IG9yIGFueSBvZiBpdHMgZGVwZW5kZW5jaWVzIGFyZSBpbiBjb25mbGljdCB3aXRoCi0gICAgICogYW55IG9mIHRoZSBmaXhlZCBmYWNldHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpeGVkIHRoZSBzZXQgb2YgZml4ZWQgZmFjZXRzCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZhY2V0IHZlcnNpb24gaXMgdmFsaWQgZm9yIHRoZSBwcm9qZWN0cwotICAgICAqICAgdGhhdCBoYXZlIHRoZSBwcm92aWRlZCBzZXQgb2YgZml4ZWQgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBpc1ZhbGlkRm9yKCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKTsKLSAgICAKLSAgICBib29sZWFuIGNvbmZsaWN0c1dpdGgoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIGZhY2V0IHZlcnNpb24uIAotICAgICAqIFNvbWUgb2YgdGhlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHByb2Nlc3NlZCBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IGZyYW1ld29yaywgd2hpbGUgCi0gICAgICogb3RoZXJzIGFyZSB0aGVyZSBmb3IgdGhlIGJlbmVmaXQgb2YgZnJhbWV3b3JrJ3MgdXNlcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIG5hbWUuIFByb3BlcnRpZXMgc3BlY2lmeSBhZGRpdGlvbmFsCi0gICAgICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgZmFjZXQgdmVyc2lvbi4gU29tZSBvZiB0aGUgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgcHJvY2Vzc2VkCi0gICAgICogYnkgdGhlIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmssIHdoaWxlIG90aGVycyBhcmUgdGhlcmUgZm9yIHRoZSBiZW5lZml0IG9mIGZyYW1ld29yaydzIAotICAgICAqIHVzZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoIFN0cmluZyBuYW1lICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUnVudGltZUNoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVJ1bnRpbWVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NmRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUnVudGltZUNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBydW50aW1lIGNoYW5nZWQgZXZlbnQgdG8gdGhlIFJVTlRJTUVfQ0hBTkdFRCBldmVudCBoYW5kbGVycy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKiBAZGVwcmVjYXRlZCB1c2UgdGhlIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGNsYXNzIGZyb20gdGhlIGZhY2V0LmNvcmUuZXZlbnRzIHBhY2thZ2UgaW5zdGVhZAotICogICBvZiB0aGUgZXZlbnQgaGFuZGxlciBleHRlbnNpb24gcG9pbnQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lQ2hhbmdlZEV2ZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXRPbGRSdW50aW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSB0aGF0J3Mgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIHRoYXQncyBub3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXROZXdSdW50aW1lKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JVmVyc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0YWZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gQ2xpZW50IGNvZGUgc2hvdWxkIG9ubHkKLSAqIHJlZmVyZW5jZSA8Y29kZT5JUHJvamVjdEZhY2V0VmVyc2lvbjwvY29kZT4gYW5kIDxjb2RlPklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjwvY29kZT4sCi0gKiB3aGljaCBleHRlbmQgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgSVZlcnNpb24KLQotICAgIGV4dGVuZHMgQ29tcGFyYWJsZQotICAgIAotewotICAgIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JVmVyc2lvbkV4cHIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lWZXJzaW9uRXhwci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZkNzE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lWZXJzaW9uRXhwci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotLyoqCi0gKiBUaGUgY29tcGlsZWQgZm9ybSBvZiBhIHZlcnNpb24gZXhwcmVzc2lvbi4gQSB2ZXJzaW9uIGV4cHJlc3Npb24gaXMgdXNlZCB0bwotICogc3BlY2lmeSBvbmUgb3IgbW9yZSB2ZXJzaW9ucy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVmVyc2lvbkV4cHIKLXsKLSAgICAvKioKLSAgICAgKiBDb250YWlucyB0aGUgc3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB3aWxkY2FyZC4gVGhlIHdpbGRjYXJkIG1hdGNoZXMKLSAgICAgKiBhbnkgdmVyc2lvbi4gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIHdpbGRjYXJkIHRvIG1hdGNoCi0gICAgICogcGFydCBvZiB0aGUgdmVyc2lvbiBzdHJpbmcuIAotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lMRENBUkRfU1lNQk9MID0gIioiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHZlcnNpb24uIFJldHVybnMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgdmVyc2lvbiBleHByZXNzaW9uIG1hdGNoZXMgdGhlCi0gICAgICogc3BlY2lmaWVkIHZlcnNpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2JqZWN0IHRvIGNoZWNrIGFnYWluc3QgdGhlIHZlcnNpb24gZXhwcmVzc2lvbgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIHZlcnNpb24gZXhwcmVzc2lvbiBtYXRjaGVzCi0gICAgICogICB0aGUgc3BlY2lmaWVkIHZlcnNpb24KLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGNoZWNrKCBJVmVyc2lvbiB2ZXJzaW9uICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBjaGVjayBtZXRob2QgaW5zdGVhZAotICAgICAqLwotICAgICAKLSAgICBib29sZWFuIGV2YWx1YXRlKCBTdHJpbmcgdmVyc2lvbiApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgaHVtYW4tcmVhZGFibGUgZm9ybSBvZiB0aGUgdmVyc2lvbiBleHByZXNzaW9uIHRoYXQgdXNlcwotICAgICAqIGRlc2NyaXB0aXZlIHRlcm1zIHJhdGhlciB0aGFuIHN5bWJvbHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBodW1hbi1yZWFkYWJsZSBmb3JtIG9mIHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9NaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE4MDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50OwotCi0vKioKLSAqIFByZXNldCBmYWN0b3J5IGZvciB0aGUgPGNvZGU+bWluaW1hbC5jb25maWd1cmF0aW9uPC9jb2RlPiBwcmVzZXQuIFRoaXMgcHJlc2V0IG9ubHkgY29udGFpbnMKLSAqIGZpeGVkIGZhY2V0cy4gVGhlIHZlcnNpb24gb2YgdGhlIGZhY2V0cyBhcmUgY2FsY3VsYXRlZCBhcyBmb2xsb3dzOiAKLSAqIAotICogPG9sPgotICogICA8bGk+SWYgYSBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGUgdmVyc2lvbnMgYXJlIGxvb2tlZCB1cCB1c2luZyAKLSAqICAgICB7QHNlZSBJUnVudGltZS5nZXREZWZhdWx0RmFjZXRzKFNldCl9LjwvbGk+Ci0gKiAgIDxsaT5JZiBubyBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHZlcnNpb25zIGFyZSB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBhcyBzcGVjaWZpZWQgCi0gKiAgICAgYnkge0BzZWUgSVByb2plY3RGYWNldC5nZXREZWZhdWx0VmVyc2lvbigpfS4KLSAqIDwvb2w+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBNaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkKLQotICAgIGltcGxlbWVudHMgSVByZXNldEZhY3RvcnkKLSAgICAKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVRfSUQgPSAibWluaW1hbC5jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBQcmVzZXREZWZpbml0aW9uIGNyZWF0ZVByZXNldCggZmluYWwgU3RyaW5nIHByZXNldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RCYXNlIGZwcm9qIAotICAgICAgICAgICAgPSAoSUZhY2V0ZWRQcm9qZWN0QmFzZSkgY29udGV4dC5nZXQoIElEeW5hbWljUHJlc2V0LkNPTlRFWFRfS0VZX0ZBQ0VURURfUFJPSkVDVCApOwotICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBkZWZhdWx0RmFjZXRzIAotICAgICAgICAgICAgPSBEZWZhdWx0RmFjZXRzRXh0ZW5zaW9uUG9pbnQuZ2V0RGVmYXVsdEZhY2V0cyggZnByb2ogKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldHMuYWRkKCBmaW5kUHJvamVjdEZhY2V0VmVyc2lvbiggZGVmYXVsdEZhY2V0cywgZiApICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgUHJlc2V0RGVmaW5pdGlvbiggUmVzb3VyY2VzLnByZXNldExhYmVsLCBSZXNvdXJjZXMucHJlc2V0RGVzY3JpcHRpb24sIGZhY2V0cyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmaW5kUHJvamVjdEZhY2V0VmVyc2lvbiggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQgKQotICAgIHsKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGZhY2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSA9PSBmYWNldCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZ2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldExhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXREZXNjcmlwdGlvbjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIE1pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvTWluaW1hbENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDZlNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvTWluaW1hbENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXByZXNldExhYmVsID0gTWluaW1hbCBDb25maWd1cmF0aW9uCi1wcmVzZXREZXNjcmlwdGlvbiA9IFRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBzdGFydGluZyBwb2ludC4gT25seSB0aGUgcmVxdWlyZWQgZmFjZXRzIGFyZSBpbnN0YWxsZWQuIEFkZGl0aW9uYWwgZmFjZXRzIGNhbiBsYXRlciBiZSBpbnN0YWxsZWQgdG8gYWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBwcm9qZWN0LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvUHJlc2V0RGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvUHJlc2V0RGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0YjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ByZXNldERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgcHJlc2V0IGRlZmluaXRpb24gaXMgdXNlZCBpbiBzZXZlcmFsIGNvbnRleHRzIGFzIGEgbWVhbnMgb2YgZGVzY3JpYmluZyBhIHByZXNldC4gSXQgaXMKLSAqIGRpZmZlcmVudCBmcm9tIHtAc2VlIElQcmVzZXR9IGluIHRoYXQgdGhlIHByZXNldCBkZWZpbml0aW9uIGlzIG5vdCBhbiBhY3R1YWwgcHJlc2V0IHRoYXQncwotICogcmVnaXN0ZXJlZCB3aXRoIHRoZSBzeXN0ZW0uIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJlc2V0RGVmaW5pdGlvbgotewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcmVzZXQgZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBwcmVzZXQgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVzZXQKLSAgICAgKiBAcGFyYW0gZmFjZXRzIHRoZSBmYWNldHMgdGhhdCBjb21wcmlzZSB0aGUgcHJlc2V0Ci0gICAgICovCi0gICAgCi0gICAgcHVibGljIFByZXNldERlZmluaXRpb24oIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApCi0gICAgewotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgdGhpcy5mYWNldHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggZmFjZXRzICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmYWNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZnYgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhYmVsIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBwcmVzZXQgdG8gdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlc2V0IGxhYmVsCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVzZXQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgcHJlc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gcHJvamVjdCBmYWNldHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHByZXNldAotICAgICAqLwotCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldHM7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvUHJvamVjdEZhY2V0c01hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1Byb2plY3RGYWNldHNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjA3NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvUHJvamVjdEZhY2V0c01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgcHJvamVjdCBmYWNldCBmcmFtZXdvcmsgQVBJLiBGcm9tIGhlcmUsIHlvdSAKLSAqIGNhbiAoYW1vbmcgb3RoZXIgdGhpbmdzKSBsaXN0IGF2YWlsYWJsZSBwcm9qZWN0IGZhY2V0cyBhbmQgY3JlYXRlIGluc3RhbmNlcyAKLSAqIG9mIHtAc2VlIElGYWNldGVkUHJvamVjdH0uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0RmFjZXRzTWFuYWdlciAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwgaW1wbCA9IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5nZXRJbnN0YW5jZSgpOwotICAgIAotICAgIHByaXZhdGUgUHJvamVjdEZhY2V0c01hbmFnZXIoKSB7fQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBhdmFpbGFibGUgcHJvamVjdCBmYWNldHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBjb250YWluaW5nIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHByb2plY3QgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVByb2plY3RGYWNldD4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gcHJvamVjdCBmYWNldCBpZCBpcyByZWNvZ25pemVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHByb2plY3QgZmFjZXQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGZhY2V0IGlkIGlzIHJlY29nbml6ZWQsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZSAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0IGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHByb2plY3QgZmFjZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGZhY2V0IGRlc2NyaXB0b3IKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpZCBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHByb2plY3QgZmFjZXQgYWN0aW9uIGRlZmluaXRpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIGF2YWlsYWJsZSBwcm9qZWN0IGZhY2V0cyBhY3Rpb24KLSAgICAgKiAgIGRlZmluaXRpb25zCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldEFjdGlvbkRlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIHByb2plY3QgZmFjZXQgYWN0aW9uIGlkIGlzIHJlY29nbml6ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgcHJvamVjdCBmYWNldCBhY3Rpb24KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGZhY2V0IGFjdGlvbiBpZCBpcyByZWNvZ25pemVkLCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aW9uRGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmlzQWN0aW9uRGVmaW5lZCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCBmYWNldCBhY3Rpb24gZGVmaW5pdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgYWN0aW9uIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHByb2plY3QgZmFjZXQgYWN0aW9uCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCBhY3Rpb24gZGVmaW5pdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGlkIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUFjdGlvbkRlZmluaXRpb24gZ2V0QWN0aW9uRGVmaW5pdGlvbiggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldEFjdGlvbkRlZmluaXRpb24oIGlkICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIGNhdGVnb3JpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBjb250YWluaW5nIGFsbCBvZiB0aGUgY2F0ZWdvcmllcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElDYXRlZ29yeT4gZ2V0Q2F0ZWdvcmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRDYXRlZ29yaWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gY2F0ZWdvcnkgaWQgaXMgcmVjb2duaXplZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBjYXRlZ29yeQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNhdGVnb3J5IGlkIGlzIHJlY29nbml6ZWQsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NhdGVnb3J5RGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmlzQ2F0ZWdvcnlEZWZpbmVkKCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgY2F0ZWdvcnkKLSAgICAgKiBAcmV0dXJuIHRoZSBjYXRlZ29yeQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGlkIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q2F0ZWdvcnkoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBwcmVzZXRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgY29uYWluaW5nIGFsbCBvZiB0aGUgcHJlc2V0cwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElQcmVzZXQ+IGdldFByZXNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0UHJlc2V0cygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBwcmVzZXQgaWQgaXMgcmVjb2duaXplZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIHByZXNldCBpZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZXNldCBpZCBpcyByZWNvZ25pemVkLAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByZXNldERlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5pc1ByZXNldERlZmluZWQoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZXNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBwcmVzZXQgaWQKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVzZXQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlc2V0IGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByZXNldCBnZXRQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRQcmVzZXQoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZXMgYSBuZXcgcHJlc2V0LiBVc2VyLWRlZmluZWQgcHJlc2V0cyBhcmUgc3RvcmVkIGluIHRoZSB3b3Jrc3BhY2UuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVzZXQKLSAgICAgKiBAcGFyYW0gZmFjZXRzIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgdGhhdCB0aGUgcHJlc2V0IHNob3VsZCBjb250YWluCi0gICAgICogQHJldHVybiB0aGUgcHJlc2V0Ci0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJlc2V0IGRlZmluZVByZXNldCggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZGVmaW5lUHJlc2V0KCBuYW1lLCBmYWNldHMgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyBhIG5ldyBwcmVzZXQuIFVzZXItZGVmaW5lZCBwcmVzZXRzIGFyZSBzdG9yZWQgaW4gdGhlIHdvcmtzcGFjZS4gCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZXNldAotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHByZXNldAotICAgICAqIEBwYXJhbSBmYWNldHMgdGhlIHNldCBvZiBwcm9qZWN0IGZhY2V0cyB0aGF0IHRoZSBwcmVzZXQgc2hvdWxkIGNvbnRhaW4KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVzZXQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcmVzZXQgZGVmaW5lUHJlc2V0KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZGVmaW5lUHJlc2V0KCBuYW1lLCBkZXNjcmlwdGlvbiwgZmFjZXRzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIHByZXNldC4gTm90ZSB0aGF0IG9ubHkgdXNlci1kZWZpbmVkIHByZXNldHMgY2FuIGJlIGRlbGV0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZXNldCB0aGUgcHJlc2V0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlc2V0IHdhcyBkZWxldGVkLCBvciAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgcHJlc2V0IHdhcyBub3QgZm91bmQgb3Igd2FzIG5vdCB1c2VyLWRlZmluZWQgCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZVByZXNldCggZmluYWwgSVByZXNldCBwcmVzZXQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZGVsZXRlUHJlc2V0KCBwcmVzZXQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIGZhY2V0ZWQgcHJvamVjdCB0ZW1wbGF0ZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBjb25haW5pbmcgYWxsIG9mIHRoZSBmYWNldGVkIHByb2plY3QgdGVtcGxhdGVzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU+IGdldFRlbXBsYXRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRUZW1wbGF0ZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gdGVtcGxhdGUgaWQgaXMgcmVjb2duaXplZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIHRlbXBsYXRlIGlkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGVtcGxhdGUgaWQgaXMgcmVjb2duaXplZCwKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZW1wbGF0ZURlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5pc1RlbXBsYXRlRGVmaW5lZCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjZXRlZCBwcm9qZWN0IHRlbXBsYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIHRlbXBsYXRlIGlkCi0gICAgICogQHJldHVybiB0aGUgZmFjZXRlZCBwcm9qZWN0IHRlbXBsdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdGVtcGxhdGUgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldFRlbXBsYXRlKCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgZ3JvdXBzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIGdyb3VwcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElHcm91cD4gZ2V0R3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldEdyb3VwcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGdyb3VwIGlkIGlzIHJlY29nbml6ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBncm91cCBpZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlkIGlzIHJlY29nbml6ZWQsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dyb3VwRGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmlzR3JvdXBEZWZpbmVkKCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBncm91cCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBncm91cCBpZAotICAgICAqIEByZXR1cm4gdGhlIGdyb3VwIGRlc2NyaXB0b3IKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ3JvdXAgaWQgaXMgbm90IGZvdW5kIAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUdyb3VwIGdldEdyb3VwKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0R3JvdXAoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElGYWNldGVkUHJvamVjdD4gZ2V0RmFjZXRlZFByb2plY3RzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRGYWNldGVkUHJvamVjdHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEZhY2V0ZWRQcm9qZWN0cyggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRGYWNldGVkUHJvamVjdHMoIGYgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEZhY2V0ZWRQcm9qZWN0cyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldEZhY2V0ZWRQcm9qZWN0cyggZnYgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHdyYXBwZXIgYXJvdW5kIGFuIDxjb2RlPklQcm9qZWN0PC9jb2RlPiB0aGF0IGV4cG9zZXMgQVBJIGZvcgotICAgICAqIG1hbmlwdWxhdGluZyB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIGluc3RhbGxlZCBvbiBhIHByb2plY3QuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IGFuIEVjbGlwc2UgcHJvamVjdAotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElGYWNldGVkUHJvamVjdH0sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIElGYWNldGVkUHJvamVjdCBjcmVhdGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmNyZWF0ZSggcHJvamVjdCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5DcmVhdGVzIGEgd3JhcHBlciBhcm91bmQgYW4gPGNvZGU+SVByb2plY3Q8L2NvZGU+IHRoYXQgZXhwb3NlcyBBUEkgZm9yCi0gICAgICogbWFuaXB1bGF0aW5nIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgaW5zdGFsbGVkIG9uIGEgcHJvamVjdC4gVGhlCi0gICAgICogcHJvamVjdCB3aWxsIGJlIG1hZGUgaW50byBhIGZhY2V0ZWQgcHJvamVjdCBpZiBuZWNlc3NhcnkuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHByb2plY3QgYW4gRWNsaXBzZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGNvbnZlcnRJZk5lY2Vzc2FyeSB3aGV0aGVyIHRoZSBwcm9qZWN0IHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhCi0gICAgICogICBmYWNldGVkIHByb2plY3QKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgcmVwb3J0aW5nIGFuZCAKLSAgICAgKiAgIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBJRmFjZXRlZFByb2plY3R9LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjb252ZXJ0SWZOZWNlc3NhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmNyZWF0ZSggcHJvamVjdCwgY29udmVydElmTmVjZXNzYXJ5LCBtb25pdG9yICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Q3JlYXRlcyBhIG5ldyBmYWNldGVkIHByb2plY3QuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLQotICAgICAqIEBwYXJhbSBuYW1lIHByb2plY3QgbmFtZQotICAgICAqIEBwYXJhbSBsb2NhdGlvbiAKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgcmVwb3J0aW5nIGFuZCAKLSAgICAgKiAgIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBJRmFjZXRlZFByb2plY3R9Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlKCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5jcmVhdGUoIG5hbWUsIGxvY2F0aW9uLCBtb25pdG9yICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgYXBwbHlpbmcgdGhlIHNwZWNpZmllZCBzZXQgb2YgYWN0aW9ucyB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgc2V0IG9mIGJhc2UgcHJvamVjdCBmYWNldHMuIFJldHVybnMgdGhlIHVuaW9uIG9mIGFsbCB2YWxpZGF0aW9uCi0gICAgICogcHJvYmxlbXMgdGhhdCBhcmUgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIHRoYXQgdGhlIGFjdGlvbnMgd2lsbCBiZSBhcHBsaWVkIHRvCi0gICAgICogQHBhcmFtIGFjdGlvbnMgdGhlIHNldCBvZiBhY3Rpb25zIHRvIGV2YWx1YXRlCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBvZiB7QHNlZSBJU3RhdHVzI09LfSBpZiBhbGwgb2YgdGhlCi0gICAgICogICBjb25zdHJhaW50cyB3ZXJlIHNhdGlzZmllZCBvciBvdGhlcndpc2UgYSB7QHNlZSBNdWx0aVN0YXR1c30gY29tcG9zZWQKLSAgICAgKiAgIG9mIHtAc2VlIFZhbGlkYXRpb25Qcm9ibGVtfSBzdGF0dXMgb2JqZWN0cwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVjayggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PEFjdGlvbj4gYWN0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5jaGVjayggYmFzZSwgYWN0aW9ucyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTb3J0cyBhY3Rpb25zIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYSBwcm9qZWN0IHN1Y2gKLSAgICAgKiB0aGF0IHByb2plY3QgZmFjZXQgY29uc3RyYWludHMgYXJlIG5vdCB2aW9sYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIHRoYXQgdGhlIGFjdGlvbnMgd2lsbCBiZSBhcHBsaWVkIHRvCi0gICAgICogQHBhcmFtIGFjdGlvbnMgdGhlIGxpc3Qgb2YgYWN0aW9ucyB0byBzb3J0OyB0aGlzIGxpc3Qgd2lsbCBiZSBtb2RpZmllZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0LkFjdGlvbj4gYWN0aW9ucyApCi0gICAgewotICAgICAgICBpbXBsLnNvcnQoIGJhc2UsIGFjdGlvbnMgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9WZXJzaW9uRm9ybWF0RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9WZXJzaW9uRm9ybWF0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDU3NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIGV4Y2VwdGlvbiB0aGF0J3MgdGhyb3duIHdoZW4gdmVyc2lvbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZC4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24gCi0gICAgCi0gICAgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIAotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGNvbXBhcmF0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKLSAgICAKLSAgICBwdWJsaWMgVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiggZmluYWwgT2JqZWN0IGNvbXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29tcGFyYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJhdG9yOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLmNvdWxkTm90UGFyc2UsIHRoaXMudmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY291bGROb3RQYXJzZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ZlcnNpb25Gb3JtYXRFeGNlcHRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ZlcnNpb25Gb3JtYXRFeGNlcHRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3OWQ4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9WZXJzaW9uRm9ybWF0RXhjZXB0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jb3VsZE5vdFBhcnNlID0gQ291bGQgbm90IHBhcnNlICJ7MH0iIHdpdGggezF9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGYWNldGVkUHJvamVjdEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0YmVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLQotLyoqCi0gKiBUaGUgcm9vdCBpbnRlcmZhY2Ugb2YgYWxsIGZhY2V0ZWQgcHJvamVjdCBldmVudHMuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgZW51bSBUeXBlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogVHlwZSBvZiB0aGUgZXZlbnQgdGhhdCBnZXRzIHRyaWdnZXJlZCB3aGVuIGZhY2V0ZWQgcHJvamVjdCBtZXRhZGF0YSBpcyBtb2RpZmllZCBpbgotICAgICAgICAgKiBhbnkgd2F5LiBObyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlIGlzIHByb3ZpZGVkLiBOb3RlIHRoYXQgd2hpbGUgbGlzdGVuaW5nCi0gICAgICAgICAqIGZvciBQUk9KRUNUX01PRElGSUVEIGV2ZW50cyBpcyBndWFyYW50ZWVkIHRvIGNhdGNoIGFsbCBvdGhlciBldmVudHMsIHRoZSBpbnZlcnNlIGlzIG5vdAotICAgICAgICAgKiB0cnVlLiBMaXN0aW5nIG9uIGFsbCB0aGUgb3RoZXIgZXZlbnRzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGNhdGNoIGFsbCBQUk9KRUNUX01PRElGSUVECi0gICAgICAgICAqIGV2ZW50cy4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGFyZSBjaXJjdW1zdGFuY2VzIHdoZW4gdGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBkZXRhaWxzCi0gICAgICAgICAqIGFib3V0IHRoZSB0eXBlIG9mIHRoZSBjaGFuZ2UgKHN1Y2ggYXMgd2hlbiB0aGUgZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGZpbGUgaXMgbW9kaWZpZWQKLSAgICAgICAgICogb24gZGlzaykuCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUFJPSkVDVF9NT0RJRklFRCwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IGlzIGluc3RhbGxlZC4gRXZlbnRzIG9mIHRoaXMgCi0gICAgICAgICAqIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BzZWUgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgZGV0YWlscyAKLSAgICAgICAgICogYWJvdXQgdGhlIGNoYW5nZS4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUFJFX0lOU1RBTEwsCi0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVHlwZSBvZiB0aGUgZXZlbnQgdGhhdCBnZXRzIHRyaWdnZXJlZCByaWdodCBhZnRlciBhIGZhY2V0IGlzIGluc3RhbGxlZC4gRXZlbnRzIG9mIHRoaXMgCi0gICAgICAgICAqIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BzZWUgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgZGV0YWlscyAKLSAgICAgICAgICogYWJvdXQgdGhlIGNoYW5nZS4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUE9TVF9JTlNUQUxMLAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgZ2V0cyB0cmlnZ2VyZWQgcmlnaHQgYmVmb3JlIGEgZmFjZXQgaXMgdW5pbnN0YWxsZWQuIEV2ZW50cyBvZiB0aGlzIAotICAgICAgICAgKiB0eXBlIGNhbiBiZSBjYXN0IHRvIHtAc2VlIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudH0gaW50ZXJmYWNlIHRvIGdldCBhZGRpdGlvbmFsIGRldGFpbHMgCi0gICAgICAgICAqIGFib3V0IHRoZSBjaGFuZ2UuIAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIFBSRV9VTklOU1RBTEwsCi0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVHlwZSBvZiB0aGUgZXZlbnQgdGhhdCBnZXRzIHRyaWdnZXJlZCByaWdodCBhZnRlciBhIGZhY2V0IGlzIHVuaW5zdGFsbGVkLiBFdmVudHMgb2YgdGhpcyAKLSAgICAgICAgICogdHlwZSBjYW4gYmUgY2FzdCB0byB7QHNlZSBJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnR9IGludGVyZmFjZSB0byBnZXQgYWRkaXRpb25hbCBkZXRhaWxzIAotICAgICAgICAgKiBhYm91dCB0aGUgY2hhbmdlLiAKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBQT1NUX1VOSU5TVEFMTCwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IHZlcnNpb24gaXMgY2hhbmdlZC4gRXZlbnRzIG9mIAotICAgICAgICAgKiB0aGlzIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BzZWUgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgCi0gICAgICAgICAqIGRldGFpbHMgYWJvdXQgdGhlIGNoYW5nZS4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUFJFX1ZFUlNJT05fQ0hBTkdFLAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgZ2V0cyB0cmlnZ2VyZWQgcmlnaHQgYWZ0ZXIgYSBmYWNldCB2ZXJzaW9uIGlzIGNoYW5nZWQuIEV2ZW50cyBvZiAKLSAgICAgICAgICogdGhpcyB0eXBlIGNhbiBiZSBjYXN0IHRvIHtAc2VlIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudH0gaW50ZXJmYWNlIHRvIGdldCBhZGRpdGlvbmFsIAotICAgICAgICAgKiBkZXRhaWxzIGFib3V0IHRoZSBjaGFuZ2UuIAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIFBPU1RfVkVSU0lPTl9DSEFOR0UsCi0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVHlwZSBvZiB0aGUgZXZlbnQgdGhhdCBnZXRzIHRyaWdnZXJlZCB3aGVuIHByb2plY3QncyBmaXhlZCBmYWNldHMgYXJlIGNoYW5nZWQuIEV2ZW50cwotICAgICAgICAgKiBvZiB0aGlzIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BzZWUgSUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwKLSAgICAgICAgICogZGV0YWlscyBhYm91dCB0aGUgY2hhbmdlLgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIEZJWEVEX0ZBQ0VUU19DSEFOR0VELAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgc2V0IG9mIHJ1bnRpbWVzIHRoYXQgdGhlIHByb2plY3QgdGFyZ2V0cwotICAgICAgICAgKiBpcyBjaGFuZ2VkLiBFdmVudHMgb2YgdGhpcyB0eXBlIGNhbiBiZSBjYXN0IHRvIHtAc2VlIElUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50fSAKLSAgICAgICAgICogaW50ZXJmYWNlIHRvIGdldCBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGNoYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBUQVJHRVRFRF9SVU5USU1FU19DSEFOR0VELAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgcHJpbWFyeSB0YXJnZXRlZCBydW50aW1lIG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgICAqIGlzIGNoYW5nZWQuIEV2ZW50cyBvZiB0aGlzIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BzZWUgSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50fQotICAgICAgICAgKiBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgY2hhbmdlLiAKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBQUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCwKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgUFJPSkVDVF9OQU1FX0NIQU5HRUQsCi0gICAgICAgIFBST0pFQ1RfRkFDRVRTX0NIQU5HRUQsCi0gICAgICAgIEFWQUlMQUJMRV9GQUNFVFNfQ0hBTkdFRCwKLSAgICAgICAgQVZBSUxBQkxFX1BSRVNFVFNfQ0hBTkdFRCwKLSAgICAgICAgU0VMRUNURURfUFJFU0VUX0NIQU5HRUQsCi0gICAgICAgIEFWQUlMQUJMRV9SVU5USU1FU19DSEFOR0VELAotICAgICAgICBUQVJHRVRBQkxFX1JVTlRJTUVTX0NIQU5HRUQsCi0gICAgICAgIFZBTElEQVRJT05fUFJPQkxFTVNfQ0hBTkdFRDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBldmVudAotICAgICAqLwotICAgIAotICAgIFR5cGUgZ2V0VHlwZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBhZmZlY3RlZCBmYWNldGVkIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWZmZWN0ZWQgZmFjZXRlZCBwcm9qZWN0Ci0gICAgICovCi0gICAgCi0gICAgSUZhY2V0ZWRQcm9qZWN0IGdldFByb2plY3QoKTsKLSAgICAKLSAgICBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBnZXRXb3JraW5nQ29weSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTExYzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHM7Ci0KLS8qKgotICogVGhlIHJvb3QgaW50ZXJmYWNlIG9mIGFsbCBmYWNldGVkIHByb2plY3QgZnJhbWV3b3JrIGV2ZW50cy4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQKLXsKLSAgICBlbnVtIFR5cGUKLSAgICB7Ci0gICAgICAgIFBSRVNFVF9BRERFRCwKLSAgICAgICAgUFJFU0VUX1JFTU9WRUQKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBldmVudAotICAgICAqLwotICAgIAotICAgIFR5cGUgZ2V0VHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDAwYzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhvc2Ugd2hvIHdpc2ggdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGZhY2V0ZWQgcHJvamVjdCBpcwotICogY2hhbmdlZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gcmVnaXN0ZXIgYSBsaXN0ZW5lcjogKGEpIHVzaW5nIG1ldGhvZHMgb24ge0BzZWUgCi0gKiBJRmFjZXRlZFByb2plY3R9LCAoYikgdXNpbmcgbWV0aG9kcyBvbiB7QHNlZSBGYWNldGVkUHJvamVjdEZyYW1ld29ya30sIG9yIChjKSB1c2luZyB0aGUgcHJvdmlkZWQKLSAqIGV4dGVuc2lvbiBwb2ludC4gTWV0aG9kIChhKSBjYXRjaGVzIG9ubHkgZXZlbnRzIGZvciBhIHNwZWNpZmljIGZhY2V0ZWQgcHJvamVjdCB3aGlsZSBtZXRob2RzCi0gKiAoYikgYW5kIChjKSBjYXRjaCBldmVudHMgZm9yIGFsbCBmYWNldGVkIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byBub3RpZnkgdGhlIGxpc3RlbmVyIHRoYXQgYW4gZXZlbnQgaGFzIG9jY3VycmVkLgotICAgICAqIAotICAgICAqIDxwPkFsbCBldmVudHMgZXhjZXB0IGZvciA8Y29kZT5QUk9KRUNUX01PRElGSUVEPC9jb2RlPiBvZiB0aGlzIHR5cGUgYXJlIHRyaWdnZXJlZCBpbiB0aGUgCi0gICAgICogbG9jayBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb24gdGhhdCBjYXVzZWQgdGhlIG9yaWdpbmFsIGNoYW5nZS4gVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIAotICAgICAqIHByb2plY3QgaGFzIG5vdCBjaGFuZ2VkIGZ1cnRoZXIgZnJvbSB0aGUgc3RhdGUgaXQgd2FzIGluIGFmdGVyIHRoZSBjaGFuZ2Ugd2FzIGNvbXBsZXRlLCAKLSAgICAgKiBob3dldmVyIHRoZSBsaXN0ZW5lciBpcyB1bmFibGUgdG8gY2FsbCBhbnkgbW9kaWZpZXIgbWV0aG9kcyBvbiB0aGUge0BzZWUgSUZhY2V0ZWRQcm9qZWN0fSAKLSAgICAgKiBpbnRlcmZhY2UuIFRvIGRvIHNvLCB0aGUgbGlzdGVuZXIgbXVzdCBzcGluIG9mZiBhIHRocmVhZC48L3A+Ci0gICAgICogCi0gICAgICogPHA+SXQgaXMgaGlnaGx5IGFkdmlzZWQgdGhhdCBhbnkgbGlzdGVuZXIgdGhhdCBwZXJmb3JtcyBub24tY3JpdGljYWwgb3IgbG9uZy1ydW5uaW5nIHRhc2tzIAotICAgICAqIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBpbiB0aGUgYmFja2dyb3VuZCAoc3VjaCBhcyB1cGRhdGluZyBVSSkgZG8gc28gYXN5bmNocm9ub3VzbHkgYnkKLSAgICAgKiBzcGlubmluZyBvZmYgYSB0aHJlYWQsIHNjaGVkdWxpbmcgYSBqb2IsIGV0Yy4gVGhpcyBhbGxvd3MgdGhlIG9yaWdpbmFsIG1vZGlmaWNhdGlvbiB0bwotICAgICAqIGNvbXBsZXRlIGZhc3RlciByZXN1bHRpbmcgaW4gYmV0dGVyIHBlcmNlaXZlZCByZXNwb25zaXZlbmVzcy48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGhhbmRsZUV2ZW50KCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudCBldmVudCApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGYWNldGVkUHJvamVjdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZTYwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHRob3NlIHdobyB3aXNoIHRvIHJlY2VpdmUgZXZlbnRzIHdoZW4gYSBmYWNldGVkIHByb2plY3QgaXMKLSAqIGNoYW5nZWQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXI6IChhKSB1c2luZyBtZXRob2RzIG9uIHtAc2VlIAotICogSUZhY2V0ZWRQcm9qZWN0fSwgKGIpIHVzaW5nIG1ldGhvZHMgb24ge0BzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmt9LCBvciAoYykgdXNpbmcgdGhlIHByb3ZpZGVkCi0gKiBleHRlbnNpb24gcG9pbnQuIE1ldGhvZCAoYSkgY2F0Y2hlcyBvbmx5IGV2ZW50cyBmb3IgYSBzcGVjaWZpYyBmYWNldGVkIHByb2plY3Qgd2hpbGUgbWV0aG9kcwotICogKGIpIGFuZCAoYykgY2F0Y2ggZXZlbnRzIGZvciBhbGwgZmFjZXRlZCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldGVkUHJvamVjdExpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gbm90aWZ5IHRoZSBsaXN0ZW5lciB0aGF0IGFuIGV2ZW50IGhhcyBvY2N1cnJlZC4KLSAgICAgKiAKLSAgICAgKiA8cD5BbGwgZXZlbnRzIGV4Y2VwdCBmb3IgPGNvZGU+UFJPSkVDVF9NT0RJRklFRDwvY29kZT4gb2YgdGhpcyB0eXBlIGFyZSB0cmlnZ2VyZWQgaW4gdGhlIAotICAgICAqIGxvY2sgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgY2F1c2VkIHRoZSBvcmlnaW5hbCBjaGFuZ2UuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSAKLSAgICAgKiBwcm9qZWN0IGhhcyBub3QgY2hhbmdlZCBmdXJ0aGVyIGZyb20gdGhlIHN0YXRlIGl0IHdhcyBpbiBhZnRlciB0aGUgY2hhbmdlIHdhcyBjb21wbGV0ZSwgCi0gICAgICogaG93ZXZlciB0aGUgbGlzdGVuZXIgaXMgdW5hYmxlIHRvIGNhbGwgYW55IG1vZGlmaWVyIG1ldGhvZHMgb24gdGhlIHtAc2VlIElGYWNldGVkUHJvamVjdH0gCi0gICAgICogaW50ZXJmYWNlLiBUbyBkbyBzbywgdGhlIGxpc3RlbmVyIG11c3Qgc3BpbiBvZmYgYSB0aHJlYWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPkl0IGlzIGhpZ2hseSBhZHZpc2VkIHRoYXQgYW55IGxpc3RlbmVyIHRoYXQgcGVyZm9ybXMgbm9uLWNyaXRpY2FsIG9yIGxvbmctcnVubmluZyB0YXNrcyAKLSAgICAgKiB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgaW4gdGhlIGJhY2tncm91bmQgKHN1Y2ggYXMgdXBkYXRpbmcgVUkpIGRvIHNvIGFzeW5jaHJvbm91c2x5IGJ5Ci0gICAgICogc3Bpbm5pbmcgb2ZmIGEgdGhyZWFkLCBzY2hlZHVsaW5nIGEgam9iLCBldGMuIFRoaXMgYWxsb3dzIHRoZSBvcmlnaW5hbCBtb2RpZmljYXRpb24gdG8KLSAgICAgKiBjb21wbGV0ZSBmYXN0ZXIgcmVzdWx0aW5nIGluIGJldHRlciBwZXJjZWl2ZWQgcmVzcG9uc2l2ZW5lc3MuPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV2ZW50Ci0gICAgICovCi0gICAgCi0gICAgdm9pZCBoYW5kbGVFdmVudCggSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhZWYyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBldmVudCBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgRklYRURfRkFDRVRTX0NIQU5HRUQgCi0gKiBldmVudC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIElGYWNldGVkUHJvamVjdEV2ZW50Ci0gICAgCi17Ci0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBmYWNldHMgdGhhdCB3ZXJlIGZpeGVkIGZvciB0aGUgcHJvamVjdCBwcmlvciB0byB0aGUgY2hhbmdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBvbGQgZml4ZWQgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXQ+IGdldE9sZEZpeGVkRmFjZXRzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBmYWNldHMgdGhhdCBhcmUgZml4ZWQgZm9yIHRoZSBwcm9qZWN0IGFmdGVyIHRoZSBjaGFuZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIG5ldyBmaXhlZCBmYWNldHMKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldD4gZ2V0TmV3Rml4ZWRGYWNldHMoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExOTFiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGV2ZW50IG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBQUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCAKLSAqIGV2ZW50LiAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQKLQotICAgIGV4dGVuZHMgSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbGQgcHJpbWFyeSBydW50aW1lIGZvciB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvbGQgcHJpbWFyeSBydW50aW1lIGZvciB0aGUgcHJvamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXRPbGRQcmltYXJ5UnVudGltZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldyBwcmltYXJ5IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBwcmltYXJ5IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIElSdW50aW1lIGdldE5ld1ByaW1hcnlSdW50aW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzNTIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVByb2plY3RGYWNldEFjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGV2ZW50IG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBQUkVfSU5TVEFMTCwgUE9TVF9JTlNUQUxMLCAKLSAqIFBSRV9VTklOU1RBTEwsIFBPU1RfVU5JTlNUQUxMLCBQUkVfVkVSU0lPTl9DSEFOR0UsIGFuZCBQT1NUX1ZFUlNJT05fQ0hBTkdFIGV2ZW50cy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQKLQotICAgIGV4dGVuZHMgSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgZXZlbnQgaXMgYWJvdXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgZXZlbnQgaXMgYWJvdXQuCi0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgZXZlbnQgaXMgYWJvdXQuIEluIHRoZSBjYXNlIG9mIHRoZQotICAgICAqIFBSRV9WRVJTSU9OX0NIQU5HRSBhbmQgUE9TVF9WRVJTSU9OX0NIQU5HRSBldmVudHMsIHRoaXMgd2lsbCBiZSB0aGUgbmV3IHZlcnNpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgZXZlbnQgaXMgYWJvdXQKLSAgICAgKi8KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNvbmZpZyBvYmplY3QgdGhhdCB3aWxsIGJlIChvciB3YXMpIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBmYWNldCBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29uZmlnIG9iamVjdCBvZiB0aGUgZmFjZXQgYWN0aW9uCi0gICAgICovCi0gICAgCi0gICAgT2JqZWN0IGdldEFjdGlvbkNvbmZpZygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1ZDUyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQKLQotICAgIGV4dGVuZHMgSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICAKLXsKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEFkZGVkRmFjZXRzKCk7Ci0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRSZW1vdmVkRmFjZXRzKCk7Ci0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRGYWNldHNXaXRoQ2hhbmdlZFZlcnNpb25zKCk7Ci0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRBbGxBZmZlY3RlZEZhY2V0cygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0NmIxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGV2ZW50IG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBUQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEIAotICogZXZlbnQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIElGYWNldGVkUHJvamVjdEV2ZW50Ci0gICAgCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IHJ1bnRpbWVzIHRoYXQgdGhlIHByb2plY3QgcHJldmlvdXNseSB0YXJnZXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCBwcmV2aW91c2x5IHRhcmdldGVkCi0gICAgICovCi0gICAgCi0gICAgU2V0PElSdW50aW1lPiBnZXRPbGRUYXJnZXRlZFJ1bnRpbWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCBub3cgdGFyZ2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCBub3cgdGFyZ2V0cwotICAgICAqLwotICAgIAotICAgIFNldDxJUnVudGltZT4gZ2V0TmV3VGFyZ2V0ZWRSdW50aW1lcygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0RlbGF5ZWRDbGFzc0xvYWRpbmdMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0RlbGF5ZWRDbGFzc0xvYWRpbmdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ0N2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9EZWxheWVkQ2xhc3NMb2FkaW5nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBkZWxheSBjbGFzcyBsb2FkaW5nIG9mIGxpc3RlbmVycyByZWdpc3RlcmVkIHZpYSB0aGUKLSAqIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgdW50aWwgdGhlIGxpc3RlbmVyIGlzIGFjdHVhbGx5IGludm9rZWQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVsYXllZENsYXNzTG9hZGluZ0xpc3RlbmVyCi0KLSAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGx1Z2luSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGlzdGVuZXJDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICAKLSAgICBwdWJsaWMgRGVsYXllZENsYXNzTG9hZGluZ0xpc3RlbmVyKCBmaW5hbCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLSAgICAgICAgdGhpcy5saXN0ZW5lckNsYXNzTmFtZSA9IGxpc3RlbmVyQ2xhc3NOYW1lOwotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLmxpc3RlbmVyID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lciAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMubGlzdGVuZXJDbGFzc05hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuY2xhc3MgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMubGlzdGVuZXIuaGFuZGxlRXZlbnQoIGV2ZW50ICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRXZlbnRzRXh0ZW5zaW9uUG9pbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9FdmVudHNFeHRlbnNpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzUzOTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9FdmVudHNFeHRlbnNpb25Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kRXh0ZW5zaW9uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRSZXF1aXJlZEF0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldFRvcExldmVsRWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIHByb2Nlc3NpbmcgdGhlIDxjb2RlPmxpc3RlbmVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXZlbnRzRXh0ZW5zaW9uUG9pbnQKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibGlzdGVuZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9MSVNURU5FUiA9ICJsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FVkVOVF9UWVBFUyA9ICJldmVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzRXh0ZW5zaW9ucyggZmluYWwgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsIGZyYW1ld29yayApCi0gICAgewotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IAotICAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIEVMX0xJU1RFTkVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggZWxlbWVudCwgQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXZlbnRUeXBlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCBBVFRSX0VWRU5UX1RZUEVTICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGU+IHR5cGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGU+KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggZXZlbnRUeXBlcyAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBTdHJpbmcgc2VnbWVudCA6IGV2ZW50VHlwZXMuc3BsaXQoICIsIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50LnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cHBlcmNhc2VkID0gc2VnbWVudC50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQoIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUudmFsdWVPZiggdXBwZXJjYXNlZCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmludmFsaWRFdmVudFR5cGUsIHNlZ21lbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdIHR5cGVzQXJyYXkgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlWyB0eXBlcy5zaXplKCkgXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHR5cGVzLnRvQXJyYXkoIHR5cGVzQXJyYXkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgRGVsYXllZENsYXNzTG9hZGluZ0xpc3RlbmVyKCBwbHVnaW5JZCwgY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmcmFtZXdvcmsuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlc0FycmF5ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyIHZpYSB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEV2ZW50VHlwZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEV2ZW50c0V4dGVuc2lvblBvaW50LmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRXZlbnRzRXh0ZW5zaW9uUG9pbnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9FdmVudHNFeHRlbnNpb25Qb2ludC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJhMzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9FdmVudHNFeHRlbnNpb25Qb2ludC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW52YWxpZEV2ZW50VHlwZSA9ICJ7MH0iIGlzIG5vdCBhIHZhbGlkIGZhY2V0ZWQgcHJvamVjdCBldmVudCB0eXBlLiBJdCBpcyB1c2VkIGluIHsxfSBwbHVnaW4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDI2ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRmFjZXRlZFByb2plY3RFdmVudAotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RFdmVudAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSB3b3JraW5nQ29weTsKLSAgICBwcml2YXRlIGZpbmFsIFR5cGUgZXZlbnRUeXBlOwotICAgIAotICAgIHB1YmxpYyBGYWNldGVkUHJvamVjdEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBGYWNldGVkUHJvamVjdEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSB3b3JraW5nQ29weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OwotICAgICAgICB0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIElGYWNldGVkUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBnZXRXb3JraW5nQ29weSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53b3JraW5nQ29weTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV2ZW50VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiPGV2ZW50IHByb2plY3Q9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5wcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgYnVmLmFwcGVuZCggIlwiIHR5cGU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5ldmVudFR5cGUubmFtZSgpICk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICJcIj5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgdG9TdHJpbmdJbnRlcm5hbCggYnVmICk7Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiPC9ldmVudD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbnRlcm5hbCggZmluYWwgU3RyaW5nQnVpbGRlciBidWYgKQotICAgIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2U2ZDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudAotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgVHlwZSBldmVudFR5cGU7Ci0gICAgCi0gICAgcHVibGljIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQoIGZpbmFsIFR5cGUgZXZlbnRUeXBlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV2ZW50VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiPGV2ZW50IHR5cGU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5ldmVudFR5cGUubmFtZSgpICk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICJcIj5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgdG9TdHJpbmdJbnRlcm5hbCggYnVmICk7Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiPC9ldmVudD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbnRlcm5hbCggZmluYWwgU3RyaW5nQnVpbGRlciBidWYgKQotICAgIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GaXhlZEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzEwNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICBpbXBsZW1lbnRzIElGaXhlZEZhY2V0c0NoYW5nZWRFdmVudAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IG9sZEZpeGVkRmFjZXRzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IG5ld0ZpeGVkRmFjZXRzOwotICAgIAotICAgIHB1YmxpYyBGaXhlZEZhY2V0c0NoYW5nZWRFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gb2xkRml4ZWRGYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gbmV3Rml4ZWRGYWNldHMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHByb2plY3QsIFR5cGUuRklYRURfRkFDRVRTX0NIQU5HRUQgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMub2xkRml4ZWRGYWNldHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIG9sZEZpeGVkRmFjZXRzICk7Ci0gICAgICAgIHRoaXMubmV3Rml4ZWRGYWNldHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIG5ld0ZpeGVkRmFjZXRzICk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0PiBnZXRPbGRGaXhlZEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vbGRGaXhlZEZhY2V0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldE5ld0ZpeGVkRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5ld0ZpeGVkRmFjZXRzOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0ludGVybmFsKCBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiApCi0gICAgewotICAgICAgICBidWYuYXBwZW5kKCAiICA8b2xkLWZpeGVkLWZhY2V0cz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBzb3J0KCB0aGlzLm9sZEZpeGVkRmFjZXRzICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAiICAgIDxmYWNldCBpZD1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnVmLmFwcGVuZCggZi5nZXRJZCgpICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAiXCIvPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDwvb2xkLWZpeGVkLWZhY2V0cz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDxuZXctZml4ZWQtZmFjZXRzPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IHNvcnQoIHRoaXMubmV3Rml4ZWRGYWNldHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICIgICAgPGZhY2V0IGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBidWYuYXBwZW5kKCBmLmdldElkKCkgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICJcIi8+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPC9uZXctZml4ZWQtZmFjZXRzPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gc29ydCggZmluYWwgQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiBpbnB1dCApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gcmVzdWx0ID0gbmV3IFRyZWVTZXQ8SVByb2plY3RGYWNldD4oIG5ldyBGYWNldENvbXBhcmF0b3IoKSApOwotICAgICAgICByZXN1bHQuYWRkQWxsKCBpbnB1dCApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWNldENvbXBhcmF0b3IgCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgQ29tcGFyYXRvcjxJUHJvamVjdEZhY2V0PgotICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGYxLmdldElkKCkuY29tcGFyZVRvKCBmMi5nZXRJZCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM4ZGEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLFNldDxJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lcj4+IGxpc3RlbmVyczsKLSAgICAKLSAgICBwdWJsaWMgRnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeSgpCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycwotICAgICAgICAgICAgPSBuZXcgRW51bU1hcDxJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLFNldDxJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lcj4+KCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLmNsYXNzICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUgdCA6IElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXQoIHQsIG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyPigpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsIHx8IHR5cGVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZSB0eXBlIAotICAgICAgICAgICAgIDogKCB0eXBlcy5sZW5ndGggPiAwID8gdHlwZXMgOiBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLnZhbHVlcygpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoIHR5cGUgKS5hZGQoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNldDxJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lcj4gbGlzdGVuZXJzIDogdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzLmdldCggZXZlbnQuZ2V0VHlwZSgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudCggZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXI+IGdldExpc3RlbmVycyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLmdldCggZXZlbnRUeXBlICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0xlZ2FjeUV2ZW50SGFuZGxlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiYWQ2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUnVudGltZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIExlZ2FjeUV2ZW50SGFuZGxlckFkYXB0ZXIKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGx1Z2luSWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgZGVsZWdhdGU7Ci0gICAgCi0gICAgcHVibGljIExlZ2FjeUV2ZW50SGFuZGxlckFkYXB0ZXIoIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlbGVnYXRlUGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZWxlZ2F0ZUNsYXNzTmFtZSApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7Ci0gICAgICAgIHRoaXMudmV4cHIgPSB2ZXhwcjsKLSAgICAgICAgdGhpcy5wbHVnaW5JZCA9IGRlbGVnYXRlUGx1Z2luSWQ7Ci0gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZUNsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGlmKCBldmVudCBpbnN0YW5jZW9mIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldiA9IChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQpIGV2ZW50OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5mYWNldCA9PSBldi5nZXRQcm9qZWN0RmFjZXQoKSAmJiAKLSAgICAgICAgICAgICAgICB0aGlzLnZleHByLmNoZWNrKCBldi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSURlbGVnYXRlIGRlbGVnYXRlID0gZ2V0RGVsZWdhdGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZGVsZWdhdGUgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuZXhlY3V0ZSggZXYuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSwgZXYuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEFjdGlvbkNvbmZpZygpLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGV2ZW50IGluc3RhbmNlb2YgSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50IGV2ID0gKElQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudCkgZXZlbnQ7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCA9IGV2LmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHByb2plY3QuaGFzUHJvamVjdEZhY2V0KCB0aGlzLmZhY2V0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gcHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKCB0aGlzLmZhY2V0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHRoaXMudmV4cHIuY2hlY2soIGZ2ICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVudGltZUNoYW5nZWRFdmVudCBsZWdhY3lFdmVudAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgUnVudGltZUNoYW5nZWRFdmVudCggZXYuZ2V0T2xkUHJpbWFyeVJ1bnRpbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXROZXdQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGRlbGVnYXRlICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5leGVjdXRlKCBldi5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLCBmdiwgbGVnYWN5RXZlbnQsIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIElEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuZGVsZWdhdGUgaW5zdGFuY2VvZiBTdHJpbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgCi0gICAgICAgICAgICAgICAgICAgID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIChTdHJpbmcpIHRoaXMuZGVsZWdhdGUsIElEZWxlZ2F0ZS5jbGFzcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKElEZWxlZ2F0ZSkgdGhpcy5kZWxlZ2F0ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ2hhbmdlZEV2ZW50Ci0KLSAgICAgICAgaW1wbGVtZW50cyBJUnVudGltZUNoYW5nZWRFdmVudAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWUgb2xkUnVudGltZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJUnVudGltZSBuZXdSdW50aW1lOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFJ1bnRpbWVDaGFuZ2VkRXZlbnQoIGZpbmFsIElSdW50aW1lIG9sZFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZSBuZXdSdW50aW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5vbGRSdW50aW1lID0gb2xkUnVudGltZTsKLSAgICAgICAgICAgIHRoaXMubmV3UnVudGltZSA9IG5ld1J1bnRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJUnVudGltZSBnZXRPbGRSdW50aW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMub2xkUnVudGltZTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgSVJ1bnRpbWUgZ2V0TmV3UnVudGltZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm5ld1J1bnRpbWU7Ci0gICAgICAgIH0KLSAgICAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9MZWdhY3lMaXN0ZW5lckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9MZWdhY3lMaXN0ZW5lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkZDU2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvTGVnYWN5TGlzdGVuZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIExlZ2FjeUxpc3RlbmVyQWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgYmFzZTsKLSAgICAKLSAgICBwdWJsaWMgTGVnYWN5TGlzdGVuZXJBZGFwdGVyKCBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciBiYXNlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgewotICAgICAgICB0aGlzLmJhc2UucHJvamVjdENoYW5nZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyIGdldExlZ2FjeUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9QcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2EwZWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9QcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudAotCi0gICAgZXh0ZW5kcyBGYWNldGVkUHJvamVjdEV2ZW50Ci0gICAgaW1wbGVtZW50cyBJUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lIG9sZFByaW1hcnlSdW50aW1lOwotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWUgbmV3UHJpbWFyeVJ1bnRpbWU7Ci0gICAgCi0gICAgcHVibGljIFByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIG9sZFByaW1hcnlSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgbmV3UHJpbWFyeVJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHByb2plY3QsIFR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMub2xkUHJpbWFyeVJ1bnRpbWUgPSBvbGRQcmltYXJ5UnVudGltZTsKLSAgICAgICAgdGhpcy5uZXdQcmltYXJ5UnVudGltZSA9IG5ld1ByaW1hcnlSdW50aW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVJ1bnRpbWUgZ2V0T2xkUHJpbWFyeVJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub2xkUHJpbWFyeVJ1bnRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIElSdW50aW1lIGdldE5ld1ByaW1hcnlSdW50aW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5ld1ByaW1hcnlSdW50aW1lOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0ludGVybmFsKCBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiApCi0gICAgewotICAgICAgICBidWYuYXBwZW5kKCAiICA8b2xkLXByaW1hcnktcnVudGltZSBuYW1lPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMub2xkUHJpbWFyeVJ1bnRpbWUgPT0gbnVsbCA/ICI8bnVsbD4iIDogdGhpcy5vbGRQcmltYXJ5UnVudGltZS5nZXROYW1lKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCAiXCIvPlxuIiApOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPG5ldy1wcmltYXJ5LXJ1bnRpbWUgbmFtZT1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLm5ld1ByaW1hcnlSdW50aW1lID09IG51bGwgPyAiPG51bGw+IiA6IHRoaXMubmV3UHJpbWFyeVJ1bnRpbWUuZ2V0TmFtZSgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCggIlwiLz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RGYWNldEFjdGlvbkV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwNTM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RFdmVudAotICAgIGltcGxlbWVudHMgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdjsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBjb25maWc7Ci0gICAgCi0gICAgcHVibGljIFByb2plY3RGYWNldEFjdGlvbkV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZXZlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwcm9qZWN0LCBldmVudFR5cGUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZnYgPSBmdjsKLSAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mdi5nZXRQcm9qZWN0RmFjZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFjdGlvbkNvbmZpZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW50ZXJuYWwoIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmICkKLSAgICB7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDxmYWNldCBpZD1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCkgKTsKLSAgICAgICAgYnVmLmFwcGVuZCggIlwiIHZlcnNpb249XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5mdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgYnVmLmFwcGVuZCggIlwiLz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTdkZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICBpbXBsZW1lbnRzIElQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGFkZGVkRmFjZXRzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZW1vdmVkRmFjZXRzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBjaGFuZ2VkVmVyc2lvbnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGFsbEFmZmVjdGVkRmFjZXRzOwotICAgIAotICAgIHB1YmxpYyBQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhZGRlZEZhY2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZW1vdmVkRmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGNoYW5nZWRWZXJzaW9ucyApCi0gICAgewotICAgICAgICBzdXBlciggZnBqd2MsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5hZGRlZEZhY2V0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggYWRkZWRGYWNldHMgKTsKLSAgICAgICAgdGhpcy5yZW1vdmVkRmFjZXRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCByZW1vdmVkRmFjZXRzICk7Ci0gICAgICAgIHRoaXMuY2hhbmdlZFZlcnNpb25zID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBjaGFuZ2VkVmVyc2lvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYWxsQWZmZWN0ZWRGYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGFsbEFmZmVjdGVkRmFjZXRzLmFkZEFsbCggYWRkZWRGYWNldHMgKTsKLSAgICAgICAgYWxsQWZmZWN0ZWRGYWNldHMuYWRkQWxsKCByZW1vdmVkRmFjZXRzICk7Ci0gICAgICAgIGFsbEFmZmVjdGVkRmFjZXRzLmFkZEFsbCggY2hhbmdlZFZlcnNpb25zICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmFsbEFmZmVjdGVkRmFjZXRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBhbGxBZmZlY3RlZEZhY2V0cyApOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEFkZGVkRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFkZGVkRmFjZXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFJlbW92ZWRGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlZEZhY2V0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRGYWNldHNXaXRoQ2hhbmdlZFZlcnNpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZWRWZXJzaW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRBbGxBZmZlY3RlZEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5hbGxBZmZlY3RlZEZhY2V0czsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdExpc3RlbmVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0TGlzdGVuZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQ5MGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0TGlzdGVuZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0TGlzdGVuZXJSZWdpc3RyeQotewotICAgIHByaXZhdGUgZmluYWwgTWFwPElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUsU2V0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPj4gbGlzdGVuZXJzOwotICAgIAotICAgIHB1YmxpYyBQcm9qZWN0TGlzdGVuZXJSZWdpc3RyeSgpCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycwotICAgICAgICAgICAgPSBuZXcgRW51bU1hcDxJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLFNldDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4+KCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLmNsYXNzICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUgdCA6IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXQoIHQsIG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPigpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsIHx8IHR5cGVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSB0eXBlIAotICAgICAgICAgICAgIDogKCB0eXBlcy5sZW5ndGggPiAwID8gdHlwZXMgOiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLnZhbHVlcygpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoIHR5cGUgKS5hZGQoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNldDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4gbGlzdGVuZXJzIDogdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzLmdldCggZXZlbnQuZ2V0VHlwZSgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudCggZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+IGdldExpc3RlbmVycyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLmdldCggZXZlbnRUeXBlICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdE1vZGlmaWVkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0TW9kaWZpZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA5N2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0TW9kaWZpZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RNb2RpZmllZEV2ZW50Ci0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICAKLXsKLSAgICBwdWJsaWMgUHJvamVjdE1vZGlmaWVkRXZlbnQoIElGYWNldGVkUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBwcm9qZWN0LCBUeXBlLlBST0pFQ1RfTU9ESUZJRUQgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1RhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxZTY5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudAotCi0gICAgZXh0ZW5kcyBGYWNldGVkUHJvamVjdEV2ZW50Ci0gICAgaW1wbGVtZW50cyBJVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgU2V0PElSdW50aW1lPiBvbGRUYXJnZXRlZFJ1bnRpbWVzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElSdW50aW1lPiBuZXdUYXJnZXRlZFJ1bnRpbWVzOwotICAgIAotICAgIHB1YmxpYyBUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiBvbGRUYXJnZXRlZFJ1bnRpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IG5ld1RhcmdldGVkUnVudGltZXMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHByb2plY3QsIFR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5vbGRUYXJnZXRlZFJ1bnRpbWVzID0gb2xkVGFyZ2V0ZWRSdW50aW1lczsKLSAgICAgICAgdGhpcy5uZXdUYXJnZXRlZFJ1bnRpbWVzID0gbmV3VGFyZ2V0ZWRSdW50aW1lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElSdW50aW1lPiBnZXRPbGRUYXJnZXRlZFJ1bnRpbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9sZFRhcmdldGVkUnVudGltZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJUnVudGltZT4gZ2V0TmV3VGFyZ2V0ZWRSdW50aW1lcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5uZXdUYXJnZXRlZFJ1bnRpbWVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW50ZXJuYWwoIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmICkKLSAgICB7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDxvbGQtdGFyZ2V0ZWQtcnVudGltZXM+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHNvcnQoIHRoaXMub2xkVGFyZ2V0ZWRSdW50aW1lcyApICkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCggIiAgICA8cnVudGltZSBuYW1lPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBidWYuYXBwZW5kKCByLmdldE5hbWUoKSApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggIlwiLz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiICA8L29sZC10YXJnZXRlZC1ydW50aW1lcz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDxuZXctdGFyZ2V0ZWQtcnVudGltZXM+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHNvcnQoIHRoaXMubmV3VGFyZ2V0ZWRSdW50aW1lcyApICkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCggIiAgICA8cnVudGltZSBpZD1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnVmLmFwcGVuZCggci5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICJcIi8+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPC9uZXctdGFyZ2V0ZWQtcnVudGltZXM+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxJUnVudGltZT4gc29ydCggZmluYWwgQ29sbGVjdGlvbjxJUnVudGltZT4gaW5wdXQgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiByZXN1bHQgPSBuZXcgVHJlZVNldDxJUnVudGltZT4oIG5ldyBSdW50aW1lQ29tcGFyYXRvcigpICk7Ci0gICAgICAgIHJlc3VsdC5hZGRBbGwoIGlucHV0ICk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVDb21wYXJhdG9yIAotICAgIAotICAgICAgICBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SVJ1bnRpbWU+Ci0gICAgCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoIGZpbmFsIElSdW50aW1lIHIxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZSByMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByMS5nZXROYW1lKCkuY29tcGFyZVRvKCByMi5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0FjdGlvbkRlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0FjdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxNDFjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9BY3Rpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuaW5zdGFudGlhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SUFjdGlvbkRlZmluaXRpb248L2NvZGU+IGludGVyZmFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEFjdGlvbkRlZmluaXRpb24KLQotICAgIGltcGxlbWVudHMgSUFjdGlvbkRlZmluaXRpb24KLSAgICAKLXsKLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLSAgICBwcml2YXRlIElQcm9qZWN0RmFjZXQgZmFjZXQ7Ci0gICAgcHJpdmF0ZSBJVmVyc2lvbkV4cHIgdmVyc2lvbk1hdGNoRXhwcjsKLSAgICBwcml2YXRlIEFjdGlvbi5UeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBwcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVsZWdhdGVDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBJRGVsZWdhdGUgZGVsZWdhdGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnRmFjdG9yeUNsYXNzTmFtZTsKLSAgICAKLSAgICBBY3Rpb25EZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCk7Ci0gICAgICAgIHRoaXMucHJvcGVydGllc1JlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCB0aGlzLnByb3BlcnRpZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRJZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRQbHVnaW5JZCggZmluYWwgU3RyaW5nIHBsdWdpbklkICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJVmVyc2lvbkV4cHIgZ2V0VmVyc2lvbkV4cHIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbk1hdGNoRXhwcjsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICB2b2lkIHNldFZlcnNpb25FeHByKCBmaW5hbCBJVmVyc2lvbkV4cHIgZXhwciApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25NYXRjaEV4cHIgPSBleHByOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWN0aW9uLlR5cGUgZ2V0QWN0aW9uVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldEFjdGlvblR5cGUoIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dCggbmFtZSwgdmFsdWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVDb25maWdPYmplY3QoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGpuYW1lICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQ29uZmlnT2JqZWN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29uZmlnT2JqZWN0KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggdGhpcy5jb25maWdGYWN0b3J5Q2xhc3NOYW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMuY29uZmlnRmFjdG9yeUNsYXNzTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkuY2xhc3MgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuICggKElBY3Rpb25Db25maWdGYWN0b3J5KSBmYWN0b3J5ICkuY3JlYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGdldERlbGVnYXRlQ2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldERlbGVnYXRlQ2xhc3NOYW1lKCBmaW5hbCBTdHJpbmcgZGVsZWdhdGVDbGFzc05hbWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWxlZ2F0ZUNsYXNzTmFtZSA9IGRlbGVnYXRlQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICBJRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmRlbGVnYXRlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqIAotICAgICAgICAgICAgICAgID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMuZGVsZWdhdGVDbGFzc05hbWUsIElEZWxlZ2F0ZS5jbGFzcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gKElEZWxlZ2F0ZSkgb2JqOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGdldENvbmZpZ0ZhY3RvcnlDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnRmFjdG9yeUNsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRDb25maWdGYWN0b3J5Q2xhc3NOYW1lKCBmaW5hbCBTdHJpbmcgY29uZmlnRmFjdG9yeUNsYXNzTmFtZSApCi0gICAgewotICAgICAgICB0aGlzLmNvbmZpZ0ZhY3RvcnlDbGFzc05hbWUgPSBjb25maWdGYWN0b3J5Q2xhc3NOYW1lOwotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9DYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmZmU0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2F0ZWdvcnkgCi0KLSAgICBpbXBsZW1lbnRzIElDYXRlZ29yeSAKLSAgICAKLXsKLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBwbHVnaW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBTZXQ8SVByb2plY3RGYWNldD4gZmFjZXRzOwotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXQ+IGZhY2V0c1JlYWRPbmx5OwotICAgIAotICAgIENhdGVnb3J5KCkgCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHRoaXMuZmFjZXRzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMuZmFjZXRzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRQbHVnaW5JZCggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0TGFiZWwoIGZpbmFsIFN0cmluZyBsYWJlbCApCi0gICAgewotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0RGVzY3JpcHRpb24oIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldD4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldHNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGYgKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmVQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0cy5yZW1vdmUoIGYgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBDbGFzcyB0eXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKCB0aGlzLCB0eXBlLmdldE5hbWUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIzNWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0NvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RyYWludAotCi0gICAgaW1wbGVtZW50cyBJQ29uc3RyYWludAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdD4gb3BlcmFuZHM7Ci0gICAgCi0gICAgQ29uc3RyYWludCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIG9wZXJhbmRzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZnYgPSBmdjsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG9wZXJhbmRzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcC5hZGQoIG9wZXJhbmRzWyBpIF0gKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5vcGVyYW5kcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHRlbXAgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldE9wZXJhbmRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9wZXJhbmRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldE9wZXJhbmQoIGZpbmFsIGludCBpbmRleCApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vcGVyYW5kcy5nZXQoIGluZGV4ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIGNoZWNrKCBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrKCBmYWNldHMsIGZhbHNlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIGNoZWNrKCBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTb2Z0RGVwcyApCi0gICAgewotICAgICAgICBmaW5hbCBNdWx0aVN0YXR1cyByZXN1bHQgPSBjcmVhdGVNdWx0aVN0YXR1cygpOyAKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnR5cGUgPT0gVHlwZS5BTkQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogdGhpcy5vcGVyYW5kcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgY2hpbGRDb25zdHJhaW50ID0gKElDb25zdHJhaW50KSBvcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBjaGlsZENvbnN0cmFpbnQuY2hlY2soIGZhY2V0cywgdmFsaWRhdGVTb2Z0RGVwcyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBzdC5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0sgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCggc3QgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy50eXBlID09IFR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHNvbWVCcmFuY2hXb3JrcyA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogdGhpcy5vcGVyYW5kcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgY2hpbGRDb25zdHJhaW50ID0gKElDb25zdHJhaW50KSBvcGVyYW5kOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjaGlsZENvbnN0cmFpbnQuY2hlY2soIGZhY2V0cywgdmFsaWRhdGVTb2Z0RGVwcyApLmlzT0soKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzb21lQnJhbmNoV29ya3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIHNvbWVCcmFuY2hXb3JrcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2JsZW0gcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHRoaXMub3BlcmFuZHMuc2l6ZSgpID09IDIgJiYgY29udGFpbnNPbmx5UmVxdWlyZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXRSZWZbXSBmcmVmcyA9IG5ldyBQcm9qZWN0RmFjZXRSZWZbIDIgXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgMjsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgYyA9IChJQ29uc3RyYWludCkgdGhpcy5vcGVyYW5kcy5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgcmYgPSAoSVByb2plY3RGYWNldCkgYy5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgPSAoSVZlcnNpb25FeHByKSBjLmdldE9wZXJhbmQoIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZnNbIGkgXSA9IG5ldyBQcm9qZWN0RmFjZXRSZWYoIHJmLCB2ZXhwciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwID0gbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLlJFUVVJUkVTX09ORV9PRl9UV08sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnYsIGZyZWZzWyAwIF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVmc1sgMSBdICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBwID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcCA9IG5ldyBWYWxpZGF0aW9uUHJvYmxlbSggVmFsaWRhdGlvblByb2JsZW0uVHlwZS5DT01QTEVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIHAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0aGlzLnR5cGUgPT0gVHlwZS5SRVFVSVJFUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJvb2xlYW4gc29mdAotICAgICAgICAgICAgICAgID0gKCAoQm9vbGVhbikgdGhpcy5vcGVyYW5kcy5nZXQoIHRoaXMub3BlcmFuZHMuc2l6ZSgpIC0gMSApICk7Ci0gICAgICAgIAotICAgICAgICAgICAgaWYoICEgc29mdC5lcXVhbHMoIEJvb2xlYW4uVFJVRSApIHx8IHZhbGlkYXRlU29mdERlcHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBmaXJzdE9wZXJhbmQgPSB0aGlzLm9wZXJhbmRzLmdldCggMCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJR3JvdXAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUdyb3VwIGdyb3VwID0gKElHcm91cCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgY29udGFpbnNBbnkoIGZhY2V0cywgZ3JvdXAuZ2V0TWVtYmVycygpICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLlJFUVVJUkVTX0dST1VQOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHB0eXBlLCB0aGlzLmZ2LCBncm91cCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwcm9ibGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCByZiA9IChJUHJvamVjdEZhY2V0KSBmaXJzdE9wZXJhbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIHRoaXMub3BlcmFuZHMuZ2V0KCAxICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZmFjZXRzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZ2LmdldFByb2plY3RGYWNldCgpID09IHJmICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIuY2hlY2soIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgZm91bmQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHB0eXBlID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5SRVFVSVJFUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFJlZiBmcmVmID0gbmV3IFByb2plY3RGYWNldFJlZiggcmYsIHZleHByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Qcm9ibGVtIHByb2JsZW0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHB0eXBlLCB0aGlzLmZ2LCBmcmVmICk7IAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwcm9ibGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy50eXBlID09IFR5cGUuQ09ORkxJQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpcnN0T3BlcmFuZCA9IHRoaXMub3BlcmFuZHMuZ2V0KCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJR3JvdXAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElHcm91cCBncm91cCA9IChJR3JvdXApIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gbWVtYmVyIDogZ3JvdXAuZ2V0TWVtYmVycygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBtZW1iZXIuZ2V0UHJvamVjdEZhY2V0KCkgIT0gdGhpcy5mdi5nZXRQcm9qZWN0RmFjZXQoKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cy5jb250YWlucyggbWVtYmVyICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLkNPTkZMSUNUUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHQsIHRoaXMuZnYsIG1lbWJlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwcm9ibGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gKElQcm9qZWN0RmFjZXQpIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIKLSAgICAgICAgICAgICAgICAgICAgPSB0aGlzLm9wZXJhbmRzLnNpemUoKSA9PSAyID8gKElWZXJzaW9uRXhwcikgdGhpcy5vcGVyYW5kcy5nZXQoIDEgKSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdmVyIDogZmFjZXRzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmdmVyLmdldFByb2plY3RGYWNldCgpID09IGYgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIgPT0gbnVsbCB8fCB2ZXhwci5jaGVjayggZnZlciApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5DT05GTElDVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCB0LCB0aGlzLmZ2LCBmdmVyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggcHJvYmxlbSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcnVuZXMgdGhlIGNvbnN0cmFpbnQgYnkgcmVtb3ZpbmcgcGFydHMgdGhhdCBhcmUgbm90IHJlbGV2YW50IG9yIHNhdGlzZmllZCBieSBkZWZhdWx0Ci0gICAgICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb3ZpZGVkIGZpeGVkIGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiA8b2w+Ci0gICAgICogICA8bGk+QW4gQU5EIG9yIGFuIE9SIG9wZXJhdG9yIHdpdGggbm8gY2hpbGRyZW4gaXMgZWxpbWluYXRlZC48L2xpPgotICAgICAqICAgPGxpPkFuIEFORCBvciBhbiBPUiBvcGVyYXRvciB3aXRoIG9uZSBjaGlsZCBpcyByZXBsYWNlZCBieSB0aGF0IGNoaWxkLjwvbGk+Ci0gICAgICogICA8bGk+QSBSRVFVSVJFU19GQUNFVCBvcGVyYXRvciBpcyBlbGltaW5hdGVkIGlmIGFsbCBhcHBsaWNhYmxlIHZlcnNpb25zIG9mCi0gICAgICogICAgIHRoYXQgZmFjZXQgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBmaXhlZCBmYWNldHMuPC9saT4KLSAgICAgKiAgIDxsaT5BIFJFUVVJUkVEX0ZBQ0VUIG9wZXJhdG9yIGlzIGVsaW1pbmF0ZWQgaWYgaXQgd2lsbCBhY2NlcHQgZXZlcnkgdmVyc2lvbgotICAgICAqICAgICBvZiBhIGZpeGVkIGZhY2V0LjwvbGk+Ci0gICAgICogICA8bGk+QSBDT05GTElDVFNfV0lUSF9GQUNFVCBvcGVyYXRvciBpcyBlbGltaW5hdGVkIGlmIG5vbmUgb2YgdGhlIG1hdGNoZWQgdmVyc2lvbnMKLSAgICAgKiAgICAgb2YgdGhhdCBmYWNldCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmaXhlZCBmYWNldHMuPC9saT4KLSAgICAgKiAgIDxsaT5BIENPTkZMSUNUU19XSVRIX0dST1VQIG9wZXJhdG9yIGlzIGVsaW1pbmF0ZWQgaWYgYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwCi0gICAgICogICAgIChub3QgY291bnRpbmcgdGhpcyBmYWNldCkgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBmaXhlZCBmYWNldHMuPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUNvbnN0cmFpbnQgcHJ1bmVDb25zdHJhaW50KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkRmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcnVuZUNvbnN0cmFpbnQoIGZhY2V0LCBmYWNldC5nZXRDb25zdHJhaW50KCksIGZpeGVkRmFjZXRzICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNvbnN0cmFpbnQgcHJ1bmVDb25zdHJhaW50KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50IGNvbnN0cmFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSB0eXBlID0gY29uc3RyYWludC5nZXRUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCB8fCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElDb25zdHJhaW50PiBuZXdPcGVyYW5kcyA9IG5ldyBBcnJheUxpc3Q8SUNvbnN0cmFpbnQ+KCk7Ci0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBPYmplY3Qgb3BlcmFuZCA6IGNvbnN0cmFpbnQuZ2V0T3BlcmFuZHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgbmV3T3BlcmFuZCAKLSAgICAgICAgICAgICAgICAgICAgPSBwcnVuZUNvbnN0cmFpbnQoIGZhY2V0LCAoSUNvbnN0cmFpbnQpIG9wZXJhbmQsIGZpeGVkRmFjZXRzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG5ld09wZXJhbmQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggb3BlcmFuZCAhPSBuZXdPcGVyYW5kICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBuZXdPcGVyYW5kcy5hZGQoIG5ld09wZXJhbmQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3T3BlcmFuZHMuYWRkKCAoSUNvbnN0cmFpbnQpIG9wZXJhbmQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBuZXdPcGVyYW5kQ291bnQgPSBuZXdPcGVyYW5kcy5zaXplKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBuZXdPcGVyYW5kQ291bnQgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBuZXdPcGVyYW5kQ291bnQgPT0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld09wZXJhbmRzLmdldCggMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hhbmdlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50KCAoIChDb25zdHJhaW50KSBjb25zdHJhaW50ICkuZnYsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcGVyYW5kcy50b0FycmF5KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZmlyc3RPcGVyYW5kID0gY29uc3RyYWludC5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIGNvbnN0cmFpbnQuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBhY2NlcHRhYmxlVmVyc2lvbkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwci5jaGVjayggZnYgKSAmJiBmdi5pc1ZhbGlkRm9yKCBmaXhlZEZhY2V0cyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0YWJsZVZlcnNpb25Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBhY2NlcHRhYmxlVmVyc2lvbkNvdW50ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmaXhlZEZhY2V0cy5jb250YWlucyggZiApICYmIAotICAgICAgICAgICAgICAgICAgICBmLmdldFZlcnNpb25zKCkuc2l6ZSgpID09IGFjY2VwdGFibGVWZXJzaW9uQ291bnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZmlyc3RPcGVyYW5kID0gY29uc3RyYWludC5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIGNvbnN0cmFpbnQuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNWYWxpZEZvckNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwci5jaGVjayggZnYgKSAmJiBmdi5pc1ZhbGlkRm9yKCBmaXhlZEZhY2V0cyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZEZvckNvbnRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgaXNWYWxpZEZvckNvbnRleHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlyc3RPcGVyYW5kIGluc3RhbmNlb2YgSUdyb3VwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJR3JvdXAgZ3JvdXAgPSAoSUdyb3VwKSBmaXJzdE9wZXJhbmQ7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lSXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gbWVtYmVyIDogZ3JvdXAuZ2V0TWVtYmVycygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBtZW1iZXIuZ2V0UHJvamVjdEZhY2V0KCkgIT0gZmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuaXNWYWxpZEZvciggZml4ZWRGYWNldHMgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVJc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGF0TGVhc3RPbmVJc1ZhbGlkICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc09ubHlSZXF1aXJlcygpCi0gICAgewotICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogdGhpcy5vcGVyYW5kcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIChJQ29uc3RyYWludCkgb3BlcmFuZCApLmdldFR5cGUoKSAhPSBUeXBlLlJFUVVJUkVTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQW55KCBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBPYmplY3Q+IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgT2JqZWN0PiBiICkKLSAgICB7Ci0gICAgICAgIGZvciggT2JqZWN0IHggOiBhICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGIuY29udGFpbnMoIHggKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIE11bHRpU3RhdHVzIGNyZWF0ZU11bHRpU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyggbmV3IElTdGF0dXNbIDAgXSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTXVsdGlTdGF0dXMgY3JlYXRlTXVsdGlTdGF0dXMoIGZpbmFsIElTdGF0dXNbXSBjaGlsZHJlbiApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU3RhdHVzKCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBjaGlsZHJlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy52YWxpZGF0aW9uUHJvYmxlbXMsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0aW9uUHJvYmxlbXM7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBDb25zdHJhaW50LmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjJmMzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0NvbnN0cmFpbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXZhbGlkYXRpb25Qcm9ibGVtcyA9IE9uZSBvciBtb3JlIGNvbnN0cmFpbnRzIGhhdmUgbm90IGJlZW4gc2F0aXNmaWVkLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0RlZmF1bHRGYWNldHNFeHRlbnNpb25Qb2ludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGY3ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW4uUExVR0lOX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZEV4dGVuc2lvbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5nZXRUb3BMZXZlbEVsZW1lbnRzOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwucmVwb3J0TWlzc2luZ0F0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5JbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgcHJvY2Vzc2luZyB0aGUgPGNvZGU+ZGVmYXVsdEZhY2V0czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LiAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHRGYWNldHNFeHRlbnNpb25Qb2ludAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkZWZhdWx0RmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfQ09OVEVYVCA9ICJjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9ERUZBVUxUX0ZBQ0VUUyA9ICJkZWZhdWx0LWZhY2V0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRkFDRVQgPSAiZmFjZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZJWEVEX0ZBQ0VUID0gImZpeGVkLWZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9SVU5USU1FX0NPTVBPTkVOVCA9ICJydW50aW1lLWNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RGVmYXVsdEZhY2V0c0V4dGVuc2lvbj4gZXh0ZW5zaW9ucyA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldERlZmF1bHRGYWNldHMoIGZpbmFsIElGYWNldGVkUHJvamVjdEJhc2UgZnByb2ogKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJlYWRFeHRlbnNpb25zKCk7Ci0KLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkID0gZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gMS4gR2V0IHRoZSBjb21wbGV0ZSBsaXN0LgotICAgICAgICAKLSAgICAgICAgZmluYWwgTWFwPElQcm9qZWN0RmFjZXQsSVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggRGVmYXVsdEZhY2V0c0V4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGV4dGVuc2lvbi5tYXRjaCggZnByb2ogKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGV4dGVuc2lvbi5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjZXRzLnB1dCggZnYuZ2V0UHJvamVjdEZhY2V0KCksIGZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyAyLiBSZW1vdmUgdGhlIGZhY2V0cyB0aGF0IGNvbmZsaWN0IHdpdGggZml4ZWQgZmFjZXRzLgotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IHRvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmYWNldHMudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISBmdi5pc1ZhbGlkRm9yKCBmaXhlZCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b1JlbW92ZS5hZGQoIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogdG9SZW1vdmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldHMucmVtb3ZlKCBmICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIDMuIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgaW5jbHVkZXMgYWxsIG9mIHRoZSBmaXhlZCBmYWNldHMuCi0gICAgICAgIAotICAgICAgICBNYXA8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdG9hZGQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBmaXhlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIGZhY2V0cy5jb250YWluc0tleSggZiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdG9hZGQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0b2FkZCA9IG5ldyBIYXNoTWFwPElQcm9qZWN0RmFjZXQsSVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBydW50aW1lICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnYgPSBmLmdldExhdGVzdFN1cHBvcnRlZFZlcnNpb24oIHJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnYgPSBmLmdldERlZmF1bHRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRvYWRkLnB1dCggZiwgZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHRvYWRkICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldHMucHV0QWxsKCB0b2FkZCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyA0LiBSZXR1cm4gdGhlIHJlc3VsdC4KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggZmFjZXRzLnZhbHVlcygpICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgaWYoIGV4dGVuc2lvbnMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8RGVmYXVsdEZhY2V0c0V4dGVuc2lvbj4oKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCAKLSAgICAgICAgICAgICA6IGdldFRvcExldmVsRWxlbWVudHMoIGZpbmRFeHRlbnNpb25zKCBQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCBFTF9ERUZBVUxUX0ZBQ0VUUyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRFeHRlbnNpb24oIGVsZW1lbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIgdmlhIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkRXh0ZW5zaW9uKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIGZpbmFsIERlZmF1bHRGYWNldHNFeHRlbnNpb24gZXh0ZW5zaW9uID0gbmV3IERlZmF1bHRGYWNldHNFeHRlbnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkIDogY29uZmlnLmdldENoaWxkcmVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfUlVOVElNRV9DT01QT05FTlQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudFR5cGVSZWYgcmN0UmVmID0gUnVudGltZUNvbXBvbmVudFR5cGVSZWYucmVhZCggY2hpbGQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcmN0UmVmID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmFkZENvbnRleHQoIHJjdFJlZiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfQ09OVEVYVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb250ZXh0Q2hpbGQgOiBjaGlsZC5nZXRDaGlsZHJlbigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZXh0Q2hpbGROYW1lID0gY29udGV4dENoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjb250ZXh0Q2hpbGROYW1lLmVxdWFscyggRUxfUlVOVElNRV9DT01QT05FTlQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmIHJjdFJlZiA9IFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmLnJlYWQoIGNvbnRleHRDaGlsZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcmN0UmVmID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5hZGRDb250ZXh0KCByY3RSZWYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjb250ZXh0Q2hpbGROYW1lLmVxdWFscyggRUxfRklYRURfRkFDRVQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWQgPSBjb250ZXh0Q2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmlkICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5yZXBvcnRNaXNzaW5nRmFjZXQoIGZpZCwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGZpZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uYWRkQ29udGV4dCggZiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRkFDRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmlkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGZpZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB2ZXIgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGYuaGFzVmVyc2lvbiggdmVyICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLlJlc291cmNlcy5mYWNldFZlcnNpb25Ob3REZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRJZCgpLCB2ZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG1zZyArPSBOTFMuYmluZCggRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLlJlc291cmNlcy51c2VkSW5QbHVnaW4sIHBsdWdpbklkICk7IAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBleHRlbnNpb24uYWRkUHJvamVjdEZhY2V0KCBmLmdldFZlcnNpb24oIHZlciApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV4dGVuc2lvbnMuYWRkKCBleHRlbnNpb24gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0RmFjZXRzRXh0ZW5zaW9uCi0gICAgewotICAgICAgICBwcml2YXRlIFNldDxJUHJvamVjdEZhY2V0PiBjb250ZXh0Rml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTZXQ8UnVudGltZUNvbXBvbmVudFR5cGVSZWY+IGNvbnRleHRSdW50aW1lQ29tcG9uZW50VHlwZXMgCi0gICAgICAgICAgICA9IG5ldyBIYXNoU2V0PFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmPigpOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQ29udGV4dCggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29udGV4dEZpeGVkRmFjZXRzLmFkZCggZmFjZXQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQ29udGV4dCggZmluYWwgUnVudGltZUNvbXBvbmVudFR5cGVSZWYgcnVudGltZUNvbXBvbmVudFR5cGVSZWYgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbnRleHRSdW50aW1lQ29tcG9uZW50VHlwZXMuYWRkKCBydW50aW1lQ29tcG9uZW50VHlwZVJlZiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWNldHMuYWRkKCBmdiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIHRoaXMuY29udGV4dEZpeGVkRmFjZXRzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkRmFjZXRzID0gZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgZml4ZWRGYWNldHMuY29udGFpbnNBbGwoIHRoaXMuY29udGV4dEZpeGVkRmFjZXRzICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgdGhpcy5jb250ZXh0UnVudGltZUNvbXBvbmVudFR5cGVzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHJ1bnRpbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggUnVudGltZUNvbXBvbmVudFR5cGVSZWYgcmN0UmVmIDogdGhpcy5jb250ZXh0UnVudGltZUNvbXBvbmVudFR5cGVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnQgcmMgOiBydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcmN0UmVmLmNoZWNrKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIHJjLmdldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCkgKSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCAhIGZvdW5kICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0Q29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTAyOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRDb3JlUGx1Z2luIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLlBMVUdJTl9JRDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0lOR19BQ1RJT05fU09SVElORwotICAgICAgICA9IFBMVUdJTl9JRCArICIvYWN0aW9uU29ydGluZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDSU5HX0ZSQU1FV09SS19BQ1RJVkFUSU9OCi0gICAgICAgID0gUExVR0lOX0lEICsgIi9hY3RpdmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IG1lc3NhZ2VzTG9nZ2VkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElMb2cgcGxhdGZvcm1Mb2cKLSAgICAgICAgPSBQbGF0Zm9ybS5nZXRMb2coIFBsYXRmb3JtLmdldEJ1bmRsZSggUExVR0lOX0lEICkgKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nQWN0aW9uU29ydGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gY2hlY2tEZWJ1Z09wdGlvbiggVFJBQ0lOR19BQ1RJT05fU09SVElORyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gY2hlY2tEZWJ1Z09wdGlvbiggVFJBQ0lOR19GUkFNRVdPUktfQUNUSVZBVElPTiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrRGVidWdPcHRpb24oIGZpbmFsIFN0cmluZyBkZWJ1Z09wdGlvbiApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgb3B0aW9uVmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbiggZGVidWdPcHRpb24gKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZSA9PSBudWxsIAotICAgICAgICAgICAgICAgPyBmYWxzZSA6IEJvb2xlYW4udmFsdWVPZiggb3B0aW9uVmFsdWUgKS5lcXVhbHMoIEJvb2xlYW4uVFJVRSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgKyAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBJU3RhdHVzIHN0YXR1cyApCi0gICAgewotICAgICAgICBwbGF0Zm9ybUxvZy5sb2coIHN0YXR1cyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoIGZpbmFsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgbG9nRXJyb3IoIG1zZywgZmFsc2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKCBmaW5hbCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwcmVzc0R1cGxpY2F0ZXMgKQotICAgIHsKLSAgICAgICAgaWYoIHN1cHByZXNzRHVwbGljYXRlcyAmJiBtZXNzYWdlc0xvZ2dlZC5jb250YWlucyggbXNnICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1lc3NhZ2VzTG9nZ2VkLmFkZCggbXNnICk7Ci0gICAgICAgIAotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyggZmluYWwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICBsb2dXYXJuaW5nKCBtc2csIGZhbHNlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKCBmaW5hbCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1cHByZXNzRHVwbGljYXRlcyApCi0gICAgewotICAgICAgICBpZiggc3VwcHJlc3NEdXBsaWNhdGVzICYmIG1lc3NhZ2VzTG9nZ2VkLmNvbnRhaW5zKCBtc2cgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWVzc2FnZXNMb2dnZWQuYWRkKCBtc2cgKTsKLSAgICAgICAgCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyggZmluYWwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3JTdGF0dXMoIG1zZywgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyggZmluYWwgU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBtc2csIGUgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ZGIwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuRmlsZVV0aWwudmFsaWRhdGVFZGl0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlByb2dyZXNzTW9uaXRvclV0aWwuYmVnaW5UYXNrOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlByb2dyZXNzTW9uaXRvclV0aWwuZG9uZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5Qcm9ncmVzc01vbml0b3JVdGlsLnN1Ym1vbjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5Qcm9ncmVzc01vbml0b3JVdGlsLndvcmtlZDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5YbWxVdGlsLmVzY2FwZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5GaXhlZEZhY2V0c0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuTGVnYWN5TGlzdGVuZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5QcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsLlByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5Qcm9qZWN0TW9kaWZpZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbC5Vbmtub3duUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLk9iamVjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLS8qIAotICogU3luY2hyb25pemF0aW9uIE5vdGVzCi0gKiAKLSAqIDEuIFRoZXJlIGlzIGFuIGludGVybmFsIGxvY2sgb2JqZWN0IHRoYXQncyB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0bwotICogICAgdGhlIGRhdGEgc3RydWN0dXJlLiBCeSBzeW5jaHJvbml6aW5nIG9uIGFuIGludGVybmFsIG9iamVjdCwgb3V0c2lkZSBjb2RlCi0gKiAgICBjYW5ub3QgY2F1c2UgYSBkZWFkbG9jayBieSBzeW5jaHJvbml6aW5nIG9uIHRoZSBGYWNldGVkUHJvamVjdCBvYmplY3QuCi0gKiAgICAKLSAqIDIuIFJlYWRlcnMgc3luY2hyb25pemUgb24gdGhlIGxvY2sgb2JqZWN0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG1ldGhvZAotICogICAgY2FsbC4gVGhpcyBwcm90ZWN0cyB0aGUgcmVhZGVycyBmcm9tIHdyaXRlcnMgYW5kIG1ha2VzIHN1cmUgdGhhdCByZWFkZXIKLSAqICAgIGlzIG5vdCByZWFkaW5nIHN0YWxlIGRhdGEgZnJvbSB0aHJlYWQncyBsb2NhbCBtZW1vcnkuCi0gKiAgICAKLSAqIDMuIEFsbCBjb2xsZWN0aW9ucyB0aGF0IGFyZSByZXR1cm5lZCBieSB0aGUgcmVhZGVyIG1ldGhvZHMgYXJlIGd1YXJhbnRlZWQKLSAqICAgIHRvIG5vdCBjaGFuZ2UgYWZ0ZXIgdGhlIGZhY3QuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdGhyb3VnaCBhIGNvcHktb24td3JpdGUgCi0gKiAgICBwb2xpY3kuCi0gKiAKLSAqIDQuIFdyaXRlcnMgc3luY2hyb25pemUgb24gdGhlIGxvY2sgb2JqZWN0IGJyaWVmbHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBtZXRob2QgCi0gKiAgICBhbmQgbWFyayB0aGUgRmFjZXRlZFByb2plY3QgYXMgYmVpbmcgbW9kaWZpZWQuIElmIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkKLSAqICAgIGJlaW5nIG1vZGlmaWVkLCB0aGUgbmV3IHdyaXRlciB3aWxsIHdhaXQuIEluc2lkZSB0aGUgYm9kaWVzIG9mIHRoZQotICogICAgbW9kaWZpZXIgbWV0aG9kcywgdGhlIHdyaXRlciB0aHJlYWQgaXMgb25seSBzeW5jaHJvbml6ZWQgb24gdGhlIGxvY2sKLSAqICAgIG9iamVjdCB3aGlsZSBtb2RpZnlpbmcgdGhlIGludGVybmFsIGRhdGFzdHJ1Y3R1cmVzLiBUaGVzZSBzeW5jaHJvbml6YXRpb24KLSAqICAgIHNlY3Rpb25zIGFyZSBrZXB0IHNob3J0IGFuZCB0aGV5IG5ldmVyIHNwYW4gb3ZlciBjb2RlIHRoYXQgbWlnaHQgbW9kaWZ5Ci0gKiAgICBmaWxlIHN5c3RlbSByZXNvdXJjZXMuIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IGRlYWRsb2Nrcy4gT25jZSB0aGUgd3JpdGUKLSAqICAgIGlzIGNvbXBsZXRlLCB0aGUgd3JpdGVyIHRocmVhZCBzeW5jaHJvbml6ZXMgb24gdGhlIGxvY2sgb2JqZWN0LCByZXNldHMgdGhlIAotICogICAgImJlaW5nIG1vZGlmaWVkIiBmbGFnLCBhbmQgbm90aWZpZXMgYW55IHdyaXRlcnMgdGhhdCBtYXkgYmUgd2FpdGluZy4gCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0Ci0KLSAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdAotICAgIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0ZJTEUKLSAgICAgICAgPSAiLnNldHRpbmdzLyIgKyBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi54bWwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDSU5HX0RFTEVHQVRFX0NBTExTCi0gICAgICAgID0gRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIvZGVsZWdhdGUvY2FsbHMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1JVTlRJTUUgPSAicnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfU0VDT05EQVJZX1JVTlRJTUUgPSAic2Vjb25kYXJ5LXJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9JTlNUQUxMRUQgPSAiaW5zdGFsbGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0czsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzUmVhZE9ubHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWRSZWFkT25seTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsUHJvamVjdEZhY2V0PiB1bmtub3duRmFjZXRzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gdGFyZ2V0ZWRSdW50aW1lczsKLSAgICBwcml2YXRlIFN0cmluZyBwcmltYXJ5UnVudGltZTsKLSAgICBJRmlsZSBmOwotICAgIHByaXZhdGUgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXAgPSAtMTsKLSAgICBwcml2YXRlIGZpbmFsIFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5IGxpc3RlbmVyczsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlaW5nTW9kaWZpZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIFRocmVhZCBtb2RpZmllclRocmVhZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFeGNlcHRpb24gcGFyc2luZ0V4Y2VwdGlvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWxldGVkOwotICAgIAotICAgIEZhY2V0ZWRQcm9qZWN0KCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLmZhY2V0cyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICB0aGlzLmZhY2V0c1JlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCB0aGlzLmZhY2V0cyApOwotICAgICAgICB0aGlzLmZpeGVkID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgdGhpcy5maXhlZFJlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCB0aGlzLmZpeGVkICk7Ci0gICAgICAgIHRoaXMudW5rbm93bkZhY2V0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PFN0cmluZz4oKTsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgUHJvamVjdExpc3RlbmVyUmVnaXN0cnkoKTsKLSAgICAgICAgdGhpcy5wYXJzaW5nRXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgdGhpcy5pc0RlbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZiA9IHByb2plY3QuZ2V0RmlsZSggTUVUQURBVEFfRklMRSApOwotICAgICAgICAKLSAgICAgICAgcmVmcmVzaCggdHJ1ZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzUmVhZE9ubHk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5mYWNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSA9PSBmICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuY29udGFpbnMoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB0aGlzLmZhY2V0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZ2LmdldFByb2plY3RGYWNldCgpID09IGYgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SW5zdGFsbGVkVmVyc2lvbiggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCBmICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zdGFsbFByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gCi0gICAgICAgICAgICA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGZ2LCBjb25maWcgKTsKLSAgICAgICAgICAgIAotICAgICAgICBtb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG1vbml0b3IgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bmluc3RhbGxQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbiAKLSAgICAgICAgICAgID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmdiwgY29uZmlnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgbW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBtb25pdG9yICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1vZGlmeSggZmluYWwgU2V0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgT2JqZWN0UmVmZXJlbmNlPEJvb2xlYW4+IHJlc3VsdCA9IG5ldyBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4oIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSB3ciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZWdpbk1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBjcmVhdGVXb3JraW5nQ29weSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgPSBhY3Rpb24uZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGp3Yy5hZGRQcm9qZWN0RmFjZXQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGp3Yy5jaGFuZ2VQcm9qZWN0RmFjZXRWZXJzaW9uKCBmdiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwandjLnJlbW92ZVByb2plY3RGYWNldCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcgPSBhY3Rpb24uZ2V0Q29uZmlnKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb25maWcgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBqd2Muc2V0UHJvamVjdEZhY2V0QWN0aW9uQ29uZmlnKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSwgY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoIG1lcmdlQ2hhbmdlc0ludGVybmFsKCBmcGp3YywgbW9uaXRvciApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIHdzLnJ1biggd3IsIHdzLmdldFJvb3QoKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG1vbml0b3IgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCByZXN1bHQuZ2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBQcm9qZWN0TW9kaWZpZWRFdmVudCggdGhpcyApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtb2RpZnlJbnRlcm5hbCggZmluYWwgU2V0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYmVnaW5UYXNrKCBtb25pdG9yLCAiIiwgYWN0aW9ucy5zaXplKCkgKiAxMDAgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRlTm90RGVsZXRlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY2hlY2soIHRoaXMuZmFjZXRzLCBhY3Rpb25zICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIHN0LmlzT0soKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNvcnQgdGhlIGFjdGlvbnMgaW50byB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gY29weSA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPiggYWN0aW9ucyApOwotICAgICAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuc29ydCggdGhpcy5mYWNldHMsIGNvcHkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgYWN0aW9ucy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogY29weSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uLlR5cGUgdHlwZSA9IGFjdGlvbi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IChQcm9qZWN0RmFjZXRWZXJzaW9uKSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIElBY3Rpb25EZWZpbml0aW9uIGRlZiA9IGZ2LmdldEFjdGlvbkRlZmluaXRpb24oIHRoaXMuZmFjZXRzLCB0eXBlICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyA9IGFjdGlvbi5nZXRDb25maWcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdWJUYXNrRGVzY3JpcHRpb25UZW1wbGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLklOU1RBTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJUYXNrRGVzY3JpcHRpb25UZW1wbGF0ZSA9IFJlc291cmNlcy50YXNrSW5zdGFsbGluZ0ZhY2V0OyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YlRhc2tEZXNjcmlwdGlvblRlbXBsYXRlID0gUmVzb3VyY2VzLnRhc2tVbmluc3RhbGxpbmdGYWNldDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ViVGFza0Rlc2NyaXB0aW9uVGVtcGxhdGUgPSBSZXNvdXJjZXMudGFza0NoYW5naW5nRmFjZXRWZXJzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3ViVGFza0Rlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBzdWJUYXNrRGVzY3JpcHRpb25UZW1wbGF0ZSwgZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0TGFiZWwoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zdWJUYXNrKCBzdWJUYXNrRGVzY3JpcHRpb24gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgcHJlRXZlbnQKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQoIHRoaXMsIGdldFByZUV2ZW50VHlwZSggdHlwZSApLCBmdiwgY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggcHJlRXZlbnQgKTsKLSAgICAgICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEwICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSURlbGVnYXRlIGRlbGVnYXRlID0gKCAoQWN0aW9uRGVmaW5pdGlvbikgZGVmICkuZ2V0RGVsZWdhdGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZGVsZWdhdGUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDgwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxEZWxlZ2F0ZSggZnYsIGRlbGVnYXRlLCBjb25maWcsIHR5cGUsIHN1Ym1vbiggbW9uaXRvciwgODAgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwbHkoIGFjdGlvbiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYXZlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBwb3N0RXZlbnQKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQoIHRoaXMsIGdldFBvc3RFdmVudFR5cGUoIHR5cGUgKSwgZnYsIGNvbmZpZyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggcG9zdEV2ZW50ICk7Ci0gICAgICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRvbmUoIG1vbml0b3IgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldEZpeGVkUHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZpeGVkUmVhZE9ubHk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZFByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZpeGVkLmNvbnRhaW5zKCBmYWNldCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZpeGVkUHJvamVjdEZhY2V0cyggZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZhY2V0cyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgT2JqZWN0UmVmZXJlbmNlPEJvb2xlYW4+IHJlc3VsdCA9IG5ldyBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4oIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSB3ciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZWdpbk1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldCggc2V0Rml4ZWRQcm9qZWN0RmFjZXRzSW50ZXJuYWwoIGZhY2V0cywgbW9uaXRvciApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIHdzLnJ1biggd3IsIHdzLmdldFJvb3QoKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwgKTsKLQotICAgICAgICBpZiggcmVzdWx0LmdldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgUHJvamVjdE1vZGlmaWVkRXZlbnQoIHRoaXMgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRGaXhlZFByb2plY3RGYWNldHNJbnRlcm5hbCggZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZhY2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYmVnaW5UYXNrKCBtb25pdG9yLCAiIiwgMiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVOb3REZWxldGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNldDxJUHJvamVjdEZhY2V0PiBvbGRGaXhlZEZhY2V0cyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggRmFjZXRlZFByb2plY3QudGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZXF1YWxzKCB0aGlzLmZpeGVkLCBmYWNldHMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG9sZEZpeGVkRmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldD4oIHRoaXMuZml4ZWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5maXhlZC5hZGRBbGwoIGZhY2V0cyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgc2F2ZSgpOwotICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0KLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50KCB0aGlzLCBvbGRGaXhlZEZhY2V0cywgZmFjZXRzICkgKTsKLSAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRvbmUoIG1vbml0b3IgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcmltYXJ5UnVudGltZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgc2V0UnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldCBydW50aW1lcwotICAgICAgICAgICAgPSBydW50aW1lID09IG51bGwgCi0gICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBydW50aW1lICk7Ci0gICAgICAgIAotICAgICAgICBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBydW50aW1lcywgbW9uaXRvciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldGFibGUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIHJ1bnRpbWUuc3VwcG9ydHMoIGZ2ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUYXJnZXRlZCggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgewotICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBnZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggci5nZXROYW1lKCkuZXF1YWxzKCBydW50aW1lLmdldE5hbWUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVJ1bnRpbWU+IGdldFRhcmdldGVkUnVudGltZXMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElSdW50aW1lPigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIFN0cmluZyBybmFtZSA6IHRoaXMudGFyZ2V0ZWRSdW50aW1lcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggZ2V0UnVudGltZUZyb21OYW1lKCBybmFtZSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHJlc3VsdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldGVkUnVudGltZXMoIGZpbmFsIFNldDxJUnVudGltZT4gcnVudGltZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4gcmVzdWx0ID0gbmV3IE9iamVjdFJlZmVyZW5jZTxCb29sZWFuPiggdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHdyID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlZ2luTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KCBzZXRUYXJnZXRlZFJ1bnRpbWVzSW50ZXJuYWwoIHJ1bnRpbWVzLCBtb25pdG9yICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgd3MucnVuKCB3ciwgd3MuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlc3VsdC5nZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IFByb2plY3RNb2RpZmllZEV2ZW50KCB0aGlzICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0VGFyZ2V0ZWRSdW50aW1lc0ludGVybmFsKCBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJ1bnRpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYmVnaW5UYXNrKCBtb25pdG9yLCAiIiwgMiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVOb3REZWxldGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gb2xkUnVudGltZXM7Ci0gICAgICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IG5ld1J1bnRpbWVzOwotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgb2xkUHJpbWFyeTsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIG5ld1ByaW1hcnk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdGhpcy50YXJnZXRlZFJ1bnRpbWVzLnNpemUoKSA9PSBydW50aW1lcy5zaXplKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaWZmZXJlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHJ1bnRpbWVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNvbnRhaW5zKCByLmdldE5hbWUoKSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggISBkaWZmZXJlbnQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSBydW50aW1lIDogcnVudGltZXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgcnVudGltZS5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0Tm90U3VwcG9ydGVkLCBydW50aW1lLmdldExvY2FsaXplZE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2cgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG9sZFJ1bnRpbWVzID0gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KCBnZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ1bnRpbWUgOiBydW50aW1lcyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuYWRkKCBydW50aW1lLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuZXdSdW50aW1lcyA9IG5ldyBIYXNoU2V0PElSdW50aW1lPiggZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb2xkUHJpbWFyeSA9IGdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICAgICAgYXNzaWduUHJpbWFyeVJ1bnRpbWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIG5ld1ByaW1hcnkgPSBnZXRQcmltYXJ5UnVudGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzYXZlKCk7Ci0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQgdGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudAotICAgICAgICAgICAgICAgID0gbmV3IFRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQoIHRoaXMsIG9sZFJ1bnRpbWVzLCBuZXdSdW50aW1lcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIHRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgZXF1YWxzKCBvbGRQcmltYXJ5LCBuZXdQcmltYXJ5ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IFByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50KCB0aGlzLCBvbGRQcmltYXJ5LCBuZXdQcmltYXJ5ICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgZG9uZSggbW9uaXRvciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFRhcmdldGVkUnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBIYXNoU2V0PElSdW50aW1lPiggZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgIHJ1bnRpbWVzLmFkZCggcnVudGltZSApOwotICAgICAgICBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBydW50aW1lcywgbW9uaXRvciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVUYXJnZXRlZFJ1bnRpbWUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gcnVudGltZXMgPSBuZXcgSGFzaFNldDxJUnVudGltZT4oIGdldFRhcmdldGVkUnVudGltZXMoKSApOwotICAgICAgICBydW50aW1lcy5yZW1vdmUoIHJ1bnRpbWUgKTsKLSAgICAgICAgc2V0VGFyZ2V0ZWRSdW50aW1lcyggcnVudGltZXMsIG1vbml0b3IgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJ1bnRpbWUgZ2V0UHJpbWFyeVJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5wcmltYXJ5UnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UnVudGltZUZyb21OYW1lKCB0aGlzLnByaW1hcnlSdW50aW1lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeVJ1bnRpbWUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgT2JqZWN0UmVmZXJlbmNlPEJvb2xlYW4+IHJlc3VsdCA9IG5ldyBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4oIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSB3ciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZWdpbk1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldCggc2V0UHJpbWFyeVJ1bnRpbWVJbnRlcm5hbCggcnVudGltZSwgbW9uaXRvciApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIHdzLnJ1biggd3IsIHdzLmdldFJvb3QoKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCByZXN1bHQuZ2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBQcm9qZWN0TW9kaWZpZWRFdmVudCggdGhpcyApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFByaW1hcnlSdW50aW1lSW50ZXJuYWwoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYmVnaW5UYXNrKCBtb25pdG9yLCAiIiwgMiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVOb3REZWxldGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBydW50aW1lID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZXF1YWxzKCB0aGlzLnByaW1hcnlSdW50aW1lLCBydW50aW1lLmdldE5hbWUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAhIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5jb250YWlucyggcnVudGltZS5nZXROYW1lKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFJlc291cmNlcy5uZXdQcmltYXJ5Tm90VGFyZ2V0UnVudGltZTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2cgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBzdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSBvbGRQcmltYXJ5OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2xkUHJpbWFyeSA9IGdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IHJ1bnRpbWUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzYXZlKCk7Ci0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQoIHRoaXMsIG9sZFByaW1hcnksIHJ1bnRpbWUgKSApOwotICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgZG9uZSggbW9uaXRvciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElSdW50aW1lIGdldFJ1bnRpbWVGcm9tTmFtZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiggUnVudGltZU1hbmFnZXIuaXNSdW50aW1lRGVmaW5lZCggbmFtZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgcnVudGltZSA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWUoIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHJ1bnRpbWUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCByLmdldEFsdGVybmF0ZU5hbWVzKCkuY29udGFpbnMoIG5hbWUgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydW50aW1lID0gcjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcnVudGltZSA9IG5ldyBVbmtub3duUnVudGltZSggbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcnVudGltZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2lnblByaW1hcnlSdW50aW1lSWZOZWNlc3NhcnkoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnByaW1hcnlSdW50aW1lID09IG51bGwgfHwgCi0gICAgICAgICAgICAgICAgISB0aGlzLnRhcmdldGVkUnVudGltZXMuY29udGFpbnMoIHRoaXMucHJpbWFyeVJ1bnRpbWUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsaWRhdGUoIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJlZ2luVGFzayggbW9uaXRvciwgUmVzb3VyY2VzLnRhc2tWYWxpZGF0aW5nRmFjZXRlZFByb2plY3QsIDUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGFyc2luZyBwcm9ibGVtcy4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5wYXJzaW5nRXhjZXB0aW9uICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMucGFyc2luZ0V4Y2VwdGlvbiBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLm1ldGFkYXRhRmlsZUNvcnJ1cHRlZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmNvdWxkTm90UmVhZE1ldGFkYXRhRmlsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBBcmUgYW55IG9mIHRoZSB0YXJnZXQgcnVudGltZXMgbm90IGRlZmluZWQ/Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCByIGluc3RhbmNlb2YgVW5rbm93blJ1bnRpbWUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lTm90RGVmaW5lZCwgci5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElzIGFuIGluc3RhbGxlZCBmYWNldCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lPwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IGdldFRhcmdldGVkUnVudGltZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgci5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFjZXROb3RTdXBwb3J0ZWRCeVRhcmdldCwgZnYudG9TdHJpbmcoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0TG9jYWxpemVkTmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgcHJvamVjdCBjb250YWluIGFueSB1bmtub3duIGZhY2V0cyBvciB2ZXJzaW9ucz8KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGYuZ2V0UGx1Z2luSWQoKSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuaW5zdGFsbGVkRmFjZXROb3RGb3VuZCwgZi5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZCggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZnYuZ2V0UGx1Z2luSWQoKSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5pbnN0YWxsZWRGYWNldFZlcnNpb25Ob3RGb3VuZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRJZCgpLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDb21waWxlIHRoZSByZXN1bHQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGVycm9ycy5pc0VtcHR5KCkgJiYgd2FybmluZ3MuaXNFbXB0eSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLnByb2plY3RWYWxpZGF0aW9uRmFpbGVkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdC5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXNbXSBzdGFycmF5IAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgSVN0YXR1c1sgZXJyb3JzLnNpemUoKSArIHdhcm5pbmdzLnNpemUoKSBdOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSBlcnJvcnMuc2l6ZSgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnJheVsgaSBdIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5nZXQoIGkgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHdhcm5pbmdzLnNpemUoKSwgb2Zmc2V0ID0gZXJyb3JzLnNpemUoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaSA8IG47IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJyYXlbIGkgKyBvZmZzZXQgXSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuV0FSTklORywgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmdldCggaSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlTdGF0dXMoIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFycmF5LCBtc2csIG51bGwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9uZSggbW9uaXRvciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSggdGhpcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1lcmdlQ2hhbmdlcyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIE9iamVjdFJlZmVyZW5jZTxCb29sZWFuPiByZXN1bHQgPSBuZXcgT2JqZWN0UmVmZXJlbmNlPEJvb2xlYW4+KCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgd3IgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVnaW5Nb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoIG1lcmdlQ2hhbmdlc0ludGVybmFsKCBmcGp3YywgbW9uaXRvciApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIHdzLnJ1biggd3IsIHdzLmdldFJvb3QoKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG1vbml0b3IgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCByZXN1bHQuZ2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBQcm9qZWN0TW9kaWZpZWRFdmVudCggdGhpcyApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1lcmdlQ2hhbmdlc0ludGVybmFsKCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU3ViTW9uaXRvciBwbSA9IFN1Yk1vbml0b3IuY29udmVydCggbW9uaXRvciwgMjYgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hldGhlciB3ZSBjYW4gc2V0IHJ1bnRpbWVzIGJlZm9yZSBhcHBseWluZyBmYWNldCBhY3Rpb25zLiBUaGlzIGlzIGJldHRlcgotICAgICAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGJ1dCBtYXkgbm90IHdvcmsgaWYgdGhlIHByb2plY3QgY29udGFpbnMgZmFjZXRzIHRoYXQgYXJlCi0gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuZXcgcnVudGltZS4gWW91IGNhbiBnZXQgaW50byB0aGlzIHNpdHVhdGlvbiBpZiB0aGUgdXNlciB0cmllcwotICAgICAgICAgICAgLy8gdG8gc2ltdWx0YW5lb3VzbHkgdW5pbnN0YWxsIGEgZmFjZXQgYW5kIHNlbGVjdCBhIGRpZmZlcmVudCBydW50aW1lLiBUaGUgZmFsbGJhY2sKLSAgICAgICAgICAgIC8vIHNvbHV0aW9uIGZvciB0aGlzIHNpdHVhdGlvbiBpcyB0byBzZXQgdGhlIHRhcmdldGVkIHJ1bnRpbWVzIHRvIGFuIGVtcHR5IGxpc3QgZmlyc3QsCi0gICAgICAgICAgICAvLyB0aGVuIGFwcGx5IHRoZSBmYWNldCBhY3Rpb25zLCBhbmQgdGhlbiBzZXQgdGhlIHRhcmdldGVkIHJ1bnRpbWVzIHRvIHRoZSBuZXcgbGlzdC4KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgbW9yZSBkcmFzdGljIHRoYW4gbmVjZXNzYXJ5IGluIGFsbCBzaXR1YXRpb25zLCBidXQgaXQgaXMgbm90IGNsZWFyIHRoYXQKLSAgICAgICAgICAgIC8vIGltcGxlbWVudGluZyBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaXMgbmVjZXNzYXJ5IGVpdGhlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBjYW5TZXRSdW50aW1lc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogZnBqd2MuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIHIuc3VwcG9ydHMoIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW5TZXRSdW50aW1lc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBjYW5TZXRSdW50aW1lc0ZpcnN0ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcG0uc3ViVGFzayggUmVzb3VyY2VzLnRhc2tDb25maWd1cmluZ1J1bnRpbWVzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjYW5TZXRSdW50aW1lc0ZpcnN0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggc2V0VGFyZ2V0ZWRSdW50aW1lc0ludGVybmFsKCBmcGp3Yy5nZXRUYXJnZXRlZFJ1bnRpbWVzKCksIHN1Ym1vbiggcG0sIDIgKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGdldFByaW1hcnlSdW50aW1lKCkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5UnVudGltZUludGVybmFsKCBmcGp3Yy5nZXRQcmltYXJ5UnVudGltZSgpLCBzdWJtb24oIHBtLCAyICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG0ud29ya2VkKCAyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gZW1wdHlTZXQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICAgICAgICAgIHNldFRhcmdldGVkUnVudGltZXNJbnRlcm5hbCggZW1wdHlTZXQsIHN1Ym1vbiggcG0sIDQgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9kaWZ5SW50ZXJuYWwoIGZwandjLmdldFByb2plY3RGYWNldEFjdGlvbnMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtLm5ld0NoaWxkKCAxNiwgU3ViTW9uaXRvci5TVVBQUkVTU19TRVRUQVNLTkFNRSApICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgY2FuU2V0UnVudGltZXNGaXJzdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG0uc3ViVGFzayggUmVzb3VyY2VzLnRhc2tDb25maWd1cmluZ1J1bnRpbWVzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHNldFRhcmdldGVkUnVudGltZXNJbnRlcm5hbCggZnBqd2MuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLCBzdWJtb24oIHBtLCAyICkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBnZXRQcmltYXJ5UnVudGltZSgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHNldFByaW1hcnlSdW50aW1lSW50ZXJuYWwoIGZwandjLmdldFByaW1hcnlSdW50aW1lKCksIHN1Ym1vbiggcG0sIDIgKSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBtLndvcmtlZCggMiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHNldEZpeGVkUHJvamVjdEZhY2V0c0ludGVybmFsKCBmcGp3Yy5nZXRGaXhlZFByb2plY3RGYWNldHMoKSwgc3VibW9uKCBwbSwgMiApICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVkOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcG0uZG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTWFya2VyIGNyZWF0ZUVycm9yTWFya2VyKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yTWFya2VyKCBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuQkFTRV9NQVJLRVJfSUQsIG1lc3NhZ2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlciBjcmVhdGVFcnJvck1hcmtlciggZmluYWwgU3RyaW5nIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlTWFya2VyKCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCB0eXBlLCBtZXNzYWdlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTWFya2VyIGNyZWF0ZVdhcm5pbmdNYXJrZXIoIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV2FybmluZ01hcmtlciggSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yLkJBU0VfTUFSS0VSX0lELCBtZXNzYWdlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTWFya2VyIGNyZWF0ZVdhcm5pbmdNYXJrZXIoIGZpbmFsIFN0cmluZyB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1hcmtlciggSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCB0eXBlLCBtZXNzYWdlICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSU1hcmtlciBjcmVhdGVNYXJrZXIoIGZpbmFsIGludCBzZXZlcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSU1hcmtlcltdIGV4aXN0aW5nCi0gICAgICAgICAgICA9IHRoaXMucHJvamVjdC5maW5kTWFya2VycyggdHlwZSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGV4aXN0aW5nLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSU1hcmtlciBtID0gZXhpc3RpbmdbIGkgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG0uZ2V0QXR0cmlidXRlKCBJTWFya2VyLlNFVkVSSVRZLCAtMSApID09IHNldmVyaXR5ICYmCi0gICAgICAgICAgICAgICAgbS5nZXRBdHRyaWJ1dGUoIElNYXJrZXIuTUVTU0FHRSwgIiIgKS5lcXVhbHMoIG1lc3NhZ2UgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSU1hcmtlciBtID0gdGhpcy5wcm9qZWN0LmNyZWF0ZU1hcmtlciggdHlwZSApOwotICAgICAgCi0gICAgICAgIG0uc2V0QXR0cmlidXRlKCBJTWFya2VyLk1FU1NBR0UsIG1lc3NhZ2UgKTsgCi0gICAgICAgIG0uc2V0QXR0cmlidXRlKCBJTWFya2VyLlNFVkVSSVRZLCBzZXZlcml0eSApOwotICAgICAgCi0gICAgICAgIHJldHVybiBtOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzLm5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdExpc3RlbmVyUmVnaXN0cnkoKS5ub3RpZnlMaXN0ZW5lcnMoIGV2ZW50ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZExpc3RlbmVyKCBuZXcgTGVnYWN5TGlzdGVuZXJBZGFwdGVyKCBsaXN0ZW5lciApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHggCi0gICAgICAgICAgICAgOiB0aGlzLmxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCApICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHggaW5zdGFuY2VvZiBMZWdhY3lMaXN0ZW5lckFkYXB0ZXIgJiYKLSAgICAgICAgICAgICAgICAoIChMZWdhY3lMaXN0ZW5lckFkYXB0ZXIpIHggKS5nZXRMZWdhY3lMaXN0ZW5lcigpID09IGxpc3RlbmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lciggeCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJlZ2luTW9kaWZpY2F0aW9uKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCB0aGlzLmlzQmVpbmdNb2RpZmllZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHRoaXMubW9kaWZpZXJUaHJlYWQgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gUmVzb3VyY2VzLmlsbGVnYWxNb2RpZmljYXRpb25Nc2c7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NrLndhaXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmlzQmVpbmdNb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLm1vZGlmaWVyVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZW5kTW9kaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc0JlaW5nTW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRoaXMubW9kaWZpZXJUaHJlYWQgPSBudWxsOwotICAgICAgICAgICAgdGhpcy5sb2NrLm5vdGlmeUFsbCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUgZ2V0UHJlRXZlbnRUeXBlKCBmaW5hbCBBY3Rpb24uVHlwZSB0ICkKLSAgICB7Ci0gICAgICAgIGlmKCB0ID09IEFjdGlvbi5UeXBlLklOU1RBTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUkVfSU5TVEFMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0ID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9VTklOU1RBTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdCA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9WRVJTSU9OX0NIQU5HRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlIGdldFBvc3RFdmVudFR5cGUoIGZpbmFsIEFjdGlvbi5UeXBlIHQgKQotICAgIHsKLSAgICAgICAgaWYoIHQgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfSU5TVEFMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0ID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfVU5JTlNUQUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHQgPT0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QT1NUX1ZFUlNJT05fQ0hBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxEZWxlZ2F0ZSggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSURlbGVnYXRlIGRlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgdHJhY2luZ0RlbGVnYXRlQ2FsbHNTdHIKLSAgICAgICAgICAgID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIFRSQUNJTkdfREVMRUdBVEVfQ0FMTFMgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gdHJhY2luZ0RlbGVnYXRlQ2FsbHMgCi0gICAgICAgICAgICA9IHRyYWNpbmdEZWxlZ2F0ZUNhbGxzU3RyID09IG51bGwgPyBmYWxzZSAKLSAgICAgICAgICAgICAgOiB0cmFjaW5nRGVsZWdhdGVDYWxsc1N0ci5lcXVhbHMoICJ0cnVlIiApOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgbG9uZyB0aW1lU3RhcnRlZCA9IC0xOwotICAgICAgICAKLSAgICAgICAgaWYoIHRyYWNpbmdEZWxlZ2F0ZUNhbGxzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy50cmFjaW5nRGVsZWdhdGVTdGFydGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFZlcnNpb25TdHJpbmcoKSwgY29udGV4dC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggbXNnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRpbWVTdGFydGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5leGVjdXRlKCB0aGlzLnByb2plY3QsIGZ2LCBjb25maWcsIG1vbml0b3IgKTsgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNvbnRleHQgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRPbkluc3RhbGwsIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjb250ZXh0ID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRPblVuaW5zdGFsbCwgZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNvbnRleHQgPT0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFpbGVkT25WZXJzaW9uQ2hhbmdlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0TGFiZWwoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIGNvbnRleHQudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0YXR1cwotICAgICAgICAgICAgICAgID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIGUgKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0YXR1cyApOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHRyYWNpbmdEZWxlZ2F0ZUNhbGxzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZVN0YXJ0ZWQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLnRyYWNpbmdEZWxlZ2F0ZUZpbmlzaGVkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZiggZHVyYXRpb24gKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIG1zZyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhcHBseSggZmluYWwgQWN0aW9uIGFjdGlvbiApCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlID0gYWN0aW9uLmdldFR5cGUoKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAKLSAgICAgICAgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjZXRzLnJlbW92ZSggZnYgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiB4IDogdGhpcy5mYWNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4LmdldFByb2plY3RGYWNldCgpID09IGZ2LmdldFByb2plY3RGYWNldCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzLnJlbW92ZSggeCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2F2ZSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGZpbmFsIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlciggdyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIG5sID0gU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIG91dC5wcmludCggIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQucHJpbnQoIG5sICk7Ci0gICAgICAgIG91dC5wcmludCggIjxmYWNldGVkLXByb2plY3Q+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG91dC5wcmludCggbmwgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnByaW1hcnlSdW50aW1lICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoICIgIDxydW50aW1lIG5hbWU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggZXNjYXBlKCB0aGlzLnByaW1hcnlSdW50aW1lICkgKTsKLSAgICAgICAgICAgIG91dC5wcmludCggIlwiLz4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggbmwgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBTdHJpbmcgbmFtZSA6IHRoaXMudGFyZ2V0ZWRSdW50aW1lcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIG5hbWUuZXF1YWxzKCB0aGlzLnByaW1hcnlSdW50aW1lICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC5wcmludCggIiAgPHNlY29uZGFyeS1ydW50aW1lIG5hbWU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIGVzY2FwZSggbmFtZSApICk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KCAiXCIvPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG91dC5wcmludCggbmwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiB0aGlzLmZpeGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50KCAiICA8Zml4ZWQgZmFjZXQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggZXNjYXBlKCBmLmdldElkKCkgKSApOwotICAgICAgICAgICAgb3V0LnByaW50KCAiXCIvPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgb3V0LnByaW50KCBubCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5mYWNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoICIgIDxpbnN0YWxsZWQgZmFjZXQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggZXNjYXBlKCBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpICkgKTsKLSAgICAgICAgICAgIG91dC5wcmludCggIlwiIHZlcnNpb249XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggZXNjYXBlKCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKSApOwotICAgICAgICAgICAgb3V0LnByaW50KCAiXCIvPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgb3V0LnByaW50KCBubCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvdXQucHJpbnQoICI8L2ZhY2V0ZWQtcHJvamVjdD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3V0LnByaW50KCBubCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVzID0gdy5nZXRCdWZmZXIoKS50b1N0cmluZygpLmdldEJ5dGVzKCAiVVRGLTgiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVW5leHBlY3RlZC4gQWxsIEpWTXMgYXJlIHN1cHBvc2VkIHRvIHN1cHBvcnQgVVRGLTguCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggYnl0ZXMgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLmYuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUVkaXQoIHRoaXMuZiApOwotICAgICAgICAgICAgdGhpcy5mLnNldENvbnRlbnRzKCBpbiwgdHJ1ZSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGb2xkZXIgcGFyZW50ID0gKElGb2xkZXIpIHRoaXMuZi5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgcGFyZW50LmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQuY3JlYXRlKCB0cnVlLCB0cnVlLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZi5jcmVhdGUoIGluLCB0cnVlLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuZk1vZGlmaWNhdGlvblN0YW1wID0gdGhpcy5mLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0gICAgICAgIHRoaXMucGFyc2luZ0V4Y2VwdGlvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmVmcmVzaCggZmFsc2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXppbmcgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuaXNCZWluZ01vZGlmaWVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLmYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSA9PSB0aGlzLmZNb2RpZmljYXRpb25TdGFtcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBiZWdpbk1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmZhY2V0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWQuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLnVua25vd25GYWNldHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISB0aGlzLmYuZXhpc3RzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5mTW9kaWZpY2F0aW9uU3RhbXAgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5mTW9kaWZpY2F0aW9uU3RhbXAgPSB0aGlzLmYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHBhcnNlKCB0aGlzLmYuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzaW5nRXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNpbmdFeGNlcHRpb24gPSBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5wYXJzaW5nRXhjZXB0aW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50W10gZWxlbWVudHMgPSBjaGlsZHJlbiggcm9vdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUgPSBlbGVtZW50c1sgaSBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZS5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuYW1lLmVxdWFscyggRUxfUlVOVElNRSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWFyeVJ1bnRpbWUgPSBlLmdldEF0dHJpYnV0ZSggQVRUUl9OQU1FICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5hZGQoIHRoaXMucHJpbWFyeVJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbmFtZS5lcXVhbHMoIEVMX1NFQ09OREFSWV9SVU5USU1FICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmFkZCggZS5nZXRBdHRyaWJ1dGUoIEFUVFJfTkFNRSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG5hbWUuZXF1YWxzKCBFTF9GSVhFRCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGUuZ2V0QXR0cmlidXRlKCBBVFRSX0ZBQ0VUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGlkICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVVua25vd25GYWNldCggaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXhlZC5hZGQoIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbmFtZS5lcXVhbHMoIEVMX0lOU1RBTExFRCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGUuZ2V0QXR0cmlidXRlKCBBVFRSX0ZBQ0VUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uID0gZS5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggaWQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGlkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlVW5rbm93bkZhY2V0KCBpZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmLmhhc1ZlcnNpb24oIHZlcnNpb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2ID0gZi5nZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdiA9IGNyZWF0ZVVua25vd25GYWNldFZlcnNpb24oIGYsIHZlcnNpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlIHByb2plY3Qgd2FzIGNoYW5nZWQuIEFsbCBvZiB0aGUgbm8tb3AgY2hlY2tzIHJldHVybiBlYXJseS4gVGhlCi0gICAgICAgIC8vIGV4Y2VwdGlvbiBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgZmFjZXRlZCBwcm9qZWN0IGlzIGJlaW5nIGluaXRpYWxpemVkIGZvciB0aGUgZmlyc3QKLSAgICAgICAgLy8gdGltZSBpbiB0aGUgd29ya2JlbmNoIHNlc3Npb24gKGZvciBpbnN0YW5jZSBhZnRlciB3b3JrYmVuY2ggcmVzdGFydCBvciB3aGVuIGFuIAotICAgICAgICAvLyBleGlzdGluZyBmYWNldGVkIHByb2plY3QgaXMgaW1wb3J0ZWQgaW50byB0aGUgd29ya3NwYWNlKS4KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGlzSW5pdGlhbGl6aW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgUHJvamVjdE1vZGlmaWVkRXZlbnQoIHRoaXMgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgbWFya0RlbGV0ZWQoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgYmVnaW5Nb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5mYWNldHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy51bmtub3duRmFjZXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuaXNEZWxldGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVOb3REZWxldGVkKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggdGhpcy5pc0RlbGV0ZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gUmVzb3VyY2VzLmNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0OwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFByb2plY3RGYWNldCBjcmVhdGVVbmtub3duRmFjZXQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBQcm9qZWN0RmFjZXQgZiA9IHRoaXMudW5rbm93bkZhY2V0cy5nZXQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZiA9IG5ldyBQcm9qZWN0RmFjZXQoKTsKLSAgICAgICAgICAgIGYuc2V0SWQoIGlkICk7Ci0gICAgICAgICAgICBmLnNldExhYmVsKCBpZCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnVua25vd25GYWNldHMucHV0KCBpZCwgZiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBQcm9qZWN0RmFjZXRWZXJzaW9uIGNyZWF0ZVVua25vd25GYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXQgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0VmVyc2lvbiBmdjsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmLmhhc1ZlcnNpb24oIHZlcnNpb24gKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZ2ID0gKFByb2plY3RGYWNldFZlcnNpb24pIGYuZ2V0VmVyc2lvbiggdmVyc2lvbiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZnYgPSBuZXcgUHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgZnYuc2V0UHJvamVjdEZhY2V0KCAoUHJvamVjdEZhY2V0KSBmICk7Ci0gICAgICAgICAgICBmdi5zZXRWZXJzaW9uU3RyaW5nKCB2ZXJzaW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmdjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBwYXJzZSggZmluYWwgRmlsZSBmICkKLSAgICAKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jYnVpbGRlcjsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgCi0gICAgICAgICAgICAgICAgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyggZmFsc2UgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG9jYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRvY2J1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICBuZXcgRW50aXR5UmVzb2x2ZXIoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoIGZpbmFsIFN0cmluZyBwdWJsaWNJRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiIiApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZG9jYnVpbGRlci5wYXJzZSggZiApLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEVsZW1lbnRbXSBjaGlsZHJlbiggZmluYWwgRWxlbWVudCBlbGVtZW50ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8RWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKLSAgICAgICAgZmluYWwgTm9kZUxpc3QgbmwgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gbmwuZ2V0TGVuZ3RoKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBOb2RlIG5vZGUgPSBubC5pdGVtKCBpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCAoRWxlbWVudCkgbm9kZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KCBuZXcgRWxlbWVudFsgbGlzdC5zaXplKCkgXSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iajEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmoyICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmoxID09IG9iajIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9iajEuZXF1YWxzKCBvYmoyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkT25JbnN0YWxsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRPblVuaW5zdGFsbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkT25WZXJzaW9uQ2hhbmdlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldE5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0VmVyc2lvbk5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0Tm90U3VwcG9ydGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbGxlZ2FsTW9kaWZpY2F0aW9uTXNnOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFjaW5nRGVsZWdhdGVTdGFydGluZzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhY2luZ0RlbGVnYXRlRmluaXNoZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1ByaW1hcnlOb3RUYXJnZXRSdW50aW1lOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdDsKLSAgICAgICAgCi0gICAgICAgIC8vIFRhc2sgRGVzY3JpcHRpb25zCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrVmFsaWRhdGluZ0ZhY2V0ZWRQcm9qZWN0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrSW5zdGFsbGluZ0ZhY2V0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrVW5pbnN0YWxsaW5nRmFjZXQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDaGFuZ2luZ0ZhY2V0VmVyc2lvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NvbmZpZ3VyaW5nUnVudGltZXM7Ci0gICAgICAgIAotICAgICAgICAvLyBWYWxpZGF0aW9uIE1lc3NhZ2VzCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9qZWN0VmFsaWRhdGlvbkZhaWxlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0YWRhdGFGaWxlQ29ycnVwdGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VsZE5vdFJlYWRNZXRhZGF0YUZpbGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldE5vdFN1cHBvcnRlZEJ5VGFyZ2V0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsZWRGYWNldE5vdEZvdW5kOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsZWRGYWNldFZlcnNpb25Ob3RGb3VuZDsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEZhY2V0ZWRQcm9qZWN0LmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggbXNnLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0IH0gKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3QucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmE1YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWZhaWxlZE9uSW5zdGFsbCA9IEZhaWxlZCB3aGlsZSBpbnN0YWxsaW5nIHswfS4KLWZhaWxlZE9uVW5pbnN0YWxsID0gRmFpbGVkIHdoaWxlIHVuaW5zdGFsbGluZyB7MH0uCi1mYWlsZWRPblZlcnNpb25DaGFuZ2UgPSBGYWlsZWQgd2hpbGUgY2hhbmdpbmcgdmVyc2lvbiBvZiB7MH0gdG8gezF9LgotZmFjZXROb3REZWZpbmVkID0gRmFjZXQgezB9IGlzIG5vdCBkZWZpbmVkLgotZmFjZXRWZXJzaW9uTm90RGVmaW5lZCA9IFZlcnNpb24gezF9IG9mIGZhY2V0IHswfSBpcyBub3QgZGVmaW5lZC4KLWZhY2V0Tm90U3VwcG9ydGVkID0gUnVudGltZSB7MH0gZG9lcyBub3Qgc3VwcG9ydCBwcm9qZWN0IGZhY2V0IHsxfS4KLWlsbGVnYWxNb2RpZmljYXRpb25Nc2cgPSBDYW5ub3QgbW9kaWZ5IGZhY2V0ZWQgcHJvamVjdCBmcm9tIHdpdGhpbiBhIGZhY2V0IGRlbGVnYXRlLgotdHJhY2luZ0RlbGVnYXRlU3RhcnRpbmcgPSBcCi1DYWxsaW5nIHByb2plY3QgZmFjZXQgZGVsZWdhdGU6XG5cCi1cICBmYWNldDogezB9IDogezF9XG5cCi1cICB0eXBlOiAgezJ9XG5cCi1cICBjbGFzczogezN9Ci10cmFjaW5nRGVsZWdhdGVGaW5pc2hlZCA9IFByb2plY3QgZmFjZXQgZGVsZWdhdGUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpbiB7MH0gbXMuCi1uZXdQcmltYXJ5Tm90VGFyZ2V0UnVudGltZSA9IFByaW1hcnkgcnVudGltZSBoYXMgdG8gYmUgb25lIG9mIHRoZSB0YXJnZXRlZCBydW50aW1lcy4KLWNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0ID0gQ2Fubm90IG1vZGlmeSBhIGRlbGV0ZWQgcHJvamVjdC4KLQotIyBUYXNrIERlc2NyaXB0aW9ucwotCi10YXNrVmFsaWRhdGluZ0ZhY2V0ZWRQcm9qZWN0ID0gVmFsaWRhdGluZyBmYWNldGVkIHByb2plY3QuLi4KLXRhc2tJbnN0YWxsaW5nRmFjZXQgPSBJbnN0YWxsaW5nIHswfSBmYWNldC4uLgotdGFza1VuaW5zdGFsbGluZ0ZhY2V0ID0gVW5pbnN0YWxsaW5nIHswfSBmYWNldC4uLgotdGFza0NoYW5naW5nRmFjZXRWZXJzaW9uID0gQ2hhbmdpbmcgdmVyc2lvbiBvZiB7MH0gZmFjZXQuLi4KLXRhc2tDb25maWd1cmluZ1J1bnRpbWVzID0gQ29uZmlndXJpbmcgdGFyZ2V0ZWQgcnVudGltZXMuLi4KLQotIyBWYWxpZGF0aW9uIE1lc3NhZ2VzCi0KLXByb2plY3RWYWxpZGF0aW9uRmFpbGVkID0gRW5jb3VudGVyZWQgcHJvYmxlbXMgd2hpbGUgdmFsaWRhdGluZyBmYWNldGVkIHByb2plY3QgInswfSIuCi1tZXRhZGF0YUZpbGVDb3JydXB0ZWQgPSBGYWNldGVkIHByb2plY3QgbWV0YWRhdGEgZmlsZSAiezB9IiBpcyBjb3JydXB0ZWQgYW5kIGNvdWxkIG5vdCBiZSBwYXJzZWQuCi1jb3VsZE5vdFJlYWRNZXRhZGF0YUZpbGUgPSBGYWNldGVkIHByb2plY3QgbWV0YWRhdGEgZmlsZSAiezB9IiBjb3VsZCBub3QgYmUgcmVhZC4KLXJ1bnRpbWVOb3REZWZpbmVkID0gVGFyZ2V0IHJ1bnRpbWUgezB9IGlzIG5vdCBkZWZpbmVkLgotZmFjZXROb3RTdXBwb3J0ZWRCeVRhcmdldCA9IFByb2plY3QgZmFjZXQgezB9IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGFyZ2V0IHJ1bnRpbWUgezF9LgotaW5zdGFsbGVkRmFjZXROb3RGb3VuZCA9IEltcGxlbWVudGF0aW9uIG9mIHByb2plY3QgZmFjZXQgezB9IGNvdWxkIG5vdCBiZSBmb3VuZC4gRnVuY3Rpb25hbGl0eSB3aWxsIGJlIGxpbWl0ZWQuCi1pbnN0YWxsZWRGYWNldFZlcnNpb25Ob3RGb3VuZCA9IEltcGxlbWVudGF0aW9uIG9mIHZlcnNpb24gezF9IG9mIHByb2plY3QgZmFjZXQgezB9IGNvdWxkIG5vdCBiZSBmb3VuZC4gRnVuY3Rpb25hbGl0eSB3aWxsIGJlIGxpbWl0ZWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTBkMWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEFkYXB0cyB7QHNlZSBJUHJvamVjdH0gdG8ge0BzZWUgSUZhY2V0ZWRQcm9qZWN0fS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0QWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElGYWNldGVkUHJvamVjdC5jbGFzcyB9OwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgT2JqZWN0IGFkYXB0YWJsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgewotICAgICAgICBpZiggYWRhcHRlclR5cGUgPT0gSUZhY2V0ZWRQcm9qZWN0LmNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggKElQcm9qZWN0KSBhZGFwdGFibGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3NjhkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLkZpbGVVdGlsLkZJTEVfRE9UX1BST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuRmlsZVV0aWwudmFsaWRhdGVFZGl0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZE9wdGlvbmFsRWxlbWVudDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRSZXF1aXJlZEF0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldEVsZW1lbnRWYWx1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwucmVwb3J0TWlzc2luZ0F0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLnJlcG9ydE1pc3NpbmdFbGVtZW50OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlZmF1bHRWZXJzaW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb25FeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5FdmVudHNFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuRnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuUHJvamVjdExpc3RlbmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5JbmRleGVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbkV4cHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLkludmFsaWRFeHRlbnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyfSBhYnN0cmFjdCBjbGFzcy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSUQgPSAiZmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRkFDRVQgPSAiZmFjZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfR1JPVVAgPSAiZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1ZJREVSID0gInByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NPRlQgPSAic29mdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9BQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfQ09ORklHX0ZBQ1RPUlkgPSAiY29uZmlnLWZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0NPTlNUUkFJTlQgPSAiY29uc3RyYWludCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfREVGQVVMVF9WRVJTSU9OID0gImRlZmF1bHQtdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfREVMRUdBVEUgPSAiZGVsZWdhdGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9FVkVOVF9IQU5ETEVSID0gImV2ZW50LWhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0dST1VQID0gImdyb3VwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9HUk9VUF9NRU1CRVIgPSAiZ3JvdXAtbWVtYmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfTUVNQkVSID0gIm1lbWJlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUFJPSkVDVF9GQUNFVCA9ICJwcm9qZWN0LWZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9QUk9KRUNUX0ZBQ0VUX1ZFUlNJT04gPSAicHJvamVjdC1mYWNldC12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfVkVSU0lPTl9DT01QQVJBVE9SID0gInZlcnNpb24tY29tcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERVNDUklQVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsIGluc3RhbmNlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBmYWNldHNSZXBvcnRlZE1pc3NpbmcgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJUHJvamVjdEZhY2V0PiBmYWNldHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJQWN0aW9uRGVmaW5pdGlvbj4gYWN0aW9uczsKLSAgICBwcml2YXRlIGZpbmFsIEluZGV4ZWRTZXQ8U3RyaW5nLElDYXRlZ29yeT4gY2F0ZWdvcmllczsKLSAgICBwcml2YXRlIGZpbmFsIEluZGV4ZWRTZXQ8U3RyaW5nLElQcmVzZXQ+IHByZXNldHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHByZXNldHNJbml0aWFsaXplZCA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgSW5kZXhlZFNldDxTdHJpbmcsSUdyb3VwPiBncm91cHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLEZhY2V0ZWRQcm9qZWN0PiBwcm9qZWN0czsKLSAgICBwcml2YXRlIGZpbmFsIFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5IHByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5OwotICAgIHByaXZhdGUgZmluYWwgRnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeSBmcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5OwotICAgIAotICAgIHByaXZhdGUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgYWN0aXZhdGlvblN0YXJ0ID0gMDsKLSAgICAgICAgCi0gICAgICAgIGlmKCBGYWNldENvcmVQbHVnaW4uaXNUcmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoIHN3ICk7Ci0gICAgICAgICAgICAoIG5ldyBUaHJvd2FibGUoKSApLnByaW50U3RhY2tUcmFjZSggcHcgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotICAgICAgICAgICAgZmluYWwgaW50IGVuZE9mRmlyc3RMaW5lID0gY29udGV4dC5pbmRleE9mKCAnXG4nICk7Ci0gICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5zdWJzdHJpbmcoIGVuZE9mRmlyc3RMaW5lICsgMSApOwotICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZUFsbCggIlxcdCIsICIgICIgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBjb250ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY29udGV4dC5jaGFyQXQoIGxlbmd0aCAtIDIgKSA9PSAnXHInICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggLSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnN1YnN0cmluZyggMCwgbGVuZ3RoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLnRyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uU3RhcnRpbmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgKTsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggbXNnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFjdGl2YXRpb25TdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZhY2V0cyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICB0aGlzLmFjdGlvbnMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSUFjdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJQ2F0ZWdvcnk+KCk7Ci0gICAgICAgIHRoaXMucHJlc2V0cyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJUHJlc2V0PigpOwotICAgICAgICB0aGlzLnByZXNldHNJbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICB0aGlzLmdyb3VwcyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJR3JvdXA+KCk7Ci0gICAgICAgIHRoaXMucHJvamVjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRmFjZXRlZFByb2plY3Q+KCk7Ci0gICAgICAgIHRoaXMucHJvamVjdExpc3RlbmVyUmVnaXN0cnkgPSBuZXcgUHJvamVjdExpc3RlbmVyUmVnaXN0cnkoKTsKLSAgICAgICAgdGhpcy5mcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5ID0gbmV3IEZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkoKTsKLSAgICAgICAgCi0gICAgICAgIHJlYWRNZXRhZGF0YSgpOwotICAgICAgICAKLSAgICAgICAgRXZlbnRzRXh0ZW5zaW9uUG9pbnQucHJvY2Vzc0V4dGVuc2lvbnMoIHRoaXMgKTsKLSAgICAgICAgCi0gICAgICAgICggbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSApLnJlZ2lzdGVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggRmFjZXRDb3JlUGx1Z2luLmlzVHJhY2luZ0ZyYW1ld29ya0FjdGl2YXRpb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gCi0gICAgICAgICAgICAgICAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGFjdGl2YXRpb25TdGFydDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy50cmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvbkZpbmlzaGVkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZiggZHVyYXRpb24gKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIG1zZyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbCBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICBpZiggaW5zdGFuY2UgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldD4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5jb250YWluc0tleSggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gdGhpcy5mYWNldHMuZ2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0Tm90RGVmaW5lZCwgaWQgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJQWN0aW9uRGVmaW5pdGlvbj4gZ2V0QWN0aW9uRGVmaW5pdGlvbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25EZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5jb250YWluc0tleSggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBmaW5hbCBJQWN0aW9uRGVmaW5pdGlvbiBhZGVmID0gdGhpcy5hY3Rpb25zLmdldCggaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBhZGVmID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5hY3Rpb25Ob3REZWZpbmVkLCBpZCApOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbXNnICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBhZGVmOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElDYXRlZ29yeT4gZ2V0Q2F0ZWdvcmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzLmdldFVubW9kaWZpYWJsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2F0ZWdvcnlEZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllcy5jb250YWluc0tleSggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDYXRlZ29yeSBnZXRDYXRlZ29yeSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElDYXRlZ29yeSBjYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcmllcy5nZXQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggY2F0ZWdvcnkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmNhdGVnb3J5Tm90RGVmaW5lZCwgaWQgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY2F0ZWdvcnk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByZXNldD4gZ2V0UHJlc2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMucHJlc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVQcmVzZXRzKCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVzZXRzLmdldFVubW9kaWZpYWJsZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2V0RGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5wcmVzZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZVByZXNldHMoKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXNldHMuY29udGFpbnNLZXkoIGlkICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcmVzZXQgZ2V0UHJlc2V0KCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLnByZXNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplUHJlc2V0cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IHRoaXMucHJlc2V0cy5nZXQoIGlkICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBwcmVzZXQgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucHJlc2V0Tm90RGVmaW5lZCwgaWQgKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHByZXNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByZXNldCBkZWZpbmVQcmVzZXQoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlZmluZVByZXNldCggbmFtZSwgbnVsbCwgZmFjZXRzICk7Ci0gICAgfQotCi0gICAgcHVibGljIElQcmVzZXQgZGVmaW5lUHJlc2V0KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgaW5pdGlhbGl6ZVByZXNldHMoKTsKLSAgICAgICAKLSAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IGRlZmluZVByZXNldCggbmFtZSwgZGVzY3JpcHRpb24sIGZhY2V0cywgdHJ1ZSApOwotCi0gICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQgZXZlbnQgCi0gICAgICAgICAgID0gbmV3IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQoIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuUFJFU0VUX0FEREVEICk7Ci0gICAgICAgCi0gICAgICAgdGhpcy5mcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5Lm5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICAgICAKLSAgICAgICByZXR1cm4gcHJlc2V0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQcmVzZXQgZGVmaW5lUHJlc2V0KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzYXZlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5wcmVzZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGlkOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkID0gIi51c3IuIiArIGk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSggdGhpcy5wcmVzZXRzLmNvbnRhaW5zS2V5KCBpZCApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFVzZXJQcmVzZXQgcHJlc2V0IAotICAgICAgICAgICAgICAgID0gbmV3IFVzZXJQcmVzZXQoIGlkLCBuYW1lLCBkZXNjcmlwdGlvbiA9PSBudWxsID8gIiIgOiBkZXNjcmlwdGlvbiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNldHMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5wcmVzZXRzLmFkZCggaWQsIHByZXNldCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc2F2ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2F2ZVVzZXJQcmVzZXRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBwcmVzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUHJlc2V0KCBmaW5hbCBJUHJlc2V0IHByZXNldCApCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGV0ZWQ7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMucHJlc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVQcmVzZXRzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBwcmVzZXQuZ2V0VHlwZSgpICE9IElQcmVzZXQuVHlwZS5VU0VSX0RFRklORUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGVsZXRlZCA9IHRoaXMucHJlc2V0cy5kZWxldGUoIHByZXNldC5nZXRJZCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBkZWxldGVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYXZlVXNlclByZXNldHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBkZWxldGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQgZXZlbnQgCi0gICAgICAgICAgICAgICAgPSBuZXcgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudCggSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZS5QUkVTRVRfUkVNT1ZFRCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkubm90aWZ5TGlzdGVuZXJzKCBldmVudCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGVsZXRlZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5wcmVzZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgdGhpcy5wcmVzZXRzSW5pdGlhbGl6ZWQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggSVByZXNldCBwcmVzZXQgOiBQcmVzZXRzRXh0ZW5zaW9uUG9pbnQuZ2V0UHJlc2V0cygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlc2V0cy5hZGQoIHByZXNldC5nZXRJZCgpLCBwcmVzZXQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVhZFVzZXJQcmVzZXRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhpcy5wcmVzZXRzSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzYXZlVXNlclByZXNldHMoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIHJvb3QgPSBnZXRVc2VyUHJlc2V0c1ByZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNoaWxkcmVuID0gcm9vdC5jaGlsZHJlbk5hbWVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJvb3Qubm9kZSggY2hpbGRyZW5bIGkgXSApLnJlbW92ZU5vZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJlc2V0IHByZXNldCA6IHRoaXMucHJlc2V0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHByZXNldC5nZXRUeXBlKCkgPT0gSVByZXNldC5UeXBlLlVTRVJfREVGSU5FRCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyBwbm9kZSA9IHJvb3Qubm9kZSggcHJlc2V0LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcG5vZGUucHV0KCBFTF9MQUJFTCwgcHJlc2V0LmdldExhYmVsKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcG5vZGUucHV0KCBFTF9ERVNDUklQVElPTiwgcHJlc2V0LmdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBwcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZXMgZm5vZGUgPSBwbm9kZS5ub2RlKCBTdHJpbmcudmFsdWVPZiggY291bnRlciApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZub2RlLnB1dCggQVRUUl9JRCwgZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgZm5vZGUucHV0KCBBVFRSX1ZFUlNJT04sIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgICAgcm9vdC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBCYWNraW5nU3RvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVhZFVzZXJQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyByb290ID0gZ2V0VXNlclByZXNldHNQcmVmZXJlbmNlcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcGtleXMgPSByb290LmNoaWxkcmVuTmFtZXMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwa2V5cy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZXMgcG5vZGUgPSByb290Lm5vZGUoIHBrZXlzWyBpIF0gKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBwbm9kZS5nZXQoIEVMX0xBQkVMLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGxhYmVsID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcG5vZGUuZ2V0KCBFTF9ERVNDUklQVElPTiwgbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZXNjcmlwdGlvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZmtleXMgPSBwbm9kZS5jaGlsZHJlbk5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IGZrZXlzLmxlbmd0aDsgaisrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIGZub2RlID0gcG5vZGUubm9kZSggZmtleXNbIGogXSApOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBmbm9kZS5nZXQoIEFUVFJfSUQsIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24gPSBmbm9kZS5nZXQoIEFUVFJfVkVSU0lPTiwgbnVsbCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGlkID09IG51bGwgfHwgdmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBpZCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZi5oYXNWZXJzaW9uKCB2ZXJzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cy5hZGQoIGYuZ2V0VmVyc2lvbiggdmVyc2lvbiApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBmYWNldHMgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWZpbmVQcmVzZXQoIGxhYmVsLCBkZXNjcmlwdGlvbiwgZmFjZXRzLCBmYWxzZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0VXNlclByZXNldHNQcmVmZXJlbmNlcygpCi0gICAgewotICAgICAgICBmaW5hbCBJbnN0YW5jZVNjb3BlIHNjb3BlID0gbmV3IEluc3RhbmNlU2NvcGUoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElFY2xpcHNlUHJlZmVyZW5jZXMgcGx1Z2luUm9vdCAKLSAgICAgICAgICAgID0gc2NvcGUuZ2V0Tm9kZSggRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHBsdWdpblJvb3Qubm9kZSggInVzZXIucHJlc2V0cyIgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElGYWNldGVkUHJvamVjdFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQuZ2V0VGVtcGxhdGVzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzVGVtcGxhdGVEZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICggRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5nZXRUZW1wbGF0ZSggaWQgKSAhPSBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlIAotICAgICAgICAgICAgPSBGYWNldGVkUHJvamVjdFRlbXBsYXRlc0V4dGVuc2lvblBvaW50LmdldFRlbXBsYXRlKCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHRlbXBsYXRlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy50ZW1wbGF0ZU5vdERlZmluZWQsIGlkICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElHcm91cD4gZ2V0R3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNHcm91cERlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5ncm91cHMuY29udGFpbnNLZXkoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJR3JvdXAgZ2V0R3JvdXAoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBmaW5hbCBJR3JvdXAgZ3JvdXAgPSB0aGlzLmdyb3Vwcy5nZXQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZ3JvdXAgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmdyb3VwTm90RGVmaW5lZCwgaWQgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZ3JvdXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBnZXRGYWNldGVkUHJvamVjdHMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRGYWNldGVkUHJvamVjdHMoIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElGYWNldGVkUHJvamVjdD4gZ2V0RmFjZXRlZFByb2plY3RzKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRGYWNldGVkUHJvamVjdHMoIGYsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElGYWNldGVkUHJvamVjdD4gZ2V0RmFjZXRlZFByb2plY3RzKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0cyggbnVsbCwgZnYgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEZhY2V0ZWRQcm9qZWN0cyggZmluYWwgSVByb2plY3RGYWNldCBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3RbXSBhbGwgCi0gICAgICAgICAgICA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJRmFjZXRlZFByb2plY3Q+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElGYWNldGVkUHJvamVjdD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IGFsbFsgaSBdOwotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gY3JlYXRlKCBwcm9qICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmcHJvaiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmICE9IG51bGwgJiYgISBmcHJvai5oYXNQcm9qZWN0RmFjZXQoIGYgKSApIHx8Ci0gICAgICAgICAgICAgICAgICAgICggZnYgIT0gbnVsbCAmJiAhIGZwcm9qLmhhc1Byb2plY3RGYWNldCggZnYgKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBmcHJvaiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGNyZWF0ZU5ld1Byb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdCBjcmVhdGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmCi0gICAgICAgICAgICBwcm9qZWN0LmlzTmF0dXJlRW5hYmxlZCggRmFjZXRlZFByb2plY3ROYXR1cmUuTkFUVVJFX0lEICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldGVkUHJvamVjdCBmcHJvaiA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5wcm9qZWN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByb2ogPSB0aGlzLnByb2plY3RzLmdldCggcHJvamVjdC5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZnByb2ogPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcHJvaiA9IG5ldyBGYWNldGVkUHJvamVjdCggcHJvamVjdCApOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RzLnB1dCggcHJvamVjdC5nZXROYW1lKCksIGZwcm9qICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJvai5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmcHJvajsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNvbnZlcnRJZk5lY2Vzc2FyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYKLSAgICAgICAgICAgICAgICAhIHByb2plY3QuaXNOYXR1cmVFbmFibGVkKCBGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQgKSAmJiAKLSAgICAgICAgICAgICAgICBjb252ZXJ0SWZOZWNlc3NhcnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1sgcHJldk5hdHVyZXMubGVuZ3RoICsgMSBdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGggKTsKLSAgICAgICAgICAgICAgICBuZXdOYXR1cmVzWyBwcmV2TmF0dXJlcy5sZW5ndGggXSA9IEZhY2V0ZWRQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRDsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoIG5ld05hdHVyZXMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUVkaXQoIHByb2plY3QuZ2V0RmlsZSggRklMRV9ET1RfUFJPSkVDVCApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbiggZGVzY3JpcHRpb24sIHN1Ym1vbiggbW9uaXRvciwgMSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGUoIHByb2plY3QgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlKCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYwotICAgICAgICAgICAgICAgID0gd3MubmV3UHJvamVjdERlc2NyaXB0aW9uKCBuYW1lICk7Ci0gICAgCi0gICAgICAgICAgICBkZXNjLnNldExvY2F0aW9uKCBsb2NhdGlvbiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBzdWJtb24oIG1vbml0b3IsIDEgKSApOwotICAgICAgICAgICAgcHJvamVjdC5vcGVuKCBzdWJtb24oIG1vbml0b3IsIDEgKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGlzIGlzIG9kZCwgYnV0IGFwcGFyZW50bHkgbmF0dXJlJ3MgY29uZmlndXJlKCkgbWV0aG9kIHdpbGwgb25seQotICAgICAgICAgICAgLy8gYmUgY2FsbGVkIGlmIHRoZSBzZXREZXNjcmlwdGlvbigpIG1ldGhvZCBpcyB1c2VkLiBJdCB3aWxsIG5vdCBiZQotICAgICAgICAgICAgLy8gY2FsbGVkIGlmIG5hdHVyZSBpcyBhZGRlZCB0byB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbiBwcmlvciB0bwotICAgICAgICAgICAgLy8gY2FsbGluZyBJUHJvamVjdC5jcmVhdGUoKSBtZXRob2QuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlc2Muc2V0TmF0dXJlSWRzKCBuZXcgU3RyaW5nW10geyBGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQgfSApOwotICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbiggZGVzYywgbnVsbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TGlzdGVuZXJSZWdpc3RyeS5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICB0aGlzLmZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TGlzdGVuZXJSZWdpc3RyeS5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeS5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgUHJvamVjdExpc3RlbmVyUmVnaXN0cnkgZ2V0UHJvamVjdExpc3RlbmVyUmVnaXN0cnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdExpc3RlbmVyUmVnaXN0cnk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIGNoZWNrKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxBY3Rpb24+IGFjdGlvbnMgKQotICAgIHsKLSAgICAgICAgTXVsdGlTdGF0dXMgcmVzdWx0ID0gQ29uc3RyYWludC5jcmVhdGVNdWx0aVN0YXR1cygpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgIAotICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5zdXBwb3J0cyggYmFzZSwgYWN0aW9uLmdldFR5cGUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHB0eXBlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLklOU1RBTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHR5cGUgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLklOU1RBTExfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggYWN0aW9uLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHR5cGUgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLlVOSU5TVEFMTF9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB0eXBlID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5WRVJTSU9OX0NIQU5HRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSB2cAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBWYWxpZGF0aW9uUHJvYmxlbSggcHR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIHZwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE11bHRpcGxlIGFjdGlvbnMgb24gdGhlIHNhbWUgZmFjZXQgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHNhbWUKLSAgICAgICAgLy8gYmF0Y2guIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBhbiB1bmluc3RhbGwgb2YgYSBwcmV2aW9zbHktaW5zdGFsbGVkCi0gICAgICAgIC8vIHZlcnNpb24gZm9sbG93ZWQgYnkgYW4gaW5zdGFsbCBvZiBhIG5ldyB2ZXJzaW9uLgotICAgICAgICAKLSAgICAgICAgZmluYWwgTWFwPElQcm9qZWN0RmFjZXQsU2V0PEFjdGlvbj4+IGZhY2V0VG9BY3Rpb25zTWFwIAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdEZhY2V0LFNldDxBY3Rpb24+PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICBTZXQ8QWN0aW9uPiBncm91cCA9IGZhY2V0VG9BY3Rpb25zTWFwLmdldCggZiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZ3JvdXAgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ3JvdXAgPSBuZXcgSGFzaFNldDxBY3Rpb24+KCk7Ci0gICAgICAgICAgICAgICAgZmFjZXRUb0FjdGlvbnNNYXAucHV0KCBmLCBncm91cCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBncm91cC5hZGQoIGFjdGlvbiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNldDxBY3Rpb24+IGdyb3VwIDogZmFjZXRUb0FjdGlvbnNNYXAudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZ3JvdXAuc2l6ZSgpID4gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBiYWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBncm91cC5zaXplKCkgPT0gMiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBY3Rpb24gaW5zdGFsbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIEFjdGlvbiB1bmluc3RhbGwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogZ3JvdXAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggYWN0aW9uLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsID0gYWN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggYWN0aW9uLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW5zdGFsbCA9IGFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGluc3RhbGwgIT0gbnVsbCAmJiB1bmluc3RhbGwgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBiYXNlLmNvbnRhaW5zKCB1bmluc3RhbGwuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBiYWQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvblByb2JsZW0uVHlwZSBwdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5NVUxUSVBMRV9BQ1RJT05TX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHB0eXBlICkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGF0dGVtcHRzIHRvIHVuaW5zdGFsbCBvciBjaGFuZ2UgdmVyc2lvbiBvZiBmYWNldHMgdGhhdAotICAgICAgICAvLyBoYXZlbid0IGJlZW4gaW5zdGFsbGVkLiBBbHNvIGNoZWNrIGZvciBhdHRlbXB0cyB0byBpbnN0YWxsIGEgZmFjZXQKLSAgICAgICAgLy8gdGhhdCdzIGFscmVhZHkgaW5zdGFsbGVkLgotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotCi0gICAgICAgICAgICBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHB0eXBlID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGFjdGlvbi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBiYXNlLmNvbnRhaW5zKCBmdiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB0eXBlID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5DQU5OT1RfVU5JTlNUQUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBleGlzdGluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiB0ZW1wIDogYmFzZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdGVtcC5nZXRQcm9qZWN0RmFjZXQoKSA9PSBmICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGFjdGlvbi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UgJiYgZXhpc3RpbmcgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdHlwZSA9IFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUuQ0FOTk9UX0NIQU5HRV9WRVJTSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLklOU1RBTEwgJiYgZXhpc3RpbmcgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdHlwZSA9IFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUuRkFDRVRfQUxSRUFEWV9JTlNUQUxMRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHR5cGUgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCBwdHlwZSwgZi5nZXRMYWJlbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0VmVyc2lvblN0cmluZygpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWJvcnQgYXQgdGhpcyBwb2ludCBpZiB0aGVyZSBhcmUgYW55IHZhbGlkYXRpb24gcHJvYmxlbXMuCi0gICAgICAgIAotICAgICAgICBpZiggISByZXN1bHQuaXNPSygpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQXBwbHkgYWxsIHRoZSB1bmluc3RhbGwgYWN0aW9ucy4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYWxsID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBiYXNlICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGFjdGlvbi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcHBseSggYWxsLCBhY3Rpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQXBwbHkgYWxsIHRoZSBpbnN0YWxsIGFuZCB2ZXJzaW9uIGNoYW5nZSBhY3Rpb25zLgotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhY3Rpb24uZ2V0VHlwZSgpICE9IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbHkoIGFsbCwgYWN0aW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRoZSBjb25zdHJhaW5zIG9uIGFsbCBvZiB0aGUgZmFjZXRzLgotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGFsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50IGNvbnN0cmFpbnQgPSBmdi5nZXRDb25zdHJhaW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjb25zdHJhaW50ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBjb25zdHJhaW50LmNoZWNrKCBhbGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBzdC5pc09LKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCggc3QgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEVsaW1pbmF0ZSBzeW1tZXRyaWMgY29uZmxpY3RzIHByb2JsZW0gZW50cmllcy4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJU3RhdHVzPiBwcm9ibGVtcyA9IG5ldyBIYXNoU2V0PElTdGF0dXM+KCk7Ci0gICAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHJlc3VsdC5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJU3RhdHVzIGNoaWxkIDogY2hpbGRyZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9ibGVtcy5hZGQoIGNoaWxkICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJU3RhdHVzPiB0b3JlbW92ZSA9IG5ldyBIYXNoU2V0PElTdGF0dXM+KCk7Ci0KLSAgICAgICAgZm9yKCBJU3RhdHVzIHByb2JsZW0gOiBwcm9ibGVtcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIHRvcmVtb3ZlLmNvbnRhaW5zKCBwcm9ibGVtICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Qcm9ibGVtIHZhbHByb2IgPSAoVmFsaWRhdGlvblByb2JsZW0pIHByb2JsZW07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHZhbHByb2IuZ2V0VHlwZSgpID09IFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUuQ09ORkxJQ1RTICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHAgPSB2YWxwcm9iLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Qcm9ibGVtIHJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLkNPTkZMSUNUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBwWyAxIF0sIHBbIDAgXSB9ICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0b3JlbW92ZS5hZGQoIHJldmVyc2UgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCB0b3JlbW92ZS5zaXplKCkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvYmxlbXMucmVtb3ZlQWxsKCB0b3JlbW92ZSApOwotICAgICAgICAgICAgY2hpbGRyZW4gPSBwcm9ibGVtcy50b0FycmF5KCBuZXcgSVN0YXR1c1sgcHJvYmxlbXMuc2l6ZSgpIF0gKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IENvbnN0cmFpbnQuY3JlYXRlTXVsdGlTdGF0dXMoIGNoaWxkcmVuICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJldHVybiB0aGUgcHJvYmxlbXMgdG8gdGhlIGNhbGxlci4KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNvcnQoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gYWN0aW9ucyApCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBhY3Rpb25zLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBjb3VudCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBCZWZvcmUgc29ydGluZywgY2hlY2sgdGhhdCB0aGUgY29uc3RyYWludHMgY2FuIGJlIG1ldC4gT3RoZXJ3aXNlCi0gICAgICAgIC8vIHRoZSBzb3J0IGFsZ29yaXRobSB3aWxsIG5vdCB0ZXJtaW5hdGUuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gY2hlY2soIGJhc2UsIG5ldyBIYXNoU2V0PEFjdGlvbj4oIGFjdGlvbnMgKSApOwotICAgICAgICAKLSAgICAgICAgaWYoICEgc3QuaXNPSygpICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggc3QgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFjaW5nLgotICAgICAgICAKLSAgICAgICAgTGlzdDxBY3Rpb24+IHVuc29ydGVkID0gbnVsbDsKLSAgICAgICAgaW50IHN0ZXBzID0gMDsKLSAgICAgICAgCi0gICAgICAgIGlmKCBGYWNldENvcmVQbHVnaW4uaXNUcmFjaW5nQWN0aW9uU29ydGluZygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oIGFjdGlvbnMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU3RlcCAxIDogUHJlLXNvcnQgYWxsIHVuaW5zdGFsbCBhY3Rpb25zIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gCi0gICAgICAgIC8vICAgICAgICAgIFdpdGhpbiB0aGF0IG9yZGVyLCBzb3J0IGFjdGlvbnMgYmFzZWQgb24gZmFjZXQgaWQuIFRoZQotICAgICAgICAvLyAgICAgICAgICBzZWNvbmRhcnkgc29ydCBhc3N1cmVzIGEgc3RhYmxlIHNvcnQgb3JkZXIgYW1vbmcgYWN0aW9ucyBvbgotICAgICAgICAvLyAgICAgICAgICB1bnJlbGF0ZWQgZmFjZXRzLgotICAgICAgICAKLSAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxBY3Rpb24+IGNvbXAgPSBuZXcgQ29tcGFyYXRvcjxBY3Rpb24+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKCBmaW5hbCBBY3Rpb24gYTEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24gYTIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCByZXMgPSBjb21wYXJlKCBhMS5nZXRUeXBlKCksIGEyLmdldFR5cGUoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCByZXMgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlkMSAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gYTEuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlkMiAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gYTIuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXMgPSBmaWQxLmNvbXBhcmVUbyggZmlkMiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcml2YXRlIGludCBjb21wYXJlKCBmaW5hbCBBY3Rpb24uVHlwZSB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHQyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdDEgPT0gdDIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHQxID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHQyID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCggYWN0aW9ucywgY29tcCApOwotICAgICAgICAKLSAgICAgICAgLy8gU3RlcCAyIDogU29ydCBiYXNlZCBvbiB0aGUgY29uc3RyYWludHMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZubCA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggYmFzZSApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGx5KCBmbmwsIGFjdGlvbiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIG1ha2VBbm90aGVyUGFzcyA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSggbWFrZUFub3RoZXJQYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgbWFrZUFub3RoZXJQYXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gc3RhdGUgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oIGJhc2UgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBhY3Rpb25zLmdldCggaSApOwotICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgPSBhY3Rpb24uZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludCBjb25zdHJhaW50ID0gZnYuZ2V0Q29uc3RyYWludCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggISBjb25zdHJhaW50LmNoZWNrKCBzdGF0ZSwgdHJ1ZSApLmlzT0soKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludC5jaGVjayggYmFzZSwgdHJ1ZSApLmlzT0soKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVUb0Zyb250KCBhY3Rpb25zLCBpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlQW5vdGhlclBhc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkoIHN0YXRlLCBhY3Rpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggY29uc3RyYWludC5jaGVjayggc3RhdGUgKS5pc09LKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICEgKCAhIGNvbnN0cmFpbnQuY2hlY2soIHN0YXRlLCB0cnVlICkuaXNPSygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludC5jaGVjayggZm5sLCB0cnVlICkuaXNPSygpICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseSggc3RhdGUsIGFjdGlvbiApOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVRvRW5kKCBhY3Rpb25zLCBpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGVwcysrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBPdXRwdXQgdHJhY2luZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgCi0gICAgICAgIGlmKCBGYWNldENvcmVQbHVnaW4uaXNUcmFjaW5nQWN0aW9uU29ydGluZygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQKLSAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMudHJhY2luZ0FjdGlvblNvcnRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoIGJhc2UgKSwgdG9TdHJpbmcoIHVuc29ydGVkICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoIGFjdGlvbnMgKSwgU3RyaW5nLnZhbHVlT2YoIHN0ZXBzICkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB0ZXh0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgYXBwbHkoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgPSBhY3Rpb24uZ2V0VHlwZSgpOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0cy5yZW1vdmUoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24geCA6IGZhY2V0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHguZ2V0UHJvamVjdEZhY2V0KCkgPT0gZnYuZ2V0UHJvamVjdEZhY2V0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjZXRzLnJlbW92ZSggeCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydE1pc3NpbmdGYWNldCggZmluYWwgU3RyaW5nIGZpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggZmFjZXRzUmVwb3J0ZWRNaXNzaW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgZmFjZXRzUmVwb3J0ZWRNaXNzaW5nLmNvbnRhaW5zKCBmaWQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFjZXROb3REZWZpbmVkLCBmaWQgKSArCi0gICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIHBsdWdpbiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZhY2V0c1JlcG9ydGVkTWlzc2luZy5hZGQoIGZpZCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydE1pc3NpbmdGYWNldCggZmluYWwgU3RyaW5nIGZpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGZhY2V0c1JlcG9ydGVkTWlzc2luZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIGZhY2V0c1JlcG9ydGVkTWlzc2luZy5jb250YWlucyggZmlkICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0Tm90RGVmaW5lZCwgZmlkICkgKwotICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluQ29uc3RyYWludCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZhY2V0c1JlcG9ydGVkTWlzc2luZy5hZGQoIGZpZCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRNaXNzaW5nUnVudGltZUNvbXBvbmVudFR5cGUoIGZpbmFsIFN0cmluZyByY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkLCByY3QgKSArCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBwbHVnaW4gKTsKLSAgICAgICAgCi0gICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbiggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGlja3MgKQotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIG1vbml0b3IsIHRpY2tzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb3ZlVG9Gcm9udCggZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBhY3Rpb25zLmdldCggaW5kZXggKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSBpbmRleDsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFjdGlvbnMuc2V0KCBpLCBhY3Rpb25zLmdldCggaSAtIDEgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhY3Rpb25zLnNldCggMCwgYWN0aW9uICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbW92ZVRvRW5kKCBmaW5hbCBMaXN0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBhY3Rpb25zLmdldCggaW5kZXggKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSBpbmRleCArIDEsIG4gPSBhY3Rpb25zLnNpemUoKTsgaSA8IG47IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFjdGlvbnMuc2V0KCBpIC0gMSwgYWN0aW9ucy5nZXQoIGkgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhY3Rpb25zLnNldCggYWN0aW9ucy5zaXplKCkgLSAxLCBhY3Rpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRNZXRhZGF0YSgpCi0gICAgewotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvblBvaW50IHBvaW50IAotICAgICAgICAgICAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCggRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRFTlNJT05fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwb2ludCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJFeHRlbnNpb24gcG9pbnQgbm90IGZvdW5kISIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gY2ZnZWxzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElFeHRlbnNpb24gZXh0ZW5zaW9uIDogcG9pbnQuZ2V0RXh0ZW5zaW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZnZWwgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNmZ2Vscy5hZGQoIGNmZ2VsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfQ0FURUdPUlkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkQ2F0ZWdvcnkoIGNvbmZpZyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCBpbiB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9QUk9KRUNUX0ZBQ0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZFByb2plY3RGYWNldCggY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBiZWVuIHJlcG9ydGVkIGluIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBNYXA8UHJvamVjdEZhY2V0VmVyc2lvbixJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGZ2VG9Db25zdHJhaW50IAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxQcm9qZWN0RmFjZXRWZXJzaW9uLElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIE1hcDxQcm9qZWN0RmFjZXRWZXJzaW9uLExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4gZnZUb0FjdGlvbnMgCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFByb2plY3RGYWNldFZlcnNpb24sTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9QUk9KRUNUX0ZBQ0VUX1ZFUlNJT04gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZFByb2plY3RGYWNldFZlcnNpb24oIGNvbmZpZywgZnZUb0NvbnN0cmFpbnQsIGZ2VG9BY3Rpb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNhbGN1bGF0ZVZlcnNpb25Db21wYXJpc29uVGFibGVzKCBmdlRvQ29uc3RyYWludCwgZnZUb0FjdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggTWFwLkVudHJ5PFByb2plY3RGYWNldFZlcnNpb24sSUNvbmZpZ3VyYXRpb25FbGVtZW50PiB4IDogZnZUb0NvbnN0cmFpbnQuZW50cnlTZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRDb25zdHJhaW50KCB4LmdldFZhbHVlKCksIHguZ2V0S2V5KCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBNYXAuRW50cnk8UHJvamVjdEZhY2V0VmVyc2lvbixMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IHggOiBmdlRvQWN0aW9ucy5lbnRyeVNldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IHguZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gYWN0aW9ucyA9IHguZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogYWN0aW9ucyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEFjdGlvbiggY29uZmlnLCAoUHJvamVjdEZhY2V0KSBmdi5nZXRQcm9qZWN0RmFjZXQoKSwgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX0FDVElPTiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkQWN0aW9uKCBjb25maWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9FVkVOVF9IQU5ETEVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFdmVudEhhbmRsZXIoIGNvbmZpZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX1BST0pFQ1RfRkFDRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZERlZmF1bHRWZXJzaW9uSW5mbyggY29uZmlnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfR1JPVVAgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkR3JvdXAoIGNvbmZpZyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCBpbiB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVhZENhdGVnb3J5KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBDYXRlZ29yeSBjYXRlZ29yeSA9IG5ldyBDYXRlZ29yeSgpOwotICAgICAgICBjYXRlZ29yeS5zZXRJZCggZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKSApOwotICAgICAgICBjYXRlZ29yeS5zZXRQbHVnaW5JZCggY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsTGFiZWwgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX0xBQkVMICk7Ci0gICAgICAgIGNhdGVnb3J5LnNldExhYmVsKCBnZXRFbGVtZW50VmFsdWUoIGVsTGFiZWwsIGNhdGVnb3J5LmdldElkKCkgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsRGVzYyA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfREVTQ1JJUFRJT04gKTsKLSAgICAgICAgY2F0ZWdvcnkuc2V0RGVzY3JpcHRpb24oIGdldEVsZW1lbnRWYWx1ZSggZWxEZXNjLCBERUZBVUxUX0RFU0NSSVBUSU9OICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY2F0ZWdvcmllcy5hZGQoIGNhdGVnb3J5LmdldElkKCksIGNhdGVnb3J5ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkUHJvamVjdEZhY2V0KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXQgZiA9IG5ldyBQcm9qZWN0RmFjZXQoKTsKLSAgICAgICAgZi5zZXRJZCggZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKSApOwotICAgICAgICBmLnNldFBsdWdpbklkKCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbExhYmVsID0gZmluZE9wdGlvbmFsRWxlbWVudCggY29uZmlnLCBFTF9MQUJFTCApOwotICAgICAgICBmLnNldExhYmVsKCBnZXRFbGVtZW50VmFsdWUoIGVsTGFiZWwsIGYuZ2V0SWQoKSApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxEZXNjID0gZmluZE9wdGlvbmFsRWxlbWVudCggY29uZmlnLCBFTF9ERVNDUklQVElPTiApOwotICAgICAgICBmLnNldERlc2NyaXB0aW9uKCBnZXRFbGVtZW50VmFsdWUoIGVsRGVzYywgREVGQVVMVF9ERVNDUklQVElPTiApICk7Ci0KLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsQ29tcCA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfVkVSU0lPTl9DT01QQVJBVE9SICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZWxDb21wICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmLnNldFZlcnNpb25Db21wYXJhdG9yKCBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGVsQ29tcCwgQVRUUl9DTEFTUyApICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9QUk9QRVJUWSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9OQU1FICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYoIG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9OQU1FICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkFMVUUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdmFsdWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9WQUxVRSApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT2JqZWN0IHBhcnNlZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG5hbWUuZXF1YWxzKCBJUHJvamVjdEZhY2V0LlBST1BfSElERV9WRVJTSU9OICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBCb29sZWFuLnBhcnNlQm9vbGVhbiggdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmLnNldFByb3BlcnR5KCBuYW1lLCBwYXJzZWRWYWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgY2F0bmFtZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxNZW1iZXIgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX01FTUJFUiApOwotICAgICAgICAKLSAgICAgICAgaWYoIGVsTWVtYmVyICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXRuYW1lID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBlbE1lbWJlciwgQVRUUl9DQVRFR09SWSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyAjIyBERVBSRUNBVEVEIDogMi4wICMjCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbENhdGVnb3J5ID0gZmluZE9wdGlvbmFsRWxlbWVudCggY29uZmlnLCBFTF9DQVRFR09SWSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZWxDYXRlZ29yeSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXRuYW1lID0gZ2V0RWxlbWVudFZhbHVlKCBlbENhdGVnb3J5LCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBjYXRuYW1lICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaXNDYXRlZ29yeURlZmluZWQoIGNhdG5hbWUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnkpIGdldENhdGVnb3J5KCBjYXRuYW1lICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZi5zZXRDYXRlZ29yeSggY2F0ZWdvcnkgKTsKLSAgICAgICAgICAgICAgICBjYXRlZ29yeS5hZGRQcm9qZWN0RmFjZXQoIGYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5jYXRlZ29yeU5vdERlZmluZWQsIGNhdG5hbWUgKSArCi0gICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGYuZ2V0SWQoKSwgZiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVhZFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8UHJvamVjdEZhY2V0VmVyc2lvbixJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGZ2VG9Db25zdHJhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFByb2plY3RGYWNldFZlcnNpb24sTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PiBmdlRvQWN0aW9ucyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgZmlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9GQUNFVCApOwotCi0gICAgICAgIGlmKCBmaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgdmVyID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0KLSAgICAgICAgaWYoIHZlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYgPSAoUHJvamVjdEZhY2V0KSB0aGlzLmZhY2V0cy5nZXQoIGZpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdGYWNldCggZmlkLCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0VmVyc2lvbiBmdgotICAgICAgICAgICAgPSBuZXcgUHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAKLSAgICAgICAgZnYuc2V0UHJvamVjdEZhY2V0KCBmICk7Ci0gICAgICAgIGZ2LnNldFZlcnNpb25TdHJpbmcoIHZlciApOwotICAgICAgICBmdi5zZXRQbHVnaW5JZCggY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICBmdlRvQWN0aW9ucy5wdXQoIGZ2LCBhY3Rpb25zICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfQ09OU1RSQUlOVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdlRvQ29uc3RyYWludC5wdXQoIGZ2LCBjaGlsZCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfR1JPVVBfTUVNQkVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBpZCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX0lEICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgR3JvdXAgZ3JvdXAgPSAoR3JvdXApIHRoaXMuZ3JvdXBzLmdldCggaWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZ3JvdXAgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBncm91cCA9IG5ldyBHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBncm91cC5zZXRJZCggaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzLmFkZCggaWQsIGdyb3VwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGdyb3VwLmFkZE1lbWJlciggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0FDVElPTiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZCggY2hpbGQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX1BST1BFUlRZICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX05BTUUgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiggbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX05BTUUgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WQUxVRSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX1ZBTFVFICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmdi5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZi5hZGRWZXJzaW9uKCBmdiApOwotCi0gICAgICAgIC8vIFRoaXMgaGFzIHRvIGhhcHBlbiBhZnRlciBmYWNldCB2ZXJzaW9uIGlzIHJlZ2lzdGVyZWQuCi0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9FVkVOVF9IQU5ETEVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFdmVudEhhbmRsZXIoIGNoaWxkLCBmLCB2ZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmUtY29tcHV0ZXMgdGhlIHRhYmxlcyB0aGF0IGRlc2NyaWJlIGhvdyB2ZXJzaW9ucyBvZiBhIGZhY2V0IGNvbXBhcmUKLSAgICAgKiB0byBlYWNoIG90aGVyLiBUaGlzIGFsbG93cyB0aGUgSVByb2plY3RGYWNldFZlcnNpb24uY29tcGFyZVRvKCkgb3BlcmF0aW9uLAotICAgICAqIHdoaWNoIGlzIGNhbGxlZCByYXRoZXIgZnJlcXVlbnRseSwgdG8gYmUgcmVkdWNlZCB0byBhIGhhc2ggdGFibGUgbG9va3VwCi0gICAgICogaW5zdGVhZCBvZiBoYXZpbmcgdG8gZG8gYSBwYXJzZSBhbmQgY29tcGFyaXNvbiBvZiB0d28gdmVyc2lvbiBzdHJpbmdzLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgdm9pZCBjYWxjdWxhdGVWZXJzaW9uQ29tcGFyaXNvblRhYmxlcyggZmluYWwgTWFwPFByb2plY3RGYWNldFZlcnNpb24sSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBmdlRvQ29uc3RyYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxQcm9qZWN0RmFjZXRWZXJzaW9uLExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4gZnZUb0FjdGlvbnMgKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJUHJvamVjdEZhY2V0PiBiYWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXAgPSBmLmdldFZlcnNpb25Db21wYXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdmVyc2lvbnMgCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oIGYuZ2V0VmVyc2lvbnMoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxJUHJvamVjdEZhY2V0VmVyc2lvbixNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4+IGNvbXBUYWJsZXMKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdEZhY2V0VmVyc2lvbixNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4+KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHZlcnNpb25zICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBUYWJsZXMucHV0KCBmdiwgbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4oKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHZlcnNpb25zLnNpemUoKTsgaSA8IG47IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBpVmVyID0gdmVyc2lvbnMuZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpVmVyU3RyID0gaVZlci5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxJUHJvamVjdEZhY2V0VmVyc2lvbixJbnRlZ2VyPiBpQ29tcFRhYmxlID0gY29tcFRhYmxlcy5nZXQoIGlWZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSBpICsgMTsgaiA8IG47IGorKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGpWZXIgPSB2ZXJzaW9ucy5nZXQoIGogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBqVmVyU3RyID0galZlci5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4gakNvbXBUYWJsZSA9IGNvbXBUYWJsZXMuZ2V0KCBqVmVyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBjb21wLmNvbXBhcmUoIGlWZXJTdHIsIGpWZXJTdHIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBUYWJsZS5wdXQoIGpWZXIsIG5ldyBJbnRlZ2VyKCByZXN1bHQgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgakNvbXBUYWJsZS5wdXQoIGlWZXIsIG5ldyBJbnRlZ2VyKCByZXN1bHQgKiAtMSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBNYXAuRW50cnk8SVByb2plY3RGYWNldFZlcnNpb24sTWFwPElQcm9qZWN0RmFjZXRWZXJzaW9uLEludGVnZXI+PiBlbnRyeQotICAgICAgICAgICAgICAgICAgICAgOiBjb21wVGFibGVzLmVudHJ5U2V0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IChQcm9qZWN0RmFjZXRWZXJzaW9uKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgZnYuc2V0Q29tcGFyaXNvblRhYmxlKCBlbnRyeS5nZXRWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZmFpbHVyZSBoZXJlIGlzIGR1ZSB0byB0aGUgcHJvYmxlbSBsb2FkaW5nIHRoZSBwcm92aWRlZAotICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gY29tcGFyYXRvciBvciBkdWUgdG8gdGhlIHByb2JsZW0gY29tcGFyaW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gc3RyaW5nLiBJbiBlaXRoZXIgY2FzZSwgd2UgbG9nIHRoZSBleGNlcHRpb24gYW5kCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0cmFjZXMgb2YgdGhpcyBmYWNldCBmcm9tIHRoZSBzeXN0ZW0gdG8ga2VlcCBhCi0gICAgICAgICAgICAgICAgLy8gZmF1bHR5IGZhY2V0IGZyb20gZHJhZ2dpbmcgZG93biB0aGUgZW50aXJlIGZyYW1ld29yay4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgYmFkRmFjZXRzLmFkZCggZiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGJhZEZhY2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjZXRzLnJlbW92ZSggZiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBDYXRlZ29yeSBjYXRlZ29yeSA9IChDYXRlZ29yeSkgZi5nZXRDYXRlZ29yeSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2F0ZWdvcnkgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnkucmVtb3ZlUHJvamVjdEZhY2V0KCBmICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmLmdldFZlcnNpb25zKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ2VG9Db25zdHJhaW50LnJlbW92ZSggZnYgKTsKLSAgICAgICAgICAgICAgICBmdlRvQWN0aW9ucy5yZW1vdmUoIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWREZWZhdWx0VmVyc2lvbkluZm8oIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotCi0gICAgICAgIGlmKCBpZCA9PSBudWxsIHx8ICEgaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBpZCApICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIGVycm9yIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXBvcnRlZCwgZG9uJ3QgbmVlZCB0byBsb2cKLSAgICAgICAgICAgIC8vIHRoaXMgYWdhaW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYgPSAoUHJvamVjdEZhY2V0KSBnZXRQcm9qZWN0RmFjZXQoIGlkICk7Ci0gICAgICAgIGJvb2xlYW4gZGVmYXVsdFZlcnNpb25TcGVjaWZpZWQgPSBmYWxzZTsKLQotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfREVGQVVMVF9WRVJTSU9OICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfUFJPVklERVIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY2xuYW1lICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyIGRlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGluc3RhbnRpYXRlKCBmLmdldFBsdWdpbklkKCksIGNsbmFtZSwgSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIuY2xhc3MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXREZWZhdWx0VmVyc2lvblByb3ZpZGVyKCBkZWZhdWx0VmVyc2lvblByb3ZpZGVyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmVyc2lvblNwZWNpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdmVyc2lvbiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGYuaGFzVmVyc2lvbiggdmVyc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnNldERlZmF1bHRWZXJzaW9uKCBmLmdldFZlcnNpb24oIHZlcnNpb24gKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWZXJzaW9uU3BlY2lmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBmLmNyZWF0ZVZlcnNpb25Ob3RGb3VuZEVyck1zZyggdmVyc2lvbiApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBkZWZhdWx0VmVyc2lvblNwZWNpZmllZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGYuc2V0RGVmYXVsdFZlcnNpb24oIGYuZ2V0TGF0ZXN0VmVyc2lvbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVhZEFjdGlvbiggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgZmlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9GQUNFVCApOwotCi0gICAgICAgIGlmKCBmaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXQgZiA9IChQcm9qZWN0RmFjZXQpIHRoaXMuZmFjZXRzLmdldCggZmlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0ZhY2V0KCBmaWQsIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdmVyID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0KLSAgICAgICAgaWYoIHZlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyID0gSVZlcnNpb25FeHByLldJTERDQVJEX1NZTUJPTDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVhZEFjdGlvbiggY29uZmlnLCBmLCB2ZXIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZEFjdGlvbiggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgQWN0aW9uRGVmaW5pdGlvbiBkZWYgPSBuZXcgQWN0aW9uRGVmaW5pdGlvbigpOwotICAgICAgICAKLSAgICAgICAgZGVmLnNldFBsdWdpbklkKCBwbHVnaW5JZCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX1RZUEUgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0eXBlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfVFlQRSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvZiBkZXByZWNhdGVkIGZ1bmN0aW9uYWxpdHkuCi0gICAgICAgIAotICAgICAgICBpZiggdHlwZS5lcXVhbHMoICJydW50aW1lLWNoYW5nZWQiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZGVwcmVjYXRlZFJ1bnRpbWVDaGFuZ2VkQWN0aW9uLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nV2FybmluZyggbXNnLCB0cnVlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlYWRFdmVudEhhbmRsZXIoIGNvbmZpZywgZiwgdmVyc2lvbiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEVuZCBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb2RlLgotICAgICAgICAKLSAgICAgICAgZGVmLnNldEFjdGlvblR5cGUoIEFjdGlvbi5UeXBlLnZhbHVlT2YoIHR5cGUgKSApOyAKLQotICAgICAgICBpZiggZGVmLmdldEFjdGlvblR5cGUoKSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5pbnZhbGlkQWN0aW9uVHlwZSwgdHlwZSApICsKLSAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGVmLnNldFZlcnNpb25FeHByKCBuZXcgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4oIGYsIHZlcnNpb24sIHBsdWdpbklkICkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0NPTkZJR19GQUNUT1JZICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY2xuYW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWYuc2V0Q29uZmlnRmFjdG9yeUNsYXNzTmFtZSggY2xuYW1lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9ERUxFR0FURSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xuYW1lID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGNsbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlZi5zZXREZWxlZ2F0ZUNsYXNzTmFtZSggY2xuYW1lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9QUk9QRVJUWSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9OQU1FICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX05BTUUgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WQUxVRSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX1ZBTFVFICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT2JqZWN0IHBhcnNlZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG5hbWUuZXF1YWxzKCBJQWN0aW9uRGVmaW5pdGlvbi5QUk9QX0ZST01fVkVSU0lPTlMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBuZXcgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4oIGYsIHZhbHVlLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWYuc2V0UHJvcGVydHkoIG5hbWUsIHBhcnNlZFZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBpZCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnVmLmFwcGVuZCggZi5nZXRJZCgpICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAnIycgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHZlcnNpb24gKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICcjJyApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggZGVmLmdldEFjdGlvblR5cGUoKS5uYW1lKCkgKTsKLQotICAgICAgICAgICAgZm9yKCBNYXAuRW50cnk8U3RyaW5nLE9iamVjdD4gZW50cnkgOiBkZWYuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICcjJyApOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGVudHJ5LmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggJz0nICk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlkID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRlZi5zZXRJZCggaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBpc0FjdGlvbkRlZmluZWQoIGlkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmFjdGlvbkFscmVhZHlEZWZpbmVkLCBpZCwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ0Vycm9yKCBtc2cgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5hZGQoIGRlZi5nZXRJZCgpLCBkZWYgKTsKLSAgICAgICAgICAgIGYuYWRkQWN0aW9uRGVmaW5pdGlvbiggZGVmICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRFdmVudEhhbmRsZXIoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfRkFDRVQgKTsKLQotICAgICAgICBpZiggZmlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfRkFDRVQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYgPSAoUHJvamVjdEZhY2V0KSB0aGlzLmZhY2V0cy5nZXQoIGZpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdGYWNldCggZmlkLCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlciA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotCi0gICAgICAgIGlmKCB2ZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlciA9IElWZXJzaW9uRXhwci5XSUxEQ0FSRF9TWU1CT0w7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlYWRFdmVudEhhbmRsZXIoIGNvbmZpZywgZiwgdmVyICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFN1cHBvcnQgZm9yIGEgZGVwcmVjYXRlZCBleHRlbnNpb24gcG9pbnQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIHZvaWQgcmVhZEV2ZW50SGFuZGxlciggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9UWVBFICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdHlwZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX1RZUEUgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSB0OwotICAgICAgICAKLSAgICAgICAgaWYoIHR5cGUuZXF1YWxzKCAicnVudGltZS1jaGFuZ2VkIiApIHx8IHR5cGUuZXF1YWxzKCAiUlVOVElNRV9DSEFOR0VEIiApKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgICAgdCA9IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ID0gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS52YWx1ZU9mKCB0eXBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCB0ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmludmFsaWRFdmVudEhhbmRsZXJUeXBlLCB0eXBlICkgKwotICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwcjsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXhwciA9IG5ldyBWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPiggZiwgdmVyc2lvbiwgcGx1Z2luSWQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgZGVsZWdhdGVDbGFzc05hbWUgPSBudWxsOwotCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9ERUxFR0FURSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xuYW1lID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGNsbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlbGVnYXRlQ2xhc3NOYW1lID0gY2xuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggZGVsZWdhdGVDbGFzc05hbWUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdFbGVtZW50KCBjb25maWcsIEVMX0RFTEVHQVRFICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExlZ2FjeUV2ZW50SGFuZGxlckFkYXB0ZXIgYWRhcHRlcgotICAgICAgICAgICAgPSBuZXcgTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlciggZiwgdmV4cHIsIHBsdWdpbklkLCBkZWxlZ2F0ZUNsYXNzTmFtZSApOwotICAgICAgICAKLSAgICAgICAgYWRkTGlzdGVuZXIoIGFkYXB0ZXIsIHQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRDb25zdHJhaW50KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBvcHMgPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZmluYWwgTGlzdDxJQ29uc3RyYWludD4gcGFyc2VkID0gbmV3IEFycmF5TGlzdDxJQ29uc3RyYWludD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgb3BzLmxlbmd0aDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgb3AgPSByZWFkQ29uc3RyYWludEhlbHBlciggb3BzWyBqIF0sIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBvcCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKCBvcCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggcGFyc2VkLnNpemUoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZnYuc2V0Q29uc3RyYWludCggcGFyc2VkLmdldCggMCApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcGFyc2VkLnNpemUoKSA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludCBhbmQgCi0gICAgICAgICAgICAgICAgPSBuZXcgQ29uc3RyYWludCggZnYsIElDb25zdHJhaW50LlR5cGUuQU5ELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQudG9BcnJheSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZ2LnNldENvbnN0cmFpbnQoIGFuZCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNvbnN0cmFpbnQgcmVhZENvbnN0cmFpbnRIZWxwZXIoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCByb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gcm9vdC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25zdHJhaW50LlR5cGUgdHlwZQotICAgICAgICAgICAgPSBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoIHJvb3QuZ2V0TmFtZSgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBPYmplY3RbXSBvcGVyYW5kczsKLSAgICAgCi0gICAgICAgIGlmKCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuQU5EIHx8Ci0gICAgICAgICAgICB0eXBlID09IElDb25zdHJhaW50LlR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIG9wZXJhbmRzID0gbmV3IElDb25zdHJhaW50WyBjaGlsZHJlbi5sZW5ndGggXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgb3BlcmFuZCAKLSAgICAgICAgICAgICAgICAgICAgPSByZWFkQ29uc3RyYWludEhlbHBlciggY2hpbGRyZW5bIGkgXSwgZnYgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggb3BlcmFuZCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBvcGVyYW5kc1sgaSBdID0gb3BlcmFuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgfHwKLSAgICAgICAgICAgICAgICAgdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnaWQgPSByb290LmdldEF0dHJpYnV0ZSggQVRUUl9HUk9VUCApOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IHJvb3QuZ2V0QXR0cmlidXRlKCBBVFRSX0ZBQ0VUICk7Ci0gICAgICAgICAgICBTdHJpbmcgdmV4cHJzdHIgPSByb290LmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb2Z0U3RyID0gcm9vdC5nZXRBdHRyaWJ1dGUoIEFUVFJfU09GVCApOwotICAgICAgICAgICAgQm9vbGVhbiBzb2Z0ID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHNvZnRTdHIgIT0gbnVsbCAmJiBzb2Z0U3RyLmVxdWFscyggQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc29mdCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGdpZCAhPSBudWxsICYmICggZmlkICE9IG51bGwgfHwgdmV4cHJzdHIgIT0gbnVsbCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgICAgPSB0eXBlID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMKLSAgICAgICAgICAgICAgICAgICAgICA/IFJlc291cmNlcy5pbnZhbGlkUmVxdWlyZXNDb25zdHJhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgOiBSZXNvdXJjZXMuaW52YWxpZENvbmZsaWN0c0NvbnN0cmFpbnQ7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCB0ZW1wbGF0ZSwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nRXJyb3IoIG1zZywgdHJ1ZSApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZ2lkICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIGlzR3JvdXBEZWZpbmVkKCBnaWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZ3JvdXBOb3REZWZpbmVkLCBnaWQgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ0Vycm9yKCBtc2csIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElHcm91cCBncm91cCA9IGdldEdyb3VwKCBnaWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzID0gbmV3IE9iamVjdFtdIHsgZ3JvdXAsIHNvZnQgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHMgPSBuZXcgT2JqZWN0W10geyBncm91cCB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpZCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBpc1Byb2plY3RGYWNldERlZmluZWQoIGZpZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdERlZmluZWQsIGZpZCApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nRXJyb3IoIG1zZywgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZ2V0UHJvamVjdEZhY2V0KCBmaWQgKTsKLQotICAgICAgICAgICAgICAgIFZlcnNpb25FeHByIHZleHByID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwcnN0ciA9PSBudWxsIHx8IHZleHByc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmV4cHJzdHIgPSBJVmVyc2lvbkV4cHIuV0lMRENBUkRfU1lNQk9MOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB2ZXhwciA9IG5ldyBWZXJzaW9uRXhwciggZiwgdmV4cHJzdHIsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcyA9IG5ldyBPYmplY3RbXSB7IGYsIHZleHByLCBzb2Z0IH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzID0gbmV3IE9iamVjdFtdIHsgZiwgdmV4cHIgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMubWlzc2luZ09uZU9mVHdvQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luSWQsIHJvb3QuZ2V0TmFtZSgpLCBBVFRSX0dST1VQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX0ZBQ0VUICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ0Vycm9yKCBtc2csIHRydWUgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50KCBmdiwgdHlwZSwgb3BlcmFuZHMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRHcm91cCggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGlzR3JvdXBEZWZpbmVkKCBpZCApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBHcm91cCBncm91cCA9IChHcm91cCkgZ2V0R3JvdXAoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxMYWJlbCA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfTEFCRUwgKTsKLSAgICAgICAgZ3JvdXAuc2V0TGFiZWwoIGdldEVsZW1lbnRWYWx1ZSggZWxMYWJlbCwgZ3JvdXAuZ2V0SWQoKSApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxEZXNjID0gZmluZE9wdGlvbmFsRWxlbWVudCggY29uZmlnLCBFTF9ERVNDUklQVElPTiApOwotICAgICAgICBncm91cC5zZXREZXNjcmlwdGlvbiggZ2V0RWxlbWVudFZhbHVlKCBlbERlc2MsIERFRkFVTFRfREVTQ1JJUFRJT04gKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIE9iamVjdD4gY29sbGVjdGlvbiApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBPYmplY3Qgb2JqIDogY29sbGVjdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBidWYubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiLCAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0RmFjZXRWZXJzaW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgb2JqOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnICcgKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBvYmoudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgd3MuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciggdGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKCBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3luY2hyb25pemVkKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwudGhpcy5wcm9qZWN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJUmVzb3VyY2VEZWx0YSBzdWJkZWx0YSA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGpuYW1lID0gc3ViZGVsdGEuZ2V0RnVsbFBhdGgoKS5zZWdtZW50KCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwudGhpcy5wcm9qZWN0cy5yZW1vdmUoIHBqbmFtZSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGZwaiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoRmFjZXRlZFByb2plY3QpIGZwaiApLm1hcmtEZWxldGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBGYWNldGVkUHJvamVjdCBmcHJvaiA6IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC50aGlzLnByb2plY3RzLnZhbHVlcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElSZXNvdXJjZURlbHRhIHN1YmRlbHRhID0gZGVsdGEuZmluZE1lbWJlciggZnByb2ouZi5nZXRGdWxsUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggc3ViZGVsdGEgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcm9qLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ09uZU9mVHdvQXR0cmlidXRlczsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldE5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0VmVyc2lvbk5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkFscmVhZHlEZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cE5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldE5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlTm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VkSW5QbHVnaW47Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZWRJbkNvbnN0cmFpbnQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRBY3Rpb25UeXBlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRXZlbnRIYW5kbGVyVHlwZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFJlcXVpcmVzQ29uc3RyYWludDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZENvbmZsaWN0c0NvbnN0cmFpbnQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcHJlY2F0ZWRSdW50aW1lQ2hhbmdlZEFjdGlvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhY2luZ0FjdGlvblNvcnRpbmc7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uU3RhcnRpbmc7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uRmluaXNoZWQ7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgfSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5NTkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLW1pc3NpbmdPbmVPZlR3b0F0dHJpYnV0ZXMgPSBFeHRlbnNpb24gZWxlbWVudCA8ezF9PiBpbiBwbHVnaW4gezB9IHJlcXVpcmVzIGVpdGhlciBhdHRyaWJ1dGUgezJ9IG9yIGF0dHJpYnV0ZSB7M30gdG8gYmUgc3BlY2lmaWVkLgotY2F0ZWdvcnlOb3REZWZpbmVkID0gQ2F0ZWdvcnkgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotZmFjZXROb3REZWZpbmVkID0gUHJvamVjdCBmYWNldCB7MH0gaGFzIG5vdCBiZWVuIGRlZmluZWQuCi1mYWNldFZlcnNpb25Ob3REZWZpbmVkID0gVmVyc2lvbiB7MX0gb2YgcHJvamVjdCBmYWNldCB7MH0gZG9lcyBub3QgZXhpc3QuCi1hY3Rpb25Ob3REZWZpbmVkID0gUHJvamVjdCBmYWNldCBhY3Rpb24gezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotYWN0aW9uQWxyZWFkeURlZmluZWQgPSBBdHRlbXB0IHRvIHJlZGVmaW5lIHByb2plY3QgZmFjZXQgYWN0aW9uICJ7MH0iIGluIHBsdWdpbiB7MX0uCi1ncm91cE5vdERlZmluZWQgPSBQcm9qZWN0IGZhY2V0IGdyb3VwIHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLXByZXNldE5vdERlZmluZWQgPSBQcmVzZXQgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotdGVtcGxhdGVOb3REZWZpbmVkID0gVGVtcGxhdGUgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotcnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkID0gUnVudGltZSBjb21wb25lbnQgdHlwZSB7MH0gaGFzIG5vdCBiZWVuIGRlZmluZWQuCi11c2VkSW5QbHVnaW4gPSBcIEl0IGlzIHVzZWQgaW4gcGx1Z2luIHswfS4KLXVzZWRJbkNvbnN0cmFpbnQgPSBcIEl0IGlzIHVzZWQgaW4gdGhlIGNvbnN0cmFpbnQgb2YgcHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0uCi1pbnZhbGlkQWN0aW9uVHlwZSA9ICJ7MH0iIGlzIGFuIGludmFsaWQgYWN0aW9uIHR5cGUuCi1pbnZhbGlkRXZlbnRIYW5kbGVyVHlwZSA9ICJ7MH0iIGlzIGFuIGludmFsaWQgZXZlbnQgaGFuZGxlciB0eXBlLgotaW52YWxpZFJlcXVpcmVzQ29uc3RyYWludCA9IFRoZSByZXF1aXJlcyBjb25zdHJhaW50IGNhbiBzcGVjaWZ5IGVpdGhlciBhICJncm91cCIgYXR0cmlidXRlIG9yIGEgImZhY2V0IiBhdHRyaWJ1dGUgYW5kIGEgInZlcnNpb24iIGF0dHJpYnV0ZS4gVGhlIHByb2JsZW0gd2FzIGZvdW5kIGluIHBsdWdpbiB7MH0uCi1pbnZhbGlkQ29uZmxpY3RzQ29uc3RyYWludCA9IFRoZSBjb25mbGljdHMgY29uc3RyYWludCBjYW4gc3BlY2lmeSBlaXRoZXIgYSAiZ3JvdXAiIGF0dHJpYnV0ZSBvciBhICJmYWNldCIgYXR0cmlidXRlIGFuZCBhICJ2ZXJzaW9uIiBhdHRyaWJ1dGUuIFRoZSBwcm9ibGVtIHdhcyBmb3VuZCBpbiBwbHVnaW4gezB9LgotCi1kZXByZWNhdGVkUnVudGltZUNoYW5nZWRBY3Rpb24gPSBcCi1UaGUgcHJvamVjdCBmYWNldCBhY3Rpb24gInJ1bnRpbWUtY2hhbmdlZCIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gSXQgaXMgdXNlZCBpbiBcCi1wbHVnaW4gezB9LiBTaW1pbGFyIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIHZpYSB0aGUgIlJVTlRJTUVfQ0hBTkdFRCIgXAotZXZlbnQgaGFuZGxlci4gU2VlIGV4dGVuc2lvbiBwb2ludCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMgXAotZm9yIG1vcmUgaW5mb3JtYXRpb24uIAotCi10cmFjaW5nQWN0aW9uU29ydGluZyA9IFwKLUZpbmlzaGVkIHNvcnRpbmcgZmFjZXRlZCBwcm9qZWN0IGFjdGlvbnMuXG5cCi1cICBiYXNlID0gezB9XG5cCi1cICB1bnNvcnRlZCA9IHsxfVxuXAotXCAgc29ydGVkID0gezJ9XG5cCi1cICBzdGVwcyA9IHszfSAKLQotdHJhY2luZ0ZyYW1ld29ya0FjdGl2YXRpb25TdGFydGluZyA9IFwKLUFjdGl2YXRpbmcgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yay4uLlxuXAotezB9Ci0KLXRyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uRmluaXNoZWQgPSBcCi1GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGFjdGl2YXRlZCBzdWNjZXNzZnVsbHkgaW4gezB9IG1zLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3ROYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0TmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNWM1ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3ROYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdE5hdHVyZQotCi0gICAgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZQotCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEIAotICAgICAgICA9IEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLm5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb21tYW5kW10gZXhpc3RpbmcgPSBkZXNjLmdldEJ1aWxkU3BlYygpOwotICAgICAgICBmaW5hbCBJQ29tbWFuZFtdIGNtZHMgPSBuZXcgSUNvbW1hbmRbIGV4aXN0aW5nLmxlbmd0aCArIDEgXTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb21tYW5kIG5ld2NtZCA9IHRoaXMucHJvamVjdC5nZXREZXNjcmlwdGlvbigpLm5ld0NvbW1hbmQoKTsKLSAgICAgICAgbmV3Y21kLnNldEJ1aWxkZXJOYW1lKCBGYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyLkJVSUxERVJfSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGNtZHNbIDAgXSA9IG5ld2NtZDsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggZXhpc3RpbmcsIDAsIGNtZHMsIDEsIGV4aXN0aW5nLmxlbmd0aCApOwotICAgICAgICAKLSAgICAgICAgZGVzYy5zZXRCdWlsZFNwZWMoIGNtZHMgKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0LnNldERlc2NyaXB0aW9uKCBkZXNjLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkge30KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1ZWU1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIKLQotICAgIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIKLSAgICAKLXsKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KCBmaW5hbCBPYmplY3QgcmVjZWl2ZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gYXJncywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISAoIHJlY2VpdmVyIGluc3RhbmNlb2YgSVJlc291cmNlICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcGogPSAoIChJUmVzb3VyY2UpIHJlY2VpdmVyICkuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcGogPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb24gPSB2YWwuaW5kZXhPZiggJzonICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWQ7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmV4cHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjb2xvbiA9PSAtMSB8fCBjb2xvbiA9PSB2YWwubGVuZ3RoKCkgLSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWQgPSB2YWw7Ci0gICAgICAgICAgICAgICAgdmV4cHIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpZCA9IHZhbC5zdWJzdHJpbmcoIDAsIGNvbG9uICk7Ci0gICAgICAgICAgICAgICAgdmV4cHIgPSB2YWwuc3Vic3RyaW5nKCBjb2xvbiArIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldCggcGosIGZpZCwgdmV4cHIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWYxMDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRlZFByb2plY3RUZW1wbGF0ZQotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZQotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkUmVhZE9ubHk7Ci0gICAgcHJpdmF0ZSBJUHJlc2V0IHByZXNldDsKLSAgICAKLSAgICBGYWNldGVkUHJvamVjdFRlbXBsYXRlKCkgCi0gICAgewotICAgICAgICB0aGlzLmZpeGVkID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgdGhpcy5maXhlZFJlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCB0aGlzLmZpeGVkICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRMYWJlbCggZmluYWwgU3RyaW5nIGxhYmVsICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldEZpeGVkUHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5maXhlZFJlYWRPbmx5OwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZEZpeGVkUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZml4ZWQuYWRkKCBmYWNldCApOwotICAgIH0KLQotICAgIHB1YmxpYyBJUHJlc2V0IGdldEluaXRpYWxQcmVzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJlc2V0OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldEluaXRpYWxQcmVzZXQoIGZpbmFsIElQcmVzZXQgcHJlc2V0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJlc2V0ID0gcHJlc2V0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmY3NjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5yZXBvcnRNaXNzaW5nRmFjZXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kRXh0ZW5zaW9uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRPcHRpb25hbEVsZW1lbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kUmVxdWlyZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5nZXRFbGVtZW50VmFsdWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5nZXRUb3BMZXZlbEVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLkluZGV4ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLkludmFsaWRFeHRlbnNpb25FeGNlcHRpb247Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIHRoZSA8Y29kZT50ZW1wbGF0ZTwvY29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+ZmFjZXRzPC9jb2RlPiAKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GSVhFRCA9ICJmaXhlZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1BSRVNFVCA9ICJwcmVzZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1RFTVBMQVRFID0gInRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEluZGV4ZWRTZXQ8U3RyaW5nLElGYWNldGVkUHJvamVjdFRlbXBsYXRlPiB0ZW1wbGF0ZXMgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElGYWNldGVkUHJvamVjdFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKQotICAgIHsKLSAgICAgICAgcmVhZEV4dGVuc2lvbnMoKTsKLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlcy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJlYWRFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJldHVybiB0ZW1wbGF0ZXMuZ2V0KCBpZCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWFkRXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICBpZiggdGVtcGxhdGVzICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRlbXBsYXRlcyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJRmFjZXRlZFByb2plY3RUZW1wbGF0ZT4oKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCAKLSAgICAgICAgICAgICA6IGdldFRvcExldmVsRWxlbWVudHMoIGZpbmRFeHRlbnNpb25zKCBQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCBFTF9URU1QTEFURSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRUZW1wbGF0ZSggZWxlbWVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlciB2aWEgdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRUZW1wbGF0ZSggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBGYWNldGVkUHJvamVjdFRlbXBsYXRlKCk7Ci0gICAgICAgIHRlbXBsYXRlLnNldElkKCBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9JRCApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxMYWJlbCA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfTEFCRUwgKTsKLSAgICAgICAgdGVtcGxhdGUuc2V0TGFiZWwoIGdldEVsZW1lbnRWYWx1ZSggZWxMYWJlbCwgdGVtcGxhdGUuZ2V0SWQoKSApICk7Ci0gICAgCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9GSVhFRCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlkID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmlkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0ZhY2V0KCBmaWQsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGVtcGxhdGUuYWRkRml4ZWRQcm9qZWN0RmFjZXQoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggZmlkICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX1BSRVNFVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGlkID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9JRCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggcGlkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnByZXNldE5vdERlZmluZWQsIHBpZCwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zZXRJbml0aWFsUHJlc2V0KCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoIHBpZCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRlbXBsYXRlcy5hZGQoIHRlbXBsYXRlLmdldElkKCksIHRlbXBsYXRlICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldE5vdERlZmluZWQ7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGYWNldGVkUHJvamVjdFRlbXBsYXRlc0V4dGVuc2lvblBvaW50LmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzhiYTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXByZXNldE5vdERlZmluZWQgPSBQcmVzZXQgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLiBJdCBpcyB1c2VkIGluIHBsdWdpbiB7MX0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWI4MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRFeHRlbnNpb25zOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZ2V0VG9wTGV2ZWxFbGVtZW50czsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwucmVwb3J0TWlzc2luZ0F0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0VmFsaWRhdGlvbkJ1aWxkZXIKLQotICAgIGV4dGVuZHMgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcgotICAgIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQKLSAgICAgICAgPSBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5idWlsZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJ2YWxpZGF0b3JzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9WQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8VmFsaWRhdG9yRGVmaW5pdGlvbj4gdmFsaWRhdG9ycyAKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRvckRlZmluaXRpb24+KCk7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICByZWFkRXh0ZW5zaW9ucygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZCggZmluYWwgaW50IGtpbmQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXAgYXJncywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggUmVzb3VyY2VzLnRhc2tEZXNjcmlwdGlvbiwgMyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBEZWxldGUgZXhpc3RpbmcgcHJvYmxlbSBtYXJrZXJzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcm9qLmRlbGV0ZU1hcmtlcnMoIElGYWNldGVkUHJvamVjdFZhbGlkYXRvci5CQVNFX01BUktFUl9JRCwgdHJ1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUGVyZm9ybSBiYXNpYyB2YWxpZGF0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gZnByb2oudmFsaWRhdGUoIHN1Ym1vbiggbW9uaXRvciwgMSApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIHN0LmlzT0soKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1c1tdIHByb2JsZW1zID0gc3QuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgcHJvYmxlbSA9IHByb2JsZW1zWyBpIF07Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZXZlcml0eSA9IHByb2JsZW0uZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBwcm9ibGVtLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnByb2ouY3JlYXRlRXJyb3JNYXJrZXIoIG1lc3NhZ2UgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJvai5jcmVhdGVXYXJuaW5nTWFya2VyKCBtZXNzYWdlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBWYWxpZGF0b3JEZWZpbml0aW9uIGRlZiA6IHZhbGlkYXRvcnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZWYuaXNBcHBsaWNhYmxlKCBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IgdmFsaWRhdG9yID0gZGVmLmdldFZhbGlkYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHZhbGlkYXRvciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKCBmcHJvaiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBJUHJvamVjdFswXTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEV4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIAotICAgICAgICAgICAgOiBnZXRUb3BMZXZlbEVsZW1lbnRzKCBmaW5kRXh0ZW5zaW9ucyggUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9WQUxJREFUT1IgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsaWRhdG9yRGVmaW5pdGlvbiBkZWYgPSBuZXcgVmFsaWRhdG9yRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGRlZi5wbHVnaW4gPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVmLmNsYXNzTmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfQ0xBU1MgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBkZWYuY2xhc3NOYW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGogXTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9GQUNFVCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0UmVmIHJlZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldFJlZi5yZWFkKCBjaGlsZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVmICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZi5jb25zdHJhaW50cy5hZGQoIHJlZiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGRlZiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMuYWRkKCBkZWYgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbiggZmluYWwgSVByb2dyZXNzTW9uaXRvciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRpY2tzICkKLSAgICB7Ci0gICAgICAgIGlmKCBwYXJlbnQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIHBhcmVudCwgdGlja3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdvcmtlZCggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGlja3MgKQotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCB0aWNrcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvci5pc0NhbmNlbGVkKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFZhbGlkYXRvckRlZmluaXRpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcGx1Z2luOwotICAgICAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICAgICAgcHVibGljIElGYWNldGVkUHJvamVjdFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0PFByb2plY3RGYWNldFJlZj4gY29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RGYWNldFJlZj4oKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgICAgICAKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBQcm9qZWN0RmFjZXRSZWYgcmVmIDogdGhpcy5jb25zdHJhaW50cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgcmVmLmNoZWNrKCBmYWNldHMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnZhbGlkYXRvciA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvcgotICAgICAgICAgICAgICAgICAgICA9IGluc3RhbnRpYXRlKCB0aGlzLnBsdWdpbiwgdGhpcy5jbGFzc05hbWUsIElGYWNldGVkUHJvamVjdFZhbGlkYXRvci5jbGFzcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrRGVzY3JpcHRpb247Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU5MTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VmFsaWRhdGlvbkJ1aWxkZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRhc2tEZXNjcmlwdGlvbiA9IFZhbGlkYXRpbmcgZmFjZXRlZCBwcm9qZWN0Li4uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWMwMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5BY3Rpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUR5bmFtaWNQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuTWluaW1hbENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5JbmRleGVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuU3RhdHVzV3JhcHBlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRlZFByb2plY3RXb3JraW5nQ29weQotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gRU1QVFlfU09SVEVEX0ZWX1NFVAotICAgICAgICA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldCggbmV3IFRyZWVTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgb2JqZWN0IHRoYXQncyB1c2VkIGludGVybmFsbHkgZm9yIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIHRoZSBkYXRhIHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIE9iamVjdCBsb2NrOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGluIHRoZSBzY2VuYXJpbyB3aGVyZSB0aGUgd29ya2luZyBjb3B5IGlzIGZvciBhCi0gICAgICogcHJvamVjdCB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0LCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHRoZSBwcm9qZWN0IG5hbWUuIElmIHRoZSBwcm9qZWN0IG5hbWUgaXMgYWNjZXB0YWJsZSwgdGhlIHN0YXR1cwotICAgICAqIHNldmVyaXR5IGlzIGdvaW5nIHRvIGJlIElTdGF0dXMuT0suCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHByb2plY3ROYW1lVmFsaWRhdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHByb2plY3QgaW4gdGhlIHNjZW5hcmlvIHdoZXJlIHRoZSB3b3JraW5nIGNvcHkgaXMgZm9yIGEKLSAgICAgKiBwcm9qZWN0IHRoYXQgZG9lc24ndCBleGlzdCB5ZXQsIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIElQYXRoIHByb2plY3RMb2NhdGlvbjsKLSAgICBwcml2YXRlIElGYWNldGVkUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkRmFjZXRzOwotICAgIHByaXZhdGUgSW5kZXhlZFNldDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHM7Ci0gICAgcHJpdmF0ZSBNYXA8SVByb2plY3RGYWNldCxTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+PiBhdmFpbGFibGVGYWNldHM7Ci0gICAgcHJpdmF0ZSBJbmRleGVkU2V0PFN0cmluZyxJUHJlc2V0PiBhdmFpbGFibGVQcmVzZXRzOwotICAgIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkUHJlc2V0SWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHRhcmdldGFibGVSdW50aW1lczsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUnVudGltZT4gdGFyZ2V0ZWRSdW50aW1lczsKLSAgICBwcml2YXRlIElSdW50aW1lIHByaW1hcnlSdW50aW1lOwotICAgIHByaXZhdGUgU2V0PEFjdGlvbj4gYWN0aW9uczsKLSAgICBwcml2YXRlIExpc3Q8SVN0YXR1cz4gcHJvYmxlbXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJ1bm5hYmxlPiBkaXNwb3NlVGFza3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFwcyBldmVudCB0eXBlcyB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgdGhvc2UgZXZlbnRzLiBUaGUgbWFwIGlzCi0gICAgICogcG9wdWxhdGVkIHdpdGggZW1wdHkgbGlzdGVuZXJzIGxpc3RzIGZvciBhbGwgZXZlbnQgdHlwZXMgYXQgaW5pdGlhbGl6YXRpb24gYW5kIGlzIAotICAgICAqIG5vdCBtb2RpZmllZCBhZnRlciB0aGF0LiBUaGUgY29udGFpbmVkIGxpc3RzIHVzZSBjb3B5LW9uLXdyaXRlIGJlaGF2aW9yIHRvIGd1YXJhbnRlZSAKLSAgICAgKiBmb3Igc2FmZSBpdGVyYXRpb24gd2hlbiBub3RpZnlpbmcgbGlzdGVuZXJzLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgZmluYWwgTWFwPElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUsTGlzdDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4+IGxpc3RlbmVyczsKLQotICAgIC8qKgotICAgICAqIFRyYWNrcyB3aGV0aGVyIG9yIG5vdCBldmVudCBub3RpZmljYXRpb24gaXMgY3VycmVudGx5IHN1c3BlbmRlZC4gVGhpcyBjb3VudGVyIGlzCi0gICAgICogaW5jcmVtZW50ZWQgYnkgdGhlIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpIG1ldGhvZCBhbmQgZGVjcmVtZW50ZWQgYnkgdGhlCi0gICAgICogcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKSBtZXRob2QuIE9uY2UgdGhlIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBhbnkgcXVldWVkIGV2ZW50cwotICAgICAqIGNhbiBiZSBkZWxpdmVyZWQuCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBpbnQgc3VzcGVuZEV2ZW50Tm90aWNhdGlvbkNvdW50ZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBldmVudHMgdGhhdCBhcmUgcXVldWVkIHdoaWxlIGV2ZW50IG5vdGlmaWNhdGlvbiBpcyBzdXNwZW5kZWQuCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiBxdWV1ZWRFdmVudHM7Ci0gICAgCi0gICAgcHVibGljIEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMubG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IG51bGw7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWVWYWxpZGF0aW9uID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgdGhpcy5wcm9qZWN0TG9jYXRpb24gPSBudWxsOwotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLmFjdGlvbnMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICB0aGlzLnByb2JsZW1zID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIHRoaXMuZml4ZWRGYWNldHMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICB0aGlzLmZhY2V0cyA9IG5ldyBJbmRleGVkU2V0PElQcm9qZWN0RmFjZXQsSVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIHRoaXMuYXZhaWxhYmxlRmFjZXRzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgdGhpcy5hdmFpbGFibGVQcmVzZXRzID0gbmV3IEluZGV4ZWRTZXQ8U3RyaW5nLElQcmVzZXQ+KCk7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCA9IG51bGw7Ci0gICAgICAgIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SVJ1bnRpbWU+KCk7Ci0gICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElSdW50aW1lPigpOwotICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gbnVsbDsKLSAgICAgICAgdGhpcy5kaXNwb3NlVGFza3MgPSBuZXcgQXJyYXlMaXN0PFJ1bm5hYmxlPigpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDxJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLExpc3Q8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlIGV2ZW50VHlwZSA6IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXQoIGV2ZW50VHlwZSwgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuc3VzcGVuZEV2ZW50Tm90aWNhdGlvbkNvdW50ZXIgPSAwOwotICAgICAgICB0aGlzLnF1ZXVlZEV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+KCk7Ci0gICAgICAgIAotICAgICAgICByZWZyZXNoQXZhaWxhYmxlRmFjZXRzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5wcm9qZWN0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRGaXhlZFByb2plY3RGYWNldHMoIHRoaXMucHJvamVjdC5nZXRGaXhlZFByb2plY3RGYWNldHMoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnByb2plY3QgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIHRoaXMucHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVmcmVzaFRhcmdldGFibGVSdW50aW1lcygpOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMucHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0VGFyZ2V0ZWRSdW50aW1lcyggdGhpcy5wcm9qZWN0LmdldFRhcmdldGVkUnVudGltZXMoKSApOwotICAgICAgICAgICAgc2V0UHJpbWFyeVJ1bnRpbWUoIHRoaXMucHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byByZWdpc3RlcmVkIHJ1bnRpbWVzLgotCi0gICAgICAgIGZpbmFsIElMaXN0ZW5lciBydW50aW1lTWFuYWdlckxpc3RlbmVyID0gbmV3IElMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGhyZWFkIHJ1bnRpbWVzUmVmcmVzaFRocmVhZCA9IG5ldyBUaHJlYWQoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuZGluZyBldmVudCBub3RpZmljYXRpb24gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGludGVybmFsIGxpc3Qgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldGFibGUgcnVudGltZXMgaXMgdXBkYXRlZCBiZWZvcmUgdGhlIEFWQUlMQUJMRV9SVU5USU1FU19DSEFOR0VECi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBpcyByZWNlaXZlZCBieSBsaXN0ZW5lcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LnRoaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkFWQUlMQUJMRV9SVU5USU1FU19DSEFOR0VEICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBldmVudCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBydW50aW1lc1JlZnJlc2hUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIFJ1bnRpbWVNYW5hZ2VyLmFkZFJ1bnRpbWVMaXN0ZW5lciggcnVudGltZU1hbmFnZXJMaXN0ZW5lciApOwotICAgICAgICAKLSAgICAgICAgYWRkRGlzcG9zZVRhc2sKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUnVudGltZU1hbmFnZXIucmVtb3ZlUnVudGltZUxpc3RlbmVyKCBydW50aW1lTWFuYWdlckxpc3RlbmVyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHJlZ2lzdGVyZWQgcHJlc2V0cy4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyIHByZXNldHNMaXN0ZW5lciA9IG5ldyBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudCBldmVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKCBwcmVzZXRzTGlzdGVuZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZS5QUkVTRVRfQURERUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZS5QUkVTRVRfUkVNT1ZFRCApOwotICAgICAgICAKLSAgICAgICAgYWRkRGlzcG9zZVRhc2sKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoIHByZXNldHNMaXN0ZW5lciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcHJvamVjdC4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHRhcmdldGVkUnVudGltZXNDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBhZGRMaXN0ZW5lciggdGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMucHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdE5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgZXF1YWxzKCB0aGlzLnByb2plY3ROYW1lLCBuYW1lICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogZ2V0UHJvamVjdEZhY2V0QWN0aW9ucygpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnID0gYWN0aW9uLmdldENvbmZpZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb25maWcgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQWN0aW9uQ29uZmlnIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbmZpZyBpbnN0YW5jZW9mIElBY3Rpb25Db25maWcgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKElBY3Rpb25Db25maWcpIGNvbmZpZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElBZGFwdGVyTWFuYWdlciBtID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ID0gSUFjdGlvbkNvbmZpZy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKElBY3Rpb25Db25maWcpIG0ubG9hZEFkYXB0ZXIoIGNvbmZpZywgdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYyAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXRQcm9qZWN0TmFtZSggdGhpcy5wcm9qZWN0TmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTkFNRV9DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyB2YWxpZGF0ZU5hbWVSZXN1bHQgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB3cy52YWxpZGF0ZU5hbWUoIHRoaXMucHJvamVjdE5hbWUsIElSZXNvdXJjZS5QUk9KRUNUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMucHJvamVjdE5hbWVWYWxpZGF0aW9uLmVxdWFscyggdmFsaWRhdGVOYW1lUmVzdWx0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdE5hbWVWYWxpZGF0aW9uID0gdmFsaWRhdGVOYW1lUmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVkFMSURBVElPTl9QUk9CTEVNU19DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIFRPRE86IG5lZWRzIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUGF0aCBnZXRQcm9qZWN0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdExvY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RMb2NhdGlvbiggZmluYWwgSVBhdGggbG9jYXRpb24gKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3QgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIFRPRE86IG5lZWRzIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnByb2plY3QgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldEZpeGVkUHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZpeGVkRmFjZXRzOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRml4ZWRQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5maXhlZEZhY2V0cy5jb250YWlucyggZmFjZXQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGaXhlZFByb2plY3RGYWNldHMoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZCApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHRoaXMuZml4ZWRGYWNldHMuZXF1YWxzKCBmaXhlZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBuZXdGYWNldHMgCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBnZXRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGZpeGVkICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGN1cnJlbnRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbiggZiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRWZXJzaW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGYuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaXNGYWNldEF2YWlsYWJsZSggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYgPSBnZXRIaWdoZXN0QXZhaWxhYmxlVmVyc2lvbiggZiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdGYWNldHMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIG5ld0ZhY2V0cyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRGYWNldHMgCi0gICAgICAgICAgICAgICAgICAgID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PiggZml4ZWQgKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuRklYRURfRkFDRVRTX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVGYWNldHMoKTsKLSAgICAgICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlUHJlc2V0cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWFwPElQcm9qZWN0RmFjZXQsU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPj4gZ2V0QXZhaWxhYmxlRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlRmFjZXRzOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjZXRBdmFpbGFibGUoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUZhY2V0cy5jb250YWluc0tleSggZiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjZXRBdmFpbGFibGUoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXJzaW9ucyAKLSAgICAgICAgICAgICAgICA9IHRoaXMuYXZhaWxhYmxlRmFjZXRzLmdldCggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuICggdmVyc2lvbnMgIT0gbnVsbCAmJiB2ZXJzaW9ucy5jb250YWlucyggZnYgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEF2YWlsYWJsZVZlcnNpb25zKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGF2YWlsYWJsZVZlcnNpb25zID0gdGhpcy5hdmFpbGFibGVGYWNldHMuZ2V0KCBmICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBhdmFpbGFibGVWZXJzaW9ucyA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVWZXJzaW9ucyA9IEVNUFRZX1NPUlRFRF9GVl9TRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVWZXJzaW9uczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SGlnaGVzdEF2YWlsYWJsZVZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5hdmFpbGFibGVGYWNldHMuZ2V0KCBmICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB2ZXJzaW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGZ2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggZnYuY29tcGFyZVRvKCB2ZXJzaW9uICkgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGZ2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEF2YWlsYWJsZUZhY2V0cygpCi0gICAgewotICAgICAgICBmaW5hbCBNYXA8SVByb2plY3RGYWNldCxTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+PiBuZXdBdmFpbGFibGVGYWNldHMKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldCxTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+PigpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiB0YXJnZXRlZFJ1bnRpbWVzID0gZ2V0VGFyZ2V0ZWRSdW50aW1lcygpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHZlcnNpb25zID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGYuZ2V0VmVyc2lvbnMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3QgPT0gbnVsbCB8fCAhIHRoaXMucHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoIGZ2ICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogdGFyZ2V0ZWRSdW50aW1lcyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHIuc3VwcG9ydHMoIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggYXZhaWxhYmxlICYmICEgZnYuaXNWYWxpZEZvciggdGhpcy5maXhlZEZhY2V0cyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGF2YWlsYWJsZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdmVyc2lvbnMgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gbmV3IFRyZWVTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdBdmFpbGFibGVGYWNldHMucHV0KCBmLCB2ZXJzaW9ucyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucy5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgYW55IHVua25vd24gZmFjZXRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIHByb2plY3QuCi0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5wcm9qZWN0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5wcm9qZWN0LmdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZ2LmdldFBsdWdpbklkKCkgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBmdi5nZXRQcm9qZWN0RmFjZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXJzaW9ucyA9IG5ld0F2YWlsYWJsZUZhY2V0cy5nZXQoIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXJzaW9ucyA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSBuZXcgVHJlZVNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F2YWlsYWJsZUZhY2V0cy5wdXQoIGYsIHZlcnNpb25zICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHRoZSBhdmFpbGFibGUgZmFjZXRzLCBhcHBseSB0aGUgY2hhbmdlIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVycy4KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIHRoaXMuYXZhaWxhYmxlRmFjZXRzLmVxdWFscyggbmV3QXZhaWxhYmxlRmFjZXRzICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIE1hcC5FbnRyeTxJUHJvamVjdEZhY2V0LFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4+IGVudHJ5IAotICAgICAgICAgICAgICAgICA6IG5ld0F2YWlsYWJsZUZhY2V0cy5lbnRyeVNldCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZSggQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KCBlbnRyeS5nZXRWYWx1ZSgpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVGYWNldHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoIG5ld0F2YWlsYWJsZUZhY2V0cyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkFWQUlMQUJMRV9GQUNFVFNfQ0hBTkdFRCApICk7Ci0KLSAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVQcmVzZXRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbiggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmdldCggZiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmNvbnRhaW5zS2V5KCBmICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmNvbnRhaW5zKCBmdiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RGYWNldHMoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbmRleGVkU2V0PElQcm9qZWN0RmFjZXQsSVByb2plY3RGYWNldFZlcnNpb24+IG5ld1Byb2plY3RGYWNldHMKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgSW5kZXhlZFNldDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmYWNldHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3UHJvamVjdEZhY2V0cy5hZGQoIGZ2LmdldFByb2plY3RGYWNldCgpLCBmdiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGFkZGVkRmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZW1vdmVkRmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBjaGFuZ2VkVmVyc2lvbnMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogbmV3UHJvamVjdEZhY2V0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBjdXJyZW50RmFjZXRWZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmZhY2V0cy5nZXQoIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggY3VycmVudEZhY2V0VmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRGYWNldHMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgZnYuZXF1YWxzKCBjdXJyZW50RmFjZXRWZXJzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRWZXJzaW9ucy5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIG5ld1Byb2plY3RGYWNldHMuY29udGFpbnNLZXkoIGZ2LmdldFByb2plY3RGYWNldCgpICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkRmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYWRkZWRGYWNldHMuaXNFbXB0eSgpICYmIHJlbW92ZWRGYWNldHMuaXNFbXB0eSgpICYmIGNoYW5nZWRWZXJzaW9ucy5pc0VtcHR5KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFByZXNldCggbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzID0gbmV3UHJvamVjdEZhY2V0czsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudCBldmVudAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50KCB0aGlzLCBhZGRlZEZhY2V0cywgcmVtb3ZlZEZhY2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFZlcnNpb25zICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBldmVudCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVmcmVzaFRhcmdldGFibGVSdW50aW1lcygpOwotICAgICAgICAgICAgICAgIHJlZnJlc2hQcm9qZWN0RmFjZXRBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKTsKLSAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBleGlzdGluZ1ZlcnNpb24gCi0gICAgICAgICAgICAgICAgICAgID0gdGhpcy5mYWNldHMuZ2V0KCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBleGlzdGluZ1ZlcnNpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IG5ld1Byb2plY3RGYWNldHMgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbmV3UHJvamVjdEZhY2V0cy5hZGRBbGwoIHRoaXMuZmFjZXRzICk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3RGYWNldHMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdEZhY2V0cyggbmV3UHJvamVjdEZhY2V0cyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBleGlzdGluZ1ZlcnNpb24gPT0gZnYgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkcyBleGNlcHRpb24gbXNnCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGdldFByb2plY3RGYWNldFZlcnNpb24oIGYgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZnYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVQcm9qZWN0RmFjZXQoIGdldFByb2plY3RGYWNldFZlcnNpb24oIGYgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZXhpc3RpbmdWZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICA9IHRoaXMuZmFjZXRzLmdldCggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZXhpc3RpbmdWZXJzaW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBleGlzdGluZ1ZlcnNpb24gPT0gZnYgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBuZXdQcm9qZWN0RmFjZXRzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3RGYWNldHMuYWRkQWxsKCB0aGlzLmZhY2V0cyApOwotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0RmFjZXRzLnJlbW92ZSggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIG5ld1Byb2plY3RGYWNldHMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZHMgZXhjZXB0aW9uIG1zZwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYW5nZVByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBleGlzdGluZ1ZlcnNpb24gCi0gICAgICAgICAgICAgICAgICAgID0gdGhpcy5mYWNldHMuZ2V0KCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBleGlzdGluZ1ZlcnNpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkcyBleGNlcHRpb24gbXNnCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZXhpc3RpbmdWZXJzaW9uID09IGZ2ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBuZXdQcm9qZWN0RmFjZXRzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3RGYWNldHMuYWRkQWxsKCB0aGlzLmZhY2V0cyApOwotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0RmFjZXRzLnJlbW92ZSggZXhpc3RpbmdWZXJzaW9uICk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3RGYWNldHMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdEZhY2V0cyggbmV3UHJvamVjdEZhY2V0cyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEJhc2VQcm9qZWN0RmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnByb2plY3QgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJUHJlc2V0PiBnZXRBdmFpbGFibGVQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEluZGV4ZWRTZXQ8U3RyaW5nLElQcmVzZXQ+IG5ld0F2YWlsYWJsZVByZXNldHMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSVByZXNldD4oKTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4gY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJlc2V0IHByZXNldCA6IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcHJlc2V0LmdldFR5cGUoKSA9PSBJUHJlc2V0LlR5cGUuRFlOQU1JQyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb250ZXh0ID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHV0KCBJRHluYW1pY1ByZXNldC5DT05URVhUX0tFWV9GQUNFVEVEX1BST0pFQ1QsIHRoaXMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnB1dCggSUR5bmFtaWNQcmVzZXQuQ09OVEVYVF9LRVlfUFJJTUFSWV9SVU5USU1FLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHV0KCBJRHluYW1pY1ByZXNldC5DT05URVhUX0tFWV9GSVhFRF9GQUNFVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpeGVkRmFjZXRzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldCA9ICggKElEeW5hbWljUHJlc2V0KSBwcmVzZXQgKS5yZXNvbHZlKCBjb250ZXh0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwcmVzZXQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gcHJlc2V0LmdldFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhcHBsaWNhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBvZiB0aGUgZmFjZXRzIGxpc3RlZCBpbiB0aGUgcHJlc2V0IGFuZCB0aGVpciB2ZXJzaW9ucyBtdXN0IGJlIGF2YWlsYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmYWNldHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISBpc0ZhY2V0QXZhaWxhYmxlKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVzZXQgbXVzdCBzcGFuIGFjcm9zcyBhbGwgb2YgdGhlIGZpeGVkIGZhY2V0cy4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogdGhpcy5maXhlZEZhY2V0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmFjZXRzLmNvbnRhaW5zKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISBmb3VuZCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggYXBwbGljYWJsZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F2YWlsYWJsZVByZXNldHMuYWRkKCBwcmVzZXQuZ2V0SWQoKSwgcHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgdGhpcy5hdmFpbGFibGVQcmVzZXRzLmVxdWFscyggbmV3QXZhaWxhYmxlUHJlc2V0cyApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUHJlc2V0cyA9IG5ld0F2YWlsYWJsZVByZXNldHM7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuQVZBSUxBQkxFX1BSRVNFVFNfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5zZWxlY3RlZFByZXNldElkICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAhIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5jb250YWluc0tleSggdGhpcy5zZWxlY3RlZFByZXNldElkICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFByZXNldCggbnVsbCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByZXNldCBnZXRTZWxlY3RlZFByZXNldCgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnNlbGVjdGVkUHJlc2V0SWQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5nZXQoIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUHJlc2V0KCBmaW5hbCBTdHJpbmcgcHJlc2V0SWQgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwcmVzZXRJZCAhPSBudWxsICYmICEgdGhpcy5hdmFpbGFibGVQcmVzZXRzLmNvbnRhaW5zS2V5KCBwcmVzZXRJZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmNvdWxkTm90U2VsZWN0UHJlc2V0LCBwcmVzZXRJZCApOyAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbXNnICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGVxdWFscyggdGhpcy5zZWxlY3RlZFByZXNldElkLCBwcmVzZXRJZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gdGhpcy5hdmFpbGFibGVQcmVzZXRzLmdldCggcHJlc2V0SWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwcmVzZXQgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBrZWVwcyB0aGUgc2V0UHJvamVjdEZhY2V0cygpIGNhbGwgdGhhdCBjb21lcyBuZXh0IGZyb20gCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVzaW5nIGEgcHJlc2V0IGNoYW5nZSBldmVudCBmcm9tIGJlaW5nIGdlbmVyYXRlZC4gV2Ugd2FudCB0byBhdm9pZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmluZyB0d28gcHJlc2V0IGNoYW5nZSBldmVudHMgd2hpbGUgcHJlc2VudGluZyBhIGNvbnNpc3RlbnQgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZSAodGhlIG9sZCBwcmVzZXQgaXNuJ3Qgc2VsZWN0ZWQpIHRvIGV2ZW50IGhhbmRsZXJzIGxpc3RlbmluZyBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYWNldCBjaGFuZ2UgZXZlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldElkID0gcHJlc2V0SWQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlNFTEVDVEVEX1BSRVNFVF9DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJlc2V0IGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5nZXQoIERlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5QUkVTRVRfSUQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJUHJlc2V0IGdldE1pbmltYWxDb25maWd1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5nZXQoIE1pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5QUkVTRVRfSUQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVJ1bnRpbWU+IGdldFRhcmdldGFibGVSdW50aW1lcygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldGFibGVSdW50aW1lczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldGFibGUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRhYmxlUnVudGltZXMuY29udGFpbnMoIHJ1bnRpbWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoVGFyZ2V0YWJsZVJ1bnRpbWVzKCkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElSdW50aW1lPigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3QgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdC5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkuY29udGFpbnMoIHIgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggISByLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIG9rICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmVxdWFscyggcmVzdWx0ICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRhYmxlUnVudGltZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRhYmxlUnVudGltZXMuYWRkQWxsKCByZXN1bHQgKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5UQVJHRVRBQkxFX1JVTlRJTUVTX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZT4gdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogdGhpcy50YXJnZXRlZFJ1bnRpbWVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgdGhpcy50YXJnZXRhYmxlUnVudGltZXMuY29udGFpbnMoIHIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmUuYWRkKCByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5yZW1vdmVBbGwoIHRvUmVtb3ZlICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggISB0b1JlbW92ZS5pc0VtcHR5KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZUZhY2V0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5wcmltYXJ5UnVudGltZSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgdGhpcy50YXJnZXRhYmxlUnVudGltZXMuY29udGFpbnMoIHRoaXMucHJpbWFyeVJ1bnRpbWUgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0Fzc2lnblByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVJ1bnRpbWU+IGdldFRhcmdldGVkUnVudGltZXMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRlZFJ1bnRpbWVzOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzVGFyZ2V0ZWQoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNvbnRhaW5zKCBydW50aW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0ZWRSdW50aW1lcyggZmluYWwgU2V0PElSdW50aW1lPiBydW50aW1lcyApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmVxdWFscyggcnVudGltZXMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHJ1bnRpbWVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmNvbnRhaW5zKCByICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5hZGQoIHIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5UQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZUZhY2V0cygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMucHJpbWFyeVJ1bnRpbWUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgISB0aGlzLnRhcmdldGVkUnVudGltZXMuY29udGFpbnMoIHRoaXMucHJpbWFyeVJ1bnRpbWUgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Bc3NpZ25QcmltYXJ5UnVudGltZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRUYXJnZXRlZFJ1bnRpbWUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBydW50aW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5hZGQoIHJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLnByaW1hcnlSdW50aW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gcnVudGltZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlUHJlc2V0cygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVGFyZ2V0ZWRSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy50YXJnZXRlZFJ1bnRpbWVzLnJlbW92ZSggcnVudGltZSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5UQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJ1bnRpbWUuZXF1YWxzKCB0aGlzLnByaW1hcnlSdW50aW1lICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Bc3NpZ25QcmltYXJ5UnVudGltZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVJ1bnRpbWUgZ2V0UHJpbWFyeVJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmltYXJ5UnVudGltZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5UnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgZXF1YWxzKCB0aGlzLnByaW1hcnlSdW50aW1lLCBydW50aW1lICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHJ1bnRpbWUgPT0gbnVsbCAmJiB0aGlzLnRhcmdldGVkUnVudGltZXMuc2l6ZSgpID4gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5jb250YWlucyggcnVudGltZSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IHJ1bnRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlUHJlc2V0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGF1dG9Bc3NpZ25QcmltYXJ5UnVudGltZSgpCi0gICAgewotICAgICAgICBpZiggdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJpbWFyeVJ1bnRpbWUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUGljayBvbmUgdG8gYmUgdGhlIHByaW1hcnkuIE5vIHNwZWNpYWwgc2VtYW50aWNzIGFzIHRvIHdoaWNoIAotICAgICAgICAgICAgLy8gb25lLgotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gdGhpcy50YXJnZXRlZFJ1bnRpbWVzLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCApICk7Ci0gICAgICAgIHJlZnJlc2hBdmFpbGFibGVQcmVzZXRzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8QWN0aW9uPiBnZXRQcm9qZWN0RmFjZXRBY3Rpb25zKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWN0aW9uIGdldFByb2plY3RGYWNldEFjdGlvbiggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9qZWN0RmFjZXRBY3Rpb24oIHRoaXMuYWN0aW9ucywgbnVsbCwgZmFjZXQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBBY3Rpb24gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBmaW5hbCBTZXQ8QWN0aW9uPiBhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIHR5cGUgPT0gbnVsbCB8fCBhY3Rpb24uZ2V0VHlwZSgpID09IHR5cGUgKSAmJiAKLSAgICAgICAgICAgICAgICBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpID09IGZ2ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uIGdldFByb2plY3RGYWNldEFjdGlvbiggZmluYWwgU2V0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICggdHlwZSA9PSBudWxsIHx8IGFjdGlvbi5nZXRUeXBlKCkgPT0gdHlwZSApICYmIAotICAgICAgICAgICAgICAgIGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZ2V0UHJvamVjdEZhY2V0KCkgPT0gZiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQWN0aW9uIGNyZWF0ZVByb2plY3RGYWNldEFjdGlvbiggZmluYWwgU2V0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBBY3Rpb24gYWN0aW9uID0gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBhY3Rpb25zLCB0eXBlLCBmdiApOwotICAgICAgICAKLSAgICAgICAgaWYoIGFjdGlvbiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlID0gZ2V0QmFzZVByb2plY3RGYWNldHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IGNvbmZpZyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmdi5zdXBwb3J0cyggYmFzZSwgdHlwZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBhY3Rpb25zLCB0eXBlLCBmICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggYWN0aW9uICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZnYuc3VwcG9ydHMoIGJhc2UsIHR5cGUgKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuc3VwcG9ydHMoIGJhc2UsIHR5cGUgKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldEFjdGlvbkRlZmluaXRpb24oIGJhc2UsIHR5cGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gY3VycmVudC5nZXRBY3Rpb25EZWZpbml0aW9uKCBiYXNlLCB0eXBlICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFjdGlvbi5nZXRDb25maWcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvbmZpZyA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUFjdGlvbkRlZmluaXRpb24gZGVmID0gZnYuZ2V0QWN0aW9uRGVmaW5pdGlvbiggYmFzZSwgdHlwZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gZGVmLmNyZWF0ZUNvbmZpZ09iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBiaW5kUHJvamVjdEZhY2V0QWN0aW9uQ29uZmlnKCBmdiwgY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggdHlwZSwgZnYsIGNvbmZpZyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYmluZFByb2plY3RGYWNldEFjdGlvbkNvbmZpZyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhY3Rpb25Db25maWcgKQotICAgIHsKLSAgICAgICAgaWYoIGFjdGlvbkNvbmZpZyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgSUFjdGlvbkNvbmZpZyBjMSA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBhY3Rpb25Db25maWcgaW5zdGFuY2VvZiBJQWN0aW9uQ29uZmlnICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjMSA9IChJQWN0aW9uQ29uZmlnKSBhY3Rpb25Db25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBhY3Rpb25Db25maWcgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUFkYXB0ZXJNYW5hZ2VyIG0gCi0gICAgICAgICAgICAgICAgICAgID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdAotICAgICAgICAgICAgICAgICAgICA9IElBY3Rpb25Db25maWcuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGMxID0gKElBY3Rpb25Db25maWcpIG0ubG9hZEFkYXB0ZXIoIGFjdGlvbkNvbmZpZywgdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggYzEgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYzEuc2V0UHJvamVjdE5hbWUoIGdldFByb2plY3ROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICBjMS5zZXRWZXJzaW9uKCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBBY3Rpb25Db25maWcgYzIgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggYWN0aW9uQ29uZmlnIGluc3RhbmNlb2YgQWN0aW9uQ29uZmlnICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjMiA9IChBY3Rpb25Db25maWcpIGFjdGlvbkNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGFjdGlvbkNvbmZpZyAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQWRhcHRlck1hbmFnZXIgbSA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQgPSBBY3Rpb25Db25maWcuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGMyID0gKEFjdGlvbkNvbmZpZykgbS5sb2FkQWRhcHRlciggYWN0aW9uQ29uZmlnLCB0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjMiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjMi5zZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgYzIuc2V0UHJvamVjdEZhY2V0VmVyc2lvbiggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFByb2plY3RGYWNldEFjdGlvbnMoKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlID0gZ2V0QmFzZVByb2plY3RGYWNldHMoKTsKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBzZWwgPSBnZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIGZpbmFsIFNldDxBY3Rpb24+IG9sZCA9IG5ldyBIYXNoU2V0PEFjdGlvbj4oIHRoaXMuYWN0aW9ucyApOwotICAgICAgICBmaW5hbCBTZXQ8QWN0aW9uPiBuZXdBY3Rpb25zID0gbmV3IEhhc2hTZXQ8QWN0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgLy8gV2hhdCBoYXMgYmVlbiByZW1vdmVkPwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGJhc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISBzZWwuY29udGFpbnMoIGZ2ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0FjdGlvbnMuYWRkKCBjcmVhdGVQcm9qZWN0RmFjZXRBY3Rpb24oIG9sZCwgQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmdiApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXaGF0IGhhcyBiZWVuIGFkZGVkPwotCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBzZWwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISBiYXNlLmNvbnRhaW5zKCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdBY3Rpb25zLmFkZCggY3JlYXRlUHJvamVjdEZhY2V0QWN0aW9uKCBvbGQsIEFjdGlvbi5UeXBlLklOU1RBTEwsIGZ2ICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ29hbGVzY2UgdW5pbnN0YWxsL2luc3RhbGwgcGFpcnMgaW50byB2ZXJzaW9uIGNoYW5nZSBhY3Rpb25zLCBpZgotICAgICAgICAvLyBwb3NzaWJsZS4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxBY3Rpb24+IHRvYWRkID0gbmV3IEhhc2hTZXQ8QWN0aW9uPigpOwotICAgICAgICBmaW5hbCBTZXQ8QWN0aW9uPiB0b3JlbW92ZSA9IG5ldyBIYXNoU2V0PEFjdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggQWN0aW9uIGFjdGlvbjEgOiBuZXdBY3Rpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uMiA6IG5ld0FjdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBhY3Rpb24xLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uMi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMSA9IGFjdGlvbjEuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMiA9IGFjdGlvbjIuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGYxLmdldFByb2plY3RGYWNldCgpID09IGYyLmdldFByb2plY3RGYWNldCgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9yZW1vdmUuYWRkKCBhY3Rpb24xICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3JlbW92ZS5hZGQoIGFjdGlvbjIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvYWRkLmFkZCggY3JlYXRlUHJvamVjdEZhY2V0QWN0aW9uKCBvbGQsIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMiApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5ld0FjdGlvbnMucmVtb3ZlQWxsKCB0b3JlbW92ZSApOwotICAgICAgICBuZXdBY3Rpb25zLmFkZEFsbCggdG9hZGQgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuYWN0aW9ucyA9IG5ld0FjdGlvbnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RGYWNldEFjdGlvbkNvbmZpZyggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXdBY3Rpb25Db25maWcgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbiBvbGRBY3Rpb24gPSBnZXRQcm9qZWN0RmFjZXRBY3Rpb24oIGZhY2V0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG9sZEFjdGlvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBvbGRBY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbiBuZXdBY3Rpb24gPSBuZXcgQWN0aW9uKCBvbGRBY3Rpb24uZ2V0VHlwZSgpLCBmdiwgbmV3QWN0aW9uQ29uZmlnICk7Ci0gICAgICAgICAgICAgICAgYmluZFByb2plY3RGYWNldEFjdGlvbkNvbmZpZyggZnYsIG5ld0FjdGlvbkNvbmZpZyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5yZW1vdmUoIG9sZEFjdGlvbiApOwotICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5hZGQoIG5ld0FjdGlvbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdHlwZXMubGVuZ3RoID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlIHR5cGUgOiB0eXBlcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KCB0eXBlICkuYWRkKCBsaXN0ZW5lciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBMaXN0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPiBsaXN0ZW5lcnMgOiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIExpc3Q8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+IGxpc3RlbmVyc1RvTm90aWZ5ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuc3VzcGVuZEV2ZW50Tm90aWNhdGlvbkNvdW50ZXIgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJzVG9Ob3RpZnkgPSB0aGlzLmxpc3RlbmVycy5nZXQoIGV2ZW50LmdldFR5cGUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMucXVldWVkRXZlbnRzLmFkZCggZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGxpc3RlbmVyc1RvTm90aWZ5ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzVG9Ob3RpZnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXZlbnQoIGV2ZW50ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnN1c3BlbmRFdmVudE5vdGljYXRpb25Db3VudGVyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IGV2ZW50c1RvRmlyZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3VzcGVuZEV2ZW50Tm90aWNhdGlvbkNvdW50ZXItLTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMuc3VzcGVuZEV2ZW50Tm90aWNhdGlvbkNvdW50ZXIgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgdGhpcy5xdWV1ZWRFdmVudHMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50c1RvRmlyZSA9IG5ldyBBcnJheUxpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50c1RvRmlyZS5hZGRBbGwoIHRoaXMucXVldWVkRXZlbnRzICk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWVkRXZlbnRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5zdXNwZW5kRXZlbnROb3RpY2F0aW9uQ291bnRlciA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGV2ZW50c1RvRmlyZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCA6IGV2ZW50c1RvRmlyZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTXVsdGlTdGF0dXMgbXMgPSBDb25zdHJhaW50LmNyZWF0ZU11bHRpU3RhdHVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIHRoaXMucHJvamVjdE5hbWVWYWxpZGF0aW9uLmlzT0soKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RhdHVzV3JhcHBlciB3cmFwcGVyID0gbmV3IFN0YXR1c1dyYXBwZXIoIHRoaXMucHJvamVjdE5hbWVWYWxpZGF0aW9uICk7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5zZXRDb2RlKCBQUk9CTEVNX1BST0pFQ1RfTkFNRSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG1zLmFkZCggd3JhcHBlciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElTdGF0dXMgc3QgOiB0aGlzLnByb2JsZW1zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNXcmFwcGVyIHdyYXBwZXIgPSBuZXcgU3RhdHVzV3JhcHBlciggc3QgKTsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLnNldENvZGUoIFBST0JMRU1fT1RIRVIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBtcy5hZGQoIHdyYXBwZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUnVudGltZSBydW50aW1lIDogdGhpcy50YXJnZXRlZFJ1bnRpbWVzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gcnVudGltZS52YWxpZGF0ZSggbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIHN0LmlzT0soKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmludmFsaWRSdW50aW1lTXNnLCBydW50aW1lLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c1dyYXBwZXIgd3JhcHBlciA9IG5ldyBTdGF0dXNXcmFwcGVyKCBzdCApOwotICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnNldE1lc3NhZ2UoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbXMuYWRkKCB3cmFwcGVyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSA9IGdldEJhc2VQcm9qZWN0RmFjZXRzKCk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxJU3RhdHVzPiBwcm9icyA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKTsKLSAgICAgICAgZmluYWwgTXVsdGlTdGF0dXMgbXMgPSAoTXVsdGlTdGF0dXMpIFByb2plY3RGYWNldHNNYW5hZ2VyLmNoZWNrKCBiYXNlLCB0aGlzLmFjdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVN0YXR1cyBzdCA6IG1zLmdldENoaWxkcmVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9icy5hZGQoIHN0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBiYXNlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOyAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGYuZ2V0UGx1Z2luSWQoKSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0Tm90Rm91bmQsIGYuZ2V0SWQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZnYuZ2V0UGx1Z2luSWQoKSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0VmVyc2lvbk5vdEZvdW5kLCBmLmdldElkKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1zZyAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN1YgotICAgICAgICAgICAgICAgICAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuV0FSTklORywgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcHJvYnMuYWRkKCBzdWIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZSByIDogZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgci5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFjZXROb3RTdXBwb3J0ZWRCeVRhcmdldCwgZnYudG9TdHJpbmcoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldExvY2FsaXplZE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdWIKLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcm9icy5hZGQoIHN1YiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICEgcHJvYnMuZXF1YWxzKCB0aGlzLnByb2JsZW1zICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByb2JsZW1zID0gcHJvYnM7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlZBTElEQVRJT05fUFJPQkxFTVNfQ0hBTkdFRCApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdWJNb25pdG9yIHBtID0gU3ViTW9uaXRvci5jb252ZXJ0KCBtb25pdG9yLCAxMDAgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBkZWFkbG9ja3MsIHdlIGNsb25lIHRoZSB3b3JraW5nIGNvcHkuIFRoaXMgYWxsb3dzIHVzIHRvIHJlbGVhc2UKLSAgICAgICAgICAgIC8vIHRoZSBsb2NrIG9uIHRoaXMgd29ya2luZyBjb3B5IHdoaWxlIHJ1bm5pbmcgbWVyZ2VDaGFuZ2VzKCkuIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlCi0gICAgICAgICAgICAvLyBtZXJnZUNoYW5nZXMoKSBjYW4gY2FsbCBvdXQgdG8gdGhpcmQtcGFydHkgY29kZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgY2xvbmU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbG9uZSA9IGNsb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggdGhpcy5wcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdExvY2F0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtLm5ld0NoaWxkKCAxMCwgU3ViTW9uaXRvci5TVVBQUkVTU19BTExfTEFCRUxTICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcGogPSB0aGlzLnByb2plY3Q7Ci0gICAgICAgICAgICAgICAgcG0ud29ya2VkKCAxMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAoIChGYWNldGVkUHJvamVjdCkgZnBqICkubWVyZ2VDaGFuZ2VzKCBjbG9uZSwgcG0ubmV3Q2hpbGQoIDkwICkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB3b3JraW5nIGNvcHkgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2Fpbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IGZwajsKLSAgICAgICAgICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aGlzLnByb2plY3ROYW1lVmFsaWRhdGlvbiA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldmVydENoYW5nZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBtLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBtZXJnZUNoYW5nZXMoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TmFtZSggZnBqd2MuZ2V0UHJvamVjdE5hbWUoKSApOwotICAgICAgICAgICAgICAgIHNldFByb2plY3RMb2NhdGlvbiggZnBqd2MuZ2V0UHJvamVjdExvY2F0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICBzZXRGaXhlZFByb2plY3RGYWNldHMoIGZwandjLmdldEZpeGVkUHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgc2V0UHJvamVjdEZhY2V0cyggZnBqd2MuZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgc2V0VGFyZ2V0ZWRSdW50aW1lcyggZnBqd2MuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgICAgICAgICAgc2V0UHJpbWFyeVJ1bnRpbWUoIGZwandjLmdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJlc2V0IHNlbGVjdGVkUHJlc2V0ID0gZnBqd2MuZ2V0U2VsZWN0ZWRQcmVzZXQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc2VsZWN0ZWRQcmVzZXQgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFByZXNldCggc2VsZWN0ZWRQcmVzZXQuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuYWRkQWxsKCAoIChGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBmcGp3YyAgKS5hY3Rpb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJldmVydENoYW5nZXMoKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCWlmKCB0aGlzLnByb2plY3QgIT0gbnVsbCApCi0gICAgICAgICAgICAJewotICAgICAgICAgICAgICAgICAgICBzZXRGaXhlZFByb2plY3RGYWNldHMoIHRoaXMucHJvamVjdC5nZXRGaXhlZFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBDb2xsZWN0aW9ucy48SVJ1bnRpbWU+ZW1wdHlTZXQoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXRQcm9qZWN0RmFjZXRzKCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFRhcmdldGVkUnVudGltZXMoIHRoaXMucHJvamVjdC5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVJ1bnRpbWUoIHRoaXMucHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIAllbHNlCi0gICAgICAgICAgICAJewotICAgICAgICAgICAgCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjbG9uZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgY2xvbmUgPSBuZXcgRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSggdGhpcy5wcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3QgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0JICAgICAgICAgICAgY2xvbmUuc2V0UHJvamVjdE5hbWUoIGdldFByb2plY3ROYW1lKCkgKTsKLQkgICAgICAgICAgICBjbG9uZS5zZXRQcm9qZWN0TG9jYXRpb24oIGdldFByb2plY3RMb2NhdGlvbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNsb25lLnNldEZpeGVkUHJvamVjdEZhY2V0cyggZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgIGNsb25lLnNldFByb2plY3RGYWNldHMoIGdldFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAgICAgY2xvbmUuc2V0VGFyZ2V0ZWRSdW50aW1lcyggZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgICAgICBjbG9uZS5zZXRQcmltYXJ5UnVudGltZSggZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUHJlc2V0IHNlbGVjdGVkUHJlc2V0ID0gZ2V0U2VsZWN0ZWRQcmVzZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHNlbGVjdGVkUHJlc2V0ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsb25lLnNldFNlbGVjdGVkUHJlc2V0KCBzZWxlY3RlZFByZXNldC5nZXRJZCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNsb25lLmFjdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgIGNsb25lLmFjdGlvbnMuYWRkQWxsKCB0aGlzLmFjdGlvbnMgKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNsb25lOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmRpc3Bvc2VUYXNrcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggUnVubmFibGUgdGFzayA6IHRoaXMuZGlzcG9zZVRhc2tzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhc2sucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZERpc3Bvc2VUYXNrKCBmaW5hbCBSdW5uYWJsZSB0YXNrICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5kaXNwb3NlVGFza3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRpc3Bvc2VUYXNrcy5hZGQoIHRhc2sgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iajEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmoyICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmoxID09IG9iajIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9iajEuZXF1YWxzKCBvYmoyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY291bGROb3RTZWxlY3RQcmVzZXQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0Tm90Rm91bmQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0VmVyc2lvbk5vdEZvdW5kOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldE5vdFN1cHBvcnRlZEJ5VGFyZ2V0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUnVudGltZU1zZzsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhYzdmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWNvdWxkTm90U2VsZWN0UHJlc2V0ID0gQ291bGQgbm90IHNlbGVjdCBwcmVzZXQgInswfSIuIE9uZSBvciBtb3JlIHJlcXVpcmVkIG9mIHRoZSByZXF1aXJlZCBmYWNldHMgYXJlIG5vdCB2aXNpYmxlLgotZmFjZXROb3RGb3VuZCA9IEltcGxlbWVudGF0aW9uIG9mIHByb2plY3QgZmFjZXQgezB9IGNvdWxkIG5vdCBiZSBmb3VuZC4gRnVuY3Rpb25hbGl0eSB3aWxsIGJlIGxpbWl0ZWQuCi1mYWNldFZlcnNpb25Ob3RGb3VuZCA9IEltcGxlbWVudGF0aW9uIG9mIHZlcnNpb24gezF9IG9mIHByb2plY3QgZmFjZXQgezB9IGNvdWxkIG5vdCBiZSBmb3VuZC4gRnVuY3Rpb25hbGl0eSB3aWxsIGJlIGxpbWl0ZWQuCi1mYWNldE5vdFN1cHBvcnRlZEJ5VGFyZ2V0ID0gUHJvamVjdCBmYWNldCB7MH0gaXMgbm90IHN1cHBvcnRlZCBieSB0YXJnZXQgcnVudGltZSB7MX0uCi1pbnZhbGlkUnVudGltZU1zZyA9IFJ1bnRpbWUgInswfSIgaXMgaW52YWxpZC4gezF9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMjUyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BzZWUgSUdyb3VwfSBpbnRlcmZhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcm91cCAKLQotICAgIGltcGxlbWVudHMgSUdyb3VwIAotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBtZW1iZXJzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBtZW1iZXJzUmVhZE9ubHk7Ci0gICAgCi0gICAgR3JvdXAoKSAKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSAiIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5tZW1iZXJzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIHRoaXMubWVtYmVyc1JlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCB0aGlzLm1lbWJlcnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5sYWJlbCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGlkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0TGFiZWwoIGZpbmFsIFN0cmluZyBsYWJlbCApCi0gICAgewotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0RGVzY3JpcHRpb24oIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldE1lbWJlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWVtYmVyc1JlYWRPbmx5OwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZE1lbWJlciggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzLmFkZCggZnYgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGFiZWwoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1ByZXNldHNFeHRlbnNpb25Qb2ludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJlc2V0c0V4dGVuc2lvblBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzQyY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJlc2V0c0V4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW4uUExVR0lOX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5sb2c7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5sb2dFcnJvcjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRFeHRlbnNpb25zOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZE9wdGlvbmFsRWxlbWVudDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRSZXF1aXJlZEF0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRSZXF1aXJlZEVsZW1lbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5nZXRFbGVtZW50VmFsdWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5nZXRUb3BMZXZlbEVsZW1lbnRzOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuaW5zdGFudGlhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEeW5hbWljUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5QcmVzZXREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuSW5kZXhlZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIHByb2Nlc3NpbmcgdGhlIDxjb2RlPnByZXNldHM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByZXNldHNFeHRlbnNpb25Qb2ludAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJwcmVzZXRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfRVhURU5TSU9OX1BPSU5UX0lEID0gImZhY2V0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0RZTkFNSUNfUFJFU0VUID0gImR5bmFtaWMtcHJlc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUFJFU0VUID0gInByZXNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfU1RBVElDX1BSRVNFVCA9ICJzdGF0aWMtcHJlc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VYVEVORFMgPSAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVTQ1JJUFRJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEluZGV4ZWRTZXQ8U3RyaW5nLElQcmVzZXQ+IHByZXNldHMgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElQcmVzZXQ+IGdldFByZXNldHMoKQotICAgIHsKLSAgICAgICAgcmVhZEV4dGVuc2lvbnMoKTsKLSAgICAgICAgcmV0dXJuIHByZXNldHMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByZXNldCBnZXRQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZWFkRXh0ZW5zaW9ucygpOwotICAgICAgICByZXR1cm4gcHJlc2V0cy5nZXQoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlYWRFeHRlbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGlmKCBwcmVzZXRzICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByZXNldHMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSVByZXNldD4oKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCAKLSAgICAgICAgICAgICA6IGdldFRvcExldmVsRWxlbWVudHMoIGZpbmRFeHRlbnNpb25zKCBQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWxOYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBlbE5hbWUuZXF1YWxzKCBFTF9TVEFUSUNfUFJFU0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRpY1ByZXNldCggZWxlbWVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlciB2aWEgdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBlbE5hbWUuZXF1YWxzKCBFTF9EWU5BTUlDX1BSRVNFVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWREeW5hbWljUHJlc2V0KCBlbGVtZW50ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyIHZpYSB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgCi0gICAgICAgICAgICAgOiBnZXRUb3BMZXZlbEVsZW1lbnRzKCBmaW5kRXh0ZW5zaW9ucyggUExVR0lOX0lELCBPTERfRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIEVMX1BSRVNFVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0aWNQcmVzZXQoIGVsZW1lbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIgdmlhIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBSZXNvbHZlIHRoZSBiYXNlIHByZXNldHMuIE1ha2Ugc3VyZSB0aGF0IG5vIHByZXNldHMgYXJlIGV4dGVuZGluZyBwcmVzZXRzIHRoYXQgZG8gbm90Ci0gICAgICAgIC8vIGV4aXN0LCBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcywgZXRjLgotICAgICAgICAKLSAgICAgICAgU2V0PElQcmVzZXQ+IGNvcHkgPSBuZXcgSGFzaFNldDxJUHJlc2V0PiggcHJlc2V0cyApOyAKLSAgICAgICAgCi0gICAgICAgIGZvciggSVByZXNldCBwcmVzZXQgOiBjb3B5ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHByZXNldHMuY29udGFpbnMoIHByZXNldCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlQmFzZVByZXNldCggcHJlc2V0LCBuZXcgSGFzaFNldDxJUHJlc2V0PigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEZpbmQgc3RhdGljIHByZXNldHMgdGhhdCBhcmUgZXh0ZW5kaW5nIGR5bmFtaWMgcHJlc2V0cyBhbmQgbWFrZSB0aGVtIGludG8gZHluYW1pYwotICAgICAgICAvLyBwcmVzZXRzIChTdGF0aWNFeHRlbmRpbmdEeW5hbWljUHJlc2V0IGNsYXNzKS4KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gZG9Bbm90aGVyUGFzcyA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSggZG9Bbm90aGVyUGFzcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvQW5vdGhlclBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJlc2V0IHByZXNldCA6IHByZXNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwcmVzZXQuZ2V0VHlwZSgpID09IElQcmVzZXQuVHlwZS5TVEFUSUMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RhdGljUHJlc2V0IHN0UHJlc2V0ID0gKFN0YXRpY1ByZXNldCkgcHJlc2V0OwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZVByZXNldElkID0gc3RQcmVzZXQuZ2V0QmFzZVByZXNldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggYmFzZVByZXNldElkICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJlc2V0IGJhc2VQcmVzZXQgPSBnZXRQcmVzZXQoIGJhc2VQcmVzZXRJZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggYmFzZVByZXNldC5nZXRUeXBlKCkgPT0gSVByZXNldC5UeXBlLkRZTkFNSUMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0YXRpY0V4dGVuZGluZ0R5bmFtaWNQcmVzZXQgc3RQcmVzZXROZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgU3RhdGljRXh0ZW5kaW5nRHluYW1pY1ByZXNldCggc3RQcmVzZXQuZ2V0SWQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UHJlc2V0LmdldFBsdWdpbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UHJlc2V0LmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UHJlc2V0LmdldERlc2NyaXB0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UHJlc2V0LmdldEJhc2VQcmVzZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdFByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXRzLmFkZCggc3RQcmVzZXROZXcuZ2V0SWQoKSwgc3RQcmVzZXROZXcgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQW5vdGhlclBhc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZFN0YXRpY1ByZXNldCggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBlbC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBlbCwgQVRUUl9JRCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsTGFiZWwgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBlbCwgRUxfTEFCRUwgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gZ2V0RWxlbWVudFZhbHVlKCBlbExhYmVsLCBpZCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsRGVzYyA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGVsLCBFTF9ERVNDUklQVElPTiApOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRFbGVtZW50VmFsdWUoIGVsRGVzYywgREVGQVVMVF9ERVNDUklQVElPTiApOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJhc2VQcmVzZXQgPSBlbC5nZXRBdHRyaWJ1dGUoIEFUVFJfRVhURU5EUyApOwotICAgICAgICAKLSAgICAgICAgaWYoIGJhc2VQcmVzZXQgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2VQcmVzZXQgPSBiYXNlUHJlc2V0LnRyaW0oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGJhc2VQcmVzZXQubGVuZ3RoKCkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVByZXNldCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0KLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgOiBlbC5nZXRDaGlsZHJlbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0ZBQ0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWQgPSBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX0lEICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ2ZXIgPSBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGZpZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5wcmVzZXRVc2VzVW5rbm93bkZhY2V0LCBpZCwgcGx1Z2luSWQsIGZpZCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3IoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGZpZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGYuaGFzVmVyc2lvbiggZnZlciApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5wcmVzZXRVc2VzVW5rbm93bkZhY2V0VmVyc2lvbiwgaWQsIHBsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkLCBmdmVyICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsb2dFcnJvciggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gZi5nZXRWZXJzaW9uKCBmdmVyICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RhdGljUHJlc2V0IHByZXNldCAKLSAgICAgICAgICAgID0gbmV3IFN0YXRpY1ByZXNldCggaWQsIHBsdWdpbklkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGJhc2VQcmVzZXQsIGZhY2V0cyApOwotICAgICAgICAKLSAgICAgICAgcHJlc2V0cy5hZGQoIGlkLCBwcmVzZXQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWREeW5hbWljUHJlc2V0KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwgKQotICAgIAotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGVsLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGVsLCBBVFRSX0lEICk7Ci0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbEZhY3RvcnkgPSBmaW5kUmVxdWlyZWRFbGVtZW50KCBlbCwgRUxfRkFDVE9SWSApOwotICAgICAgICBmaW5hbCBTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggZWxGYWN0b3J5LCBBVFRSX0NMQVNTICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBEeW5hbWljUHJlc2V0IHByZXNldCA9IG5ldyBEeW5hbWljUHJlc2V0KCBpZCwgcGx1Z2luSWQsIGZhY3RvcnlDbGFzc05hbWUgKTsKLSAgICAgICAgcHJlc2V0cy5hZGQoIGlkLCBwcmVzZXQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZXNvbHZlQmFzZVByZXNldCggZmluYWwgSVByZXNldCBwcmVzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcmVzZXQ+IHZpc2l0ZWRQcmVzZXRzICkKLSAgICB7Ci0gICAgICAgIGlmKCBwcmVzZXQuZ2V0VHlwZSgpID09IElQcmVzZXQuVHlwZS5TVEFUSUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdGF0aWNQcmVzZXQgc3RQcmVzZXQgPSAoU3RhdGljUHJlc2V0KSBwcmVzZXQ7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZVByZXNldElkID0gc3RQcmVzZXQuZ2V0QmFzZVByZXNldElkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBiYXNlUHJlc2V0SWQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByZXNldCBiYXNlUHJlc2V0ID0gZ2V0UHJlc2V0KCBiYXNlUHJlc2V0SWQgKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHByb2JsZW0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2aXNpdGVkUHJlc2V0cy5hZGQoIHByZXNldCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBiYXNlUHJlc2V0ID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmJhc2VQcmVzZXROb3RGb3VuZCwgc3RQcmVzZXQuZ2V0SWQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdFByZXNldC5nZXRQbHVnaW5JZCgpLCBiYXNlUHJlc2V0SWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHByb2JsZW0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB2aXNpdGVkUHJlc2V0cy5jb250YWlucyggYmFzZVByZXNldCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgY3ljbGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3ljbGVTaXplID0gdmlzaXRlZFByZXNldHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJlc2V0IHZwIDogdmlzaXRlZFByZXNldHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY291bnQgPiAxICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY291bnQgPT0gY3ljbGVTaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLmFwcGVuZCggIiBhbmQgIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLmFwcGVuZCggIiwgIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjeWNsZS5hcHBlbmQoICciJyApOwotICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUuYXBwZW5kKCB2cC5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjeWNsZS5hcHBlbmQoICciJyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5jeWNsZURldGVjdGVkLCBjeWNsZS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsb2dFcnJvciggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcm9ibGVtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggISByZXNvbHZlQmFzZVByZXNldCggYmFzZVByZXNldCwgdmlzaXRlZFByZXNldHMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9ibGVtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcHJvYmxlbSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQcmVzZXRzRXh0ZW5zaW9uUG9pbnQucHJlc2V0cy5kZWxldGUoIHByZXNldC5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0aWNQcmVzZXQKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJUHJlc2V0Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBsdWdpbklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJhc2VQcmVzZXRJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZmFjZXRzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRWZXJzaW9uczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0VmVyc2lvbnNSZWFkT25seTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdGF0aWNQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJhc2VQcmVzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICAgICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgdGhpcy5iYXNlUHJlc2V0SWQgPSBiYXNlUHJlc2V0OwotICAgICAgICAgICAgdGhpcy5mYWNldFZlcnNpb25zID0gZmFjZXRzOwotICAgICAgICAgICAgdGhpcy5mYWNldFZlcnNpb25zUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMuZmFjZXRWZXJzaW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCB0aGlzLmZhY2V0VmVyc2lvbnMuc2l6ZSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB0aGlzLmZhY2V0VmVyc2lvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzLmFkZCggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFR5cGUuU1RBVElDOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldExhYmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QmFzZVByZXNldElkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVByZXNldElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLmJhc2VQcmVzZXRJZCA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldFZlcnNpb25zUmVhZE9ubHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByZXNldCBiYXNlUHJlc2V0ID0gZ2V0UHJlc2V0KCB0aGlzLmJhc2VQcmVzZXRJZCApOwotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb21iaW5lZEZhY2V0U2V0KCBiYXNlUHJlc2V0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1VzZXJEZWZpbmVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhICggb2JqIGluc3RhbmNlb2YgU3RhdGljUHJlc2V0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RhdGljUHJlc2V0IHAgPSAoU3RhdGljUHJlc2V0KSBvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkLmVxdWFscyggcC5pZCApICYmCi0gICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5JZC5lcXVhbHMoIHAucGx1Z2luSWQgKSAmJgotICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWwuZXF1YWxzKCBwLmxhYmVsICkgJiYKLSAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLmVxdWFscyggcC5kZXNjcmlwdGlvbiApICYmCi0gICAgICAgICAgICAgICAgICAgdGhpcy5mYWNldFZlcnNpb25zLmVxdWFscyggcC5mYWNldFZlcnNpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGNyZWF0ZUNvbWJpbmVkRmFjZXRTZXQoIGZpbmFsIElQcmVzZXQgYmFzZVByZXNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gcmVzdWx0IAotICAgICAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCB0aGlzLmZhY2V0VmVyc2lvbnMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGJhc2VQcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISB0aGlzLmZhY2V0cy5jb250YWlucyggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggcmVzdWx0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3RhdGljRXh0ZW5kaW5nRHluYW1pY1ByZXNldAotICAgIAotICAgICAgICBleHRlbmRzIFN0YXRpY1ByZXNldAotICAgICAgICBpbXBsZW1lbnRzIElEeW5hbWljUHJlc2V0Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIFN0YXRpY0V4dGVuZGluZ0R5bmFtaWNQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlUHJlc2V0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBpZCwgcGx1Z2luSWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgYmFzZVByZXNldElkLCBmYWNldHMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVHlwZS5EWU5BTUlDOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElQcmVzZXQgcmVzb2x2ZSggZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRHluYW1pY1ByZXNldCBiYXNlUHJlc2V0ID0gKElEeW5hbWljUHJlc2V0KSBnZXRQcmVzZXQoIGdldEJhc2VQcmVzZXRJZCgpICk7Ci0gICAgICAgICAgICBmaW5hbCBJUHJlc2V0IHJlc0Jhc2VQcmVzZXQgPSBiYXNlUHJlc2V0LnJlc29sdmUoIGNvbnRleHQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHJlc0Jhc2VQcmVzZXQgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgPSBjcmVhdGVDb21iaW5lZEZhY2V0U2V0KCByZXNCYXNlUHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNQcmVzZXQoIGdldElkKCksIGdldFBsdWdpbklkKCksIGdldExhYmVsKCksIGdldERlc2NyaXB0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNlUHJlc2V0SWQoKSwgZmFjZXRzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRHluYW1pY1ByZXNldAotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElEeW5hbWljUHJlc2V0Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBsdWdpbklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lOwotICAgICAgICAKLSAgICAgICAgcHVibGljIER5bmFtaWNQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICAgICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotICAgICAgICAgICAgdGhpcy5mYWN0b3J5Q2xhc3NOYW1lID0gZmFjdG9yeUNsYXNzTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUeXBlLkRZTkFNSUM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJEZWZpbmVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSVByZXNldCByZXNvbHZlKCBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gY29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQcmVzZXRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMuZmFjdG9yeUNsYXNzTmFtZSwgSVByZXNldEZhY3RvcnkuY2xhc3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZmFjdG9yeSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcmVzZXREZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWYgPSBmYWN0b3J5LmNyZWF0ZVByZXNldCggdGhpcy5pZCwgY29udGV4dCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5mYWlsZWRXaGlsZUludm9raW5nUHJlc2V0RmFjdG9yeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsb2coIGNyZWF0ZUVycm9yU3RhdHVzKCBtc2csIGUgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZGVmICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RhdGljUHJlc2V0IHN0YXRpY1ByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgU3RhdGljUHJlc2V0KCB0aGlzLmlkLCB0aGlzLnBsdWdpbklkLCBkZWYuZ2V0TGFiZWwoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZi5nZXREZXNjcmlwdGlvbigpLCBudWxsLCBkZWYuZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljUHJlc2V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXRVc2VzVW5rbm93bkZhY2V0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXRVc2VzVW5rbm93bkZhY2V0VmVyc2lvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZVByZXNldE5vdEZvdW5kOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjeWNsZURldGVjdGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRXaGlsZUludm9raW5nUHJlc2V0RmFjdG9yeTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFByZXNldHNFeHRlbnNpb25Qb2ludC5jbGFzcy5nZXROYW1lKCksIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczIH0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0IH0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1ByZXNldHNFeHRlbnNpb25Qb2ludC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJlc2V0c0V4dGVuc2lvblBvaW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWY2N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJlc2V0c0V4dGVuc2lvblBvaW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXByZXNldFVzZXNVbmtub3duRmFjZXQgPSBQcmVzZXQgezB9IGluIHBsdWdpbiB7MX0gdXNlcyB1bmtub3duIGZhY2V0ICJ7Mn0iLgotcHJlc2V0VXNlc1Vua25vd25GYWNldFZlcnNpb24gPSBQcmVzZXQgezB9IGluIHBsdWdpbiB7MX0gdXNlcyB1bmtub3duIHZlcnNpb24gInszfSIgb2YgZmFjZXQgInsyfSIuCi1iYXNlUHJlc2V0Tm90Rm91bmQgPSBQcmVzZXQgezB9IGluIHBsdWdpbiB7MX0gc3BlY2lmaWVzIGJhc2UgcHJlc2V0ICJ7Mn0iIHdoaWNoIGRvZXMgbm90IGV4aXN0LgotY3ljbGVEZXRlY3RlZCA9IEN5Y2xlIGRldGVjdGVkIGFtb25nIHRoZXNlIHByZXNldHM6IHswfQotZmFpbGVkV2hpbGVJbnZva2luZ1ByZXNldEZhY3RvcnkgPSBGYWlsZWQgd2hpbGUgaW52b2tpbmcgcHJlc2V0IGZhY3RvcnkgInswfSIuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRjOGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5NaXNjVXRpbC5lcXVhbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVmYXVsdFZlcnNpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5WZXJzaW9uYWJsZTsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPklQcm9qZWN0RmFjZXQ8L2NvZGU+IGludGVyZmFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RGYWNldCAKLQotICAgIGV4dGVuZHMgVmVyc2lvbmFibGU8SVByb2plY3RGYWNldFZlcnNpb24+Ci0gICAgaW1wbGVtZW50cyBJUHJvamVjdEZhY2V0IAotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIHBsdWdpbjsKLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIElDYXRlZ29yeSBjYXRlZ29yeTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SUFjdGlvbkRlZmluaXRpb24+IGFjdGlvbkRlZmluaXRpb25zOwotICAgIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gZGVmYXVsdFZlcnNpb247Ci0gICAgcHJpdmF0ZSBJRGVmYXVsdFZlcnNpb25Qcm92aWRlciBkZWZhdWx0VmVyc2lvblByb3ZpZGVyOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcHJvcGVydGllc1JlYWRPbmx5OwotICAgIAotICAgIFByb2plY3RGYWNldCgpIAotICAgIHsKLSAgICAgICAgdGhpcy5hY3Rpb25EZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCk7Ci0gICAgICAgIHRoaXMucHJvcGVydGllc1JlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCB0aGlzLnByb3BlcnRpZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFBsdWdpbklkKCBmaW5hbCBTdHJpbmcgcGx1Z2luICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRMYWJlbCggZmluYWwgU3RyaW5nIGxhYmVsICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXREZXNjcmlwdGlvbiggZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDYXRlZ29yeSBnZXRDYXRlZ29yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRDYXRlZ29yeSggZmluYWwgSUNhdGVnb3J5IGNhdGVnb3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9ucy5hZGQoIHZlci5nZXRWZXJzaW9uU3RyaW5nKCksIHZlciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0TGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiggZmluYWwgSVJ1bnRpbWUgciApCi0gICAgewotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZ2V0U29ydGVkVmVyc2lvbnMoIGZhbHNlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggci5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZ2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGRlZnZlciA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5kZWZhdWx0VmVyc2lvblByb3ZpZGVyICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZ2ZXIgPSB0aGlzLmRlZmF1bHRWZXJzaW9uUHJvdmlkZXIuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZGVmdmVyICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBkZWZ2ZXIuZ2V0UHJvamVjdEZhY2V0KCkgIT0gdGhpcyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMudmVyc2lvblByb3ZpZGVyUmV0dXJuZWRXcm9uZ1ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLQotICAgICAgICAgICAgICAgICAgICBkZWZ2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGRlZnZlciA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZ2ZXIgPSBnZXRMYXRlc3RWZXJzaW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBkZWZ2ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmVyc2lvbjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldERlZmF1bHRWZXJzaW9uKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICB0aGlzLmRlZmF1bHRWZXJzaW9uID0gZnY7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFZlcnNpb25Qcm92aWRlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0RGVmYXVsdFZlcnNpb25Qcm92aWRlciggSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIgcHJvdmlkZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0VmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFZlcnNpb25Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIENsYXNzIHR5cGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoIHRoaXMsIHR5cGUuZ2V0TmFtZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlVmVyc2lvbk5vdEZvdW5kRXJyTXNnKCBmaW5hbCBTdHJpbmcgdmVyc3RyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOTFMuYmluZCggRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLlJlc291cmNlcy5mYWNldFZlcnNpb25Ob3REZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQsIHZlcnN0ciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWFwPFN0cmluZyxPYmplY3Q+IGdldFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllc1JlYWRPbmx5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldCggbmFtZSApOwotICAgIH0KLQotICAgIHZvaWQgc2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KCBuYW1lLCB2YWx1ZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25IaWRkZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuICggdGhpcy52ZXJzaW9ucy5zaXplKCkgPT0gMSAmJgotICAgICAgICAgICAgICAgICBlcXVhbCggZ2V0UHJvcGVydHkoIFBST1BfSElERV9WRVJTSU9OICksIHRydWUgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLSAgICAKLSAgICBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElBY3Rpb25EZWZpbml0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJQWN0aW9uRGVmaW5pdGlvbiBkZWYgOiB0aGlzLmFjdGlvbkRlZmluaXRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGRlZi5nZXRWZXJzaW9uRXhwcigpLmNoZWNrKCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBkZWYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRBY3Rpb25EZWZpbml0aW9uKCBmaW5hbCBBY3Rpb25EZWZpbml0aW9uIGFjdGlvbkRlZmluaXRpb24gKQotICAgIHsKLSAgICAgICAgdGhpcy5hY3Rpb25EZWZpbml0aW9ucy5hZGQoIGFjdGlvbkRlZmluaXRpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uUHJvdmlkZXJSZXR1cm5lZFdyb25nVmVyc2lvbjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFByb2plY3RGYWNldC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTZmMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi12ZXJzaW9uUHJvdmlkZXJSZXR1cm5lZFdyb25nVmVyc2lvbiA9IFZlcnNpb24gcHJvdmlkZXIgZm9yIGZhY2V0IHswfSByZXR1cm5lZCB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgZmFjZXQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGIxZDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLnJlcG9ydE1pc3NpbmdBdHRyaWJ1dGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlZlcnNpb25FeHByOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0RmFjZXRSZWYKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdEZhY2V0IGY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uRXhwcjxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdmV4cHI7Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgUHJvamVjdEZhY2V0UmVmKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVZlcnNpb25FeHByIHZleHByICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIGYsIChWZXJzaW9uRXhwcjxJUHJvamVjdEZhY2V0VmVyc2lvbj4pIHZleHByICk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2plY3RGYWNldFJlZiggZmluYWwgSVByb2plY3RGYWNldCBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlcnNpb25FeHByPElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXhwciApCi0gICAgewotICAgICAgICB0aGlzLmYgPSBmOwotICAgICAgICB0aGlzLnZleHByID0gdmV4cHI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNWZXJzaW9uRXhwcigpCi0gICAgewotICAgICAgICByZXR1cm4gKCB0aGlzLnZleHByICE9IG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2soIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmYgPT0gZnYuZ2V0UHJvamVjdEZhY2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy52ZXhwciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52ZXhwci5jaGVjayggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrKCBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGZhY2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjaGVjayggZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0RmFjZXRSZWYgcmVhZCggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0KLSAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGlkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwucmVwb3J0TWlzc2luZ0ZhY2V0KCBpZCwgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHYgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4gdmV4cHIgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoIHYgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB2ZXhwciA9IG5ldyBWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPiggZiwgdiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0RmFjZXRSZWYoIGYsIHZleHByICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMudmV4cHIgPT0gbnVsbCB8fCAoIChQcm9qZWN0RmFjZXQpIHRoaXMuZiApLmlzVmVyc2lvbkhpZGRlbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZi5nZXRMYWJlbCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHRoaXMudmV4cHIuaXNTaW5nbGVWZXJzaW9uTWF0Y2goKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLmV4YWN0VmVyc2lvbiwgdGhpcy5mLmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmV4cHIudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHRoaXMudmV4cHIuaXNTaW1wbGVBbGxvd05ld2VyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy5hbGxvd05ld2VyLCB0aGlzLmYuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXhwci5nZXRGaXJzdFZlcnNpb24oKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHRoaXMudmV4cHIuaXNXaWxkY2FyZCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCBSZXNvdXJjZXMud2lsZGNhcmQsIHRoaXMuZi5nZXRMYWJlbCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy52ZXJzaW9uRXhwciwgdGhpcy5mLmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmV4cHIudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhY3RWZXJzaW9uOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhbGxvd05ld2VyOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB3aWxkY2FyZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkV4cHI7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBQcm9qZWN0RmFjZXRSZWYuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRSZWYucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFJlZi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODRjOTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFJlZi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1leGFjdFZlcnNpb24gPSB7MH0gezF9Ci1hbGxvd05ld2VyID0gezB9IHsxfSBvciBuZXdlcgotd2lsZGNhcmQgPSBhbnkgdmVyc2lvbiBvZiB7MH0KLXZlcnNpb25FeHByID0gezB9IHdpdGggdmVyc2lvbiBtYXRjaGluZyBleHByZXNzaW9uICJ7MX0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRWZXJzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMWNlMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0VmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlZlcnNpb25hYmxlOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SVByb2plY3RGYWNldFZlcnNpb248L2NvZGU+IGludGVyZmFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RGYWNldFZlcnNpb24gCi0KLSAgICBpbXBsZW1lbnRzIElQcm9qZWN0RmFjZXRWZXJzaW9uCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBQcm9qZWN0RmFjZXQgZmFjZXQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLSAgICBwcml2YXRlIElDb25zdHJhaW50IGNvbnN0cmFpbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luOwotICAgIHByaXZhdGUgTWFwPElQcm9qZWN0RmFjZXRWZXJzaW9uLEludGVnZXI+IGNvbXBUYWJsZSA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBwcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgCi0gICAgUHJvamVjdEZhY2V0VmVyc2lvbigpIAotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoIHRoaXMucHJvcGVydGllcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFByb2plY3RGYWNldCggZmluYWwgUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0VmVyc2lvblN0cmluZyggZmluYWwgU3RyaW5nIHZlcnNpb24gKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFZlcnNpb25hYmxlPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRWZXJzaW9uYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbnN0cmFpbnQgZ2V0Q29uc3RyYWludCgpCi0gICAgewotICAgICAgICBpZiggdGhpcy5jb25zdHJhaW50ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCggdGhpcywgSUNvbnN0cmFpbnQuVHlwZS5BTkQsIG5ldyBPYmplY3RbIDAgXSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldENvbnN0cmFpbnQoIGZpbmFsIElDb25zdHJhaW50IGNvbnN0cmFpbnQgKQotICAgIHsKLSAgICAgICAgdGhpcy5jb25zdHJhaW50ID0gY29uc3RyYWludDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW47Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UGx1Z2luSWQoIGZpbmFsIFN0cmluZyBwbHVnaW4gKQotICAgIHsKLSAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0Q29tcGFyaXNvblRhYmxlKCBmaW5hbCBNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4gY29tcFRhYmxlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcFRhYmxlID0gY29tcFRhYmxlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCBnZXRBY3Rpb25EZWZpbml0aW9uSW50ZXJuYWwoIGJhc2UsIHR5cGUgKSAhPSBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKCBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QWN0aW9uRGVmaW5pdGlvbiggdHlwZSApICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElBY3Rpb25EZWZpbml0aW9uPiBnZXRBY3Rpb25EZWZpbml0aW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldC5nZXRBY3Rpb25EZWZpbml0aW9ucyggdGhpcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElBY3Rpb25EZWZpbml0aW9uPiBnZXRBY3Rpb25EZWZpbml0aW9ucyggZmluYWwgQWN0aW9uLlR5cGUgdHlwZSApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElBY3Rpb25EZWZpbml0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJQWN0aW9uRGVmaW5pdGlvbiBkZWYgOiBnZXRBY3Rpb25EZWZpbml0aW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGRlZi5nZXRBY3Rpb25UeXBlKCkgPT0gdHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggZGVmICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcmVzdWx0LnNpemUoKSA+IDEgJiYgdHlwZSAhPSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMubXVsdGlwbGVBY3Rpb25EZWZpbml0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2V0LmdldElkKCksIHRoaXMudmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ1dhcm5pbmcoIG1zZywgdHJ1ZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUFjdGlvbkRlZmluaXRpb24gZ2V0QWN0aW9uRGVmaW5pdGlvbiggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJQWN0aW9uRGVmaW5pdGlvbiBkZWYgPSBnZXRBY3Rpb25EZWZpbml0aW9uSW50ZXJuYWwoIGJhc2UsIHR5cGUgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBkZWYgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmFjdGlvbk5vdFN1cHBvcnRlZCwgdG9TdHJpbmcoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUFjdGlvbkRlZmluaXRpb24gZ2V0QWN0aW9uRGVmaW5pdGlvbkludGVybmFsKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJQWN0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBnZXRBY3Rpb25EZWZpbml0aW9ucyggdHlwZSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGRlZmluaXRpb25zLnNpemUoKSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnJvbVZlcnNpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24geCA6IGJhc2UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHguZ2V0UHJvamVjdEZhY2V0KCkgPT0gdGhpcy5mYWNldCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyb21WZXJzaW9uID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmcm9tVmVyc2lvbiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciggSUFjdGlvbkRlZmluaXRpb24gZGVmIDogZGVmaW5pdGlvbnMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoSVZlcnNpb25FeHByKSBkZWYuZ2V0UHJvcGVydHkoIElBY3Rpb25EZWZpbml0aW9uLlBST1BfRlJPTV9WRVJTSU9OUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIgPT0gbnVsbCB8fCB2ZXhwci5jaGVjayggZnJvbVZlcnNpb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5pdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTZXQgZGVmaW5pdGlvbnMgPSBnZXRBY3Rpb25EZWZpbml0aW9ucyggdHlwZSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGRlZmluaXRpb25zLnNpemUoKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKElBY3Rpb25EZWZpbml0aW9uKSBkZWZpbml0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQWN0aW9uQ29uZmlnKCBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGpuYW1lICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggISBzdXBwb3J0cyggdHlwZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuYWN0aW9uTm90U3VwcG9ydGVkLCB0b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSUFjdGlvbkRlZmluaXRpb24gZGVmID0gZ2V0QWN0aW9uRGVmaW5pdGlvbiggdHlwZSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGRlZiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmLmNyZWF0ZUNvbmZpZ09iamVjdCggdGhpcywgcGpuYW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhbWVBY3Rpb25Db25maWcoIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuICggKFByb2plY3RGYWNldFZlcnNpb24pIGZ2ICkuZ2V0QWN0aW9uRGVmaW5pdGlvbiggdHlwZSApID09IGdldEFjdGlvbkRlZmluaXRpb24oIHR5cGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEZvciggZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkICkKLSAgICB7Ci0gICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogZml4ZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5mYWNldCA9PSBmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBmaXhlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY29uZmxpY3RzV2l0aEFsbFZlcnNpb25zID0gdHJ1ZTsKLQotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGYuZ2V0VmVyc2lvbnMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgY29uZmxpY3RzV2l0aCggZnYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25mbGljdHNXaXRoQWxsVmVyc2lvbnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY29uZmxpY3RzV2l0aEFsbFZlcnNpb25zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25mbGljdHNXaXRoKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBpZiggdGhpcyA9PSBmdiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0aGlzLmZhY2V0ID09IGZ2LmdldFByb2plY3RGYWNldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29uZmxpY3RzV2l0aCggZnYsIGdldENvbnN0cmFpbnQoKSApIHx8IAotICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0c1dpdGgoIHRoaXMsIGZ2LmdldENvbnN0cmFpbnQoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb25mbGljdHNXaXRoKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgb3AgKQotICAgIHsKLSAgICAgICAgaWYoIG9wLmdldFR5cGUoKSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggT2JqZWN0IG9wZXJhbmQgOiBvcC5nZXRPcGVyYW5kcygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggY29uZmxpY3RzV2l0aCggZnYsIChJQ29uc3RyYWludCkgb3BlcmFuZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9wLmdldFR5cGUoKSA9PSBJQ29uc3RyYWludC5UeXBlLk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhbGxCcmFuY2hlc0NvbmZsaWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBPYmplY3Qgb3BlcmFuZCA6IG9wLmdldE9wZXJhbmRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIGNvbmZsaWN0c1dpdGgoIGZ2LCAoSUNvbnN0cmFpbnQpIG9wZXJhbmQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhbGxCcmFuY2hlc0NvbmZsaWN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGFsbEJyYW5jaGVzQ29uZmxpY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggb3AuZ2V0VHlwZSgpID09IElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpcnN0T3BlcmFuZCA9IG9wLmdldE9wZXJhbmQoIDAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZpcnN0T3BlcmFuZCBpbnN0YW5jZW9mIElHcm91cCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUdyb3VwIGdyb3VwID0gKElHcm91cCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIHJldHVybiBncm91cC5nZXRNZW1iZXJzKCkuY29udGFpbnMoIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gKElQcm9qZWN0RmFjZXQpIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgPSAoSVZlcnNpb25FeHByKSBvcC5nZXRPcGVyYW5kKCAxICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGZ2LmdldFByb2plY3RGYWNldCgpID09IGYgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHZleHByLmNoZWNrKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9wLmdldFR5cGUoKSA9PSBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQm9vbGVhbiBzb2Z0Ci0gICAgICAgICAgICAgICAgPSAoQm9vbGVhbikgb3AuZ2V0T3BlcmFuZCggb3AuZ2V0T3BlcmFuZHMoKS5zaXplKCkgLSAxICk7Ci0gICAgICAgIAotICAgICAgICAgICAgaWYoIHNvZnQuZXF1YWxzKCBCb29sZWFuLlRSVUUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBmaXJzdE9wZXJhbmQgPSBvcC5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb25mbGljdHNXaXRoQWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZmlyc3RPcGVyYW5kIGluc3RhbmNlb2YgSUdyb3VwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElHcm91cCBncm91cCA9IChJR3JvdXApIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gbWVtYmVyIDogZ3JvdXAuZ2V0TWVtYmVycygpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgbWVtYmVyLmNvbmZsaWN0c1dpdGgoIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0c1dpdGhBbGwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IHJmID0gKElQcm9qZWN0RmFjZXQpIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVZlcnNpb25FeHByIHZleHByID0gKElWZXJzaW9uRXhwcikgb3AuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXhwcnN0ciA9IHZleHByLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gcmZ2IDogcmYuZ2V0VmVyc2lvbnMoIHZleHByc3RyICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHJmdi5jb25mbGljdHNXaXRoKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0c1dpdGhBbGwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZsaWN0c1dpdGhBbGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oIGZpbmFsIE9iamVjdCBvYmogKQotICAgIHsKLSAgICAgICAgaWYoIG9iaiA9PSB0aGlzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBvYmogaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0VmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSAhPSB0aGlzLmZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5jYW5ub3RDb21wYXJlVmVyc2lvbnNPZkRpZmZlcmVudEZhY2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWNldC5nZXRJZCgpLCB0aGlzLnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggbXNnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgY2FjaGVkUmVzdWx0ID0gdGhpcy5jb21wVGFibGUuZ2V0KCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2FjaGVkUmVzdWx0ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gY29tcCA9IHRoaXMuZmFjZXQuZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKTsKLSAgICAgICAgICAgIHJldHVybiBjb21wLmNvbXBhcmUoIHRoaXMudmVyc2lvbiwgKCAoSVZlcnNpb24pIG9iaiApLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KCBuYW1lICk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoIG5hbWUsIHZhbHVlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuZmFjZXQuaXNWZXJzaW9uSGlkZGVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldC5nZXRMYWJlbCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXQuZ2V0TGFiZWwoKSArICIgIiArIHRoaXMudmVyc2lvbjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5vdFN1cHBvcnRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbXVsdGlwbGVBY3Rpb25EZWZpbml0aW9uczsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90Q29tcGFyZVZlcnNpb25zT2ZEaWZmZXJlbnRGYWNldHM7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBQcm9qZWN0RmFjZXRWZXJzaW9uLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczIH0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0IH0gKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0VmVyc2lvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0VmVyc2lvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdiMmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFZlcnNpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYWN0aW9uTm90U3VwcG9ydGVkID0gUHJvamVjdCBmYWNldCB7MH0gZG9lcyBub3Qgc3VwcG9ydCBhY3Rpb24gdHlwZSB7MX0uCi1tdWx0aXBsZUFjdGlvbkRlZmluaXRpb25zID0gTW9yZSB0aGFuIG9uZSBkZWNsYXJhdGlvbiBmb3VuZCBmb3IgYWN0aW9uIHR5cGUgezJ9IG9mIHByb2pldCBmYWNldCB7MH0gezF9LgotCi1jYW5ub3RDb21wYXJlVmVyc2lvbnNPZkRpZmZlcmVudEZhY2V0cyA9IFwKLSAgQ2Fubm90IGNvbXBhcmUgdmVyc2lvbnMgb2YgZGlmZmVyZW50IGZhY2V0cyB0byBlYWNoIG90aGVyLiBBdHRlbXB0ZWQgdG8gXAotICBjb21wYXJlIHZlcnNpb24gezF9IG9mIGZhY2V0IHswfSB3aXRoIHZlcnNpb24gezN9IG9mIGZhY2V0IHsyfS4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFR5cGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRUeXBlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODg5MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFR5cGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5yZXBvcnRNaXNzaW5nQXR0cmlidXRlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb25FeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbC5SdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlZlcnNpb25FeHByOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ29tcG9uZW50VHlwZVJlZgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uRXhwcjxJUnVudGltZUNvbXBvbmVudFZlcnNpb24+IHZleHByOwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVZlcnNpb25FeHByIHZleHByICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIHJjdCwgKFZlcnNpb25FeHByPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4pIHZleHByICk7Ci0gICAgfQotCi0gICAgcHVibGljIFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVyc2lvbkV4cHI8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiB2ZXhwciApCi0gICAgewotICAgICAgICB0aGlzLnJjdCA9IHJjdDsKLSAgICAgICAgdGhpcy52ZXhwciA9IHZleHByOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVjayggZmluYWwgU2V0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gcmN2cyApCi0gICAgewotICAgICAgICBmb3IoIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgOiByY3ZzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMucmN0ID09IHJjdi5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdGhpcy52ZXhwciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZleHByLmNoZWNrKCByY3YgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUnVudGltZUNvbXBvbmVudFR5cGVSZWYgcmVhZCggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLQotICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9JRCApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIFJ1bnRpbWVNYW5hZ2VyLmlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCBpZCApICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnJlcG9ydE1pc3NpbmdSdW50aW1lQ29tcG9uZW50VHlwZSggaWQsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdCA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCBpZCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHYgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgVmVyc2lvbkV4cHI8UnVudGltZUNvbXBvbmVudFZlcnNpb24+IHZleHByID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB2ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2ZXhwciA9IG5ldyBWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4oIHJjdCwgdiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lQ29tcG9uZW50VHlwZVJlZiggcmN0LCB2ZXhwciApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1VzZXJQcmVzZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1VzZXJQcmVzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MTE2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Vc2VyUHJlc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BzZWUgSVByZXNldH0gaW50ZXJmYWNlIHRoYXQncyB1c2VkIGZvciB1c2VyLWRlZmluZWQgcHJlc2V0cy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFVzZXJQcmVzZXQKLQotICAgIGltcGxlbWVudHMgSVByZXNldAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHM7Ci0gICAgCi0gICAgcHVibGljIFVzZXJQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkgCi0gICAgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB0aGlzLmZhY2V0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBmYWNldHMgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUeXBlLlVTRVJfREVGSU5FRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVmFsaWRhdGlvblByb2JsZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1ZhbGlkYXRpb25Qcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzA5YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVmFsaWRhdGlvblByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblByb2JsZW0gCi0KLSAgICBleHRlbmRzIFN0YXR1cwotICAgIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZQotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIFJFUVVJUkVTIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnJlcXVpcmVzICk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgUkVRVUlSRVNfT05FX09GX1RXTwotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnJlcXVpcmVzT25lT2ZUd28gKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBSRVFVSVJFU19HUk9VUAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnJlcXVpcmVzR3JvdXAgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ09ORkxJQ1RTIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLm9uZW9mICk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ09NUExFWCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy5jb21wbGV4ICk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgSU5TVEFMTF9OT1RfU1VQUE9SVEVEIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLmluc3RhbGxOb3RTdXBwb3J0ZWQgKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBVTklOU1RBTExfTk9UX1NVUFBPUlRFRCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy51bmluc3RhbGxOb3RTdXBwb3J0ZWQgKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBWRVJTSU9OX0NIQU5HRV9OT1RfU1VQUE9SVEVEIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnZlcnNpb25DaGFuZ2VOb3RTdXBwb3J0ZWQgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgTVVMVElQTEVfQUNUSU9OU19OT1RfU1VQUE9SVEVEIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLm11bHRpcGxlQWN0aW9uc05vdFN1cHBvcnRlZCApOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBGQUNFVF9BTFJFQURZX0lOU1RBTExFRCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy5mYWNldEFscmVhZHlJbnN0YWxsZWQgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ0FOTk9UX1VOSU5TVEFMTCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy5jYW5ub3RVbmluc3RhbGwgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ0FOTk9UX0NIQU5HRV9WRVJTSU9OCi0gICAgICAgICAgICA9IG5ldyBUeXBlKCBSZXNvdXJjZXMuY2Fubm90Q2hhbmdlVmVyc2lvbiApOwotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtc2c7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFR5cGUoIGZpbmFsIFN0cmluZyBtc2cgKSAKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlVGVtcGxhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5tc2c7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBwYXJhbXM7Ci0gICAgCi0gICAgcHVibGljIFZhbGlkYXRpb25Qcm9ibGVtKCBmaW5hbCBUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbXMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIEVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBmb3JtYXQoIHR5cGUsIHBhcmFtcyApLCAKLSAgICAgICAgICAgICAgIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVmFsaWRhdGlvblByb2JsZW0oIGZpbmFsIFR5cGUgdHlwZSApCi0gICAgewotICAgICAgICB0aGlzKCB0eXBlLCBuZXcgT2JqZWN0WyAwIF0gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblByb2JsZW0oIGZpbmFsIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbSApCi0gICAgewotICAgICAgICB0aGlzKCB0eXBlLCBuZXcgT2JqZWN0W10geyBwYXJhbSB9ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBWYWxpZGF0aW9uUHJvYmxlbSggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbTIgKQotICAgIHsKLSAgICAgICAgdGhpcyggdHlwZSwgbmV3IE9iamVjdFtdIHsgcGFyYW0xLCBwYXJhbTIgfSApOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0aW9uUHJvYmxlbSggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyYW0zICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIHR5cGUsIG5ldyBPYmplY3RbXSB7IHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMgfSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRQYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmogKQotICAgIHsKLSAgICAgICAgaWYoICEgKCBvYmogaW5zdGFuY2VvZiBWYWxpZGF0aW9uUHJvYmxlbSApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvblByb2JsZW0gcHJvYiA9IChWYWxpZGF0aW9uUHJvYmxlbSkgb2JqOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVxdWFscyggcHJvYi50eXBlICkgJiYKLSAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKCB0aGlzLnBhcmFtcywgcHJvYi5wYXJhbXMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgCWludCBoYXNoID0gMDsKLSAgICAgICAgCi0gICAgCWZvciggaW50IGkgPSAwOyBpIDwgdGhpcy5wYXJhbXMubGVuZ3RoOyBpKysgKSAKLSAgICAgICAgewotCQkJaGFzaCA9IGhhc2ggXiB0aGlzLnBhcmFtc1sgaSBdLmhhc2hDb2RlKCk7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzLnR5cGUuaGFzaENvZGUoKSBeIGhhc2g7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdCggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtcyApCi0gICAgewotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIHR5cGUuZ2V0TWVzc2FnZVRlbXBsYXRlKCksIHBhcmFtcyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXF1aXJlczsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZXNPbmVPZlR3bzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZXNHcm91cDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgb25lb2Y7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBsZXg7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxOb3RTdXBwb3J0ZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaW5zdGFsbE5vdFN1cHBvcnRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkNoYW5nZU5vdFN1cHBvcnRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbXVsdGlwbGVBY3Rpb25zTm90U3VwcG9ydGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldEFscmVhZHlJbnN0YWxsZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFVuaW5zdGFsbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90Q2hhbmdlVmVyc2lvbjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFZhbGlkYXRpb25Qcm9ibGVtLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9WYWxpZGF0aW9uUHJvYmxlbS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVmFsaWRhdGlvblByb2JsZW0ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMTAwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9WYWxpZGF0aW9uUHJvYmxlbS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcmVxdWlyZXMgPSB7MH0gcmVxdWlyZXMgezF9LgotcmVxdWlyZXNPbmVPZlR3byA9IHswfSByZXF1aXJlcyB7MX0gb3IgezJ9LgotcmVxdWlyZXNHcm91cCA9IHswfSByZXF1aXJlcyBhbnkgbWVtYmVyIG9mIHsxfS4KLW9uZW9mID0gezB9IGFuZCB7MX0gY2Fubm90IGJvdGggYmUgc2VsZWN0ZWQuCi1jb21wbGV4ID0gQ29uc3RyYWludHMgZm9yIHswfSBoYXZlIG5vdCBiZWVuIG1ldC4KLWluc3RhbGxOb3RTdXBwb3J0ZWQgPSB7MH0gezF9IGNhbm5vdCBiZSBpbnN0YWxsZWQuCi11bmluc3RhbGxOb3RTdXBwb3J0ZWQgPSB7MH0gezF9IGNhbm5vdCBiZSB1bmluc3RhbGxlZC4KLXZlcnNpb25DaGFuZ2VOb3RTdXBwb3J0ZWQgPSBDYW5ub3QgY2hhbmdlIHZlcnNpb24gb2YgcHJvamVjdCBmYWNldCB7MH0gdG8gezF9LgotbXVsdGlwbGVBY3Rpb25zTm90U3VwcG9ydGVkID0gTXVsdGlwbGUgYWN0aW9ucyBvbiB0aGUgc2FtZSBwcm9qZWN0IGZhY2V0IGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSBleGNlcHRpb24gaXMgYW4gdW5pbnN0YWxsIG9mIGEgcHJldmlvc2x5LWluc3RhbGxlZCB2ZXJzaW9uIGZvbGxvd2VkIGJ5IGFuIGluc3RhbGwgb2YgYSBuZXcgdmVyc2lvbi4KLWZhY2V0QWxyZWFkeUluc3RhbGxlZCA9IENhbm5vdCBpbnN0YWxsIHByb2plY3QgZmFjZXQgezB9IHsxfS4gU29tZSB2ZXJzaW9uIG9mIHRoaXMgcHJvamVjdCBmYWNldCBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLWNhbm5vdFVuaW5zdGFsbCA9IENhbm5vdCB1bmluc3RhbGwgcHJvamVjdCBmYWNldCB7MH0gezF9IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGluc3RhbGxlZC4KLWNhbm5vdENoYW5nZVZlcnNpb24gPSBDYW5ub3QgY2hhbmdlIHZlcnNpb24gb2YgcHJvamVjdCBmYWNldCB7MH0gdG8gezF9IGJlY2F1c2Ugbm8gdmVyc2lvbiBvZiB0aGlzIHByb2plY3QgZmFjZXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNDY4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY29uZmlndXJlZCBpbnN0YW5jZSBvZiBhIHJ1bnRpbWUuIEEgcnVudGltZSBpbnN0YW5jZSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSAKLSAqIHJ1bnRpbWUgY29tcG9uZW50cy4gCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvdXRzaWRlIG9mIHRoaXMgZnJhbWV3b3JrLiBDbGllbnQgY29kZSBjYW4gCi0gKiBnZXQgYWNjZXNzIHRvIDxjb2RlPklSdW50aW1lPC9jb2RlPiBvYmplY3RzIGJ5IHVzaW5nIG1ldGhvZHMgb24gdGhlIHtAc2VlIFJ1bnRpbWVNYW5hZ2VyfSAKLSAqIGNsYXNzLjwvcD4gIAotICogCi0gKiBAc2VlIFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkKLSAqIEBzZWUgUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZShTdHJpbmcpCi0gKiBAc2VlIFJ1bnRpZW1NYW5hZ2VyLmlzUnVudGltZURlZmluZWQoU3RyaW5nKQotICogQHNlZSBSdW50aW1lTWFuYWdlci5kZWZpbmVSdW50aW1lKFN0cmluZyxMaXN0PElSdW50aW1lQ29tcG9uZW50PixNYXA8U3RyaW5nLFN0cmluZz4pCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lCi0KLSAgICBleHRlbmRzIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcnVudGltZS4gVGhlIHJ1bnRpbWUgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIG5hbWUKLSAgICAgKiBvZiB0aGUgcnVudGltZSBhcyByZXR1cm5lZCBieSB0aGUge0BzZWUgZ2V0TmFtZSgpfSBtZXRob2QuIAotICAgICAqIAotICAgICAqIDxwPlRoZSBsb2NhbGl6ZWQgbmFtZSBzaG91bGQgYmUgdXNlZCBpbiBhbGwgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgdXNlciB3aGlsZSBhbGwgbWV0YWRhdGEgCi0gICAgICogcmVmZXJlbmNlcyB0byB0aGUgcnVudGltZSBzaG91bGQgdXNlIHRoZSB1bmxvY2FsaXplZCBuYW1lLiBOb3RlIHRoYXQgdGhlcmUgaXMgYW4gaW5oZXJlbnQgCi0gICAgICogZGFuZ2VyIGluIHRoaXMuIElmIGEgcnVudGltZSBpcyBkZWxldGVkIG9yIHJlbmFtZWQsIGV4aXN0aW5nIHByb2plY3RzIHRoYXQgdXNlIHRoYXQgcnVudGltZSAKLSAgICAgKiBtaWdodCBiZWNvbWUgaW52YWxpZC4gSW4gdGhhdCBjYXNlIHRoZSBzeXN0ZW0gd2lsbCBuZWVkIHRvIGNvbW11bmljYXRlIHRoYXQgcHJvYmxlbSB0byB0aGUgCi0gICAgICogdXNlciB1c2luZyB0aGUgdW5sb2NhbGl6ZWQgbmFtZSBmb3IgdGhlIHJ1bnRpbWUuIFNpbmNlIHRoZSB1c2VyIGlzIG5ldmVyIGV4cG9zZWQgdG8gcnVudGltZSdzIAotICAgICAqIHVubG9jYWxpemVkIG5hbWUsIHRoZSB1c2VyIGNhbiBoYXZlIHRyb3VibGUgdW5kZXJzdGFuZGluZyBhbmQgY29ycmVjdGluZyB0aGUgcHJvYmxlbS4gQQotICAgICAqIHNpbWlsYXIgc2l0dWF0aW9uIGNhbiBhcmlzZSB3aGVuIGEgcHJvamVjdCBpcyBpbXBvcnRlZCBpbnRvIGFub3RoZXIgdXNlcidzIHdvcmtzcGFjZS48L3A+Ci0gICAgICogCi0gICAgICogPHA+VG8gbWl0aWdhdGUgdGhlIGFib3ZlIHJpc2tzLCB0aGUgbmFtZSBsb2NhbGl6YXRpb24gZmVhdHVyZSBpcyBleHBlY3RlZCB0byBiZSB1c2VkIAotICAgICAqIHNwYXJpbmdseSBhbmQgb25seSBpbiBjb250ZXh0cyB3aGVyZSB0aGUgcnVudGltZSBwcm92aWRlciBjYW4gdGFrZSBzdGVwcyB0byBndWFyYW50ZWUgdGhhdAotICAgICAqIHRoZSBhYm92ZSBzaXR1YXRpb24gaXMgbm90IGxpa2VseSB0byBvY2N1ci4gT25lIHNjZW5hcmlvIHdoZXJlIG5hbWUgbG9jYWxpemF0aW9uIGlzCi0gICAgICogYWNjZXB0YWJsZSBpcyB3aGVuIGEgcnVudGltZSBpcyBhdXRvLWNyZWF0ZWQgYW5kIHRoZSB1c2VyIGlzIG5vdCBnaXZlbiBhYmlsaXR5IHRvIGRlbGV0ZSBvcgotICAgICAqIHJlbmFtZSBpdC48L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBydW50aW1lCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldExvY2FsaXplZE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygb3RoZXIgbmFtZXMgKGlmIGFueSkgdGhhdCB0aGlzIHJ1bnRpbWUgbWF5IGJlIGtub3duIGJ5LiBUaGUgbG9jYWxpemVkCi0gICAgICogbmFtZSAoaWYgc3BlY2lmaWVkKSB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIGFsdGVybmF0ZSBuYW1lcyBzZXQuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhbHRlcm5hdGUgbmFtZXMgZm9yIHRoaXMgcnVudGltZSBvciBhbiBlbXB0eSBzZXQKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgCi0gICAgU2V0PFN0cmluZz4gZ2V0QWx0ZXJuYXRlTmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHJ1bnRpbWUuIE5vdGUgdGhhdCB0aGUKLSAgICAgKiBvcmRlciBpcyBpbXBvcnRhbnQgc2luY2UgZm9yIHNvbWUgb3BlcmF0aW9ucyBjb21wb25lbnRzIGFyZSBjb25zb2x1dGVkCi0gICAgICogaW4gb3JkZXIgYW5kIHRoZSBmaXJzdCBvbmUgY2FwYWJsZSBvZiBwZXJmb3JtaW5nIHRoZSBvcGVhdGlvbiB3aW5zLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZSBjb21wb25lbnQuIFRoZQotICAgICAqIGNvbnRlbnRzIHdpbGwgdmFyeSBkZXBlbmRlbmRpbmcgb24gaG93IHRoZSBydW50aW1lIHdhcyBjcmVhdGVkIGFuZCB3aGF0Ci0gICAgICogY29tcG9uZW50IHR5cGVzL3ZlcnNpb25zIGl0J3MgY29tcHJpc2VkIG9mLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZQotICAgICAqLwotICAgIAotICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRQcm9wZXJ0eSggU3RyaW5nIG5hbWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBydW50aW1lIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldC4KLSAgICAgKiBUaGUgcnVudGltZSBzdXBwb3J0cyBhIHByb2plY3QgZmFjZXQgaWYgYW55IG9mIGl0J3MgY29tcG9uZW50cyBzdXBwb3J0Ci0gICAgICogdGhlIHByb2plY3QgZmFjZXQuIFRoZSBzdXBwb3J0IG1hcHBpbmdzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlCi0gICAgICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZTwvY29kZT4gZXh0ZW5zaW9uCi0gICAgICogcG9pbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZ2IHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcnVudGltZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGZhY2V0LAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIGJvb2xlYW4gc3VwcG9ydHMoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgYm9vbGVhbiBzdXBwb3J0cyggSVByb2plY3RGYWNldCBmICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjZXRzIChhbmQgdGhlIHZlcnNpb25zKSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IAotICAgICAqIHdoZW4gdGhpcyBydW50aW1lIGlzIHNlbGVjdGVkLiBUaGlzIGluZm9ybWF0aW9uIGlzIGRyYXduIGZyb20gd2hhdCdzCi0gICAgICogc3BlY2lmaWVkIHRocm91Z2ggdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHM8L2NvZGU+Ci0gICAgICogZXh0ZW5zaW9uIHBvaW50LiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBmaWx0ZXJlZCBieSByZW1vdmluZyBmYWNldHMgdGhhdAotICAgICAqIHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIHNwZWNpZmllZCBmaXhlZCBmYWNldHMuIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgCi0gICAgICogc2V0IHdpbGwgYWx3YXlzIGluY2x1ZGUgdGhlIGZpeGVkIGZhY2V0cy4gSWYgdGhlIGRlZmF1bHQgdmVyc2lvbiBmb3IgYW55IAotICAgICAqIGZpeGVkIGZhY2V0IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCB0aHJvdWdoIHRoZSBhYm92ZSBleHRlbnNpb24gCi0gICAgICogcG9pbnQsIHRoZSBsYXRlc3QgdmVyc2lvbiB3aWxsIGJlIHVzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpeGVkIHRoZSBmaXhlZCBmYWNldHMKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZhY2V0cwotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgZm9yIGFueSByZWFzb24KLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSBpbnN0ZWFkCi0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXREZWZhdWx0RmFjZXRzKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIG51bWJlciBvZiBydW50aW1lLXNwZWNpZmljIGNoZWNrcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHJ1bnRpbWUKLSAgICAgKiBpbnN0YW5jZSBpcyB2YWxpZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vbml0b3IgdXNlZCBmb3IgZ2V0dGluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiBhbmQgY2FuY2VsaW5nIHZhbGlkYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdmFsaWRhdGlvbgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBJU3RhdHVzIHZhbGlkYXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVCcmlkZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5YzMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGV4dGVuc2lvbnMgd2lzaGluZyB0byBleHBvc2UgcnVudGltZXMgZGVmaW5lZAotICogdGhyb3VnaCBvdGhlciBtZWFucyB0byB0aGUgcHJvamVjdCBmYWNldHMgZnJhbWV3b3JrLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lQnJpZGdlCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIG5hbWVzIGZvciBydW50aW1lcyB0aGF0IHRoaXMgYnJpZGdlIHdhbnRzIHRvIGV4cG9ydC4KLSAgICAgKiBUaGUgc3lzdGVtIHdpbGwgdHJ5IHRvIGFjY29tbW9kYXRlIHRoZXNlIG5hbWUgY2hvaWNlcywgYnV0IG1heSBoYXZlIHRvCi0gICAgICogZGlzYW1iaWd1YXRlIG5hbWVzIGR1ZSB0byBjb2xsaXNpb25zLiBIb3dldmVyLCBldmVuIGlmIHRoZSBydW50aW1lIG5hbWUKLSAgICAgKiBpcyBjaGFuZ2VkLCB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgcGFzc2VkIGludG8gdGhlIHtAc2VlIGJyaWRnZShTdHJpbmcpfQotICAgICAqIGNhbGwgd2lsbCBiZSB0aGUgb3JpZ2luYWwgbmFtZSBwcm92aWRlZCBieSB0aGlzIG1ldGhvZCBjYWxsLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgbmFtZXMgZm9yIHJ1bnRpbWVzIHRoYXQgdGhpcyBicmlkZ2Ugd2FudHMgdG8gZXhwb3J0Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSBicmlkZ2luZwotICAgICAqLwotICAgIAotICAgIFNldDxTdHJpbmc+IGdldEV4cG9ydGVkUnVudGltZU5hbWVzKCkKLSAgICAgICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHViIHRoYXQgcmVwcmVzZW50cyB0aGUgYnJpZGdlZCBydW50aW1lLiBUaGUgc3lzdGVtIHdpbGwKLSAgICAgKiB3cmFwIHRoaXMgc3R1YiBhbmQgZXhwb3NlIGl0IHRvIHRoZSBjbGllbnRzIHRocm91Z2ggdGhlIHtAc2VlIElSdW50aW1lfQotICAgICAqIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYnJpZGdlZCBydW50aW1lIChhcyByZXR1cm5lZCBieSB0aGUKLSAgICAgKiAgIHtAc2VlIGdldEV4cG9ydGVkUnVudGltZU5hbWVzKCl9KSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIGEgc3R1YiB0aGF0IHJlcHJlc2VudHMgdGhlIGJyaWRnZWQgcnVudGltZQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgYnJpZGdpbmcKLSAgICAgKi8KLSAgICAKLSAgICBJU3R1YiBicmlkZ2UoIFN0cmluZyBuYW1lICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIHNpbmdsZSBicmlkZ2VkIHJ1bnRpbWUuIFRoZSBzeXN0ZW0gd2lsbCB3cmFwIHRoaXMgaW50ZXJmYWNlCi0gICAgICogYW5kIGV4cG9zZSBpdCB0byBjbGllbnRzIGFzIHtAc2VlIElSdW50aW1lfS4gQWxsIHJlbGV2YW50IGNhbGxzIHdpbGwgYmUKLSAgICAgKiBkZWxlZ2F0ZWQgdG8gdGhpcyBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gICAgICovCi0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElTdHViCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcnVudGltZSBjb21wb25lbnRzIHRoYXQgY29tcHJpc2UgdGhpcyBydW50aW1lLiBOb3RlIHRoYXQgCi0gICAgICAgICAqIHRoZSBvcmRlciBpcyBpbXBvcnRhbnQgc2luY2UgZm9yIHNvbWUgb3BlcmF0aW9ucyBjb21wb25lbnRzIGFyZSAKLSAgICAgICAgICogY29uc3VsdGVkIGluIG9yZGVyIGFuZCB0aGUgZmlyc3Qgb25lIGNhcGFibGUgb2YgcGVyZm9ybWluZyB0aGUKLSAgICAgICAgICogb3BlcmF0aW9uIHdpbnMuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQHJldHVybiB0aGUgcnVudGltZSBjb21wb25lbnRzIHRoYXQgY29tcHJpc2UgdGhpcyBydW50aW1lCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1bnRpbWUgY29tcG9uZW50LiBUaGUKLSAgICAgICAgICogY29udGVudHMgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgdGhlIHJ1bnRpbWUgd2FzIGNyZWF0ZWQgYW5kIAotICAgICAgICAgKiB3aGF0IGNvbXBvbmVudCB0eXBlcy92ZXJzaW9ucyBpdCdzIGNvbXByaXNlZCBvZi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZSAoa2V5IHR5cGU6IAotICAgICAgICAgKiAgIHtAc2VlIFN0cmluZ30sIHZhbHVlIHR5cGU6IHtAc2VlIFN0cmluZ30pCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIHNpbmdsZSBicmlkZ2VkIHJ1bnRpbWUuIFRoZSBzeXN0ZW0gd2lsbCB3cmFwIHRoaXMgaW50ZXJmYWNlCi0gICAgICogYW5kIGV4cG9zZSBpdCB0byBjbGllbnRzIGFzIHtAc2VlIElSdW50aW1lfS4gQWxsIHJlbGV2YW50IGNhbGxzIHdpbGwgYmUKLSAgICAgKiBkZWxlZ2F0ZWQgdG8gdGhpcyBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFN0dWIKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJU3R1YgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHJ1bnRpbWUuIE5vdGUgdGhhdCAKLSAgICAgICAgICogdGhlIG9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBmb3Igc29tZSBvcGVyYXRpb25zIGNvbXBvbmVudHMgYXJlIAotICAgICAgICAgKiBjb25zdWx0ZWQgaW4gb3JkZXIgYW5kIHRoZSBmaXJzdCBvbmUgY2FwYWJsZSBvZiBwZXJmb3JtaW5nIHRoZQotICAgICAgICAgKiBvcGVyYXRpb24gd2lucy4KLSAgICAgICAgICogIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHJ1bnRpbWUKLSAgICAgICAgICogQHNpbmNlIDMuMAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cygpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZSBjb21wb25lbnQuIFRoZQotICAgICAgICAgKiBjb250ZW50cyB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyB0aGUgcnVudGltZSB3YXMgY3JlYXRlZCBhbmQgCi0gICAgICAgICAqIHdoYXQgY29tcG9uZW50IHR5cGVzL3ZlcnNpb25zIGl0J3MgY29tcHJpc2VkIG9mLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lIChrZXkgdHlwZTogCi0gICAgICAgICAqICAge0BzZWUgU3RyaW5nfSwgdmFsdWUgdHlwZToge0BzZWUgU3RyaW5nfSkKLSAgICAgICAgICogQHNpbmNlIDMuMAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpOwotIAotICAgICAgICAvKioKLSAgICAgICAgICogQHNpbmNlIDMuMAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4NWY2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNvbmZpZ3VyZWQgaW5zdGFuY2Ugb2YgYSBydW50aW1lIGNvbXBvbmVudCB0eXBlIGFuZCB2ZXJzaW9uLiBBIHJ1bnRpbWUgaW5zdGFuY2UgaXMgCi0gKiBjb21wb3NlZCBvZiBtdWx0aXBsZSBydW50aW1lIGNvbXBvbmVudHMuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvdXRzaWRlIG9mIHRoaXMgZnJhbWV3b3JrLiBDbGllbnQgY29kZSBjYW4gCi0gKiBnZXQgYWNjZXNzIHRvIDxjb2RlPklSdW50aW1lQ29tcG9uZW50PC9jb2RlPiBvYmplY3RzIGJ5IHVzaW5nIG1ldGhvZHMgb24gdGhlIAotICoge0BzZWUgSVJ1bnRpbWV9IGFuZCB7QHNlZSBSdW50aW1lTWFuYWdlcn0gY2xhc3Nlcy48L3A+ICAKLSAqIAotICogQHNlZSBJUnVudGltZS5nZXRSdW50aW1lQ29tcG9uZW50cygpCi0gKiBAc2VlIFJ1bnRpbWVNYW5hZ2VyLmNyZWF0ZVJ1bnRpbWVDb21wb25lbnQoSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLE1hcDxTdHJpbmcsU3RyaW5nPikgCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lQ29tcG9uZW50Ci0KLSAgICBleHRlbmRzIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIHRoYXQgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIHRoYXQgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZgotICAgICAqLwotICAgIAotICAgIElSdW50aW1lQ29tcG9uZW50VHlwZSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHZlcnNpb24gdGhhdCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgY29tcG9uZW50IHZlcnNpb24gdGhhdCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mCi0gICAgICovCi0gICAgCi0gICAgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIGdldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSB0aGF0IHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBjb21wb25lbnQKLSAgICAgKiBoYXMgbm90IHlldCBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhIHJ1bnRpbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcnVudGltZSB0aGF0IHRoYXQgdGhpcyBjb21wb25lbnQgYmVsb25ncyB0bwotICAgICAqLwotICAgIAotICAgIElSdW50aW1lIGdldFJ1bnRpbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1bnRpbWUgY29tcG9uZW50LiBUaGUKLSAgICAgKiBjb250ZW50cyB3aWxsIHZhcnkgZGVwZW5kZW5kaW5nIG9uIHRoZSBjb21wb25lbnQgdHlwZS92ZXJzaW9uLCBidXQgCi0gICAgICogdXN1YWxseSB0aGlzIHdpbGwgYXQgbGVhc3QgY29udGFpbiB0aGUgcGF0aCB0byB0aGUgbG9jYXRpb24gb24gZGlzayB3aGVyZSAKLSAgICAgKiB0aGUgcnVudGltZSBpcyBpbnN0YWxsZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lIGNvbXBvbmVudAotICAgICAqLwotICAgIAotICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRQcm9wZXJ0eSggU3RyaW5nIG5hbWUgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQ29tcG9uZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzU0OGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgYSBydW50aW1lIGNvbXBvbmVudC4gQSBydW50aW1lIGluc3RhbmNlIGlzIGNvbXBvc2VkIG9mICBtdWx0aXBsZSBydW50aW1lIAotICogY29tcG9uZW50cywgZWFjaCBvZiB3aGljaCBoYXMgYSB0eXBlIGFuZCBhIHZlcnNpb24uCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvdXRzaWRlIG9mIHRoaXMgZnJhbWV3b3JrLiBSdW50aW1lIGNvbXBvbmVudAotICogdHlwZXMgYXJlIGRlY2xhcmVkIHVzaW5nIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzPC9jb2RlPgotICogZXh0ZW5zaW9uIHBvaW50LiBPbmNlIGRlY2xhcmVkLCBjbGllbnQgY29kZSBjYW4gZ2V0IGFjY2VzcyB0byA8Y29kZT5JUnVudGltZUNvbXBvbmVudFR5cGU8L2NvZGU+IAotICogb2JqZWN0cyBieSB1c2luZyBtZXRob2RzIG9uIHRoZSB7QHNlZSBSdW50aW1lTWFuYWdlcn0gY2xhc3MuPC9wPiAgCi0gKgotICogQHNlZSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZXMoKQotICogQHNlZSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZShTdHJpbmcpCi0gKiBAc2VlIFJ1bnRpbWVNYW5hZ2VyLmlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKFN0cmluZykKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVDb21wb25lbnRUeXBlCi0KLSAgICBleHRlbmRzIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIGlkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgaWQKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4gaWQgb2Ygd2hlcmUgdGhpcyBydW50aW1lIGNvbXBvbmVudCB0eXBlIGlzIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGx1Z2luIGlkIG9mIHdoZXJlIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZSBpcyBkZWZpbmVkCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldFBsdWdpbklkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIHZlcnNpb25zIG9mIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUgdmVyc2lvbnMgb2YgdGhpcyBydW50aW1lIGNvbXBvbmVudCB0eXBlCi0gICAgICovCi0gICAgCi0gICAgU2V0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gZ2V0VmVyc2lvbnMoKTsKLSAgICAKLSAgICBTZXQ8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiBnZXRWZXJzaW9ucyggU3RyaW5nIGV4cHIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIG9mIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZQotICAgICAqIGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBleGlzdHMsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIGJvb2xlYW4gaGFzVmVyc2lvbiggU3RyaW5nIHZlcnNpb24gKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QHNlZSBJUnVudGltZUNvbXBvbmVudFZlcnNpb259IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgICAqIHByb3ZpZGVkIHZlcnNpb24gc3RyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIHtAc2VlIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbn0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogICBwcm92aWRlZCB2ZXJzaW9uIHN0cmluZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2ZXJzaW9uIGRvZXMgbm90IGV4aXN0Ci0gICAgICovCi0gICAgCi0gICAgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIGdldFZlcnNpb24oIFN0cmluZyB2ZXJzaW9uICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBydW50aW1lIGNvbXBvbmVudCBhcyBzcGVjaWZpZWQgYnkgdGhlIAotICAgICAqIHZlcnNpb24gY29tcGFyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgcnVudGltZSBjb21wb25lbnQKLSAgICAgKi8KLQotICAgIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBnZXRMYXRlc3RWZXJzaW9uKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNvcnRlZCBsaXN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2ZXJzaW9ucyBvZiB0aGlzIHJ1bnRpbWUKLSAgICAgKiBjb21wb25lbnQgdHlwZS4gVGhlIHNvcnQgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdmVyc2lvbiBjb21wYXJhdG9yLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIHdoZXRoZXIgdmVyc2lvbnMgc2hvdWxkIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIKLSAgICAgKiBAcmV0dXJuIGEgc29ydGVkIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHZlcnNpb25zIG9mIHRoaXMgcnVudGltZSAKLSAgICAgKiAgIGNvbXBvbmVudCB0eXBlCi0gICAgICovCi0gICAgCi0gICAgTGlzdDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24+IGdldFNvcnRlZFZlcnNpb25zKCBib29sZWFuIGFzY2VuZGluZyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gY29tcGFyYXRvciBzcGVjaWZpZWQgZm9yIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZS4KLSAgICAgKiBJZiBubyB2ZXJzaW9uIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbiAKLSAgICAgKiBpbnN0YW5jZSBvZiB0aGUge0BzZWUgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGZvciB0aGlzIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUKLSAgICAgKi8KLSAgICAKLSAgICBDb21wYXJhdG9yPFN0cmluZz4gZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQ29tcG9uZW50VmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQ2NjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgdmVyc2lvbiBvZiBhIHJ1bnRpbWUgY29tcG9uZW50LiBBIHJ1bnRpbWUgaW5zdGFuY2UgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgcnVudGltZSAKLSAqIGNvbXBvbmVudHMsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgdHlwZSBhbmQgYSB2ZXJzaW9uLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3V0c2lkZSBvZiB0aGlzIGZyYW1ld29yay4gUnVudGltZSBjb21wb25lbnQKLSAqIHZlcnNpb25zIGFyZSBkZWNsYXJlZCB1c2luZyA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lczwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4gT25jZSBkZWNsYXJlZCwgY2xpZW50IGNvZGUgY2FuIGdldCBhY2Nlc3MgdG8gCi0gKiA8Y29kZT5JUnVudGltZUNvbXBvbmVudFZlcnNpb248L2NvZGU+IG9iamVjdHMgYnkgdXNpbmcgbWV0aG9kcyBvbiB0aGUgCi0gKiB7QHNlZSBJUnVudGltZUNvbXBvbmVudFR5cGV9IGNsYXNzLjwvcD4gIAotICoKLSAqIEBzZWUgSVJ1bnRpbWVDb21wb25lbnRUeXBlLmdldFZlcnNpb25zKCkKLSAqIEBzZWUgSVJ1bnRpbWVDb21wb25lbnRUeXBlLmdldFZlcnNpb25zKFN0cmluZykKLSAqIEBzZWUgSVJ1bnRpbWVDb21wb25lbnRUeXBlLmdldFZlcnNpb24oU3RyaW5nKQotICogQHNlZSBJUnVudGltZUNvbXBvbmVudFR5cGUuaGFzVmVyc2lvbihTdHJpbmcpCi0gKiBAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZS5nZXRMYXRlc3RWZXJzaW9uKCkKLSAqIEBzZWUgSVJ1bnRpbWVDb21wb25lbnRUeXBlLmdldFNvcnRlZFZlcnNpb25zKGJvb2xlYW4pCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbgotCi0gICAgZXh0ZW5kcyBDb21wYXJhYmxlLCBJVmVyc2lvbgotICAgIAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgdGhhdCB0aGlzIGlzIGEgdmVyc2lvbiBvZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgdGhhdCB0aGlzIGlzIGEgdmVyc2lvbiBvZgotICAgICAqLwotICAgIAotICAgIElSdW50aW1lQ29tcG9uZW50VHlwZSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gc3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gc3RyaW5nCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvUnVudGltZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvUnVudGltZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhYjg0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL1J1bnRpbWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmludGVybmFsLlJ1bnRpbWVNYW5hZ2VySW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZU1hbmFnZXIgCi17Ci0gICAgcHJpdmF0ZSBSdW50aW1lTWFuYWdlcigpIHt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIGF2YWlsYWJsZSBydW50aW1lIGNvbXBvbmVudCB0eXBlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGVzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVJ1bnRpbWVDb21wb25lbnRUeXBlPiBnZXRSdW50aW1lQ29tcG9uZW50VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJ1bnRpbWVNYW5hZ2VySW1wbC5nZXRSdW50aW1lQ29tcG9uZW50VHlwZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcnVudGltZSBjb21wb25lbnQgdHlwZSBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIGlkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgZXhpc3RzLAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVDb21wb25lbnRUeXBlRGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuaXNSdW50aW1lQ29tcG9uZW50VHlwZURlZmluZWQoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZX0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBydW50aW1lIGNvbXBvbmVuZXQgdHlwZSBpZAotICAgICAqIEByZXR1cm4gdGhlIHtAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZX0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogICBzcGVjaWZpZWQgcnVudGltZSBjb21wb25lbmV0IHR5cGUgaWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcnVudGltZSBjb21wb25lbnQgdHlwZSBpZCBpcyBub3QKLSAgICAgKiAgIHJlY29nbml6ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lQ29tcG9uZW50VHlwZSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBkZWZpbmVkIHJ1bnRpbWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSBkZWZpbmVkIHJ1bnRpbWVzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVJ1bnRpbWU+IGdldFJ1bnRpbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZXMgdGhhdCBzdXBwb3J0IGFsbCBvZiB0aGUgc3BlY2lmaWVkIGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXRzIHRoZSBmYWNldHMgdGhhdCBuZWVkIHRvIGJlIHN1cHBvcnRlZAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWVzIHRoYXQgc3VwcG9ydCBhbGwgb2YgdGhlIHNwZWNpZmllZCBmYWNldHMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUnVudGltZT4gZ2V0UnVudGltZXMoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZXMoIGZhY2V0cyApOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBydW50aW1lIGhhcyBiZWVuIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJ1bnRpbWUgbmFtZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBydW50aW1lIGlzIGRlZmluZWQsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVEZWZpbmVkKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gUnVudGltZU1hbmFnZXJJbXBsLmlzUnVudGltZURlZmluZWQoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcnVudGltZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgcnVudGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgbmFtZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBydW50aW1lIG5hbWUgaXMgbm90IHJlY29nbml6ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldFJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZSggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIGEgbmV3IHJ1bnRpbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJ1bnRpbWUgbmFtZQotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBsaXN0IG9mIHJ1bnRpbWUgY29tcG9uZW5ldHMKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcnVudGltZSBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybiB0aGUgbmV3IHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGRlZmluZVJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZGVmaW5lUnVudGltZSggbmFtZSwgY29tcG9uZW50cywgcHJvcGVydGllcyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoZSBydW50aW1lIGZyb20gdGhlIHJlZ2lzdHJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGRlbGV0ZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIFJ1bnRpbWVNYW5hZ2VySW1wbC5kZWxldGVSdW50aW1lKCBydW50aW1lICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjb21wb25lbmV0LiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluCi0gICAgICogY29uanVuY3Rpb24gd2l0aCB0aGUge0BzZWUgZGVmaW5lUnVudGltZShTdHJpbmcsTGlzdCxNYXApfSBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJjdiB0aGUgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbgotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBydW50aW1lIGNvbXBvbmVudCBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybiB0aGUgbmV3IHJ1bnRpbWUgY29tcG9uZW50Ci0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZUNvbXBvbmVudCBjcmVhdGVSdW50aW1lQ29tcG9uZW50KCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJ1bnRpbWVNYW5hZ2VySW1wbC5jcmVhdGVSdW50aW1lQ29tcG9uZW50KCByY3YsIHByb3BlcnRpZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJ1bnRpbWVMaXN0ZW5lciggZmluYWwgSUxpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIFJ1bnRpbWVNYW5hZ2VySW1wbC5hZGRSdW50aW1lTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVJ1bnRpbWVMaXN0ZW5lciggZmluYWwgSUxpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIFJ1bnRpbWVNYW5hZ2VySW1wbC5yZW1vdmVSdW50aW1lTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICBSdW50aW1lTWFuYWdlckltcGwuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgUnVudGltZU1hbmFnZXJJbXBsLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lSdW50aW1lTGlmZWN5Y2xlRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lSdW50aW1lTGlmZWN5Y2xlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmNzgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9JUnVudGltZUxpZmVjeWNsZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBUaGUgcm9vdCBpbnRlcmZhY2Ugb2YgYWxsIHJ1bnRpbWUgbGlmZWN5Y2xlIGV2ZW50cy4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVMaWZlY3ljbGVFdmVudAotewotICAgIGVudW0gVHlwZQotICAgIHsKLSAgICAgICAgVkFMSURBVElPTl9TVEFUVVNfQ0hBTkdFRAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50Ci0gICAgICovCi0gICAgCi0gICAgVHlwZSBnZXRUeXBlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGFmZmVjdGVkIHJ1bnRpbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWZmZWN0ZWQgcnVudGltZQotICAgICAqLwotICAgIAotICAgIElSdW50aW1lIGdldFJ1bnRpbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjIwN2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gbm90aWZ5IHRoZSBsaXN0ZW5lciB0aGF0IGFuIGV2ZW50IGhhcyBvY2N1cnJlZC4KLSAgICAgKiAKLSAgICAgKiA8cD5JdCBpcyBoaWdobHkgYWR2aXNlZCB0aGF0IGFueSBsaXN0ZW5lciB0aGF0IHBlcmZvcm1zIG5vbi1jcml0aWNhbCBvciBsb25nLXJ1bm5pbmcgdGFza3MgCi0gICAgICogdGhhdCBjYW4gYmUgcGVyZm9ybWVkIGluIHRoZSBiYWNrZ3JvdW5kIChzdWNoIGFzIHVwZGF0aW5nIFVJKSBkbyBzbyBhc3luY2hyb25vdXNseSBieQotICAgICAqIHNwaW5uaW5nIG9mZiBhIHRocmVhZCwgc2NoZWR1bGluZyBhIGpvYiwgZXRjLiBUaGlzIGFsbG93cyB0aGUgb3JpZ2luYWwgbW9kaWZpY2F0aW9uIHRvCi0gICAgICogY29tcGxldGUgZmFzdGVyIHJlc3VsdGluZyBpbiBiZXR0ZXIgcGVyY2VpdmVkIHJlc3BvbnNpdmVuZXNzLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudAotICAgICAqLwotICAgIAotICAgIHZvaWQgaGFuZGxlRXZlbnQoIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQgZXZlbnQgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lWYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9JVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI5OTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lWYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudAotCi0gICAgZXh0ZW5kcyBJUnVudGltZUxpZmVjeWNsZUV2ZW50Ci0gICAgCi17Ci0gICAgSVN0YXR1cyBnZXRPbGRWYWxpZGF0aW9uU3RhdHVzKCk7Ci0gICAgCi0gICAgSVN0YXR1cyBnZXROZXdWYWxpZGF0aW9uU3RhdHVzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9pbnRlcm5hbC9SdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvaW50ZXJuYWwvUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmZTAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9pbnRlcm5hbC9SdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUsU2V0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+PiBsaXN0ZW5lcnM7Ci0gICAgCi0gICAgcHVibGljIFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lclJlZ2lzdHJ5KCkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzCi0gICAgICAgICAgICA9IG5ldyBFbnVtTWFwPElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZSxTZXQ8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4+KCBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUuY2xhc3MgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlIHQgOiBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXQoIHQsIG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+KCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsIHx8IHR5cGVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlIHR5cGUgCi0gICAgICAgICAgICAgOiAoIHR5cGVzLmxlbmd0aCA+IDAgPyB0eXBlcyA6IElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS52YWx1ZXMoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KCB0eXBlICkuYWRkKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNldDxJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyPiBsaXN0ZW5lcnMgOiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGZvciggSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzLmdldCggZXZlbnQuZ2V0VHlwZSgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudCggZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUgZXZlbnRUeXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVycy5nZXQoIGV2ZW50VHlwZSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvaW50ZXJuYWwvVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvaW50ZXJuYWwvVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ1N2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL2ludGVybmFsL1ZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQKLQotICAgIGltcGxlbWVudHMgSVZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lIHJ1bnRpbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJU3RhdHVzIG9sZFZhbGlkYXRpb25TdGF0dXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJU3RhdHVzIG5ld1ZhbGlkYXRpb25TdGF0dXM7Ci0gICAgCi0gICAgcHVibGljIFZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgb2xkVmFsaWRhdGlvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBuZXdWYWxpZGF0aW9uU3RhdHVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0gICAgICAgIHRoaXMub2xkVmFsaWRhdGlvblN0YXR1cyA9IG9sZFZhbGlkYXRpb25TdGF0dXM7Ci0gICAgICAgIHRoaXMubmV3VmFsaWRhdGlvblN0YXR1cyA9IG5ld1ZhbGlkYXRpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlLlZBTElEQVRJT05fU1RBVFVTX0NIQU5HRUQ7Ci0gICAgfQotCi0gICAgcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRPbGRWYWxpZGF0aW9uU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9sZFZhbGlkYXRpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIElTdGF0dXMgZ2V0TmV3VmFsaWRhdGlvblN0YXR1cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5uZXdWYWxpZGF0aW9uU3RhdHVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9BYnN0cmFjdFJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvQWJzdHJhY3RSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTdhYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9BYnN0cmFjdFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJ1bnRpbWUKLQotICAgIGltcGxlbWVudHMgSVJ1bnRpbWUKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MT0NBTElaRURfTkFNRSA9ICJsb2NhbGl6ZWQtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlIGxpc3Qgb2YgbmFtZXMgdGhhdCB0aGlzIHJ1bnRpbWUKLSAgICAgKiBjYW4gYmUgYWx0ZXJuYXRpdmVseSBrbm93biBieS4gQW55IGNvbW1hcyBpbiB0aGUgbmFtZXMgaGF2ZSB0byBiZSBlc2NhcGVkIHVzaW5nIGEgbGVhZGluZwotICAgICAqIHNsYXNoIGNoYXJhY3RlciAoJ1wnKS4gCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQUxURVJOQVRFX05BTUVTID0gImFsdGVybmF0ZS1uYW1lcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBzdWJjbGFzc2VkIG91dHNpZGUgdGhpcyBwYWNrYWdlLgotICAgICAqLwotICAgIAotICAgIEFic3RyYWN0UnVudGltZSgpIHt9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TG9jYWxpemVkTmFtZSgpCi0gICAgewotICAgICAgICBTdHJpbmcgbG9jYWxpemVkTmFtZSA9IGdldFByb3BlcnR5KCBQUk9QX0xPQ0FMSVpFRF9OQU1FICk7Ci0gICAgICAgIAotICAgICAgICBpZiggbG9jYWxpemVkTmFtZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYWxpemVkTmFtZSA9IGdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxvY2FsaXplZE5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiBnZXRBbHRlcm5hdGVOYW1lcygpCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgYWx0ZXJuYXRlTmFtZXNQcm9wID0gZ2V0UHJvcGVydHkoIFBST1BfQUxURVJOQVRFX05BTUVTICk7Ci0gICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFsdGVybmF0ZU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsaXplZE5hbWUgPSBnZXRMb2NhbGl6ZWROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggISBsb2NhbGl6ZWROYW1lLmVxdWFscyggZ2V0TmFtZSgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhbHRlcm5hdGVOYW1lcy5hZGQoIGxvY2FsaXplZE5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGFsdGVybmF0ZU5hbWVzUHJvcCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYm9vbGVhbiBzZWVuRXNjYXBlQ2hhciA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IGFsdGVybmF0ZU5hbWVzUHJvcC5sZW5ndGgoKTsgaSA8IG47IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IGFsdGVybmF0ZU5hbWVzUHJvcC5jaGFyQXQoIGkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc2VlbkVzY2FwZUNoYXIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNoICE9ICcsJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgc2VlbkVzY2FwZUNoYXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNoID09ICdcXCcgJiYgaSAhPSBuIC0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5Fc2NhcGVDaGFyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnLCcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG5hbWUubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGVOYW1lcy5hZGQoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLnNldExlbmd0aCggMCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHNlZW5Fc2NhcGVDaGFyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnXFwnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYnVmLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbmFtZS5sZW5ndGgoKSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdGVybmF0ZU5hbWVzLmFkZCggbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBhbHRlcm5hdGVOYW1lcyApOwotICAgIH0KLSAgICAKLSAgICBmaW5hbCB2b2lkIHNldE5hbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIGtleSApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcygpLmdldCgga2V5ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgQ2xhc3MgYWRhcHRlciApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgdCA9IGFkYXB0ZXIuZ2V0TmFtZSgpOwotICAgICAgICBPYmplY3QgcmVzID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlciggdGhpcywgdCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlcyA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IGdldFJ1bnRpbWVDb21wb25lbnRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlcyA9IHJjLmdldEFkYXB0ZXIoIGFkYXB0ZXIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcmVzICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGYuZ2V0VmVyc2lvbnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBzdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0RGVmYXVsdEZhY2V0cyggZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBmaXhlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0cy5hZGQoIGYuZ2V0TGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiggdGhpcyApICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWNldHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmogaW5zdGFuY2VvZiBJUnVudGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHIgPSAoSVJ1bnRpbWUpIG9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoIHIuZ2V0TmFtZSgpICkgJiYgCi0gICAgICAgICAgICAgICAgICAgZ2V0UnVudGltZUNvbXBvbmVudHMoKS5lcXVhbHMoIHIuZ2V0UnVudGltZUNvbXBvbmVudHMoKSApICYmCi0gICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydGllcygpLmVxdWFscyggci5nZXRQcm9wZXJ0aWVzKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9CcmlkZ2VkUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9CcmlkZ2VkUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzgyZTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvQnJpZGdlZFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCcmlkZ2VkUnVudGltZQotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWUKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBicmlkZ2VJZDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYXRpdmVSdW50aW1lSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUnVudGltZUJyaWRnZS5JU3R1YiBzdHViOwotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBzdXBwb3J0ZWQ7Ci0gICAgcHJpdmF0ZSBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb3NpdGlvbjsKLSAgICAKLSAgICBCcmlkZ2VkUnVudGltZSggZmluYWwgU3RyaW5nIGJyaWRnZUlkLAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmF0aXZlUnVudGltZUlkLAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUJyaWRnZS5JU3R1YiBzdHViICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYnJpZGdlSWQgPSBicmlkZ2VJZDsKLSAgICAgICAgdGhpcy5uYXRpdmVSdW50aW1lSWQgPSBuYXRpdmVSdW50aW1lSWQ7Ci0gICAgICAgIHRoaXMuc3R1YiA9IHN0dWI7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBnZXRCcmlkZ2VJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5icmlkZ2VJZDsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGdldE5hdGl2ZVJ1bnRpbWVJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVSdW50aW1lSWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cygpCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb25lbnRzID0gdGhpcy5zdHViLmdldFJ1bnRpbWVDb21wb25lbnRzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElSdW50aW1lQ29tcG9uZW50IHJjIDogY29tcG9uZW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICggKFJ1bnRpbWVDb21wb25lbnQpIHJjICkuc2V0UnVudGltZSggdGhpcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggY29tcG9uZW50cyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCggdGhpcy5zdHViLmdldFByb3BlcnRpZXMoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdXBwb3J0cyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgaWYoIGZ2LmdldFBsdWdpbklkKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wID0gZ2V0UnVudGltZUNvbXBvbmVudHMoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnN1cHBvcnRlZCA9PSBudWxsIHx8ICEgdGhpcy5jb21wb3NpdGlvbi5lcXVhbHMoIGNvbXAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkID0gUnVudGltZU1hbmFnZXJJbXBsLmdldFN1cHBvcnRlZEZhY2V0cyggY29tcCApOwotICAgICAgICAgICAgdGhpcy5jb21wb3NpdGlvbiA9IGNvbXA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzLnN1cHBvcnRlZC5jb250YWlucyggZnYgKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnN0dWIgaW5zdGFuY2VvZiBJUnVudGltZUJyaWRnZS5TdHViICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICggKElSdW50aW1lQnJpZGdlLlN0dWIpIHRoaXMuc3R1YiApLnZhbGlkYXRlKCBtb25pdG9yICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIudmFsaWRhdGUoIG1vbml0b3IgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViM2E3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWUKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUNvbXBvbmVudD4oKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXBvbmVudHNSZWFkT25seSAKLSAgICAgICAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCB0aGlzLmNvbXBvbmVudHMgKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzUmVhZE9ubHkKLSAgICAgICAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoIHRoaXMucHJvcGVydGllcyApOwotICAgIAotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBzdXBwb3J0ZWQgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGlzIHBhY2thZ2UuCi0gICAgICovCi0gICAgCi0gICAgUnVudGltZSgpIHt9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRSdW50aW1lQ29tcG9uZW50KCBmaW5hbCBJUnVudGltZUNvbXBvbmVudCBjb21wb25lbnQgKQotICAgIHsKLSAgICAgICAgKCAoUnVudGltZUNvbXBvbmVudCkgY29tcG9uZW50ICkuc2V0UnVudGltZSggdGhpcyApOwotICAgICAgICB0aGlzLmNvbXBvbmVudHMuYWRkKCBjb21wb25lbnQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllc1JlYWRPbmx5OwotICAgIH0KLQotICAgIHZvaWQgc2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoIGtleSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3VwcG9ydHMoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGlmKCBmdi5nZXRQbHVnaW5JZCgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuc3VwcG9ydGVkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnN1cHBvcnRlZCA9IFJ1bnRpbWVNYW5hZ2VySW1wbC5nZXRTdXBwb3J0ZWRGYWNldHMoIHRoaXMuY29tcG9uZW50cyApOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkLmNvbnRhaW5zKCBmdiApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZTU2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ29tcG9uZW50Ci0KLSAgICBpbXBsZW1lbnRzIElSdW50aW1lQ29tcG9uZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3Y7Ci0gICAgcHJpdmF0ZSBJUnVudGltZSBydW50aW1lOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydGllc1JlYWRPbmx5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGlzIHBhY2thZ2UuCi0gICAgICovCi0KLSAgICBSdW50aW1lQ29tcG9uZW50KCkgCi0gICAgewotICAgICAgICB0aGlzLnJjdiA9IG51bGw7Ci0gICAgICAgIHRoaXMucnVudGltZSA9IG51bGw7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0gICAgICAgIHRoaXMucHJvcGVydGllc1JlYWRPbmx5ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCB0aGlzLnByb3BlcnRpZXMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJ1bnRpbWVDb21wb25lbnRUeXBlIGdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJjdi5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmN2OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmN2ID0gKFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKSByY3Y7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWU7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgewotICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5ydW50aW1lICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBSZXNvdXJjZXMucnVudGltZUFscmVhZHlTZXQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5ydW50aW1lID0gcnVudGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllc1JlYWRPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBrZXkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoIGtleSApOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KCBrZXksIHZhbHVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBDbGFzcyB0eXBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElBZGFwdGVyTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLSAgICAgICAgT2JqZWN0IHJlcyA9IG1hbmFnZXIubG9hZEFkYXB0ZXIoIHRoaXMsIHR5cGUuZ2V0TmFtZSgpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcmVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSB0aGlzLnJjdi5nZXRBZGFwdGVyRmFjdG9yeSggdHlwZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZmFjdG9yeSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXMgPSBmYWN0b3J5LmdldEFkYXB0ZXIoIHRoaXMsIHR5cGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmogKQotICAgIHsKLSAgICAgICAgaWYoIG9iaiBpbnN0YW5jZW9mIFJ1bnRpbWVDb21wb25lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBSdW50aW1lQ29tcG9uZW50IHJjID0gKFJ1bnRpbWVDb21wb25lbnQpIG9iajsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnJjdiA9PSByYy5yY3YgJiYgdGhpcy5wcm9wZXJ0aWVzLmVxdWFscyggcmMucHJvcGVydGllcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmN2Lmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmN2LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZUFscmVhZHlTZXQ7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBSdW50aW1lQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDg2NDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcnVudGltZUFscmVhZHlTZXQgPSBDb21wb25lbnQgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBydW50aW1lLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjM1MmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbmFibGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVDb21wb25lbnRUeXBlCi0KLSAgICBleHRlbmRzIFZlcnNpb25hYmxlPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4KLSAgICBpbXBsZW1lbnRzIElSdW50aW1lQ29tcG9uZW50VHlwZQotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRQbHVnaW5JZCggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRWZXJzaW9uKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gdmVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyc2lvbnMuYWRkKCB2ZXIuZ2V0VmVyc2lvblN0cmluZygpLCB2ZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBDbGFzcyB0eXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKCB0aGlzLCB0eXBlLmdldE5hbWUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlVmVyc2lvbk5vdEZvdW5kRXJyTXNnKCBmaW5hbCBTdHJpbmcgdmVyc3RyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOTFMuYmluZCggUnVudGltZU1hbmFnZXJJbXBsLlJlc291cmNlcy5ydW50aW1lQ29tcG9uZW50VmVyc2lvbk5vdERlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCwgdmVyc3RyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VmVyc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJiYmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlVua25vd25WZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbmFibGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uCi0KLSAgICBpbXBsZW1lbnRzIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbgotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIHBsdWdpbjsKLSAgICBwcml2YXRlIElSdW50aW1lQ29tcG9uZW50VHlwZSB0eXBlOwotICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gYWRhcHRlckZhY3RvcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+IGNvbXBUYWJsZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW47Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UGx1Z2luSWQoIGZpbmFsIFN0cmluZyBwbHVnaW4gKQotICAgIHsKLSAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0gICAgfQotCi0gICAgcHVibGljIElSdW50aW1lQ29tcG9uZW50VHlwZSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFJ1bnRpbWVDb21wb25lbnRUeXBlKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgdHlwZSApCi0gICAgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFZlcnNpb25TdHJpbmcoIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBWZXJzaW9uYWJsZSBnZXRWZXJzaW9uYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFZlcnNpb25hYmxlKSB0aGlzLnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIElBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSggZmluYWwgQ2xhc3MgdHlwZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmFkYXB0ZXJGYWN0b3JpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgZmFjdG9yeSA9IHRoaXMuYWRhcHRlckZhY3Rvcmllcy5nZXQoIHR5cGUuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmYWN0b3J5ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZmFjdG9yeSBpbnN0YW5jZW9mIFBsdWdpbkFuZENsYXNzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBQbHVnaW5BbmRDbGFzcyByZWYgPSAoUGx1Z2luQW5kQ2xhc3MpIGZhY3Rvcnk7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGluc3RhbnRpYXRlKCByZWYucGx1Z2luLCByZWYuY2xuYW1lLCBJQWRhcHRlckZhY3RvcnkuY2xhc3MgKTsKLSAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJGYWN0b3JpZXMucHV0KCB0eXBlLmdldE5hbWUoKSwgZmFjdG9yeSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKElBZGFwdGVyRmFjdG9yeSkgZmFjdG9yeTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZEFkYXB0ZXJGYWN0b3J5KCBmaW5hbCBTdHJpbmcgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5hZGFwdGVyRmFjdG9yaWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yaWVzLnB1dCggdHlwZSwgbmV3IFBsdWdpbkFuZENsYXNzKCBwbHVnaW4sIGZhY3RvcnkgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0Q29tcGFyaXNvblRhYmxlKCBmaW5hbCBNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+IGNvbXBUYWJsZSApCi0gICAgewotICAgICAgICB0aGlzLmNvbXBUYWJsZSA9IGNvbXBUYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgewotICAgICAgICBpZiggb2JqID09IHRoaXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmogaW5zdGFuY2VvZiBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ID0gKElSdW50aW1lQ29tcG9uZW50VmVyc2lvbikgb2JqOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcmN2LmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkgIT0gdGhpcy50eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5jYW5ub3RDb21wYXJlVmVyc2lvbnNPZkRpZmZlcmVudFR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUuZ2V0SWQoKSwgdGhpcy52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY3YuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKS5nZXRJZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmN2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcFRhYmxlLmdldCggcmN2ICkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmogaW5zdGFuY2VvZiBVbmtub3duVmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wID0gdGhpcy50eXBlLmdldFZlcnNpb25Db21wYXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXAuY29tcGFyZSggdGhpcy52ZXJzaW9uLCAoIChJVmVyc2lvbikgb2JqICkuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGUuZ2V0SWQoKSArICIgIiArIHRoaXMudmVyc2lvbjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBsdWdpbkFuZENsYXNzCi0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBsdWdpbjsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjbG5hbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUGx1Z2luQW5kQ2xhc3MoIGZpbmFsIFN0cmluZyBwbHVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luOwotICAgICAgICAgICAgdGhpcy5jbG5hbWUgPSBjbG5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RDb21wYXJlVmVyc2lvbnNPZkRpZmZlcmVudFR5cGVzOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUnVudGltZUNvbXBvbmVudFZlcnNpb24uY2xhc3MuZ2V0TmFtZSgpLCBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmczICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCB0ZW1wbGF0ZSwgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiwgYXJnMyB9ICk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgfSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VmVyc2lvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VmVyc2lvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTg4YjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFZlcnNpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotY2Fubm90Q29tcGFyZVZlcnNpb25zT2ZEaWZmZXJlbnRUeXBlcyA9IFwKLSAgQ2Fubm90IGNvbXBhcmUgdmVyc2lvbnMgb2YgZGlmZmVyZW50IHJ1bnRpbWUgY29tcG9uZW50IHR5cGVzIHRvIGVhY2ggb3RoZXIuIFwKLSAgQXR0ZW1wdGVkIHRvIGNvbXBhcmUgdmVyc2lvbiB7MX0gb2YgcnVudGltZSBjb21wb25lbnQgdHlwZSB7MH0gd2l0aCB2ZXJzaW9uIFwKLSAgezN9IG9mIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgezJ9LiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVNYW5hZ2VySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxMDA3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLlByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JUnVudGltZUxpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuaW50ZXJuYWwuUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuaW50ZXJuYWwuVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLkluZGV4ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5WZXJzaW9uRXhwcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZU1hbmFnZXJJbXBsCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9JRCA9ICJydW50aW1lcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJREdFU19FWFRFTlNJT05fSUQgPSAicnVudGltZUJyaWRnZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDRVRTX0VYVEVOU0lPTl9JRCA9ICJkZWZhdWx0RmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfQURBUFRFUiA9ICJhZGFwdGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9CUklER0UgPSAiYnJpZGdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9ERUZBVUxUX0ZBQ0VUUyA9ICJkZWZhdWx0LWZhY2V0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRkFDRVQgPSAiZmFjZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZBQ1RPUlkgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUlVOVElNRV9DT01QT05FTlQgPSAicnVudGltZS1jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1JVTlRJTUVfQ09NUE9ORU5UX1RZUEUgPSAicnVudGltZS1jb21wb25lbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUlVOVElNRV9DT01QT05FTlRfVkVSU0lPTiA9ICJydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9TVVBQT1JURUQgPSAic3VwcG9ydGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9WRVJTSU9OX0NPTVBBUkFUT1IgPSAidmVyc2lvbi1jb21wYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWSA9ICJhbnkiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5kZXhlZFNldDxTdHJpbmcsSVJ1bnRpbWVDb21wb25lbnRUeXBlPiBydW50aW1lQ29tcG9uZW50VHlwZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5kZXhlZFNldDxTdHJpbmcsSVJ1bnRpbWU+IHJ1bnRpbWVzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8TWFwcGluZz4gbWFwcGluZ3M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZyxJUnVudGltZUJyaWRnZT4gYnJpZGdlczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PERlZmF1bHRGYWNldHNFbnRyeT4gZGVmYXVsdEZhY2V0czsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SUxpc3RlbmVyPiBsaXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkgcnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnk7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBydW50aW1lQ29tcG9uZW50VHlwZXMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSVJ1bnRpbWVDb21wb25lbnRUeXBlPigpOwotICAgICAgICBydW50aW1lcyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJUnVudGltZT4oKTsKLSAgICAgICAgbWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PE1hcHBpbmc+KCk7Ci0gICAgICAgIGJyaWRnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSVJ1bnRpbWVCcmlkZ2U+KCk7Ci0gICAgICAgIGRlZmF1bHRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PERlZmF1bHRGYWNldHNFbnRyeT4oKTsKLSAgICAgICAgbGlzdGVuZXJzID0gbmV3IEhhc2hTZXQ8SUxpc3RlbmVyPigpOwotICAgICAgICBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeSA9IG5ldyBSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgcmVhZE1ldGFkYXRhKCk7Ci0gICAgICAgIHJlYWRCcmlkZ2VzRXh0ZW5zaW9ucygpOwotICAgICAgICByZWFkRGVmYXVsdEZhY2V0c0V4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgICggbmV3IFJ1bnRpbWVWYWxpZGF0aW9uVGhyZWFkKCkgKS5zdGFydCgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFJ1bnRpbWVNYW5hZ2VySW1wbCgpIHt9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVJ1bnRpbWVDb21wb25lbnRUeXBlPiBnZXRSdW50aW1lQ29tcG9uZW50VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJ1bnRpbWVDb21wb25lbnRUeXBlcy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJ1bnRpbWVDb21wb25lbnRUeXBlcy5jb250YWluc0tleSggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZUNvbXBvbmVudFR5cGUgZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmMgPSBydW50aW1lQ29tcG9uZW50VHlwZXMuZ2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJjID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lQ29tcG9uZW50VHlwZU5vdERlZmluZWQsIGlkICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVDb21wb25lbnQgY3JlYXRlUnVudGltZUNvbXBvbmVudCggZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFJ1bnRpbWVDb21wb25lbnQgcmMgPSBuZXcgUnVudGltZUNvbXBvbmVudCgpOwotICAgICAgICAKLSAgICAgICAgcmMuc2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oIHJjdiApOwotICAgICAgICAKLSAgICAgICAgaWYoIHByb3BlcnRpZXMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggTWFwLkVudHJ5PFN0cmluZyxTdHJpbmc+IGVudHJ5IDogcHJvcGVydGllcy5lbnRyeVNldCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByYy5zZXRQcm9wZXJ0eSggZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUnVudGltZT4gZ2V0UnVudGltZXMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBydW50aW1lcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyaWRnZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PElSdW50aW1lPiggcnVudGltZXMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUnVudGltZT4gZ2V0UnVudGltZXMoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggcnVudGltZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBicmlkZ2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJUnVudGltZT4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogcnVudGltZXMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmYWNldHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgci5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc3VwcG9ydHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lRGVmaW5lZCggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBydW50aW1lcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyaWRnZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWVzLmNvbnRhaW5zS2V5KCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHJ1bnRpbWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgYnJpZGdlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lcy5nZXQoIG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHJ1bnRpbWUgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucnVudGltZU5vdERlZmluZWQsIG5hbWUgKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZSBkZWZpbmVSdW50aW1lKCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydGllcyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHJ1bnRpbWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUnVudGltZSByID0gbmV3IFJ1bnRpbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgci5zZXROYW1lKCBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnQgcmMgOiBjb21wb25lbnRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLmFkZFJ1bnRpbWVDb21wb25lbnQoIHJjICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBwcm9wZXJ0aWVzICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggTWFwLkVudHJ5PFN0cmluZyxTdHJpbmc+IGVudHJ5IDogcHJvcGVydGllcy5lbnRyeVNldCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHIuc2V0UHJvcGVydHkoIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBydW50aW1lcy5hZGQoIHIuZ2V0TmFtZSgpLCByICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5vdGlmeVJ1bnRpbWVMaXN0ZW5lcnMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVJ1bnRpbWUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBydW50aW1lcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBydW50aW1lcy5kZWxldGUoIHJ1bnRpbWUuZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5vdGlmeVJ1bnRpbWVMaXN0ZW5lcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUnVudGltZUxpc3RlbmVyKCBmaW5hbCBJTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBsaXN0ZW5lcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSdW50aW1lTGlzdGVuZXIoIGZpbmFsIElMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGxpc3RlbmVycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBub3RpZnlSdW50aW1lTGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIGZvciggSUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgcnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgcnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFN1cHBvcnRlZEZhY2V0cyggZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gY29tcG9zaXRpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnQgcmMgOiBjb21wb3NpdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggTWFwcGluZyBtIDogbWFwcGluZ3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCggbS5nZXRTdXBwb3J0ZWRGYWNldHMoIHJjICkgKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXREZWZhdWx0RmFjZXRzKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIERlZmF1bHRGYWNldHNFbnRyeSBkZmUgOiBkZWZhdWx0RmFjZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGRmZS5tYXRjaCggcmN2ICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCggZGZlLmZhY2V0cyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBicmlkZ2UoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgZm9yKCBNYXAuRW50cnk8U3RyaW5nLElSdW50aW1lQnJpZGdlPiBlbnRyeSA6IGJyaWRnZXMuZW50cnlTZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBicmlkID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZUJyaWRnZSBiciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIHJ1bnRpbWVzIGJlbG9uZ2luZyB0byB0aGlzIGJyaWRnZSB0aGF0IGFyZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIGluIHRoZSBzeXN0ZW0uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsQnJpZGdlZFJ1bnRpbWU+IGV4aXN0aW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLEJyaWRnZWRSdW50aW1lPigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBydW50aW1lcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHIgaW5zdGFuY2VvZiBCcmlkZ2VkUnVudGltZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBCcmlkZ2VkUnVudGltZSBicmlkZ2VkID0gKEJyaWRnZWRSdW50aW1lKSByOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGJyaWRnZWQuZ2V0QnJpZGdlSWQoKS5lcXVhbHMoIGJyaWQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnB1dCggYnJpZGdlZC5nZXROYXRpdmVSdW50aW1lSWQoKSwgYnJpZGdlZCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG5ldyBzZXQgb2YgZXhwb3J0ZWQgcnVudGltZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGV4cG9ydGVkOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBvcnRlZCA9IGJyLmdldEV4cG9ydGVkUnVudGltZU5hbWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBCcmlkZ2VkUnVudGltZSByIDogZXhpc3RpbmcudmFsdWVzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcnVudGltZXMucmVtb3ZlKCByLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFic29sZXRlIGVudHJpZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggQnJpZGdlZFJ1bnRpbWUgciA6IGV4aXN0aW5nLnZhbHVlcygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBleHBvcnRlZC5jb250YWlucyggci5nZXROYXRpdmVSdW50aW1lSWQoKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVzLmRlbGV0ZSggci5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgZW50cmllcy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBTdHJpbmcgaWQgOiBleHBvcnRlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgZXhpc3RpbmcuY29udGFpbnNLZXkoIGlkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQnJpZGdlLklTdHViIHN0dWIgPSBici5icmlkZ2UoIGlkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJyaWRnZWRSdW50aW1lIHIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQnJpZGdlZFJ1bnRpbWUoIGJyaWQsIGlkLCBzdHViICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0TmFtZSggY3JlYXRlVW5pcXVlUnVudGltZU5hbWUoIGlkICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZXMuYWRkKCByLmdldE5hbWUoKSwgciApOwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBtb2RpZmllZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5UnVudGltZUxpc3RlbmVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVSdW50aW1lTmFtZSggZmluYWwgU3RyaW5nIHN1Z2dlc3Rpb24gKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzdWdnZXN0aW9uOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDE7IHJ1bnRpbWVzLmNvbnRhaW5zKCBuYW1lICk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUgPSBzdWdnZXN0aW9uICsgIiAoIiArIGkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkTWV0YWRhdGEoKQotICAgIHsKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElFeHRlbnNpb25Qb2ludCBwb2ludCAKLSAgICAgICAgICAgID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhURU5TSU9OX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcG9pbnQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiRXh0ZW5zaW9uIHBvaW50IG5vdCBmb3VuZCEiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNmZ2VscyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBvaW50LmdldEV4dGVuc2lvbnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmZ2VsIDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjZmdlbHMuYWRkKCBjZmdlbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX1JVTlRJTUVfQ09NUE9ORU5UX1RZUEUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZFJ1bnRpbWVDb21wb25lbnRUeXBlKCBjb25maWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfUlVOVElNRV9DT01QT05FTlRfVkVSU0lPTiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkUnVudGltZUNvbXBvbmVudFZlcnNpb24oIGNvbmZpZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYWxjdWxhdGVWZXJzaW9uQ29tcGFyaXNvblRhYmxlcygpOwotCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfQURBUFRFUiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkQWRhcHRlciggY29uZmlnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX1NVUFBPUlRFRCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkTWFwcGluZyggY29uZmlnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkUnVudGltZUNvbXBvbmVudFR5cGUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotCi0gICAgICAgIGlmKCBpZCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdCA9IG5ldyBSdW50aW1lQ29tcG9uZW50VHlwZSgpOwotICAgICAgICByY3Quc2V0SWQoIGlkICk7Ci0gICAgICAgIHJjdC5zZXRQbHVnaW5JZCggY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX1ZFUlNJT05fQ09NUEFSQVRPUiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xuYW1lID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGNsbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmN0LnNldFZlcnNpb25Db21wYXJhdG9yKCBjbG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcnVudGltZUNvbXBvbmVudFR5cGVzLmFkZCggaWQsIHJjdCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRSdW50aW1lQ29tcG9uZW50VmVyc2lvbiggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVFlQRSApOwotCi0gICAgICAgIGlmKCB0eXBlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfVFlQRSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgdmVyID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0KLSAgICAgICAgaWYoIHZlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudFR5cGUgcmN0IAotICAgICAgICAgICAgPSAoUnVudGltZUNvbXBvbmVudFR5cGUpIHJ1bnRpbWVDb21wb25lbnRUeXBlcy5nZXQoIHR5cGUgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCByY3QgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkLCB0eXBlICkgKwotICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgPSBuZXcgUnVudGltZUNvbXBvbmVudFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHJjdi5zZXRSdW50aW1lQ29tcG9uZW50VHlwZSggcmN0ICk7Ci0gICAgICAgIHJjdi5zZXRWZXJzaW9uU3RyaW5nKCB2ZXIgKTsKLSAgICAgICAgcmN2LnNldFBsdWdpbklkKCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHJjdC5hZGRWZXJzaW9uKCByY3YgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJlLWNvbXB1dGVzIHRoZSB0YWJsZXMgdGhhdCBkZXNjcmliZSBob3cgdmVyc2lvbnMgb2YgcnVudGltZSBjb21wb25lbnRzCi0gICAgICogY29tcGFyZSB0byBlYWNoIG90aGVyLiBUaGlzIGFsbG93cyB0aGUgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLmNvbXBhcmVUbygpIAotICAgICAqIG9wZXJhdGlvbiwgd2hpY2ggaXMgY2FsbGVkIHJhdGhlciBmcmVxdWVudGx5LCB0byBiZSByZWR1Y2VkIHRvIGEgaGFzaCAKLSAgICAgKiB0YWJsZSBsb29rdXAgaW5zdGVhZCBvZiBoYXZpbmcgdG8gZG8gYSBwYXJzZSBhbmQgY29tcGFyaXNvbiBvZiB0d28gCi0gICAgICogdmVyc2lvbiBzdHJpbmdzLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlVmVyc2lvbkNvbXBhcmlzb25UYWJsZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudFR5cGU+IGJhZFJ1bnRpbWVDb21wb25lbnRUeXBlcyAKLSAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUNvbXBvbmVudFR5cGU+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3QgOiBydW50aW1lQ29tcG9uZW50VHlwZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gY29tcCA9IHJjdC5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiB2ZXJzaW9ucyAKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4oIHJjdC5nZXRWZXJzaW9ucygpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgTWFwPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+PiBjb21wVGFibGVzCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLE1hcDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sSW50ZWdlcj4+KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2IDogdmVyc2lvbnMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcFRhYmxlcy5wdXQoIHJjdiwgbmV3IEhhc2hNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSB2ZXJzaW9ucy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIGlWZXIgPSB2ZXJzaW9ucy5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlWZXJTdHIgPSBpVmVyLmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixJbnRlZ2VyPiBpQ29tcFRhYmxlID0gY29tcFRhYmxlcy5nZXQoIGlWZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSBpICsgMTsgaiA8IG47IGorKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBqVmVyID0gdmVyc2lvbnMuZ2V0KCBqICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgalZlclN0ciA9IGpWZXIuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixJbnRlZ2VyPiBqQ29tcFRhYmxlID0gY29tcFRhYmxlcy5nZXQoIGpWZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IGNvbXAuY29tcGFyZSggaVZlclN0ciwgalZlclN0ciApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ29tcFRhYmxlLnB1dCggalZlciwgbmV3IEludGVnZXIoIHJlc3VsdCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqQ29tcFRhYmxlLnB1dCggaVZlciwgbmV3IEludGVnZXIoIHJlc3VsdCAqIC0xICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIE1hcC5FbnRyeTxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sTWFwPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixJbnRlZ2VyPj4gZW50cnkKLSAgICAgICAgICAgICAgICAgICAgIDogY29tcFRhYmxlcy5lbnRyeVNldCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiA9IChSdW50aW1lQ29tcG9uZW50VmVyc2lvbikgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJjdi5zZXRDb21wYXJpc29uVGFibGUoIGVudHJ5LmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRoZSBmYWlsdXJlIGhlcmUgaXMgZHVlIHRvIHRoZSBwcm9ibGVtIGxvYWRpbmcgdGhlIHByb3ZpZGVkCi0gICAgICAgICAgICAgICAgLy8gdmVyc2lvbiBjb21wYXJhdG9yIG9yIGR1ZSB0byB0aGUgcHJvYmxlbSBjb21wYXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gdmVyc2lvbiBzdHJpbmcuIEluIGVpdGhlciBjYXNlLCB3ZSBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIHRyYWNlcyBvZiB0aGlzIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHRvIGtlZXAgYSBmYXVsdHkgcnVudGltZSBjb21wb25lbnQgdHlwZSBmcm9tIGRyYWdnaW5nCi0gICAgICAgICAgICAgICAgLy8gZG93biB0aGUgZW50aXJlIHN5c3RlbS4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgYmFkUnVudGltZUNvbXBvbmVudFR5cGVzLmFkZCggcmN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdCA6IGJhZFJ1bnRpbWVDb21wb25lbnRUeXBlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJ1bnRpbWVDb21wb25lbnRUeXBlcy5yZW1vdmUoIHJjdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEFkYXB0ZXIoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdHlwZSA9IG51bGw7Ci0gICAgICAgIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3ZlcnNpb24gPSBudWxsOwotICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX1JVTlRJTUVfQ09NUE9ORU5UICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotCi0gICAgICAgICAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBpc1J1bnRpbWVDb21wb25lbnRUeXBlRGVmaW5lZCggaWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkLCBpZCApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByY3R5cGUgPSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSggaWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHZlcnNpb24gIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggISByY3R5cGUuaGFzVmVyc2lvbiggdmVyc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lQ29tcG9uZW50VmVyc2lvbk5vdERlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIHZlcnNpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJjdmVyc2lvbiA9IHJjdHlwZS5nZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRkFDVE9SWSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZmFjdG9yeSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBBVFRSX1RZUEUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfQ0xBU1MgKTsKLQotICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQoIHR5cGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24+IHZlcnNpb25zOwotICAgICAgICAKLSAgICAgICAgaWYoIHJjdmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyc2lvbnMgPSByY3R5cGUuZ2V0VmVyc2lvbnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcnNpb25zID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCByY3ZlcnNpb24gKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbiA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiA6IHZlcnNpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudFZlcnNpb24gdiA9IChSdW50aW1lQ29tcG9uZW50VmVyc2lvbikgcmN2OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIFN0cmluZyB0eXBlIDogdHlwZXMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHYuYWRkQWRhcHRlckZhY3RvcnkoIHR5cGUsIHBsdWdpbiwgZmFjdG9yeSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZE1hcHBpbmcoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgTWFwcGluZyBtID0gbmV3IE1hcHBpbmcoKTsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0ZBQ0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IHJlYWRQcm9qZWN0RmFjZXRSZWYoIGNoaWxkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHYgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgIFZlcnNpb25FeHByPFByb2plY3RGYWNldFZlcnNpb24+IGV4cHIgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB2ICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4oIGYsIHYsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG0uZmFjZXRzLnB1dCggZiwgZXhwciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfUlVOVElNRV9DT01QT05FTlQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGNoaWxkLmdldEF0dHJpYnV0ZSggQU5ZICkgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0IAotICAgICAgICAgICAgICAgICAgICAgICAgPSByZWFkUnVudGltZUNvbXBvbmVudFR5cGVSZWYoIGNoaWxkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggcmN0ID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHYgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gZXhwciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgVmVyc2lvbkV4cHI8UnVudGltZUNvbXBvbmVudFZlcnNpb24+KCByY3QsIHYsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG0ucnVudGltZUNvbXBvbmVudHMucHV0KCByY3QsIGV4cHIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1hcHBpbmdzLmFkZCggbSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRCcmlkZ2VzRXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvblBvaW50IHBvaW50IAotICAgICAgICAgICAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCggRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUklER0VTX0VYVEVOU0lPTl9JRCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHBvaW50ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIkV4dGVuc2lvbiBwb2ludCBub3QgZm91bmQhIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjZmdlbHMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUV4dGVuc2lvbiBleHRlbnNpb24gOiBwb2ludC5nZXRFeHRlbnNpb25zKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjZmdlbCA6IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2ZnZWxzLmFkZCggY2ZnZWwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfQlJJREdFICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBpZCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9JRCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggY2xuYW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQnJpZGdlIGJyOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnIgPSBpbnN0YW50aWF0ZSggcGx1Z2luSWQsIGNsbmFtZSwgSVJ1bnRpbWVCcmlkZ2UuY2xhc3MgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmlkZ2VzLnB1dCggaWQsIGJyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWREZWZhdWx0RmFjZXRzRXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvblBvaW50IHBvaW50IAotICAgICAgICAgICAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCggRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0ZBQ0VUU19FWFRFTlNJT05fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwb2ludCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJFeHRlbnNpb24gcG9pbnQgbm90IGZvdW5kISIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gY2ZnZWxzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElFeHRlbnNpb24gZXh0ZW5zaW9uIDogcG9pbnQuZ2V0RXh0ZW5zaW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZnZWwgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNmZ2Vscy5hZGQoIGNmZ2VsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX0RFRkFVTFRfRkFDRVRTICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWREZWZhdWx0RmFjZXRzKCBjb25maWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWREZWZhdWx0RmFjZXRzKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIERlZmF1bHRGYWNldHNFbnRyeSBkZmUgPSBuZXcgRGVmYXVsdEZhY2V0c0VudHJ5KCk7Ci0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9SVU5USU1FX0NPTVBPTkVOVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZmUucmN0ID0gcmVhZFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmKCBjaGlsZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZmUucmN0ID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBkZmUucmN2ZXhwciA9IG5ldyBWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4oIGRmZS5yY3QsIHYsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0ZBQ0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IHJlYWRQcm9qZWN0RmFjZXRSZWYoIGNoaWxkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB2ZXIgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgZi5oYXNWZXJzaW9uKCB2ZXIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuUmVzb3VyY2VzLmZhY2V0VmVyc2lvbk5vdERlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldElkKCksIHZlciApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbXNnICs9IE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZmUuZmFjZXRzLmFkZCggZi5nZXRWZXJzaW9uKCB2ZXIgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggZGZlLnJjdCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0RmFjZXRzLmFkZCggZGZlICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElSdW50aW1lQ29tcG9uZW50VHlwZSByZWFkUnVudGltZUNvbXBvbmVudFR5cGVSZWYoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBpc1J1bnRpbWVDb21wb25lbnRUeXBlRGVmaW5lZCggaWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkLCBpZCApICsKLSAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgcmVhZFByb2plY3RGYWNldFJlZiggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0KLSAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGlkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwucmVwb3J0TWlzc2luZ0ZhY2V0KCBpZCwgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0cmlidXRlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhcmFtcyAKLSAgICAgICAgICAgID0gbmV3IFN0cmluZ1tdIHsgZWwuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGVsLmdldE5hbWUoKSwgYXR0cmlidXRlIH07Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5taXNzaW5nQXR0cmlidXRlLCBwYXJhbXMgKTsgCi0gICAgCi0gICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNYXBwaW5nCi0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgTWFwPElQcm9qZWN0RmFjZXQsVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4+IGZhY2V0cyAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldCxWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPj4oKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBNYXA8SVJ1bnRpbWVDb21wb25lbnRUeXBlLFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPj4gcnVudGltZUNvbXBvbmVudHMgCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPElSdW50aW1lQ29tcG9uZW50VHlwZSxWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4+KCk7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0U3VwcG9ydGVkRmFjZXRzKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyApCi0gICAgICAgIAotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0ID0gcmMuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgPSByYy5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5ydW50aW1lQ29tcG9uZW50cy5jb250YWluc0tleSggcmN0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiBleHByID0gdGhpcy5ydW50aW1lQ29tcG9uZW50cy5nZXQoIHJjdCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBleHByICE9IG51bGwgJiYgISBleHByLmNoZWNrKCByY3YgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAhIHRoaXMucnVudGltZUNvbXBvbmVudHMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBNYXAuRW50cnk8SVByb2plY3RGYWNldCxWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPj4gZW50cnkgCi0gICAgICAgICAgICAgICAgIDogdGhpcy5mYWNldHMuZW50cnlTZXQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4gZXhwciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGYuZ2V0VmVyc2lvbnMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggZXhwciA9PSBudWxsIHx8IGV4cHIuY2hlY2soIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlZmF1bHRGYWNldHNFbnRyeQotICAgIHsKLSAgICAgICAgcHVibGljIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3Q7Ci0gICAgICAgIHB1YmxpYyBWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gcmN2ZXhwcjsKLSAgICAgICAgcHVibGljIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaCggZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiApCi0gICAgICAgIAotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcmN2LmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkgIT0gdGhpcy5yY3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yY3ZleHByLmNoZWNrKCByY3YgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSdW50aW1lVmFsaWRhdGlvblRocmVhZAotCi0gICAgICAgIGV4dGVuZHMgVGhyZWFkCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQWJvcnRlZDsKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLElTdGF0dXM+IHZhbGlkYXRpb25SZXN1bHRzOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFJ1bnRpbWVWYWxpZGF0aW9uVGhyZWFkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc0Fib3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSVN0YXR1cz4oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBJU3RhdHVzIGdldFZhbGlkYXRpb25SZXN1bHQoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMudmFsaWRhdGlvblJlc3VsdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25SZXN1bHRzLmdldCggcnVudGltZS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFZhbGlkYXRpb25SZXN1bHQoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHZhbGlkYXRpb25SZXN1bHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMudmFsaWRhdGlvblJlc3VsdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdHMucHV0KCBydW50aW1lLmdldE5hbWUoKSwgdmFsaWRhdGlvblJlc3VsdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoICEgdGhpcy5pc0Fib3J0ZWQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgcnVudGltZSA6IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBvbGRSZXN1bHQgPSBnZXRWYWxpZGF0aW9uUmVzdWx0KCBydW50aW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgbmV3UmVzdWx0ID0gcnVudGltZS52YWxpZGF0ZSggbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIG9sZFJlc3VsdCA9PSBudWxsIHx8ICEgb2xkUmVzdWx0LmdldE1lc3NhZ2UoKS5lcXVhbHMoIG5ld1Jlc3VsdC5nZXRNZXNzYWdlKCkgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRpb25SZXN1bHQoIHJ1bnRpbWUsIG5ld1Jlc3VsdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUV2ZW50IGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudCggcnVudGltZSwgb2xkUmVzdWx0LCBuZXdSZXN1bHQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkubm90aWZ5TGlzdGVuZXJzKCBldmVudCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoIDEwMDAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzQWJvcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdBdHRyaWJ1dGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVDb21wb25lbnRUeXBlTm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZUNvbXBvbmVudFZlcnNpb25Ob3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlZEluUGx1Z2luOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUnVudGltZU1hbmFnZXJJbXBsLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZU1hbmFnZXJJbXBsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVNYW5hZ2VySW1wbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3M2QzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZU1hbmFnZXJJbXBsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLW1pc3NpbmdBdHRyaWJ1dGUgPSBBbiBleHRlbnNpb24gZWxlbWVudCA8ezF9PiBpbiBwbHVnaW4gezB9IGlzIG1pc3NpbmcgYSByZXF1aXJlZCBhdHRyaWJ1dGUgezJ9LgotcnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkID0gUnVudGltZSBjb21wb25lbnQgdHlwZSB7MH0gaGFzIG5vdCBiZWVuIGRlZmluZWQuCi1ydW50aW1lQ29tcG9uZW50VmVyc2lvbk5vdERlZmluZWQgPSBWZXJzaW9uIHsxfSBvZiBydW50aW1lIGNvbXBvbmVudCB0eXBlIHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLXJ1bnRpbWVOb3REZWZpbmVkID0gUnVudGltZSB7MH0gaGFzIG5vdCBiZWVuIGRlZmluZWQuCi11c2VkSW5QbHVnaW4gPSBcIEl0IGlzIHVzZWQgaW4gcGx1Z2luIHswfS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvVW5rbm93blJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvVW5rbm93blJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyNWU3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1Vua25vd25SdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0KLS8qKgotICogVXNlZCB0byByZXByZXNlbnQgYSBydW50aW1lIHRoYXQncyByZWZlcmVuY2VkIGJ5IGEgcHJvamVjdCwgYnV0IGlzIG5vdAotICogZGVmaW5lZCBpbiB0aGUgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5rbm93blJ1bnRpbWUKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lCi0gICAgCi17Ci0gICAgcHVibGljIFVua25vd25SdW50aW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzZXROYW1lKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0Fic3RyYWN0RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0Fic3RyYWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTc2MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9BYnN0cmFjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5JRmlsdGVyLklGaWx0ZXJFdmVudC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5OwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpbHRlcjxUPgotCi0gICAgaW1wbGVtZW50cyBJRmlsdGVyPFQ+Ci0KLXsKLSAgICBwcml2YXRlIEZpbHRlckxpc3RlbmVyUmVnaXN0cnk8VD4gbGlzdGVuZXJzID0gbmV3IEZpbHRlckxpc3RlbmVyUmVnaXN0cnk8VD4oKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZpbHRlckxpc3RlbmVyPFQ+IGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmlsdGVyRXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRmlsdGVyTGlzdGVuZXI8VD4gbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyggZmluYWwgSUZpbHRlckV2ZW50PFQ+IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzLm5vdGlmeUxpc3RlbmVycyggZXZlbnQuZ2V0VHlwZSgpLCBldmVudCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWx0ZXJMaXN0ZW5lclJlZ2lzdHJ5PFQ+Ci0gICAgCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5PFR5cGUsSUZpbHRlckV2ZW50PFQ+LElGaWx0ZXJMaXN0ZW5lcjxUPj4KLSAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBGaWx0ZXJMaXN0ZW5lclJlZ2lzdHJ5KCkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIFR5cGUuY2xhc3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lciggZmluYWwgSUZpbHRlckxpc3RlbmVyPFQ+IGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZpbHRlckV2ZW50PFQ+IGV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXZlbnQoIGV2ZW50ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0V2ZW50TGlzdGVuZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9FdmVudExpc3RlbmVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZWRmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0V2ZW50TGlzdGVuZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEV2ZW50TGlzdGVuZXJSZWdpc3RyeTxUIGV4dGVuZHMgRW51bTxUPixFPgotewotICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8VD4gZXZlbnRUeXBlQ2xhc3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8VCxTZXQ8SUV2ZW50TGlzdGVuZXI8RT4+PiBsaXN0ZW5lcnM7Ci0gICAgCi0gICAgcHVibGljIEV2ZW50TGlzdGVuZXJSZWdpc3RyeSggZmluYWwgQ2xhc3M8VD4gZXZlbnRUeXBlQ2xhc3MgKQotICAgIHsKLSAgICAgICAgdGhpcy5ldmVudFR5cGVDbGFzcyA9IGV2ZW50VHlwZUNsYXNzOwotICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBFbnVtTWFwPFQsU2V0PElFdmVudExpc3RlbmVyPEU+Pj4oIHRoaXMuZXZlbnRUeXBlQ2xhc3MgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggVCB0IDogdGhpcy5ldmVudFR5cGVDbGFzcy5nZXRFbnVtQ29uc3RhbnRzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXQoIHQsIG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElFdmVudExpc3RlbmVyPEU+PigpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElFdmVudExpc3RlbmVyPEU+IGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBULi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsIHx8IHR5cGVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggVCB0eXBlIDogKCB0eXBlcy5sZW5ndGggPiAwID8gdHlwZXMgOiB0aGlzLmV2ZW50VHlwZUNsYXNzLmdldEVudW1Db25zdGFudHMoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KCB0eXBlICkuYWRkKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRXZlbnRMaXN0ZW5lcjxFPiBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBpZiggbGlzdGVuZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBTZXQ8SUV2ZW50TGlzdGVuZXI8RT4+IGxpc3RlbmVycyA6IHRoaXMubGlzdGVuZXJzLnZhbHVlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoIGZpbmFsIFQgZXZlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRSBldmVudCApCi0gICAgewotICAgICAgICBmb3IoIElFdmVudExpc3RlbmVyPEU+IGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudFR5cGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0ZpbHRlckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0ZpbHRlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmE0ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9GaWx0ZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsOwotCi0vKioKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJFdmVudDxUPgotCi0gICAgaW1wbGVtZW50cyBJRmlsdGVyLklGaWx0ZXJFdmVudDxUPgotewotICAgIHByaXZhdGUgZmluYWwgSUZpbHRlcjxUPiBmaWx0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlIGV2ZW50VHlwZTsKLSAgICAKLSAgICBwdWJsaWMgRmlsdGVyRXZlbnQoIGZpbmFsIElGaWx0ZXI8VD4gZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUZpbHRlcjxUPiBnZXRGaWx0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUeXBlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvSUV2ZW50TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvSUV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwZjg0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0lFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWw7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRXZlbnRMaXN0ZW5lcjxFPgotewotICAgIHZvaWQgaGFuZGxlRXZlbnQoIEUgZXZlbnQgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvSUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9JRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGU3NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgZmlsdGVycyBmb3IgdmFyaW91cyBvYmplY3QgdHlwZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlcjxUPgotewotICAgIGludGVyZmFjZSBJRmlsdGVyRXZlbnQ8VD4KLSAgICB7Ci0gICAgICAgIGVudW0gVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBGSUxURVJfQ0hBTkdFRAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUeXBlIGdldFR5cGUoKTsKLSAgICAgICAgSUZpbHRlcjxUPiBnZXRGaWx0ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50ZXJmYWNlIElGaWx0ZXJMaXN0ZW5lcjxUPgotICAgIHsKLSAgICAgICAgdm9pZCBoYW5kbGVFdmVudCggSUZpbHRlckV2ZW50PFQ+IGV2ZW50ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgdG8gbGV0IHRoZSBmaWx0ZXIgbWFrZSB0aGUgZGV0ZXJtaW5hdGlvbiB3aGV0aGVyIGFuIG9iamVjdAotICAgICAqIHBhc3NlcyB0aHJvdWdoIHRoZSBmaWx0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRoYXQgdGhlIGZpbHRlciBzaG91bGQgY2hlY2sKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgcGFzc2VzIHRocm91Z2ggdGhlIGZpbHRlciBhbmQgCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBjaGVjayggVCBvYmplY3QgKTsKLSAgICAKLSAgICB2b2lkIGFkZExpc3RlbmVyKCBJRmlsdGVyTGlzdGVuZXI8VD4gbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgSUZpbHRlckV2ZW50LlR5cGUuLi4gdHlwZXMgKTsKLSAgICAKLSAgICB2b2lkIHJlbW92ZUxpc3RlbmVyKCBJRmlsdGVyTGlzdGVuZXI8VD4gbGlzdGVuZXIgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0Fic3RyYWN0TGlzdGVuZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA3NzBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5PFQgZXh0ZW5kcyBFbnVtPFQ+LEUsTD4KLXsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IGV2ZW50VHlwZUNsYXNzOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFQsU2V0PEw+PiBsaXN0ZW5lcnM7Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0TGlzdGVuZXJSZWdpc3RyeSggZmluYWwgQ2xhc3M8VD4gZXZlbnRUeXBlQ2xhc3MgKQotICAgIHsKLSAgICAgICAgdGhpcy5ldmVudFR5cGVDbGFzcyA9IGV2ZW50VHlwZUNsYXNzOwotICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBFbnVtTWFwPFQsU2V0PEw+PiggdGhpcy5ldmVudFR5cGVDbGFzcyApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBUIHQgOiB0aGlzLmV2ZW50VHlwZUNsYXNzLmdldEVudW1Db25zdGFudHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1dCggdCwgbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8TD4oKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBMIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBULi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsIHx8IHR5cGVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggVCB0eXBlIDogKCB0eXBlcy5sZW5ndGggPiAwID8gdHlwZXMgOiB0aGlzLmV2ZW50VHlwZUNsYXNzLmdldEVudW1Db25zdGFudHMoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KCB0eXBlICkuYWRkKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBMIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNldDxMPiBsaXN0ZW5lcnMgOiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCBmaW5hbCBUIGV2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEUgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZm9yKCBMIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudFR5cGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKCBsaXN0ZW5lciwgZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG5vdGlmeUxpc3RlbmVyKCBmaW5hbCBMIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFIGV2ZW50ICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0ZpbGVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzliYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBmaWxlcy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVVdGlsCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9ET1RfUFJPSkVDVCA9ICIucHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIEZpbGVVdGlsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVFZGl0KCBmaW5hbCBJRmlsZS4uLiBmaWxlcyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IHdzLnZhbGlkYXRlRWRpdCggZmlsZXMsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUICk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3QuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgcmVzb3VyY2UgZnJvbSBhIHBsdWdpbiB0byBhIGRlc3RpbmF0aW9uIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIHBsdWdpbiBpZAotICAgICAqIEBwYXJhbSBwYXRoSW5QbHVnaW4gdGhlIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgcGx1Z2luCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGcm9tUGx1Z2luKCBmaW5hbCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoSW5QbHVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmlsZSBkZXN0aW5hdGlvbiApCi0KLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQotICAgIHsKLSAgICAgICAgY29weUZyb21QbHVnaW4oIHBsdWdpbklkLCBwYXRoSW5QbHVnaW4sIGRlc3RpbmF0aW9uLmdldExvY2F0aW9uKCkudG9GaWxlKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgcmVzb3VyY2UgZnJvbSBhIHBsdWdpbiB0byBhIGRlc3RpbmF0aW9uIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIHRoZSBwbHVnaW4gYnVuZGxlCi0gICAgICogQHBhcmFtIHBhdGhJblBsdWdpbiB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBwbHVnaW4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RnJvbVBsdWdpbiggZmluYWwgQnVuZGxlIGJ1bmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGhJblBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGaWxlIGRlc3RpbmF0aW9uICkKLQotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBjb3B5RnJvbVBsdWdpbiggYnVuZGxlLCBwYXRoSW5QbHVnaW4sIGRlc3RpbmF0aW9uLmdldExvY2F0aW9uKCkudG9GaWxlKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgcmVzb3VyY2UgZnJvbSBhIHBsdWdpbiB0byBhIGRlc3RpbmF0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgcGx1Z2luIGlkCi0gICAgICogQHBhcmFtIHBhdGhJblBsdWdpbiB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBwbHVnaW4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZyb21QbHVnaW4oIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGhJblBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZGVzdGluYXRpb24gKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIHBsdWdpbklkICk7Ci0gICAgICAgIGNvcHlGcm9tUGx1Z2luKCBidW5kbGUsIHBhdGhJblBsdWdpbiwgZGVzdGluYXRpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgcmVzb3VyY2UgZnJvbSBhIHBsdWdpbiB0byBhIGRlc3RpbmF0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgdGhlIHBsdWdpbiBidW5kbGUKLSAgICAgKiBAcGFyYW0gcGF0aEluUGx1Z2luIHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIHBsdWdpbgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGcm9tUGx1Z2luKCBmaW5hbCBCdW5kbGUgYnVuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcGF0aEluUGx1Z2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBkZXN0aW5hdGlvbiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gY29udGVudHMgPSByZWFkRmlsZUZyb21QbHVnaW4oIGJ1bmRsZSwgcGF0aEluUGx1Z2luICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVGaWxlKCBkZXN0aW5hdGlvbiwgY29udGVudHMgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRlbnRzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gcmVhZEZpbGVGcm9tUGx1Z2luKCBmaW5hbCBCdW5kbGUgYnVuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoSW5QbHVnaW4gKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRmlsZUxvY2F0b3Iub3BlblN0cmVhbSggYnVuZGxlLCBwYXRoSW5QbHVnaW4sIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBlLmdldE1lc3NhZ2UoKSwgZSApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRXb3Jrc3BhY2VGaWxlKCBmaW5hbCBGaWxlIGYgKQotICAgIHsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJvb3Qgd3Nyb290ID0gd3MuZ2V0Um9vdCgpOwotICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gbmV3IFBhdGgoIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGaWxlW10gd3NGaWxlcyA9IHdzcm9vdC5maW5kRmlsZXNGb3JMb2NhdGlvbiggcGF0aCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHdzRmlsZXMubGVuZ3RoID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3c0ZpbGVzWyAwIF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0V29ya3NwYWNlQ29udGFpbmVyKCBmaW5hbCBGaWxlIGYgKQotICAgIHsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJvb3Qgd3Nyb290ID0gd3MuZ2V0Um9vdCgpOwotICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gbmV3IFBhdGgoIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb250YWluZXJbXSB3c0NvbnRhaW5lcnMgPSB3c3Jvb3QuZmluZENvbnRhaW5lcnNGb3JMb2NhdGlvbiggcGF0aCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHdzQ29udGFpbmVycy5sZW5ndGggPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdzQ29udGFpbmVyc1sgMCBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyggZmluYWwgRmlsZSBmICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggZi5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmLmlzRmlsZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5sb2NhdGlvbklzRmlsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2cgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWtkaXJzKCBmLmdldFBhcmVudEZpbGUoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJQ29udGFpbmVyIHdzQ29udGFpbmVyID0gZ2V0V29ya3NwYWNlQ29udGFpbmVyKCBmICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB3c0NvbnRhaW5lciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgYSBmb2xkZXIuLi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJRm9sZGVyIGlGb2xkZXIgPSAoSUZvbGRlcikgd3NDb250YWluZXI7Ci0gICAgICAgICAgICAgICAgaUZvbGRlci5jcmVhdGUoIHRydWUsIHRydWUsIG51bGwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3VjY2Vzc2Z1bCA9IGYubWtkaXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBpc1N1Y2Nlc3NmdWwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhaWxlZFRvQ3JlYXRlRGlyZWN0b3J5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoIGZpbmFsIEZpbGUgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBjb250ZW50cyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIGYuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZi5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5sb2NhdGlvbklzRGlyZWN0b3J5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBta2RpcnMoIGYuZ2V0UGFyZW50RmlsZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGaWxlIHdzZmlsZSA9IGdldFdvcmtzcGFjZUZpbGUoIGYgKTsKLQotICAgICAgICBpZiggd3NmaWxlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUVkaXQoIG5ldyBJRmlsZVtdIHsgd3NmaWxlIH0gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHdzZmlsZS5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3NmaWxlLnNldENvbnRlbnRzKCBjb250ZW50cywgdHJ1ZSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3c2ZpbGUuY3JlYXRlKCBjb250ZW50cywgdHJ1ZSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGYuZXhpc3RzKCkgJiYgISBmLmNhbldyaXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuY2Fubm90V3JpdGVGaWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsgMTAyNCBdOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggaW50IGNvdW50OyAoIGNvdW50ID0gY29udGVudHMucmVhZCggYnVmZmVyICkgKSAhPSAtMTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCBidWZmZXIsIDAsIGNvdW50ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRXaGlsZVdyaXRpbmcsIGYuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2csIGUgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBvdXQgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZFdoaWxlV3JpdGluZzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90V3JpdGVGaWxlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRUb0NyZWF0ZURpcmVjdG9yeTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25Jc0RpcmVjdG9yeTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25Jc0ZpbGU7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGaWxlVXRpbC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvRmlsZVV0aWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvRmlsZVV0aWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlNTE4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0ZpbGVVdGlsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWZhaWxlZFdoaWxlV3JpdGluZyA9IEZhaWxlZCB3aGlsZSB3cml0aW5nIGZpbGUgInswfSIuCi1jYW5ub3RXcml0ZUZpbGUgPSBGaWxlICJ7MH0iIGlzIG5vdCB3cml0YWJsZS4gCi1mYWlsZWRUb0NyZWF0ZURpcmVjdG9yeSA9IEZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICJ7MH0iLgotbG9jYXRpb25Jc0RpcmVjdG9yeSA9IExvY2F0aW9uICJ7MH0iIGlzIGEgZGlyZWN0b3J5LgotbG9jYXRpb25Jc0ZpbGUgPSBMb2NhdGlvbiAiezB9IiBpcyBhIGZpbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9JbmRleGVkU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0luZGV4ZWRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNjhmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0luZGV4ZWRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEluZGV4ZWRTZXQ8SyxWPgotCi0gICAgZXh0ZW5kcyBIYXNoU2V0PFY+Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Vj4gdW5tb2RpZmlhYmxlOwotICAgIHByaXZhdGUgZmluYWwgTWFwPEssVj4gaW5kZXg7Ci0gICAgCi0gICAgcHVibGljIEluZGV4ZWRTZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy51bm1vZGlmaWFibGUgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMgKTsKLSAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBIYXNoTWFwPEssVj4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkKCBmaW5hbCBLIGtleSwKLSAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFYgdmFsdWUgKQotICAgIHsKLSAgICAgICAgcmVtb3ZlKCB0aGlzLmluZGV4LmdldCgga2V5ICkgKTsKLSAgICAgICAgYWRkKCB2YWx1ZSApOwotICAgICAgICB0aGlzLmluZGV4LnB1dCgga2V5LCB2YWx1ZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGUoIGZpbmFsIEsga2V5ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IHRoaXMuaW5kZXguZ2V0KCBrZXkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlKCB2YWx1ZSApOwotICAgICAgICAgICAgdGhpcy5pbmRleC5yZW1vdmUoIGtleSApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFYgZ2V0KCBmaW5hbCBLIGtleSApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5nZXQoIGtleSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSggZmluYWwgSyBrZXkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguY29udGFpbnNLZXkoIGtleSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PFY+IGdldFVubW9kaWZpYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy51bm1vZGlmaWFibGU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvTWlzY1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvTWlzY1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjYmE4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL01pc2NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29udGFpbnMgbWlzY2VsbGFuZW91cyB1dGlsaXR5IGZ1bmN0aW9ucy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIE1pc2NVdGlsCi17Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsKCBmaW5hbCBPYmplY3Qgb2JqMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmoyICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9iajEuZXF1YWxzKCBvYmoyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL09iamVjdFJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9PYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0NGJjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL09iamVjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RSZWZlcmVuY2U8VD4KLXsKLSAgICBwcml2YXRlIFQgb2JqZWN0OwotICAgIAotICAgIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UoKQotICAgIHsKLSAgICAgICAgdGhpcy5vYmplY3QgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlKCBmaW5hbCBUIG9iamVjdCApCi0gICAgewotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFQgZ2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9iamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0KCBmaW5hbCBUIG9iamVjdCApCi0gICAgewotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1BsdWdpblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUGx1Z2luVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI2NDE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUGx1Z2luVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgaGVscGZ1bCBmb3IgaW1wbGVtZW50aW5nIGV4dGVuc2lvbiBwb2ludHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFBsdWdpblV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLQotICAgICAgICBleHRlbmRzIEV4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgfQotICAgIAotCXByaXZhdGUgUGx1Z2luVXRpbCgpIHt9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPElFeHRlbnNpb24+IGZpbmRFeHRlbnNpb25zKCBmaW5hbCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCApCi0gICAgewotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCggcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwb2ludCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJRXh0ZW5zaW9uPiBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDxJRXh0ZW5zaW9uPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBvaW50LmdldEV4dGVuc2lvbnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkKCBleHRlbnNpb24gKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGdldFRvcExldmVsRWxlbWVudHMoIGZpbmFsIENvbGxlY3Rpb248SUV4dGVuc2lvbj4gZXh0ZW5zaW9ucyApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKCBlbGVtZW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0cmlidXRlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGVsLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXh0UG9pbnRJZCA9IGVsLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLm1pc3NpbmdBdHRyaWJ1dGUsIHBsdWdpbklkLCBleHRQb2ludElkLCBlbC5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlICk7Ci0KLSAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydE1pc3NpbmdFbGVtZW50KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWxlbWVudCApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBlbC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGV4dFBvaW50SWQgPSBlbC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5taXNzaW5nRWxlbWVudCwgcGx1Z2luSWQsIGV4dFBvaW50SWQsIGVsLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ICk7Ci0KLSAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcXVpcmVkQXR0cmlidXRlKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0cmlidXRlICkKLQotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gZWwuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGUgKTsKLQotICAgICAgICBpZiggdmFsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBlbCwgYXR0cmlidXRlICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uRWxlbWVudCBmaW5kUmVxdWlyZWRFbGVtZW50KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkRWxlbWVudCApCi0KLSAgICAgICAgdGhyb3dzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLQotICAgIHsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbC5nZXRDaGlsZHJlbiggY2hpbGRFbGVtZW50ICk7Ci0KLSAgICAgICAgaWYoIGNoaWxkcmVuLmxlbmd0aCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0VsZW1lbnQoIGVsLCBjaGlsZEVsZW1lbnQgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hpbGRyZW5bIDAgXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uRWxlbWVudCBmaW5kT3B0aW9uYWxFbGVtZW50KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkRWxlbWVudCApCi0gICAgewotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsLmdldENoaWxkcmVuKCBjaGlsZEVsZW1lbnQgKTsKLQotICAgICAgICBpZiggY2hpbGRyZW4ubGVuZ3RoID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlblsgMCBdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRWYWx1ZSggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSApCi0gICAgewotICAgICAgICBpZiggZWwgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZWwuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRleHQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0ZXh0Lmxlbmd0aCgpID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBpbnN0YW50aWF0ZSggZmluYWwgU3RyaW5nIHBsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gaW50ZXJmYyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggcGx1Z2luSWQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIE9iamVjdCBvYmo7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2wgPSBidW5kbGUubG9hZENsYXNzKCBjbG5hbWUgKTsKLSAgICAgICAgICAgIG9iaiA9IGNsLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFpbGVkVG9DcmVhdGUsIGNsbmFtZSApOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnLCBlICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICEgaW50ZXJmYy5pc0Fzc2lnbmFibGVGcm9tKCBvYmouZ2V0Q2xhc3MoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5kb2VzTm90SW1wbGVtZW50LCBjbG5hbWUsIGludGVyZmMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChUKSBvYmo7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nQXR0cmlidXRlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nRWxlbWVudDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkVG9DcmVhdGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvZXNOb3RJbXBsZW1lbnQ7Ci0gICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFBsdWdpblV0aWwuY2xhc3MuZ2V0TmFtZSgpLCBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmc0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJpbmQoIG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgfSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9QbHVnaW5VdGlsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1BsdWdpblV0aWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3MzQ5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1BsdWdpblV0aWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotbWlzc2luZ0F0dHJpYnV0ZSA9IEV4dGVuc2lvbiBlbGVtZW50IDx7Mn0+IGlzIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlICJ7M30iLiBbcGx1Z2luOiAiezB9IjsgZXh0ZW5zaW9uIHBvaW50OiAiezF9Il0KLW1pc3NpbmdFbGVtZW50ID0gRXh0ZW5zaW9uIGVsZW1lbnQgPHsyfT4gaXMgbWlzc2luZyByZXF1aXJlZCBjaGlsZCBlbGVtZW50IDx7M30+LiBbcGx1Z2luOiAiezB9IjsgZXh0ZW5zaW9uIHBvaW50OiAiezF9Il0KLWZhaWxlZFRvQ3JlYXRlID0gRmFpbGVkIHRvIGluc3RhbnRpYXRlIGNsYXNzIHswfS4KLWRvZXNOb3RJbXBsZW1lbnQgPSBDbGFzcyB7MH0gZG9lcyBub3QgaW1wbGVtZW50IHsxfSBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1Byb2dyZXNzTW9uaXRvclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUHJvZ3Jlc3NNb25pdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODA0YjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUHJvZ3Jlc3NNb25pdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvZ3Jlc3NNb25pdG9yVXRpbCAKLXsKLSAgICBwcml2YXRlIFByb2dyZXNzTW9uaXRvclV0aWwoKSB7fQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWdpblRhc2soIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFza05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRvdGFsV29yayApCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIHRhc2tOYW1lLCB0b3RhbFdvcmsgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd29ya2VkKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdvcmsgKQotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCB3b3JrICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvbmUoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbiggZmluYWwgSVByb2dyZXNzTW9uaXRvciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRpY2tzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdWJtb24oIHBhcmVudCwgdGlja3MsIFN1YlByb2dyZXNzTW9uaXRvci5TVVBQUkVTU19TVUJUQVNLX0xBQkVMICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbiggZmluYWwgSVByb2dyZXNzTW9uaXRvciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRpY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdHlsZSApCi0gICAgewotICAgICAgICByZXR1cm4gKCBwYXJlbnQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKCBwYXJlbnQsIHRpY2tzLCBzdHlsZSApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJUYXNrKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YXNrTmFtZSApCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5zdWJUYXNrKCB0YXNrTmFtZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0lmQ2FuY2VsZWQoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9TdGF0dXNXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1N0YXR1c1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNWQxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1N0YXR1c1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byB3cmFwIGFuIGV4aXN0aW5nIHN0YXR1cyBvYmplY3QgYW5kIG92ZXJyaWRlCi0gKiB0aGUgc3RhdHVzIGNvZGUuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0dXNXcmFwcGVyCi0KLSAgICBpbXBsZW1lbnRzIElTdGF0dXMKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElTdGF0dXMgYmFzZTsKLSAgICBwcml2YXRlIEludGVnZXIgY29kZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFN0YXR1c1dyYXBwZXIoIGZpbmFsIElTdGF0dXMgc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZSA9IHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXNbXSBnZXRDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmNvZGUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNvZGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldENvZGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDb2RlKCBmaW5hbCBpbnQgY29kZSApCi0gICAgewotICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLm1lc3NhZ2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0UGx1Z2luKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTZXZlcml0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldFNldmVyaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmlzTXVsdGlTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09LKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2UuaXNPSygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoIGZpbmFsIGludCBzZXZlcml0eU1hc2sgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5tYXRjaGVzKCBzZXZlcml0eU1hc2sgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1Vua25vd25WZXJzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1Vua25vd25WZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzVjMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9Vbmtub3duVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5rbm93blZlcnNpb248VCBleHRlbmRzIElWZXJzaW9uPgotCi0gICAgaW1wbGVtZW50cyBJVmVyc2lvbgotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbmFibGU8VD4gdmVyc2lvbmFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZzsKLSAgICAKLSAgICBwdWJsaWMgVW5rbm93blZlcnNpb24oIGZpbmFsIFZlcnNpb25hYmxlPFQ+IHZlcnNpb25hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb25TdHJpbmcgKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uYWJsZSA9IHZlcnNpb25hYmxlOwotICAgICAgICB0aGlzLnZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uU3RyaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvblN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXAgPSB0aGlzLnZlcnNpb25hYmxlLmdldFZlcnNpb25Db21wYXJhdG9yKCk7Ci0gICAgICAgICAgICByZXR1cm4gY29tcC5jb21wYXJlKCB0aGlzLnZlcnNpb25TdHJpbmcsICggKElWZXJzaW9uKSBvYmogICkuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbkV4cHIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbkV4cHIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiMDM4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25FeHByLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFZlcnNpb25FeHByPFQgZXh0ZW5kcyBJVmVyc2lvbj4KLQotICAgIGltcGxlbWVudHMgSVZlcnNpb25FeHByCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMV9TVEFSVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMV9QQVJTSU5HX1NUQVJUX1ZFUlNJT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTTFfUEFSU0lOR19FTkRfVkVSU0lPTiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMV9GSU5JU0hFRF9SQU5HRV9JTkNMVVNJVkUgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTTFfRklOSVNIRURfUkFOR0VfRVhDTFVTSVZFID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU00xX1BBUlNJTkdfV0lMRENBUkQgPSA1OwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTTJfVkVSU0lPTl9TVEFSVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMl9WRVJTSU9OX0NPTlRJTlVJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTTJfRVNDQVBFID0gMjsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25hYmxlPFQ+IHZlcnNpb25hYmxlOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJU3ViRXhwcj4gc3ViZXhwcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlZEluUGx1Z2luOwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIFZlcnNpb25FeHByKCBmaW5hbCBPYmplY3QgdmVyc2lvbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VkSW5QbHVnaW4gKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMoIChWZXJzaW9uYWJsZTxUPikgdmVyc2lvbmFibGUsIGV4cHIsIHVzZWRJblBsdWdpbiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVmVyc2lvbkV4cHIoIGZpbmFsIFZlcnNpb25hYmxlPFQ+IHZlcnNpb25hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlZEluUGx1Z2luICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25hYmxlID0gdmVyc2lvbmFibGU7Ci0gICAgICAgIHRoaXMuc3ViZXhwcnMgPSBuZXcgQXJyYXlMaXN0PElTdWJFeHByPigpOwotICAgICAgICB0aGlzLnVzZWRJblBsdWdpbiA9IHVzZWRJblBsdWdpbjsKLSAgICAgICAgCi0gICAgICAgIGludCBzdGF0ZSA9IFNNMV9TVEFSVDsKLSAgICAgICAgUmFuZ2UgcmFuZ2UgPSBudWxsOwotICAgICAgICBib29sZWFuIHVzaW5nRGVwcmVjYXRlZFN5bnRheCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgZm9yKCBNdXRhYmxlSW50ZWdlciBwb3NpdGlvbiA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOyAKLSAgICAgICAgICAgICBwb3NpdGlvbi52YWx1ZSA8IGV4cHIubGVuZ3RoKCk7IHBvc2l0aW9uLnZhbHVlKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gZXhwci5jaGFyQXQoIHBvc2l0aW9uLnZhbHVlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN3aXRjaCggc3RhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU00xX1NUQVJUOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNoID09ICdbJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5pbmNsdWRlc1N0YXJ0VmVyc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNNMV9QQVJTSU5HX1NUQVJUX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJygnICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmluY2x1ZGVzU3RhcnRWZXJzaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNNMV9QQVJTSU5HX1NUQVJUX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJyonICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJleHBycy5hZGQoIG5ldyBXaWxkY2FyZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNNMV9QQVJTSU5HX1dJTERDQVJEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICcgJyB8fCBjaCA9PSAnLCcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXhpdFN0YXRlID0gcGFyc2VWZXJzaW9uKCBleHByLCBwb3NpdGlvbiwgYnVmICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBleGl0U3RhdGUgPT0gU00xX1NUQVJUICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdnN0ciA9IGJ1Zi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJhbmdlIHIgPSBuZXcgUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdnN0ci5zdGFydHNXaXRoKCAiPj0iICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnN0YXJ0VmVyc2lvbiA9IHBhcnNlVmVyc2lvbiggdnN0ci5zdWJzdHJpbmcoIDIgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmluY2x1ZGVzU3RhcnRWZXJzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdEZXByZWNhdGVkU3ludGF4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdnN0ci5zdGFydHNXaXRoKCAiPiIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3RhcnRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCB2c3RyLnN1YnN0cmluZyggMSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaW5jbHVkZXNTdGFydFZlcnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdEZXByZWNhdGVkU3ludGF4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdnN0ci5zdGFydHNXaXRoKCAiPD0iICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmVuZFZlcnNpb24gPSBwYXJzZVZlcnNpb24oIHZzdHIuc3Vic3RyaW5nKCAyICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmNsdWRlc0VuZFZlcnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0RlcHJlY2F0ZWRTeW50YXggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB2c3RyLnN0YXJ0c1dpdGgoICI8IiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5lbmRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCB2c3RyLnN1YnN0cmluZyggMSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaW5jbHVkZXNFbmRWZXJzaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nRGVwcmVjYXRlZFN5bnRheCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3RhcnRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCB2c3RyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaW5jbHVkZXNTdGFydFZlcnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmVuZFZlcnNpb24gPSByLnN0YXJ0VmVyc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmNsdWRlc0VuZFZlcnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YmV4cHJzLmFkZCggciApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXhpdFN0YXRlID09IFNNMV9GSU5JU0hFRF9SQU5HRV9JTkNMVVNJVkUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSA9PSBTTTFfRklOSVNIRURfUkFOR0VfRVhDTFVTSVZFICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZFZlcnNpb24gPSBwYXJzZVZlcnNpb24oIGJ1Zi50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBleGl0U3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udmFsdWUtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkVmVyc2lvbkV4cHJFeGNlcHRpb24oIGV4cHIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU00xX1BBUlNJTkdfU1RBUlRfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleGl0U3RhdGUgPSBwYXJzZVZlcnNpb24oIGV4cHIsIHBvc2l0aW9uLCBidWYgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXhpdFN0YXRlID09IFNNMV9TVEFSVCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0VmVyc2lvbiA9IHBhcnNlVmVyc2lvbiggYnVmLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViZXhwcnMuYWRkKCByYW5nZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBleGl0U3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXhpdFN0YXRlID09IFNNMV9QQVJTSU5HX0VORF9WRVJTSU9OICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCBidWYudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBleGl0U3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkVmVyc2lvbkV4cHJFeGNlcHRpb24oIGV4cHIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU00xX1BBUlNJTkdfRU5EX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXhpdFN0YXRlID0gcGFyc2VWZXJzaW9uKCBleHByLCBwb3NpdGlvbiwgYnVmICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggZXhpdFN0YXRlID09IFNNMV9GSU5JU0hFRF9SQU5HRV9JTkNMVVNJVkUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSA9PSBTTTFfRklOSVNIRURfUkFOR0VfRVhDTFVTSVZFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kVmVyc2lvbiA9IHBhcnNlVmVyc2lvbiggYnVmLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZXhpdFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udmFsdWUtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggZXhwciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTFfRklOSVNIRURfUkFOR0VfSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgIGNhc2UgU00xX0ZJTklTSEVEX1JBTkdFX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLmluY2x1ZGVzRW5kVmVyc2lvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKCBzdGF0ZSA9PSBTTTFfRklOSVNIRURfUkFOR0VfSU5DTFVTSVZFICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YmV4cHJzLmFkZCggcmFuZ2UgKTsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTTTFfU1RBUlQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTFfUEFSU0lOR19XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBjaCA9PSAnICcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnLCcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNNMV9TVEFSVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggZXhwciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBSZXBvcnQgdGhlIHVzZSBvZiBkZXByZWNhdGVkIHN5bnRheC4KLSAgICAgICAgCi0gICAgICAgIGlmKCB1c2luZ0RlcHJlY2F0ZWRTeW50YXggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy51c2VkSW5QbHVnaW4gPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnID0gUmVzb3VyY2VzLmRlcHJlY2F0ZWRTeW50YXhOb1BsdWdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmRlcHJlY2F0ZWRTeW50YXgsIHRoaXMudXNlZEluUGx1Z2luICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2dXYXJuaW5nKCBtc2csIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBwYXJzZVZlcnNpb24oIGZpbmFsIFN0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdXRhYmxlSW50ZWdlciBwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciB2ZXJzaW9uICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpbnQgbG9jYWxTdGF0ZSA9IFNNMl9WRVJTSU9OX1NUQVJUOwotICAgICAgICBpbnQgZXhpdFN0YXRlID0gLTE7Ci0gICAgICAgIAotICAgICAgICBmb3IoIDsgZXhpdFN0YXRlID09IC0xICYmIHBvc2l0aW9uLnZhbHVlIDwgc3RyLmxlbmd0aCgpOyAKLSAgICAgICAgICAgICBwb3NpdGlvbi52YWx1ZSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHN0ci5jaGFyQXQoIHBvc2l0aW9uLnZhbHVlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN3aXRjaCggbG9jYWxTdGF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTJfVkVSU0lPTl9TVEFSVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBjaCA9PSAnWycgfHwgY2ggPT0gJygnIHx8IGNoID09ICddJyB8fCBjaCA9PSAnKScgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICctJyB8fCBjaCA9PSAnLCcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkVmVyc2lvbkV4cHJFeGNlcHRpb24oIHN0ciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICdcXCcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0YXRlID0gU00yX0VTQ0FQRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnICcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGF0ZSA9IFNNMl9WRVJTSU9OX0NPTlRJTlVJTkc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNNMl9WRVJTSU9OX0NPTlRJTlVJTkc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggY2ggPT0gJ1snIHx8IGNoID09ICcoJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggc3RyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJ1xcJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RhdGUgPSBTTTJfRVNDQVBFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICcsJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSA9IFNNMV9TVEFSVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnLScgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUgPSBTTTFfUEFSU0lOR19FTkRfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnXScgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUgPSBTTTFfRklOSVNIRURfUkFOR0VfSU5DTFVTSVZFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICcpJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSA9IFNNMV9GSU5JU0hFRF9SQU5HRV9FWENMVVNJVkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJyAnICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLmFwcGVuZCggY2ggKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU00yX0VTQ0FQRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBvc2l0aW9uLnZhbHVlLS07Ci0gICAgICAgIAotICAgICAgICBpZiggZXhpdFN0YXRlICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGV4aXRTdGF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBsb2NhbFN0YXRlID09IFNNMl9WRVJTSU9OX0NPTlRJTlVJTkcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGVuZCBvZiBpbnB1dC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gU00xX1NUQVJUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0LgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggc3RyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJVmVyc2lvbiBwYXJzZVZlcnNpb24oIGZpbmFsIFN0cmluZyBzdHIgKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMudmVyc2lvbmFibGUuaGFzVmVyc2lvbiggc3RyICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uYWJsZS5nZXRWZXJzaW9uKCBzdHIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVW5rbm93blZlcnNpb248VD4oIHRoaXMudmVyc2lvbmFibGUsIHN0ciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrKCBmaW5hbCBJVmVyc2lvbiB2ZXIgKQotICAgIHsKLSAgICAgICAgZm9yKCBJU3ViRXhwciBzdWJleHByIDogdGhpcy5zdWJleHBycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBzdWJleHByLmV2YWx1YXRlKCB2ZXIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoIGZpbmFsIFN0cmluZyB2ZXIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrKCBwYXJzZVZlcnNpb24oIHZlciApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlVmVyc2lvbk1hdGNoKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnN1YmV4cHJzLnNpemUoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVN1YkV4cHIgc3ViRXhwciA9IHRoaXMuc3ViZXhwcnMuZ2V0KCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzdWJFeHByIGluc3RhbmNlb2YgUmFuZ2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gKFJhbmdlKSBzdWJFeHByOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCByYW5nZS5zdGFydFZlcnNpb24uZXF1YWxzKCByYW5nZS5lbmRWZXJzaW9uICkgJiYKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5jbHVkZXNTdGFydFZlcnNpb24gPT0gcmFuZ2UuaW5jbHVkZXNFbmRWZXJzaW9uID09IHRydWUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVBbGxvd05ld2VyKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnN1YmV4cHJzLnNpemUoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVN1YkV4cHIgc3ViRXhwciA9IHRoaXMuc3ViZXhwcnMuZ2V0KCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzdWJFeHByIGluc3RhbmNlb2YgUmFuZ2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gKFJhbmdlKSBzdWJFeHByOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHJhbmdlLnN0YXJ0VmVyc2lvbiAhPSBudWxsICYmIHJhbmdlLmVuZFZlcnNpb24gPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICByYW5nZS5pbmNsdWRlc1N0YXJ0VmVyc2lvbiAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzV2lsZGNhcmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3ViZXhwcnMuc2l6ZSgpID09IDEgJiYgCi0gICAgICAgICAgICAgICB0aGlzLnN1YmV4cHJzLmdldCggMCApIGluc3RhbmNlb2YgV2lsZGNhcmQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKCBpc1NpbmdsZVZlcnNpb25NYXRjaCgpIHx8IGlzU2ltcGxlQWxsb3dOZXdlcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSAoUmFuZ2UpIHRoaXMuc3ViZXhwcnMuZ2V0KCAwICk7Ci0gICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElTdWJFeHByIHN1YmV4cHIgOiB0aGlzLnN1YmV4cHJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGJ1Zi5sZW5ndGgoKSA+IDAgKSBidWYuYXBwZW5kKCAnLCcgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHN1YmV4cHIudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnN1YmV4cHJzLnNpemUoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVN1YkV4cHIgc3ViZXhwciA9IHRoaXMuc3ViZXhwcnMuZ2V0KCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzdWJleHByIGluc3RhbmNlb2YgUmFuZ2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFJhbmdlIHIgPSAoUmFuZ2UpIHN1YmV4cHI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHIuaXNTaW5nbGVWZXJzaW9uKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc3RhcnRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggci5lbmRWZXJzaW9uID09IG51bGwgJiYgci5pbmNsdWRlc1N0YXJ0VmVyc2lvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy52ZXJzaW9uT3JOZXdlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zdGFydFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBvbmx5U2luZ2xlVmVyc2lvbnMgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJU3ViRXhwciBzdWJleHByIDogdGhpcy5zdWJleHBycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhICggc3ViZXhwciBpbnN0YW5jZW9mIFJhbmdlICkgfHwgCi0gICAgICAgICAgICAgICAgISAoIChSYW5nZSkgc3ViZXhwciApLmlzU2luZ2xlVmVyc2lvbigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvbmx5U2luZ2xlVmVyc2lvbnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIG9ubHlTaW5nbGVWZXJzaW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIGZvciggSXRlcmF0b3I8SVN1YkV4cHI+IGl0ciA9IHRoaXMuc3ViZXhwcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFJhbmdlIHIgPSAoUmFuZ2UpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGJ1Zi5sZW5ndGgoKSA+IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGl0ci5oYXNOZXh0KCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiLCAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICIgb3IgIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggci5zdGFydFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIENvcmVFeGNlcHRpb24gY3JlYXRlSW52YWxpZFZlcnNpb25FeHByRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgc3RyICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5pbnZhbGlkVmVyc2lvbkV4cHIsIHN0ciApOwotICAgIAotICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2cgKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKCBzdCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgSVN1YkV4cHIKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZXZhbHVhdGUoIElWZXJzaW9uIHZlcnNpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmFuZ2UKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJU3ViRXhwcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJVmVyc2lvbiBzdGFydFZlcnNpb24gPSBudWxsOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc1N0YXJ0VmVyc2lvbiA9IGZhbHNlOwotICAgICAgICBwdWJsaWMgSVZlcnNpb24gZW5kVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVzRW5kVmVyc2lvbiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaW5nbGVWZXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRWZXJzaW9uLmVxdWFscyggdGhpcy5lbmRWZXJzaW9uICkgJiYKLSAgICAgICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVzU3RhcnRWZXJzaW9uID09IHRoaXMuaW5jbHVkZXNFbmRWZXJzaW9uID09IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCBmaW5hbCBJVmVyc2lvbiB2ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuc3RhcnRWZXJzaW9uICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXMgPSB2ZXJzaW9uLmNvbXBhcmVUbyggdGhpcy5zdGFydFZlcnNpb24gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISAoIHJlcyA+IDAgfHwgKCByZXMgPT0gMCAmJiB0aGlzLmluY2x1ZGVzU3RhcnRWZXJzaW9uICkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5lbmRWZXJzaW9uICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXMgPSB2ZXJzaW9uLmNvbXBhcmVUbyggdGhpcy5lbmRWZXJzaW9uICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgKCByZXMgPCAwIHx8ICggcmVzID09IDAgJiYgdGhpcy5pbmNsdWRlc0VuZFZlcnNpb24gKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuc3RhcnRWZXJzaW9uLmVxdWFscyggdGhpcy5lbmRWZXJzaW9uICkgJiYKLSAgICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVzU3RhcnRWZXJzaW9uID09IHRoaXMuaW5jbHVkZXNFbmRWZXJzaW9uID09IHRydWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5zdGFydFZlcnNpb24gIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmluY2x1ZGVzU3RhcnRWZXJzaW9uID8gJ1snIDogJygnICk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMuc3RhcnRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5lbmRWZXJzaW9uICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGJ1Zi5sZW5ndGgoKSAhPSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggJy0nICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMuZW5kVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5pbmNsdWRlc0VuZFZlcnNpb24gPyAnXScgOiAnKScgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFdpbGRjYXJkCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSVN1YkV4cHIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSggZmluYWwgSVZlcnNpb24gdmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElWZXJzaW9uRXhwci5XSUxEQ0FSRF9TWU1CT0w7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTXV0YWJsZUludGVnZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgdmFsdWUgPSAwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkVmVyc2lvbkV4cHI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcHJlY2F0ZWRTeW50YXg7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcHJlY2F0ZWRTeW50YXhOb1BsdWdpbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk9yTmV3ZXI7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBWZXJzaW9uRXhwci5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uRXhwci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uRXhwci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhkMmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbkV4cHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWludmFsaWRWZXJzaW9uRXhwciA9IFZlcnNpb24gZXhwcmVzc2lvbiAiezB9IiBpcyBpbnZhbGlkLgotCi1kZXByZWNhdGVkU3ludGF4ID0gXAotVGhlICI+IiwgIj49IiwgIjwiLCBhbmQgIjw9IiBub3RhdGlvbiBpbiB2ZXJzaW9uIGV4cHJlc3Npb25zIGhhcyBiZWVuIFwKLWRlcHJlY2F0ZWQuIEl0IHVzZWQgaW4gcGx1Z2luIHswfS4gTm90ZSB0aGF0IHRoZSBhbmdsZSBicmFja2V0cyBhcmUgXAotcmVwcmVzZW50ZWQgdmlhICImbHQ7IiBhbmQgIiZndDsiIGluIHRoZSBwbHVnaW4ueG1sIGZpbGVzLiBUaGUgZnVuY3Rpb25hbGl0eSBcCi1oYXMgYmVlbiByZXBsYWNlZCB3aXRoIHJhbmdlIG5vdGF0aW9uLiBGb3IgaW5zdGFuY2UgIltYLVkpIiBtZWFucyBhbGwgXAotdmVyc2lvbnMgZ3JlYXRlciBvciBlcXVhbHMgdG8gWCBhbmQgbGVzcyB0aGFuIFkuIE9wZW4gcmFuZ2VzIHN1Y2ggYXMgIihYIiBvciBcCi0iWV0iIGFyZSBhbHNvIGFsbG93ZWQuCi0KLWRlcHJlY2F0ZWRTeW50YXhOb1BsdWdpbiA9IFwKLVRoZSAiPiIsICI+PSIsICI8IiwgYW5kICI8PSIgbm90YXRpb24gaW4gdmVyc2lvbiBleHByZXNzaW9ucyBoYXMgYmVlbiBcCi1kZXByZWNhdGVkLiBOb3RlIHRoYXQgdGhlIGFuZ2xlIGJyYWNrZXRzIGFyZSBcCi1yZXByZXNlbnRlZCB2aWEgIiZsdDsiIGFuZCAiJmd0OyIgaW4gdGhlIHBsdWdpbi54bWwgZmlsZXMuIFRoZSBmdW5jdGlvbmFsaXR5IFwKLWhhcyBiZWVuIHJlcGxhY2VkIHdpdGggcmFuZ2Ugbm90YXRpb24uIEZvciBpbnN0YW5jZSAiW1gtWSkiIG1lYW5zIGFsbCBcCi12ZXJzaW9ucyBncmVhdGVyIG9yIGVxdWFscyB0byBYIGFuZCBsZXNzIHRoYW4gWS4gT3BlbiByYW5nZXMgc3VjaCBhcyAiKFgiIG9yIFwKLSJZXSIgYXJlIGFsc28gYWxsb3dlZC4KLQotdmVyc2lvbk9yTmV3ZXIgPSB7MH0gb3IgbmV3ZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25hYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmRkZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZlcnNpb25hYmxlPFQgZXh0ZW5kcyBJVmVyc2lvbj4KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gREVGQVVMVF9WRVJTSU9OX0NPTVBBUkFUT1IKLSAgICAgICAgPSBuZXcgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yKCk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgSW5kZXhlZFNldDxTdHJpbmcsVD4gdmVyc2lvbnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbkNvbXBhcmF0b3JDbGFzczsKLSAgICBwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvcjsKLSAgICAKLSAgICBwdWJsaWMgVmVyc2lvbmFibGUoKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9ucyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxUPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklkKCk7Ci0gICAgCi0gICAgcHVibGljIFNldDxUPiBnZXRWZXJzaW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9ucy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxUPiBnZXRWZXJzaW9ucyggZmluYWwgU3RyaW5nIGV4cHIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFZlcnNpb25FeHByPFQ+IHByZXBhcmVkID0gbmV3IFZlcnNpb25FeHByPFQ+KCB0aGlzLCBleHByLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIFNldDxUPiByZXN1bHQgPSBuZXcgSGFzaFNldDxUPigpOwotICAgICAgICAgCi0gICAgICAgIGZvciggVCB2ZXIgOiB0aGlzLnZlcnNpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHByZXBhcmVkLmNoZWNrKCB2ZXIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggdmVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUIGdldFZlcnNpb24oIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFQgdmVyID0gdGhpcy52ZXJzaW9ucy5nZXQoIHZlcnNpb24gKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB2ZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIGNyZWF0ZVZlcnNpb25Ob3RGb3VuZEVyck1zZyggdmVyc2lvbiApICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB2ZXI7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIFQgZ2V0TGF0ZXN0VmVyc2lvbigpCi0gICAgewotICAgICAgICBpZiggdGhpcy52ZXJzaW9ucy5zaXplKCkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLm1heCggdGhpcy52ZXJzaW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVmVyc2lvbiggZmluYWwgU3RyaW5nIHZlcnNpb24gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbnMuY29udGFpbnNLZXkoIHZlcnNpb24gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUPiBnZXRTb3J0ZWRWZXJzaW9ucyggZmluYWwgYm9vbGVhbiBhc2NlbmRpbmcgKQotICAgIHsKLSAgICAgICAgQ29tcGFyYXRvcjxUPiBjb21wOwotICAgICAgICAKLSAgICAgICAgaWYoIGFzY2VuZGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXAgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY29tcCA9IG5ldyBDb21wYXJhdG9yPFQ+KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSggZmluYWwgVCB2ZXIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVCB2ZXIyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXIxLmNvbXBhcmVUbyggdmVyMiApICogLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8VD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VD4oIHRoaXMudmVyc2lvbnMgKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCggbGlzdCwgY29tcCApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIENvbXBhcmF0b3I8U3RyaW5nPiBnZXRWZXJzaW9uQ29tcGFyYXRvcigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXA7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy52ZXJzaW9uQ29tcGFyYXRvckNsYXNzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wID0gREVGQVVMVF9WRVJTSU9OX0NPTVBBUkFUT1I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy52ZXJzaW9uQ29tcGFyYXRvciA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCBnZXRQbHVnaW5JZCgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBjbCAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gYnVuZGxlLmxvYWRDbGFzcyggdGhpcy52ZXJzaW9uQ29tcGFyYXRvckNsYXNzICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb25Db21wYXJhdG9yID0gKENvbXBhcmF0b3I8U3RyaW5nPikgY2wubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRUb0NyZWF0ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb25Db21wYXJhdG9yQ2xhc3MgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnLCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3QgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbXAgPSB0aGlzLnZlcnNpb25Db21wYXJhdG9yOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbkNvbXBhcmF0b3IoIGZpbmFsIFN0cmluZyBjbG5hbWUgKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uQ29tcGFyYXRvckNsYXNzID0gY2xuYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGNyZWF0ZVZlcnNpb25Ob3RGb3VuZEVyck1zZyggU3RyaW5nIHZlcnN0ciApOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZFRvQ3JlYXRlOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggVmVyc2lvbmFibGUuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbmFibGUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbmFibGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyMTlhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25hYmxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1mYWlsZWRUb0NyZWF0ZSA9IEZhaWxlZCB0byBpbnN0YW50aWF0ZSBjbGFzcyB7MH0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1htbFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvWG1sVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY0YmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvWG1sVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBYbWxVdGlsCi17Ci0gICAgcHJpdmF0ZSBYbWxVdGlsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoIGZpbmFsIFN0cmluZyBzdHJpbmcgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSBzdHJpbmcubGVuZ3RoKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gc3RyaW5nLmNoYXJBdCggaSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2ggPT0gJzwnICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiJmx0OyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJz4nICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiJmd0OyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJyYnICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiJmFtcDsiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3NGM3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiOGUzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTk3ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgY29udGVudC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0b2MueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvZGVzY3JpcHRpb24uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9kZXNjcmlwdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2M4YTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9kZXNjcmlwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhCi0gIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLSAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkNoZWNraW5nIFdUUCBvdXQ8L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+RmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yazwvcD4KLQotPHA+VGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgYWxsb3dzIHRoZSBwbHVnaW4gZGV2ZWxvcGVyIHRvIHRoaW5rIG9mIAotcHJvamVjdHMgYXMgY29tcG9zZWQgb2YgdW5pdHMgb2YgZnVuY3Rpb25hbGl0eSwgb3RoZXJ3aXNlIGtub3duIGFzIGZhY2V0cywgdGhhdCAKLWNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBieSB0aGUgdXNlci48L3A+Ci0KLTxwPlByb2plY3QgZmFjZXRzIGFyZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBmb3IgYWRkaW5nIG5hdHVyZXMsIGJ1aWxkZXJzLCAKLWNsYXNzcGF0aCBlbnRyaWVzLCBhbmQgcmVzb3VyY2VzIHRvIGEgcHJvamVjdC48L3A+Ci0KLTxwPlByaW1hcnkgQmVuZWZpdHM8L3A+Ci0KLTx1bD4KLSAgPGxpPkNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlLjwvbGk+Ci0gIDxsaT5BYmlsaXR5IHRvIGFjY3VyYXRlbHkgZGVzY3JpYmUgY2FwYWJpbGl0aWVzIG9mIHRoZSBydW50aW1lIHBsYXRmb3JtLjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTdjODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L2Rvd25sb2Fkcy9lbmFibGVtZW50LWV4YW1wbGUuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNlMzZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9lbmFibGluZy1iYXNlZC1vbi1mYWNldHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLSAgCi08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gIDx0aXRsZT5FbmFibGluZyBVSSBFbGVtZW50cyBCYXNlZCBvbiBQcm9qZWN0IEZhY2V0czwvdGl0bGU+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9InR1dG9yaWFsL3R1dG9yaWFsLmNzcyIvPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGgxIGFsaWduPSJjZW50ZXIiPkVuYWJsaW5nIFVJIEVsZW1lbnRzIEJhc2VkIG9uIFByb2plY3QgRmFjZXRzPC9oMT4KLQotPHA+VXNlciBpbnRlcmZhY2UgZWxlbWVudHMgb2Z0ZW4gbmVlZCB0byBiZSBzZWxlY3RpdmVseSBlbmFibGVkIGJhc2VkIG9uIHRoZQotcHJlc2VuY2Ugb2YgYSBmYWNldCBpbiBhIHByb2plY3QuIFRoZSB0d28gbW9zdCBjb21tb24gZXhhbXBsZXMgYXJlIHByb2plY3QgCi1wcm9wZXJ0aWVzIHBhZ2VzIGFuZCBtZW51IGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgZmFjZXQuIFRoZSBGYWNldGVkIFByb2plY3QKLUZyYW1ld29yayBwcm92aWRlcyBhIHdheSB0byBkbyB0aGF0IHZpYSBhIHByb3BlcnR5IHRlc3RlciB0aGF0IGNhbiBiZSB1c2VkIGluCi1hbnkgZXh0ZW5zaW9uIHBvaW50IHRoYXQgc3VwcG9ydHMgdGhlIEVjbGlwc2UgUGxhdGZvcm0ncyBjb21tb24gZXhwcmVzc2lvbgotbGFuZ3VhZ2UuPC9wPgotCi08cD4KLSAgPGI+UHJvcGVydHkgTmFtZTo8L2I+IDxjb2RlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvY29kZT48YnIvPgotICA8Yj5Qcm9wZXJ0eSBWYWx1ZTo8L2I+IDxjb2RlPltmYWNldC5pZF0oOlt2ZXJzaW9uLmV4cHJdKT88L2NvZGU+Ci08L3A+Ci0KLTxwPkFzIHlvdSBjYW4gc2VlIGZyb20gdGhlIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkgdmFsdWUsIHlvdSBjYW4gZWl0aGVyIHRlc3QKLXVzaW5nIGp1c3QgdGhlIHByb2plY3QgZmFjZXQgaWQgb3IgeW91IGNhbiBhbHNvIGluY2x1ZGUgYSB2ZXJzaW9uIGV4cHJlc3Npb24gaWYKLW9ubHkgY2VydGFpbiB2ZXJzaW9ucyBzaG91bGQgYmUgbWF0Y2hlZC48L3A+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgdHdvIGV4YW1wbGVzIGRlbW9uc3RyYXRlIGhvdyB0aGUgZmFjZXRzIHByb3BlcnR5IHRlc3RlciBjYW4gYmUKLXVzZWQuIFRvIGV4cGxvcmUgZnVydGhlciwgeW91IGNhbiBhbHNvIGRvd25sb2FkIHRoZSAKLTxhIGhyZWY9ImRvd25sb2Fkcy9lbmFibGVtZW50LWV4YW1wbGUuemlwIj5jb21wbGV0ZSBydW5uYWJsZSBzb3VyY2U8L2E+IG9mIHRoZXNlCi1leGFtcGxlcy48L3A+Ci0KLTxwPjxiPkV4YW1wbGUgMTwvYj48L3A+Ci0KLTxwPkVuYWJsZXMgYSBwcm9qZWN0IHByb3BlcnRpZXMgcGFnZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBmYWNldC4gTm90ZSB0aGUKLXVzZSBvZiB0aGUgPGNvZGU+Zm9yY2VQbHVnaW5BY3RpdmF0aW9uPC9jb2RlPiBhdHRyaWJ1dGUuIFRoaXMgYXR0cmlidXRlIG1ha2VzCi1zdXJlIHRoYXQgdGhlIHByb3BlcnR5IHRlc3RlciB3aWxsIGJlIGludm9rZWQgZXZlbiBpZiB0aGUgRmFjZXRlZCBQcm9qZWN0Ci1GcmFtZXdvcmsgcGx1Z2lucyBoYXZlIG5vdCBiZWVuIGFjdGl2YXRlZCB5ZXQuIE9taXR0aW5nIHRoaXMgYXR0cmlidXRlIHdpbGwgY2F1c2UKLXRoZSB0ZXN0IGV4cHJlc3Npb24gdG8gcmV0dXJuIGZhbHNlIGluIHRoYXQgc2l0dWF0aW9uLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiB0aGUKLTxjb2RlPmFkYXB0PC9jb2RlPiBvcGVyYXRvciB0byBhZGFwdCB0aGUgb2JqZWN0IHRvIDxjb2RlPklQcm9qZWN0PC9jb2RlPi4gVGhpcwotaXMgbmVjZXNzYXJ5IGFzIHNvbWUgdmlld3MgbWF5IHJlcHJlc2VudCBwcm9qZWN0IGVudGl0aWVzIHVzaW5nIG90aGVyIHR5cGVzLiBGb3IKLWluc3RhbmNlLCBpbiB0aGUgSkRUJ3MgUGFja2FnZSBFeHBsb3JlciB0aGUgcHJvamVjdHMgYXJlIGluc3RhbmNlcyBvZgotPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0PC9jb2RlPi48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXM8L3NwYW4+IiZndDsKLSAgJmx0O3BhZ2UKLSAgICBpZD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+RXhhbXBsZUZhY2V0UHJvcGVydGllc1BhZ2U8L3NwYW4+IgotICAgIG9iamVjdENsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDwvc3Bhbj4iCi0gICAgYWRhcHRhYmxlPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICBuYW1lPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FeGFtcGxlIEZhY2V0IFByb3BlcnRpZXM8L3NwYW4+IgotICAgIGNsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5leGFtcGxlcy5lbmFibGVtZW50LkV4YW1wbGVGYWNldFByb3BlcnRpZXNQYWdlPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2VuYWJsZWRXaGVuJmd0OwotICAgICAgJmx0O2FkYXB0IHR5cGU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0PC9zcGFuPiImZ3Q7Ci0gICAgICAgICZsdDt0ZXN0IAotICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+dHJ1ZTwvc3Bhbj4iCi0gICAgICAgICAgcHJvcGVydHk9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvc3Bhbj4iCi0gICAgICAgICAgdmFsdWU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmV4YW1wbGUuZmFjZXQxPC9zcGFuPiIvJmd0OwotICAgICAgJmx0Oy9hZGFwdCZndDsKLSAgICAmbHQ7L2VuYWJsZWRXaGVuJmd0OyAgICAgICAgICAKLSAgJmx0Oy9wYWdlJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPHA+PGI+RXhhbXBsZSAyPC9iPjwvcD4KLQotPHA+RW5hYmxlcyBhIG1lbnUgYWN0aW9uIGlmIGVpdGhlciBvbmUgb2YgdGhlIHR3byBmYWNldHMgc3BlY2lmaWVkIGlzIGluc3RhbGxlZAotaW4gYSBwcm9qZWN0LiBOb3RlIHRoZSB1c2Ugb2YgYSB2ZXJzaW9uIGV4cHJlc3Npb24gdG8gbWF0Y2ggb25seSBjZXJ0YWluIHZlcnNpb25zLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2UudWkucG9wdXBNZW51czwvc3Bhbj4iJmd0OwotICAmbHQ7b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgaWQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmV4YW1wbGVGYWNldFBvcHVwPC9zcGFuPiIKLSAgICBvYmplY3RDbGFzcz0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q8L3NwYW4+IgotICAgIGFkYXB0YWJsZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+dHJ1ZTwvc3Bhbj4iJmd0OwotICAgICZsdDthY3Rpb24KLSAgICAgIGlkPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5leGFtcGxlRmFjZXRQb3B1cEFjdGlvbjwvc3Bhbj4iCi0gICAgICBsYWJlbD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+RXhhbXBsZSBGYWNldCBQb3B1cDwvc3Bhbj4iCi0gICAgICBjbGFzcz0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuZXhhbXBsZXMuZW5hYmxlbWVudC5FeGFtcGxlRmFjZXRQb3B1cEFjdGlvbjwvc3Bhbj4iCi0gICAgICBtZW51YmFyUGF0aD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+YWRkaXRpb25zPC9zcGFuPiIKLSAgICAgIGVuYWJsZXNGb3I9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPis8L3NwYW4+IiZndDsKLSAgICAmbHQ7L2FjdGlvbiZndDsKLSAgICAmbHQ7ZW5hYmxlbWVudCZndDsKLSAgICAgICZsdDthZGFwdCB0eXBlPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDwvc3Bhbj4iJmd0OwotICAgICAgICAmbHQ7b3ImZ3Q7Ci0gICAgICAgICAgJmx0O3Rlc3QgCi0gICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPnRydWU8L3NwYW4+IgotICAgICAgICAgICAgcHJvcGVydHk9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvc3Bhbj4iCi0gICAgICAgICAgICB2YWx1ZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZS5mYWNldDE6MS4wPC9zcGFuPiIvJmd0OwotICAgICAgICAgICZsdDt0ZXN0IAotICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICAgICAgICAgIHByb3BlcnR5PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQ8L3NwYW4+IgotICAgICAgICAgICAgdmFsdWU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmV4YW1wbGUuZmFjZXQyOlsxLjEtMi4yXTwvc3Bhbj4iLyZndDsKLSAgICAgICAgJmx0Oy9vciZndDsKLSAgICAgICZsdDsvYWRhcHQmZ3Q7Ci0gICAgJmx0Oy9lbmFibGVtZW50Jmd0OwotICAmbHQ7L29iamVjdENvbnRyaWJ1dGlvbiZndDsgIAotJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPGJyLz48YnIvPjxici8+PGJyLz4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvZm9ybWF0LmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9mb3JtYXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI2MjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9mb3JtYXQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQ1NTIERvY3VtZW50ICovCi1ib2R5IHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZgotfQotCi0udWViZXJzY2hyaWZ0IHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IHgtbGFyZ2U7Ci0JbWFyZ2luLXRvcDogMjBweDsKLX0KLQotLmNvZGUgewotCWZvbnQtZmFtaWx5OiBDb3VyaWVyLCAiQ291cmllciBOZXciLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWxpbmUtaGVpZ2h0OiAxNnB4OwotCWNvbG9yOiAjMDQ2N0I0OwotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JcGFkZGluZzogNXB4IDdweCA1cHggMTNweDsKLQlib3JkZXI6IDFweCBzb2xpZCBibGFjazsKLX0KLQotLm5vdGUgewotCWZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0uZGVzY3JpcHRpb24gewotCWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwotCWZvbnQtc2l6ZTogeHgtbGFyZ2U7Ci19Ci0KLS5zY2hlbWEgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXNpemU6IGxhcmdlCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L2xpc3RlbmVycy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L2xpc3RlbmVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWM3MjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9saXN0ZW5lcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLSAgCi08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gIDx0aXRsZT5MaXN0ZW5pbmcgZm9yIENoYW5nZXMgdG8gRmFjZXRlZCBQcm9qZWN0czwvdGl0bGU+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9InR1dG9yaWFsL3R1dG9yaWFsLmNzcyIvPgotPC9oZWFkPgotCi08Ym9keT4KLQotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgCi0gIC5zdWJIZWFkZXIKLSAgewotICAgIGZvbnQtc2l6ZTogMTZweDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgfQotICAKLSAgLmV2ZW50c1RhYmxlSGVhZGVyQ2VsbAotICB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMDAwMDA7Ci0gICAgcGFkZGluZzogMnB4OwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVUeXBlQ2VsbAotICB7Ci0gICAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgICBwYWRkaW5nLXRvcDogMnB4OwotICAgIHBhZGRpbmctYm90dG9tOiAycHg7Ci0gICAgcGFkZGluZy1sZWZ0OiAycHg7Ci0gICAgcGFkZGluZy1yaWdodDogMjBweDsKLSAgfQotICAKLSAgLmV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbAotICB7Ci0gICAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgICBwYWRkaW5nLXRvcDogMnB4OwotICAgIHBhZGRpbmctYm90dG9tOiAycHg7Ci0gICAgcGFkZGluZy1sZWZ0OiAycHg7Ci0gICAgcGFkZGluZy1yaWdodDogMjBweDsKLSAgfQotICAKLSAgLmV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsCi0gIHsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIHBhZGRpbmc6IDJweDsKLSAgfQotCi08L3N0eWxlPgotCi08aDEgYWxpZ249ImNlbnRlciI+TGlzdGVuaW5nIGZvciBDaGFuZ2VzIHRvIEZhY2V0ZWQgUHJvamVjdHM8L2gxPgotCi08cD5UaGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBwcm92aWRlcyBhIGZhY2lsaXR5IHRoYXQgd2lsbCBub3RpZnkgYW55IGludGVyZXN0ZWQgcGFydGllcyB3aGVuCi1hIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBtb2RlbCBvZiBhIGZhY2V0ZWQgcHJvamVjdC4gTGlzdGVuZXJzIGNhbiBiZSByZWdpc3RlcmVkIGVpdGhlciB2aWEgYSBkaXJlY3QKLUFQSSBjYWxsIG9yIHZpYSBhbiBleHRlbnNpb24gcG9pbnQuIExpc3RlbmVycyBjYW4gYmUgZ2xvYmFsIG9yIHNjb3BlZCB0byBhIHNwZWNpZmljIHByb2plY3QuPC9wPgotCi08cCBjbGFzcz0ic3ViSGVhZGVyIj5FdmVudHM8L3A+Ci0KLTx0YWJsZSBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIj4KLQotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUhlYWRlckNlbGwiPkV2ZW50IFR5cGU8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVIZWFkZXJDZWxsIj5FdmVudCBPYmplY3QgSW50ZXJmYWNlPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSGVhZGVyQ2VsbCI+RGVzY3JpcHRpb248L3RkPgotICA8L3RyPgotCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBST0pFQ1RfTU9ESUZJRUQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JRmFjZXRlZFByb2plY3RFdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCB3aGVuIGZhY2V0ZWQgcHJvamVjdCBtZXRhZGF0YSBpcyBtb2RpZmllZCBpbiBhbnkgd2F5LiBObyBkZXRhaWxlZCBpbmZvcm1hdGlvbiAKLSAgICAgIGFib3V0IHRoZSBjaGFuZ2UgaXMgcHJvdmlkZWQuIE5vdGUgdGhhdCB3aGlsZSBsaXN0ZW5pbmcgZm9yIFBST0pFQ1RfTU9ESUZJRUQgZXZlbnRzIGlzIAotICAgICAgZ3VhcmFudGVlZCB0byBjYXRjaCBhbGwgb3RoZXIgZXZlbnRzLCB0aGUgaW52ZXJzZSBpcyBub3QgdHJ1ZS4gTGlzdGluZyBvbiBhbGwgdGhlIG90aGVyIAotICAgICAgZXZlbnRzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGNhdGNoIGFsbCBQUk9KRUNUX01PRElGSUVEIGV2ZW50cy4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGFyZSAKLSAgICAgIGNpcmN1bXN0YW5jZXMgd2hlbiB0aGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIGRldGFpbHMgYWJvdXQgdGhlIHR5cGUgb2YgdGhlIGNoYW5nZSAKLSAgICAgIChzdWNoIGFzIHdoZW4gdGhlIGZhY2V0ZWQgcHJvamVjdCBtZXRhZGF0YSBmaWxlIGlzIG1vZGlmaWVkIG9uIGRpc2spLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZVR5cGVDZWxsIj5QUkVfSU5TVEFMTDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCByaWdodCBiZWZvcmUgYSBmYWNldCBpcyBpbnN0YWxsZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBPU1RfSU5TVEFMTDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDwvdGQ+Ci0gICAgPHRkPkdldHMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIGEgZmFjZXQgaXMgaW5zdGFsbGVkLjwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZVR5cGVDZWxsIj5QUkVfVU5JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IGlzIHVuaW5zdGFsbGVkLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZVR5cGVDZWxsIj5QT1NUX1VOSU5TVEFMTDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCByaWdodCBhZnRlciBhIGZhY2V0IGlzIHVuaW5zdGFsbGVkLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZVR5cGVDZWxsIj5QUkVfVkVSU0lPTl9DSEFOR0U8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgcmlnaHQgYmVmb3JlIGEgZmFjZXQgdmVyc2lvbiBpcyBjaGFuZ2VkLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZVR5cGVDZWxsIj5QT1NUX1ZFUlNJT05fQ0hBTkdFPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIGEgZmFjZXQgdmVyc2lvbiBpcyBjaGFuZ2VkLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZVR5cGVDZWxsIj5GSVhFRF9GQUNFVFNfQ0hBTkdFRDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklGaXhlZEZhY2V0c0NoYW5nZWRFdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCB3aGVuIHByb2plY3QncyBmaXhlZCBmYWNldHMgYXJlIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCB3aGVuIHRoZSBzZXQgb2YgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCB0YXJnZXRzIGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSSU1BUllfUlVOVElNRV9DSEFOR0VEPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHByaW1hcnkgdGFyZ2V0ZWQgcnVudGltZSBvZiB0aGUgcHJvamVjdCBpcyBjaGFuZ2VkLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gICAgCi08L3RhYmxlPgotCi08cCBjbGFzcz0ic3ViSGVhZGVyIj5SZWdpc3RlcmluZyBhIExpc3RlbmVyPC9wPgotCi08cD5BbGwgbGlzdGVuZXJzIGhhdmUgdG8gaW1wbGVtZW50IDxjb2RlPklGYWNldGVkUHJvamVjdExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2Ugd2hpY2ggbG9va3MgbGlrZQotdGhpczo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHM7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBpbnRlcmZhY2U8L3NwYW4+IElGYWNldGVkUHJvamVjdExpc3RlbmVyIAotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnZvaWQ8L3NwYW4+IGhhbmRsZUV2ZW50KCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApOwotfQotPC9wcmU+Ci08L2Rpdj4KLQotPHA+RGVwZW5kaW5nIG9uIHRoZSBldmVudCB0eXBlLCBpdCBtYXkgYmUgcG9zc2libGUgdG8gY2FzdCB0aGUgZXZlbnQgb2JqZWN0IHRvIGEgbW9yZSBzcGVjaWZpYwotaW50ZXJmYWNlIGluIG9yZGVyIHRvIGdldCBkZXRhaWxzIGFib3V0IHRoZSBldmVudC4gU2VlIHRoZSBldmVudCB0YWJsZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2gKLWV2ZW50IG9iamVjdCBpbnRlcmZhY2UgY29ycmVzcG9uZHMgd2l0aCB3aGljaCBldmVudCB0eXBlLjwvcD4KLQotPHA+VGhlcmUgYXJlIHRocmVlIHdheXMgdG8gcmVnaXN0ZXIgYSBsaXN0ZW5lcjo8L3A+Ci0KLTxvbD4KLSAgPGxpPklGYWNldGVkUHJvamVjdC5hZGRMaXN0ZW5lcigpPC9saT4KLSAgPGxpPkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKCk8L2xpPgotICA8bGk+RXh0ZW5zaW9uIFBvaW50OiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnM8L3A+Ci08L29sPgotCi08cD5BbGwgb2YgdGhlc2UgbWV0aG9kcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hpY2ggZXZlbnRzIHRoZSBsaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQuIAotTm90IHNwZWNpZnlpbmcgZXZlbnQgdHlwZXMgb24gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGFib3V0IGFsbCBldmVudHMuIAotVGhpcyBpcyB0eXBpY2FsbHkgbm90IGRlc2lyZWQuIElmIGEgbGlzdGVuZXIgbmVlZHMgdG8gcmVhY3QgdG8gYW55IGNoYW5nZSBpbiB0aGUgcHJvamVjdCBhbmQgaGFzIG5vIAotbmVlZCB0byBhbmFseXplIHNwZWNpZmljIGV2ZW50cywgaXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSA8Y29kZT5QUk9KRUNUX01PRElGSUVEPC9jb2RlPiAKLWV2ZW50LjwvcD4KLQotPHA+VGhlIGZpcnN0IG1ldGhvZCByZWdpc3RlcnMgYSBsaXN0ZW5lciB0aGF0IGlzIHNjb3BlZCB0byBhIHNwZWNpZmljIHByb2plY3QuIFRoZSBsYXN0IHR3bwotcmVnaXN0ZXIgYSBnbG9iYWwgbGlzdGVuZXIgd2hpY2ggd2lsbCBiZSBub3RpZmllZCBhYm91dCBjaGFuZ2VzIGluIGFsbCBmYWNldGVkIHByb2plY3RzIHRoYXQgYXJlCi1wcmVzZW50IGluIHRoZSB3b3Jrc3BhY2UuIEluIG1vc3QgY2lyY3Vtc3RhbmNlcywgaWYgYSBnbG9iYWwgbGlzdGVuZXIgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgCi1yZWdpc3RlcmVkIHZpYSB0aGUgZXh0ZW5zaW9uIHBvaW50IHJhdGhlciB0aGFuIHVzaW5nIDxjb2RlPkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKCk8L2NvZGU+Ci1BUEkuIFVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQgZ3VhcmFudGVlcyB0aGF0IHRoZSBsaXN0ZW5lciB3aWxsIG5vdCBtaXNzIGFueSBldmVudHMgZHVlIHRvIG5vdAotYmVpbmcgcmVnaXN0ZXJlZCBlYXJseSBlbm91Z2guIEl0IGFsc28gZGVsYXlzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwbHVnaW4gYnVuZGxlIGNvbnRhaW5pbmcgdGhlCi1saXN0ZW5lciB1bnRpbCBhbiBldmVudCB0aGF0IHRoZSBsaXN0ZW5lciBpcyBpbnRlcmVzdGVkIGluIGlzIGZpcmVkLjwvcD4KLQotPHAgY2xhc3M9InN1YkhlYWRlciI+RXh0ZW5zaW9uIFBvaW50PC9wPgotCi08cD5UaGUgZXh0ZW5zaW9uIHBvaW50IHRoYXQncyB1c2VkIGZvciByZWdpc3RlcmluZyBsaXN0ZW5lcnMgaXMgcXVpdGUgc2ltcGxlLiBPbmx5IHR3byBwaWNlcyBvZgotaW5mb3JtYXRpb24gbmVlZCB0byBiZSBzdXBwbGllZDogdGhlIGxpc3RlbmVyIGNsYXNzIG5hbWUgYW5kIGFuIG9wdGlvbmFsIGxpc3Qgb2YgZXZlbnQgdHlwZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9InhtbC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnM8L3NwYW4+IiZndDsKLSAgJmx0O2xpc3RlbmVyIAotICAgIGNsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij57Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyfTwvc3Bhbj4iCi0gICAgZXZlbnRUeXBlcz0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+e2V2ZW50LnR5cGVzfTwvc3Bhbj4iLz4gPGk+KDEgb3IgbW9yZSk8L2k+Ci0mbHQ7ZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+VGhlIDxjb2RlPmV2ZW50VHlwZXM8L2NvZGU+IGF0dHJpYnV0ZSB2YWx1ZSBzaG91bGQgYmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBldmVudCB0eXBlcy48L3A+Ci0KLTxwIGNsYXNzPSJzdWJIZWFkZXIiPkV4YW1wbGVzPC9wPgotCi08cD5UaGlzIGV4YW1wbGUgcmVnaXN0ZXJzIGEgdmVyeSBzaW1wbGUgbGlzdGVuZXIgdGhhdCBwcmludHMgb3V0IGV2ZW50cyByZWNlaXZlZC4gVGhlIGxpc3RlbmVyIGlzCi1yZWdpc3RlcmVkIHNldmVyYWwgZGlmZmVyZW50IHdheXMgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGV4YW1wbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+PHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cGFja2FnZTwvc3Bhbj4gY29tLm15Y29ycC5teXByb2R1Y3Q7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gTGlzdGVuZXJJbXBsIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcGxlbWVudHM8L3NwYW4+IElGYWNldGVkUHJvamVjdExpc3RlbmVyIAotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyB2b2lkPC9zcGFuPiBoYW5kbGVFdmVudCggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggZXZlbnQudG9TdHJpbmcoKSApOwotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IHJlZ2lzdGVycyB0aGUgYWJvdmUgbGlzdGVuZXIgb24gYSBzcGVjaWZpYyBwcm9qZWN0IHRvIGxpc3RlbiBmb3IKLWNoYW5nZXMgaW4gdGhlIHJ1bnRpbWVzIHRoYXQgdGhlIHByb2plY3QgdGFyZ2V0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci0KLS4uLgotCi1JUHJvamVjdCBwajsKLQotLi4uCi0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJRmFjZXRlZFByb2plY3QgZnBqID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwaiApOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IExpc3RlbmVySW1wbCBsaXN0ZW5lciA9IDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPm5ldzwvc3Bhbj4gTGlzdGVuZXJJbXBsKCk7Ci0KLWZwai5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIAotICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQsCi0gICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQgKTsKLSAgICAgICAgICAgICAgICAgCi0uLi4KLQotZnBqLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+VGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgcmVnaXN0ZXIgdGhlIGFib3ZlIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgdGhlIFBSRV9JTlNUQUxMIGFuZAotUFJFX1VOSU5TVEFMTCBldmVudHMgaW4gYWxsIGZhY2V0ZWQgcHJvamVjdHMuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+PHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotCi0uLi4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IExpc3RlbmVySW1wbCBsaXN0ZW5lciA9IDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPm5ldzwvc3Bhbj4gTGlzdGVuZXJJbXBsKCk7Ci0KLUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUkVfSU5TVEFMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9VTklOU1RBTEwgKTsKLSAgICAgICAgICAgICAgICAgCi0uLi4KLQotRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCBhY2NvbXBsaXNoZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIG9uZSBhYm92ZSwgZXhjZXB0IGl0IGRvZXMgdGhpcwotdmlhIHRoZSBleHRlbnNpb24gcG9pbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9InhtbC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnM8L3NwYW4+IiZndDsKLSAgJmx0O2xpc3RlbmVyIGNsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5jb20ubXljb3JwLm15cHJvZHVjdC5MaXN0ZW5lckltcGw8L3NwYW4+IiBldmVudFR5cGVzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5QUkVfSU5TVEFMTCxQUkVfVU5JTlNUQUxMPC9zcGFuPiIvPgotJmx0O2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC9kaXY+Ci0KLTxici8+PGJyLz48YnIvPjxici8+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3F1ZXN0aW9ucy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3F1ZXN0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhiMGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC9xdWVzdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotICAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPlF1ZXN0aW9ucyAmYW1wOyBBbnN3ZXJzPC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0idHV0b3JpYWwvdHV0b3JpYWwuY3NzIi8+Ci08L2hlYWQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDEgYWxpZ249ImNlbnRlciI+UXVlc3Rpb25zICZhbXA7IEFuc3dlcnM8L2gxPgotCi08cD48Yj48YSBuYW1lPSJjb25maWd1cmUuZmFjZXRzLmJ1dHRvbiI+UXVlc3Rpb246IEknZCBsaWtlIHRvIGJlIGFibGUgdG8gY29uZmlndXJlIG15IAotZmFjZXQgYWZ0ZXIgaXQgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm9qZWN0IEZhY2V0cyBwcm9wZXJ0eSBwYWdlIG9yIHRoZSAKLUFkZC9SZW1vdmUgRmFjZXRzIHdpemFyZC4gV2h5IGlzbid0IHRoZXJlIGEgY29uZmlndXJlIGJ1dHRvbj88L2I+PC9wPgotCi08cD48Yj5BbnN3ZXI6PC9iPiBUaGUgUHJvamVjdCBGYWNldHMgcHJvcGVydHkgcGFnZSBhbmQgdGhlIEFkZC9SZW1vdmUgRmFjZXRzIHdpemFyZAotYXJlIGludGVuZGVkIGZvciBtYW5hZ2luZyB0aGUgc2V0IG9mIGZhY2V0cyB0aGF0IGFyZSBpbnN0YWxsZWQgb24gYSBwcm9qZWN0LiAKLVdoZW4gY29uZmlndXJhdGlvbiBvZiBhbiBpbnN0YWxsZWQgZmFjZXQgbmVlZHMgdG8gYmUgY2hhbmdlZCwgdGhlIGV4cGVjdGF0aW9uIGlzCi10aGF0IHRoZSBmYWNldCBhdXRob3Igd2lsbCB1c2UgZXhpc3RpbmcgRWNsaXBzZSBmYWNpbGl0aWVzIHRvIHByb3ZpZGUgcHJvamVjdAotcHJvcGVydHkgcGFnZXMuIEZvciBleGFtcGxlLCB0aGUgPGNvZGU+anN0LmphdmE8L2NvZGU+IGZhY2V0IGlzIGNvbmZpZ3VyZWQgdXNpbmcgCi10aGUgPGk+SmF2YSBCdWlsZCBQYXRoPC9pPiwgPGk+SmF2YSBDb2RlIFN0eWxlPC9pPiwgYW5kIDxpPkphdmEgQ29tcGlsZXI8L2k+IAotcHJvcGVydHkgcGFnZXMuPC9wPgotCi08YnIvPjxici8+PGJyLz4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAxLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhiZmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4MWFlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MWUyOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWU0YjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzOTAzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzY5MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMzZTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wOC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwNDBjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC9tYXRlcmlhbHMvc29sdXRpb24uemlwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL21hdGVyaWFscy9zb2x1dGlvbi56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OWI3ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL21hdGVyaWFscy9zb2x1dGlvbi56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvbWF0ZXJpYWxzL3N0YXJ0ZXIuemlwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL21hdGVyaWFscy9zdGFydGVyLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMGNhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvbWF0ZXJpYWxzL3N0YXJ0ZXIuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL3R1dG9yaWFsLmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC90dXRvcmlhbC90dXRvcmlhbC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDM2YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL3R1dG9yaWFsLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi1wLCB0YWJsZSwgdGQsIHRoIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0KLXByZSB7ICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQotaDIgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyBsaW5lLWhlaWdodDogMTRweDsgbWFyZ2luLXRvcDogMzBweH0KLWNvZGUgeyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0KLXN1cCB7ICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLGdlbmV2YTsgZm9udC1zaXplOiAxMHB4fQotaDMgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZH0KLWxpIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0KLWgxIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGR9Ci1ib2R5IHsgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdDsgY2xpcDogICByZWN0KCAgICk7IG1hcmdpbi10b3A6IDVtbTsgbWFyZ2luLWxlZnQ6IDNtbX0KLS5pbmRleHRvcCB7IGZvbnQtc2l6ZTogeC1sYXJnZTs7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZH0KLS5pbmRleHN1YiB7IGZvbnQtc2l6ZTogeHgtc21hbGw7OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6ICM4MDgwRkZ9Ci0KLXByZSB7Ci0gICAgcGFkZGluZzogMHB4OwotICAgIG1hcmdpbi10b3A6IDBweDsKLSAgICBtYXJnaW4tbGVmdDogMHB4OwotICAgIG1hcmdpbi1ib3R0b206IDBweDsKLSAgICBtYXJnaW4tcmlnaHQ6IDBweDsKLSAgICB0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uY29kZSB7Ci0gCWJvcmRlcjogMXB4IGRhc2hlZCAjM2M3OGI1OwotICAgIGZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseTogQ291cmllcjsKLSAgICBtYXJnaW46IDEwcHg7Ci0JbGluZS1oZWlnaHQ6IDEzcHg7Ci0gICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwotICAgIHBhZGRpbmc6IDEwcHg7Ci19Ci0KLS5jb2RlLXhtbCB7Ci0gIGNvbG9yOiAjMDAwMDAwOwotfQotCi0uc2NoZW1hLXR5cGUKLXsKLSAgY29sb3I6ICMwMDkxMDA7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0KLS5zY2hlbWEtdHlwZS1saW5rIGE6bGluawotewotICBjb2xvcjogIzAwOTEwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5zY2hlbWEtdHlwZS1saW5rIGE6dmlzaXRlZAotewotICBjb2xvcjogIzAwOTEwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5zY2hlbWEtY29udHJvbCB7Ci0gIGNvbG9yOiAjMDA5MTAwOwotICBmb250LXN0eWxlOiBpdGFsaWM7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0KLS5jb2RlLXRleHQgewotICBjb2xvcjogIzAwOTEwMDsKLSAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKLX0KLQotLmNvbnRleHQtY29kZSB7Ci0gIGNvbG9yOiAjNzY3Njc2OwotICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwotfQotCi0ueG1sLXRleHQKLXsKLSAgY29sb3I6ICMwMDkxMDA7Ci19Ci0KLS5qYXZhLWNvZGUgCi17Ci0gIGNvbG9yOiAjMDAwMDAwOwotfQotCi0uamF2YS1jb21tZW50IAotewotICBjb2xvcjogIzAwOTEwMDsKLX0KLQotLmphdmEtamF2YWRvYy1rZXl3b3JkCi17Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uamF2YS1rZXl3b3JkCi17Ci0gIGNvbG9yOiAjN2YwMDU1OwotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmphdmEtbGl0ZXJhbAotewotICBjb2xvcjogIzAwOTEwMDsKLX0KLQotLmphdmEtY29udGV4dAotewotICBjb2xvcjogIzc2NzY3NjsKLX0JCi0KLS5qYXZhLWNvbnRleHQta2V5d29yZAotewotICBmb250LXdlaWdodDogYm9sZDsKLX0JCi0KLS5zY3JlZW4tc2hvdCAKLXsKLSAgICBtYXJnaW46IDEwcHg7Ci19Ci0KLS5ibG9jay1pbmRlbnQgCi17Ci0gICAgbWFyZ2luOiAxMHB4OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3R1dG9yaWFsL3R1dG9yaWFsLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvdHV0b3JpYWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2MjViNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvdHV0b3JpYWwvdHV0b3JpYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci0gIAotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICA8dGl0bGU+RXh0ZW5kaW5nIFdUUCBVc2luZyBQcm9qZWN0IEZhY2V0czwvdGl0bGU+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9InR1dG9yaWFsLmNzcyIvPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGgxIGFsaWduPSJjZW50ZXIiPkV4dGVuZGluZyBXVFAgVXNpbmcgUHJvamVjdCBGYWNldHM8L2gxPgotCi08YmxvY2txdW90ZT4KLTxiPlN1bW1hcnk8L2I+PGJyLz4KLVRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGFsbG93cyB0aGUgcGx1Z2luIGRldmVsb3BlciB0byB0aGluayBvZiBXZWIgVG9vbHMgCi1QbGF0Zm9ybSAoV1RQKSBwcm9qZWN0cyBhcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gCi1hcyBmYWNldHMsIHRoYXQgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGJ5IHRoZSB1c2VyLiBUaGlzIHR1dG9yaWFsIHdhbGtzIHlvdSAKLXRocm91Z2ggYW4gZXhhbXBsZSBvZiBjcmVhdGluZyBhIGNvdXBsZSBvZiBiYXNpYyBmYWNldHMgYW5kIGluIHRoZSBwcm9jZXNzIAotY292ZXJzIHRoZSBtYWpvcml0eSBvZiB0aGUgZnJhbWV3b3JrJ3MgZXh0ZW5zaW9uIHBvaW50cy4gVGhpcyB0dXRvcmlhbCBoYXMgYmVlbgotd3JpdHRlbiBmb3IgdmVyc2lvbiAxLjUgb2YgdGhlIFdlYiBUb29scyBQbGF0Zm9ybS4KLTxici8+PGJyLz4KLQotPGI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2I+PGJyLz4KLUJFQSBTeXN0ZW1zLCBJbmMuPGJyLz4KLVNlcHRlbWJlciA1LCAyMDA2Ci08L2Jsb2NrcXVvdGU+Ci0KLTxociB3aWR0aD0iMTAwJSI+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHByb3ZpZGVzIGEgcG93ZXJmdWwgbWVjaGFuaXNtIGZvciBleHRlbmRpbmcgdGhlCi1jYXBhYmlsaXRpZXMgb2YgdGhlIFdlYiBUb29scyBQbGF0Zm9ybS4gUHJvamVjdCBmYWNldHMgYXJlIHR5cGljYWxseSB1c2VkIGFzCi1hIHdheSBvZiBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byBhIHByb2plY3QuIFdoZW4gYSBmYWNldCBpcyBhZGRlZCB0byB0aGUKLXByb2plY3QgaXQgY2FuIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBzZXR1cCBhY3Rpb25zIHN1Y2ggYXMgY29weWluZyByZXNvdXJjZXMsIAotaW5zdGFsbGluZyBidWlsZGVycywgYWRkaW5nIG5hdHVyZXMsIGV0Yy4gRmFjZXRzIGNhbiBhbHNvIGJlIHVzZWQgYXMgbWFya2VycyBmb3IKLWVuYWJsaW5nIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzLjwvcD4KLQotPHA+U29tZSBvZiB0aGUgcmVhZGVycyBtYXkgYmUgd29uZGVyaW5nIGhvdwotZmFjZXRzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJvamVjdCBuYXR1cmVzIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIEVjbGlwc2UKLXBsYXRmb3JtLiBOYXR1cmVzIGFyZSBkZXNpZ25lZCB0byBiZSBoaWRkZW4gZnJvbSB1c2VyJ3Mgdmlldy4gVGhleSBhcmUKLWVzc2VudGlhbGx5IG1hcmtlcnMgdGhhdCBhcmUgc2V0IGJlaGluZCB0aGUgc2NlbmVzIGJ5IHRvb2xpbmcuIFByb2plY3QgZmFjZXRzLAotb24gdGhlIG90aGVyIGhhbmQsIGhhdmUgYmVlbiBkZXNpZ25lZCBmcm9tIHRoZSBncm91bmQgdXAgdG8gYmUgbWFuaXB1bGF0ZWQgYnkKLXRoZSBlbmQgdXNlcnMuIFRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHByb3ZpZGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHVzZXIgCi1pbnRlcmZhY2UgZWxlbWVudHMgZm9yIG1hbmFnaW5nIHRoZSBmYWNldHMgb24gYSBwcm9qZWN0IGFuZCBzaW5jZSBmYWNldHMKLWFyZSBzZWxmIGRlc2NyaWJpbmcgdGhlIHVzZXIgaXMgcHJldmVudGVkIGZyb20gY3JlYXRpbmcgaW52YWxpZCBjb25maWd1cmF0aW9ucy4KLUJhc2ljYWxseSwgaXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB3cml0ZSBjdXN0b20gcHJvamVjdCBjcmVhdGlvbiB3aXphcmRzIG9yCi10aGUgIkVuYWJsZSBGZWF0dXJlIFgiIG1lbnUgYWN0aW9ucy4gQ29tbW9uIHdheSBvZiBtYW5hZ2luZyB3aGljaCBmYWNldHMgYXJlCi1pbnN0YWxsZWQgb24gYSBwcm9qZWN0IG1lYW5zIGxlc3MgYnVyZGVuIG9uIHRoZSBwbHVnaW4gd3JpdGVyIGFuZCBiZXR0ZXIgZW5kIHVzZXIKLWV4cGVyaWVuY2UuPC9wPgotCi08cD5UaGlzIHR1dG9yaWFsIGNvdmVycyB0aGUgZXh0ZW5zaW9uIHBvaW50cyBhbmQgSmF2YSBBUEkgdGhhdCBhcmUgdXNlZCBmb3IgCi1jcmVhdGluZyBwcm9qZWN0IGZhY2V0cy4gVGhlIHJlYWRlciBpcyBhc3N1bWVkIHRvIGJlIGFscmVhZHkgZmFtaWxpYXIgd2l0aCAKLWRldmVsb3BpbmcgcGx1Z2lucyBmb3IgRWNsaXBzZSBhbmQgdG8gaGF2ZSB1c2VyLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgV2ViIFRvb2xzIAotUGxhdGZvcm0uPC9wPgotCi08aDI+VHV0b3JpYWwgU2NlbmFyaW88L2gyPgotCi08cD5Zb3UgYXJlIGEgZGV2ZWxvcGVyIGZvciBhIGNvbXBhbnkgd2hpY2ggZGV2ZWxvcHMgYSBwcm9kdWN0IGNhbGxlZAotRm9ybUdlbi4gRm9ybUdlbiBpcyBiYXNpY2FsbHkgYSBzZXJ2bGV0IHRoYXQgZ2VuZXJhdGVzIEhUTUwgZm9ybXMgYmFzZWQgb24gWE1MCi1kZWZpbml0aW9uIGZpbGVzLiBUaGUgcHJvZHVjdCBpcyBjb21wb3NlZCBvZiBhIGphciBjb250YWluaW5nIHRoZSBzZXJ2bGV0IGFuZAotc29tZSBiYXNpYyB3aWRnZXRzLiBUaGVyZSBpcyBhbHNvIGFuIGFkZC1vbiBqYXIgd2l0aCBzb21lIGV4dHJhIHdpZGdldHMuIFVzZXJzCi1oYXZlIGJlZW4gbWFudWFsbHkgYWRkaW5nIHRoZSBqYXJzIGludG8gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yaWVzIG9mIHRoZWlyCi13ZWIgcHJvamVjdHMgYW5kIHNldHRpbmcgdXAgdGhlIHNlcnZsZXQgZGVmaW5pdGlvbnMgaW4gd2ViLnhtbCBieSBoYW5kLiBZb3VyCi10YXNrIGlzIHRvIG1ha2UgdGhpcyBzZXR1cCBlYXNpZXIgYnkgd3JpdGluZyBhIGNvdXBsZSBvZiBwcm9qZWN0IGZhY2V0cyB0aGF0Ci13aWxsIHBlcmZvcm0gdGhlc2UgYWN0aW9ucyBhdXRvbWF0aWNhbGx5LjwvcD4KLQotPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4KLQotPGRpdiBjbGFzcz0iYmxvY2staW5kZW50Ij4KLTEuIDxhIGhyZWY9IiNnZXR0aW5nLnN0YXJ0ZWQiPkdldHRpbmcgU3RhcnRlZDwvYT48YnIvPgotMi4gPGEgaHJlZj0iI2NyZWF0aW5nLmJhc2ljLmZhY2V0cyI+Q3JlYXRpbmcgQmFzaWMgRmFjZXQgRGVmaW5pdGlvbnM8L2E+PGJyLz4KLTMuIDxhIGhyZWY9IiNzcGVjaWZ5aW5nLmNvbnN0cmFpbnRzIj5TcGVjaWZ5aW5nIENvbnN0cmFpbnRzPC9hPjxici8+Ci00LiA8YSBocmVmPSIjaW1wbGVtZW50aW5nLmFjdGlvbnMiPkltcGxlbWVudGluZyBBY3Rpb25zPC9hPjxici8+Ci01LiA8YSBocmVmPSIjY3JlYXRpbmcuY2F0ZWdvcmllcyI+Q3JlYXRpbmcgQ2F0ZWdvcmllczwvYT48YnIvPgotNi4gPGEgaHJlZj0iI2RlY29yYXRpbmciPkRlY29yYXRpbmc8L2E+PGJyLz4KLTcuIDxhIGhyZWY9IiNhZGRpbmcud2l6YXJkLnBhZ2VzIj5BZGRpbmcgV2l6YXJkIFBhZ2VzPC9hPjxici8+Ci04LiA8YSBocmVmPSIjZGVmaW5pbmcucHJlc2V0cyI+RGVmaW5pbmcgUHJlc2V0czwvYT48YnIvPgotOS4gPGEgaHJlZj0iI3J1bnRpbWUubWFwcGluZ3MiPlNwZWNpZnlpbmcgUnVudGltZSBTdXBwb3J0IE1hcHBpbmdzPC9hPjxici8+Ci0xMC4gPGEgaHJlZj0iI3N1bW1hcnkiPlN1bW1hcnk8L2E+PGJyLz4KLUFwcGVuZGl4IEE6IDxhIGhyZWY9IiNjdXN0b20udmVyc2lvbi5jb21wYXJhdG9ycyI+Q3VzdG9tIFZlcnNpb24gQ29tcGFyYXRvcnM8L2E+PGJyLz4KLUFwcGVuZGl4IEI6IDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj5WZXJzaW9uIEV4cHJlc3Npb25zPC9hPjxici8+Ci1BcHBlbmRpeCBDOiA8YSBocmVmPSIjcHJvcGVydHkudGVzdGVyIj5Qcm9wZXJ0eSBUZXN0ZXI8L2E+PGJyLz4KLUFwcGVuZGl4IEQ6IDxhIGhyZWY9IiN3aXphcmQuY29udGV4dCI+V2l6YXJkIENvbnRleHQ8L2E+PGJyLz4KLTwvZGl2PgotCi08aDI+PGEgbmFtZT0iZ2V0dGluZy5zdGFydGVkIj4xLiBHZXR0aW5nIFN0YXJ0ZWQ8L2E+PC9oMj4KLQotPHA+VG8gZm9sbG93IGFsb25nIHdpdGggdGhpcyB0dXRvcmlhbCwgeW91IHdpbGwgbmVlZCB0byBoYXZlIGEgd29ya2luZyBpbnN0YWxsIAotb2YgV2ViIFRvb2xzIFBsYXRmb3JtIHYxLjUuIFRoZSB0dXRvcmlhbCBpcyBub3QgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIDEuMC54Ci12ZXJzaW9uIG9mIFdUUCBhcyB0aGVyZSBhcmUgbnVtZXJvdXMgZXh0ZW5zaW9uIHBvaW50IGFuZCBBUEkgZGlmZmVyZW5jZXMuIFlvdSAKLWNhbiBkb3dubG9hZCB0aGUgaW5zdGFsbCBraXRzIGZvciBXVFAgYW5kIGl0cyBwcmVyZXF1aXNpdGVzLCBpbmNsdWRpbmcgRWNsaXBzZSAKLVBsYXRmb3JtIHYzLjIsIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzLyI+RWNsaXBzZSBQbGF0Zm9ybSBEb3dubG9hZCBTaXRlPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvZG93bmxvYWRzLyI+V2ViIFRvb2xzIFBsYXRmb3JtIERvd25sb2FkIFNpdGU8L2E+PC9saT4KLTwvdWw+Ci0KLTxwPk9uY2UgdGhlIHJlcXVpcmVkIHNvZnR3YXJlIGhhcyBiZWVuIGluc3RhbGxlZCB5b3Ugd2lsbCBuZWVkIHRvCi1jcmVhdGUgYSBuZXcgd29ya3NwYWNlIGFuZCBhZGQgdGhlIDxhIGhyZWY9Im1hdGVyaWFscy9zdGFydGVyLnppcCI+c3RhcnRlciBwcm9qZWN0PC9hPgotdG8gaXQuIFRoZSBzdGFydGVyIHByb2plY3QgaW5jbHVkZXMgdGhlIG1hdGVyaWFscyBhbmQgdXRpbGl0eSBjb2RlIHRoYXQgd2lsbAotYmUgdXNlZCBpbiB0aGlzIHR1dG9yaWFsLiBJZiB5b3UgZ2V0IHN0dWNrIGF0IGFueSBwb2ludCB5b3UgY2FuIHRha2UgYSBwZWVrIGF0Ci10aGUgPGEgaHJlZj0ibWF0ZXJpYWxzL3NvbHV0aW9uLnppcCI+c29sdXRpb24gcHJvamVjdDwvYT4uPC9wPgotCi08aDI+PGEgbmFtZT0iY3JlYXRpbmcuYmFzaWMuZmFjZXRzIj4yLiBDcmVhdGluZyBCYXNpYyBGYWNldCBEZWZpbml0aW9uczwvYT48L2gyPgotCi08cD5Qcm9qZWN0IGZhY2V0cyBhcmUgZGVjbGFyZWQgdmlhIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHM8L2NvZGU+Ci1leHRlbnNpb24gcG9pbnQuIFRoaXMgaXMgYSBwcmV0dHkgbGFyZ2UgZXh0ZW5zaW9uIHBvaW50IHdpdGggbG90cyBvZiBmYWNpbGl0aWVzLAotYnV0IHdlIHdpbGwgc3RhcnQgc21hbGwgYW5kIHByb2dyZXNzIGluY3JlbWVudGFsbHkgd2hpbGUgYnVpbGRpbmcgdGhlIHR1dG9yaWFsCi1mYWNldHMuIEhlcmUgaXMgdGhlIHBhcnQgb2YgdGhlIHNjaGVtYSB0aGF0IHdlIHdpbGwgYmUgd29ya2luZyB3aXRoIGluaXRpYWxseTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgICAmbHQ7bGFiZWwmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KG9wdGlvbmFsKTwvc3Bhbj4KLSAgJmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAKLSZsdDsvZXh0ZW5zaW9uJmd0OzwvcHJlPgotPC9kaXY+Ci0KLTxwPkFzIHlvdSBjYW4gc2VlLCB0aGVyZSBhcmUgdHdvIHRvcC1sZXZlbCBlbGVtZW50cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGV4dGVuc2lvbgotcG9pbnQgc2NoZW1hLiBUaGUgPGNvZGU+Jmx0O3Byb2plY3QtZmFjZXQmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQgdG8gZGVjbGFyZQotdGhlIGZhY2V0IGl0c2VsZi4gVGhlIDxjb2RlPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQKLXRvIGRlY2xhcmUgdmVyc2lvbnMgb2YgdGhlIGZhY2V0LiBFdmVyeSBmYWNldCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBwcm92aWRlCi1hdCBsZWFzdCBvbmUgZmFjZXQgdmVyc2lvbiBkZWNsYXJhdGlvbi4gSW4gZmFjdCwgYXMgeW91IHdpbGwgc2VlIGxhdGVyIGluIHRoaXMKLXR1dG9yaWFsLCB0aGUgYnVsayBvZiB0aGUgd29yayBoYXBwZW5zIGluIHRoZSA8Y29kZT4mbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OzwvY29kZT4KLWRlY2xhcmF0aW9uLiBGb3Igbm93IGFsbCB5b3UgbmVlZCB0byByZW1lbWJlciBpcyB0aGF0IGEgZmFjZXQgY2Fubm90IGJlIHVzZWQKLXVubGVzcyBpdCBoYXMgYXQgbGVhc3Qgb25lIHZlcnNpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHM8L3NwYW4+IiZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldCBpZD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkZvcm1HZW4gQ29yZTwvc3Bhbj4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgIDxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkVuYWJsZXMgZ2VuZXJhdGlvbiBvZiBIVE1MIGZvcm1zIGJhc2VkIG9uIFhNTCBkZWZpbml0aW9uIGZpbGVzLjwvc3Bhbj4KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+MS4wPC9zcGFuPiIvJmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0IGlkPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5mb3JtZ2VuLmV4dDwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5Gb3JtR2VuIEV4dGVuc2lvbnM8L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICA8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FbmFibGVzIGFkZGl0aW9uYWwgRm9ybUdlbiB3aWRnZXRzLjwvc3Bhbj4KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0gIAotJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPHA+SW5zZXJ0IHRoZSBhYm92ZSBjb2RlIGludG8geW91ciBwbHVnaW4ueG1sIGZpbGUgYW5kIGxldHMgc2VlIGl0IGluIGFjdGlvbi4KLUxhdW5jaCBFY2xpcHNlIHdpdGggeW91ciBGb3JtR2VuIHBsdWdpbiBhbmQgdGhlbiBvcGVuIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0Ci13aXphcmQuIE1ha2Ugc3VyZSB0aGF0IDxjb2RlPiZsdDtub25lJmd0OzwvY29kZT4gaXMgc2VsZWN0ZWQgaW4gdGhlIFRhcmdldCBSdW50aW1lCi1maWVsZCBvbiB0aGUgZmlyc3QgcGFnZSBhbmQgZ28gdG8gdGhlIHNlY29uZCBwYWdlLiBZb3Ugc2hvdWxkIHNlZSBhIHNjcmVlbiB0aGF0Ci1sb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuIE5vdGUgdGhhdCB0aGUgRm9ybUdlbiBmYWNldHMgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkCi1hcmUgZGlzcGxheWVkLjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDEuZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJzcGVjaWZ5aW5nLmNvbnN0cmFpbnRzIj4zLiBTcGVjaWZ5aW5nIENvbnN0cmFpbnRzPC9hPjwvaDI+Ci0KLTxwPk9uZSBvZiB0aGUgcHJvYmxlbXMgd2l0aCB3aGF0IHdlIGhhdmUgc28gZmFyIGlzIHRoYXQgdGhlIEZvcm1HZW4gZmFjZXRzCi1hcHBlYXIgaW4gb3RoZXIgbW9kdWxlIHByb2plY3Qgd2l6YXJkcyBzdWNoIGFzIHRoZSBFSkIgUHJvamVjdCBXaXphcmQuIFRoYXQsIG9mCi1jb3Vyc2UsIG1ha2VzIG5vIHNlbnNlIHNpbmNlIEZvcm1HZW4gaXMgc2VydmxldC1iYXNlZCB0ZWNobm9sb2d5IGFuZCBzbyBpcyBvbmx5Ci1hcHBsaWNhYmxlIHRvIEoyRUUgd2ViIGFwcGxpY2F0aW9ucy4gVG8gc29sdmUgdGhpcyBwcm9ibGVtIHdlIHdpbGwgdXNlIHRoZSAKLWNvbnN0cmFpbnQgbWVjaGFuaXNtIHRvIHNwZWNpZnkgdGhlIGRlcGVuZGVuY2llcy48L3A+Ci0KLTxwPkhlcmUgaXMgd2hhdCB0aGF0IHBhcnQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgbG9va3MgbGlrZTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPjxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9zcGFuPgotICAgICZsdDtjb25zdHJhaW50Jmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gICAgICA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPltleHByXTwvc3Bhbj4KLSAgICAmbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotCi08c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPltleHByXSA9PC9zcGFuPgotICAmbHQ7cmVxdWlyZXMgZmFjZXQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZS1saW5rIj57PGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPnZlcnNpb24uZXhwcjwvYT59PC9zcGFuPjwvc3Bhbj4iIHNvZnQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e2Jvb2xlYW59PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPm9yPC9zcGFuPgotICAmbHQ7Y29uZmxpY3RzIGZhY2V0PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj48c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUtbGluayI+ezxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uLmV4cHI8L2E+fTwvc3Bhbj48L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+b3I8L3NwYW4+Ci0gICZsdDtjb25mbGljdHMgZ3JvdXA9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+b3I8L3NwYW4+Ci0gICZsdDthbmQmZ3Q7Ci0gICAgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj5bZXhwcl08L3NwYW4+IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvYW5kJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPm9yPC9zcGFuPgotICAmbHQ7b3ImZ3Q7Ci0gICAgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj5bZXhwcl08L3NwYW4+IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvb3ImZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPHA+QXMgeW91IGNhbiBzZWUsIHRoZSBjb25zdHJhaW50IGlzIGFuIGV4cHJlc3Npb24gdHJlZSBhbmQgeW91IGhhdmUgZm91cgotb3BlcmF0b3JzIGF0IHlvdXIgZGlzcG9zYWwuIExldHMgZ28gb3ZlciB0aGVtIG9uZSBieSBvbmUuPC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+Ci08cD48Yj5yZXF1aXJlczwvYj48L3A+Ci0KLTxwPlRoZSA8Y29kZT5yZXF1aXJlczwvY29kZT4gb3BlcmF0b3IgaXMgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIG9mIGFsbCB0aGUgb3BlcmF0b3JzLiAKLUl0IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGRlcGVuZGVuY3kgb24gYW5vdGhlciBmYWNldC4gSWYgdGhlIDxjb2RlPnZlcnNpb248L2NvZGU+Ci1hdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgYW55IHZlcnNpb24gb2YgdGhlIHJlZmVyZW5jZWQgZmFjZXQgd2lsbCBzYXRpc2Z5Ci10aGUgY29uc3RyYWludC4gSWYgb25seSBzcGVjaWZpYyB2ZXJzaW9ucyB3aWxsIGRvLCB0aGUgPGNvZGU+dmVyc2lvbjwvY29kZT4gCi1hdHRyaWJ1dGUgY2FuIGNvbnRhaW4gYSA8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbiBleHByZXNzaW9uPC9hPi48L3A+Ci0KLTxwPlRoZSA8Y29kZT5zb2Z0PC9jb2RlPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsIGtpbmQgb2YgYQotZGVwZW5kZW5jeS4gRmFjZXQgc2VsZWN0aW9uIHdpbGwgbm90IGJlIHByZXZlbnRlZCBpZiB0aGUgZGVwZW5kZW5jeSBpcyBub3QKLW1ldCwgYnV0IGlmIHRoZSBkZXBlbmRlbmN5IGlzIG1ldCwgdGhlIGZhY2V0IGlzIGd1YXJhbnRlZWQgdG8gYmUgaW5zdGFsbGVkCi1hZnRlciB0aGUgcmVmZXJlbmNlZCBmYWNldC48L3A+Ci0KLTxwPjxiPmNvbmZsaWN0czwvYj48L3A+Ci0KLTxwPlRoZSA8Y29kZT5jb25mbGljdHM8L2NvZGU+IGNvbnN0cmFpbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkZWNsYXJpbmcKLWZhY2V0IHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGlmIGluc3RhbGxlZCBpbnRvIHRoZSBzYW1lIHByb2plY3QgYXMgcmVmZXJlbmNlZAotZmFjZXRzLiBUaGUgPGNvZGU+Y29uZmxpY3RzPC9jb2RlPiBjb25zdHJhaW50IGNvbWVzIGluIHR3byBmbGF2b3JzLiBZb3UgY2FuCi1laXRoZXIgc3BlY2lmeSBhIGNvbmZsaWN0IHdpdGggYSBzaW5nbGUgZmFjZXQgb3Igd2l0aCBhIGdyb3VwIG9mIGZhY2V0cy48L3A+Ci0KLTxwPldoYXQgYXJlIGdyb3VwcyBvZiBmYWNldHM/IEZhY2V0IGdyb3VwcyBhcmUgYSB3YXkgdG8gZGVzaWduYXRlIGEgY29uZmxpY3Qgd2l0aAotYSBjZXJ0YWluIGNsYXNzIG9mIGZhY2V0cyB3aXRob3V0IGhhdmluZyB0byBsaXN0IGFsbCBvZiB0aGUgZmFjZXRzIGV4cGxpY2l0bHkuCi1Gb3IgaW5zdGFuY2UsIHRoZSBXVFAgbW9kdWxlIGZhY2V0cyBhbGwgYmVsb25nIHRvIHRoZSAibW9kdWxlcyIgZ3JvdXAuIFRoZXkgYWxzbwotZWFjaCBkZWNsYXJlIGEgY29uZmxpY3Qgd2l0aCB0aGUgIm1vZHVsZXMiIGdyb3VwLiBUaGlzIHByZXZlbnRzIHR3byBtb2R1bGUgZmFjZXRzCi1mcm9tIGJlaW5nIGluc3RhbGxlZCBpbnRvIHRoZSBzYW1lIHByb2plY3QuIEJ5IGRlY2xhcmluZyBhIGNvbmZsaWN0IHdpdGggYQotZ3JvdXAgd2hvc2UgbWVtYmVyc2hpcCBjYW4gZXhwYW5kIGFzIG5lY2Vzc2FyeSwgdGhpcmQgcGFydGllcyBjYW4gYWRkIG1vZHVsZQotZmFjZXRzIG9uIHRvcCBvZiBXVFAgYW5kIGhhdmUgdGhlIG5ldyBmYWNldHMgaW50ZXJhY3QgY29ycmVjdGx5IHdpdGggdGhlCi1idWlsdC1pbiBtb2R1bGUgZmFjZXRzLjwvcD4KLQotPHA+QSBmYWNldCBncm91cCBpcyBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGEgZmFjZXQgZGVjbGFyZXMgZ3JvdXAgbWVtYmVyc2hpcC4KLUhlcmUgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZm9yIGRlY2xhcmluZyBncm91cCBtZW1iZXJzaGlwOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L3NwYW4+Ci0gICAgJmx0O2dyb3VwLW1lbWJlciBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci08L3ByZT4KLTwvZGl2PgotCi08cD48Yj5hbmQgJmFtcDsgb3I8L2I+Ci0KLTxwPlRoZSA8Y29kZT5hbmQ8L2NvZGU+ICZhbXA7IDxjb2RlPm9yPC9jb2RlPiBjb25zdHJhaW50cyBhcmUgdXNlZCB0byBwZXJmb3JtIAotbG9naWNhbCBjb25qdW5jdGlvbiBhbmQgZGlzanVuY3Rpb24gb3ZlciB0aGVpciBvcGVyYW5kcy4gQWx0aG91Z2ggaXQgaXMgbGVnYWwKLWZvciB0aGVzZSBvcGVyYXRvcnMgdG8gaGF2ZSBvbmx5IG9uZSBvcGVyYW5kLCB0eXBpY2FsbHkgdGhleSB3aWxsIGhhdmUgdHdvIG9yCi1tb3JlLjwvcD4KLTwvZGl2PgotCi08cD5XZSBjYW4gbm93IHNwZWNpZnkgdGhlIGNvbnN0cmFpbnRzIGZvciB0aGUgRm9ybUdlbiBmYWNldHMuIFRoZSBmYWNldCBpZCB0aGF0Ci1tYXJrcyBhIHByb2plY3QgYXMgYSBKMkVFIHdlYiBtb2R1bGUgaXMgPGNvZGU+anN0LndlYjwvY29kZT4uIFdlIHdpbGwgc2V0dXAKLWEgZGVwZW5kZW5jeSBvbiBpdCBmcm9tIHRoZSA8Y29kZT5mb3JtZ2VuLmNvcmU8L2NvZGU+IGZhY2V0LiBUaGUKLTxjb2RlPmZvcm1nZW4uZXh0PC9jb2RlPiBmYWNldCBjYW4gdGhlbiBkZXBlbmQgb24gdGhlIDxjb2RlPmZvcm1nZW4uZXh0PC9jb2RlPgotZmFjZXQuIFRoYXQgbGF0dGVyIGNvbnN0cmFpbnQgd2lsbCBlbnN1cmUgdGhhdCB0aGUgRm9ybUdlbiBFeHRlbnNpb25zCi1hcmUgbm90IGluc3RhbGxlZCB3aXRob3V0IGluc3RhbGxpbmcgRm9ybUdlbiBDb3JlLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uIGlkPSJmb3JtZ2VuLmNvcmUiIHZlcnNpb249IjEuMCImZ3Q7PC9zcGFuPgotICAgICZsdDtjb25zdHJhaW50Jmd0OwotICAgICAgJmx0O3JlcXVpcmVzIGZhY2V0PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmpzdC53ZWI8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjIuMiwyLjMsMi40PC9zcGFuPiIvJmd0OwotICAgICZsdDsvY29uc3RyYWludCZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gaWQ9ImZvcm1nZW4uZXh0IiB2ZXJzaW9uPSIxLjAiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Y29uc3RyYWludCZndDsKLSAgICAgICZsdDtyZXF1aXJlcyBmYWNldD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjEuMDwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDsKLSAgCi0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+PC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgYWJvdmUgY29kZSBpcyBhZGRlZCwgdGhlIEZvcm1HZW4gZmFjZXRzIHNob3VsZCBvbmx5IGFwcGVhciBpbiB0aGUKLUR5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvcD4KLQotPGgyPjxhIG5hbWU9ImltcGxlbWVudGluZy5hY3Rpb25zIj40LiBJbXBsZW1lbnRpbmcgQWN0aW9uczwvYT48L2gyPgotCi08cD5MZXQncyBub3cgdHJ5IHNlbGVjdGluZyB0aGUgRm9ybUdlbiBDb3JlIGZhY2V0IG9uIHRoZSBmYWNldHMgc2VsZWN0aW9uIHBhZ2UKLW9mIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC4gSWYgeW91IGRvIHRoYXQsIHlvdSBzaG91bGQgc2VlIHRoZQotZm9sbG93aW5nIGVycm9yIG1lc3NhZ2UgYXBwZWFyLjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDIuZ2lmIi8+PC9kaXY+Ci0KLTxwPlRoaXMgZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYmVjYXVzZSB0aGUgaW5zdGFsbCBhY3Rpb24gaGFzIG5vdCBiZWVuCi1pbXBsZW1lbnRlZCBmb3IgdGhpcyBmYWNldC4gV2hhdCdzIGFuIGFjdGlvbj8gQW4gYWN0aW9uIGlzIGFuIG9wZXJhdGlvbiB0aGF0IGEKLXVzZXIgY2FuIHBlcmZvcm0gb24gYSBmYWNldC4gVGhlcmUgYXJlIHRocmVlIGFjdGlvbiB0eXBlcyA8Y29kZT5JTlNUQUxMPC9jb2RlPiwKLTxjb2RlPlVOSU5TVEFMTDwvY29kZT4sIGFuZCA8Y29kZT5WRVJTSU9OX0NIQU5HRTwvY29kZT4uIFdlIHdpbGwgbm93IGltcGxlbWVudAotdGhlIGluc3RhbGwgYWN0aW9ucyBmb3IgdGhlIEZvcm1HZW4gZmFjZXRzLjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBsb29rcyBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0gICZsdDthY3Rpb24gaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiBmYWNldD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlLWxpbmsiPns8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbi5leHByPC9hPn08L3NwYW4+PC9zcGFuPiIgdHlwZT0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5JTlNUQUxMfFVOSU5TVEFMTHxWRVJTSU9OX0NIQU5HRTwvc3Bhbj4iJmd0OwotICAgICZsdDtkZWxlZ2F0ZSBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlfTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZhbHVlPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAmbHQ7L2FjdGlvbiZndDsKLTxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTx1bD4KLQotICA8bGk+PHA+VGhlIHZlcnNpb24gYXR0cmlidXRlIGNhbiBjb250YWluIGEgc2luZ2xlIHZlcnNpb24gb3IgYSA8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbiBleHByZXNzaW9uPC9hPi4KLSAgICBJdCBjYW4gYWxzbyBiZSBvbWl0dGVkIGlmIHRoZSBhY3Rpb24gYXBwbGllcyB0byBhbGwgdmVyc2lvbnMgb2YgdGhlIGZhY2V0LjwvcD48L2xpPgotICAgIAotICA8bGk+PHA+VGhlIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmcmFtZXdvcmsKLSAgICB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb25lIHVzaW5nIHRoZSBmb2xsb3dpbmcgcGF0dGVybjo8L3A+Ci0gICAgPHA+PGNvZGU+W2ZhY2V0LWlkXSNbdmVyc2lvbi1leHByZXNzaW9uXSNbYWN0aW9uLXR5cGVdKCNbcHJvcC1uYW1lXT1bcHJvcC12YWx1ZV0pKjwvY29kZT48L3A+Ci0gICAgPHA+QXMgeW91IGNhbiBzZWUsIGl0IGlzIGJldHRlciB0byBwcm92aWRlIGFuIGV4cGxpY2l0IGlkIHJhdGhlciB0aGFuIGxldHRpbmcKLSAgICB0aGUgZnJhbWV3b3JrIGdlbmVyYXRlIGl0LiBMYXRlciBpbiB0aGUgdHV0b3JpYWwgd2Ugd2lsbCBjb3ZlciBleHRlbnNpb24KLSAgICBwb2ludHMgdGhhdCBtYWtlIHJlZmVyZW5jZXMgdG8gYWN0aW9uIGlkcy48L3A+Ci0gIAotICA8bGk+PHA+VGhlIDxjb2RlPiZsdDthY3Rpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGNhbiBhbHNvIGJlIGVtYmVkZWQgaW5zaWRlIHRoZQotICAgIDxjb2RlPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LiBJbiB0aGF0IGNhc2UsIHRoZQotICAgIDxjb2RlPmZhY2V0PC9jb2RlPiBhbmQgPGNvZGU+dmVyc2lvbjwvY29kZT4gYXR0cmlidXRlcyBzaG91bGQgYmUgb21pdHRlZC4KLSAgICBOb3RlIHRoYXQgaWYgdGhlIHNhbWUgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24gYXBwbGllcyB0byBtdWx0aXBsZSBmYWNldCAKLSAgICB2ZXJzaW9ucywgaXQgaXMgYmV0dGVyIHRvIHByb3ZpZGUgYSBzaW5nbGUgYWN0aW9uIGRlY2xhcmF0aW9uIGV4dGVybmFsbHkuCi0gICAgVGhpcyBhbGxvd3MgdGhlIGZyYW1ld29yayB0byBwZXJmb3JtIGNlcnRhaW4ga2luZHMgb2Ygb3B0aW1pemF0aW9uczwvcD48L2xpPgotICAgIAotICA8bGk+PHA+Rm9yIHRoZSA8Y29kZT5WRVJTSU9OX0NIQU5HRTwvY29kZT4gYWN0aW9uLCBpdCBpcyBwb3NzaWJsZSB0byByZXN0cmljdAotICAgIHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoZSBhY3Rpb24gZGVmaW5pdGlvbiB3aXRoIHJlZ2FyZHMgdG8gdGhlIHN0YXJ0aW5nCi0gICAgdmVyc2lvbi4gVG8gZG8gdGhhdCwgc2ltcGx5IHNwZWNpZnkgImZyb20udmVyc2lvbnMiIHByb3BlcnR5IGluIHRoZSBhY3Rpb24KLSAgICBkZWZpbml0aW9uLiBUaGUgdmFsdWUgaXMgYSA8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbiBleHByZXNzaW9uPC9hPi4KLSAgICBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmcmFtZXdvcmsgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGVsZWdhdGUKLSAgICBpcyBjYXBhYmxlIG9mIGNvbnZlcnRpbmcgZnJvbSBhbnkgc3RhcnRpbmcgdmVyc2lvbi48L3A+PC9saT4KLSAgICAKLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgbG9naWMgYXNzb2NpYXRlZCB3aXRoCi0gKiBhIHBhcnRpY3VsYXIgZXZlbnQgaW4gcHJvamVjdCBmYWNldCdzIGxpZmUgY3ljbGUsIHN1Y2ggYXMgaW5zdGFsbCBvciAKLSAqIHVuaW5zdGFsbC4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSURlbGVnYXRlIAotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoZSBtZXRob2QgdGhhdCdzIGNhbGxlZCB0byBleGVjdXRlIHRoZSBkZWxlZ2F0ZS4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gcHJvamVjdCB0aGUgd29ya3NwYWNlIHByb2plY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHRoaXMgZGVsZWdhdGUgaXMgaGFuZGxpbmc7IHRoaXMKLSAgICAgKiAgIGlzIHVzZWZ1bCB3aGVuIHNoYXJpbmcgdGhlIGRlbGVnYXRlIGFtb25nIHNldmVyYWwgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgICAgKiAgIHByb2plY3QgZmFjZXQgb3IgZXZlbiBkaWZmZXJlbnQgcHJvamVjdCBmYWNldHMKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZGVmYXVsdHMKLSAgICAgKiAgIHNob3VsZCBiZSB1c2VkCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcGFyYW08L3NwYW4+IG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkB0aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24gaWYgdGhlIGRlbGVnYXRlIGZhaWxzIGZvciBhbnkgcmVhc29uCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnZvaWQ8L3NwYW4+IGV4ZWN1dGUoIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb247Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08cD5MZXQncyBub3cgZGl2ZSBpbiBhbmQgaW1wbGVtZW50IHRoZSBpbnN0YWxsIGRlbGVnYXRlcyBmb3IgdGhlIEZvcm1HZW4gZmFjZXRzLgotVGhlIDxjb2RlPmZvcm1nZW4uY29yZTwvY29kZT4gZmFjZXQgc2hvdWxkIChhKSBjb3B5IDxjb2RlPmZvcm1nZW4tY29yZS5qYXI8L2NvZGU+Ci1pbnRvIHRoZSBwcm9qZWN0J3MgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeSwgYW5kIChiKSByZWdpc3RlciB0aGUKLUZvcm1HZW4gc2VydmxldCBpbiA8Y29kZT53ZWIueG1sPC9jb2RlPi4gVGhlIDxjb2RlPmZvcm1nZW4uZXh0PC9jb2RlPiBmYWNldCBzaG91bGQKLWNvcHkgdGhlIDxjb2RlPmZvcm1nZW4tZXh0LmphcjwvY29kZT4gaW50byB0aGUgcHJvamVjdCdzIDxjb2RlPldFQi1JTkYvbGliPC9jb2RlPgotZGlyZWN0b3J5LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZm9ybWdlbi5jb3JlIiB2ZXJzaW9uPSIxLjAiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7YWN0aW9uIHR5cGU9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+SU5TVEFMTDwvc3Bhbj4iJmd0OwotICAgICAgJmx0O2RlbGVnYXRlIGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7L2FjdGlvbiZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9zcGFuPgotCi0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZvcm1nZW4uZXh0IiB2ZXJzaW9uPSIxLjAiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7YWN0aW9uIHR5cGU9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+SU5TVEFMTDwvc3Bhbj4iJmd0OwotICAgICAgJmx0O2RlbGVnYXRlIGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkV4dEZhY2V0SW5zdGFsbERlbGVnYXRlPC9zcGFuPiIvJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L3NwYW4+Ci0gIAotPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IGNvbS5mb3JtZ2VuLmVjbGlwc2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBsZW1lbnRzPC9zcGFuPiBJRGVsZWdhdGUKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gZXhlY3V0ZSggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0IHBqLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24KLQotICAgIHsKLSAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAyICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dHJ5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSUZvbGRlciB3ZWJJbmZMaWIgPSBVdGlscy5nZXRXZWJJbmZMaWJEaXIoIHBqICk7Ci0KLSAgICAgICAgICAgIFV0aWxzLmNvcHlGcm9tUGx1Z2luKCBuZXcgUGF0aCggImxpYnMvZm9ybWdlbi1jb3JlLmphciIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJJbmZMaWIuZ2V0RmlsZSggImZvcm1nZW4tY29yZS5qYXIiICkgKTsKLQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLQotICAgICAgICAgICAgVXRpbHMucmVnaXN0ZXJGb3JtR2VuU2VydmxldCggcGogKTsKLQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgfQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbGx5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgZmluYWwgY2xhc3M8L3NwYW4+IEZvcm1HZW5FeHRGYWNldEluc3RhbGxEZWxlZ2F0ZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBsZW1lbnRzPC9zcGFuPiBJRGVsZWdhdGUKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gZXhlY3V0ZSggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0IHBqLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24KLQotICAgIHsKLSAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dHJ5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSUZvbGRlciB3ZWJJbmZMaWIgPSBVdGlscy5nZXRXZWJJbmZMaWJEaXIoIHBqICk7Ci0KLSAgICAgICAgICAgIFV0aWxzLmNvcHlGcm9tUGx1Z2luKCBuZXcgUGF0aCggImxpYnMvZm9ybWdlbi1leHQuamFyIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkluZkxpYi5nZXRGaWxlKCAiZm9ybWdlbi1leHQuamFyIiApICk7Ci0KLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWxseTwvc3Bhbj4KLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uY2UgdGhlIGluc3RhbGwgYWN0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBzZWxlY3QKLXRoZSBGb3JtR2VuIGZhY2V0cyBvbiB0aGUgRmFjZXRzIFNlbGVjdGlvbiBQYWdlIG9mIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IFdpemFyZAotd2l0aG91dCBnZXR0aW5nIGFueSBlcnJvciBtZXNzYWdlcy4gWW91IHNob3VsZCBhbHNvIGJlIGFibGUgdG8gY29tcGxldGUgdGhlCi1wcm9qZWN0IGNyZWF0aW9uIGFuZCBzZWUgdGhlIGZvbGxvd2luZyBoaWdobGlnaHRlZCBhcnRpZmFjdHMgaW4gdGhlIG5ldyBwcm9qZWN0LgotVGhlc2UgYXJ0aWZhY3RzIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBGb3JtR2VuIGZhY2V0IGluc3RhbGwgZGVsZWdhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDMuZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJjcmVhdGluZy5jYXRlZ29yaWVzIj41LiBDcmVhdGluZyBDYXRlZ29yaWVzPC9hPjwvaDI+Ci0KLTxwPlByb2plY3QgZmFjZXRzIGNhbiBiZSBncm91cGVkIGludG8gY2F0ZWdvcmllcyBpbiBvcmRlciB0byBwcm92aWRlIHRoZSAib25lCi1jbGljayIgZXhwcmllbmNlIGZvciBub3ZpY2UgdXNlcnMgYW5kIHJldGFpbiB0aGUgZmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIGFkdmFuY2VkIAotdXNlcnMuIFlvdSBhcmUgdG9sZCB0aGF0IG1vc3Qgb2YgRm9ybUdlbiB1c2VycyBhbHdheXMgYWRkIGJvdGggb2YgdGhlIGphcnMgdG8KLXRoZWlyIHdlYiBhcHBzLiBUaGVzZSB1c2VycyB3b3VsZCBiZW5lZml0IGZyb20gaGF2aW5nIHRoZSBGb3JtR2VuIGZhY2V0cyBncm91cGVkCi1pbnRvIGEgY2F0ZWdvcnkgYW5kIHNvIHdlIHdpbGwgZG8ganVzdCB0aGF0LjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBsb29rcyBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0gICZsdDtjYXRlZ29yeSBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICAmbHQ7L2NhdGVnb3J5Jmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7cHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci0gICAgJmx0O2NhdGVnb3J5Jmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9jYXRlZ29yeSZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7PC9zcGFuPgotPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPHA+V2UgY2FuIG5vdyBjcmVhdGUgYSBjYXRlZ29yeSBhcm91bmQgdGhlIEZvcm1HZW4gZmFjZXRzLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L3NwYW4+Ci0KLSAgJmx0O2NhdGVnb3J5IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+IiZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5Gb3JtR2VuPC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+RW5hYmxlcyBnZW5lcmF0aW9uIG9mIEhUTUwgZm9ybXMgYmFzZWQgb24gWE1MIGRlZmluaXRpb24gZmlsZXMuPC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICZsdDsvY2F0ZWdvcnkmZ3Q7Ci0KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O3Byb2plY3QtZmFjZXQgaWQ9ImZvcm1nZW4uY29yZSImZ3Q7PC9zcGFuPgotICAgICZsdDtjYXRlZ29yeSZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+Jmx0Oy9jYXRlZ29yeSZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0Ozwvc3Bhbj4KLQotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7cHJvamVjdC1mYWNldCBpZD0iZm9ybWdlbi5leHQiJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Y2F0ZWdvcnkmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5mb3JtZ2VuLmNhdGVnb3J5PC9zcGFuPiZsdDsvY2F0ZWdvcnkmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci0KLTxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uY2UgdGhlIGFib3ZlIGNoYW5nZSBoYXMgYmVlbiBwdXQgaW4gcGxhY2UsIHRoZSBmYWNldHMgc2VsZWN0aW9uIHBhZ2Ugc2hvdWxkIAotbG9vayBsaWtlIHRoaXM6PC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wNC5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9ImRlY29yYXRpbmciPjYuIERlY29yYXRpbmc8L2E+PC9oMj4KLQotPHA+Q3VzdG9tIGljb25zIGNhbiBiZSBwcm92aWRlZCBmb3IgZmFjZXRzIGFuZCBjYXRlZ29yaWVzLiBJZiBhbiBpY29uIGlzIG5vdAotcHJvdmlkZWQsIGEgZGVmYXVsdCBpY29uIGlzIHVzZWQuIFRoZSBpY29ucyBhcmUgaGVscGZ1bCBhcyBhIHdheSB0byBiZXR0ZXIKLWRpZmZlcmVudGlhdGUgZmFjZXRzIGFuZCB0byBtYWtlIHRoZW0gc3RhbmQgb3V0LjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgZXh0ZW5zaW9uIHBvaW50IGxvb2tzIGxpa2U6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIiZndDsKLSAgJmx0O2ltYWdlIGZhY2V0PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgcGF0aD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0O2ltYWdlIGNhdGVnb3J5PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgcGF0aD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+WW91ciBzdGFydGVyIHByb2plY3QgY2FtZSB3aXRoIHRocmVlIGljb25zIGluIHRoZSA8Y29kZT5pY29uczwvY29kZT4gZm9sZGVyLgotV2Ugd2lsbCBub3cgYXNzb2NpYXRlIHRoZW0gd2l0aCB0aGUgRm9ybUdlbiBmYWNldHMgYW5kIHRoZSBjYXRlZ29yeS48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlczwvc3Bhbj4iJmd0OwotICAmbHQ7aW1hZ2UgZmFjZXQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIgcGF0aD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5pY29ucy9mb3JtZ2VuLWNvcmUuZ2lmPC9zcGFuPiIvJmd0OwotICAmbHQ7aW1hZ2UgZmFjZXQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmljb25zL2Zvcm1nZW4tZXh0LmdpZjwvc3Bhbj4iLyZndDsKLSAgJmx0O2ltYWdlIGNhdGVnb3J5PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmljb25zL2Zvcm1nZW4tY2F0LmdpZjwvc3Bhbj4iLyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgYWJvdmUgc25pcHBldCBoYXMgYmVlbiBhZGRlZCB0byB5b3VyIHBsdWdpbi54bWwgZmlsZSwgdGhlIGZhY2V0cwotc2VsZWN0aW9uIHBhZ2Ugc2hvdWxkIGxvb2sgbGlrZSB0aGlzOjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDUuZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJhZGRpbmcud2l6YXJkLnBhZ2VzIj43LiBBZGRpbmcgV2l6YXJkIFBhZ2VzPC9hPjwvaDI+Ci0KLTxwPkl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBnYXRoZXIgdXNlciBpbnB1dCBwcmlvciB0byBpbnN0YWxsaW5nIGEgZmFjZXQuCi1UaGUgZnJhbWV3b3JrIGFsbG93cyBhIHNlcXVlbmNlIG9mIHdpemFyZCBwYWdlcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggZmFjZXQKLWFjdGlvbnMuIFRoZSBzdXBwbGllZCB3aXphcmQgcGFnZXMgYXJlIHNob3duIGFmdGVyIHRoZSBmYWNldHMgc2VsZWN0aW9uCi1wYWdlLiBCYXNlZCBvbiB1c2VyIGZlZWRiYWNrLCB5b3Uga25vd24gdGhhdCBGb3JtR2VuIHVzZXJzIG9mdGVuIGN1c3RvbWl6ZQotdGhlIFVSTCBwYXR0ZXJuIG9mIHRoZSBGb3JtR2VuIHNlcnZsZXQgc28geW91IHdvdWxkIGxpa2UgdG8gZ2l2ZSB0aGVtIHRoZSBhYmlsaXR5Ci10byBkbyB0aGF0IGluIHRoZSB3aXphcmQgd2hlbiB0aGUgRm9ybUdlbiBmYWNldHMgYXJlIGJlaW5nIGluc3RhbGxlZC48L3A+Ci0KLTxwPkhlcmUgaXMgd2hhdCB0aGUgcmVsZXZhbnQgcGFydHMgb2YgdGhlIGV4dGVuc2lvbiBwb2ludHMgbG9vayBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O2FjdGlvbiZndDs8L3NwYW4+Ci0gICAgJmx0O2NvbmZpZy1mYWN0b3J5IGNsYXNzPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmNsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5PC9zcGFuPiIvJmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L2FjdGlvbiZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLQotJmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXM8L3NwYW4+IiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBhY3Rpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMCBvciBtb3JlKTwvc3Bhbj4KLSAgICAmbHQ7cGFnZSBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklGYWNldFdpemFyZFBhZ2V9PC9zcGFuPiIvPiA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigxIG9yIG1vcmUpPC9zcGFuPgotICAmbHQ7L3dpemFyZC1wYWdlcyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OyAgCi08L3ByZT4KLTwvZGl2PgotCi08cD5PbmUgdGhpbmcgdG8gbm90ZSBoZXJlIGlzIHRoYXQgaW4gb3JkZXIgdG8gZW5hYmxlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUKLWZhY2V0IGFjdGlvbiBkZWxlZ2F0ZSBhbmQgdGhlIHdpemFyZCBwYWdlcywgd2UgZ28gYmFjayB0byB0aGUgYWN0aW9uIGRlY2xhcmF0aW9uCi1hbmQgcHJvdmlkZSBhbiBhY3Rpb24gY29uZmlnIGZhY3RvcnkuIFRoZSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZmFjdG9yeSBpcyAKLXBvcHVsYXRlZCBieSB0aGUgd2l6YXJkIHBhZ2VzIGFuZCBpcyByZWFkIGJ5IHRoZSBhY3Rpb24gZGVsZWdhdGUuIE5vIHJlc3RyaWN0aW9ucwotYXJlIHBsYWNlZCBvbiB0aGUgc2hhcGUgb2YgdGhlIGNvbmZpZyBvYmplY3QuIFlvdSBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCBhIGN1c3RvbQotY2xhc3Mgb3IgeW91IGNhbiB1c2UgYSBzb21ldGhpbmcgZ2VuZXJpYyBsaWtlIDxjb2RlPmphdmEudXRpbC5IYXNoTWFwPC9jb2RlPi48L3A+Ci0KLTxwPkFub3RoZXIgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IHRoZSA8Y29kZT53aXphcmRQYWdlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IHJlZmVycwotdG8gdGhlIGFjdGlvbnMgYnkgdGhlaXIgaWRzLCBzbyBpdCBiZWNvbWVzIG1vcmUgaW1wb3J0YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeQotdGhlIGlkIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIGZyYW1ld29yayBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIG9uZS48L3A+Ci0KLTxwPkhlcmUgYXJlIHRoZSBpbnRlcmZhY2VzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGFib3ZlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWE6PC9wPiAKLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBtZXRob2QgZm9yIGNyZWF0aW5nIAotICogYSBjb25maWcgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJpemluZyB0aGUgZmFjZXQgYWN0aW9uCi0gKiBkZWxlZ2F0ZS4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSUFjdGlvbkNvbmZpZ0ZhY3RvcnkKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZhY2V0IGFjdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdC4gVGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICogb2JqZWN0IHNob3VsZCBpZGVhbGx5IGJlIHBvcHVsYXRlZCB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiBhIG5ldyBmYWNldCBhY3Rpb24gY29uZmlndXJhdGlvbiBvYmplY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkB0aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIGNyZWF0aW5nIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqLzwvc3Bhbj4KLSAgICAKLSAgICBPYmplY3QgY3JlYXRlKCkgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhyb3dzPC9zcGFuPiBDb3JlRXhjZXB0aW9uOwotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIHdpemFyZCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggcHJvamVjdAotICogZmFjZXQgYWN0aW9ucy4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSUZhY2V0V2l6YXJkUGFnZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5leHRlbmRzPC9zcGFuPiBJV2l6YXJkUGFnZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHdpemFyZAotICAgICAqIGNvbnRleHQgdG8gdGhlIHdpemFyZCBwYWdlLiBUaGUgd2l6YXJkIGNvbnRleHQgY2FuIGJlIHVzZWQgdG8gZmluZCBvdXQKLSAgICAgKiBhYm91dCBvdGhlciBhY3Rpb25zIGJlaW5nIGNvbmZpZ3VyZWQgYnkgdGhlIHdpemFyZC4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gY29udGV4dCB0aGUgd2l6YXJkIGNvbnRleHQKLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gc2V0V2l6YXJkQ29udGV4dCggSVdpemFyZENvbnRleHQgY29udGV4dCApOwotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGFjdGlvbiBjb25maWcKLSAgICAgKiBvYmplY3QgdGhhdCB0aGUgd2l6YXJkIHBhZ2Ugc2hvdWxkIHNhdmUgdXNlciBzZWxlY3Rpb24gaW50by4gVGhlCi0gICAgICogcG9wdWxhdGVkIGNvbmZpZyBvYmplY3Qgd2lsbCB0aGVuIGJlIHBhc3NlZCB0byB0aGUgYWN0aW9uIGRlbGVnYXRlLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBjb25maWcgdGhlIGFjdGlvbiBjb25maWcgb2JqZWN0Ci0gICAgICovPC9zcGFuPgotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnZvaWQ8L3NwYW4+IHNldENvbmZpZyggT2JqZWN0IGNvbmZpZyApOwotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgdXNlciBoYXMgcHJlc3NlZCB0aGUgPGNvZGU+RmluaXNoPC9jb2RlPgotICAgICAqIGJ1dHRvbi4gSXQgYWxsb3dzIHRoZSB3aXphcmQgcGFnZSB0byB0cmFuc2ZlciB1c2VyIHNlbGVjdGlvbiBpbnRvIHRoZQotICAgICAqIGNvbmZpZyBvYmplY3QuIEFsdGVybmF0aXZlLCBpbnN0ZWFkIG9mIHVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgd2l6YXJkCi0gICAgICogcGFnZSBjb3VsZCB1cGRhdGUgdGhlIG1vZGVsIG9uIHRoZSBmbHkgYXMgdGhlIHVzZXIgaXMgbWFraW5nIGNoYW5nZXMuCi0gICAgICovPC9zcGFuPgotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCk7Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08cD5XZSB3aWxsIG5vdyBpbXBsZW1lbnQgYSB3aXphcmQgcGFnZSBmb3IgdGhlIDxjb2RlPmZhY2V0LmNvcmU8L2NvZGU+IGZhY2V0Ci1pbnN0YWxsIGFjdGlvbi4gVGhlIHdpemFyZCBwYWdlIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0Ci1zZXJ2bGV0IFVSTCBwYXR0ZXJuIGZvciB0aGUgRm9ybUdlbiBzZXJ2bGV0LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZm9ybWdlbi5jb3JlIiB2ZXJzaW9uPSIxLjAiJmd0OwotICAgICZsdDthY3Rpb24gdHlwZT0iSU5TVEFMTCI8L3NwYW4+IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZS5pbnN0YWxsPC9zcGFuPiI8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mZ3Q7PC9zcGFuPgotICAgICAgJmx0O2NvbmZpZy1mYWN0b3J5IGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWckRmFjdG9yeTwvc3Bhbj4iLyZndDsKLSAgICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L2FjdGlvbiZndDsKLSAgJmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci0KLSZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzPC9zcGFuPiImZ3Q7Ci0gICZsdDt3aXphcmQtcGFnZXMgYWN0aW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZS5pbnN0YWxsPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3BhZ2UgY2xhc3M9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuQ29yZUZhY2V0SW5zdGFsbFBhZ2U8L3NwYW4+Ii8+Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7ICAKLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgZmluYWwgY2xhc3M8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHJpdmF0ZTwvc3Bhbj4gU3RyaW5nIHVybFBhdHRlcm4gPSA8c3BhbiBjbGFzcz0iamF2YS1saXRlcmFsIj4iKi5mb3JtIjwvc3Bhbj47Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWM8L3NwYW4+IFN0cmluZyBnZXRVcmxQYXR0ZXJuKCkKLSAgICB7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnJldHVybiB0aGlzPC9zcGFuPi51cmxQYXR0ZXJuOwotICAgIH0KLQotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyB2b2lkPC9zcGFuPiBzZXRVcmxQYXR0ZXJuKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gU3RyaW5nIHVybFBhdHRlcm4gKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHN0YXRpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRmFjdG9yeSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBsZW1lbnRzPC9zcGFuPiBJQWN0aW9uQ29uZmlnRmFjdG9yeQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljPC9zcGFuPiBPYmplY3QgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cmV0dXJuIG5ldzwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWcoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLkFic3RyYWN0RmFjZXRXaXphcmRQYWdlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgZmluYWwgY2xhc3M8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsUGFnZSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5leHRlbmRzPC9zcGFuPiBBYnN0cmFjdEZhY2V0V2l6YXJkUGFnZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnByaXZhdGU8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnIGNvbmZpZzsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcml2YXRlPC9zcGFuPiBUZXh0IHVybFBhdHRlcm5UZXh0RmllbGQ7Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWM8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsUGFnZSgpCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5zdXBlcjwvc3Bhbj4oIDxzcGFuIGNsYXNzPSJqYXZhLWxpdGVyYWwiPiJmb3JtZ2VuLmNvcmUuZmFjZXQuaW5zdGFsbC5wYWdlIjwvc3Bhbj4gKTsKLQotICAgICAgICBzZXRUaXRsZSggPHNwYW4gY2xhc3M9ImphdmEtbGl0ZXJhbCI+IkZvcm1HZW4gQ29yZSI8L3NwYW4+ICk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCA8c3BhbiBjbGFzcz0iamF2YS1saXRlcmFsIj4iQ29uZmlndXJlIHRoZSBGb3JtR2VuIHNlcnZsZXQuIjwvc3Bhbj4gKTsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gY3JlYXRlQ29udHJvbCggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IENvbXBvc2l0ZSBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IENvbXBvc2l0ZSBjb21wb3NpdGUgPSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5uZXc8L3NwYW4+IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5uZXc8L3NwYW4+IEdyaWRMYXlvdXQoIDEsIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZhbHNlPC9zcGFuPiApICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IExhYmVsIGxhYmVsID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCggPHNwYW4gY2xhc3M9ImphdmEtbGl0ZXJhbCI+IlVSTCBQYXR0ZXJuOiI8L3NwYW4+ICk7Ci0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVyblRleHRGaWVsZCA9IDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPm5ldzwvc3Bhbj4gVGV4dCggY29tcG9zaXRlLCBTV1QuQk9SREVSICk7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRoaXM8L3NwYW4+LnVybFBhdHRlcm5UZXh0RmllbGQuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRoaXM8L3NwYW4+LnVybFBhdHRlcm5UZXh0RmllbGQuc2V0VGV4dCggdGhpcy5jb25maWcuZ2V0VXJsUGF0dGVybigpICk7Ci0KLSAgICAgICAgc2V0Q29udHJvbCggY29tcG9zaXRlICk7Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IHNldENvbmZpZyggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IE9iamVjdCBjb25maWcgKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4uY29uZmlnID0gKEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnKSBjb25maWc7Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IHRyYW5zZmVyU3RhdGVUb0NvbmZpZygpCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aGlzPC9zcGFuPi5jb25maWcuc2V0VXJsUGF0dGVybiggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVyblRleHRGaWVsZC5nZXRUZXh0KCkgKTsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcml2YXRlIHN0YXRpYzwvc3Bhbj4gR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5yZXR1cm4gbmV3PC9zcGFuPiBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICk7Ci0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQiPjxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+cGFja2FnZTwvc3Bhbj4gY29tLmZvcm1nZW4uZWNsaXBzZTsKLQotPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZSA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcGxlbWVudHM8L3NwYW4+IElEZWxlZ2F0ZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IGV4ZWN1dGUoIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0IHBqLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPnRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDIgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgezwvc3Bhbj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZyBjZmcKLSAgICAgICAgICAgICAgICA9IChGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZykgY29uZmlnOwotCi0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0Ij48c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJRm9sZGVyIHdlYkluZkxpYiA9IFV0aWxzLmdldFdlYkluZkxpYkRpciggcGogKTsKLQotICAgICAgICAgICAgVXRpbHMuY29weUZyb21QbHVnaW4oIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+bmV3PC9zcGFuPiBQYXRoKCAibGlicy9mb3JtZ2VuLWNvcmUuamFyIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkluZkxpYi5nZXRGaWxlKCAiZm9ybWdlbi1jb3JlLmphciIgKSApOwotCi0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOzwvc3Bhbj4KLQotICAgICAgICAgICAgVXRpbHMucmVnaXN0ZXJGb3JtR2VuU2VydmxldCggcGosIGNmZy5nZXRVcmxQYXR0ZXJuKCkgKTsKLQotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dCI+bW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgfQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmZpbmFsbHk8L3NwYW4+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotfTwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uY2UgdGhlIGFib3ZlIGNvZGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB5b3Ugc2hvdWxkIHNlZSBhbm90aGVyIHBhZ2UgYXBwZWFyCi1pbiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdCBXaXphcmQgYWZ0ZXIgdGhlIEZvcm1HZW4gZmFjZXRzIGFyZSBzZWxlY3RlZC4gVGhlCi1uZXcgcGFnZSB3aWxsIGFwcGVhciBhZnRlciB0aGUgV2ViIE1vZHVsZSBwYWdlLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi08Y29kZT5qc3Qud2ViPC9jb2RlPiBmYWNldC4gVGhhdCdzIGJlY2F1c2UgPGNvZGU+Zm9ybWdlbi5jb3JlPC9jb2RlPiBmYWNldAotZGVwZW5kcyBvbiB0aGUgPGNvZGU+anN0LndlYjwvY29kZT4gZmFjZXQuIElmIHRoaXMgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgCi13YXMgbm90IHNwZWNpZmllZCB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgdGhlc2UgcGFnZXMgd291bGQgYmUgdW5zcGVjaWZpZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wNi5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9ImRlZmluaW5nLnByZXNldHMiPjguIERlZmluaW5nIFByZXNldHM8L2E+PC9oMj4KLQotPHA+QXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZmFjZXRzIGdyb3dzLCBpdCBiZWNvbWVzIGluY3JlYXNpbmdseSBkaWZmaWN1bHQKLWZvciB0aGUgdXNlciB0byBmaWd1cmUgb3V0IHdoaWNoIGNvbWJpbmF0aW9ucyBtYWtlIHNlbnNlLiBUaGlzIGlzIHdoZXJlIHByZXNldHMKLWNvbWUgaW4uIFByZXNldHMgKG9yIENvbmZpZ3VyYXRpb25zLCBhcyB0aGV5IGFyZSByZWZlcnJlZCB0byBpbiB0aGUgVUkpIGFyZQotc2ltcGx5IGNvbWJpbmF0aW9ucyBvZiBmYWNldHMgdGhhdCBzb21lb25lIGhhcyBkZXRlcm1pbmVkIGFyZSB1c2VmdWwgaW4gY2VydGFpbgotc2l0dWF0aW9ucy4gUHJlc2V0cyBjYW4gYmUgY3JlYXRlZCBieSB0aGUgdXNlciBvciBzdXBwbGllZCB2aWEgYW4gZXh0ZW5zaW9uCi1wb2ludC48L3A+Ci0KLTxwPkhlcmUgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZm9yIGRlY2xhcmluZyBwcmVzZXRzOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzPC9zcGFuPiImZ3Q7Ci0gICZsdDtzdGF0aWMtcHJlc2V0IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgZXh0ZW5kcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvc3RhdGljLXByZXNldCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+Tm90ZSB0aGF0IGluIG9yZGVyIGZvciBhIHByZXNldCB0byBhcHBseSB0byBhIGdpdmVuIGZhY2V0ZWQgcHJvamVjdCwgdGhlCi1wcmVzZXQgbmVlZHMgdG8gaW5jbHVkZSBhbGwgb2YgdGhlIHByb2plY3QncyAiZml4ZWQgZmFjZXRzIi4gRml4ZWQgZmFjZXRzIGFyZQotdGhlIGZhY2V0cyB0aGF0IGFyZSBrZXkgdG8gdGhlIHByb3BlciBvcGVyYXRpb24gb2YgdGhhdCBwcm9qZWN0IHR5cGUgYW5kIHNvCi1jYW5ub3QgYmUgcmVtb3ZlZC4gWW91IGNhbiBpZGVudGlmeSBmaXhlZCBmYWNldHMgYnkgdGhlIGxvY2sgaWNvbi48L3A+Ci0KLTxwPkxldCdzIG5vdyBjcmVhdGUgYSBwcmVzZXQgdGhhdCBpbmNsdWRlcyBmb3JtZ2VuIGZhY2V0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0czwvc3Bhbj4iJmd0OwotICAmbHQ7c3RhdGljLXByZXNldCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLnByZXNldDwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ieG1sLXRleHQiPkZvcm1HZW4gV2ViIFByb2plY3Q8L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7PHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5DcmVhdGVzIGEgd2ViIHByb2plY3Qgd2l0aCBGb3JtR2VuIGZ1bmN0aW9uYWxpdHkuPC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmpzdC5qYXZhPC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij41LjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmpzdC53ZWI8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjIuMjwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uZXh0PC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0gICZsdDsvc3RhdGljLXByZXNldCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+SGVyZSBpcyBob3cgdGhlIHByZXNldCBzaG93cyB1cCBvbiB0aGUgZmFjZXRzIHNlbGVjdGlvbiBwYWdlOjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDcuZ2lmIi8+PC9kaXY+Ci0KLTxwPlRoZSBwcmVzZXQgY2FuIGFsc28gYmUgc2VsZWN0ZWQgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgYWxsIFdUUCBwcm9qZWN0Ci1jcmVhdGlvbiB3aXphcmRzLiBIZXJlIGlzIGhvdyB0aGlzIGxvb2tzIGluIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZDo8L3A+Ci0KLTxkaXYgY2xhc3M9InNjcmVlbi1zaG90Ij48aW1nIHNyYz0iaW1hZ2VzL3NjcmVlbjA4LmdpZiIvPjwvZGl2PgotCi08aDI+PGEgbmFtZT0icnVudGltZS5tYXBwaW5ncyI+OS4gU3BlY2lmeWluZyBSdW50aW1lIFN1cHBvcnQgTWFwcGluZ3M8L2E+PC9oMj4KLQotPHA+T25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgb2YgdGhlIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmsgaXMgdG8KLWJlIGFibGUgdG8gYWNjdXJhdGVseSBtb2RlbCB3aGV0aGVyIGEgY2VydGFpbiBzZXJ2ZXIgcnVudGltZSBzdXBwb3J0cyBhCi1naXZlbiBwcm9qZWN0LiBXZSBkbyB0aGF0IGJ5ICJtYXBwaW5nIiBwcm9qZWN0IGZhY2V0cyB0byBydW50aW1lIGNvbXBvbmVudHMKLXRoYXQgc3VwcG9ydCB0aGVtLiBJZiB0aGUgYXJ0aWZhY3RzIGNyZWF0ZWQgYnkgYSBmYWNldCB3aWxsIHJ1biBvbiBhbnkgc2VydmVyCi10aGF0IHN1cHBvcnRzIGFsbCBvZiB0aGUgZmFjZXQncyB1cHN0cmVhbSBkZXBlbmRlbmNpZXMsIHRoZW4gdGhlIDxjb2RlPmFueTwvY29kZT4KLXdpbGRjYXJkIGNhbiBiZSB1c2VkLjwvcD4KLQotPHA+SXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGV2ZXJ5IGZhY2V0IG5lZWRzIHRvIHNwZWNpZnkgYSBzdXBwb3J0IG1hcHBpbmcgb2YKLXNvbWUga2luZC4gRmFjZXRzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhbnkgc3VwcG9ydCBtYXBwaW5ncyBhcmUgdHJlYXRlZCBhcyBub3QKLXN1cHBvcnRlZCBieSBhbnkgcnVudGltZSwgd2hpY2ggaXMgbm90IHZlcnkgdXNlZnVsLjwvcD4KLQotPHA+SGVyZSBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IHRoYXQncyB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBzdXBwb3J0IG1hcHBpbmdzOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lczwvc3Bhbj4iJmd0OwotICAmbHQ7c3VwcG9ydGVkJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAgICZsdDtydW50aW1lLWNvbXBvbmVudCBhbnk9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e2Jvb2xlYW59PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlLWxpbmsiPns8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbi5leHByPC9hPn08L3NwYW4+PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZS1saW5rIj57PGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPnZlcnNpb24uZXhwcjwvYT59PC9zcGFuPjwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMSBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0Oy9zdXBwb3J0ZWQmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC9kaXY+Ci0KLTxwPlRoZSA8Y29kZT4mbHQ7c3VwcG9ydGVkJmd0OzwvY29kZT4gYmxvY2sgY2FuIHJlZmVyZW5jZSBhbnkgbnVtYmVyIG9mIHJ1bnRpbWUKLWNvbXBvbmVudHMgYXMgd2VsbCBhcyBhbnkgbnVtYmVyIG9mIGZhY2V0cy4gVGhlIHNlbWFudGljcyBvZiB0aGF0IGlzIHRvIGRlY2xhcmUgCi1hcyBzdXBwb3J0ZWQgZXZlcnkgY29tYmluYXRpb24gaW4gdGhlIHJlc3VsdGluZyBjcm9zcy1wcm9kdWN0LjwvcD4gCi0KLTxwPlRoZSA8Y29kZT52ZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGVzIG9mIHRoZSA8Y29kZT4mbHQ7cnVudGltZS1jb21wb25lbnQmZ3Q7PC9jb2RlPiAKLWFuZCA8Y29kZT4mbHQ7ZmFjZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgb21pdHRlZCB0byBpbmNsdWRlIGFsbCB2ZXJzaW9ucy48L3A+Ci0KLTxwPlRoZSBGb3JtR2VuIGZhY2V0cyBkb24ndCBoYXZlIGFueSBzcGVjaWFsIHN1cHBvcnQgcmVxdWlyZW1lbnRzLiBUaGV5IHdpbGwgcnVuCi1vbiBhbnkgc2VydmVyIHRoYXQgc3VwcG9ydHMgdGhlIGoyZWUgc2VydmxldCBzcGVjLiBXZSB3aWxsIHVzZSB0aGUgPGNvZGU+YW55PC9jb2RlPgotd2lsZGNhcmQgdG8gZGVzaWduYXRlIHRoYXQuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzPC9zcGFuPiImZ3Q7Ci0gICZsdDtzdXBwb3J0ZWQmZ3Q7Ci0gICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGFueT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij50cnVlPC9zcGFuPiIvJmd0OwotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uZXh0PC9zcGFuPiIvJmd0OwotICAmbHQ7L3N1cHBvcnRlZCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+QWx0ZXJuYXRpdmUsIGlmIGZvciBzb21lIHJlYXNvbiB0aGUgRm9ybUdlbiBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGEgc3BlY2lmaWMKLXJ1bnRpbWUsIHN1Y2ggYXMgVG9tY2F0LCB3ZSB3b3VsZCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhlIHRoaXMgaW5zdGVhZDo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXM8L3NwYW4+IiZndDsKLSAgJmx0O3N1cHBvcnRlZCZndDsKLSAgICAmbHQ7cnVudGltZS1jb21wb25lbnQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQ8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPls1LjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+Ii8mZ3Q7Ci0gICZsdDsvc3VwcG9ydGVkJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgYWJvdmUgbW9yZSByZXN0cmljdGl2ZSBzcGVjaWZpY2F0aW9uIHdpbGwgcHJldmVudCBGb3JtR2VuIGZhY2V0cyBmcm9tCi1iZWluZyBzZWxlY3RlZCBpZiB0aGUgcHJvamVjdCBpcyB0YXJnZXR0ZWQgdG8gYW55IHJ1bnRpbWUgb3RoZXIgdGhhbiBBcGFjaGUKLVRvbWNhdCA1LjAgb3IgbmV3ZXIuPC9wPgotCi08aDI+PGEgbmFtZT0ic3VtbWFyeSI+MTAuIFN1bW1hcnk8L2E+PC9oMj4KLQotPHA+SW4gdGhpcyB0dXRvcmlhbCB3ZSBjcmVhdGVkIHR3byBmdWxseS1mdW5jdGlvbmFsIHByb2plY3QgZmFjZXRzIGJ5IHNwZWNpZnlpbmcKLWNvbnN0cmFpbnRzLCBpbXBsZW1lbnRpbmcgYWN0aW9ucywgZ3JvdXBpbmcgZmFjZXRzIGludG8gY2F0ZWdvcmllcywgYW5kIGNyZWF0aW5nCi13aXphcmQgcGFnZXMgdG8gYWxsb3cgdXNlcnMgdG8gcGFyYW1ldGVyaXplIGZhY2V0IGluc3RhbGxhdGlvbi4gWW91IHNob3VsZCBub3cKLWJlIHdlbGwgcHJlcGFyZWQgdG8gY3JlYXRlIHlvdXIgb3duIGZhY2V0cy4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBub3QgY292ZXJlZAotYnkgdGhpcyB0dXRvcmlhbCBjYW4gYmUgZm91bmQgaW4gdGhlIGZvbGxvd2luZyBhcHBlbmRpeCBzZWN0aW9ucy48L3A+IAotCi08aDI+PGEgbmFtZT0iY3VzdG9tLnZlcnNpb24uY29tcGFyYXRvcnMiPkFwcGVuZGl4IEE6IEN1c3RvbSBWZXJzaW9uIENvbXBhcmF0b3JzPC9hPjwvaDI+Ci0KLTxwPlRoZSBmYWNldGVkIHByb2plY3QgZnJhbWV3b3JrIG5lZWRzIHRvIGJlIGFibGUgdG8gY29tcGFyZSBmYWNldCB2ZXJzaW9uCi1zdHJpbmdzLiBUaGUgZnJhbWV3b3JrIHN1cHBsaWVzIGEgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgdGhhdCBjYW4gaGFuZGxlCi12ZXJzaW9uIHN0cmluZ3MgZW5jb2RlZCB1c2luZyB0aGUgc3RhbmRhcmQgZGVjaW1hbCBub3RhdGlvbiAoc3VjaCBhcyAxLjIgb3IKLTUuNjYuNTUzMyksIGJ1dCBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0IHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5Ci1hIGN1c3RvbSB2ZXJzaW9uIGNvbXBhcmF0b3IuPC9wPgotCi08cD5IZXJlIGlzIGhvdyB5b3UgcGx1ZyBpbiBhIGN1c3RvbSB2ZXJzaW9uIGNvbXBhcmF0b3I6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci0gICAgJmx0O3ZlcnNpb24tY29tcGFyYXRvciBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Y2xhc3M6amF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7U3RyaW5nJmd0O308L3NwYW4+Ii8mZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPldoZW4gaW1wbGVtZW50aW5nIGEgdmVyc2lvbiBjb21wYXJhdG9yIHlvdSBjYW4gZWl0aGVyIHN0YXJ0IGZyb20gc2NyYXRjaAotb3Igc3ViY2xhc3MgdGhlIGRlZmF1bHQgdmVyc2lvbiBjb21wYXJhdG9yICg8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3I8L2NvZGU+KS4KLVN1YmNsYXNzaW5nIHRoZSBkZWZhdWx0IHZlcnNpb24gY29tcGFyYXRvciBtYWtlcyBzZW5zZSBpZiB0aGUgdmVyc2lvbiBmb3JtYXQKLWRpZmZlcnMgb25seSBzbGlnaHRseSBmcm9tIHRoZSBkZWZhdWx0IGZvcm1hdCwgc3VjaCBhcyB1c2luZyBzZXBhcmF0b3JzIG90aGVyCi10aGFuIGRvdHMgb3IgaGF2aW5nIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgYXQgY2VydGFpbiBwb3NpdGlvbnMuIEhlcmUgYXJlIHRoZQotcHJvdGVjdGVkIG1ldGhvZHMgZXhwb3NlZCBieSB0aGUgPGNvZGU+RGVmYXVsdFZlcnNpb25Db21wYXJhdG9yPC9jb2RlPiBjbGFzcwotdGhhdCBhcmUgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbjo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFJldHVybnMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZQotICogdXNlZCB3aGVuIGJyZWFraW5nIHRoZSB2ZXJzaW9uIHN0cmluZyBpbnRvIHNlZ21lbnRzLiBUaGUgZGVmYXVsdAotICogaW1wbGVtZW50YXRpb24gcmV0dXJucyAiLiIuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICogCi0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVycwotICovPC9zcGFuPgotICAgIAotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHJvdGVjdGVkPC9zcGFuPiBTdHJpbmcgZ2V0U2VwYXJhdG9ycygpOwotICAgIAotPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gKiBQYXJzZXMgYSBzZWdtZW50IG9mIHRoZSB2ZXJzaW9uIHN0cmluZy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGFyc2VzCi0gKiB0aGUgZmlyc3Qgc2VnbWVudCBhcyBhbiBpbnRlZ2VyIChsZWFkaW5nIHplcm9lcyBhcmUgaWdub3JlZCkgYW5kIHRoZQotICogcmVzdCBvZiB0aGUgc2VnbWVudHMgYXMgZGVjaW1hbHMgKGxlYWRpbmcgemVyb2VzIGFyZSBrZXB0KS4gU3ViY2xhc3NlcyAKLSAqIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGN1c3RvbSBwYXJzaW5nIGZvciBhbnkgbnVtYmVyIG9mIAotICogc2VnbWVudHMuCi0gKiAKLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiB2ZXJzaW9uIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nCi0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gc2VnbWVudCB0aGUgdmVyc2lvbiBzZWdtZW50Ci0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWdtZW50IGluIHRoZSB2ZXJzaW9uIHN0cmluZwotICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWdtZW50IGFzIGEge0BzZWUgQ29tcGFyYWJsZX0KLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHRocm93czwvc3Bhbj4gVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiBpZiBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBwYXJzaW5nCi0gKi88L3NwYW4+Ci0gICAgCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcm90ZWN0ZWQ8L3NwYW4+IENvbXBhcmFibGUgcGFyc2UoIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBTdHJpbmcgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gU3RyaW5nIHNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IGludCBwb3NpdGlvbiApCi0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhyb3dzPC9zcGFuPiBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uOwotPC9wcmU+Ci08L2Rpdj4KLQotPGgyPjxhIG5hbWU9InZlcnNpb24uZXhwcmVzc2lvbnMiPkFwcGVuZGl4IEI6IFZlcnNpb24gRXhwcmVzc2lvbnM8L2E+PC9oMj4KLQotPHA+QSB2ZXJzaW9uIGV4cHJlc3Npb24gaXMgYSBzeW50YXggZm9yIHNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSB2ZXJzaW9uLiBUaGUKLXZlcnNpb24gZXhwcmVzc2lvbnMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgZnJhbWV3b3JrJ3MgZXh0ZW5zaW9uIHBvaW50cywgYnV0Ci15b3Ugd2lsbCBtb3N0IGxpa2VseSBmaXJzdCBlbmNvdW50ZXIgdGhlbSB3aGlsZSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT5yZXF1aXJlczwvY29kZT4gCi1jb25zdHJhaW50LjwvcD4KLQotPHA+QSB2ZXJzaW9uIGV4cHJlc3Npb24gaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgc2VnbWVudHMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gCi1UaGUgY29tbWFzIGZ1bmN0aW9uIGFzIGFuIE9SIG9wZXJhdGlvbi4gRWFjaCBzZWdtZW50IGlzIGVpdGhlciBhIHNpbmdsZSB2ZXJzaW9uLCAKLWEgcmFuZ2UsIG9yIGEgd2lsZGNhcmQuIFJhbmdlcyBhcmUgcmVwcmVzZW50ZWQgYnkgYnJhY2tldCBhbmQgZGFzaCBub3RhdGlvbiBzdWNoIAotYXMgW3gteSkuIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUsIHdoaWxlIHRoZSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuIE9wZW4gCi1lbmRlZCByYW5nZXMgYXJlIGFsc28gc3VwcG9ydGVkLiBBIHdpbGRjYXJkIChyZXByZXNlbnRlZCBieSAnKicgY2hhcmFjdGVyKSBjYW4KLWJlIHVzZWQgdG8gbWF0Y2ggYW55IHZlcnNpb24uIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIHdpbGRjYXJkIHRvIG1hdGNoCi1wYXJ0IG9mIHRoZSB2ZXJzaW9uIHN0cmluZy48L3A+Ci0KLTxwPkhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+MS4yCi0xLjIsMS41LDMuMgotWzEuMi0zLjJdCi1bMy43LTUuMCkKLVszLjcKLTUuMCkKLTEuMixbMy4wLTQuNSksWzcuMwotKgotPC9wcmU+Ci08L2Rpdj4KLQotPGgyPjxhIG5hbWU9InByb3BlcnR5LnRlc3RlciI+QXBwZW5kaXggQzogUHJvcGVydHkgVGVzdGVyPC9hPjwvaDI+Ci0KLTxwPkEgcHJvcGVydHkgdGVzdGVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHRoYXQgYWxsb3dzCi10aGUgcHJlc2VuY2Ugb2YgdGhlIGZhY2V0IGluIGEgcHJvamVjdCB0byBiZSB0ZXN0ZWQgYnkgYW55IGV4dGVuc2lvbiBwb2ludCB0aGF0Ci13b3JrcyB3aXRoIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM8L2NvZGU+IHBhY2thZ2UuIFRoZSBtb3N0IGNvbW1vbgotdXNhZ2UgaXMgdG8gZW5hYmxlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIChzdWNoIGFzIGFjdGlvbnMgYW5kIHByb2plY3QgcHJvcGVydHkKLXBhZ2VzKS4gVGhlIHByb3BlcnR5IG5hbWUgaXMgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9jb2RlPgotYW5kIHRoZSB2YWx1ZSBpcyBlaXRoZXIgYSBmYWNldCBpZCBvciBhIGZhY2V0IGlkIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kCi1hIDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uIGV4cHJlc3Npb248L2E+LjwvcD4KLQotPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIGZhY2V0cyBwcm9wZXJ0eSB0ZXN0ZXIgdG8gY29udHJvbCBlbmFibGVtZW50IG9mCi1hIHByb2plY3QgcHJvcGVydGllcyBwYWdlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzPC9zcGFuPiImZ3Q7Ci0gICZsdDtwYWdlIAotICAgIGFkYXB0YWJsZT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICBvYmplY3RDbGFzcz0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDwvc3Bhbj4iCi0gICAgbmFtZT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5Gb3JtR2VuIFByb3BlcnRpZXM8L3NwYW4+IgotICAgIGNsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmNvbS5mb3JtZ2VuLmVjbGlwc2UuRm9ybUdlblByb3BlcnRpZXNQYWdlPC9zcGFuPiIKLSAgICBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZTwvc3Bhbj4iJmd0OwotICAgICZsdDtlbmFibGVkV2hlbiZndDsKLSAgICAgICZsdDt0ZXN0IAotICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+dHJ1ZTwvc3Bhbj4iCi0gICAgICAgIHByb3BlcnR5PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvc3Bhbj4iCi0gICAgICAgIHZhbHVlPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7L2VuYWJsZWRXaGVuJmd0OyAgICAgICAgICAKLSAgJmx0Oy9wYWdlJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08aDI+PGEgbmFtZT0id2l6YXJkLmNvbnRleHQiPkFwcGVuZGl4IEQ6IFdpemFyZCBDb250ZXh0PC9hPjwvaDI+Ci0KLTxwPlNvbWV0aW1lcyBpdCBkZXNpcmFibGUgdG8gYmUgYWJsZSB0byBhZGp1c3QgdGhlIGJlaGF2aW9yIG9mIGZhY2V0IGFjdGlvbiAKLXdpemFyZCBwYWdlcyBiYXNlZCBvbiB1c2VyIGlucHV0IGluIHRoZSB3aXphcmQgcGFnZXMgb2Ygb3RoZXIgZmFjZXRzLiBUaGUKLTxjb2RlPklXaXphcmRDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gVGhlIHdpemFyZAotcGFnZSBnZXRzIGEgaGFuZGxlIG9uIDxjb2RlPklXaXphcmRDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2Ugd2hlbiBpdCdzCi08Y29kZT5zZXRXaXphcmRDb250ZXh0PC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLiBXaGVuIHdyaXRpbmcgY29kZSB0aGF0IHJlbGllcwotb24gdGhlIHdpemFyZCBjb250ZXh0LCB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgcG9pbnRzIHlvdSBzaG91bGQga2VlcCBpbiBtaW5kLjwvcD4KLQotPG9sPgotCi0gIDxsaT48cD5UaGUgZmFjZXQgd2hvc2UgdmFsdWUgeW91IHdpc2ggdG8gY2hlY2sgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGluc3RhbGxlZAotICAgIGluIHRoZSBwYXN0LiBJbiB0aGF0IGNhc2UgeW91IHdpbGwgbm90IGZpbmQgaXQncyBpbnN0YWxsIGNvbmZpZ3VyYXRpb24gaW4KLSAgICB0aGUgd2l6YXJkIGNvbnRleHQuIFlvdSB3aWxsIG5lZWQgdG8gd3JpdGUgY29uZGl0aW9uYWwgbG9naWMgdGhhdCB3aWxsCi0gICAgY29uc3VsdCB0aGUgd2l6YXJkIGNvbnRleHQgb3IgbG9va3MgYXQgcHJvamVjdCBzdGF0ZSBvbiBkaXNrLjwvcD48L2xpPgotICAgIAotICA8bGk+PHA+WW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyBwcm92aWRlZCBpbiB5b3VyCi0gICAgY29uZmlnIG9iamVjdCBmb3IgdGhlIEFQSS1vbmx5IHNjZW5hcmlvIHdoZXJlIHlvdXIgd2l6YXJkIHBhZ2Ugd2lsbCBub3QgYmUKLSAgICBpbnZvbHZlZC48L3A+Ci0gICAgCi08L29sPgotCi08cD5IZXJlIGlzIHdoYXQgdGhlIDxjb2RlPklXaXphcmRDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UgbG9va3MgbGlrZTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gamF2YS51dGlsLlNldDsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb24uVHlwZTsKLQotPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gKiBUaGUgaW50ZXJmYWNlIGV4cG9zZWQgdG8gdGhlIGZhY2V0IGFjdGlvbiB3aXphcmQgcGFnZXMgdGhhdCBhbGxvd3MgdGhlbQotICogdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3aXphcmQgc3RhdGUuCi0gKi88L3NwYW4+Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBpbnRlcmZhY2U8L3NwYW4+IElXaXphcmRDb250ZXh0IAotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgd2l6YXJkIGlzIG9wZXJhdGluZyBvbi4gSWYgdGhlCi0gICAgICogd2l6YXJkIGlzIGluIHRoZSBwcm9qZWN0IGNyZWF0aW9uIG1vZGUsIHRoZSBwcm9qZWN0IHdpbGwgbm90IHlldCBleGlzdAotICAgICAqIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSB3aXphcmQgaXMgb3BlcmF0aW5nIG9uCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBmYWNldHMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSB3aXphcmQuIElmIHRoZSB3aXphcmQKLSAgICAgKiBpcyBpbiB0aGUgYWRkL3JlbW92ZSBmYWNldHMgbW9kZSAodnMuIHByb2plY3QgY3JlYXRpb24pLCB0aGlzIG1ldGhvZCB3aWxsIAotICAgICAqIHJldHVybiB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIGEgcHJvamVjdCBhZnRlciBiZWluZyAKLSAgICAgKiBtb2RpZmllZCBieSB0aGUgY3VycmVudCBzZXQgb2YgYWN0aW9ucy4gCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcmV0dXJuPC9zcGFuPiB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIHdpemFyZCAoZWxlbWVudCB0eXBlOgotICAgICAqICAgezxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHNlZTwvc3Bhbj4gSVByb2plY3RGYWNldFZlcnNpb259KQotICAgICAqLzwvc3Bhbj4KLSAgICAKLSAgICBTZXQgZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmFjZXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZQotICAgICAqIHdpemFyZC4gU2VlIHtAc2VlIGdldFNlbGVjdGVkUHJvamVjdEZhY2V0cygpfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiBvYmplY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuIG9ubHkgaWYgdGhlIHByb3ZpZGVkIHByb2plY3QgZmFjZXQgaXMKLSAgICAgKiAgIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgd2l6YXJkCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmJvb2xlYW48L3NwYW4+IGlzUHJvamVjdEZhY2V0U2VsZWN0ZWQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFjdGlvbnMgY3VycmVudGx5IHNwZWNpZmllZCBieSB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBzZXQgb2YgYWN0aW9ucyBjdXJyZW50bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIFNldCBnZXRBY3Rpb25zKCk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogRmluZHMgdGhlIGFjdGlvbiBvZiBzcGVjaWZpZWQgdHlwZSB0aGF0IGFwcGxpZXMgdG8gdGhlIHNwZWNpZmllZCBmYWNldCwKLSAgICAgKiBpZiBzdWNoIGFjdGlvbiBleGlzdHMuIElmIHRoZSB3aXphcmQgaXMgaW4gdGhlIGFkZC9yZW1vdmUgZmFjZXRzIG1vZGUKLSAgICAgKiAodnMuIHByb2plY3QgY3JlYXRpb24pLCB5b3UgY2Fubm90IGRlcGVuZCBvbiBmaW5kaW5nIHRoZSBpbnN0YWxsIGFjdGlvbgotICAgICAqIGZvciBhIHJlcXVpcmVkIGZhY2V0IGFzIHRoYXQgZmFjZXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGluc3RhbGxlZC4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gdHlwZSB0aGUgYWN0aW9uIHR5cGUKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiBvYmplY3QKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBhY3Rpb24gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovPC9zcGFuPgotICAgIAotICAgIEFjdGlvbiBnZXRBY3Rpb24oIEFjdGlvbi5UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxici8+PGJyLz48YnIvPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC93aGF0c25ldzE1MC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3doYXRzbmV3MTUwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTQ4MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3doYXRzbmV3MTUwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhCi0gIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLSAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPldoYXQncyBOZXcgZm9yIDEuNT88L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+V2hhdCdzIE5ldyBmb3IgMS41PzwvcD4KLQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEFQSSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEZhY2V0ZWQKLVByb2plY3QgRnJhbWV3b3JrIGZvciBXVFAgMS41IHJlbGVhc2UuIEJvdGggSmF2YSBBUEkgYW5kIGV4dGVuc2lvbiBwb2ludCBjaGFuZ2VzIAotYXJlIGNvdmVyZWQuIE5vdGUgdGhhdCB0aGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBBUEkgcmVtYWlucyBwcm92aXNpb25hbAotZm9yIHRoZSAxLjUgcmVsZWFzZS4gVGhpcyBtZWFucyBpdCB3aWxsIGNvbnRpbnVlIHVuZGVyZ29pbmcgZnVydGhlciBzaWduaWZpY2FudAotY2hhbmdlcyBpbiBmdXR1cmUgcmVsZWFzZShzKS48L3A+Ci0KLTxwPjxiPkF0dGVudGlvbjo8L2I+IEFsbCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBkZXByZWNhdGVkIAotaW4gdGhlIDEuNSByZWxlYXNlIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgMi4wIHJlbGVhc2UuIFVudGlsIHRoYXQgcG9pbnQgdGhleSAKLXdpbGwgY29udGludWUgdG8gZnVuY3Rpb24gYW5kIGJlIGZ1bGx5IHN1cHBvcnRlZC48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiN2ZXhwcnMiPlZlcnNpb24gRXhwcmVzc2lvbnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNhY3Rpb25zIj5BY3Rpb24gRGVmaW5pdGlvbnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiN3aXphcmQiPldpemFyZCBQYWdlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2V2ZW50LmhhbmRsZXJzIj5FdmVudCBIYW5kbGVyczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3J1bnRpbWVzIj5UYXJnZXRpbmcgTXVsdGlwbGUgUnVudGltZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNwcmVzZXRzIj5EZXNjcmlwdGlvbnMgZm9yIFByZXNldHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNtaXNjIj5NaXNjZWxsYW5lb3VzPC9hPjwvbGk+Ci08L29sPgotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InZleHBycyI+MS4gVmVyc2lvbiBFeHByZXNzaW9uczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VmVyc2lvbiBleHByZXNzaW9ucyBhcmUgdXNlZCBpbiB2YXJpb3VzIGNvbnRleHQgdGhyb3VnaG91dCB0aGUgZnJhbWV3b3JrJ3MKLWV4dGVuc2lvbiBwb2ludHMgYW5kIEphdmEgQVBJIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgbmVlZCB0byBiZSBzcGVjaWZpZWQuIEluCi10aGUgMS4wLnggcmVsZWFzZSwgdGhlIHZlc2lvbiBleHByZXNzaW9ucyB3ZXJlIG9mIHRoZSBmb3JtICImbHQ7MS41LDIuMywyLjUsJmd0PTUuMCIsCi13aGVyZSBjb21tYXMgaW5kaWNhdGUgYSBkaXNqdW5jdGlvbiAob3IpLiBUaGlzIHN5bnRheCBkaWQgbm90IGFsbG93IHJhbmdlcyB0byBiZQotc3BlY2lmaWVkIGFuZCB3YXMgdW53aWVsZHkgZHVlIHRvIHRoZSBuZWVkIHRvIGVzY2FwZSB0aGUgYW5nbGUgYnJhY2tldHMgaW4gdGhlCi1wbHVnaW4ueG1sIGZpbGVzLiBTbyB0aGlzIHN5bnRheCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHRoZSAxLjUgcmVsZWFzZS4gVGhlIG5ldwotc3ludGF4IGFsc28gdXNlcyBjb21tYXMgdG8gc3BlY2lmeSBhIGRpc2p1bmN0aW9uLCBidXQgbm93IHJhbmdlcyBjYW4gYmUKLXNwZWNpZmllZCB1c2luZyAiWzEuMy02LjMpIiBub3RhdGlvbi4gU3F1YXJlIGJyYWNrZXRzIG1lYW4gaW5jbHVzaXZlLCB3aGlsZQotcGFyZW50aGVzaXMgbWVhbiBleGNsdXNpdmUuIE9wZW4gcmFuZ2VzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyBub3RhdGlvbgotbGlrZSAiWzEuMyIgYW5kICI2LjMpIi48L3A+Ci0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iYWN0aW9ucyI+Mi4gQWN0aW9uIERlZmluaXRpb25zPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BY3Rpb24gZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1hZGUgaW50byBmaXJzdCBjbGFzcyBlbnRpdGllcyB3aXRoIHRoZSBuZXcKLWFiaWxpdHkgdG8gYmUgYXNzaWduZWQgYW4gaWQgYW5kIHRoZSBjcmVhdGlvbiBvZiB0aGUgYnJvd3NpbmcgQVBJLiBJbiBhZGRpdGlvbiwKLWl0IGlzIG5vdyBwb3NzaWJsZSB0byBjcmVhdGUgY29uc3RyYWluZWQgVkVSU0lPTl9DSEFOR0UgYWN0aW9ucyBpbiBvcmRlciB0bwotZGVzaWduYXRlIHByZWNpc2VseSB3aGljaCB2ZXJzaW9ucyB0aGUgZGVsZWdhdGUgaXMgY2FwYWJsZSBvZiBjaGFuZ2luZyBmcm9tLgotTXVsdGlwbGUgVkVSU0lPTl9DSEFOR0UgZGVsZWdhdGVzIHdpdGggZGlmZmVyZW50ICJmcm9tLnZlcnNpb25zIiBjb25zdHJhaW50Ci1jYW4gYmUgc3BlY2lmaWVkLjwvcD4KLQotPHA+PHU+RXh0ZW5zaW9uIFBvaW50IENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gIC4uLgotICAmbHQ7YWN0aW9uPC9mb250PiBpZD0ic3RyaW5nIiA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uICZndDsKLSAgICAuLi4KLSAgICA8L2ZvbnQ+Ci0gICAgJmx0O3Byb3BlcnR5IG5hbWU9ImZyb20udmVyc2lvbnMiIHZhbHVlPSJzdHJpbmciLyZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPgotICAgIC4uLgotICAmbHQvYWN0aW9uJmd0OwotICAuLi4KLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uCi17Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJPTV9WRVJTSU9OUzsKLSAgIFN0cmluZyBnZXRJZCgpOwotICAgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKTsKLSAgIElWZXJzaW9uRXhwciBnZXRWZXJzaW9uRXhwcigpOwotICAgQWN0aW9uLlR5cGUgZ2V0QWN0aW9uVHlwZSgpOwotICAgTWFwIGdldFByb3BlcnRpZXMoKTsKLSAgIE9iamVjdCBnZXRQcm9wZXJ0eSggU3RyaW5nIG5hbWUgKTsKLSAgIE9iamVjdCBjcmVhdGVDb25maWdPYmplY3QoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBTdHJpbmcgcGpuYW1lICk7Ci19Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbgotewotICAgLi4uPC9mb250PgotICAgYm9vbGVhbiBzdXBwb3J0cyggU2V0IGJhc2UsIEFjdGlvbi5UeXBlIHR5cGUgKTsKLSAgIFNldCBnZXRBY3Rpb25EZWZpbml0aW9ucygpOwotICAgU2V0IGdldEFjdGlvbkRlZmluaXRpb25zKCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBTZXQgYmFzZSwgQWN0aW9uLlR5cGUgdHlwZSApOwotICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotfTwvZm9udD4KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyCi17Ci0gICAgLi4uPC9mb250PgotICAgIFNldCBnZXRBY3Rpb25EZWZpbml0aW9ucygpOwotICAgIGJvb2xlYW4gaXNBY3Rpb25EZWZpbmVkKCBTdHJpbmcgaWQgKTsKLSAgICBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBTdHJpbmcgaWQgKTsKLSAgICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSNGRkYxQzE+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBib29sZWFuIHN1cHBvcnRzKCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICBPYmplY3QgY3JlYXRlQWN0aW9uQ29uZmlnKCBBY3Rpb24uVHlwZSB0eXBlLCBTdHJpbmcgcGpuYW1lICk7Ci0gICBib29sZWFuIGlzU2FtZUFjdGlvbkNvbmZpZyggQWN0aW9uLlR5cGUgdHlwZSwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0id2l6YXJkIj4zLiBXaXphcmQgUGFnZXM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSBleHRlbnNpb24gcG9pbnQgc2NoZW1hIGZvciBkZWZpbmluZyB3aXphcmQgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotcHJvamVjdCBmYWNldCBhY3Rpb25zIGhhcyBiZWVuIHJldmlzZWQgdG8gYmUgbW9yZSBmbGV4aWJsZS48L3A+Ci0KLTxwPjx1PkRlcHJlY2F0ZWQgRXh0ZW5zaW9uIFBvaW50PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9I0ZGRjFDMT4KLTxwcmU+Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkIiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBmYWNldD0iLi4uIiZndDsKLSAgICAmbHQ7aW5zdGFsbCZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICAgICAmbHQ7cGFnZSBjbGFzcz0iLi4uIi8mZ3Q7IDxpPigxIG9yIG1vcmUpPC9pPgotICAgICZsdDsvaW5zdGFsbCZndDsKLSAgICAmbHQ7dW5pbnN0YWxsJmd0OyA8aT4oMCBvciAxKTwvaT4KLSAgICAgICZsdDtwYWdlIGNsYXNzPSIuLi4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICAgJmx0Oy91bmluc3RhbGwmZ3Q7Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5SZXBsYWNlbWVudCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotJmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzIiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBhY3Rpb249Ii4uLiImZ3Q7IDxpPigxIG9yIG1vcmUpPC9pPgotICAgICZsdDtwYWdlIGNsYXNzPSIuLi4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5Ob3RlIHRoZSBuZXcgZXh0ZW5zaW9uIHBvaW50IGlkLiBUaGUgImFjdGlvbiIgYXR0cmlidXRlIHNob3VsZCBjb250YWluIHRoZQotYWN0aW9uIHRoYXQgdGhlc2UgcGFnZXMgYXJlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC4gVGhlIGFjdGlvbiBpZCBjYW4KLWJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHZpYSB0aGUgbmV3ICJpZCIgYXR0cmlidXRlIGF2YWlsYWJsZSBvbiB0aGUgImFjdGlvbiIKLWVsZW1lbnQgb2YgdGhlIGNvcmUgZmFjZXRzIGV4dGVuc2lvbiBwb2ludC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaWQKLWlzIGdlbmVyYXRlZCB1c2luZyB0aGUgIltmYWNldC1pZF0jW3ZlcnNpb24tZXhwcmVzc2lvbl0jW2FjdGlvbi10eXBlXSIgCi1wYXR0ZXJuLjwvcD4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRkZGMUMxIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLlByb2plY3RGYWNldHNVaU1hbmFnZXIKLXsKLSAgIC4uLjwvZm9udD4KLSAgIExpc3QgZ2V0V2l6YXJkUGFnZXMoIEFjdGlvbi5UeXBlIHR5cGUsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+UmVwbGFjZW1lbnQgSmF2YSBBUEk8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5Qcm9qZWN0RmFjZXRzVWlNYW5hZ2VyCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBMaXN0IGdldFdpemFyZFBhZ2VzKCBTdHJpbmcgYWN0aW9uSWQgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iZXZlbnQuaGFuZGxlcnMiPjQuIEV2ZW50IEhhbmRsZXJzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BIG5ldyBldmVudCBoYW5kbGluZyBmYWNpbGl0eSBoYXMgYmVlbiBhZGRlZC4gVGhpcyBtYWtlcyBmb3IgYSBjbGVhciBzZXBhcmF0aW9uCi1iZXR3ZWVuIGFjdGlvbnMgKHVzZXIgaW5pdGlhdGVkKSwgYW5kIGV2ZW50cyAoYXV0b21hdGljKS4gUHJpb3IgdG8gdGhpcyBjaGFuZ2UKLWl0IHdhcyBwb3NzaWJsZSB0byByZWdpc3RlciBhICJydW50aW1lLWNoYW5nZWQiIGFjdGlvbi4gVGhhdCB1c2FnZSBpcyBub3cKLWRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdXNlIGV2ZW50IGhhbmRsZXIgZXh0ZW5zaW9uIHBvaW50LiBWYXJpb3VzCi1uZXcgZXZlbnRzIGhhdmUgYWxzbyBiZWVuIGFkZGVkLjwvcD4KLQotPHA+PHU+RXZlbnQgVHlwZXM8L3U+PC9wPgotCi08cD5QUkVfSU5TVEFMTCwgUE9TVF9JTlNUQUxMLCBQUkVfVU5JTlNUQUxMLCBQT1NUX1VOSU5TVEFMTCwgUFJFX1ZFUlNJT05fQ0hBTkdFLAotUE9TVF9WRVJTSU9OX0NIQU5HRSwgUlVOVElNRV9DSEFOR0VEPC9wPgotCi08cD48dT5FeHRlbnNpb24gUG9pbnQgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgLi4uPC9mb250PgotICAmbHQ7ZXZlbnQtaGFuZGxlciB0eXBlPSIuLi4iIGZhY2V0PSIuLi4iIHZlcnNpb249Ii4uLiImZ3Q7Ci0gICAgJmx0O2RlbGVnYXRlIGNsYXNzPSIuLi4iLyZndDsKLSAgJmx0L2V2ZW50LWhhbmRsZXImZ3Q7Ci0gIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+UlVOVElNRV9DSEFOR0VEIEV2ZW50PC91PjwvcD4KLQotPHA+SW4gdGhlIDEuMC54IHJlbGVhc2UgaXQgd2FzIHBvc3NpYmxlIHRvIHJlZ2lzdGVyIGEgInJ1bnRpbWUtY2hhbmdlZCIgYWN0aW9uLgotVGhhdCB1c2FnZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgUlVOVElNRV9DSEFOR0VECi1ldmVudCBoYW5kbGVyLiBUaGUgUlVOVElNRV9DSEFOR0VEIGV2ZW50IGhhbmRsZXIgZGVsZWdhdGUgZ2V0cyBwYXNzZWQgaW4gYQotY29uZmlnIG9iamVjdCB0aGF0IGNhcnJpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQuPC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVJ1bnRpbWVDaGFuZ2VkRXZlbnQKLXsKLSAgICBJUnVudGltZSBnZXRPbGRSdW50aW1lKCk7Ci0gICAgSVJ1bnRpbWUgZ2V0TmV3UnVudGltZSgpOwotfSAgCi08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0icnVudGltZXMiPjUuIFRhcmdldGluZyBNdWx0aXBsZSBSdW50aW1lczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIGFiaWxpdHkgZm9yIGEgcHJvamVjdCB0byB0YXJnZXQgbXVsdGlwbGUgcnVudGltZXMgaGFzIGJlZW4gZnVydGhlcgotZmxlc2hlZCBvdXQgZHVyaW5nIHRoZSAxLjUgcmVsZWFzZS48L3A+Ci0gICAKLTxwPjx1PkRlcHJlY2F0ZWQgSmF2YSBBUEk8L3U+PC9wPgotICAgCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0ZGRjFDMSI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdAotewotICAgLi4uPC9mb250PgotICAgSVJ1bnRpbWUgZ2V0UnVudGltZSgpOwotICAgdm9pZCBzZXRSdW50aW1lKCBJUnVudGltZSBydW50aW1lICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLSAgICAgCi08cD48dT5SZXBsYWNlbWVudCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ci17Ci0gICAuLi48L2ZvbnQ+Ci0gICBTZXQgZ2V0VGFyZ2V0ZWRSdW50aW1lcygpOwotICAgdm9pZCBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBTZXQgcnVudGltZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgdm9pZCBhZGRUYXJnZXRlZFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgdm9pZCByZW1vdmVUYXJnZXRlZFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgSVJ1bnRpbWUgZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgIHZvaWQgc2V0UHJpbWFyeVJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotfTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJwcmVzZXRzIj42LiBEZXNjcmlwdGlvbnMgZm9yIFByZXNldHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkl0IGlzIG5vdyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgZGVzY3JpcHRpb24gd2l0aCBwcmVzZXRzLjwvcD4KLSAgIAotPHA+PHU+RXh0ZW5zaW9uIFBvaW50cyBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAuLi4KLSAgJmx0O3ByZXNldCZndDsKLSAgICAuLi48L2ZvbnQ+Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Oy4uLiZsdC9kZXNjcmlwdGlvbiZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotICAmbHQvcHJlc2V0Jmd0OwotICAuLi4KLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+SmF2YSBBUEkgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXIKLXsKLSAgIC4uLjwvZm9udD4KLSAgIElQcmVzZXQgZGVmaW5lUHJlc2V0KCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXQgZmFjZXRzICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldAotewotICAgLi4uPC9mb250PgotICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Im1pc2MiPjcuIE1pc2NlbGxhbmVvdXM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPjx1PkphdmEgQVBJIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBib29sZWFuIGlzVmFsaWRGb3IoIFNldCBmaXhlZCApOwotICAgYm9vbGVhbiBjb25mbGljdHNXaXRoKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotICAgU3RyaW5nIGdldFBsdWdpbklkKCk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHIKLXsKLSAgIGJvb2xlYW4gZXZhbHVhdGUoIFN0cmluZyB2ZXJzaW9uICk7Ci0gICBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKCk7Ci19Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY29udGVudC93aGF0c25ldzE1MS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3doYXRzbmV3MTUxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDNkOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3doYXRzbmV3MTUxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+V2hhdCdzIE5ldyBmb3IgMS41LjE/PC90aXRsZT4KLTxsaW5rCi0gIHJlbD0ic3R5bGVzaGVldCIKLSAgdHlwZT0idGV4dC9jc3MiCi0gIGhyZWY9ImZvcm1hdC5jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxwIGNsYXNzPSJ1ZWJlcnNjaHJpZnQiPldoYXQncyBOZXcgZm9yIDEuNS4xPzwvcD4KLQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEFQSSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEZhY2V0ZWQKLVByb2plY3QgRnJhbWV3b3JrIGZvciBXVFAgMS41LjEgcmVsZWFzZS4gQm90aCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50IAotY2hhbmdlcyBhcmUgY292ZXJlZC4gTm90ZSB0aGF0IHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIEFQSSByZW1haW5zIAotcHJvdmlzaW9uYWwgZm9yIHRoZSAxLjUuMSByZWxlYXNlLiBUaGlzIG1lYW5zIGl0IHdpbGwgY29udGludWUgdW5kZXJnb2luZyAKLWZ1cnRoZXIgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiBmdXR1cmUgcmVsZWFzZShzKS48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiNkZWZ2ZXIiPlNwZWNpZnlpbmcgRGVmYXVsdCBGYWNldCBWZXJzaW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjd2lsZGNhcmQiPldpbGRjYXJkIFN1cHBvcnQgaW4gVmVyc2lvbiBFeHByZXNzaW9uczwvYT48L2xpPgotPC9vbD4KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ2ZXhwcnMiPjEuIFNwZWNpZnlpbmcgRGVmYXVsdCBGYWNldCBWZXJzaW9uPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5JdCBpcyBub3cgcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0Ci13aGVuIHRoZSBmYWNldCBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuIFRoZXJlIGFyZSB0d28gd2F5cyB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0Ci12ZXJzaW9uLiBZb3UgY2FuIGVpdGhlciBzcGVjaWZ5IGEgc3RhdGljIGRlZmF1bHQgb3IgeW91IGNhbiBpbXBsZW1lbnQgdGhlCi08Y29kZT5JRGVmYXVsdFZlcnNpb25Qcm92aWRlcjwvY29kZT4gaW50ZXJmYWNlLiBJZiBhIGRlZmF1bHQgdmVyc2lvbiBpcyBub3QKLXNwZWNpZmllZCwgdGhlIGxhdGVzdCB2ZXJzaW9uIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLjwvcD4KLQotPHA+PHU+RXh0ZW5zaW9uIFBvaW50IENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0Jmd0OzwvZm9udD4KLSAgICAmbHQ7ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IntzdHJpbmd9Ii8mZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gICAgJmx0O2RlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ie2NsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyfSIvJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQKLXs8L2ZvbnQ+Ci0gICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi17Ci0gICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpOwotfQotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ3aWxkY2FyZCI+Mi4gV2lsZGNhcmQgU3VwcG9ydCBpbiBWZXJzaW9uIEV4cHJlc3Npb25zPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BIHdpbGRjYXJkIGNoYXJhY3RlciAnKicgY2FuIG5vdyBiZSB1c2VkIGluIHZlcnNpb24gZXhwcmVzc2lvbnMgaW4gb3JkZXIgdG8KLW1hdGNoIGFueSB2ZXJzaW9uLiBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgd2lsZGNhcmQgdG8gbWF0Y2gKLXBhcnQgb2YgdGhlIHZlcnNpb24gc3RyaW5nLjwvcD4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHIKLXs8L2ZvbnQ+Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTERDQVJEX1NZTUJPTCA9ICIqIjsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvd2hhdHNuZXcyMC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jb250ZW50L3doYXRzbmV3MjAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmNWYwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2NvbnRlbnQvd2hhdHNuZXcyMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YQotICBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCi0gIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5XaGF0J3MgTmV3IGZvciAyLjA/PC90aXRsZT4KLTxsaW5rCi0gIHJlbD0ic3R5bGVzaGVldCIKLSAgdHlwZT0idGV4dC9jc3MiCi0gIGhyZWY9ImZvcm1hdC5jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxwIGNsYXNzPSJ1ZWJlcnNjaHJpZnQiPldoYXQncyBOZXcgZm9yIDIuMD88L3A+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBBUEkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGZvciAKLXRoZSBXVFAgMi4wIHJlbGVhc2UuIEJvdGggSmF2YSBBUEkgYW5kIGV4dGVuc2lvbiBwb2ludCBjaGFuZ2VzIGFyZSBjb3ZlcmVkLiBBbGwgQVBJIHRoYXQgd2FzIAotZGVwcmVjYXRlZCBpbiB0aGlzIHJlbGVhc2UgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgY2xpZW50cyBhcmUgYWR2aXNlZCB0byBzd2l0Y2ggdG8gbm9uLWRlcHJlY2F0ZWQgCi1hbHRlcm5hdGl2ZXMgYXMgc29vbiBhcyBmZWFzaWJsZS48L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9IiNnZW5lcmljcyI+R2VuZXJpY3M8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNwcmVzZXRzIj5JbXByb3ZlbWVudHMgdG8gUHJlc2V0czwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2NvbXBhcmFibGUiPklQcm9qZWN0RmFjZXRWZXJzaW9uIGFuZCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gRXh0ZW5kIENvbXBhcmFibGU8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNyZXF1aXJlcy1ncm91cCI+UmVxdWlyZXMgQ29uc3RyYWludCBTdXBwb3J0cyBHcm91cHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNncm91cC1sYWJlbHMiPkxhYmVscyBhbmQgRGVzY3JpcHRpb25zIGZvciBHcm91cHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiN2YWxpZGF0ZSI+TmV3IElGYWNldGVkUHJvamVjdCBWYWxpZGF0aW9uIEFQSTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI25ldy13aXphcmQtY2xhc3MiPkFkZFJlbW92ZUZhY2V0c1dpemFyZCBDbGFzcyBSZW5hbWVkIHRvIE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcGRlLWxpbWl0YXRpb25zIj5FeHRlbnNpb24gUG9pbnQgU2NoZW1hIENoYW5nZXMgdG8gV29yayBBcm91bmQgUERFIExpbWl0YXRpb25zPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjbGlzdGVuZXJzIj5MaXN0ZW5lcnMgYW5kIEV2ZW50czwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI21pc2MiPk1pc2NlbGxhbmVvdXM8L2E+PC9saT4KLTwvb2w+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjZ2VuZXJpY3MiPjEuIEdlbmVyaWNzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5BbGwgb2YgdGhlIGZyYW1ld29yaydzIEFQSSBub3cgdXNlIEphdmEgNSBnZW5lcmljcy4gVGhpcyBoYXMgYmVlbiBkb25lIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUKLXdheSBhbmQgZXhpc3RpbmcgY2xpZW50cyBhcmUgZXhwZWN0ZWQgdG8gY29udGludWUgdG8gd29yayB3aXRob3V0IGFueSBtb2RpZmljYXRpb25zLiBJbiBvcmRlciBmb3IgYSAKLWNsaWVudCB0byBnYWluIGFjY2VzcyB0byB0aGUgdHlwZSBzYWZldHkgYWZmb3JkZWQgYnkgZ2VuZXJpY3MgaW4gdGhpcyBBUEksIHRoZSBjbGllbnQgcGx1Z2luJ3MgSmF2YSAKLWNvbXBpbGVyIGxldmVsIHNob3VsZCBiZSBjb25maWd1cmVkIHRvIGJlIDUuMCBvciBuZXdlci48L3A+ICAKLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InByZXNldHMiPjIuIEltcHJvdmVtZW50cyB0byBQcmVzZXRzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5TaWduaWZpY2FudCBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIHByZXNldHMgZmFjaWxpdHkgZm9yIHRoZSAyLjAgcmVsZWFzZS4gQSBuZXcgdHlwZSBvZgotcHJlc2V0LCByZWZlcnJlZCB0byBhcyBhIGR5bmFtaWMgcHJlc2V0LCBpcyBub3cgYXZhaWxhYmxlLiBBIGR5bmFtaWMgcHJlc2V0IHVzZXMgYW4gZXh0ZW5kZXItc3VwcGxpZWQKLWZhY3RvcnkgdG8gc3ludGhlc2l6ZSB0aGUgcHJlc2V0IGRlZmluaXRpb24gb24gdGhlIGZseSBiYXNlZCBvbiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCB3aWxsIGJlCi11c2VkLiBUaGUgIm9sZC1zdHlsZSIgZGVjbGFyYXRpdmUgcHJlc2V0cyBhcmUgc3RpbGwgYXZhaWxhYmxlIGFuZCBhcmUgbm93IHJlZmVycmVkIHRvIGFzIHN0YXRpYwotcHJlc2V0cy4gU3RhdGljIHByZXNldHMgaGF2ZSBhbHNvIGJlZW4gaW1wcm92ZWQgdG8gYWxsb3cgdGhlbSB0byBleHRlbmQgb3RoZXIgcHJlc2V0cy4gQSBzdGF0aWMKLXByZXNldCBjYW4gZXZlbiBleHRlbmQgYSBkeW5hbWljIHByZXNldC48L3A+Ci0KLTxwPlRoZXJlIGlzIGFsc28gYSBuZXcgcHJlc2V0IHRoYXQncyBwYXJ0IG9mIHRoZSBmcmFtZXdvcmsuIEl0J3MgYSBkeW5hbWljIHByZXNldCB3aXRoIGlkIG9mIAotImRlZmF1bHQuY29uZmlndXJhdGlvbiIgYW5kIHdob3NlIGNvbnRlbnRzIGFyZSBzeW50aGVzaXplZCBhcyBmb2xsb3dzOjwvcD4KLQotPG9sPgotICA8bGk+SWYgYSBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHByZXNldCB3aWxsIGNvbnRhaW4gZGVmYXVsdCBmYWNldHMgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgSVJ1bnRpbWUuZ2V0RGVmYXVsdEZhY2V0cyhTZXQpLjwvbGk+Ci0gIDxsaT5JZiBubyBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHByZXNldCB3aWxsIGNvbnRhaW4gZGVmYXVsdCB2ZXJzaW9ucyBmb3IgYWxsIG9mIHRoZSBmaXhlZAotICAgIGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkgSVByb2plY3RGYWNldC5nZXREZWZhdWx0VmVyc2lvbigpLjwvbGk+Ci08L29sPiAgIAotCi08cD48dT5OZXcgRXh0ZW5zaW9uIFBvaW50PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLSZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMiJmd0OwotICAmbHQ7c3RhdGljLXByZXNldCBpZD0iPGk+e3N0cmluZ308L2k+IiBleHRlbmRzPSI8aT57c3RyaW5nfTwvaT4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2xhYmVsJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2Rlc2NyaXB0aW9uJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtmYWNldCBpZD0iPGk+e3N0cmluZ308L2k+IiB2ZXJzaW9uPSI8aT57c3RyaW5nfTwvaT4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICZsdDsvc3RhdGljLXByZXNldCZndDsgPGk+KDAgb3IgbW9yZSk8L2k+Ci0gICZsdDtkeW5hbWljLXByZXNldCBpZD0iPGk+e3N0cmluZ308L2k+IiZndDsKLSAgICAmbHQ7ZmFjdG9yeSBjbGFzcz0iPGk+e2NsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXRGYWN0b3J5fTwvaT4iLyZndDsKLSAgJmx0Oy9keW5hbWljLXByZXNldCZndDsgPGk+KDAgb3IgbW9yZSk8L2k+Ci0mbHQ7ZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0ZGRjFDMSI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7PC9mb250PgotICAmbHQ7cHJlc2V0IGlkPSI8aT57c3RyaW5nfTwvaT4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2xhYmVsJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8aT57c3RyaW5nfTwvaT4mbHQ7L2Rlc2NyaXB0aW9uJmd0OyA8aT4ob3B0aW9uYWwpPC9pPgotICAgICZsdDtmYWNldCBpZD0iPGk+e3N0cmluZ308L2k+IiB2ZXJzaW9uPSI8aT57c3RyaW5nfTwvaT4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICZsdDsvcHJlc2V0Jmd0OyA8aT4oMCBvciBtb3JlKTwvaT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkphdmEgQVBJIEFkZGl0aW9uczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+aW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQKLXs8L2ZvbnQ+Ci0gICAgZW51bSBUeXBlIHsgU1RBVElDLCBEWU5BTUlDLCBVU0VSX0RFRklORUQgfQotICAgIFR5cGUgZ2V0VHlwZSgpOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLWludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRHluYW1pY1ByZXNldCBleHRlbmRzIElQcmVzZXQKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX0ZJWEVEX0ZBQ0VUUzsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX1BSSU1BUllfUlVOVElNRTsKLSAgICBJUHJlc2V0IHJlc29sdmUoIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICk7Ci19Ci0KLWludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0RmFjdG9yeQotewotICAgIFByZXNldERlZmluaXRpb24gY3JlYXRlUHJlc2V0KCBTdHJpbmcgcHJlc2V0SWQsIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICk7Ci19Ci0KLWNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByZXNldERlZmluaXRpb24KLXsKLSAgICBQcmVzZXREZWZpbml0aW9uKCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKTsKLSAgICBTdHJpbmcgZ2V0TGFiZWwoKTsKLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKTsKLX0KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrCi17PC9mb250PgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05GSUdVUkFUSU9OX1BSRVNFVF9JRDsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSNGRkYxQzE+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPmludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0Ci17PC9mb250PgotICAgIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCgpCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjY29tcGFyYWJsZSI+My4gSVByb2plY3RGYWNldFZlcnNpb24gYW5kIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBFeHRlbmQgQ29tcGFyYWJsZTwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFuZCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gaW50ZXJmYWNlcyBub3cgZXh0ZW5kCi1Db21wYXJhYmxlLiBVc2luZyB0aGUgY29tcGFyZVRvIG1ldGhvZHMgd2lsbCB5aWVsZCBzaWduaWZpY2FudGx5IGJldHRlciBwZXJmb3JtYW5jZQotdGhhbiBjYWxsaW5nIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3IgZGlyZWN0bHkgb24gdGhlIHZlcnNpb24gc3RyaW5ncyBhcyB0aGUgCi1jb21wYXJlVG8gbWV0aG9kcyB1c2UgcHJlLWNvbXB1dGVkIHJlc3VsdHMgYW5kIGRvIG5vdCBuZWVkIHRvIHBhcnNlIHRoZSB2ZXJzaW9uCi1zdHJpbmdzLjwvcD4KLQotPHA+QXMgcGFydCBvZiB0aGlzIGNoYW5nZSwgSVZlcnNpb25FeHByLmV2YWx1YXRlKCBTdHJpbmcgKSBtZXRob2QgaGFzIGJlZW4KLXJlcGxhY2VkIHdpdGggSVZlcnNpb25FeHByLmNoZWNrKCBDb21wYXJhYmxlICkgbWV0aG9kLjwvcD4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IiNyZXF1aXJlcy1ncm91cCI+NC4gUmVxdWlyZXMgQ29uc3RyYWludCBTdXBwb3J0cyBHcm91cHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSByZXF1aXJlcyBjb25zdHJhaW50IGNhbiBub3cgYmUgZGVjbGFyZWQgdXNpbmcgZmFjZXQgZ3JvdXBzIGluc3RlYWQgb2YKLWluZGl2aWR1YWwgZmFjZXRzLiBBbnkgbWVtYmVyIG9mIHRoZSBncm91cCB3aWxsIHNhdGlzZnkgdGhlIGNvbnN0cmFpbnQuIFRoaXMKLWFsbG93cyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIHNvIHRoYXQgYSBmYWNldCBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgYWxsIG9mCi10aGUgZ3JvdXAgbWVtYmVycy48L3A+Ci0KLTxwPjx1PkV4dGVuc2lvbiBQb2ludCBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OwotICAgICZsdDtjb25zdHJhaW50Jmd0OzwvZm9udD4KLSAgICAgICZsdDtyZXF1aXJlcyBncm91cD0iZ3JvdXAuaWQiLyZndDsKLSAgICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0Oy9jb25zdHJhaW50Jmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDsKLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Imdyb3VwLWxhYmVscyI+NS4gTGFiZWxzIGFuZCBEZXNjcmlwdGlvbnMgZm9yIEdyb3VwczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+SXQgaXMgbm93IHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBsYWJlbHMgYW5kIGRlc2NyaXB0aW9uIHdpdGggZ3JvdXBzLiBOb3RlIHRoYXQKLWdyb3VwcyBhcmUgc3RpbGwgYXV0b21hdGljYWxseSBjcmVhdGVkIG9uIGZpcnN0IHVzZSwgc28gdGhlIHVzZSBvZiB0aGUgbmV3IGdyb3VwCi1lbGVtZW50IGlzIG9ubHkgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHNwZWNpZnkgdGhlIGxhYmVsIGFuZCB0aGUgZGVzY3JpcHRpb24uPC9wPgotICAgCi08cD48dT5FeHRlbnNpb24gUG9pbnRzIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7PC9mb250PgotICAmbHQ7Z3JvdXAgaWQ9Ii4uLiImZ3Q7IDxpPigwIG9yIG1vcmUpPC9pPgotICAgICZsdDtsYWJlbCZndDsuLi4mbHQvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Oy4uLiZsdC9kZXNjcmlwdGlvbiZndDsgPGk+KDAgb3IgMSk8L2k+Ci0gICZsdC9ncm91cCZndDsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkphdmEgQVBJIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cAotezwvZm9udD4KLSAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ2YWxpZGF0ZSI+Ni4gTmV3IElGYWNldGVkUHJvamVjdCBWYWxpZGF0aW9uIEFQSTwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlcmUgaXMgbm93IEFQSSBmb3IgdmFsaWRhdGluZyB0aGUgZmFjZXRlZCBwcm9qZWN0LiBJdCBhbGxvd3MgdGhlIGNhbGxlciB0bwotZmluZCBvdXQgYWJvdXQgYW55IHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgd2l0aG91dCBzZWFyY2hpbmcgZm9yIHByb2JsZW0KLW1hcmtlcnMgY3JlYXRlZCBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IHZhbGlkYXRpb24gYnVpbGRlci4gVGhlIHZhbGlkYXRpb24KLWJ1aWxkZXIgbm93IHVzZXMgdGhlIG5ldyBBUEkuPC9wPgotCi08cD48dT5KYXZhIEFQSSBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QKLXs8L2ZvbnQ+Ci0gICBJU3RhdHVzIHZhbGlkYXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Im5ldy13aXphcmQtY2xhc3MiPjcuIEFkZFJlbW92ZUZhY2V0c1dpemFyZCBDbGFzcyBSZW5hbWVkIHRvIE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGUgQWRkUmVtb3ZlRmFjZXRzV2l6YXJkIGNsYXNzIGhhcyBiZWVuIHJlbmFtZWQgdG8gTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQKLXRvIGFsaWduIHdpdGggdGVybWlub2xvZ3kgY2hhbmdlIGJlaW5nIG1hZGUgaW4gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gVGhlIG9sZAotY2xhc3MgaXMgZGVwcmVjYXRlZCwgYnV0IHN0aWxsIHN1cHBvcnRlZCAoZXh0ZW5kcyB0aGUgbmV3IGNsYXNzKS48L3A+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJwZGUtbGltaXRhdGlvbnMiPjguIEV4dGVuc2lvbiBQb2ludCBTY2hlbWEgQ2hhbmdlcyB0byBXb3JrIEFyb3VuZCBQREUgTGltaXRhdGlvbnM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIGZhbHNlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFBERSdzIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgdmFsaWRhdGlvbiwgdGhlCi1mb2xsb3dpbmcgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgZnJhbWV3b3JrJ3MgZXh0ZW5zaW9uIHBvaW50cy4gVGhlIG9sZCBzeW50YXggaXMgZGVwcmVjYXRlZCwKLWJ1dCBpcyBzdGlsbCBzdXBwb3J0ZWQuPC9wPgotCi08cD5XaGVuIGRlY2xhcmluZyB0aGF0IGEgZmFjZXQgYmVsb25ncyB0byBhIGNhdGVnb3J5Li4uPC9wPgotCi08cD48dT5PbGQgU3ludGF4PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldCZndDs8L2ZvbnQ+Ci0gICAgJmx0O2NhdGVnb3J5Jmd0Oy4uLiZsdC9jYXRlZ29yeSZndDsKLSAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdC9wcm9qZWN0LWZhY2V0Jmd0OwotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5OZXcgU3ludGF4PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldCZndDs8L2ZvbnQ+Ci0gICAgJmx0O21lbWJlciBjYXRlZ29yeT0iLi4uIi8mZ3Q7Ci0gIDxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQvcHJvamVjdC1mYWNldCZndDsKLSZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Imxpc3RlbmVycyI+OS4gTGlzdGVuZXJzIGFuZCBFdmVudHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSBleGlzdGluZyBmYWNpbGl0aWVzIGZvciBsaXN0ZW5pbmcgb24gZmFjZXRlZCBwcm9qZWN0IG1vZGVsIGNoYW5nZXMgaGF2ZSBiZWVuIHJlLWRlc2lnbmVkIHRvCi1wcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZSB0aGF0IHRvb2sgcGxhY2UgYW5kIHRvIHByb3ZpZGUgdGhlIHNhbWUgZmFjaWxpdHkKLXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY2xpZW50IGNob29zZXMgdG8gcmVnaXN0ZXIgdGhlIGxpc3RlbmVyIHZpYSBkaXJlY3QgQVBJIGNhbGwgb3IgdmlhIGFuCi1leHRlbnNpb24gcG9pbnQuPC9wPgotCi08cD5JbiAxLjUsIGV4dGVuZGVycyBjb3VsZCBlaXRoZXI6PC9wPgotCi08b2w+Ci0gIAotICA8bGk+VXNlIDxjb2RlPklGYWNldGVkUHJvamVjdC5hZGRMaXN0ZW5lcigpPC9jb2RlPiBtZXRob2QuIExpc3RlbmVyIHdvdWxkIGdldCBjYWxsZWQgd2hlbiBhbnkKLSAgYXNwZWN0IG9mIGZhY2V0ZWQgcHJvamVjdCBtb2RlbCB3YXMgY2hhbmdlZCwgYnV0IHRoZSBsaXN0ZW5lciB3YXMgbm90IGdpdmVuIGFueSBkZXRhaWxzIGFib3V0Ci0gIHRoZSBjaGFuZ2UgdGhhdCB0b29rIHBsYWNlLjxici8+PGJyLz48L2xpPgotICAKLSAgPGxpPlVzZSA8Y29kZT4mbHQ7ZXZlbnQtaGFuZGxlciZndDs8L2NvZGU+IGVsZW1lbnQgb2YgdGhlIAotICA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBhbgotICA8Y29kZT5JRGVsZWdhdGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHNpbWlsYXIgdG8gaG93IGFjdGlvbnMgYXJlIGltcGxlbWVudGVkLiBUaGlzIAotICBhcHByb2FjaCBnYXZlIHVzZXIgYSBiaXQgbW9yZSBjb250cm9sIG92ZXIgd2hhdCBldmVudHMgdG8gcHJvY2VzcyBhcyB3ZWxsIGFzIG1vcmUgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIHdoYXQgYWN0dWFsbHkgdG9vayBwbGFjZS4gSG93ZXZlciwgbm90IGFsbCBjaGFuZ2VzIGNvdWxkIGJlIHN1cmZhY2VkIHZpYSB0aGlzIAotICBpbnRlcmZhY2UgZHVlIHRvIGxpbWl0YXRpb25zIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgYW5kIHRoZSA8Y29kZT5JRGVsZWdhdGU8L2NvZGU+IGludGVyZmFjZS48L2xpPgotICAKLTwvb2w+Ci0KLTxwPkZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGUgbmV3IGZhY2lsaXR5IGNhbiBiZSBmb3VuZCA8YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCI+aGVyZTwvYT4uPC9wPgotICAgCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyCi17Ci0gICAgdm9pZCBoYW5kbGVFdmVudCggSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgZW51bSBUeXBlCi0gICAgewotICAgICAgICBQUk9KRUNUX01PRElGSUVELAotICAgICAgICBQUkVfSU5TVEFMTCwKLSAgICAgICAgUE9TVF9JTlNUQUxMLAotICAgICAgICBQUkVfVU5JTlNUQUxMLAotICAgICAgICBQT1NUX1VOSU5TVEFMTCwKLSAgICAgICAgUFJFX1ZFUlNJT05fQ0hBTkdFLAotICAgICAgICBQT1NUX1ZFUlNJT05fQ0hBTkdFLAotICAgICAgICBGSVhFRF9GQUNFVFNfQ0hBTkdFRCwKLSAgICAgICAgVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCwKLSAgICAgICAgUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQKLSAgICB9Ci0gICAgCi0gICAgVHlwZSBnZXRUeXBlKCk7Ci0gICAgSUZhY2V0ZWRQcm9qZWN0IGdldFByb2plY3QoKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGaXhlZEZhY2V0c0NoYW5nZWRFdmVudCA6IElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgU2V0Jmx0O0lQcm9qZWN0RmFjZXQmZ3Q7IGdldE9sZEZpeGVkRmFjZXRzKCk7Ci0gICAgU2V0Jmx0O0lQcm9qZWN0RmFjZXQmZ3Q7IGdldE5ld0ZpeGVkRmFjZXRzKCk7Ci19Ci0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgOiBJRmFjZXRlZFByb2plY3RFdmVudAotewotICAgIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgIE9iamVjdCBnZXRBY3Rpb25Db25maWcoKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudCA6IElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgSVJ1bnRpbWUgZ2V0T2xkUHJpbWFyeVJ1bnRpbWUoKTsKLSAgICBJUnVudGltZSBnZXROZXdQcmltYXJ5UnVudGltZSgpOwotfQotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQgOiBJRmFjZXRlZFByb2plY3RFdmVudAotewotICAgIFNldCZsdDtJUnVudGltZSZndDsgZ2V0T2xkVGFyZ2V0ZWRSdW50aW1lcygpOwotICAgIFNldCZsdDtJUnVudGltZSZndDsgZ2V0TmV3VGFyZ2V0ZWRSdW50aW1lcygpOwotfQotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ci17PC9mb250PgotICAgIHZvaWQgYWRkTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiApOwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciApOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yawotezwvZm9udD4KLSAgICB2b2lkIGFkZExpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gKTsKLSAgICB2b2lkIHJlbW92ZUxpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+TmV3IEV4dGVuc2lvbiBQb2ludDwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnMiJmd0OwotICAmbHQ7bGlzdGVuZXIgCi0gICAgY2xhc3M9IntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9IgotICAgIGV2ZW50VHlwZXM9Intjc3Y6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50LlR5cGV9Ii8+IDxpPigxIG9yIG1vcmUpPC9pPgotJmx0O2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkRlcHJlY2F0ZWQgSmF2YSBBUEk8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0jRkZGMUMxPgotPHByZT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyCi17Ci0gICAgcHJvamVjdENoYW5nZWQoKTsKLX0KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdAotezwvZm9udD4KLSAgICB2b2lkIGFkZExpc3RlbmVyKCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciApOwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyICk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVJ1bnRpbWVDaGFuZ2VkRXZlbnQKLXsKLSAgICBJUnVudGltZSBnZXRPbGRSdW50aW1lKCk7Ci0gICAgSVJ1bnRpbWUgZ2V0TmV3UnVudGltZSgpOwotfQotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0ZGRjFDMSI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7PC9mb250PgotICAmbHQ7ZXZlbnQtaGFuZGxlciB0eXBlPSJ7c3RyaW5nfSIgZmFjZXQ9IntzdHJpbmd9IiB2ZXJzaW9uPSJ7c3RyaW5nfSImZ3Q7Ci0gICAgJmx0O2RlbGVnYXRlIGNsYXNzPSJ7Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlfSIvJmd0OwotICAmbHQvZXZlbnQtaGFuZGxlciZndDsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJtaXNjIj4xMC4gTWlzY2VsbGFuZW91czwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QKLXs8L2ZvbnQ+Ci0gICAgYm9vbGVhbiBpc1RhcmdldGFibGUoIElSdW50aW1lIHJ1bnRpbWUgKTsKLSAgICBib29sZWFuIGlzVGFyZ2V0ZWQoIElSdW50aW1lIHJ1bnRpbWUgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlZmNjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lID0gRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBBUEkgRG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwYzA0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLQkJPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIj4KLQkJPC90b2M+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvdG9jLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExNjIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBEZXZlbG9wZXIgR3VpZGUiIHRvcGljPSJjb250ZW50L2Rlc2NyaXB0aW9uLmh0bWwiPgotICAgIDx0b3BpYyBsYWJlbD0iVHV0b3JpYWwiCi0gICAgICAgaHJlZj0iY29udGVudC90dXRvcmlhbC90dXRvcmlhbC5odG1sIj4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBsYWJlbD0iTGlzdGVuaW5nIGZvciBDaGFuZ2VzIHRvIEZhY2V0ZWQgUHJvamVjdHMiCi0gICAgICAgaHJlZj0iY29udGVudC9saXN0ZW5lcnMuaHRtbCI+Ci0gICAgPC90b3BpYz4JICAgIAotICAgIDx0b3BpYyBsYWJlbD0iRW5hYmxpbmcgVUkgRWxlbWVudHMgQmFzZWQgb24gUHJvamVjdCBGYWNldHMiCi0gICAgICAgaHJlZj0iY29udGVudC9lbmFibGluZy1iYXNlZC1vbi1mYWNldHMuaHRtbCI+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgbGFiZWw9IlF1ZXN0aW9ucyAmYW1wOyBBbnN3ZXJzIgotICAgICAgIGhyZWY9ImNvbnRlbnQvcXVlc3Rpb25zLmh0bWwiPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSJOZXcgZm9yIDEuNSIKLSAgICAgICBocmVmPSJjb250ZW50L3doYXRzbmV3MTUwLmh0bWwiPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSJOZXcgZm9yIDEuNS4xIgotICAgICAgIGhyZWY9ImNvbnRlbnQvd2hhdHNuZXcxNTEuaHRtbCI+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgbGFiZWw9Ik5ldyBmb3IgMi4wIgotICAgICAgIGhyZWY9ImNvbnRlbnQvd2hhdHNuZXcyMC5odG1sIj4KLSAgICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmU4MjA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWphdmFDb21waWxlci50ZXN0cy5qYXIuYXJncwotYnVpbGQueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ4MGZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTVmMWMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBGZWIgMDIgMTY6NTE6MzkgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhMTY5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lOiBGYWNldCBDb3JlIFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMy4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjIsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Ci1CdW5kbGUtQ2xhc3NQYXRoOiB0ZXN0cy5qYXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzNiZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTAyYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IHRlc3RzLmphcgotc291cmNlLnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODgzMzA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMKLUJ1bmRsZS1OYW1lLjAgPSBGYWNldCBDb3JlIFRlc3RzIFBsdWctaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiYTVjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci0KLTxwbHVnaW4+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgIAotICAgIDxjYXRlZ29yeSBpZD0iY2F0MSI+Ci0gICAgICA8bGFiZWw+Q2F0ZWdvcnkgMTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgY2F0ZWdvcnkgZGVzY3JpcHRpb24uPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5PgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhY2V0MSI+Ci0gICAgICA8bGFiZWw+RmFjZXQgMTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgZmFjZXQxLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iaW5zdGFsbCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiB0eXBlPSJ1bmluc3RhbGwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiB0eXBlPSJ2ZXJzaW9uLWNoYW5nZSI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iaW5zdGFsbCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiB0eXBlPSJ1bmluc3RhbGwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiB0eXBlPSJ2ZXJzaW9uLWNoYW5nZSI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMyIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0KLSAgICA8YWN0aW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjIuMS0yLjBdIiB0eXBlPSJpbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8YWN0aW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjIuMS0yLjBdIiB0eXBlPSJ1bmluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MVVuaW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgCi0gICAgPGFjdGlvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4yLjEtMi4wXSIgdHlwZT0idmVyc2lvbi1jaGFuZ2UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYWNldDIiPgotICAgICAgPHZlcnNpb24tY29tcGFyYXRvciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5DdXN0b21WZXJzaW9uQ29tcGFyYXRvciIvPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0iY2F0MSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDIiIHZlcnNpb249IjMuNSI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMCIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MiIgdmVyc2lvbj0iMy41I2EiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjItMS4zKSIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDIiIHZlcnNpb249IjQuNyI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPG9yPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgIDwvb3I+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQyIiB2ZXJzaW9uPSI0LjcjYiI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPG9yPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjMiLz4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgICAgIDwvb3I+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MiIgdmVyc2lvbj0iNC43I2MiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPG9yPgotICAgICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgICAgICAgPC9vcj4KLSAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJmYWNldDNhIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0iZmFjZXQzYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0iZ3JvdXAxIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0iZ3JvdXAxIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhY2V0MmV4dCI+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJjYXQxIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MmV4dCIgdmVyc2lvbj0iMS4wIi8+Ci0KLSAgICA8Y2F0ZWdvcnkgaWQ9ImNhdDIiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmFjZXQzYSI+IDwhLS0gVGVzdHMgYSBmYWNldCB3aXRoIG5vIGRlc2NyaXB0aW9uLiAtLT4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9ImNhdDIiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQzYSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQzYSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgCi0gICAgPGFjdGlvbiBmYWNldD0iZmFjZXQzYSIgdmVyc2lvbj0iWzEuMC0yLjBdIiB0eXBlPSJpbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDNhSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgICA8YWN0aW9uIGZhY2V0PSJmYWNldDNhIiB2ZXJzaW9uPSJbMS4wLTIuMF0iIHR5cGU9InVuaW5zdGFsbCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQzYVVuaW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgCi0gICAgPGFjdGlvbiBmYWNldD0iZmFjZXQzYSIgdmVyc2lvbj0iWzEuMC0yLjBdIiB0eXBlPSJ2ZXJzaW9uLWNoYW5nZSI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQzYVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhY2V0M2IiPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0iY2F0MiIvPgotICAgICAgPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IDwhLS0gVGVzdHMgYSBmYWNldCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0aW9uLiAtLT4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQzYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQzYiIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhY2V0M2MiPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0iY2F0MiIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDNjIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0iZ3JvdXAxIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDNjIiB2ZXJzaW9uPSIyLjAiPgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0iZ3JvdXAxIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8IS0tIFByZXNldHNUZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMiPgotICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfcHJlc2V0MSI+Ci0gICAgICA8bGFiZWw+UHJlc2V0IDE8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZmlyc3QgcHJlc2V0LjwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MiIgdmVyc2lvbj0iMy41I2EiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQyZXh0IiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfcHJlc2V0MiI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0M2EiIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDNiIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQzYyIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotICAgIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9wcmVzZXQzIiBleHRlbmRzPSJwdF9wcmVzZXQxIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQzYSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4gIDwhLS0gVGVzdHMgdGhhdCB0aGUgdmVyc2lvbiBpbiBkZXJpdmVkIHByZXNldCB3aW5zLiAtLT4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+ICAgICAgCi0KLSAgICA8ZHluYW1pYy1wcmVzZXQgaWQ9InB0X2R5bl9wcmVzZXQiPgotICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLlByZXNldHNUZXN0cyRQcmVzZXRGYWN0b3J5Ii8+Ci0gICAgPC9keW5hbWljLXByZXNldD4gICAgICAKLQotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzEiIGV4dGVuZHM9InB0X2R5bl9wcmVzZXQiPgotICAgICAgPGxhYmVsPlN0YXRpYyBFeHRlbmRpbmcgRHluYW1pYyBQcmVzZXQ8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIHN0YXRpYy1keW5hbWljIGRlc2NyaXB0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MiIgdmVyc2lvbj0iMy41I2EiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQzYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMiIgZXh0ZW5kcz0icHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8xIj4KLSAgICAgIDxsYWJlbD5TdGF0aWMgRXh0ZW5kaW5nIER5bmFtaWMgUHJlc2V0IDI8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIHN0YXRpYy1keW5hbWljIGRlc2NyaXB0aW9uIDIuPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDNhIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8IS0tIFJlZmVyZW5jZXMgZmFjZXQgdGhhdCBkb2Vzbid0IGV4aXN0LiAtLT4KLSAgICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfYmFkLnByZXNldDEiPgotICAgICAgPGZhY2V0IGlkPSJhYmMiIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDwhLS0gUmVmZXJlbmNlcyBmYWNldCB2ZXJzaW9uIHRoYXQgZG9lc24ndCBleGlzdC4gLS0+Ci0gICAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2JhZC5wcmVzZXQyIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQyIiB2ZXJzaW9uPSI5OS45OCIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDwhLS0gUmVmZXJlbmNlcyBiYXNlIHByZXNldCB0aGF0IGRvZXNuJ3QgZXhpc3QuIC0tPgotICAgIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9iYWQucHJlc2V0MyIgZXh0ZW5kcz0iZG9lcy5ub3QuZXhpc3QiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDIiIHZlcnNpb249IjMuNSNhIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotICAgIAotICAgIDwhLS0gVGhlIGZvbGxvd2luZyBmb3VyIHByZXNldHMgZm9ybSBhIGN5Y2xlLiAtLT4KLSAgICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfY3ljbGVfcHJlc2V0MSIgZXh0ZW5kcz0icHRfY3ljbGVfcHJlc2V0MyI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0gICAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2N5Y2xlX3ByZXNldDIiIGV4dGVuZHM9InB0X2N5Y2xlX3ByZXNldDEiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2N5Y2xlX3ByZXNldDMiIGV4dGVuZHM9InB0X2N5Y2xlX3ByZXNldDIiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2N5Y2xlX3ByZXNldDQiIGV4dGVuZHM9InB0X2N5Y2xlX3ByZXNldDMiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotICAgIAotICA8L2V4dGVuc2lvbj4gIAotCi0gIDwhLS0gRmFjZXQgQ29uc3RyYWludCBUZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjEiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjEiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0iZmN0X2YyIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mMiIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mMiIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJmY3RfZjQiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mMyIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mMyIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZjdF9mMiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2Y0Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y0IiB2ZXJzaW9uPSIxLjAiPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2Y1Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y1IiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmN0X2YyIiB2ZXJzaW9uPSIxLjAiIHNvZnQ9InRydWUiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjYiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iMi4zIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSIzLjciLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249IjQuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iNC41Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mNyIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNyIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZjdF9mNiIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjciIHZlcnNpb249IjIuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249Ils1LjAtNi41KSIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mOCIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mOCIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9ImZjdF9nMSIvPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgICAgICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y4IiB2ZXJzaW9uPSIyLjAiPgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0iZmN0X2cxIi8+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjgiIHZlcnNpb249IjMuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2Y5Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y5IiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0iZmN0X2cxIi8+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2YxMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2YxMCIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZ3JvdXA9ImZjdF9nMSIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjEwIiB2ZXJzaW9uPSIyLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBncm91cD0iZmN0X2cxIiBzb2Z0PSJ0cnVlIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8Z3JvdXAgaWQ9ImZjdF9nMSI+Ci0gICAgICA8bGFiZWw+RkNUIEdyb3VwIDE8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9ncm91cD4KLQotICA8L2V4dGVuc2lvbj4KLQotICA8IS0tIERlZmF1bHQgVmVyc2lvbiBUZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjEiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjEiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YxIiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjEiIHZlcnNpb249IjQuMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mMiI+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjIuMCIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjIiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMiIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YyIiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjIiIHZlcnNpb249IjQuMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mMyI+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5EZWZhdWx0VmVyc2lvblRlc3RzJEZhY2V0RHZ0RjNEZWZhdWx0VmVyc2lvblByb3ZpZGVyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMyIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YzIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjMiIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMyIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2Y0Ij4KLSAgICAgIDxkZWZhdWx0LXZlcnNpb24gcHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkRlZmF1bHRWZXJzaW9uVGVzdHMkRmFjZXREdnRGM0RlZmF1bHRWZXJzaW9uUHJvdmlkZXIiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y0IiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjQiIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNCIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y0IiB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjUiPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRGVmYXVsdFZlcnNpb25UZXN0cyRGYWNldER2dEY1RGVmYXVsdFZlcnNpb25Qcm92aWRlciIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjUiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y1IiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjUiIHZlcnNpb249IjQuMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mNiI+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5EZWZhdWx0VmVyc2lvblRlc3RzJEZhY2V0RHZ0RjZEZWZhdWx0VmVyc2lvblByb3ZpZGVyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y2IiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjYiIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNiIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2Y3Ij4KLSAgICAgIDxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iNS4wIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNyIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y3IiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjciIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNyIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgPC9leHRlbnNpb24+Ci0KLSAgPCEtLSBGYWNldEFjdGlvbkV4ZWN1dGlvblRlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhdF9mMSIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhdF9mMSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRmFjZXRBY3Rpb25zVGVzdHMkRjF2MUluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmF0X2YxIiB2ZXJzaW9uPSIyLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5GYWNldEFjdGlvbnNUZXN0cyRGMXYySW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgPC9leHRlbnNpb24+Ci0gIAotICA8IS0tIFVJIFRlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9InVpX2xvbmdfbGFiZWwxIj4KLSAgICAgIDxsYWJlbD5UaGlzIGZhY2V0IGhhcyBhIHJlYWxseSByZWFsbHkgcmF0aGVyIGxvbmcgbGFiZWw8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPkFuZCBhIHNob3J0IGRlc2NyaXB0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PiAKLSAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0idWlfbG9uZ19sYWJlbDEiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxjYXRlZ29yeSBpZD0idWlfbG9uZ19sYWJlbF9jYXRlZ29yeSI+Ci0gICAgICA8bGFiZWw+Q2F0ZWdvcnkgZm9yIGZhY2V0cyB3aXRoIGxvbmcgbGFiZWxzPC9sYWJlbD4KLSAgICA8L2NhdGVnb3J5PgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9InVpX2xvbmdfbGFiZWwyIj4KLSAgICAgIDxsYWJlbD5UaGlzIGZhY2V0IGhhcyBhIHJlYWxseSByZWFsbHkgcmF0aGVyIGxvbmcgbGFiZWw8L2xhYmVsPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0idWlfbG9uZ19sYWJlbF9jYXRlZ29yeSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4gCi0gIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InVpX2xvbmdfbGFiZWwyIiB2ZXJzaW9uPSIxLjIuMy40LjUuNi43LjguOSI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InVpX2xvbmdfbGFiZWwyIiB2ZXJzaW9uPSI5LjguNy42LjUuNC4zLjIuMSI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgPC9leHRlbnNpb24+Ci0gIAotICA8IS0tIEV2ZW50RGVsaXZlcnlUZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJlZHRfZjEiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjEiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mMSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YxIiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjEiIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YxIiB0eXBlPSJWRVJTSU9OX0NIQU5HRSI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZWR0X2YyIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2YyIiB2ZXJzaW9uPSIxLjEiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjIiIHZlcnNpb249IjIuMSIvPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMiIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YyIiB0eXBlPSJVTklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMiIgdHlwZT0iVkVSU0lPTl9DSEFOR0UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJlZHRfZjMiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjMiIHZlcnNpb249IjEuMiIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mMyIgdmVyc2lvbj0iMi4yIi8+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YzIiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjMiIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YzIiB0eXBlPSJWRVJTSU9OX0NIQU5HRSI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZWR0X2Y0Ii8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2Y0IiB2ZXJzaW9uPSIxLjMiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjQiIHZlcnNpb249IjIuMyIvPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mNCIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2Y0IiB0eXBlPSJVTklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mNCIgdHlwZT0iVkVSU0lPTl9DSEFOR0UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVycyI+Ci0gICAgPGxpc3RlbmVyIAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkV2ZW50RGVsaXZlcnlUZXN0cyRGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lciIvPgotICAgIDxsaXN0ZW5lciAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5FdmVudERlbGl2ZXJ5VGVzdHMkUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIiCi0gICAgICBldmVudFR5cGVzPSJQUkVfSU5TVEFMTCxGSVhFRF9GQUNFVFNfQ0hBTkdFRCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8IS0tIFByb2plY3RDcmVhdGlvblRlc3RzIC0tPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9InBjdC1mMSIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InBjdC1mMSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPGFjdGlvbiBmYWNldD0icGN0LWYxIiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJwY3QtZjIiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJwY3QtZjIiIHZlcnNpb249IjEuMCIvPgotICAgIDxhY3Rpb24gZmFjZXQ9InBjdC1mMiIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgPC9leHRlbnNpb24+Ci0gIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9yZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9yZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2IwMzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLm5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9yZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYzUyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9yZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmYWNldGVkLXByb2plY3Q+Ci0gIDxpbnN0YWxsZWQgZmFjZXQ9ImVkdF9mMSIgdmVyc2lvbj0iMS4wIi8+Ci0gIDxpbnN0YWxsZWQgZmFjZXQ9ImVkdF9mMiIgdmVyc2lvbj0iMS4xIi8+Ci08L2ZhY2V0ZWQtcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9BYnN0cmFjdFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQWJzdHJhY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzk3MDNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9BYnN0cmFjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RFU1RfUFJPSkVDVF9OQU1FID0gInRlc3RQcm9qZWN0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxJUmVzb3VyY2U+IHJlc291cmNlc1RvQ2xlYW51cCA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdDxSdW5uYWJsZT4gdGVhckRvd25PcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKQotICAgICAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmb3IoIElSZXNvdXJjZSByIDogdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFJ1bm5hYmxlIHJ1bm5hYmxlIDogdGhpcy50ZWFyRG93bk9wZXJhdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRSZXNvdXJjZVRvQ2xlYW51cCggZmluYWwgSVJlc291cmNlIHJlc291cmNlICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcmVzb3VyY2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkVGVhckRvd25PcGVyYXRpb24oIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlICkKLSAgICB7Ci0gICAgICAgIHRoaXMudGVhckRvd25PcGVyYXRpb25zLmFkZCggcnVubmFibGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIElGYWNldGVkUHJvamVjdCBjcmVhdGVGYWNldGVkUHJvamVjdCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCBERUZBVUxUX1RFU1RfUFJPSkVDVF9OQU1FICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJRmFjZXRlZFByb2plY3QgY3JlYXRlRmFjZXRlZFByb2plY3QoIGZpbmFsIFN0cmluZyBuYW1lICkKLQotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggbmFtZSApLmV4aXN0cygpICk7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIG5hbWUsIG51bGwsIG51bGwgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcGogPSBmcGouZ2V0UHJvamVjdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCBwai5leGlzdHMoKSApOwotICAgICAgICBhZGRSZXNvdXJjZVRvQ2xlYW51cCggcGogKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmcGo7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMTViNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEFsbFRlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJBbGwgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBUZXN0cyIgKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEJhc2ljVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBQcmVzZXRzVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBQcm9qZWN0Q3JlYXRpb25UZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEJhc2ljRmFjZXRBY3Rpb25UZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEZhY2V0QWN0aW9uU29ydFRlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggRmFjZXRBY3Rpb25zVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBQcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEZhY2V0Q29uc3RyYWludHNUZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIERlZmF1bHRWZXJzaW9uVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBFdmVudERlbGl2ZXJ5VGVzdHMuc3VpdGUoKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Jhc2ljRmFjZXRBY3Rpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Jhc2ljRmFjZXRBY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNlNjQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9CYXNpY0ZhY2V0QWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUX05BTUUgPSAidGVzdFByb2plY3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbGUgZmFjZXQxQXJ0aWZhY3RGaWxlCi0gICAgICAgID0gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoIFRFU1RfUFJPSkVDVF9OQU1FICkuZ2V0RmlsZSggImZhY2V0MS50eHQiICk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjA7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MSIgKTsKLSAgICAgICAgICAgIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYxdjEyID0gZjEuZ2V0VmVyc2lvbiggIjEuMiIgKTsKLSAgICAgICAgICAgIGYxdjEyMSA9IGYxLmdldFZlcnNpb24oICIxLjIuMSIgKTsKLSAgICAgICAgICAgIGYxdjEzID0gZjEuZ2V0VmVyc2lvbiggIjEuMyIgKTsKLSAgICAgICAgICAgIGYxdjIwID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgZmFpbHVyZXMuIFRoaXMgYXBpIGlzIHRlc3RlZCBleHBsaWNpdGx5LgotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGZwajsKLSAgICAKLSAgICBwcml2YXRlIEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJCYXNpYyBGYWNldCBBY3Rpb24gVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldEluc3RhbGwxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRJbnN0YWxsMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0SW5zdGFsbDMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldFVuaW5zdGFsbDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldFVuaW5zdGFsbDIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldFVuaW5zdGFsbDMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldFZlcnNpb25DaGFuZ2UxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRWZXJzaW9uQ2hhbmdlMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEFjdGlvblNlcmllcyIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBURVNUX1BST0pFQ1RfTkFNRSApLmV4aXN0cygpICk7Ci0gICAgICAgIHRoaXMuZnBqID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBURVNUX1BST0pFQ1RfTkFNRSwgbnVsbCwgbnVsbCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcGouZ2V0UHJvamVjdCgpLmV4aXN0cygpICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5nZXRQcm9qZWN0KCkuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldEluc3RhbGwxKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMC5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0SW5zdGFsbDIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMjEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMjEuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldEluc3RhbGwzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjIwLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjIwLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRVbmluc3RhbGwxKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoudW5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMCwgbnVsbCwgbnVsbCApOwotICAgICAgICBhc3NlcnRGYWxzZSggZmFjZXQxQXJ0aWZhY3RGaWxlLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0VW5pbnN0YWxsMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEyMSwgbnVsbCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai51bmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEyMSwgbnVsbCwgbnVsbCApOwotICAgICAgICBhc3NlcnRGYWxzZSggZmFjZXQxQXJ0aWZhY3RGaWxlLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0VW5pbnN0YWxsMygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjIwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLnVuaW5zdGFsbFByb2plY3RGYWNldCggZjF2MjAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZhY2V0MUFydGlmYWN0RmlsZS5leGlzdHMoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRWZXJzaW9uQ2hhbmdlMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTIxLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyMS5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRWZXJzaW9uQ2hhbmdlMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEzLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpb25TZXJpZXMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb247Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMC5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmMXYxMiwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLQotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTIxLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyMS5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLQotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTMsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTMuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MjAsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MjAuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5VTklOU1RBTEwsIGYxdjIwLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBhc3NlcnRGYWxzZSggZmFjZXQxQXJ0aWZhY3RGaWxlLmV4aXN0cygpICk7Ci0KLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTMsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTMuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTAsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTAuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MjAsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MjAuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTIxLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyMS5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlVOSU5TVEFMTCwgZjF2MTIxLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBhc3NlcnRGYWxzZSggZmFjZXQxQXJ0aWZhY3RGaWxlLmV4aXN0cygpICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Jhc2ljVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9CYXNpY1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzc2OWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Jhc2ljVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5hc1NldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEJhc2ljVGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cyI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTA7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyMTsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEzOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MzU7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYzNWE7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0NzsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3YjsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3YzsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZjJleHQ7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMmV4dHYxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldCBmM2E7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2F2MTA7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2F2MjA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZjNiOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNidjEwOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNidjIwOwotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzYzsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzY3YxMDsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzY3YyMDsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQxIiApOwotICAgICAgICAgICAgZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjF2MTIgPSBmMS5nZXRWZXJzaW9uKCAiMS4yIiApOwotICAgICAgICAgICAgZjF2MTIxID0gZjEuZ2V0VmVyc2lvbiggIjEuMi4xIiApOwotICAgICAgICAgICAgZjF2MTMgPSBmMS5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgICAgICAgICAgZjF2MjAgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmMiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MiIgKTsKLSAgICAgICAgICAgIGYydjM1ID0gZjIuZ2V0VmVyc2lvbiggIjMuNSIgKTsKLSAgICAgICAgICAgIGYydjM1YSA9IGYyLmdldFZlcnNpb24oICIzLjUjYSIgKTsKLSAgICAgICAgICAgIGYydjQ3ID0gZjIuZ2V0VmVyc2lvbiggIjQuNyIgKTsKLSAgICAgICAgICAgIGYydjQ3YiA9IGYyLmdldFZlcnNpb24oICI0LjcjYiIgKTsKLSAgICAgICAgICAgIGYydjQ3YyA9IGYyLmdldFZlcnNpb24oICI0LjcjYyIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZjJleHQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDJleHQiICk7Ci0gICAgICAgICAgICBmMmV4dHYxMCA9IGYyZXh0LmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgICAgIGYzYSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0M2EiICk7Ci0gICAgICAgICAgICBmM2F2MTAgPSBmM2EuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYzYXYyMCA9IGYzYS5nZXRWZXJzaW9uKCAiMi4wIiApOwotCi0gICAgICAgICAgICBmM2IgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDNiIiApOwotICAgICAgICAgICAgZjNidjEwID0gZjNiLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmM2J2MjAgPSBmM2IuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLQotICAgICAgICAgICAgZjNjID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQzYyIgKTsKLSAgICAgICAgICAgIGYzY3YxMCA9IGYzYy5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjNjdjIwID0gZjNjLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWdub3JlIGZhaWx1cmVzLiBUaGlzIGFwaSBpcyB0ZXN0ZWQgZXhwbGljaXRseS4KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEJhc2ljVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiQmFzaWMgVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0UHJvamVjdEZhY2V0RXh0ZW5zaW9uUG9pbnQiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0UHJvamVjdEZhY2V0VmVyc2lvbkV4dGVuc2lvblBvaW50IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdENhdGVnb3J5RXh0ZW5zaW9uUG9pbnQiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0RGVmYXVsdFZlcnNpb25Db21wYXJhdG9yIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdEN1c3RvbVZlcnNpb25Db21wYXJhdG9yIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdFZlcnNpb25FeHByZXNzaW9ucyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RWZXJzaW9uRXhwcmVzc2lvbnNXaXRoVW5rbm93blZlcnNpb25zIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdENvbnN0cmFpbnRzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdENvbnN0cmFpbnRBcGkiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2plY3RGYWNldEV4dGVuc2lvblBvaW50KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggImZhY2V0MSIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQxIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnMoIGYxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0SWQoKSwgImZhY2V0MSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRMYWJlbCgpLCAiRmFjZXQgMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgZmFjZXQxLiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggImZhY2V0MiIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQyIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnMoIGYyICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0SWQoKSwgImZhY2V0MiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXRMYWJlbCgpLCAiZmFjZXQyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldERlc2NyaXB0aW9uKCksICIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0RmFjZXRWZXJzaW9uRXh0ZW5zaW9uUG9pbnQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEuaGFzVmVyc2lvbiggIjEuMCIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTAuZ2V0VmVyc2lvblN0cmluZygpLCAiMS4wIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEwLmdldFByb2plY3RGYWNldCgpLCBmMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEwLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYxLmhhc1ZlcnNpb24oICIxLjIiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTIgPSBmMS5nZXRWZXJzaW9uKCAiMS4yIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEyLmdldFZlcnNpb25TdHJpbmcoKSwgIjEuMiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMi5nZXRQcm9qZWN0RmFjZXQoKSwgZjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMi5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMS5oYXNWZXJzaW9uKCAiMS4yLjEiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTIxID0gZjEuZ2V0VmVyc2lvbiggIjEuMi4xIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEyMS5nZXRWZXJzaW9uU3RyaW5nKCksICIxLjIuMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMjEuZ2V0UHJvamVjdEZhY2V0KCksIGYxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTIxLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYxLmhhc1ZlcnNpb24oICIxLjMiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTMgPSBmMS5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEzLmdldFZlcnNpb25TdHJpbmcoKSwgIjEuMyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMy5nZXRQcm9qZWN0RmFjZXQoKSwgZjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMy5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMS5oYXNWZXJzaW9uKCAiMi4wIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjIwID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYyMC5nZXRWZXJzaW9uU3RyaW5nKCksICIyLjAiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MjAuZ2V0UHJvamVjdEZhY2V0KCksIGYxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MjAuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEwLCBmMXYxMiwgZjF2MTIxLCBmMXYxMywgZjF2MjAgKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYyLmhhc1ZlcnNpb24oICIzLjUiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MzUgPSBmMi5nZXRWZXJzaW9uKCAiMy41IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjM1LmdldFZlcnNpb25TdHJpbmcoKSwgIjMuNSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnYzNS5nZXRQcm9qZWN0RmFjZXQoKSwgZjIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnYzNS5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMi5oYXNWZXJzaW9uKCAiMy41I2EiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MzVhID0gZjIuZ2V0VmVyc2lvbiggIjMuNSNhIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjM1YS5nZXRWZXJzaW9uU3RyaW5nKCksICIzLjUjYSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnYzNWEuZ2V0UHJvamVjdEZhY2V0KCksIGYyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2MzVhLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjIuaGFzVmVyc2lvbiggIjQuNyIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0NyA9IGYyLmdldFZlcnNpb24oICI0LjciICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDcuZ2V0VmVyc2lvblN0cmluZygpLCAiNC43IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3LmdldFByb2plY3RGYWNldCgpLCBmMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3LmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYyLmhhc1ZlcnNpb24oICI0LjcjYiIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0N2IgPSBmMi5nZXRWZXJzaW9uKCAiNC43I2IiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDdiLmdldFZlcnNpb25TdHJpbmcoKSwgIjQuNyNiIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3Yi5nZXRQcm9qZWN0RmFjZXQoKSwgZjIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0N2IuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjIuaGFzVmVyc2lvbiggIjQuNyNjIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3YyA9IGYyLmdldFZlcnNpb24oICI0LjcjYyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0N2MuZ2V0VmVyc2lvblN0cmluZygpLCAiNC43I2MiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDdjLmdldFByb2plY3RGYWNldCgpLCBmMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3Yy5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0VmVyc2lvbnMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYydjM1LCBmMnYzNWEsIGYydjQ3LCBmMnY0N2IsIGYydjQ3YyApICk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayBmb3IgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZXhpc3QuCi0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggZjIuaGFzVmVyc2lvbiggIjYuOSIgKSApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGYyLmdldFZlcnNpb24oICI2LjkiICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkge30KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RXh0ZW5zaW9uUG9pbnQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNDYXRlZ29yeURlZmluZWQoICJjYXQxIiApICk7Ci0gICAgICAgIGZpbmFsIElDYXRlZ29yeSBjYXQxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0Q2F0ZWdvcnkoICJjYXQxIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRDYXRlZ29yaWVzKCkuY29udGFpbnMoIGNhdDEgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQxLmdldElkKCksICJjYXQxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDEuZ2V0TGFiZWwoKSwgIkNhdGVnb3J5IDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY2F0MS5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgY2F0ZWdvcnkgZGVzY3JpcHRpb24uIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDEuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQxLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYyLCBmMmV4dCApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0Q2F0ZWdvcnkoKSwgY2F0MSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyZXh0LmdldENhdGVnb3J5KCksIGNhdDEgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzQ2F0ZWdvcnlEZWZpbmVkKCAiY2F0MiIgKSApOwotICAgICAgICBmaW5hbCBJQ2F0ZWdvcnkgY2F0MiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldENhdGVnb3J5KCAiY2F0MiIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0Q2F0ZWdvcmllcygpLmNvbnRhaW5zKCBjYXQyICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggY2F0Mi5nZXRJZCgpLCAiY2F0MiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQyLmdldExhYmVsKCksICJjYXQyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDIuZ2V0RGVzY3JpcHRpb24oKSwgIiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQyLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQyLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYzYSwgZjNiLCBmM2MgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYzYS5nZXRDYXRlZ29yeSgpLCBjYXQyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjNiLmdldENhdGVnb3J5KCksIGNhdDIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmM2MuZ2V0Q2F0ZWdvcnkoKSwgY2F0MiApOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wID0gZjEuZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggY29tcC5nZXRDbGFzcygpLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkRlZmF1bHRWZXJzaW9uQ29tcGFyYXRvciIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMCIsICIxLjIiICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMiIsICIxLjIuMSIgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4yLjEiLCAiMi4wIiApIDwgMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4yIiwgIjEuMCIgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4yLjEiLCAiMS4yIiApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIyLjAiLCAiMS4yLjEiICkgPiAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjAiLCAiMS4wIiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4yIiwgIjEuMiIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMi4xIiwgIjEuMi4xIiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMi4wIiwgIjIuMCIgKSA9PSAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMC5jb21wYXJlVG8oIGYxdjEyICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjEyLmNvbXBhcmVUbyggZjF2MTIxICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjEyMS5jb21wYXJlVG8oIGYxdjIwICkgPCAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMi5jb21wYXJlVG8oIGYxdjEwICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjEyMS5jb21wYXJlVG8oIGYxdjEyICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjIwLmNvbXBhcmVUbyggZjF2MTIxICkgPiAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMC5jb21wYXJlVG8oIGYxdjEwICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMi5jb21wYXJlVG8oIGYxdjEyICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMjEuY29tcGFyZVRvKCBmMXYxMjEgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjIwLmNvbXBhcmVUbyggZjF2MjAgKSA9PSAwICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRMYXRlc3RWZXJzaW9uKCksIGYxdjIwICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0IGFzYyA9IGYxLmdldFNvcnRlZFZlcnNpb25zKCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5zaXplKCksIDUgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAwICksIGYxdjEwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMSApLCBmMXYxMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDIgKSwgZjF2MTIxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMyApLCBmMXYxMyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDQgKSwgZjF2MjAgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgZGVzYyA9IGYxLmdldFNvcnRlZFZlcnNpb25zKCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLnNpemUoKSwgNSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAwICksIGYxdjIwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDEgKSwgZjF2MTMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMiApLCBmMXYxMjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMyApLCBmMXYxMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCA0ICksIGYxdjEwICk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wID0gZjIuZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggY29tcC5nZXRDbGFzcygpLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuQ3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IiICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIzLjUiLCAiNC43IiApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIzLjUiLCAiMy41I2EiICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjQuNyNjIiwgIjQuNyNiIiApIDwgMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiNC43IiwgIjMuNSIgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMy41I2EiLCAiMy41IiApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICI0LjcjYiIsICI0LjcjYyIgKSA+IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjMuNSIsICIzLjUiICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIzLjUjYSIsICIzLjUjYSIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjQuNyIsICI0LjciICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICI0LjcjYiIsICI0LjcjYiIgKSA9PSAwICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzUuY29tcGFyZVRvKCBmMnY0NyApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNS5jb21wYXJlVG8oIGYydjM1YSApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2MuY29tcGFyZVRvKCBmMnY0N2IgKSA8IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3LmNvbXBhcmVUbyggZjJ2MzUgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzVhLmNvbXBhcmVUbyggZjJ2MzUgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdiLmNvbXBhcmVUbyggZjJ2NDdjICkgPiAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNS5jb21wYXJlVG8oIGYydjM1ICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNWEuY29tcGFyZVRvKCBmMnYzNWEgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3LmNvbXBhcmVUbyggZjJ2NDcgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yi5jb21wYXJlVG8oIGYydjQ3YiApID09IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0TGF0ZXN0VmVyc2lvbigpLCBmMnY0N2IgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgYXNjID0gZjIuZ2V0U29ydGVkVmVyc2lvbnMoIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLnNpemUoKSwgNSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDAgKSwgZjJ2MzUgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAxICksIGYydjM1YSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDIgKSwgZjJ2NDcgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAzICksIGYydjQ3YyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDQgKSwgZjJ2NDdiICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0IGRlc2MgPSBmMi5nZXRTb3J0ZWRWZXJzaW9ucyggZmFsc2UgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5zaXplKCksIDUgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMCApLCBmMnY0N2IgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMSApLCBmMnY0N2MgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMiApLCBmMnY0NyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAzICksIGYydjM1YSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCA0ICksIGYydjM1ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uRXhwcmVzc2lvbnMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIxLjIiICksIAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMiApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMS4yLDEuMyIgKSwgCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyLCBmMXYxMyApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMS4wLDEuMiwxLjIuMSwxLjMsMi4wIiApLCAKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTAsIGYxdjEyLCBmMXYxMjEsIGYxdjEzLCBmMXYyMCApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzEuMiIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIsIGYxdjEyMSwgZjF2MTMsIGYxdjIwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIoMS4yIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMjEsIGYxdjEzLCBmMXYyMCApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMS4zXSIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTAsIGYxdjEyLCBmMXYxMjEsIGYxdjEzICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIxLjMpIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMCwgZjF2MTIsIGYxdjEyMSApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzEuMi0xLjNdIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMiwgZjF2MTIxLCBmMXYxMyApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzEuMi0xLjMpIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMiwgZjF2MTIxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIoMS4yLTEuM10iICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyMSwgZjF2MTMgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjEuMCwoMS4yLTEuM10sMi4wIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMCwgZjF2MTIxLCBmMXYxMywgZjF2MjAgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgdmVyc2lvbiBleHByZXNzaW9ucyBtYWtlIHJlZmVyZW5jZXMgdG8gZmFjZXQgdmVyc2lvbnMgdGhhdCBkb24ndAotICAgICAqIGFjdHVhbGx5IGV4aXN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uRXhwcmVzc2lvbnNXaXRoVW5rbm93blZlcnNpb25zKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiWzAuNS0xLjJdIiApLCBhc1NldCggZjF2MTAsIGYxdjEyICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlsxLjIuMi0yLjBdIiApLCBhc1NldCggZjF2MTMsIGYxdjIwICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlswLjUtMTAuMCkiICksIGFzU2V0KCBmMXYxMCwgZjF2MTIsIGYxdjEyMSwgZjF2MTMsIGYxdjIwICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlsxMC4wLTI1XSIgKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMy4wLDQuNSIgKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiNS43IiApLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cmFpbnRzKCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFZlcnNpb246IDMuNQotICAgICAgICAgKiAKLSAgICAgICAgICogPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMCIvPgotICAgICAgICAgKi8gCi0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1LmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjM1LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyMSApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBWZXJzaW9uOiAzLjUjYQotICAgICAgICAgKiAKLSAgICAgICAgICogPGFuZD4KLSAgICAgICAgICogICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMi0xLjMpIi8+Ci0gICAgICAgICAqIDwvYW5kPgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNWEuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNWEuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNWEuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNWEuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIxICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjM1YS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNWEuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAgKSApLmlzT0soKSApOwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyc2lvbjogNC43Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8b3I+Ci0gICAgICAgICAqICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjMiLz4KLSAgICAgICAgICogPC9vcj4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDcuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0Ny5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0Ny5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMiApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0Ny5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMjEgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0Ny5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3LmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFZlcnNpb246IDQuNyNiCi0gICAgICAgICAqIAotICAgICAgICAgKiA8b3I+Ci0gICAgICAgICAqICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMyIvPgotICAgICAgICAgKiAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAgICAgICogPC9vcj4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdiLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdiLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yi5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMiApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2IuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIxICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdiLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdiLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFZlcnNpb246IDQuNyNjCi0gICAgICAgICAqIAotICAgICAgICAgKiA8YW5kPgotICAgICAgICAgKiAgIDxvcj4KLSAgICAgICAgICogICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgICAgICAgKiAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMyIvPgotICAgICAgICAgKiAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotICAgICAgICAgKiAgIDwvb3I+Ci0gICAgICAgICAqICAgPGNvbmZsaWN0cyBmYWNldD0iZmFjZXQzYSIvPgotICAgICAgICAgKiAgIDxjb25mbGljdHMgZmFjZXQ9ImZhY2V0M2IiIHZlcnNpb249IjEuMCIvPgotICAgICAgICAgKiAgIDxjb25mbGljdHMgZ3JvdXA9Imdyb3VwMSIvPgotICAgICAgICAgKiA8L2FuZD4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMiApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMjEgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAgKSApLmlzT0soKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCwgZjNhdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCwgZjNhdjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCwgZjNidjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwLCBmM2J2MjAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwLCBmM2N2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwLCBmM2N2MjAgKSApLmlzT0soKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyYWludEFwaSgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIElDb25zdHJhaW50LlR5cGUuQU5ELm5hbWUoKSwgImFuZCIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAiYW5kIiApID09IElDb25zdHJhaW50LlR5cGUuQU5EICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggImFOZCIgKSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBJQ29uc3RyYWludC5UeXBlLk9SLm5hbWUoKSwgIm9yIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJvciIgKSA9PSBJQ29uc3RyYWludC5UeXBlLk9SICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggIm9SIiApID09IElDb25zdHJhaW50LlR5cGUuT1IgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUy5uYW1lKCksICJyZXF1aXJlcyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAicmVxdWlyZXMiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUyApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJyRXFVaVJlcyIgKSA9PSBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTLm5hbWUoKSwgImNvbmZsaWN0cyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAiY29uZmxpY3RzIiApID09IElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggImNPbkZsSWNUcyIgKSA9PSBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUyApOwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogPGFuZD4KLSAgICAgICAgICogICA8b3I+Ci0gICAgICAgICAqICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICAgICAgICogICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjMiLz4KLSAgICAgICAgICogICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAgICAgICogICA8L29yPgotICAgICAgICAgKiAgIDxjb25mbGljdHMgZmFjZXQ9ImZhY2V0M2EiLz4KLSAgICAgICAgICogICA8Y29uZmxpY3RzIGZhY2V0PSJmYWNldDNiIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgICAgICogICA8Y29uZmxpY3RzIGdyb3VwPSJncm91cDEiLz4KLSAgICAgICAgICogPC9hbmQ+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNHcm91cERlZmluZWQoICJncm91cDEiICkgKTsKLSAgICAgICAgZmluYWwgSUdyb3VwIGcgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRHcm91cCggImdyb3VwMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBnLmdldElkKCksICJncm91cDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZy5nZXRNZW1iZXJzKCksIGFzU2V0KCBmMnY0N2MsIGYzY3YxMCwgZjNjdjIwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25zdHJhaW50IHJvb3QgPSBmMnY0N2MuZ2V0Q29uc3RyYWludCgpOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIHJvb3QsIElDb25zdHJhaW50LlR5cGUuQU5ELCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBJQ29uc3RyYWludCBjMSwgYzI7Ci0gICAgICAgIAotICAgICAgICBjMSA9IChJQ29uc3RyYWludCkgcm9vdC5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzEsIElDb25zdHJhaW50LlR5cGUuT1IsIG51bGwsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGMyID0gKElDb25zdHJhaW50KSBjMS5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzIsIElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMsIGYxLCAiMS4yLjEiLCBCb29sZWFuLkZBTFNFICk7Ci0gICAgICAgIAotICAgICAgICBjMiA9IChJQ29uc3RyYWludCkgYzEuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMyLCBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTLCBmMSwgIjEuMyIsIEJvb2xlYW4uRkFMU0UgKTsKLSAgICAgICAgCi0gICAgICAgIGMyID0gKElDb25zdHJhaW50KSBjMS5nZXRPcGVyYW5kKCAyICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzIsIElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMsIGYxLCAiMi4wIiwgQm9vbGVhbi5GQUxTRSApOwotICAgICAgICAKLSAgICAgICAgYzEgPSAoSUNvbnN0cmFpbnQpIHJvb3QuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMxLCBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUywgZjNhLCAiKiIgKTsKLSAgICAgICAgCi0gICAgICAgIGMxID0gKElDb25zdHJhaW50KSByb290LmdldE9wZXJhbmQoIDIgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMSwgSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMsIGYzYiwgIjEuMCIgKTsKLSAgICAgICAgCi0gICAgICAgIGMxID0gKElDb25zdHJhaW50KSByb290LmdldE9wZXJhbmQoIDMgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMSwgSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMsIGcgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnN0cmFpbnQoIGZpbmFsIElDb25zdHJhaW50IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50LlR5cGUgZXhwZWN0ZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kICkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYywgZXhwZWN0ZWRUeXBlLCBuZXcgT2JqZWN0W10geyBleHBlY3RlZE9wZXJhbmQgfSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb25zdHJhaW50KCBmaW5hbCBJQ29uc3RyYWludCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludC5UeXBlIGV4cGVjdGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQyICkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYywgZXhwZWN0ZWRUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBleHBlY3RlZE9wZXJhbmQxLCBleHBlY3RlZE9wZXJhbmQyIH0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludCggZmluYWwgSUNvbnN0cmFpbnQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSBleHBlY3RlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDMgKQotICAgIHsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjLCBleHBlY3RlZFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGV4cGVjdGVkT3BlcmFuZDEsIGV4cGVjdGVkT3BlcmFuZDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRPcGVyYW5kMyB9ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnN0cmFpbnQoIGZpbmFsIElDb25zdHJhaW50IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50LlR5cGUgZXhwZWN0ZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kNCApCi0gICAgewotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMsIGV4cGVjdGVkVHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZXhwZWN0ZWRPcGVyYW5kMSwgZXhwZWN0ZWRPcGVyYW5kMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE9wZXJhbmQzLCBleHBlY3RlZE9wZXJhbmQ0IH0gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnN0cmFpbnQoIGZpbmFsIElDb25zdHJhaW50IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50LlR5cGUgZXhwZWN0ZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBleHBlY3RlZE9wZXJhbmRzICkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYy5nZXRUeXBlKCksIGV4cGVjdGVkVHlwZSApOwotCi0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGMuZ2V0T3BlcmFuZHMoKS5zaXplKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY291bnQsIGV4cGVjdGVkT3BlcmFuZHMubGVuZ3RoICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9wZXJhbmQgPSBjLmdldE9wZXJhbmQoIGkgKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZCA9IGV4cGVjdGVkT3BlcmFuZHNbIGkgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGV4cGVjdGVkICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGV4cGVjdGVkIGluc3RhbmNlb2YgU3RyaW5nICkgJiYKLSAgICAgICAgICAgICAgICAgICAgISAoIG9wZXJhbmQgaW5zdGFuY2VvZiBTdHJpbmcgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIG9wZXJhbmQudG9TdHJpbmcoKSwgZXhwZWN0ZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBvcGVyYW5kLCBleHBlY3RlZCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbGlzdC5hZGQoIGMuZ2V0T3BlcmFuZCggaSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggYy5nZXRPcGVyYW5kcygpLCBsaXN0ICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0RlZmF1bHRWZXJzaW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9EZWZhdWx0VmVyc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWY5YTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0RlZmF1bHRWZXJzaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlZmF1bHRWZXJzaW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZlcnNpb25UZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2NDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM3YzOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjR2NDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjV2NDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY2OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY2djQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY3OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY3djQ7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mMSIgKTsKLSAgICAgICAgZjF2NCA9IGYxLmdldFZlcnNpb24oICI0LjAiICk7Ci0KLSAgICAgICAgZjIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjIiICk7Ci0gICAgICAgIGYydjIgPSBmMi5nZXRWZXJzaW9uKCAiMi4wIiApOwotCi0gICAgICAgIGYzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2YzIiApOwotICAgICAgICBmM3YzID0gZjMuZ2V0VmVyc2lvbiggIjMuMCIgKTsKLQotICAgICAgICBmNCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mNCIgKTsKLSAgICAgICAgZjR2NCA9IGY0LmdldFZlcnNpb24oICI0LjAiICk7Ci0KLSAgICAgICAgZjUgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjUiICk7Ci0gICAgICAgIGY1djQgPSBmNS5nZXRWZXJzaW9uKCAiNC4wIiApOwotCi0gICAgICAgIGY2ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2Y2IiApOwotICAgICAgICBmNnY0ID0gZjYuZ2V0VmVyc2lvbiggIjQuMCIgKTsKLQotICAgICAgICBmNyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mNyIgKTsKLSAgICAgICAgZjd2NCA9IGY3LmdldFZlcnNpb24oICI0LjAiICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRGVmYXVsdFZlcnNpb25UZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJEZWZhdWx0IFZlcnNpb24gVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0VW5zcGVjaWZpZWREZWZhdWx0VmVyc2lvbiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3RTdGF0aWNEZWZhdWx0VmVyc2lvbiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3REZWZhdWx0VmVyc2lvblByb3ZpZGVyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdEJhZERlZmF1bHRWZXJzaW9uUHJvdmlkZXIxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdEJhZERlZmF1bHRWZXJzaW9uUHJvdmlkZXIyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdEJhZERlZmF1bHRWZXJzaW9uUHJvdmlkZXIzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdEJhZERlZmF1bHRWZXJzaW9uIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RVbnNwZWNpZmllZERlZmF1bHRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjF2NCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljRGVmYXVsdFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXREZWZhdWx0VmVyc2lvbigpLCBmMnYyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmVyc2lvblByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjMuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjN2MyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgaGFuZGxpbmcgb2YgdGhlIGNhc2Ugd2hlcmUgdGhlIGFzc29jaWF0ZWQgZGVmYXVsdCB2ZXJzaW9uCi0gICAgICogcHJvdmlkZXIgcmV0dXJucyBhIHZlcnNpb24gdGhhdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgZmFjZXQgdGhhdCB0aGUKLSAgICAgKiB2ZXJzaW9uIHByb3ZpZGVyIGlzIGFzc29jaWF0ZWQgd2l0aC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWREZWZhdWx0VmVyc2lvblByb3ZpZGVyMSgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGY0LmdldERlZmF1bHRWZXJzaW9uKCksIGY0djQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGhhbmRsaW5nIG9mIHRoZSBjYXNlIHdoZXJlIHRoZSBhc3NvY2lhdGVkIGRlZmF1bHQgdmVyc2lvbgotICAgICAqIHByb3ZpZGVyIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBpbnZva2VkLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZERlZmF1bHRWZXJzaW9uUHJvdmlkZXIyKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjUuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjV2NCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgaGFuZGxpbmcgb2YgdGhlIGNhc2Ugd2hlcmUgdGhlIGFzc29jaWF0ZWQgZGVmYXVsdCB2ZXJzaW9uCi0gICAgICogcHJvdmlkZXIgcmV0dXJucyBudWxsLgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWREZWZhdWx0VmVyc2lvblByb3ZpZGVyMygpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGY2LmdldERlZmF1bHRWZXJzaW9uKCksIGY2djQgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgaGFuZGxpbmcgb2YgdGhlIGNhc2Ugd2hlcmUgdGhlIHNwZWNpZmllZCBzdGF0aWMgZGVmYXVsdCB2ZXJzaW9uCi0gICAgICogaXMgbm90IGRlZmluZWQgZm9yIHRoZSBmYWNldC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWREZWZhdWx0VmVyc2lvbigpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGY3LmdldERlZmF1bHRWZXJzaW9uKCksIGY3djQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWNldER2dEYzRGVmYXVsdFZlcnNpb25Qcm92aWRlcgotCi0gICAgICAgIGltcGxlbWVudHMgSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLSAgICAgICAgCi0gICAgewotICAgIAotICAgICAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2YzIiApLmdldFZlcnNpb24oICIzLjAiICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWNldER2dEY1RGVmYXVsdFZlcnNpb25Qcm92aWRlcgotCi0gICAgICAgIGltcGxlbWVudHMgSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjZXREdnRGNkRlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLQotICAgICAgICBpbXBsZW1lbnRzIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRXZlbnREZWxpdmVyeVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRXZlbnREZWxpdmVyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDM2MWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0V2ZW50RGVsaXZlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuRmlsZVV0aWwuRklMRV9ET1RfUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5GaWxlVXRpbC5jb3B5RnJvbVBsdWdpbjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtDb3JlVGVzdHNQbHVnaW4uUExVR0lOX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5hc1NldDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFdmVudERlbGl2ZXJ5VGVzdHMKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RUZXN0cwotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjExOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjIxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM3YxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM3YyMjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY0OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY0djEzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY0djIzOwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJlZHRfZjEiICk7Ci0gICAgICAgIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgZjF2MjAgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICAKLSAgICAgICAgZjIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJlZHRfZjIiICk7Ci0gICAgICAgIGYydjExID0gZjIuZ2V0VmVyc2lvbiggIjEuMSIgKTsKLSAgICAgICAgZjJ2MjEgPSBmMi5nZXRWZXJzaW9uKCAiMi4xIiApOwotCi0gICAgICAgIGYzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZWR0X2YzIiApOwotICAgICAgICBmM3YxMiA9IGYzLmdldFZlcnNpb24oICIxLjIiICk7Ci0gICAgICAgIGYzdjIyID0gZjMuZ2V0VmVyc2lvbiggIjIuMiIgKTsKLQotICAgICAgICBmNCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImVkdF9mNCIgKTsKLSAgICAgICAgZjR2MTMgPSBmNC5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgICAgICBmNHYyMyA9IGY0LmdldFZlcnNpb24oICIyLjMiICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRXZlbnREZWxpdmVyeVRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkV2ZW50IERlbGl2ZXJ5IFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBFdmVudERlbGl2ZXJ5VGVzdHMoICJ0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24xIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBFdmVudERlbGl2ZXJ5VGVzdHMoICJ0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24yIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBFdmVudERlbGl2ZXJ5VGVzdHMoICJ0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBFdmVudERlbGl2ZXJ5VGVzdHMoICJ0ZXN0RXZlbnREZWxpdmVyeSIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBubyBmYWNldGVkIHByb2plY3QgZXZlbnRzIGFyZSBkZWxpdmVyZWQgd2hlbiBhIG5ldyBmYWNldGVkIHByb2plY3QKLSAgICAgKiBpcyBjcmVhdGVkLgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCAidGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMSIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIucmV0cmlldmVFdmVudHMoKS5zaXplKCksIDAgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgbm8gZmFjZXRlZCBwcm9qZWN0IGV2ZW50cyBhcmUgZGVsaXZlcmVkIHdoZW4gYW4gZXhpc3RpbmcgZmFjZXRlZCAKLSAgICAgKiBwcm9qZWN0IGlzIGltcG9ydGVkIGludG8gdGhlIHdvcmtzcGFjZSBhbmQgdGhlIGZhY2V0ZWQgcHJvamVjdCB3cmFwcGVyIGlzIGNyZWF0ZWQuIEluIHRoaXMKLSAgICAgKiBzY2VuYXJpbyB2YXJpYW50LCB0aGUgaW1wb3J0ZWQgcHJvamVjdCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIGFuZCB0aGVuIHJlbW92ZWQgZnJvbSB0aGUKLSAgICAgKiB3b3Jrc3BhY2UgaW4gdGhlIHNhbWUgd29ya2JlbmNoIHNlc3Npb24uIAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAidGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMiIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gZnBqLmdldFByb2plY3QoKTsKLSAgICAgICAgYWRkUmVzb3VyY2VUb0NsZWFudXAoIHBqICk7Ci0gICAgICAgIAotICAgICAgICBmcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYydjExLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBwai5kZWxldGUoIGZhbHNlLCBmYWxzZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIucmVzZXQoKTsKLSAgICAgICAgCi0gICAgICAgIHBqLmNyZWF0ZSggbnVsbCApOwotICAgICAgICBwai5vcGVuKCBudWxsICk7Ci0KLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwak5ldyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcGogKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGZwak5ldy5oYXNQcm9qZWN0RmFjZXQoIGYxdjEwICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnBqTmV3Lmhhc1Byb2plY3RGYWNldCggZjJ2MTEgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLnJldHJpZXZlRXZlbnRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwaiAhPSBmcGpOZXcgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgbm8gZmFjZXRlZCBwcm9qZWN0IGV2ZW50cyBhcmUgZGVsaXZlcmVkIHdoZW4gYW4gZXhpc3RpbmcgZmFjZXRlZCAKLSAgICAgKiBwcm9qZWN0IGlzIGltcG9ydGVkIGludG8gdGhlIHdvcmtzcGFjZSBhbmQgdGhlIGZhY2V0ZWQgcHJvamVjdCB3cmFwcGVyIGlzIGNyZWF0ZWQuIEluIHRoaXMKLSAgICAgKiBzY2VuYXJpbyB2YXJpYW50LCBubyBwcm9qZWN0IHdpdGggdGhhbiBuYW1lIGhhcyBleGlzdGVkIGluIHRoZSB3b3Jrc3BhY2UgaW4gdGhpcyB3b3JrYmVuY2gKLSAgICAgKiBzZXNzaW9uLiAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5yZXNldCgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgZmluYWwgRmlsZSB3c0xvY2F0aW9uID0gd3NSb290LmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgcGpOYW1lID0gInRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMiOwotICAgICAgICBmaW5hbCBGaWxlIHBqTG9jYXRpb24gPSBuZXcgRmlsZSggd3NMb2NhdGlvbiwgcGpOYW1lICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgcmVzUHJlZml4ID0gInJlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8iOwotICAgICAgICAKLSAgICAgICAgY29weUZyb21QbHVnaW4oIFBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aCggcmVzUHJlZml4ICsgRklMRV9ET1RfUFJPSkVDVCApLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIHBqTG9jYXRpb24sIEZJTEVfRE9UX1BST0pFQ1QgKSApOwotICAgICAgICAKLSAgICAgICAgY29weUZyb21QbHVnaW4oIFBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKCByZXNQcmVmaXggKyBGYWNldGVkUHJvamVjdC5NRVRBREFUQV9GSUxFICksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSggcGpMb2NhdGlvbiwgRmFjZXRlZFByb2plY3QuTUVUQURBVEFfRklMRSApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwaiA9IHdzUm9vdC5nZXRQcm9qZWN0KCBwak5hbWUgKTsKLSAgICAgICAgCi0gICAgICAgIHBqLmNyZWF0ZSggbnVsbCApOwotICAgICAgICBwai5vcGVuKCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhZGRSZXNvdXJjZVRvQ2xlYW51cCggcGogKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHBqICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmcGouaGFzUHJvamVjdEZhY2V0KCBmMXYxMCApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwai5oYXNQcm9qZWN0RmFjZXQoIGYydjExICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5yZXRyaWV2ZUV2ZW50cygpLnNpemUoKSwgMCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnREZWxpdmVyeSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgdGVzdCBwcm9qZWN0LgotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiA9IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXR1cCBsaXN0ZW5lcnMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0ZW5lciBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpID0gbmV3IExpc3RlbmVyKCk7Ci0gICAgICAgIGZwai5hZGRMaXN0ZW5lciggZnVsbExpc3RlbmVyUHJvamVjdEFwaSApOwotCi0gICAgICAgIGZpbmFsIExpc3RlbmVyIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSA9IG5ldyBMaXN0ZW5lcigpOwotICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lciggZnVsbExpc3RlbmVyR2xvYmFsQXBpICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdGVuZXIgcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSA9IG5ldyBMaXN0ZW5lcigpOwotICAgICAgICAKLSAgICAgICAgZnBqLmFkZExpc3RlbmVyKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9JTlNUQUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkZJWEVEX0ZBQ0VUU19DSEFOR0VEICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0ZW5lciBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGkgPSBuZXcgTGlzdGVuZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUkVfSU5TVEFMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkZJWEVEX0ZBQ0VUU19DSEFOR0VEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWRkVGVhckRvd25PcGVyYXRpb24KLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSApOwotICAgICAgICAgICAgICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29yay5yZW1vdmVMaXN0ZW5lciggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgLy8gUnVuIHRocm91Z2ggYSBzZXJpZXMgb2Ygb3BlcmF0aW9ucywgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxpc3RlbmVycyBhcmUgc2VlaW5nCi0gICAgICAgIC8vIHRoZSBleHBlY3RlZCBldmVudHMuCi0gICAgICAgIAotICAgICAgICBmcGouc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBhc1NldCggZjEsIGYyICkgKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXAxICk7Ci0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5mdWxsU3RlcDEgKTsKLSAgICAgICAgY2hlY2soIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMuZnVsbFN0ZXAxICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAxICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDEgKTsKLSAgICAgICAgY2hlY2soIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAxICk7Ci0gICAgICAgIAotICAgICAgICBmcGoubW9kaWZ5KCBhc1NldCggbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTAsIG51bGwgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYydjExLCBudWxsICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmM3YxMiwgbnVsbCApICksIG51bGwgKTsKLQotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwMiApOwotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXAyICk7Ci0gICAgICAgIGNoZWNrKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLmZ1bGxTdGVwMiApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMiApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAyICk7Ci0gICAgICAgIGNoZWNrKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMiApOwotICAgICAgICAKLSAgICAgICAgZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGY0djEzLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwMyApOwotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXAzICk7Ci0gICAgICAgIGNoZWNrKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLmZ1bGxTdGVwMyApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMyApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAzICk7Ci0gICAgICAgIGNoZWNrKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMyApOwotICAgICAgICAKLSAgICAgICAgZnBqLnVuaW5zdGFsbFByb2plY3RGYWNldCggZjN2MTIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXA0ICk7Ci0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5mdWxsU3RlcDQgKTsKLSAgICAgICAgY2hlY2soIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMuZnVsbFN0ZXA0ICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA0ICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDQgKTsKLSAgICAgICAgY2hlY2soIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA0ICk7Ci0gICAgICAgIAotICAgICAgICBmcGouc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBhc1NldCggZjQgKSApOwotICAgICAgICAKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5mdWxsU3RlcDUgKTsKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwNSApOwotICAgICAgICBjaGVjayggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5mdWxsU3RlcDUgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDUgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNSApOwotICAgICAgICBjaGVjayggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5wYXJ0aWFsU3RlcDUgKTsKLSAgICAgICAgCi0gICAgICAgIGZwai5tb2RpZnkoIGFzU2V0KCBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MjAsIG51bGwgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFLCBmNHYyMywgbnVsbCApICksIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXA2ICk7Ci0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5mdWxsU3RlcDYgKTsKLSAgICAgICAgY2hlY2soIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMuZnVsbFN0ZXA2ICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA2ICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDYgKTsKLSAgICAgICAgY2hlY2soIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA2ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyggZmluYWwgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gZXZlbnRzICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgOiBldmVudHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCBldmVudC50b1N0cmluZygpICkuYXBwZW5kKCAnXG4nICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVjayggZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkRXZlbnRzICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWwgPSB0b1N0cmluZyggbGlzdGVuZXIucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKSApLnRyaW0oKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkID0gZXhwZWN0ZWRFdmVudHMudHJpbSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBleHBlY3RlZCwgYWN0dWFsICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RlbmVyIAotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiBldmVudHMgPSBuZXcgQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PigpOwotCi0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXZlbnRzLmFkZCggZXZlbnQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IHJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gcmVzdWx0IAotICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4oIHRoaXMuZXZlbnRzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZXZlbnRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lcgotICAgIAotICAgICAgICBleHRlbmRzIExpc3RlbmVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0ZW5lciBpbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IHJldHJpZXZlRXZlbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGluc3RhbmNlICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lcgotICAgIAotICAgICAgICBleHRlbmRzIExpc3RlbmVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0ZW5lciBpbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IHJldHJpZXZlRXZlbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGluc3RhbmNlICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFN0ZXAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmdWxsU3RlcDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1bGxTdGVwMzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFN0ZXA0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmdWxsU3RlcDU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1bGxTdGVwNjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydGlhbFN0ZXAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJ0aWFsU3RlcDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnRpYWxTdGVwMzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydGlhbFN0ZXA0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJ0aWFsU3RlcDU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnRpYWxTdGVwNjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEV2ZW50RGVsaXZlcnlUZXN0cy5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9FdmVudERlbGl2ZXJ5VGVzdHMucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9FdmVudERlbGl2ZXJ5VGVzdHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZDk2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRXZlbnREZWxpdmVyeVRlc3RzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotZnVsbFN0ZXAxID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IkZJWEVEX0ZBQ0VUU19DSEFOR0VEIj5cblwKLVwgIDxvbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgPC9vbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgPG5ldy1maXhlZC1mYWNldHM+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMSIvPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjIiLz5cblwKLVwgIDwvbmV3LWZpeGVkLWZhY2V0cz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJPSkVDVF9NT0RJRklFRCI+XG5cCi08L2V2ZW50PgotCi1mdWxsU3RlcDIgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YxIiB2ZXJzaW9uXD0iMS4wIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjEiIHZlcnNpb25cPSIxLjAiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YyIiB2ZXJzaW9uXD0iMS4xIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjIiIHZlcnNpb25cPSIxLjEiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YzIiB2ZXJzaW9uXD0iMS4yIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjMiIHZlcnNpb25cPSIxLjIiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJPSkVDVF9NT0RJRklFRCI+XG5cCi08L2V2ZW50PgotCi1mdWxsU3RlcDMgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2Y0IiB2ZXJzaW9uXD0iMS4zIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjQiIHZlcnNpb25cPSIxLjMiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJPSkVDVF9NT0RJRklFRCI+XG5cCi08L2V2ZW50PgotCi1mdWxsU3RlcDQgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX1VOSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjMiIHZlcnNpb25cPSIxLjIiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9VTklOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YzIiB2ZXJzaW9uXD0iMS4yIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBST0pFQ1RfTU9ESUZJRUQiPlxuXAotPC9ldmVudD4KLQotZnVsbFN0ZXA1ID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IkZJWEVEX0ZBQ0VUU19DSEFOR0VEIj5cblwKLVwgIDxvbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjEiLz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YyIi8+XG5cCi1cICA8L29sZC1maXhlZC1mYWNldHM+XG5cCi1cICA8bmV3LWZpeGVkLWZhY2V0cz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2Y0Ii8+XG5cCi1cICA8L25ldy1maXhlZC1mYWNldHM+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBST0pFQ1RfTU9ESUZJRUQiPlxuXAotPC9ldmVudD4KLQotZnVsbFN0ZXA2ID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9WRVJTSU9OX0NIQU5HRSI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjEiIHZlcnNpb25cPSIyLjAiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9WRVJTSU9OX0NIQU5HRSI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjEiIHZlcnNpb25cPSIyLjAiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX1ZFUlNJT05fQ0hBTkdFIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mNCIgdmVyc2lvblw9IjIuMyIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX1ZFUlNJT05fQ0hBTkdFIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mNCIgdmVyc2lvblw9IjIuMyIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUk9KRUNUX01PRElGSUVEIj5cblwKLTwvZXZlbnQ+Ci0KLXBhcnRpYWxTdGVwMSA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJGSVhFRF9GQUNFVFNfQ0hBTkdFRCI+XG5cCi1cICA8b2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgIDwvb2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgIDxuZXctZml4ZWQtZmFjZXRzPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjEiLz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YyIi8+XG5cCi1cICA8L25ldy1maXhlZC1mYWNldHM+XG5cCi08L2V2ZW50PgotCi1wYXJ0aWFsU3RlcDIgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YxIiB2ZXJzaW9uXD0iMS4wIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMiIgdmVyc2lvblw9IjEuMSIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjMiIHZlcnNpb25cPSIxLjIiLz5cblwKLTwvZXZlbnQ+Ci0KLXBhcnRpYWxTdGVwMyA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjQiIHZlcnNpb25cPSIxLjMiLz5cblwKLTwvZXZlbnQ+Ci0KLXBhcnRpYWxTdGVwNCA9IAotCi1wYXJ0aWFsU3RlcDUgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iRklYRURfRkFDRVRTX0NIQU5HRUQiPlxuXAotXCAgPG9sZC1maXhlZC1mYWNldHM+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMSIvPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjIiLz5cblwKLVwgIDwvb2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgIDxuZXctZml4ZWQtZmFjZXRzPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjQiLz5cblwKLVwgIDwvbmV3LWZpeGVkLWZhY2V0cz5cblwKLTwvZXZlbnQ+Ci0KLXBhcnRpYWxTdGVwNiA9IApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0QWN0aW9uU29ydFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRBY3Rpb25Tb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3ZDdiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRBY3Rpb25Tb3J0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuYXNTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCAidW51c2VkIiApCi1wdWJsaWMgY2xhc3MgRmFjZXRBY3Rpb25Tb3J0VGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyMDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjM1OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjM1YTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0NzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0N2I7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDdjOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjJleHQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJleHR2MTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzYTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2F2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNhdjIwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmM2I7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNidjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYnYyMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjNjOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzY3YxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2N2MjA7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MSIgKTsKLSAgICAgICAgICAgIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYxdjEyID0gZjEuZ2V0VmVyc2lvbiggIjEuMiIgKTsKLSAgICAgICAgICAgIGYxdjEyMSA9IGYxLmdldFZlcnNpb24oICIxLjIuMSIgKTsKLSAgICAgICAgICAgIGYxdjEzID0gZjEuZ2V0VmVyc2lvbiggIjEuMyIgKTsKLSAgICAgICAgICAgIGYxdjIwID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZjIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDIiICk7Ci0gICAgICAgICAgICBmMnYzNSA9IGYyLmdldFZlcnNpb24oICIzLjUiICk7Ci0gICAgICAgICAgICBmMnYzNWEgPSBmMi5nZXRWZXJzaW9uKCAiMy41I2EiICk7Ci0gICAgICAgICAgICBmMnY0NyA9IGYyLmdldFZlcnNpb24oICI0LjciICk7Ci0gICAgICAgICAgICBmMnY0N2IgPSBmMi5nZXRWZXJzaW9uKCAiNC43I2IiICk7Ci0gICAgICAgICAgICBmMnY0N2MgPSBmMi5nZXRWZXJzaW9uKCAiNC43I2MiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGYyZXh0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQyZXh0IiApOwotICAgICAgICAgICAgZjJleHR2MTAgPSBmMmV4dC5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgICAgICBmM2EgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDNhIiApOwotICAgICAgICAgICAgZjNhdjEwID0gZjNhLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmM2F2MjAgPSBmM2EuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLQotICAgICAgICAgICAgZjNiID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQzYiIgKTsKLSAgICAgICAgICAgIGYzYnYxMCA9IGYzYi5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjNidjIwID0gZjNiLmdldFZlcnNpb24oICIyLjAiICk7Ci0KLSAgICAgICAgICAgIGYzYyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0M2MiICk7Ci0gICAgICAgICAgICBmM2N2MTAgPSBmM2MuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYzY3YyMCA9IGYzYy5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBmYWlsdXJlcy4gVGhpcyBhcGkgaXMgdGVzdGVkIGV4cGxpY2l0bHkuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGYWNldEFjdGlvblNvcnRUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJGYWNldCBBY3Rpb24gU29ydCBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRBY3Rpb25Tb3J0VGVzdHMoICJ0ZXN0VW5pbnN0YWxsQ29tZXNGaXJzdDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0QWN0aW9uU29ydFRlc3RzKCAidGVzdFVuaW5zdGFsbENvbWVzRmlyc3QyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldEFjdGlvblNvcnRUZXN0cyggInRlc3RTb3J0U3RhYmlsaXR5MSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRBY3Rpb25Tb3J0VGVzdHMoICJ0ZXN0U29ydFN0YWJpbGl0eTIiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgc29ydCBwbGFjZXMgdW5pbnN0YWxsIGFjdGlvbnMgZmlyc3QuIFRoaXMgaXMgdGhlIAotICAgICAqIGNvbnRyb2wgdGVzdCBjYXNlLiBUaGUgaW5wdXQgYWxyZWFkeSBwbGFjZXMgdW5pbnN0YWxsIGZpcnN0LgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGxDb21lc0ZpcnN0MSgpCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYTEgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMiwgbnVsbCApOwotICAgICAgICBmaW5hbCBBY3Rpb24gYTIgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5VTklOU1RBTEwsIGYzYXYxMCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbnMuYWRkKCBhMiApOwotICAgICAgICBhY3Rpb25zLmFkZCggYTEgKTsKLSAgICAgICAgCi0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLnNvcnQoIGFzU2V0KCBmM2F2MTAgKSwgYWN0aW9ucyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFjdGlvbnMsIGFzTGlzdCggYTIsIGExICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgc29ydCBwbGFjZXMgdW5pbnN0YWxsIGFjdGlvbnMgZmlyc3QuIFRoZSB0ZXN0IGNhc2UgCi0gICAgICogcGxhY2VzIGFuIGluc3RhbGwgYWN0aW9uIGluIGZyb250IG9mIHRoZSB1bmluc3RhbGwgYWN0aW9uIGFuZCBjaGVja3MKLSAgICAgKiB3aGV0aGVyIHRoZSBzb3J0IGFsZ29yaXRobSByZXZlcnNlcyB0aGUgb3JkZXIuIAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGxDb21lc0ZpcnN0MigpCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYTEgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMiwgbnVsbCApOwotICAgICAgICBmaW5hbCBBY3Rpb24gYTIgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5VTklOU1RBTEwsIGYzYXYxMCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbnMuYWRkKCBhMSApOwotICAgICAgICBhY3Rpb25zLmFkZCggYTIgKTsKLSAgICAgICAgCi0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLnNvcnQoIGFzU2V0KCBmM2F2MTAgKSwgYWN0aW9ucyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFjdGlvbnMsIGFzTGlzdCggYTIsIGExICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBzb3J0IHByb2R1Y2VzICJzdGFibGUiIHJlc3VsdHMgZ2l2ZW4gdW5yZWxhdGVkIGZhY2V0cy4KLSAgICAgKiBUaGlzIGlzIHRoZSBjb250cm9sIHRlc3QgY2FzZS4gVGhlIGlucHV0IGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIAotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdFNvcnRTdGFiaWxpdHkxKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMSA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhMiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYzYXYxMCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGFjdGlvbnMuYWRkKCBhMSApOwotICAgICAgICBhY3Rpb25zLmFkZCggYTIgKTsKLSAgICAgICAgCi0gICAgICAgIFByb2plY3RGYWNldHNNYW5hZ2VyLnNvcnQoIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgYWN0aW9ucyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFjdGlvbnMsIGFzTGlzdCggYTEsIGEyICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBzb3J0IHByb2R1Y2VzICJzdGFibGUiIHJlc3VsdHMgZ2l2ZW4gdW5yZWxhdGVkIGZhY2V0cy4KLSAgICAgKiBUaGUgaW5wdXQgZmFjZXRzIGFyZSBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0U3RhYmlsaXR5MigpCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYTEgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMiwgbnVsbCApOwotICAgICAgICBmaW5hbCBBY3Rpb24gYTIgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmM2F2MTAsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb25zLmFkZCggYTIgKTsKLSAgICAgICAgYWN0aW9ucy5hZGQoIGExICk7Ci0gICAgICAgIAotICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5zb3J0KCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIGFjdGlvbnMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhY3Rpb25zLCBhc0xpc3QoIGExLCBhMiApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0QWN0aW9uc1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRBY3Rpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5MDZkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRBY3Rpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBGYWNldEFjdGlvbnNUZXN0cwotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFRlc3RzCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjI7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhdF9mMSIgKTsKLSAgICAgICAgZjF2MSA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGYxdjIgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEZhY2V0QWN0aW9uc1Rlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkZhY2V0IEFjdGlvbnMgVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0QWN0aW9uc1Rlc3RzKCAidGVzdE11bHRpVmVyc2lvbkluc3RhbGwxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldEFjdGlvbnNUZXN0cyggInRlc3RNdWx0aVZlcnNpb25JbnN0YWxsMiIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlcyB0ZXN0IHRoZSBzY2VuYXJpbyB3aGVyZSBkaWZmZXJlbnQgCi0gICAgICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBJTlNUQUxMIGFjdGlvbiBhcmUgcHJvdmlkZWQgZm9yIHR3byB2ZXJzaW9ucyBvZiAKLSAgICAgKiB0aGUgc2FtZSBmYWNldC4KLSAgICAgKiAKLSAgICAgKiBTY2VuYXJpbyBUZXN0IENvZGU6Ci0gICAgICogCi0gICAgICogICB0ZXN0TXVsdGlWZXJzaW9uSW5zdGFsbDEKLSAgICAgKiAgIHRlc3RNdWx0aVZlcnNpb25JbnN0YWxsMgotICAgICAqICAgRjF2MUluc3RhbGxEZWxlZ2F0ZQotICAgICAqICAgRjF2Mkluc3RhbGxEZWxlZ2F0ZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVZlcnNpb25JbnN0YWxsMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiA9IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gZnBqLmdldFByb2plY3QoKTsKLSAgICAgICAgZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIEYxdjFJbnN0YWxsRGVsZWdhdGUuZ2V0TWFya2VyRmlsZSggcGogKS5leGlzdHMoKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggRjF2Mkluc3RhbGxEZWxlZ2F0ZS5nZXRNYXJrZXJGaWxlKCBwaiApLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpVmVyc2lvbkluc3RhbGwyKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gY3JlYXRlRmFjZXRlZFByb2plY3QoKTsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcGogPSBmcGouZ2V0UHJvamVjdCgpOwotICAgICAgICBmcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIEYxdjFJbnN0YWxsRGVsZWdhdGUuZ2V0TWFya2VyRmlsZSggcGogKS5leGlzdHMoKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBGMXYySW5zdGFsbERlbGVnYXRlLmdldE1hcmtlckZpbGUoIHBqICkuZXhpc3RzKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGMXYxSW5zdGFsbERlbGVnYXRlCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRNYXJrZXJGaWxlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0RmlsZSggInYxbWFya2VyIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgIAotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRmlsZSBtYXJrZXIgPSBnZXRNYXJrZXJGaWxlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVtcHR5U3RyZWFtIAotICAgICAgICAgICAgICAgID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCBuZXcgYnl0ZVsgMCBdICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1hcmtlci5jcmVhdGUoIGVtcHR5U3RyZWFtLCBmYWxzZSwgbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGMXYySW5zdGFsbERlbGVnYXRlCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRNYXJrZXJGaWxlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0RmlsZSggInYybWFya2VyIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgIAotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRmlsZSBtYXJrZXIgPSBnZXRNYXJrZXJGaWxlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVtcHR5U3RyZWFtIAotICAgICAgICAgICAgICAgID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCBuZXcgYnl0ZVsgMCBdICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1hcmtlci5jcmVhdGUoIGVtcHR5U3RyZWFtLCBmYWxzZSwgbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0Q29uc3RyYWludHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0Q29uc3RyYWludHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc5MGI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldENvbnN0cmFpbnRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5hc1NldDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRmFjZXRDb25zdHJhaW50c1Rlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzdjEwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNHYxMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjV2MTA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNnYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNnYyMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNnYzNzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNnY0MDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNnY0NTsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjd2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjd2MjA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY4OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY4djEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY4djIwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY4djMwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjl2MTA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjEwdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxMHYyMDsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2YxIiApOwotICAgICAgICBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgZjMgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjMiICk7Ci0gICAgICAgIGYzdjEwID0gZjMuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICBmNCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mNCIgKTsKLSAgICAgICAgZjR2MTAgPSBmNC5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgIGY1ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2Y1IiApOwotICAgICAgICBmNXYxMCA9IGY1LmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgZjYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjYiICk7Ci0gICAgICAgIGY2djEwID0gZjYuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgZjZ2MjMgPSBmNi5nZXRWZXJzaW9uKCAiMi4zIiApOwotICAgICAgICBmNnYzNyA9IGY2LmdldFZlcnNpb24oICIzLjciICk7Ci0gICAgICAgIGY2djQwID0gZjYuZ2V0VmVyc2lvbiggIjQuMCIgKTsKLSAgICAgICAgZjZ2NDUgPSBmNi5nZXRWZXJzaW9uKCAiNC41IiApOwotCi0gICAgICAgIGY3ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2Y3IiApOwotICAgICAgICBmN3YxMCA9IGY3LmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGY3djIwID0gZjcuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLQotICAgICAgICBmOCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mOCIgKTsKLSAgICAgICAgZjh2MTAgPSBmOC5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBmOHYyMCA9IGY4LmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIGY4djMwID0gZjguZ2V0VmVyc2lvbiggIjMuMCIgKTsKLQotICAgICAgICBmOSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mOSIgKTsKLSAgICAgICAgZjl2MTAgPSBmOS5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgIGYxMCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mMTAiICk7Ci0gICAgICAgIGYxMHYxMCA9IGYxMC5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBmMTB2MjAgPSBmMTAuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGYWNldENvbnN0cmFpbnRzVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiRmFjZXQgQ29uc3RyYWludCBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3QxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0MyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3Q0IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDUiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0NiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3Q3IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDgiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RSZXF1aXJlc1dpdGhOb1ZlcnNpb24iICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RSZXF1aXJlc1dpdGhVbmtub3duVmVyc2lvbiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEdyb3VwUmVxdWlyZXMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RHcm91cFJlcXVpcmVzU29mdCIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGNvbmZsaWN0IGRldGVjdGlvbiBjb2RlIHBpY2tzIHVwIG9uIGFuIGluZGlyZWN0Ci0gICAgICogY29uZmxpY3QuIEFsc28gdGVzdHMgdGhhdCBhIHNvZnQgY29uc3RyYWludCBpcyBub3QgdXNlZCB0byBmbGFnIGEKLSAgICAgKiBjb25mbGljdC4KLSAgICAgKiAKLSAgICAgKiBIZXJlIGlzIHRoZSByZWxhdGlvbnNoaXAgZGlhZ3JhbSBiZXR3ZWVuIHRoZSBmaXZlIGZhY2V0cyBpbnZvbHZlZCBpbiAKLSAgICAgKiB0aGlzIHRlc3Q6IAotICAgICAqIAotICAgICAqICAgICAgICAgICBjb25mbGljdHMgICAgICAgICAgICByZXF1aXJlcwotICAgICAqICAgZjEgLS0tLS0tLS0tLS0tLS0tLT4gZjIgPC0tLS0tLS0tLS0tLS0tLS0gZjMKLSAgICAgKiAgIGY0IDwtLS0tLS0tLS0tLS0tLS0tICAgIDwtLS0tLS0tLS0tLS0tLS0tIGY1Ci0gICAgICogICAgICAgICAgIGNvbmZsaWN0cyAgICAgICAgIHNvZnQgcmVxdWlyZXMKLSAgICAgKiAKLSAgICAgKiBUaGVzZSBjYXNlIHNob3VsZCBjb21lIGJhY2sgcG9zaXRpdmUgZm9yIGNvbmZsaWN0OgotICAgICAqIAotICAgICAqICAgZjEgd2l0aCBmMwotICAgICAqICAgZjMgd2l0aCBmMQotICAgICAqICAgZjQgd2l0aCBmMwotICAgICAqICAgZjMgd2l0aCBmNAotICAgICAqICAgCi0gICAgICogVGhlc2UgY2FzZSBzaG91bGQgY29tZSBiYWNrIG5lZ2F0aXZlIGZvciBjb25mbGljdDoKLSAgICAgKiAKLSAgICAgKiAgIGYxIHdpdGggZjUKLSAgICAgKiAgIGY1IHdpdGggZjEKLSAgICAgKiAgIGY0IHdpdGggZjUKLSAgICAgKiAgIGY1IHdpdGggZjQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDEoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTAuY29uZmxpY3RzV2l0aCggZjN2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjN2MTAuY29uZmxpY3RzV2l0aCggZjF2MTAgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0MygpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBmNHYxMC5jb25mbGljdHNXaXRoKCBmM3YxMCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3Q0KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIGYzdjEwLmNvbmZsaWN0c1dpdGgoIGY0djEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3Q1KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMXYxMC5jb25mbGljdHNXaXRoKCBmNXYxMCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0NigpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjV2MTAuY29uZmxpY3RzV2l0aCggZjF2MTAgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0NygpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjR2MTAuY29uZmxpY3RzV2l0aCggZjV2MTAgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0OCgpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjV2MTAuY29uZmxpY3RzV2l0aCggZjR2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludDoKLSAgICAgKiAKLSAgICAgKiAgIDxyZXF1aXJlcyBmYWNldD0iZmN0X2Y2Ii8+Ci0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZXNXaXRoTm9WZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmN3YxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGY3djEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djIzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjd2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2MzcgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmN3YxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnY0MCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGY3djEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djQ1ICkgKS5pc09LKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUZXN0cyB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgdGhhdCBzcGVjaWZpZXMgdmVyc2lvbnMgdGhhdCBkb24ndCBleGlzdDoKLSAgICAgKiAKLSAgICAgKiAgIDxyZXF1aXJlcyBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSJbNS4wLTYuNSkiLz4KLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlc1dpdGhVbmtub3duVmVyc2lvbigpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djIzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djM3ICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djQwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djQ1ICkgKS5pc09LKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUZXN0cyB0aGUgInJlcXVpcmVzIGFueSBncm91cCBtZW1iZXIiIGNvbnN0cmFpbnQ6Ci0gICAgICogCi0gICAgICogICA8cmVxdWlyZXMgZ3JvdXA9ImZjdF9nMSIvPgotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwUmVxdWlyZXMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYxMHYxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjh2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjh2MjAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjEwdjEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY4djMwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY5djEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYxMHYxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUZXN0cyB0aGUgc29mdCB2ZXJzaW9uIG9mIHRoZSAicmVxdWlyZXMgYW55IGdyb3VwIG1lbWJlciIgY29uc3RyYWludDoKLSAgICAgKiAKLSAgICAgKiAgIDxyZXF1aXJlcyBncm91cD0iZmN0X2cxIiBzb2Z0PSJ0cnVlIi8+Ci0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBSZXF1aXJlc1NvZnQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOHYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOHYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOHYzMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtDb3JlVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldGVkUHJvamVjdEZyYW1ld29ya0NvcmVUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI2MmY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldGVkUHJvamVjdEZyYW1ld29ya0NvcmVUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrQ29yZVRlc3RzUGx1Z2luCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzIjsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1ByZXNldHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1ByZXNldHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTcwMmUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9QcmVzZXRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYxdjEyMTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mMXYyMDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mMmV4dHYxMDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mMnYzNWE7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjNhdjEwOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYzYnYxMDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mM2N2MTA7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLmFzU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEeW5hbWljUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJlc2V0RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJlc2V0c1Rlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBQcmVzZXRzVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiUHJlc2V0cyBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJlc2V0c1Rlc3RzKCAidGVzdFNpbXBsZVN0YXRpY1ByZXNldHMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByZXNldHNUZXN0cyggInRlc3REZXJpdmVkU3RhdGljUHJlc2V0cyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJlc2V0c1Rlc3RzKCAidGVzdER5bmFtaWNQcmVzZXRzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcmVzZXRzVGVzdHMoICJ0ZXN0U3RhdGljUHJlc2V0c0V4dGVuZGluZ0R5bmFtaWNQcmVzZXRzMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJlc2V0c1Rlc3RzKCAidGVzdFN0YXRpY1ByZXNldHNFeHRlbmRpbmdEeW5hbWljUHJlc2V0czIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByZXNldHNUZXN0cyggInRlc3RVc2VyRGVmaW5lZFByZXNldHMiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVN0YXRpY1ByZXNldHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfcHJlc2V0MSIgKSApOwotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldDEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoICJwdF9wcmVzZXQxIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldDEgKSApOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDEuZ2V0SWQoKSwgInB0X3ByZXNldDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0MS5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5TVEFUSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQxLmdldExhYmVsKCksICJQcmVzZXQgMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQxLmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGZpcnN0IHByZXNldC4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0MS5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYyMCwgZjJ2MzVhLCBmMmV4dHYxMCApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF9wcmVzZXQyIiApICk7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0MiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldCggInB0X3ByZXNldDIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0MiApICk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0Mi5nZXRJZCgpLCAicHRfcHJlc2V0MiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQyLmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlNUQVRJQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDIuZ2V0TGFiZWwoKSwgInB0X3ByZXNldDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0Mi5nZXREZXNjcmlwdGlvbigpLCAiIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDIuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjNhdjEwLCBmM2J2MTAsIGYzY3YxMCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlcml2ZWRTdGF0aWNQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3ByZXNldDMiICkgKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCAicHRfcHJlc2V0MyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQzICkgKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQzLmdldElkKCksICJwdF9wcmVzZXQzIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDMuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuU1RBVElDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0My5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYxMjEsIGYydjM1YSwgZjJleHR2MTAsIGYzYXYxMCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljUHJlc2V0cygpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF9keW5fcHJlc2V0IiApICk7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCAicHRfZHluX3ByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQgKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldElkKCksICJwdF9keW5fcHJlc2V0IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5EWU5BTUlDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldExhYmVsKCksICJwdF9keW5fcHJlc2V0IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXREZXNjcmlwdGlvbigpLCAiIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElEeW5hbWljUHJlc2V0IGR5bmFtaWNQcmVzZXQgPSAoSUR5bmFtaWNQcmVzZXQpIHByZXNldDsKLSAgICAgICAgZmluYWwgSVByZXNldCByZXNvbHZlZCA9IGR5bmFtaWNQcmVzZXQucmVzb2x2ZSggQ29sbGVjdGlvbnMuPFN0cmluZyxPYmplY3Q+ZW1wdHlNYXAoKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRJZCgpLCAicHRfZHluX3ByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5TVEFUSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRMYWJlbCgpLCAiRHluYW1pYyBQcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0RGVzY3JpcHRpb24oKSwgIlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZHluYW1pYyBwcmVzZXQuIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjIwLCBmMmV4dHYxMCwgZjNjdjEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY1ByZXNldHNFeHRlbmRpbmdEeW5hbWljUHJlc2V0czEoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8xIiApICk7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8xIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldCApICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0SWQoKSwgInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuRFlOQU1JQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRMYWJlbCgpLCAiU3RhdGljIEV4dGVuZGluZyBEeW5hbWljIFByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIHN0YXRpYy1keW5hbWljIGRlc2NyaXB0aW9uLiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRHluYW1pY1ByZXNldCBkeW5hbWljUHJlc2V0ID0gKElEeW5hbWljUHJlc2V0KSBwcmVzZXQ7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcmVzb2x2ZWQgPSBkeW5hbWljUHJlc2V0LnJlc29sdmUoIENvbGxlY3Rpb25zLjxTdHJpbmcsT2JqZWN0PmVtcHR5TWFwKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0SWQoKSwgInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5TVEFUSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRMYWJlbCgpLCAiU3RhdGljIEV4dGVuZGluZyBEeW5hbWljIFByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgc3RhdGljLWR5bmFtaWMgZGVzY3JpcHRpb24uIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjIwLCBmMmV4dHYxMCwgZjNjdjEwLCBmMnYzNWEsIGYzYnYxMCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY1ByZXNldHNFeHRlbmRpbmdEeW5hbWljUHJlc2V0czIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8yIiApICk7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8yIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldCApICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0SWQoKSwgInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuRFlOQU1JQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRMYWJlbCgpLCAiU3RhdGljIEV4dGVuZGluZyBEeW5hbWljIFByZXNldCAyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgc3RhdGljLWR5bmFtaWMgZGVzY3JpcHRpb24gMi4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFByb2plY3RGYWNldHMoKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUR5bmFtaWNQcmVzZXQgZHluYW1pY1ByZXNldCA9IChJRHluYW1pY1ByZXNldCkgcHJlc2V0OwotICAgICAgICBmaW5hbCBJUHJlc2V0IHJlc29sdmVkID0gZHluYW1pY1ByZXNldC5yZXNvbHZlKCBDb2xsZWN0aW9ucy48U3RyaW5nLE9iamVjdD5lbXB0eU1hcCgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldElkKCksICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuU1RBVElDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0TGFiZWwoKSwgIlN0YXRpYyBFeHRlbmRpbmcgRHluYW1pYyBQcmVzZXQgMiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgc3RhdGljLWR5bmFtaWMgZGVzY3JpcHRpb24gMi4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MTIxLCBmMmV4dHYxMCwgZjNjdjEwLCBmMnYzNWEsIGYzYnYxMCwgZjNhdjEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFVzZXJEZWZpbmVkUHJlc2V0cygpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfdXNlcl9kZWZpbmVkIiApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5kZWZpbmVQcmVzZXQoICJwdF91c2VyX2RlZmluZWQiLCAidGhlIGRlc2NyaXB0aW9uIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyMSwgZjJleHR2MTAgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCBwcmVzZXQuZ2V0SWQoKSApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0ICkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5VU0VSX0RFRklORUQgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0TGFiZWwoKSwgInB0X3VzZXJfZGVmaW5lZCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0RGVzY3JpcHRpb24oKSwgInRoZSBkZXNjcmlwdGlvbiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MTIxLCBmMmV4dHYxMCApICk7Ci0gICAgICAgIAotICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5kZWxldGVQcmVzZXQoIHByZXNldCApOwotICAgICAgICBhc3NlcnRGYWxzZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfdXNlcl9kZWZpbmVkIiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJlc2V0RmFjdG9yeSAKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJUHJlc2V0RmFjdG9yeQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBQcmVzZXREZWZpbml0aW9uIGNyZWF0ZVByZXNldCggZmluYWwgU3RyaW5nIHByZXNldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICkgCi0gICAgICAgIAotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByZXNldERlZmluaXRpb24oICJEeW5hbWljIFByZXNldCIsICJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGR5bmFtaWMgcHJlc2V0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYyMCwgZjJleHR2MTAsIGYzY3YxMCApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9Qcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGNjZThjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9Qcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLmFzU2V0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5yZWFkRnJvbUZpbGU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLndhaXRGb3JDb25kaXRpb247Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLndyaXRlVG9GaWxlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5JQ29uZGl0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCAidW51c2VkIiApCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RUZXN0cwotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9GSUxFIAotICAgICAgICA9ICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUX05BTUUgPSAidGVzdFByb2plY3QiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjA7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDEiICk7Ci0gICAgICAgICAgICBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmMXYxMiA9IGYxLmdldFZlcnNpb24oICIxLjIiICk7Ci0gICAgICAgICAgICBmMXYxMjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4yLjEiICk7Ci0gICAgICAgICAgICBmMXYxMyA9IGYxLmdldFZlcnNpb24oICIxLjMiICk7Ci0gICAgICAgICAgICBmMXYyMCA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWdub3JlIGZhaWx1cmVzLiBUaGlzIGFwaSBpcyB0ZXN0ZWQgZXhwbGljaXRseS4KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQcm9qZWN0IHBqOwotICAgIHByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGZwajsKLSAgICBwcml2YXRlIElGaWxlIG1kZmlsZTsKLQotICAgIHByaXZhdGUgUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiUHJvamVjdCBDaGFuZ2UgUmVhY3Rpb24gVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzKCAidGVzdFJlYWN0aW9uVG9Qcm9qZWN0RGVsZXRlIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cyggInRlc3RSZWFjdGlvblRvTWV0YWRhdGFGaWxlRGVsZXRlIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cyggInRlc3RSZWFjdGlvblRvTWV0YWRhdGFGaWxlQ2hhbmdlIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoIFRFU1RfUFJPSkVDVF9OQU1FICkuZXhpc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZnBqID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBURVNUX1BST0pFQ1RfTkFNRSwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5waiA9IHRoaXMuZnBqLmdldFByb2plY3QoKTsKLSAgICAgICAgYWRkUmVzb3VyY2VUb0NsZWFudXAoIHRoaXMucGogKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdGhpcy5mcGouZ2V0UHJvamVjdCgpLmV4aXN0cygpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMiwgbnVsbCwgbnVsbCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHRoaXMuZnBqLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjEyICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubWRmaWxlID0gdGhpcy5wai5nZXRGaWxlKCBNRVRBREFUQV9GSUxFICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFjdGlvblRvUHJvamVjdERlbGV0ZSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5wai5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHdhaXRGb3JDb25kaXRpb24oIGNyZWF0ZU5vRmFjZXRzQ29uZGl0aW9uKCB0aGlzLmZwaiApICk7Ci0gICAgICAgIGFzc2VydE51bGwoIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggdGhpcy5waiApICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZ5Q2Fubm90TW9kaWZ5RGVsZXRlZFByb2plY3RFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZnBqLnNldEZpeGVkUHJvamVjdEZhY2V0cyggYXNTZXQoIGYxICkgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZ5Q2Fubm90TW9kaWZ5RGVsZXRlZFByb2plY3RFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZnBqLnNldFRhcmdldGVkUnVudGltZXMoIENvbGxlY3Rpb25zLjxJUnVudGltZT5lbXB0eVNldCgpLCBudWxsICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmeUNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mcGouc2V0UHJpbWFyeVJ1bnRpbWUoIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZ5Q2Fubm90TW9kaWZ5RGVsZXRlZFByb2plY3RFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2Fubm90TW9kaWZ5RGVsZXRlZFByb2plY3RFeGNlcHRpb24oIGZpbmFsIENvcmVFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gIkNhbm5vdCBtb2RpZnkgYSBkZWxldGVkIHByb2plY3QuIjsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkuZXF1YWxzKCBleHBlY3RlZE1lc3NhZ2UgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFjdGlvblRvTWV0YWRhdGFGaWxlRGVsZXRlKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLm1kZmlsZS5kZWxldGUoIHRydWUsIG51bGwgKTsKLQotICAgICAgICB3YWl0Rm9yQ29uZGl0aW9uKCBjcmVhdGVOb0ZhY2V0c0NvbmRpdGlvbiggdGhpcy5mcGogKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFjdGlvblRvTWV0YWRhdGFGaWxlQ2hhbmdlKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRzOwotICAgICAgICAKLSAgICAgICAgY29udGVudHMgPSByZWFkRnJvbUZpbGUoIHRoaXMubWRmaWxlICk7Ci0gICAgICAgIGNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZUZpcnN0KCAiMS4yIiwgIjIuMCIgKTsKLSAgICAgICAgd3JpdGVUb0ZpbGUoIHRoaXMubWRmaWxlLCBjb250ZW50cyApOwotICAgICAgICAKLSAgICAgICAgd2FpdEZvckNvbmRpdGlvbiggY3JlYXRlRmFjZXRDb25kaXRpb24oIHRoaXMuZnBqLCBmMXYyMCApICk7Ci0gICAgICAgIAotICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2VGaXJzdCggIjIuMCIsICIxLjIuMSIgKTsKLSAgICAgICAgd3JpdGVUb0ZpbGUoIHRoaXMubWRmaWxlLCBjb250ZW50cyApOwotICAgICAgICAKLSAgICAgICAgd2FpdEZvckNvbmRpdGlvbiggY3JlYXRlRmFjZXRDb25kaXRpb24oIHRoaXMuZnBqLCBmMXYxMjEgKSApOwotICAgICAgICAKLSAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlRmlyc3QoICI8aW5zdGFsbGVkIGZhY2V0PVwiZmFjZXQxXCIgdmVyc2lvbj1cIjEuMi4xXCIvPiIsICIiICk7Ci0gICAgICAgIHdyaXRlVG9GaWxlKCB0aGlzLm1kZmlsZSwgY29udGVudHMgKTsKLSAgICAgICAgCi0gICAgICAgIHdhaXRGb3JDb25kaXRpb24oIGNyZWF0ZU5vRmFjZXRzQ29uZGl0aW9uKCB0aGlzLmZwaiApICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElDb25kaXRpb24gY3JlYXRlTm9GYWNldHNDb25kaXRpb24oIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJQ29uZGl0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2soKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmcGouZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSA9PSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJQ29uZGl0aW9uIGNyZWF0ZUZhY2V0Q29uZGl0aW9uKCBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgSUNvbmRpdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNoZWNrKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnBqLmhhc1Byb2plY3RGYWNldCggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJvamVjdENyZWF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9Qcm9qZWN0Q3JlYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyZTZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9Qcm9qZWN0Q3JlYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0Q3JlYXRpb25UZXN0cwotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFRlc3RzCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VURURfUFJPSkVDVF9OQVRVUkUKLSAgICAgICAgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubmF0dXJlIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjE7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggInBjdC1mMSIgKTsKLSAgICAgICAgZjF2MSA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgZjIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJwY3QtZjIiICk7Ci0gICAgICAgIGYydjEgPSBmMi5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvamVjdENyZWF0aW9uVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiUHJvamVjdCBDcmVhdGlvbiBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbVNjcmF0Y2gyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21TY3JhdGNoMyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDQiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0MSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3QyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0NCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0V3JhcHBlckNyZWF0aW9uMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0V3JhcHBlckNyZWF0aW9uMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0V3JhcHBlckNyZWF0aW9uMyIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShTdHJpbmcsSVBhdGgsSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGVyZSBpcyBubyBwcm9qZWN0IHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbVNjcmF0Y2gxKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qID0gZnByb2ouZ2V0UHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggcHJvaiApOwotICAgICAgICBhc3NlcnRUcnVlKCBwcm9qLmV4aXN0cygpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2ogKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRGaWxlQ29udGFpbnMoIHByb2ouZ2V0RmlsZSggIi5wcm9qZWN0IiApLCBGQUNFVEVEX1BST0pFQ1RfTkFUVVJFICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydE51bGwoIGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKFN0cmluZyxJUGF0aCxJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8sIHRoZXJlIGlzIGEgZmFjZXRlZCBwcm9qZWN0IHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBmcHJvai5nZXRQcm9qZWN0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoU3RyaW5nLElQYXRoLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbywgdGhlcmUgaXMgYSBub24tZmFjZXRlZCBwcm9qZWN0IHdpdGggdGhlIHNhbWUKLSAgICAgKiBuYW1lLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggImFiYyIgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd3MubmV3UHJvamVjdERlc2NyaXB0aW9uKCAiYWJjIiApOwotCi0gICAgICAgIGRlc2Muc2V0TG9jYXRpb24oIG51bGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJvamVjdC5jcmVhdGUoIGRlc2MsIG51bGwgKTsKLSAgICAgICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoU3RyaW5nLElQYXRoLElQcm9ncmVzc01vbml0b3IpfSBtZXRob2QuIEluIHRoaXMgCi0gICAgICogc2NlbmFyaW8sIHRoZXJlIHdhcyBwcmV2aW91c2x5IGEgZmFjZXRlZCBwcm9qZWN0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIFRoZSB0ZXN0IAotICAgICAqIHZlcmlmaWVzIHRoYXQgcHJldmlvdXNseS1pbnN0YWxsZWQgZmFjZXRzIGFyZSByZWNvZ25pemVkIGFmdGVyIHRoZSBwcm9qZWN0IGlzIHJlc3VycmVjdGVkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDQoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIElGYWNldGVkUHJvamVjdCBmcHJvajsKLSAgICAgICAgCi0gICAgICAgIGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIGZwcm9qLmdldFByb2plY3QoKSApOwotICAgICAgICAKLSAgICAgICAgZnByb2ouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MSwgbnVsbCwgbnVsbCApOwotICAgICAgICBmcHJvai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMnYxLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmcHJvai5nZXRQcm9qZWN0KCkuZGVsZXRlKCBmYWxzZSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAyICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qLmhhc1Byb2plY3RGYWNldCggZjF2MSApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwcm9qLmhhc1Byb2plY3RGYWNldCggZjJ2MSApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnROdWxsKCBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCxib29sZWFuLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbyBwcm9qZWN0IGlzIG5vdCBmYWNldGVkIGFuZCBjb252ZXJ0SWZOZWNlc3NhcnkKLSAgICAgKiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0MSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCAiYWJjIiApOwotICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSB3cy5uZXdQcm9qZWN0RGVzY3JpcHRpb24oICJhYmMiICk7Ci0gICAgCi0gICAgICAgIGRlc2Muc2V0TG9jYXRpb24oIG51bGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJvamVjdC5jcmVhdGUoIGRlc2MsIG51bGwgKTsKLSAgICAgICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvagotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QsIHRydWUsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFRhcmdldGVkUnVudGltZXMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCxib29sZWFuLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbyBwcm9qZWN0IGlzIGZhY2V0ZWQgYW5kIGNvbnZlcnRJZk5lY2Vzc2FyeQotICAgICAqIGlzIHNldCB0byB0cnVlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3QyKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJpb3IgCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBwcmlvci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvagotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QsIHRydWUsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFRhcmdldGVkUnVudGltZXMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QsYm9vbGVhbixJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8gcHJvamVjdCBpcyBmYWNldGVkIGFuZCBjb252ZXJ0SWZOZWNlc3NhcnkKLSAgICAgKiBpcyBzZXQgdG8gZmFsc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcmlvciAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByaW9yLmdldFByb2plY3QoKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFRhcmdldGVkUnVudGltZXMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QsYm9vbGVhbixJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8gcHJvamVjdCBpcyBub3QgZmFjZXRlZCBhbmQgY29udmVydElmTmVjZXNzYXJ5Ci0gICAgICogaXMgc2V0IHRvIGZhbHNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3Q0KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoICJhYmMiICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHdzLm5ld1Byb2plY3REZXNjcmlwdGlvbiggImFiYyIgKTsKLSAgICAKLSAgICAgICAgZGVzYy5zZXRMb2NhdGlvbiggbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICBwcm9qZWN0LmNyZWF0ZSggZGVzYywgbnVsbCApOwotICAgICAgICBwcm9qZWN0Lm9wZW4oIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCggUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0LCBmYWxzZSwgbnVsbCApICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCl9IG1ldGhvZC4gVGhpcyBzY2VuYXJpbwotICAgICAqIHZhbGlkYXRlcyB0aGF0IHRoZSB3cmFwcGVyIGNhY2hlIGlzIHdvcmtpbmcgYW5kIHRoZSBzYW1lIGluc3RhbmNlIGlzCi0gICAgICogcmV0dXJuZWQgd2hlbiB0aGUgY3JlYXRlIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZXJDcmVhdGlvbjEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IGZwcm9qLmdldFByb2plY3QoKTsKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvaiA9PSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvaiA9PSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvaiA9PSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvaiA9PSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvaiA9PSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCl9IG1ldGhvZC4gSW4gdGhpcwotICAgICAqIHNjZW5hcmlvLCB0aGUgaW5wdXQgcHJvamVjdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlckNyZWF0aW9uMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCAiYWJjIiApOwotICAgICAgICBhc3NlcnROdWxsKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShJUHJvamVjdCl9IG1ldGhvZC4gSW4gdGhpcwotICAgICAqIHNjZW5hcmlvLCB0aGUgaW5wdXQgcHJvamVjdCBpcyBjbG9zZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZXJDcmVhdGlvbjMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IGZwcm9qLmdldFByb2plY3QoKTsKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qICk7Ci0gICAgICAgIAotICAgICAgICBwcm9qLmNsb3NlKCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0N1c3RvbVZlcnNpb25Db21wYXJhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9DdXN0b21WZXJzaW9uQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWIwOGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0N1c3RvbVZlcnNpb25Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlZlcnNpb25Gb3JtYXRFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEN1c3RvbVZlcnNpb25Db21wYXJhdG9yCi0KLSAgICBleHRlbmRzIERlZmF1bHRWZXJzaW9uQ29tcGFyYXRvcgotICAgIAotewotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VwYXJhdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gIi4jIjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIENvbXBhcmFibGUgcGFyc2UoIGZpbmFsIFN0cmluZyB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uICkKLSAgICAKLSAgICAgICAgdGhyb3dzIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggcG9zaXRpb24gPT0gMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52ZXJ0ZXIoIHNlZ21lbnQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5wYXJzZSggdmVyc2lvbiwgc2VnbWVudCwgcG9zaXRpb24gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmVydGVyCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYWJsZSBiYXNlOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEludmVydGVyKCBmaW5hbCBDb21wYXJhYmxlIGJhc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmogKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISAoIG9iaiBpbnN0YW5jZW9mIEludmVydGVyICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmVxdWFscyggKCAoSW52ZXJ0ZXIpIG9iaiApLmJhc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oIGZpbmFsIE9iamVjdCBvYmogKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTEgKiB0aGlzLmJhc2UuY29tcGFyZVRvKCAoIChJbnZlcnRlcikgb2JqICkuYmFzZSApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MUluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdhZjc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MUluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXQxSW5zdGFsbERlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiZmFjZXQxLnR4dCIgKTsKLSAgICAgICAgVGVzdFV0aWxzLndyaXRlVG9GaWxlKCBmaWxlLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNjc3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICJmYWNldDEudHh0IiApOwotICAgICAgICBmaWxlLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzRlMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICJmYWNldDEudHh0IiApOwotICAgICAgICBUZXN0VXRpbHMud3JpdGVUb0ZpbGUoIGZpbGUsIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZDdmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhSW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldDNhSW5zdGFsbERlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiZmFjZXQzYS50eHQiICk7Ci0gICAgICAgIFRlc3RVdGlscy53cml0ZVRvRmlsZSggZmlsZSwgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYVVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhVW5pbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1YTEwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhVW5pbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0M2FVbmluc3RhbGxEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZSggImZhY2V0M2EudHh0IiApOwotICAgICAgICBmaWxlLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3Yzg2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhVmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldDNhVmVyc2lvbkNoYW5nZURlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiZmFjZXQzYS50eHQiICk7Ci0gICAgICAgIFRlc3RVdGlscy53cml0ZVRvRmlsZSggZmlsZSwgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvTm9PcERlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9Ob09wRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyZjNiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9Ob09wRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIE5vT3BEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvVGVzdFV0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4Y2VlNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9UZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0VXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoIGZpbmFsIElGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudHMgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBjb250ZW50cy5nZXRCeXRlcyggIlVURi04IiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZmlsZS5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZS5zZXRDb250ZW50cyggbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCBieXRlcyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlKCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIGJ5dGVzICksIGZhbHNlLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZEZyb21GaWxlKCBmaW5hbCBJRmlsZSBmaWxlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSggZmlsZS5leGlzdHMoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGZpbGUuZ2V0Q29udGVudHMoKSApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWyAxMDI0IF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGNvdW50OyAoIGNvdW50ID0gci5yZWFkKCBjaGFycyApICkgIT0gLTE7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBjaGFycywgMCwgY291bnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkge30KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKCBmaW5hbCBJRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZENvbnRlbnRzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCByZWFkRnJvbUZpbGUoIGZpbGUgKSwgZXhwZWN0ZWRDb250ZW50cyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RmlsZUNvbnRhaW5zKCBmaW5hbCBJRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCByZWFkRnJvbUZpbGUoIGZpbGUgKS5pbmRleE9mKCBzdHIgKSAhPSAtMSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckNvbmRpdGlvbiggZmluYWwgSUNvbmRpdGlvbiBjb25kaXRpb24gKQotICAgIHsKLSAgICAgICAgd2FpdEZvckNvbmRpdGlvbiggY29uZGl0aW9uLCAxMCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckNvbmRpdGlvbiggZmluYWwgSUNvbmRpdGlvbiBjb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWNvbmRzICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgc2Vjb25kcyAmJiAhIGNvbmRpdGlvbi5jaGVjaygpOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoIDEwMDAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkge30KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSggY29uZGl0aW9uLmNoZWNrKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUNvbmRpdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBjaGVjaygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIDxUPiBTZXQ8VD4gYXNTZXQoIGZpbmFsIFQuLi4gb2JqZWN0cyApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8VD4gc2V0ID0gbmV3IExpbmtlZEhhc2hTZXQ8VD4oKTsKLSAgICAgICAgc2V0LmFkZEFsbCggQXJyYXlzLmFzTGlzdCggb2JqZWN0cyApICk7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiMzQzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0KLSAgPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotICA8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLSAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0iJHtwbHVnaW4tbmFtZX0qLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICAKLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9IndzdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd3N0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke3dzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3c3QtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5BbGxUZXN0cyIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICAKLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0qLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmFjNDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLnRlc3RzLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNWQzMTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTVmMWMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgRmViIDAyIDE2OjUxOjM5IFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNTNjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZTogRmFjZXQgVUkgVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMy4wLnF1YWxpZmllcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkZjNkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaW1hZ2VzLwotamFycy5jb21waWxlLm9yZGVyID0gdGVzdHMuamFyCi1zb3VyY2UudGVzdHMuamFyID0gc3JjLwotb3V0cHV0LnRlc3RzLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9pbWFnZXMvdW5rbm93bi5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvaW1hZ2VzL3Vua25vd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NjNmE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9pbWFnZXMvdW5rbm93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMzcwZmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gRmFjZXQgVUkgVGVzdHMgUGx1Zy1pbgotd2l6YXJkLm5hbWUuMCA9IEZhY2V0ZWQgUHJvamVjdCBUZXN0IFdpemFyZAotd2l6YXJkLmRlc2NyaXB0aW9uLjAgPSBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIHRlc3QgdGhlIEZhY2V0ZWQgUHJvamVjdCBXaXphcmQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjMGY2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci0KLTxwbHVnaW4+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgIAotICAgIDxjYXRlZ29yeSBpZD0idWkuY2F0ZWdvcnkiPgotICAgICAgPGxhYmVsPlVJIFRlc3QgQ2F0ZWdvcnk8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGNhdGVnb3J5IGRlc2NyaXB0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeT4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJ1aS5mMSI+Ci0gICAgICA8bGFiZWw+RmFjZXQgMTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgZmFjZXQxLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJ1aS5jYXRlZ29yeSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InVpLmYxIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0idWkuZjIiPgotICAgICAgPGxhYmVsPkZhY2V0IDI8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIGZhY2V0Mi48L2Rlc2NyaXB0aW9uPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0idWkuY2F0ZWdvcnkiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJ1aS5mMiIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDx0ZW1wbGF0ZSBpZD0idWkuYmFzZS53aXphcmQudGVtcGxhdGUiPgotICAgICAgPGxhYmVsPkZhY2V0ZWQgUHJvamVjdDwvbGFiZWw+Ci0gICAgPC90ZW1wbGF0ZT4KLSAgICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZCAKLSAgICAgICAgbmFtZT0iJXdpemFyZC5uYW1lLjAiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMuVGVzdFByb2plY3RXaXphcmQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMuVGVzdFByb2plY3RXaXphcmQiCi0gICAgICAgIGljb249ImltYWdlcy91bmtub3duLmdpZiIKLSAgICAgICAgcHJvamVjdD0idHJ1ZSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAld2l6YXJkLmRlc2NyaXB0aW9uLjAKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL3Rlc3RzL1Rlc3RQcm9qZWN0V2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS90ZXN0cy9UZXN0UHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmYxMjJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL3Rlc3RzL1Rlc3RQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuRmFjZXRlZFByb2plY3RXaXphcmQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0UHJvamVjdFdpemFyZAotCi0gICAgZXh0ZW5kcyBGYWNldGVkUHJvamVjdFdpemFyZAotICAgIAotewotICAgIHB1YmxpYyBUZXN0UHJvamVjdFdpemFyZCgpCi0gICAgewotICAgICAgICBzZXRDYXRlZ29yeUV4cGFuZGVkU3RhdGUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldENhdGVnb3J5KCAidWkuY2F0ZWdvcnkiICksIHRydWUgKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhZ2VEZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gIlRoaXMgd2l6YXJkIGlzIHVzZWQgdG8gdGVzdCB0aGUgRmFjZXRlZCBQcm9qZWN0IFdpemFyZC4iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoICJ1aS5iYXNlLndpemFyZC50ZW1wbGF0ZSIgKTsKLSAgICB9Ci0KLX0K